diff --git a/DEPS b/DEPS index f811318..db94f8b 100644 --- a/DEPS +++ b/DEPS
@@ -105,11 +105,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': 'dd0e9db48d2e2661209dc5ff4dc0df31ed408122', + 'skia_revision': 'c06b8a4e0ca3844afbbbff545730f96d31fab897', # 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': '8ca3b4495140b859cab5fbae697dcc89a9218867', + 'v8_revision': '74c725b6a190a9eb39319d93988aab6682c2cddf', # 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. @@ -117,7 +117,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '5b3b5cc126a7a0e0b45574c8f8aac24cd5f59e21', + 'angle_revision': 'e452382a61a185577d561cc7807b437f4db32d90', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling build tools # and whatever else without interference from each other. @@ -165,7 +165,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': 'e05f902a692909dd57b3d3ddbf081c9e1ce2dbad', + 'catapult_revision': 'dd9e5b9c8c10464e1c4ec227ae7edbc626138acc', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -181,7 +181,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. - 'feed_revision': '3da352fb7e6e3de358373f017dc6e23dfba60132', + 'feed_revision': 'f7661592882a7ea507576dab4b70237fdfbffa96', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling android_sdk_build-tools_version # and whatever else without interference from each other. @@ -1034,7 +1034,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '21dbf06b5aa6c7dc8cf56314d4a3f96f57956c53', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '42c75b14f4950613d31c7b8707513f7e02eb127c', + Var('webrtc_git') + '/src.git' + '@' + '009d0969867e411d40dfc9abd1bcedebea9cf17b', 'src/third_party/xdg-utils': { 'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
diff --git a/PRESUBMIT.py b/PRESUBMIT.py index 206b318..74208a78 100644 --- a/PRESUBMIT.py +++ b/PRESUBMIT.py
@@ -3081,7 +3081,7 @@ input_api.os_path.join('third_party', 'blink')))) def replace_special_with_underscore(string): - return input_api.re.sub(r'[\\/.-]', '_', string) + return input_api.re.sub(r'[+\\/.-]', '_', string) errors = []
diff --git a/PRESUBMIT_test.py b/PRESUBMIT_test.py index 2cf0086..1692f5f 100755 --- a/PRESUBMIT_test.py +++ b/PRESUBMIT_test.py
@@ -890,6 +890,13 @@ 'struct McBoatFace;', '#endif // CONTENT_BROWSER_SPLLEING_H_', ]), + # New files don't allow + in include guards. + MockAffectedFile('content/browser/foo+bar.h', [ + '#ifndef CONTENT_BROWSER_FOO+BAR_H_', + '#define CONTENT_BROWSER_FOO+BAR_H_', + 'struct McBoatFace;', + '#endif // CONTENT_BROWSER_FOO+BAR_H_', + ]), # Old files allow misspelled include guards (for now). MockAffectedFile('chrome/old.h', [ '// New contents', @@ -949,7 +956,7 @@ ] msgs = PRESUBMIT._CheckForIncludeGuards( mock_input_api, mock_output_api) - expected_fail_count = 7 + expected_fail_count = 8 self.assertEqual(expected_fail_count, len(msgs), 'Expected %d items, found %d: %s' % (expected_fail_count, len(msgs), msgs)) @@ -972,18 +979,22 @@ 'Header using the wrong include guard name ' 'CONTENT_BROWSER_SPLLEING_H_') - self.assertEqual(msgs[4].items, ['content/NotInBlink.h:1']) + self.assertEqual(msgs[4].items, ['content/browser/foo+bar.h']) self.assertEqual(msgs[4].message, + 'Missing include guard CONTENT_BROWSER_FOO_BAR_H_') + + self.assertEqual(msgs[5].items, ['content/NotInBlink.h:1']) + self.assertEqual(msgs[5].message, 'Header using the wrong include guard name ' 'NotInBlink_h') - self.assertEqual(msgs[5].items, ['third_party/blink/InBlink.h:1']) - self.assertEqual(msgs[5].message, + self.assertEqual(msgs[6].items, ['third_party/blink/InBlink.h:1']) + self.assertEqual(msgs[6].message, 'Header using the wrong include guard name ' 'InBlink_h') - self.assertEqual(msgs[6].items, ['third_party/blink/AlsoInBlink.h:1']) - self.assertEqual(msgs[6].message, + self.assertEqual(msgs[7].items, ['third_party/blink/AlsoInBlink.h:1']) + self.assertEqual(msgs[7].message, 'Header using the wrong include guard name ' 'WrongInBlink_h')
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn index c3a4a518..a721ac1 100644 --- a/android_webview/BUILD.gn +++ b/android_webview/BUILD.gn
@@ -54,6 +54,7 @@ "java/src/org/chromium/android_webview/AwPdfExporter.java", "java/src/org/chromium/android_webview/AwPicture.java", "java/src/org/chromium/android_webview/AwQuotaManagerBridge.java", + "java/src/org/chromium/android_webview/AwRenderProcess.java", "java/src/org/chromium/android_webview/AwResource.java", "java/src/org/chromium/android_webview/AwSettings.java", "java/src/org/chromium/android_webview/AwTokenBindingManager.java", @@ -517,6 +518,8 @@ "browser/aw_quota_manager_bridge.h", "browser/aw_quota_permission_context.cc", "browser/aw_quota_permission_context.h", + "browser/aw_render_process.cc", + "browser/aw_render_process.h", "browser/aw_render_process_gone_delegate.h", "browser/aw_render_thread_context_provider.cc", "browser/aw_render_thread_context_provider.h", @@ -840,6 +843,7 @@ "java/src/org/chromium/android_webview/AwQuotaManagerBridge.java", "java/src/org/chromium/android_webview/AwRenderProcessGoneDetail.java", "java/src/org/chromium/android_webview/AwResource.java", + "java/src/org/chromium/android_webview/AwRenderProcess.java", "java/src/org/chromium/android_webview/AwSafeBrowsingConversionHelper.java", "java/src/org/chromium/android_webview/AwScrollOffsetManager.java", "java/src/org/chromium/android_webview/AwServiceWorkerClient.java",
diff --git a/android_webview/browser/aw_contents.cc b/android_webview/browser/aw_contents.cc index fa88873..6e4d9f4 100644 --- a/android_webview/browser/aw_contents.cc +++ b/android_webview/browser/aw_contents.cc
@@ -17,6 +17,7 @@ #include "android_webview/browser/aw_gl_functor.h" #include "android_webview/browser/aw_pdf_exporter.h" #include "android_webview/browser/aw_picture.h" +#include "android_webview/browser/aw_render_process.h" #include "android_webview/browser/aw_renderer_priority.h" #include "android_webview/browser/aw_resource_context.h" #include "android_webview/browser/aw_web_contents_delegate.h" @@ -409,6 +410,20 @@ SetAwGLFunctor(reinterpret_cast<AwGLFunctor*>(gl_functor)); } +ScopedJavaLocalRef<jobject> AwContents::GetRenderProcess( + JNIEnv* env, + const JavaParamRef<jobject>& obj) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + content::RenderProcessHost* host = + web_contents_->GetMainFrame()->GetProcess(); + if (host->run_renderer_in_process()) { + return ScopedJavaLocalRef<jobject>(); + } + AwRenderProcess* render_process = + AwRenderProcess::GetInstanceForRenderProcessHost(host); + return render_process->GetJavaObject(); +} + void AwContents::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { java_ref_.reset(); delete this;
diff --git a/android_webview/browser/aw_contents.h b/android_webview/browser/aw_contents.h index c2f9a862..dc5bcc9f 100644 --- a/android_webview/browser/aw_contents.h +++ b/android_webview/browser/aw_contents.h
@@ -114,6 +114,10 @@ const base::android::JavaParamRef<jobject>& obj, jlong gl_functor); + base::android::ScopedJavaLocalRef<jobject> GetRenderProcess( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj); + void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); void DocumentHasImages(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj,
diff --git a/android_webview/browser/aw_render_process.cc b/android_webview/browser/aw_render_process.cc new file mode 100644 index 0000000..7e1a25e --- /dev/null +++ b/android_webview/browser/aw_render_process.cc
@@ -0,0 +1,102 @@ +// 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. + +#include "android_webview/browser/aw_render_process.h" + +#include "base/android/jni_android.h" +#include "base/android/scoped_java_ref.h" + +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/render_process_host.h" + +#include "jni/AwRenderProcess_jni.h" + +using base::android::AttachCurrentThread; +using content::BrowserThread; +using content::ChildProcessTerminationInfo; +using content::RenderProcessHost; + +namespace android_webview { + +const void* const kAwRenderProcessKey = &kAwRenderProcessKey; + +// static +AwRenderProcess* AwRenderProcess::GetInstanceForRenderProcessHost( + RenderProcessHost* host) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + + AwRenderProcess* render_process = + static_cast<AwRenderProcess*>(host->GetUserData(kAwRenderProcessKey)); + if (!render_process) { + std::unique_ptr<AwRenderProcess> created_render_process = + std::make_unique<AwRenderProcess>(host); + render_process = created_render_process.get(); + host->SetUserData(kAwRenderProcessKey, std::move(created_render_process)); + } + return render_process; +} + +AwRenderProcess::AwRenderProcess(RenderProcessHost* render_process_host) + : render_process_host_(render_process_host), weak_factory_(this) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + + java_obj_.Reset(Java_AwRenderProcess_create(AttachCurrentThread())); + CHECK(!java_obj_.is_null()); + if (render_process_host_->IsReady()) { + Ready(); + } + render_process_host->AddObserver(this); +} + +AwRenderProcess::~AwRenderProcess() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + + Java_AwRenderProcess_setNative(AttachCurrentThread(), java_obj_, 0); + java_obj_.Reset(); +} + +void AwRenderProcess::Ready() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + + Java_AwRenderProcess_setNative(AttachCurrentThread(), java_obj_, + reinterpret_cast<jlong>(this)); +} + +void AwRenderProcess::Cleanup() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + + render_process_host_->RemoveObserver(this); + render_process_host_->RemoveUserData(kAwRenderProcessKey); + // |this| is now deleted. +} + +bool AwRenderProcess::TerminateChildProcess( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + + return render_process_host_->Shutdown(0); +} + +base::android::ScopedJavaLocalRef<jobject> AwRenderProcess::GetJavaObject() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + + return base::android::ScopedJavaLocalRef<jobject>(java_obj_); +} + +void AwRenderProcess::RenderProcessReady(RenderProcessHost* host) { + DCHECK(host == render_process_host_); + + Ready(); +} + +void AwRenderProcess::RenderProcessExited( + RenderProcessHost* host, + const ChildProcessTerminationInfo& info) { + DCHECK(host == render_process_host_); + + Cleanup(); +} + +} // namespace android_webview
diff --git a/android_webview/browser/aw_render_process.h b/android_webview/browser/aw_render_process.h new file mode 100644 index 0000000..f05c94c --- /dev/null +++ b/android_webview/browser/aw_render_process.h
@@ -0,0 +1,51 @@ +// 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. + +#ifndef ANDROID_WEBVIEW_BROWSER_AW_RENDER_PROCESS_H_ +#define ANDROID_WEBVIEW_BROWSER_AW_RENDER_PROCESS_H_ + +#include "base/android/scoped_java_ref.h" +#include "base/memory/weak_ptr.h" +#include "base/supports_user_data.h" + +#include "content/public/browser/render_process_host_observer.h" + +namespace android_webview { + +class AwRenderProcess : public content::RenderProcessHostObserver, + public base::SupportsUserData::Data { + public: + static AwRenderProcess* GetInstanceForRenderProcessHost( + content::RenderProcessHost* host); + + base::android::ScopedJavaLocalRef<jobject> GetJavaObject(); + + bool TerminateChildProcess(JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj); + + explicit AwRenderProcess(content::RenderProcessHost* render_process_host); + ~AwRenderProcess() override; + + private: + void Ready(); + void Cleanup(); + + // content::RenderProcessHostObserver implementation + void RenderProcessReady(content::RenderProcessHost* host) override; + + void RenderProcessExited( + content::RenderProcessHost* host, + const content::ChildProcessTerminationInfo& info) override; + + base::android::ScopedJavaGlobalRef<jobject> java_obj_; + + content::RenderProcessHost* render_process_host_; + + base::WeakPtrFactory<AwRenderProcess> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(AwRenderProcess); +}; + +} // namespace android_webview + +#endif
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 e747059..25deb97 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -2865,6 +2865,13 @@ return SelectionPopupController.fromWebContents(mWebContents).getTextClassifier(); } + public AwRenderProcess getRenderProcess() { + if (isDestroyedOrNoOperation(WARN)) { + return null; + } + return nativeGetRenderProcess(mNativeAwContents); + } + //-------------------------------------------------------------------------------------------- // Methods called from native via JNI //-------------------------------------------------------------------------------------------- @@ -3732,4 +3739,6 @@ private native void nativeGrantFileSchemeAccesstoChildProcess(long nativeAwContents); private native void nativeResumeLoadingCreatedPopupWebContents(long nativeAwContents); + + private native AwRenderProcess nativeGetRenderProcess(long nativeAwContents); }
diff --git a/android_webview/java/src/org/chromium/android_webview/AwRenderProcess.java b/android_webview/java/src/org/chromium/android_webview/AwRenderProcess.java new file mode 100644 index 0000000..68bbddb --- /dev/null +++ b/android_webview/java/src/org/chromium/android_webview/AwRenderProcess.java
@@ -0,0 +1,35 @@ +// 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.android_webview; + +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.JNINamespace; + +/** + */ +@JNINamespace("android_webview") +public final class AwRenderProcess { + private long mNativeRenderProcess; + + private AwRenderProcess() {} + + public boolean terminate() { + if (mNativeRenderProcess == 0) return false; + + return nativeTerminateChildProcess(mNativeRenderProcess); + } + + @CalledByNative + private static AwRenderProcess create() { + return new AwRenderProcess(); + } + + @CalledByNative + private void setNative(long nativeRenderProcess) { + mNativeRenderProcess = nativeRenderProcess; + } + + private native boolean nativeTerminateChildProcess(long nativeAwRenderProcess); +}
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientOnRenderProcessGoneTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientOnRenderProcessGoneTest.java index 5dabc3d..538f1a49 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientOnRenderProcessGoneTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientOnRenderProcessGoneTest.java
@@ -12,14 +12,17 @@ import org.junit.runner.RunWith; import org.chromium.android_webview.AwContents; +import org.chromium.android_webview.AwRenderProcess; import org.chromium.android_webview.AwRenderProcessGoneDetail; import org.chromium.android_webview.AwSwitches; import org.chromium.android_webview.renderer_priority.RendererPriority; +import org.chromium.base.ThreadUtils; import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.parameter.SkipCommandLineParameterization; +import org.chromium.content_public.common.ContentUrlConstants; import java.util.concurrent.TimeUnit; @@ -65,6 +68,41 @@ } } + interface Terminator { + void terminate(AwContents awContents); + } + + private AwRenderProcess createAndTerminateRenderProcess( + Terminator terminator, boolean expectCrash) throws Throwable { + RenderProcessGoneTestAwContentsClient contentsClient = + new RenderProcessGoneTestAwContentsClient(); + AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(contentsClient); + final AwContents awContents = testView.getAwContents(); + GetRenderProcessGoneHelper helper = contentsClient.getGetRenderProcessGoneHelper(); + + final AwRenderProcess renderProcess = + ThreadUtils.runOnUiThreadBlocking(() -> awContents.getRenderProcess()); + + // Ensure that the renderer has started. + mActivityTestRule.loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(), + ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); + + // Terminate the renderer. + ThreadUtils.runOnUiThread(() -> terminator.terminate(awContents)); + + // Assert that onRenderProcessGone is called once. + int callCount = helper.getCallCount(); + helper.waitForCallback(callCount, 1, CallbackHelper.WAIT_TIMEOUT_SECONDS * 5, + TimeUnit.SECONDS); + Assert.assertEquals(callCount + 1, helper.getCallCount()); + Assert.assertEquals(helper.getAwRenderProcessGoneDetail().didCrash(), expectCrash); + Assert.assertEquals( + RendererPriority.HIGH, helper.getAwRenderProcessGoneDetail().rendererPriority()); + + return renderProcess; + } + @Test @DisabledTest // http://crbug.com/689292 @Feature({"AndroidWebView"}) @@ -72,20 +110,8 @@ @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER) @SkipCommandLineParameterization public void testOnRenderProcessCrash() throws Throwable { - RenderProcessGoneTestAwContentsClient contentsClient = - new RenderProcessGoneTestAwContentsClient(); - AwTestContainerView testView = - mActivityTestRule.createAwTestContainerViewOnMainSync(contentsClient); - AwContents awContents = testView.getAwContents(); - GetRenderProcessGoneHelper helper = contentsClient.getGetRenderProcessGoneHelper(); - mActivityTestRule.loadUrlAsync(awContents, "chrome://crash"); - int callCount = helper.getCallCount(); - helper.waitForCallback(callCount, 1, CallbackHelper.WAIT_TIMEOUT_SECONDS * 5, - TimeUnit.SECONDS); - Assert.assertEquals(callCount + 1, helper.getCallCount()); - Assert.assertTrue(helper.getAwRenderProcessGoneDetail().didCrash()); - Assert.assertEquals( - RendererPriority.HIGH, helper.getAwRenderProcessGoneDetail().rendererPriority()); + createAndTerminateRenderProcess( + (AwContents awContents) -> { awContents.loadUrl("chrome://crash"); }, true); } @Test @@ -94,19 +120,74 @@ @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER) @SkipCommandLineParameterization public void testOnRenderProcessKill() throws Throwable { + createAndTerminateRenderProcess( + (AwContents awContents) -> { awContents.loadUrl("chrome://kill"); }, false); + } + + @Test + @Feature({"AndroidWebView"}) + @SmallTest + @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER) + @SkipCommandLineParameterization + public void testRenderProcessTermination() throws Throwable { + createAndTerminateRenderProcess((AwContents awContents) -> { + awContents.evaluateJavaScript("0", (String result) -> { + Assert.assertTrue(awContents.getRenderProcess().terminate()); + }); + }, false); + } + + @Test + @Feature({"AndroidWebView"}) + @SmallTest + @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER) + @SkipCommandLineParameterization + public void testRenderProcessDifferentAfterRestart() throws Throwable { + AwRenderProcess renderProcess1 = createAndTerminateRenderProcess( + (AwContents awContents) -> { awContents.getRenderProcess().terminate(); }, false); + AwRenderProcess renderProcess2 = createAndTerminateRenderProcess( + (AwContents awContents) -> { awContents.getRenderProcess().terminate(); }, false); + Assert.assertNotEquals(renderProcess1, renderProcess2); + } + + @Test + @Feature({"AndroidWebView"}) + @SmallTest + @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER) + @SkipCommandLineParameterization + public void testRenderProcessCanNotTerminateBeforeStart() throws Throwable { RenderProcessGoneTestAwContentsClient contentsClient = new RenderProcessGoneTestAwContentsClient(); AwTestContainerView testView = mActivityTestRule.createAwTestContainerViewOnMainSync(contentsClient); - AwContents awContents = testView.getAwContents(); - GetRenderProcessGoneHelper helper = contentsClient.getGetRenderProcessGoneHelper(); - mActivityTestRule.loadUrlAsync(awContents, "chrome://kill"); - int callCount = helper.getCallCount(); - helper.waitForCallback(callCount); + final AwContents awContents = testView.getAwContents(); - Assert.assertEquals(callCount + 1, helper.getCallCount()); - Assert.assertFalse(helper.getAwRenderProcessGoneDetail().didCrash()); - Assert.assertEquals( - RendererPriority.HIGH, helper.getAwRenderProcessGoneDetail().rendererPriority()); + Assert.assertFalse( + ThreadUtils.runOnUiThreadBlocking(() -> awContents.getRenderProcess().terminate())); + } + + @Test + @Feature({"AndroidWebView"}) + @SmallTest + @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER) + @SkipCommandLineParameterization + public void testRenderProcessSameBeforeAndAfterStart() throws Throwable { + RenderProcessGoneTestAwContentsClient contentsClient = + new RenderProcessGoneTestAwContentsClient(); + AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(contentsClient); + final AwContents awContents = testView.getAwContents(); + + AwRenderProcess renderProcessBeforeStart = + ThreadUtils.runOnUiThreadBlocking(() -> awContents.getRenderProcess()); + + // Ensure that the renderer has started. + mActivityTestRule.loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(), + ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); + + AwRenderProcess renderProcessAfterStart = + ThreadUtils.runOnUiThreadBlocking(() -> awContents.getRenderProcess()); + + Assert.assertEquals(renderProcessBeforeStart, renderProcessAfterStart); } }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java index f91ded1..9068dd2 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java
@@ -26,6 +26,7 @@ import org.junit.runner.RunWith; import org.chromium.android_webview.AwContents; +import org.chromium.android_webview.AwRenderProcess; import org.chromium.android_webview.AwSettings; import org.chromium.android_webview.AwSwitches; import org.chromium.android_webview.renderer_priority.RendererPriority; @@ -720,6 +721,47 @@ }); } + private AwRenderProcess getRenderProcessOnUiThread(final AwContents awContents) + throws Exception { + return ThreadUtils.runOnUiThreadBlocking(() -> awContents.getRenderProcess()); + } + + @Test + @Feature({"AndroidWebView"}) + @SmallTest + @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER) + @SkipCommandLineParameterization + public void testRenderProcessInMultiProcessMode() throws Throwable { + AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); + final AwContents awContents = testView.getAwContents(); + + final AwRenderProcess preLoadRenderProcess = getRenderProcessOnUiThread(awContents); + Assert.assertNotNull(preLoadRenderProcess); + + mActivityTestRule.loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), + ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); + + final AwRenderProcess postLoadRenderProcess = getRenderProcessOnUiThread(awContents); + Assert.assertEquals(preLoadRenderProcess, postLoadRenderProcess); + } + + @Test + @Feature({"AndroidWebView"}) + @SmallTest + @SkipCommandLineParameterization + public void testNoRenderProcessInSingleProcessMode() throws Throwable { + AwTestContainerView testView = + mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient); + final AwContents awContents = testView.getAwContents(); + + mActivityTestRule.loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), + ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); + + final AwRenderProcess renderProcess = getRenderProcessOnUiThread(awContents); + Assert.assertEquals(renderProcess, null); + } + /** Regression test for https://crbug.com/732976. Load a data URL, then immediately * after that load a javascript URL. The data URL navigation shouldn't be blocked. */
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc index a647f759..7b4880f 100644 --- a/ash/accelerators/accelerator_controller.cc +++ b/ash/accelerators/accelerator_controller.cc
@@ -413,7 +413,7 @@ bool CanHandleToggleMessageCenterBubble() { if (features::IsSystemTrayUnifiedEnabled()) - return false; + return true; aura::Window* target_root = Shell::GetRootWindowForNewWindows(); StatusAreaWidget* status_area_widget = Shelf::ForWindow(target_root)->shelf_widget()->status_area_widget(); @@ -421,24 +421,6 @@ status_area_widget->notification_tray()->visible(); } -void HandleToggleMessageCenterBubble() { - base::RecordAction(UserMetricsAction("Accel_Toggle_Message_Center_Bubble")); - aura::Window* target_root = Shell::GetRootWindowForNewWindows(); - StatusAreaWidget* status_area_widget = - Shelf::ForWindow(target_root)->shelf_widget()->status_area_widget(); - if (!status_area_widget) - return; - NotificationTray* notification_tray = status_area_widget->notification_tray(); - if (!notification_tray->visible()) - return; - if (notification_tray->IsMessageCenterVisible()) { - notification_tray->CloseBubble(); - } else { - notification_tray->ShowBubble(false /* show_by_click */); - notification_tray->ActivateBubble(); - } -} - void HandleToggleSystemTrayBubble() { base::RecordAction(UserMetricsAction("Accel_Toggle_System_Tray_Bubble")); aura::Window* target_root = Shell::GetRootWindowForNewWindows(); @@ -464,6 +446,28 @@ } } +void HandleToggleMessageCenterBubble() { + base::RecordAction(UserMetricsAction("Accel_Toggle_Message_Center_Bubble")); + if (features::IsSystemTrayUnifiedEnabled()) { + HandleToggleSystemTrayBubble(); + return; + } + aura::Window* target_root = Shell::GetRootWindowForNewWindows(); + StatusAreaWidget* status_area_widget = + Shelf::ForWindow(target_root)->shelf_widget()->status_area_widget(); + if (!status_area_widget) + return; + NotificationTray* notification_tray = status_area_widget->notification_tray(); + if (!notification_tray->visible()) + return; + if (notification_tray->IsMessageCenterVisible()) { + notification_tray->CloseBubble(); + } else { + notification_tray->ShowBubble(false /* show_by_click */); + notification_tray->ActivateBubble(); + } +} + void HandleShowTaskManager() { base::RecordAction(UserMetricsAction("Accel_Show_Task_Manager")); Shell::Get()->new_window_controller()->ShowTaskManager();
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index 5c8cd6c..0914a3f 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -223,9 +223,6 @@ <message name="IDS_ASH_STATUS_TRAY_USER_INFO_ACCESSIBILITY" desc="The accessibility string used for an item in user chooser that tells the user name and the mail address."> <ph name="USERNAME">$1<ex>Jane Doe</ex></ph> <ph name="MAIL">$2<ex>janedoe@example.com</ex></ph> </message> - <message name="IDS_ASH_STATUS_TRAY_FEATURE_POD_BUTTON_TOOLTIP" desc="The tooltip string used for a feature button in system tray that combines the label and the sub-label."> - <ph name="LABEL">$1<ex>VPN</ex></ph> <ph name="SUBLABEL">$2<ex>Off</ex></ph> - </message> <message name="IDS_ASH_STATUS_TRAY_SIGN_OUT" desc="The label used for the button in the status tray to sign out of the system. Should not exceed about 20 latin characters. Overflowed text is truncated with ellipsis."> Sign out </message> @@ -262,6 +259,12 @@ <message name="IDS_ASH_STATUS_TRAY_NIGHT_LIGHT_BUTTON_LABEL" desc="The shorter label used for the button in the status tray to toggle the Night Light feature (which controls the color temperature of the screen) on or off."> Night Light </message> + <message name="IDS_ASH_STATUS_TRAY_NIGHT_LIGHT_TOGGLE_TOOLTIP" desc="The tooltip text used for the button in the status tray to toggle the Night Light feature (which controls the color temperature of the screen) on or off."> + Toggle Night Light + </message> + <message name="IDS_ASH_STATUS_TRAY_NIGHT_LIGHT_SETTINGS_TOOLTIP" desc="The tooltip text used for the button in the status tray to show the Night Light feature (which controls the color temperature of the screen) settings."> + Show Night Light settings + </message> <message name="IDS_ASH_STATUS_TRAY_NIGHT_LIGHT" desc="The label used for the button in the status tray to toggle the Night Light feature (which controls the color temperature of the screen) on or off."> Night Light: <ph name="NIGHT_LIGHT_STATUS">$1<ex>On</ex></ph> </message> @@ -277,6 +280,9 @@ <message name="IDS_ASH_STATUS_TRAY_CAST_SHORT" desc="The label used for Cast button in system tray bubble."> Cast </message> + <message name="IDS_ASH_STATUS_TRAY_CAST_TOOLTIP" desc="The tooltip text used for Cast button in system tray bubble."> + Show cast devices. + </message> <message name="IDS_ASH_STATUS_TRAY_CAST_NOTIFICATION_TITLE" desc="The notification title to tell the user we are casting to a cast device."> Casting to <ph name="RECEIVER_NAME">$1<ex>Living Room</ex></ph> </message> @@ -311,6 +317,26 @@ <message name="IDS_ASH_STATUS_TRAY_BLUETOOTH" desc="The label used as the header in the bluetooth popup."> Bluetooth </message> + <message name="IDS_ASH_STATUS_TRAY_BLUETOOTH_TOGGLE_TOOLTIP" desc="The tooltip text in the button that toggles Blueooth enabled/disabled."> + Toggle Bluetooth. <ph name="STATE_TEXT">$1<ex>Connected to 2 devices</ex></ph> + </message> + <message name="IDS_ASH_STATUS_TRAY_BLUETOOTH_SETTINGS_TOOLTIP" desc="The tooltip text in the button that shows Blueooth settings."> + Show Bluetooth settings. <ph name="STATE_TEXT">$1<ex>Connected to 2 devices</ex></ph> + </message> + <message name="IDS_ASH_STATUS_TRAY_BLUETOOTH_ENABLED_TOOLTIP" desc="The tooltip text to notify that bluetooth is enabled."> + Bluetooth is on + </message> + <message name="IDS_ASH_STATUS_TRAY_BLUETOOTH_DISABLED_TOOLTIP" desc="The tooltip text to notify that bluetooth is disabled."> + Bluetooth is off + </message> + <message name="IDS_ASH_STATUS_TRAY_BLUETOOTH_MULTIPLE_DEVICES_CONNECTED_TOOLTIP" desc="The tooltip text to notify that multiple bluetooth devices are connected. [ICU Syntax]"> + {NUM_DEVICES, plural, + =1 {Connected to a device} + other {Connected to # devices}} + </message> + <message name="IDS_ASH_STATUS_TRAY_BLUETOOTH_DEVICE_CONNECTED_TOOLTIP" desc="The tooltip text to notify that one bluetooth device is connected."> + Connected to <ph name="DEVICE_NAME">$1<ex>wireless mouse</ex></ph> + </message> <message name="IDS_ASH_STATUS_TRAY_BLUETOOTH_ENABLED" desc="The label used in the tray popup to notify that bluetooth is enabled."> Bluetooth enabled </message> @@ -395,6 +421,12 @@ <message name="IDS_ASH_STATUS_TRAY_IME_SHORT" desc="The short label used for IME button in system tray bubble."> Keyboard </message> + <message name="IDS_ASH_STATUS_TRAY_IME_TOOLTIP" desc="The tooltip text used for IME button in system tray bubble."> + Show keyboard settings + </message> + <message name="IDS_ASH_STATUS_TRAY_IME_TOOLTIP_WITH_NAME" desc="The tooltip text used for IME button in system tray bubble."> + Show keyboard settings. <ph name="KEYBOARD_NAME">$1<ex>US keyboard</ex></ph> is selected + </message> <message name="IDS_ASH_STATUS_TRAY_IME" desc="The label used as the header in the IME popup."> Input methods </message> @@ -427,6 +459,9 @@ <message name="IDS_ASH_STATUS_TRAY_ACCESSIBILITY" desc="The label used in the tray menu to show the accessibility option menu."> Accessibility </message> + <message name="IDS_ASH_STATUS_TRAY_ACCESSIBILITY_TOOLTIP" desc="The tooltip text in the tray menu to show the accessibility option menu."> + Show accessibility settings + </message> <message name="IDS_ASH_STATUS_TRAY_ACCESSIBILITY_TITLE" desc="The label used in the title of the accessibility option menu."> Accessibility </message> @@ -509,6 +544,20 @@ <message name="IDS_ASH_STATUS_TRAY_NOTIFICATIONS_LABEL" desc="The label text shown under do not disturb button in system tray bubble."> Notifications </message> + <message name="IDS_ASH_STATUS_TRAY_NOTIFICATIONS_TOGGLE_TOOLTIP" desc="The tooltip text of the button that toggles Do-not-disturb state for notifications"> + Toggle Do not disturb + </message> + <message name="IDS_ASH_STATUS_TRAY_NOTIFICATIONS_SETTINGS_ON_TOOLTIP" desc="The tooltip text of the button that shows notification settings. Used when all notifications are enabled."> + Show notification settings. Notifications are on + </message> + <message name="IDS_ASH_STATUS_TRAY_NOTIFICATIONS_SETTINGS_OFF_FOR_APPS_TOOLTIP" desc="The tooltip text of the button that shows notification settings. Used when all some notifications are disabled. [ICU Syntax]"> + {NUM_APPS, plural, + =1 {Show notification settings. Notifications are off for an app} + other {Show notification settings. Notifications are off for # apps}} + </message> + <message name="IDS_ASH_STATUS_TRAY_NOTIFICATIONS_SETTINGS_DO_NOT_DISTURB_TOOLTIP" desc="The tooltip text of the button that shows notification settings. Used when all notifications are disabled."> + Show notification settings. Notifications are off + </message> <message name="IDS_ASH_STATUS_TRAY_NOTIFICATIONS_ON_SUBLABEL" desc="The sub label text shown under do not disturb button when all notifications are enabled."> On, all apps </message> @@ -766,6 +815,24 @@ <message name="IDS_ASH_STATUS_TRAY_NETWORK_ACTIVATING_SUBLABEL" desc="The sub label text used when network is activating. The network name is shown above this label."> Activating </message> + <message name="IDS_ASH_STATUS_TRAY_NETWORK_DISCONNECTED_TOOLTIP" desc="The tooltip text used when network is not connected."> + Disconnected + </message> + <message name="IDS_ASH_STATUS_TRAY_NETWORK_CONNECTING_TOOLTIP" desc="The tooltip text used when network is connecting."> + Connecting to <ph name="NETWORK_NAME">$1<ex>public wifi</ex></ph> + </message> + <message name="IDS_ASH_STATUS_TRAY_NETWORK_CONNECTED_TOOLTIP" desc="The tooltip text used when network is connected."> + Connected to <ph name="NETWORK_NAME">$1<ex>public wifi</ex></ph> + </message> + <message name="IDS_ASH_STATUS_TRAY_NETWORK_ACTIVATING_TOOLTIP" desc="The tooltip text used when network is activating."> + Activating <ph name="NETWORK_NAME">$1<ex>cellular network</ex></ph> + </message> + <message name="IDS_ASH_STATUS_TRAY_NETWORK_TOGGLE_TOOLTIP" desc="The tooltip text for the button that toggles network enabled/disabled state."> + Toggle network connection. <ph name="STATE_TEXT">$1<ex>Connected to public wifi</ex></ph> + </message> + <message name="IDS_ASH_STATUS_TRAY_NETWORK_SETTINGS_TOOLTIP" desc="The tooltip text for the button that shows network list."> + Show network list. <ph name="STATE_TEXT">$1<ex>Connected to public wifi</ex></ph> + </message> <!-- Status Tray Network strings --> <message name="IDS_ASH_STATUS_TRAY_BLUETOOTH_DISPLAY_PINCODE" desc="Bluetooth pairing message typically shown on a request from a 2.0 device that has a keyboard."> @@ -1042,6 +1109,15 @@ <message name="IDS_ASH_STATUS_TRAY_ROTATION_LOCK_PORTRAIT" desc="The text shown in the tray menu when rotation is set locked to portrait."> Portrait </message> + <message name="IDS_ASH_STATUS_TRAY_ROTATION_LOCK_TOOLTIP" desc="The tooltip text used for the button that toggles rotation lock enabled/disabled."> + Toggle rotation lock. <ph name="STATE_TEXT">$1<ex>Locked to vertical</ex></ph> + </message> + <message name="IDS_ASH_STATUS_TRAY_ROTATION_LOCK_LOCKED_VERTICAL_TOOLTIP" desc="The tooltip text used when screen rotation is locked to vertical."> + Locked to vertical + </message> + <message name="IDS_ASH_STATUS_TRAY_ROTATION_LOCK_LOCKED_HORIZONTAL_TOOLTIP" desc="The tooltip text used when screen rotation is locked to horizontal."> + Locked to horizontal + </message> <message name="IDS_ASH_STATUS_TRAY_ROTATION_LOCK_LOCKED_LABEL" desc="The label text shown under the tray menu button when screen rotation is locked."> Lock </message> @@ -1149,6 +1225,9 @@ <message name="IDS_ASH_STATUS_TRAY_VPN_SHORT" desc="The short label used for VPN button in system tray bubble."> VPN </message> + <message name="IDS_ASH_STATUS_TRAY_VPN_TOOLTIP" desc="The tooltip text used for the button that shows VPN settings."> + Show VPN settings + </message> <message name="IDS_ASH_STATUS_TRAY_VPN_DISCONNECTED_SHORT" desc="The short label used in system tray bubble to display vpn is disconnected."> Off </message>
diff --git a/ash/system/bluetooth/bluetooth_feature_pod_controller.cc b/ash/system/bluetooth/bluetooth_feature_pod_controller.cc index 709eb56..812cdd9 100644 --- a/ash/system/bluetooth/bluetooth_feature_pod_controller.cc +++ b/ash/system/bluetooth/bluetooth_feature_pod_controller.cc
@@ -81,6 +81,8 @@ button_->SetLabel(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BLUETOOTH)); button_->SetSubLabel(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_BLUETOOTH_DISABLED_SHORT)); + SetTooltipState(l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_BLUETOOTH_DISABLED_TOOLTIP)); return; } @@ -89,28 +91,43 @@ Shell::Get()->tray_bluetooth_helper()->GetAvailableBluetoothDevices()) { if (device.connected) connected_devices.push_back(device); - if (connected_devices.size() > 1) - break; } if (connected_devices.size() > 1) { + const size_t device_count = connected_devices.size(); button_->SetVectorIcon(kUnifiedMenuBluetoothConnectedIcon); button_->SetLabel(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_BLUETOOTH_MULTIPLE_DEVICES_CONNECTED_LABEL)); - button_->SetSubLabel(base::FormatNumber(connected_devices.size())); + button_->SetSubLabel(base::FormatNumber(device_count)); + SetTooltipState(l10n_util::GetPluralStringFUTF16( + IDS_ASH_STATUS_TRAY_BLUETOOTH_MULTIPLE_DEVICES_CONNECTED_TOOLTIP, + device_count)); } else if (connected_devices.size() == 1) { + const base::string16& device_name = connected_devices.back().display_name; button_->SetVectorIcon(kUnifiedMenuBluetoothConnectedIcon); - button_->SetLabel(connected_devices.back().display_name); + button_->SetLabel(device_name); button_->SetSubLabel(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_BLUETOOTH_DEVICE_CONNECTED_LABEL)); + SetTooltipState(l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_BLUETOOTH_DEVICE_CONNECTED_TOOLTIP, device_name)); } else { button_->SetVectorIcon(kUnifiedMenuBluetoothIcon); button_->SetLabel(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BLUETOOTH)); button_->SetSubLabel( l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BLUETOOTH_ENABLED_SHORT)); + SetTooltipState(l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_BLUETOOTH_ENABLED_TOOLTIP)); } } +void BluetoothFeaturePodController::SetTooltipState( + const base::string16& tooltip_state) { + button_->SetIconTooltip(l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_BLUETOOTH_TOGGLE_TOOLTIP, tooltip_state)); + button_->SetLabelTooltip(l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_BLUETOOTH_SETTINGS_TOOLTIP, tooltip_state)); +} + void BluetoothFeaturePodController::OnBluetoothRefresh() { UpdateButton(); }
diff --git a/ash/system/bluetooth/bluetooth_feature_pod_controller.h b/ash/system/bluetooth/bluetooth_feature_pod_controller.h index 0143e18..1bf2ddaf 100644 --- a/ash/system/bluetooth/bluetooth_feature_pod_controller.h +++ b/ash/system/bluetooth/bluetooth_feature_pod_controller.h
@@ -29,6 +29,7 @@ private: void UpdateButton(); + void SetTooltipState(const base::string16& tooltip_state); // BluetoothObserver: void OnBluetoothRefresh() override;
diff --git a/ash/system/cast/cast_feature_pod_controller.cc b/ash/system/cast/cast_feature_pod_controller.cc index 559392a55..08193cd 100644 --- a/ash/system/cast/cast_feature_pod_controller.cc +++ b/ash/system/cast/cast_feature_pod_controller.cc
@@ -28,7 +28,10 @@ button_ = new FeaturePodButton(this); button_->SetVectorIcon(kUnifiedMenuCastIcon); button_->SetLabel(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_CAST_SHORT)); + button_->SetIconAndLabelTooltips( + l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_CAST_TOOLTIP)); button_->ShowDetailedViewArrow(); + button_->DisableLabelButtonFocus(); button_->set_id(VIEW_ID_CAST_MAIN_VIEW); Update(); return button_;
diff --git a/ash/system/ime/ime_feature_pod_controller.cc b/ash/system/ime/ime_feature_pod_controller.cc index fe72f12..f4853523 100644 --- a/ash/system/ime/ime_feature_pod_controller.cc +++ b/ash/system/ime/ime_feature_pod_controller.cc
@@ -37,6 +37,18 @@ } } +base::string16 GetTooltipString() { + DCHECK(Shell::Get()); + ImeController* ime_controller = Shell::Get()->ime_controller(); + size_t ime_count = ime_controller->available_imes().size(); + if (ime_count > 1) { + return l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_IME_TOOLTIP_WITH_NAME, + ime_controller->current_ime().name); + } else { + return l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_IME_TOOLTIP); + } +} + } // namespace IMEFeaturePodController::IMEFeaturePodController( @@ -49,7 +61,9 @@ button_ = new FeaturePodButton(this); button_->SetVectorIcon(kUnifiedMenuKeyboardIcon); button_->SetLabel(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_IME_SHORT)); + button_->SetIconAndLabelTooltips(GetTooltipString()); button_->ShowDetailedViewArrow(); + button_->DisableLabelButtonFocus(); Update(); return button_; }
diff --git a/ash/system/network/network_feature_pod_button.cc b/ash/system/network/network_feature_pod_button.cc index 6af5675a..c209735 100644 --- a/ash/system/network/network_feature_pod_button.cc +++ b/ash/system/network/network_feature_pod_button.cc
@@ -111,16 +111,23 @@ IDS_ASH_STATUS_TRAY_NETWORK_DISCONNECTED_LABEL)); SetSubLabel(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_NETWORK_DISCONNECTED_SUBLABEL)); + SetTooltipState(l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_NETWORK_DISCONNECTED_TOOLTIP)); return; } - SetLabel(network->Matches(NetworkTypePattern::Ethernet()) - ? l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ETHERNET) - : base::UTF8ToUTF16(network->name())); + base::string16 network_name = + network->Matches(NetworkTypePattern::Ethernet()) + ? l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ETHERNET) + : base::UTF8ToUTF16(network->name()); + + SetLabel(network_name); if (network->IsReconnecting() || network->IsConnectingState()) { SetSubLabel(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_NETWORK_CONNECTING_SUBLABEL)); + SetTooltipState(l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_NETWORK_CONNECTING_TOOLTIP, network_name)); return; } @@ -145,14 +152,26 @@ IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTED)); break; } + SetTooltipState(l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_NETWORK_CONNECTED_TOOLTIP, network_name)); return; } if (network->activation_state() == shill::kActivationStateActivating) { SetSubLabel(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_NETWORK_ACTIVATING_SUBLABEL)); + SetTooltipState(l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_NETWORK_ACTIVATING_TOOLTIP, network_name)); return; } } +void NetworkFeaturePodButton::SetTooltipState( + const base::string16& tooltip_state) { + SetIconTooltip(l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_NETWORK_TOGGLE_TOOLTIP, tooltip_state)); + SetLabelTooltip(l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_NETWORK_SETTINGS_TOOLTIP, tooltip_state)); +} + } // namespace ash
diff --git a/ash/system/network/network_feature_pod_button.h b/ash/system/network/network_feature_pod_button.h index 1ca674b8..d7aa127 100644 --- a/ash/system/network/network_feature_pod_button.h +++ b/ash/system/network/network_feature_pod_button.h
@@ -28,6 +28,7 @@ private: void Update(); + void SetTooltipState(const base::string16& tooltip_state); std::unique_ptr<TrayNetworkStateObserver> network_state_observer_;
diff --git a/ash/system/network/vpn_feature_pod_controller.cc b/ash/system/network/vpn_feature_pod_controller.cc index a4d0040..45cbf11 100644 --- a/ash/system/network/vpn_feature_pod_controller.cc +++ b/ash/system/network/vpn_feature_pod_controller.cc
@@ -37,7 +37,10 @@ button_ = new FeaturePodButton(this); button_->SetVectorIcon(kUnifiedMenuVpnIcon); button_->SetLabel(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_VPN_SHORT)); + button_->SetIconAndLabelTooltips( + l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_VPN_TOOLTIP)); button_->ShowDetailedViewArrow(); + button_->DisableLabelButtonFocus(); Update(); return button_; }
diff --git a/ash/system/night_light/night_light_feature_pod_controller.cc b/ash/system/night_light/night_light_feature_pod_controller.cc index 82c277e..518f8eb 100644 --- a/ash/system/night_light/night_light_feature_pod_controller.cc +++ b/ash/system/night_light/night_light_feature_pod_controller.cc
@@ -35,6 +35,10 @@ Shell::Get()->session_controller()->ShouldEnableSettings()); button_->SetLabel( l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NIGHT_LIGHT_BUTTON_LABEL)); + button_->SetIconTooltip(l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_NIGHT_LIGHT_TOGGLE_TOOLTIP)); + button_->SetLabelTooltip(l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_NIGHT_LIGHT_SETTINGS_TOOLTIP)); UpdateButton(); return button_; }
diff --git a/ash/system/rotation/rotation_lock_feature_pod_controller.cc b/ash/system/rotation/rotation_lock_feature_pod_controller.cc index 2d9ff67..205e2f67 100644 --- a/ash/system/rotation/rotation_lock_feature_pod_controller.cc +++ b/ash/system/rotation/rotation_lock_feature_pod_controller.cc
@@ -29,6 +29,7 @@ FeaturePodButton* RotationLockFeaturePodController::CreateButton() { DCHECK(!button_); button_ = new FeaturePodButton(this); + button_->DisableLabelButtonFocus(); UpdateButton(); return button_; } @@ -71,25 +72,36 @@ button_->SetToggled(rotation_locked); + base::string16 tooltip_state; + if (rotation_locked && is_portrait) { button_->SetVectorIcon(kUnifiedMenuRotationLockPortraitIcon); button_->SetLabel(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_ROTATION_LOCK_LOCKED_LABEL)); button_->SetSubLabel(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_ROTATION_LOCK_LOCKED_VERTICAL_SUBLABEL)); + tooltip_state = l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_ROTATION_LOCK_LOCKED_VERTICAL_TOOLTIP); } else if (rotation_locked && !is_portrait) { button_->SetVectorIcon(kUnifiedMenuRotationLockLandscapeIcon); button_->SetLabel(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_ROTATION_LOCK_LOCKED_LABEL)); button_->SetSubLabel(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_ROTATION_LOCK_LOCKED_HORIZONTAL_SUBLABEL)); + tooltip_state = l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_ROTATION_LOCK_LOCKED_HORIZONTAL_TOOLTIP); } else { button_->SetVectorIcon(kUnifiedMenuRotationLockAutoIcon); button_->SetLabel(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_ROTATION_LOCK_AUTO_LABEL)); button_->SetSubLabel(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_ROTATION_LOCK_AUTO_SUBLABEL)); + tooltip_state = + l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ROTATION_LOCK_AUTO_LABEL); } + + button_->SetIconAndLabelTooltips(l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_ROTATION_LOCK_TOOLTIP, tooltip_state)); } } // namespace ash
diff --git a/ash/system/tray/tray_constants.h b/ash/system/tray/tray_constants.h index 14bef6e..368808d 100644 --- a/ash/system/tray/tray_constants.h +++ b/ash/system/tray/tray_constants.h
@@ -166,6 +166,10 @@ constexpr int kUnifiedTopShortcutSpacing = 16; constexpr gfx::Insets kUnifiedTopShortcutPadding(0, 16); +// Size of an icon drawn inside top shortcut buttons. +// A dark disc with |kTrayItemSize| diameter is drawn in the background. +constexpr int kTrayTopShortcutButtonIconSize = 20; + constexpr int kUnifiedSystemInfoHeight = 16; constexpr int kUnifiedSystemInfoSpacing = 8;
diff --git a/ash/system/tray/tray_detailed_view.cc b/ash/system/tray/tray_detailed_view.cc index d84ac971..02d41736 100644 --- a/ash/system/tray/tray_detailed_view.cc +++ b/ash/system/tray/tray_detailed_view.cc
@@ -469,9 +469,4 @@ return height(); } -void TrayDetailedView::RequestFocus() { - if (back_button_) - back_button_->RequestFocus(); -} - } // namespace ash
diff --git a/ash/system/tray/tray_detailed_view.h b/ash/system/tray/tray_detailed_view.h index 4b5cf9b1..f0ec573b 100644 --- a/ash/system/tray/tray_detailed_view.h +++ b/ash/system/tray/tray_detailed_view.h
@@ -52,7 +52,6 @@ // views::View: void Layout() override; int GetHeightForWidth(int width) const override; - void RequestFocus() override; // Exposes the layout manager of this view to give control to subclasses. views::BoxLayout* box_layout() { return box_layout_; }
diff --git a/ash/system/unified/accessibility_feature_pod_controller.cc b/ash/system/unified/accessibility_feature_pod_controller.cc index 169cd1c..0c5a472 100644 --- a/ash/system/unified/accessibility_feature_pod_controller.cc +++ b/ash/system/unified/accessibility_feature_pod_controller.cc
@@ -27,7 +27,10 @@ button->SetLabel( l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ACCESSIBILITY)); button->SetVectorIcon(kUnifiedMenuAccessibilityIcon); + button->SetIconAndLabelTooltips( + l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ACCESSIBILITY_TOOLTIP)); button->ShowDetailedViewArrow(); + button->DisableLabelButtonFocus(); AccessibilityDelegate* delegate = Shell::Get()->accessibility_delegate(); LoginStatus login_status = Shell::Get()->session_controller()->login_status();
diff --git a/ash/system/unified/feature_pod_button.cc b/ash/system/unified/feature_pod_button.cc index 6ddf986..d1e94355 100644 --- a/ash/system/unified/feature_pod_button.cc +++ b/ash/system/unified/feature_pod_button.cc
@@ -207,14 +207,12 @@ void FeaturePodLabelButton::SetLabel(const base::string16& label) { label_->SetText(label); - SetTooltipTextFromLabels(); InvalidateLayout(); } void FeaturePodLabelButton::SetSubLabel(const base::string16& sub_label) { sub_label_->SetText(sub_label); sub_label_->SetVisible(true); - SetTooltipTextFromLabels(); InvalidateLayout(); } @@ -223,12 +221,6 @@ InvalidateLayout(); } -void FeaturePodLabelButton::SetTooltipTextFromLabels() { - SetTooltipText( - l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_FEATURE_POD_BUTTON_TOOLTIP, - label_->text(), sub_label_->text())); -} - void FeaturePodLabelButton::LayoutInCenter(views::View* child, int y) { gfx::Rect contents_bounds = GetContentsBounds(); gfx::Size preferred_size = child->GetPreferredSize(); @@ -266,7 +258,6 @@ } void FeaturePodButton::SetLabel(const base::string16& label) { - icon_button_->SetTooltipText(label); label_button_->SetLabel(label); Layout(); label_button_->SchedulePaint(); @@ -278,12 +269,29 @@ label_button_->SchedulePaint(); } +void FeaturePodButton::SetIconTooltip(const base::string16& text) { + icon_button_->SetTooltipText(text); +} + +void FeaturePodButton::SetLabelTooltip(const base::string16& text) { + label_button_->SetTooltipText(text); +} + +void FeaturePodButton::SetIconAndLabelTooltips(const base::string16& text) { + SetIconTooltip(text); + SetLabelTooltip(text); +} + void FeaturePodButton::ShowDetailedViewArrow() { label_button_->ShowDetailedViewArrow(); Layout(); label_button_->SchedulePaint(); } +void FeaturePodButton::DisableLabelButtonFocus() { + label_button_->SetFocusBehavior(FocusBehavior::NEVER); +} + void FeaturePodButton::SetToggled(bool toggled) { icon_button_->SetToggled(toggled); }
diff --git a/ash/system/unified/feature_pod_button.h b/ash/system/unified/feature_pod_button.h index 137cd27..fd42abb 100644 --- a/ash/system/unified/feature_pod_button.h +++ b/ash/system/unified/feature_pod_button.h
@@ -74,8 +74,6 @@ std::unique_ptr<views::InkDropMask> CreateInkDropMask() const override; private: - void SetTooltipTextFromLabels(); - // Layout |child| in horizontal center with its vertical origin set to |y|. void LayoutInCenter(views::View* child, int y); @@ -107,9 +105,22 @@ // Set the text of sub-label shown below the label. void SetSubLabel(const base::string16& sub_label); + // Set the tooltip text of the icon button. + void SetIconTooltip(const base::string16& text); + + // Set the tooltip text of the label button. + void SetLabelTooltip(const base::string16& text); + + // Convenience method to set both icon and label tooltip texts. + void SetIconAndLabelTooltips(const base::string16& text); + // Show arrow to indicate that the feature has a detailed view. void ShowDetailedViewArrow(); + // Remove the label button from keyboard focus chain. This is useful when + // the icon button and the label button has the same action. + void DisableLabelButtonFocus(); + // Change the toggled state. If toggled, the background color of the circle // will change. void SetToggled(bool toggled);
diff --git a/ash/system/unified/quiet_mode_feature_pod_controller.cc b/ash/system/unified/quiet_mode_feature_pod_controller.cc index 0626fcf9..dfbc682 100644 --- a/ash/system/unified/quiet_mode_feature_pod_controller.cc +++ b/ash/system/unified/quiet_mode_feature_pod_controller.cc
@@ -38,6 +38,8 @@ !Shell::Get()->session_controller()->IsScreenLocked()); button_->SetLabel( l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NOTIFICATIONS_LABEL)); + button_->SetIconTooltip(l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_NOTIFICATIONS_TOGGLE_TOOLTIP)); button_->ShowDetailedViewArrow(); OnQuietModeChanged(MessageCenter::Get()->IsQuietMode()); @@ -83,6 +85,8 @@ if (in_quiet_mode) { button_->SetSubLabel(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_NOTIFICATIONS_DO_NOT_DISTURB_SUBLABEL)); + button_->SetLabelTooltip(l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_NOTIFICATIONS_SETTINGS_DO_NOT_DISTURB_TOOLTIP)); return; } @@ -92,9 +96,14 @@ button_->SetSubLabel(l10n_util::GetPluralStringFUTF16( IDS_ASH_STATUS_TRAY_NOTIFICATIONS_OFF_FOR_APPS_SUBLABEL, disabled_count)); + button_->SetLabelTooltip(l10n_util::GetPluralStringFUTF16( + IDS_ASH_STATUS_TRAY_NOTIFICATIONS_SETTINGS_OFF_FOR_APPS_TOOLTIP, + disabled_count)); } else { button_->SetSubLabel(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_NOTIFICATIONS_ON_SUBLABEL)); + button_->SetLabelTooltip(l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_NOTIFICATIONS_SETTINGS_ON_TOOLTIP)); } }
diff --git a/ash/system/unified/top_shortcut_button.cc b/ash/system/unified/top_shortcut_button.cc index 7ec10dd1..eaf5e41c 100644 --- a/ash/system/unified/top_shortcut_button.cc +++ b/ash/system/unified/top_shortcut_button.cc
@@ -21,9 +21,11 @@ int accessible_name_id) : TopShortcutButton(listener, accessible_name_id) { SetImage(views::Button::STATE_NORMAL, - gfx::CreateVectorIcon(icon, kUnifiedMenuIconColor)); + gfx::CreateVectorIcon(icon, kTrayTopShortcutButtonIconSize, + kUnifiedMenuIconColor)); SetImage(views::Button::STATE_DISABLED, - gfx::CreateVectorIcon(icon, kUnifiedMenuIconColorDisabled)); + gfx::CreateVectorIcon(icon, kTrayTopShortcutButtonIconSize, + kUnifiedMenuIconColorDisabled)); } TopShortcutButton::TopShortcutButton(views::ButtonListener* listener,
diff --git a/ash/system/unified/unified_system_tray_controller.cc b/ash/system/unified/unified_system_tray_controller.cc index 1b42652..64640066 100644 --- a/ash/system/unified/unified_system_tray_controller.cc +++ b/ash/system/unified/unified_system_tray_controller.cc
@@ -358,8 +358,8 @@ animation_->Reset(1.0); UpdateExpandedAmount(); - unified_view_->SaveFeaturePodFocus(); unified_view_->SetDetailedView(controller->CreateView()); + unified_view_->SaveFeaturePodFocus(); detailed_view_controller_ = std::move(controller); }
diff --git a/ash/system/unified/unified_system_tray_view.cc b/ash/system/unified/unified_system_tray_view.cc index 5cbc26fc..fce1018 100644 --- a/ash/system/unified/unified_system_tray_view.cc +++ b/ash/system/unified/unified_system_tray_view.cc
@@ -203,8 +203,6 @@ detailed_view_container_->SetPreferredSize(system_tray_size); detailed_view->InvalidateLayout(); Layout(); - - detailed_view->RequestFocus(); } void UnifiedSystemTrayView::ResetDetailedView() {
diff --git a/ash/system/unified/user_chooser_view.cc b/ash/system/unified/user_chooser_view.cc index 46a0275..99d930e 100644 --- a/ash/system/unified/user_chooser_view.cc +++ b/ash/system/unified/user_chooser_view.cc
@@ -24,6 +24,7 @@ #include "ui/views/controls/button/label_button.h" #include "ui/views/layout/box_layout.h" #include "ui/views/layout/fill_layout.h" +#include "ui/views/vector_icons.h" #include "ui/views/widget/widget.h" namespace ash { @@ -76,7 +77,7 @@ CloseButton::CloseButton(UnifiedSystemTrayController* controller) : TopShortcutButton(this, - kOverviewWindowCloseIcon, + views::kIcCloseIcon, IDS_ASH_WINDOW_CONTROL_ACCNAME_CLOSE), controller_(controller) {}
diff --git a/build/OWNERS b/build/OWNERS index 0b659dd..918c4884 100644 --- a/build/OWNERS +++ b/build/OWNERS
@@ -5,6 +5,7 @@ scottmg@chromium.org thakis@chromium.org brucedawson@chromium.org +tikuta@chromium.org # Clang build config changes hans@chromium.org
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 7bba7df..5871aab 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -1441,9 +1441,6 @@ cflags += [ # TODO(thakis): https://crbug.com/604888 "-Wno-undefined-var-template", - - # TODO(hans): https://crbug.com/637306 - "-Wno-address-of-packed-member", ] if (current_toolchain == host_toolchain || !use_xcode_clang || xcode_version_int >= 930) {
diff --git a/build/fuchsia/sdk.sha1 b/build/fuchsia/sdk.sha1 index 6cdb536..e8b9ca0 100644 --- a/build/fuchsia/sdk.sha1 +++ b/build/fuchsia/sdk.sha1
@@ -1 +1 @@ -4e9dd1487caf04cf64b35b361d507df5b96a0daf \ No newline at end of file +be1455d02b09799d1150be98feab598f91f00200 \ No newline at end of file
diff --git a/chrome/VERSION b/chrome/VERSION index d5e5610..6d1277b 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=70 MINOR=0 -BUILD=3506 +BUILD=3508 PATCH=0
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java index cd74a3b..2f7e03e 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java
@@ -16,6 +16,8 @@ import com.google.android.libraries.feed.api.scope.FeedProcessScope; import com.google.android.libraries.feed.api.scope.FeedStreamScope; import com.google.android.libraries.feed.api.stream.Stream; +import com.google.android.libraries.feed.host.logging.BasicLoggingApi; +import com.google.android.libraries.feed.host.logging.ContentLoggingData; import com.google.android.libraries.feed.host.stream.CardConfiguration; import com.google.android.libraries.feed.host.stream.SnackbarApi; import com.google.android.libraries.feed.host.stream.StreamConfiguration; @@ -55,6 +57,28 @@ private SectionHeaderView mSectionHeaderView; private FeedImageLoader mImageLoader; + private static class DummyBasicLoggingApi implements BasicLoggingApi { + // TODO(gangwu): implement implement BasicLoggingApi functionality. + @Override + public void onContentViewed(ContentLoggingData data) {} + @Override + public void onContentDismissed(ContentLoggingData data) {} + @Override + public void onContentClicked(ContentLoggingData data) {} + @Override + public void onContentContextMenuOpened(ContentLoggingData data) {} + @Override + public void onMoreButtonViewed(int position) {} + @Override + public void onMoreButtonClicked(int position) {} + @Override + public void onOpenedWithContent(int timeToPopulateMs, int contentCount) {} + @Override + public void onOpenedWithNoImmediateContent() {} + @Override + public void onOpenedWithNoContent() {} + } + private class BasicSnackbarApi implements SnackbarApi { @Override public void show(String message) { @@ -122,6 +146,18 @@ public int getCardBottomMargin() { return mCardMarginBottom; } + + @Override + public int getCardStartMargin() { + // TODO(twellington): implement this method. + return 0; + } + + @Override + public int getCardEndMargin() { + // TODO(twellington): implement this method. + return 0; + } } /** @@ -148,7 +184,7 @@ new FeedActionHandler(navigationDelegate), new BasicStreamConfiguration(activity.getResources()), new BasicCardConfiguration(activity.getResources()), - new BasicSnackbarApi()) + new BasicSnackbarApi(), new DummyBasicLoggingApi()) .build(); mStream = streamScope.getStream();
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/StreamLifecycleManager.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/StreamLifecycleManager.java index e734ad3..da6567e 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/StreamLifecycleManager.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/StreamLifecycleManager.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.feed; import android.app.Activity; +import android.os.Bundle; import android.support.annotation.IntDef; import com.google.android.libraries.feed.api.stream.Stream; @@ -89,7 +90,7 @@ mStreamState = CREATED; // TODO(huayinz): Handle saved instance state. - mStream.onCreate(null); + mStream.onCreate((Bundle) null); show(); activate();
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml index b1021bc..738baa6 100644 --- a/chrome/android/java/AndroidManifest.xml +++ b/chrome/android/java/AndroidManifest.xml
@@ -434,14 +434,10 @@ <intent-filter android:priority="-1"> <category android:name="com.google.intent.category.DAYDREAM" /> - <!-- Trick Android into thinking this intent filter contains data authorities, and - so cannot serve as the default browser. crbug.com/847921 --> - <data android:host="*" /> {{ self.common_view_intent_shared_filter_body() }} </intent-filter> <intent-filter android:priority="-1"> <category android:name="com.google.intent.category.DAYDREAM" /> - <data android:host="*" /> {{ self.common_view_intent_shared_filter_with_mime_body() }} </intent-filter> <intent-filter android:priority="-1">
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java index 9f702f3..06245c9e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java
@@ -775,7 +775,7 @@ return false; } return ExternalNavigationDelegateImpl - .getSpecializedHandlersWithFilter(handlers, appId, intent) + .getSpecializedHandlersWithFilter(handlers, appId, null) .size() > 0; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountManagementFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountManagementFragment.java index e32939ef..a07af7d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountManagementFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountManagementFragment.java
@@ -91,9 +91,6 @@ public static final String PREF_SIGN_OUT = "sign_out"; public static final String PREF_SIGN_OUT_DIVIDER = "sign_out_divider"; - private static final String ACCOUNT_SETTINGS_ACTION = "android.settings.ACCOUNT_SYNC_SETTINGS"; - private static final String ACCOUNT_SETTINGS_ACCOUNT_KEY = "account"; - private int mGaiaServiceType; private Profile mProfile; @@ -353,7 +350,7 @@ pref.setIcon(mProfileDataCache.getProfileDataOrDefault(account.name).getImage()); pref.setOnPreferenceClickListener( - preference -> SigninUtils.openAccountSettingsPage(getActivity(), account.name)); + preference -> SigninUtils.openAccountSettingsPage(getActivity(), account)); accountsCategory.addPreference(pref); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninUtils.java index 1a065cd..069994d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninUtils.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.signin; +import android.accounts.Account; import android.content.Context; import android.content.Intent; @@ -21,13 +22,13 @@ /** * Opens account management page in Settings for a specific account. * @param context Context to use when starting the Activity. - * @param accountName The account name for which the Settings page should be opened. + * @param account The account for which the Settings page should be opened. * @return Whether or not Android accepted the Intent. */ - public static boolean openAccountSettingsPage(Context context, String accountName) { + public static boolean openAccountSettingsPage(Context context, Account account) { // TODO(https://crbug.com/814441): Fix this on Android O+. Intent intent = new Intent(ACCOUNT_SETTINGS_ACTION); - intent.putExtra(ACCOUNT_SETTINGS_ACCOUNT_KEY, accountName); + intent.putExtra(ACCOUNT_SETTINGS_ACCOUNT_KEY, account); return IntentUtils.safeStartActivity(context, intent); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappTabDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappTabDelegate.java index 7d3bbdf..11dfd8d6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappTabDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappTabDelegate.java
@@ -83,7 +83,7 @@ boolean foundSpecializedHandler = false; for (String result : ExternalNavigationDelegateImpl.getSpecializedHandlersWithFilter( - handlers, null, intent)) { + handlers, null, null)) { if (result.equals(mApkPackageName)) { // Current webapk matches, don't intercept so that we can launch a cct. See // http://crbug.com/831806 for more context.
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index 6d932b76..a3e966c 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -1581,7 +1581,7 @@ Activity and interactions </message> <message name="IDS_SYNC_ACTIVITY_AND_INTERACTIONS_SUMMARY" desc="Summary for preference which enables sync'ing of activity and interactions."> - Uses content on sites you visit and browser activity and interactions for personalization + Uses content on sites you visit, plus browser activity and interactions, for personalization </message> <message name="IDS_SYNC_ENCRYPTION" desc="Preference category name for sync encryption. [CHAR-LIMT=32]"> Encryption @@ -2552,7 +2552,7 @@ Improve Chrome and its security by sending system and usage data to Google </message> <message name="IDS_SIGNIN_DETAILS_DESCRIPTION" desc="Message explaining that user can customize Sync and personalization and explains what data is shared with Google. This message is shown in the screen that asks users to sign-in and turn on Sync and personalization."> - <ph name="BEGIN_LINK1"><LINK1></ph>Settings<ph name="END_LINK1"></LINK1></ph> can be customized anytime. Google may use content on sites you visit, browser interactions and activity to personalize Chrome and Google services like Translate, Search, and ads. + <ph name="BEGIN_LINK1"><LINK1></ph>Settings<ph name="END_LINK1"></LINK1></ph> can be customized anytime. Google may use content on sites you visit, plus browser activity and interactions, to personalize Chrome and other Google services like Translate, Search, and ads. </message> <message name="IDS_SIGNIN_DETAILS_DESCRIPTION_CHILD_ACCOUNT" desc="Message explaining that user can customize Sync and personalization and explains what data is shared with Google. This message is shown in the screen that asks users to sign-in and turn on Sync and personalization. This version of the description is used with child accounts."> <ph name="BEGIN_LINK1"><LINK1></ph>Settings<ph name="END_LINK1"></LINK1></ph> can be customized by you or your parents anytime. Google may use content on sites you visit, browser interactions and activity to personalize Chrome and Google services like Translate, Search, and ads.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTapEventTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTapEventTest.java index bec8d3dd..9a08ab2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTapEventTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTapEventTest.java
@@ -27,11 +27,13 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.embedder_support.view.ContentView; import org.chromium.content.browser.test.util.TestSelectionPopupController; import org.chromium.content_public.browser.SelectionClient; import org.chromium.content_public.browser.SelectionPopupController; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.base.ActivityWindowAndroid; +import org.chromium.ui.base.ViewAndroidDelegate; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; import org.chromium.ui.touch_selection.SelectionEventType; @@ -81,7 +83,9 @@ super(activity, null); setSelectionController(new MockCSSelectionController(activity, this)); WebContents webContents = WebContentsFactory.createWebContents(false, false); - webContents.initialize(null, null, null, new ActivityWindowAndroid(activity), + ContentView cv = ContentView.createContentView(activity, webContents); + webContents.initialize(null, ViewAndroidDelegate.createBasicDelegate(cv), null, + new ActivityWindowAndroid(activity), WebContents.createDefaultInternalsHolder()); SelectionPopupController selectionPopupController = SelectionPopupController.createForTesting(webContents);
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index e442a60..5b5d0f1 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-70.0.3505.0_rc-r1.afdo.bz2 \ No newline at end of file +chromeos-chrome-amd64-70.0.3507.0_rc-r1.afdo.bz2 \ No newline at end of file
diff --git a/chrome/app/nibs/BUILD.gn b/chrome/app/nibs/BUILD.gn index f140dab..eae757d4 100644 --- a/chrome/app/nibs/BUILD.gn +++ b/chrome/app/nibs/BUILD.gn
@@ -9,8 +9,6 @@ translated_xibs = [ "AppMenu.xib", - "BookmarkAllTabs.xib", - "BookmarkNameFolder.xib", "CookieDetailsView.xib", "DownloadItem.xib", "DownloadShelf.xib", @@ -24,8 +22,6 @@ if (!mac_views_browser) { translated_xibs += [ - "BookmarkBubble.xib", - "BookmarkEditor.xib", "CollectedCookies.xib", "ContentBlockedCookies.xib", "ContentBlockedDownloads.xib",
diff --git a/chrome/app/nibs/BookmarkAllTabs.xib b/chrome/app/nibs/BookmarkAllTabs.xib deleted file mode 100644 index 4abb0bc..0000000 --- a/chrome/app/nibs/BookmarkAllTabs.xib +++ /dev/null
@@ -1,206 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13F1112" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none"> - <dependencies> - <deployment version="1090" identifier="macosx"/> - <development version="5100" identifier="xcode"/> - <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/> - </dependencies> - <objects> - <customObject id="-2" userLabel="File's Owner" customClass="BookmarkAllTabsController"> - <connections> - <outlet property="folderTreeController_" destination="74" id="75"/> - <outlet property="folderTreeView_" destination="69" id="94"/> - <outlet property="newFolderButton_" destination="3" id="30"/> - <outlet property="okButton_" destination="5" id="31"/> - <outlet property="window" destination="1" id="28"/> - </connections> - </customObject> - <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> - <customObject id="-3" userLabel="Application"/> - <window title="Bookmark All Tabs" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" visibleAtLaunch="NO" animationBehavior="default" id="1"> - <windowStyleMask key="styleMask" titled="YES" resizable="YES"/> - <windowPositionMask key="initialPositionMask" leftStrut="YES" bottomStrut="YES"/> - <rect key="contentRect" x="196" y="240" width="580" height="270"/> - <rect key="screenRect" x="0.0" y="0.0" width="1680" height="1028"/> - <value key="minSize" type="size" width="331" height="270"/> - <view key="contentView" id="2"> - <rect key="frame" x="0.0" y="0.0" width="480" height="268"/> - <autoresizingMask key="autoresizingMask"/> - <subviews> - <customView id="36" customClass="GTMWidthBasedTweaker"> - <rect key="frame" x="269" y="-2" width="211" height="52"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/> - <subviews> - <button verticalHuggingPriority="750" id="7"> - <rect key="frame" x="5" y="12" width="96" height="32"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/> - <buttonCell key="cell" type="push" title="^IDS_APP_CANCEL" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8"> - <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="system"/> - <string key="keyEquivalent">.</string> - <modifierMask key="keyEquivalentModifierMask" command="YES"/> - </buttonCell> - <connections> - <action selector="cancel:" target="-2" id="22"/> - </connections> - </button> - <button verticalHuggingPriority="750" id="5"> - <rect key="frame" x="101" y="12" width="96" height="32"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/> - <buttonCell key="cell" type="push" title="^IDS_APP_OK" bezelStyle="rounded" alignment="center" enabled="NO" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="6"> - <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="system"/> - <string key="keyEquivalent" base64-UTF8="YES"> -DQ -</string> - </buttonCell> - <connections> - <action selector="ok:" target="-2" id="23"/> - <binding destination="-2" name="enabled" keyPath="okEnabled" id="66"/> - </connections> - </button> - </subviews> - </customView> - <customView id="40" customClass="GTMWidthBasedTweaker"> - <rect key="frame" x="0.0" y="205" width="71" height="32"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <subviews> - <textField verticalHuggingPriority="750" id="9"> - <rect key="frame" x="17" y="6" width="50" height="17"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="^IDS_BOOKMARK_EDITOR_NAME_LABEL" id="10"> - <font key="font" metaFont="system"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - </subviews> - <connections> - <outlet property="viewToResize_" destination="1" id="41"/> - </connections> - </customView> - <customView id="44" customClass="GTMWidthBasedTweaker"> - <rect key="frame" x="0.0" y="-2" width="139" height="52"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> - <subviews> - <button verticalHuggingPriority="750" id="3"> - <rect key="frame" x="14" y="12" width="111" height="32"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> - <buttonCell key="cell" type="push" title="^IDS_BOOKMARK_EDITOR_NEW_FOLDER_BUTTON" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="4"> - <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="system"/> - </buttonCell> - <connections> - <action selector="newFolder:" target="-2" id="21"/> - </connections> - </button> - </subviews> - </customView> - <textField verticalHuggingPriority="750" id="13"> - <rect key="frame" x="74" y="210" width="386" height="22"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="14"> - <font key="font" metaFont="system"/> - <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <binding destination="-2" name="value" keyPath="displayName" id="65"> - <dictionary key="options"> - <integer key="NSContinuouslyUpdatesValue" value="1"/> - </dictionary> - </binding> - </connections> - </textField> - <scrollView horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" id="67"> - <rect key="frame" x="20" y="50" width="440" height="147"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - <clipView key="contentView" id="jTA-WZ-wnQ"> - <rect key="frame" x="1" y="1" width="423" height="130"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - <subviews> - <outlineView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" indentationPerLevel="16" autoresizesOutlineColumn="YES" outlineTableColumn="72" id="69"> - <rect key="frame" x="0.0" y="0.0" width="423" height="130"/> - <autoresizingMask key="autoresizingMask"/> - <size key="intercellSpacing" width="3" height="2"/> - <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> - <color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/> - <tableColumns> - <tableColumn width="420" minWidth="16" maxWidth="1000" id="72"> - <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" white="0.33333299" alpha="1" colorSpace="calibratedWhite"/> - </tableHeaderCell> - <textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="73"> - <font key="font" metaFont="system"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/> - <connections> - <binding destination="74" name="value" keyPath="arrangedObjects.folderName" id="82"/> - </connections> - </tableColumn> - </tableColumns> - <connections> - <binding destination="74" name="content" keyPath="arrangedObjects" id="84"/> - <binding destination="-2" name="selectionIndexPaths" keyPath="tableSelectionPaths" previousBinding="84" id="85"/> - <outlet property="delegate" destination="-2" id="eRE-W5-9Lw"/> - </connections> - </outlineView> - </subviews> - <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> - </clipView> - <scroller key="horizontalScroller" verticalHuggingPriority="750" horizontal="YES" id="70"> - <rect key="frame" x="1" y="131" width="423" height="15"/> - <autoresizingMask key="autoresizingMask"/> - </scroller> - <scroller key="verticalScroller" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="71"> - <rect key="frame" x="424" y="1" width="15" height="130"/> - <autoresizingMask key="autoresizingMask"/> - </scroller> - </scrollView> - <customView id="90" customClass="GTMWidthBasedTweaker"> - <rect key="frame" x="0.0" y="236" width="460" height="32"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <subviews> - <textField verticalHuggingPriority="750" id="91"> - <rect key="frame" x="17" y="5" width="216" height="17"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/> - <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="^IDS_BOOKMARK_ALL_TABS_DIALOG_TITLE" id="92"> - <font key="font" metaFont="system"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - </subviews> - <connections> - <outlet property="viewToResize_" destination="1" id="93"/> - </connections> - </customView> - </subviews> - </view> - <connections> - <outlet property="delegate" destination="-2" id="29"/> - </connections> - </window> - <customObject id="34" customClass="ChromeUILocalizer"/> - <customObject id="37" customClass="GTMUILocalizerAndLayoutTweaker"> - <connections> - <outlet property="localizer_" destination="34" id="39"/> - <outlet property="uiObject_" destination="1" id="38"/> - </connections> - </customObject> - <treeController objectClassName="BookmarkFolderInfo" childrenKeyPath="children" id="74" userLabel="Folder Tree Controller"> - <declaredKeys> - <string>folderName</string> - <string>newFolder</string> - <string>selectionIndexPaths</string> - </declaredKeys> - <connections> - <binding destination="-2" name="contentArray" keyPath="folderTreeArray" id="76"/> - </connections> - </treeController> - </objects> -</document>
diff --git a/chrome/app/nibs/BookmarkBubble.xib b/chrome/app/nibs/BookmarkBubble.xib deleted file mode 100644 index 67b9672..0000000 --- a/chrome/app/nibs/BookmarkBubble.xib +++ /dev/null
@@ -1,184 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13F1077" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none"> - <dependencies> - <deployment version="1090" identifier="macosx"/> - <development version="5100" identifier="xcode"/> - <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/> - </dependencies> - <objects> - <customObject id="-2" userLabel="File's Owner" customClass="BookmarkBubbleController"> - <connections> - <outlet property="bigTitle_" destination="2" id="28"/> - <outlet property="bubble_" destination="1" id="65"/> - <outlet property="fieldLabelsContainer_" destination="36" id="z7D-at-qbV"/> - <outlet property="folderPopUpButton_" destination="57" id="64"/> - <outlet property="nameTextField_" destination="12" id="29"/> - <outlet property="syncPromoPlaceholder_" destination="74" id="78"/> - <outlet property="trailingButtonContainer_" destination="34" id="uKW-kF-l7p"/> - <outlet property="window" destination="50" id="52"/> - </connections> - </customObject> - <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> - <customObject id="-3" userLabel="Application"/> - <customObject id="31" customClass="ChromeUILocalizer"/> - <customObject id="42" customClass="GTMUILocalizerAndLayoutTweaker"> - <connections> - <outlet property="localizer_" destination="31" id="43"/> - <outlet property="uiObject_" destination="1" id="44"/> - </connections> - </customObject> - <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" oneShot="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="50" customClass="InfoBubbleWindow"> - <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/> - <windowPositionMask key="initialPositionMask" leftStrut="YES" bottomStrut="YES"/> - <rect key="contentRect" x="196" y="365" width="374" height="145"/> - <rect key="screenRect" x="0.0" y="0.0" width="1920" height="1178"/> - <view key="contentView" id="51"> - <rect key="frame" x="0.0" y="0.0" width="374" height="145"/> - <autoresizingMask key="autoresizingMask"/> - <subviews> - <customView id="1" customClass="InfoBubbleView"> - <rect key="frame" x="0.0" y="0.0" width="374" height="145"/> - <autoresizingMask key="autoresizingMask" heightSizable="YES"/> - <userGuides> - <userLayoutGuide location="8" affinity="maxY"/> - </userGuides> - <subviews> - <box autoresizesSubviews="NO" borderType="none" titlePosition="noTitle" id="39"> - <rect key="frame" x="79" y="46" width="294" height="59"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> - <view key="contentView" id="uN9-QU-FlY"> - <rect key="frame" x="0.0" y="0.0" width="294" height="59"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - <subviews> - <textField verticalHuggingPriority="750" id="12"> - <rect key="frame" x="8" y="33" width="267" height="19"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="13"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <outlet property="nextKeyView" destination="57" id="66"/> - </connections> - </textField> - <popUpButton verticalHuggingPriority="750" id="57"> - <rect key="frame" x="5" y="5" width="273" height="22"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="small" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" inset="2" id="58"> - <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="smallSystem"/> - <menu key="menu" title="OtherViews" id="59"/> - </popUpButtonCell> - <connections> - <action selector="folderChanged:" target="-2" id="63"/> - <outlet property="nextKeyView" destination="20" id="67"/> - </connections> - </popUpButton> - </subviews> - </view> - <color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/> - <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> - </box> - <customView id="36" customClass="GTMWidthBasedTweaker"> - <rect key="frame" x="0.0" y="50" width="84" height="53"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <subviews> - <textField verticalHuggingPriority="750" id="10"> - <rect key="frame" x="17" y="6" width="65" height="14"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="^IDS_BOOKMARK_BUBBLE_FOLDER_LABEL" id="11"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - <textField verticalHuggingPriority="750" id="8"> - <rect key="frame" x="17" y="31" width="65" height="14"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="^IDS_BOOKMARK_BUBBLE_NAME_LABEL" id="9"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - </subviews> - <connections> - <outlet property="viewToResize_" destination="1" id="40"/> - <outlet property="viewToSlideAndResize_" destination="39" id="41"/> - </connections> - </customView> - <customView id="35" customClass="GTMWidthBasedTweaker"> - <rect key="frame" x="0.0" y="0.0" width="126" height="42"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <subviews> - <button verticalHuggingPriority="750" id="20"> - <rect key="frame" x="15" y="13" width="96" height="28"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> - <buttonCell key="cell" type="push" title="^IDS_BOOKMARK_BUBBLE_REMOVE_BOOKMARK" bezelStyle="rounded" alignment="center" controlSize="small" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="21"> - <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="smallSystem"/> - </buttonCell> - <connections> - <action selector="remove:" target="-2" id="24"/> - <outlet property="nextKeyView" destination="16" id="71"/> - </connections> - </button> - </subviews> - </customView> - <customView id="34" customClass="GTMWidthBasedTweaker"> - <rect key="frame" x="152" y="0.0" width="222" height="42"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <subviews> - <button verticalHuggingPriority="750" id="16"> - <rect key="frame" x="15" y="13" width="96" height="28"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/> - <buttonCell key="cell" type="push" title="^IDS_BOOKMARK_BUBBLE_OPTIONS" bezelStyle="rounded" alignment="center" controlSize="small" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="17"> - <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="smallSystem"/> - </buttonCell> - <connections> - <action selector="edit:" target="-2" id="25"/> - <outlet property="nextKeyView" destination="18" id="72"/> - </connections> - </button> - <button verticalHuggingPriority="750" id="18"> - <rect key="frame" x="111" y="13" width="96" height="28"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/> - <buttonCell key="cell" type="push" title="^IDS_DONE" bezelStyle="rounded" alignment="center" controlSize="small" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="19"> - <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="smallSystem"/> - <string key="keyEquivalent" base64-UTF8="YES"> -DQ -</string> - </buttonCell> - <connections> - <action selector="ok:" target="-2" id="56"/> - <outlet property="nextKeyView" destination="12" id="70"/> - </connections> - </button> - </subviews> - </customView> - <textField verticalHuggingPriority="750" id="2"> - <rect key="frame" x="17" y="106" width="340" height="19"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="^IDS_BOOKMARK_BUBBLE_PAGE_BOOKMARK" id="3"> - <font key="font" metaFont="system"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - <customView id="74" userLabel="Sync Promo Placeholder"> - <rect key="frame" x="-1" y="0.0" width="376" height="0.0"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/> - </customView> - </subviews> - </customView> - </subviews> - </view> - <connections> - <outlet property="delegate" destination="-2" id="53"/> - </connections> - </window> - </objects> -</document>
diff --git a/chrome/app/nibs/BookmarkEditor.xib b/chrome/app/nibs/BookmarkEditor.xib deleted file mode 100644 index 22400ed..0000000 --- a/chrome/app/nibs/BookmarkEditor.xib +++ /dev/null
@@ -1,227 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13F1096" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none"> - <dependencies> - <deployment version="1090" identifier="macosx"/> - <development version="5100" identifier="xcode"/> - <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/> - </dependencies> - <objects> - <customObject id="-2" userLabel="File's Owner" customClass="BookmarkEditorController"> - <connections> - <outlet property="folderTreeController_" destination="76" id="90"/> - <outlet property="folderTreeView_" destination="70" id="91"/> - <outlet property="nameTextField_" destination="13" id="113"/> - <outlet property="newFolderButton_" destination="3" id="30"/> - <outlet property="okButton_" destination="5" id="31"/> - <outlet property="urlField_" destination="15" id="112"/> - <outlet property="window" destination="1" id="28"/> - </connections> - </customObject> - <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> - <customObject id="-3" userLabel="Application"/> - <window title="Edit Bookmark" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" visibleAtLaunch="NO" animationBehavior="default" id="1"> - <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/> - <windowPositionMask key="initialPositionMask" leftStrut="YES" bottomStrut="YES"/> - <rect key="contentRect" x="196" y="240" width="480" height="270"/> - <rect key="screenRect" x="0.0" y="0.0" width="1680" height="1028"/> - <value key="minSize" type="size" width="331" height="270"/> - <view key="contentView" id="2"> - <rect key="frame" x="0.0" y="0.0" width="480" height="270"/> - <autoresizingMask key="autoresizingMask"/> - <subviews> - <customView id="36" customClass="GTMWidthBasedTweaker"> - <rect key="frame" x="269" y="0.0" width="211" height="52"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/> - <subviews> - <button verticalHuggingPriority="750" id="7"> - <rect key="frame" x="5" y="12" width="96" height="32"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/> - <buttonCell key="cell" type="push" title="^IDS_APP_CANCEL" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8"> - <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="system"/> - <string key="keyEquivalent">.</string> - <modifierMask key="keyEquivalentModifierMask" command="YES"/> - </buttonCell> - <connections> - <action selector="cancel:" target="-2" id="22"/> - </connections> - </button> - <button verticalHuggingPriority="750" id="5"> - <rect key="frame" x="101" y="12" width="96" height="32"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/> - <buttonCell key="cell" type="push" title="^IDS_SAVE" bezelStyle="rounded" alignment="center" enabled="NO" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="6"> - <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="system"/> - <string key="keyEquivalent" base64-UTF8="YES"> -DQ -</string> - </buttonCell> - <connections> - <action selector="ok:" target="-2" id="23"/> - <binding destination="-2" name="enabled" keyPath="okEnabled" id="66"/> - </connections> - </button> - </subviews> - </customView> - <customView id="40" customClass="GTMWidthBasedTweaker"> - <rect key="frame" x="0.0" y="198" width="71" height="58"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <subviews> - <textField verticalHuggingPriority="750" id="11"> - <rect key="frame" x="17" y="7" width="50" height="17"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="^IDS_BOOKMARK_EDITOR_URL_LABEL" id="12"> - <font key="font" metaFont="system"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - <textField verticalHuggingPriority="750" id="9"> - <rect key="frame" x="17" y="32" width="50" height="17"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="^IDS_BOOKMARK_EDITOR_NAME_LABEL" id="10"> - <font key="font" metaFont="system"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - </subviews> - <connections> - <outlet property="viewToResize_" destination="1" id="41"/> - <outlet property="viewToSlideAndResize_" destination="42" id="43"/> - </connections> - </customView> - <box autoresizesSubviews="NO" transparent="YES" borderType="none" titlePosition="noTitle" id="42"> - <rect key="frame" x="71" y="194" width="412" height="67"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> - <view key="contentView"> - <rect key="frame" x="0.0" y="0.0" width="412" height="67"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - <subviews> - <textField verticalHuggingPriority="750" id="13"> - <rect key="frame" x="3" y="34" width="386" height="22"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="14"> - <font key="font" metaFont="system"/> - <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <binding destination="-2" name="value" keyPath="displayName" id="65"> - <dictionary key="options"> - <integer key="NSContinuouslyUpdatesValue" value="1"/> - </dictionary> - </binding> - </connections> - </textField> - <textField verticalHuggingPriority="750" id="15"> - <rect key="frame" x="3" y="9" width="386" height="22"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="16"> - <font key="font" metaFont="system"/> - <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <binding destination="-2" name="value" keyPath="displayURL" id="64"> - <dictionary key="options"> - <integer key="NSContinuouslyUpdatesValue" value="1"/> - </dictionary> - </binding> - </connections> - </textField> - </subviews> - </view> - <color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/> - <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> - </box> - <customView id="44" customClass="GTMWidthBasedTweaker"> - <rect key="frame" x="0.0" y="0.0" width="139" height="52"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> - <subviews> - <button verticalHuggingPriority="750" id="3"> - <rect key="frame" x="14" y="12" width="111" height="32"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> - <buttonCell key="cell" type="push" title="^IDS_BOOKMARK_EDITOR_NEW_FOLDER_BUTTON" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="4"> - <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="system"/> - </buttonCell> - <connections> - <action selector="newFolder:" target="-2" id="21"/> - </connections> - </button> - </subviews> - </customView> - <scrollView horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" id="67"> - <rect key="frame" x="20" y="51" width="440" height="139"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - <clipView key="contentView" id="oCk-kS-QEl"> - <rect key="frame" x="1" y="1" width="423" height="122"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - <subviews> - <outlineView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" indentationPerLevel="16" autoresizesOutlineColumn="YES" outlineTableColumn="72" id="70"> - <rect key="frame" x="0.0" y="0.0" width="423" height="122"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - <size key="intercellSpacing" width="3" height="2"/> - <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> - <color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/> - <tableColumns> - <tableColumn width="420" minWidth="16" maxWidth="1000" id="72"> - <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" white="0.33333299" alpha="1" colorSpace="calibratedWhite"/> - </tableHeaderCell> - <textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="75"> - <font key="font" metaFont="system"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/> - <connections> - <binding destination="76" name="value" keyPath="arrangedObjects.folderName" id="80"/> - </connections> - </tableColumn> - </tableColumns> - <connections> - <binding destination="76" name="content" keyPath="arrangedObjects" id="102"/> - <binding destination="-2" name="selectionIndexPaths" keyPath="tableSelectionPaths" previousBinding="102" id="111"/> - <outlet property="delegate" destination="-2" id="6Cf-Qj-5YO"/> - </connections> - </outlineView> - </subviews> - <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> - </clipView> - <scroller key="horizontalScroller" verticalHuggingPriority="750" horizontal="YES" id="69"> - <rect key="frame" x="1" y="123" width="423" height="15"/> - <autoresizingMask key="autoresizingMask"/> - </scroller> - <scroller key="verticalScroller" verticalHuggingPriority="750" horizontal="NO" id="68"> - <rect key="frame" x="424" y="1" width="15" height="122"/> - <autoresizingMask key="autoresizingMask"/> - </scroller> - </scrollView> - </subviews> - </view> - <connections> - <outlet property="delegate" destination="-2" id="29"/> - </connections> - </window> - <customObject id="34" customClass="ChromeUILocalizer"/> - <customObject id="37" customClass="GTMUILocalizerAndLayoutTweaker"> - <connections> - <outlet property="localizer_" destination="34" id="39"/> - <outlet property="uiObject_" destination="1" id="38"/> - </connections> - </customObject> - <treeController objectClassName="BookmarkFolderInfo" editable="NO" childrenKeyPath="children" selectsInsertedObjects="NO" id="76" userLabel="Folder Tree Controller"> - <declaredKeys> - <string>folderName</string> - <string>newFolder</string> - </declaredKeys> - <connections> - <binding destination="-2" name="contentArray" keyPath="folderTreeArray" id="78"/> - </connections> - </treeController> - </objects> -</document>
diff --git a/chrome/app/nibs/BookmarkNameFolder.xib b/chrome/app/nibs/BookmarkNameFolder.xib deleted file mode 100644 index d878317..0000000 --- a/chrome/app/nibs/BookmarkNameFolder.xib +++ /dev/null
@@ -1,102 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13F1077" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none"> - <dependencies> - <deployment version="1090" identifier="macosx"/> - <development version="5100" identifier="xcode"/> - <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/> - </dependencies> - <objects> - <customObject id="-2" userLabel="File's Owner" customClass="BookmarkNameFolderController"> - <connections> - <outlet property="nameField_" destination="5" id="11"/> - <outlet property="okButton_" destination="7" id="26"/> - <outlet property="window" destination="1" id="14"/> - </connections> - </customObject> - <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> - <customObject id="-3" userLabel="Application"/> - <window title="New Folder" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" visibleAtLaunch="NO" animationBehavior="default" id="1" userLabel="Add Folder"> - <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/> - <windowPositionMask key="initialPositionMask" leftStrut="YES" bottomStrut="YES"/> - <rect key="contentRect" x="196" y="408" width="480" height="102"/> - <rect key="screenRect" x="0.0" y="0.0" width="1680" height="1028"/> - <view key="contentView" id="2"> - <rect key="frame" x="0.0" y="0.0" width="480" height="102"/> - <autoresizingMask key="autoresizingMask"/> - <subviews> - <textField verticalHuggingPriority="750" id="5"> - <rect key="frame" x="67" y="60" width="393" height="22"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="6"> - <font key="font" metaFont="system"/> - <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <outlet property="delegate" destination="-2" id="25"/> - </connections> - </textField> - <customView id="17" customClass="GTMWidthBasedTweaker"> - <rect key="frame" x="260" y="0.0" width="220" height="52"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/> - <subviews> - <button verticalHuggingPriority="750" id="7"> - <rect key="frame" x="110" y="12" width="96" height="32"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/> - <buttonCell key="cell" type="push" title="^IDS_APP_OK" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8"> - <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="system"/> - <string key="keyEquivalent" base64-UTF8="YES"> -DQ -</string> - </buttonCell> - <connections> - <action selector="ok:" target="-2" id="13"/> - </connections> - </button> - <button verticalHuggingPriority="750" id="9"> - <rect key="frame" x="14" y="12" width="96" height="32"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/> - <buttonCell key="cell" type="push" title="^IDS_APP_CANCEL" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="10"> - <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="system"/> - <string key="keyEquivalent">.</string> - <modifierMask key="keyEquivalentModifierMask" command="YES"/> - </buttonCell> - <connections> - <action selector="cancel:" target="-2" id="12"/> - </connections> - </button> - </subviews> - </customView> - <customView id="18" customClass="GTMWidthBasedTweaker"> - <rect key="frame" x="0.0" y="42" width="65" height="57"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <subviews> - <textField verticalHuggingPriority="750" id="3"> - <rect key="frame" x="17" y="20" width="45" height="17"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="^IDS_BOOKMARK_BAR_EDIT_FOLDER_LABEL" id="4"> - <font key="font" metaFont="system"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - </subviews> - <connections> - <outlet property="viewToResize_" destination="1" id="19"/> - <outlet property="viewToSlideAndResize_" destination="5" id="20"/> - </connections> - </customView> - </subviews> - </view> - </window> - <customObject id="15" customClass="ChromeUILocalizer"/> - <customObject id="21" customClass="GTMUILocalizerAndLayoutTweaker"> - <connections> - <outlet property="localizer_" destination="15" id="22"/> - <outlet property="uiObject_" destination="1" id="23"/> - </connections> - </customObject> - </objects> -</document>
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index e22fae5..c42b0328 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd
@@ -356,6 +356,7 @@ <include name="IDR_CUSTOM_LINKS_EDIT_CSS" file="resources\local_ntp\custom_links_edit.css" type="BINDATA" /> <include name="IDR_CUSTOM_LINKS_EDIT_JS" file="resources\local_ntp\custom_links_edit.js" type="BINDATA" /> <include name="IDR_CUSTOM_LINKS_ADD_SVG" file="resources\local_ntp\icons\add_link.svg" type="BINDATA" /> + <include name="IDR_CUSTOM_LINKS_EDIT_MENU_SVG" file="resources\local_ntp\icons\edit_menu.svg" type="BINDATA" /> <include name="IDR_OMNIBOX_HTML" file="resources\omnibox\omnibox.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> <include name="IDR_OMNIBOX_CSS" file="resources\omnibox\omnibox.css" type="BINDATA" compress="gzip" /> <include name="IDR_OMNIBOX_JS" file="resources\omnibox\omnibox.js" type="BINDATA" compress="gzip" />
diff --git a/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc b/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc index 8aca112..473f9c3d 100644 --- a/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc +++ b/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc
@@ -10,6 +10,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/test/base/in_process_browser_test.h" +#include "chromeos/chromeos_features.h" #include "components/arc/arc_bridge_service.h" #include "components/arc/arc_service_manager.h" #include "components/arc/arc_util.h" @@ -100,11 +101,18 @@ aura::client::kAccessibilityTouchExplorationPassThrough)); chromeos::AccessibilityManager::Get()->EnableSpokenFeedback(true); - EXPECT_EQ(mojom::AccessibilityFilterType::WHITELISTED_PACKAGE_NAME, - fake_accessibility_helper_instance_->filter_type()); + + // Confirm that filter type is updated with preference change. + EXPECT_EQ( + base::FeatureList::IsEnabled(chromeos::features::kChromeVoxArcSupport) + ? mojom::AccessibilityFilterType::ALL + : mojom::AccessibilityFilterType::WHITELISTED_PACKAGE_NAME, + fake_accessibility_helper_instance_->filter_type()); // Touch exploration pass through of test_window_1 (current active window) - // would become true as no accessibility tree is available for it. + // would become true as no accessibility tree is available for it. Note that + // this value should be set to true in this test even for filter type ALL case + // as we are not a dispatching accessibility event in this test case. EXPECT_TRUE(test_window_1.shell_surface() ->GetWidget() ->GetNativeWindow()
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.cc b/chrome/browser/chromeos/crostini/crostini_manager.cc index 644f277b..8be2c9cf 100644 --- a/chrome/browser/chromeos/crostini/crostini_manager.cc +++ b/chrome/browser/chromeos/crostini/crostini_manager.cc
@@ -981,7 +981,7 @@ auto range = install_linux_package_progress_observers_.equal_range( CryptohomeIdForProfile(profile)); for (auto it = range.first; it != range.second; ++it) { - if (it->second != observer) { + if (it->second == observer) { install_linux_package_progress_observers_.erase(it); return; }
diff --git a/chrome/browser/chromeos/crostini/crostini_registry_service.cc b/chrome/browser/chromeos/crostini/crostini_registry_service.cc index 4d55c88..e87330ccf 100644 --- a/chrome/browser/chromeos/crostini/crostini_registry_service.cc +++ b/chrome/browser/chromeos/crostini/crostini_registry_service.cc
@@ -479,8 +479,6 @@ if (!IsCrostiniEnabled(profile_)) return; - if (!IsCrostiniUIAllowedForProfile(profile_)) - return; size_t num_apps = 0;
diff --git a/chrome/browser/chromeos/crostini/crostini_util.cc b/chrome/browser/chromeos/crostini/crostini_util.cc index 8ba0e15..f93a43a 100644 --- a/chrome/browser/chromeos/crostini/crostini_util.cc +++ b/chrome/browser/chromeos/crostini/crostini_util.cc
@@ -228,7 +228,8 @@ } bool IsCrostiniEnabled(Profile* profile) { - return profile->GetPrefs()->GetBoolean(crostini::prefs::kCrostiniEnabled); + return IsCrostiniUIAllowedForProfile(profile) && + profile->GetPrefs()->GetBoolean(crostini::prefs::kCrostiniEnabled); } bool IsCrostiniRunning(Profile* profile) {
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc index f780021..7193c0f 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
@@ -644,17 +644,10 @@ Respond(NoArguments()); } -namespace { -bool IsCrostiniEnabledForProfile(Profile* profile) { - return IsCrostiniUIAllowedForProfile(profile) && IsCrostiniEnabled(profile); -} -} // namespace - ExtensionFunction::ResponseAction FileManagerPrivateIsCrostiniEnabledFunction::Run() { - return RespondNow( - OneArgument(std::make_unique<base::Value>(IsCrostiniEnabledForProfile( - Profile::FromBrowserContext(browser_context()))))); + return RespondNow(OneArgument(std::make_unique<base::Value>( + IsCrostiniEnabled(Profile::FromBrowserContext(browser_context()))))); } FileManagerPrivateMountCrostiniContainerFunction:: @@ -665,7 +658,7 @@ bool FileManagerPrivateMountCrostiniContainerFunction::RunAsync() { Profile* profile = Profile::FromBrowserContext(browser_context()); - DCHECK(IsCrostiniEnabledForProfile(profile)); + DCHECK(IsCrostiniEnabled(profile)); crostini::CrostiniManager::GetInstance()->RestartCrostini( profile, kCrostiniDefaultVmName, kCrostiniDefaultContainerName, base::BindOnce(
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc index b3ca9ad..191c0ec 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -554,6 +554,11 @@ TestCase("directoryTreeRefresh"), TestCase("myFilesUpdatesChildren"))); +WRAPPED_INSTANTIATE_TEST_CASE_P( + InstallLinuxPackageDialog, /* install_linux_package_dialog.js */ + FilesAppBrowserTest, + ::testing::Values(TestCase("installLinuxPackageDialog"))); + // Structure to describe an account info. struct TestAccountInfo { const char* const gaia_id;
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.cc b/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.cc index 7c248d3..d53db21 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.cc +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.cc
@@ -28,9 +28,8 @@ return enterprise_management::RemoteCommand_Type_DEVICE_FETCH_STATUS; } -void DeviceCommandFetchStatusJob::RunImpl( - const CallbackWithResult& succeeded_callback, - const CallbackWithResult& failed_callback) { +void DeviceCommandFetchStatusJob::RunImpl(CallbackWithResult succeeded_callback, + CallbackWithResult failed_callback) { SYSLOG(INFO) << "Fetching device status"; BrowserPolicyConnectorChromeOS* connector = g_browser_process->platform_part()->browser_policy_connector_chromeos(); @@ -46,12 +45,12 @@ manager->GetStatusUploader()->ScheduleNextStatusUploadImmediately(); manager->GetSystemLogUploader()->ScheduleNextSystemLogUploadImmediately(); base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(succeeded_callback, nullptr)); + FROM_HERE, base::BindOnce(std::move(succeeded_callback), nullptr)); return; } base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(failed_callback, nullptr)); + FROM_HERE, base::BindOnce(std::move(failed_callback), nullptr)); } } // namespace policy
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.h b/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.h index 39cd3ddb..9c54eb28 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.h +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.h
@@ -22,8 +22,8 @@ protected: // RemoteCommandJob: - void RunImpl(const CallbackWithResult& succeeded_callback, - const CallbackWithResult& failed_callback) override; + void RunImpl(CallbackWithResult succeeded_callback, + CallbackWithResult failed_callback) override; private: DISALLOW_COPY_AND_ASSIGN(DeviceCommandFetchStatusJob);
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.cc b/chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.cc index 3d2ecce..1fbaf49 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.cc +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.cc
@@ -34,9 +34,8 @@ return enterprise_management::RemoteCommand_Type_DEVICE_REBOOT; } -void DeviceCommandRebootJob::RunImpl( - const CallbackWithResult& succeeded_callback, - const CallbackWithResult& failed_callback) { +void DeviceCommandRebootJob::RunImpl(CallbackWithResult succeeded_callback, + CallbackWithResult failed_callback) { SYSLOG(INFO) << "Running reboot command."; // Determines the time delta between the command having been issued and the @@ -51,7 +50,7 @@ SYSLOG(WARNING) << "Ignoring reboot command issued " << delta << " before current boot time"; base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(succeeded_callback, nullptr)); + FROM_HERE, base::BindOnce(std::move(succeeded_callback), nullptr)); return; }
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.h b/chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.h index f7ebe99..5075013 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.h +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.h
@@ -27,8 +27,8 @@ private: // RemoteCommandJob: - void RunImpl(const CallbackWithResult& succeeded_callback, - const CallbackWithResult& failed_callback) override; + void RunImpl(CallbackWithResult succeeded_callback, + CallbackWithResult failed_callback) override; chromeos::PowerManagerClient* power_manager_client_;
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.cc b/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.cc index 303cd23..5feacd5 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.cc +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.cc
@@ -106,9 +106,8 @@ void DeviceCommandScreenshotJob::OnSuccess() { SYSLOG(INFO) << "Upload successful."; base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(succeeded_callback_, - base::Passed(std::make_unique<Payload>(SUCCESS)))); + FROM_HERE, base::BindOnce(std::move(succeeded_callback_), + std::make_unique<Payload>(SUCCESS))); } void DeviceCommandScreenshotJob::OnFailure(UploadJob::ErrorCode error_code) { @@ -124,9 +123,8 @@ break; } base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(failed_callback_, - base::Passed(std::make_unique<Payload>(result_code)))); + FROM_HERE, base::BindOnce(std::move(failed_callback_), + std::make_unique<Payload>(result_code))); } bool DeviceCommandScreenshotJob::ParseCommandPayload( @@ -176,11 +174,10 @@ upload_job_->Start(); } -void DeviceCommandScreenshotJob::RunImpl( - const CallbackWithResult& succeeded_callback, - const CallbackWithResult& failed_callback) { - succeeded_callback_ = succeeded_callback; - failed_callback_ = failed_callback; +void DeviceCommandScreenshotJob::RunImpl(CallbackWithResult succeeded_callback, + CallbackWithResult failed_callback) { + succeeded_callback_ = std::move(succeeded_callback); + failed_callback_ = std::move(failed_callback); SYSLOG(INFO) << "Executing screenshot command."; @@ -189,8 +186,8 @@ SYSLOG(ERROR) << "Screenshots are not allowed."; base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, - base::BindOnce(failed_callback_, base::Passed(std::make_unique<Payload>( - FAILURE_USER_INPUT)))); + base::BindOnce(std::move(failed_callback_), + std::make_unique<Payload>(FAILURE_USER_INPUT))); } aura::Window::Windows root_windows = ash::Shell::GetAllRootWindows(); @@ -200,8 +197,8 @@ SYSLOG(ERROR) << upload_url_ << " is not a valid URL."; base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, - base::BindOnce(failed_callback_, base::Passed(std::make_unique<Payload>( - FAILURE_INVALID_URL)))); + base::BindOnce(std::move(failed_callback_), + std::make_unique<Payload>(FAILURE_INVALID_URL))); return; } @@ -209,9 +206,9 @@ if (root_windows.size() == 0) { SYSLOG(ERROR) << "No attached screens."; base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(failed_callback_, base::Passed(std::make_unique<Payload>( - FAILURE_SCREENSHOT_ACQUISITION)))); + FROM_HERE, base::BindOnce(std::move(failed_callback_), + std::make_unique<Payload>( + FAILURE_SCREENSHOT_ACQUISITION))); return; }
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.h b/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.h index b6ba279..fa915598 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.h +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.h
@@ -104,8 +104,8 @@ // RemoteCommandJob: bool ParseCommandPayload(const std::string& command_payload) override; - void RunImpl(const CallbackWithResult& succeeded_callback, - const CallbackWithResult& failed_callback) override; + void RunImpl(CallbackWithResult succeeded_callback, + CallbackWithResult failed_callback) override; void TerminateImpl() override; void StoreScreenshot(size_t screen,
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.cc b/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.cc index 814826d..3810e21 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.cc +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.cc
@@ -48,9 +48,8 @@ return true; } -void DeviceCommandSetVolumeJob::RunImpl( - const CallbackWithResult& succeeded_callback, - const CallbackWithResult& failed_callback) { +void DeviceCommandSetVolumeJob::RunImpl(CallbackWithResult succeeded_callback, + CallbackWithResult failed_callback) { SYSLOG(INFO) << "Running set volume command, volume = " << volume_; auto* audio_handler = chromeos::CrasAudioHandler::Get(); audio_handler->SetOutputVolumePercent(volume_); @@ -58,7 +57,7 @@ audio_handler->SetOutputMute(mute); base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(succeeded_callback, nullptr)); + FROM_HERE, base::BindOnce(std::move(succeeded_callback), nullptr)); } } // namespace policy
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.h b/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.h index 1cd9709..ad7e4e5 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.h +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.h
@@ -23,8 +23,8 @@ protected: // RemoteCommandJob: bool ParseCommandPayload(const std::string& command_payload) override; - void RunImpl(const CallbackWithResult& succeeded_callback, - const CallbackWithResult& failed_callback) override; + void RunImpl(CallbackWithResult succeeded_callback, + CallbackWithResult failed_callback) override; private: // New volume level to be set, value in range [0,100].
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job_unittest.cc b/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job_unittest.cc index 124e1b72..fc2bf6e 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job_unittest.cc +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job_unittest.cc
@@ -95,17 +95,18 @@ auto job = CreateSetVolumeJob(test_start_time_, kVolume); EXPECT_TRUE( job->Run(base::TimeTicks::Now(), - base::Bind(&VerifyResults, base::Unretained(&run_loop_), - base::Unretained(job.get()), kVolume, false))); + base::BindOnce(&VerifyResults, base::Unretained(&run_loop_), + base::Unretained(job.get()), kVolume, false))); run_loop_.Run(); } TEST_F(DeviceCommandSetVolumeTest, Muted) { const int kVolume = 0; auto job = CreateSetVolumeJob(test_start_time_, kVolume); - EXPECT_TRUE(job->Run(base::TimeTicks::Now(), - base::Bind(&VerifyResults, base::Unretained(&run_loop_), - base::Unretained(job.get()), kVolume, true))); + EXPECT_TRUE( + job->Run(base::TimeTicks::Now(), + base::BindOnce(&VerifyResults, base::Unretained(&run_loop_), + base::Unretained(job.get()), kVolume, true))); run_loop_.Run(); }
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.cc b/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.cc index f477c69..3089162 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.cc +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.cc
@@ -164,17 +164,17 @@ const ResultCode result_code, const std::string& message) { DCHECK(result_code != ResultCode::SUCCESS); - if (failed_callback_.is_null()) + if (!failed_callback_) return; // Task was terminated. base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, - base::BindOnce(failed_callback_, + base::BindOnce(std::move(failed_callback_), ResultPayload::CreateErrorPayload(result_code, message))); } void DeviceCommandStartCRDSessionJob::RunImpl( - const CallbackWithResult& succeeded_callback, - const CallbackWithResult& failed_callback) { + CallbackWithResult succeeded_callback, + CallbackWithResult failed_callback) { VLOG(0) << "Running start crd session command"; if (delegate_->HasActiveSession()) { @@ -187,8 +187,8 @@ } terminate_session_attemtpted_ = false; - failed_callback_ = failed_callback; - succeeded_callback_ = succeeded_callback; + failed_callback_ = std::move(failed_callback); + succeeded_callback_ = std::move(succeeded_callback); if (!delegate_->AreServicesReady()) { FinishWithError(ResultCode::FAILURE_SERVICES_NOT_READY, ""); @@ -202,9 +202,9 @@ if (delegate_->GetIdlenessPeriod() < idleness_cutoff_) { base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(failed_callback_, ResultPayload::CreateNonIdlePayload( - delegate_->GetIdlenessPeriod()))); + FROM_HERE, base::BindOnce(std::move(failed_callback_), + ResultPayload::CreateNonIdlePayload( + delegate_->GetIdlenessPeriod()))); return; } @@ -239,11 +239,11 @@ void DeviceCommandStartCRDSessionJob::OnAuthCodeReceived( const std::string& auth_code) { - if (succeeded_callback_.is_null()) + if (!succeeded_callback_) return; // Task was terminated. base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, - base::BindOnce(succeeded_callback_, + base::BindOnce(std::move(succeeded_callback_), ResultPayload::CreateSuccessPayload(auth_code))); }
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.h b/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.h index 06f25bae..76c4b2da 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.h +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.h
@@ -96,8 +96,8 @@ protected: // RemoteCommandJob: bool ParseCommandPayload(const std::string& command_payload) override; - void RunImpl(const CallbackWithResult& succeeded_callback, - const CallbackWithResult& failed_callback) override; + void RunImpl(CallbackWithResult succeeded_callback, + CallbackWithResult failed_callback) override; void TerminateImpl() override; private:
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_unittest.cc b/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_unittest.cc index 482932bb..92c6638 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_unittest.cc +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_unittest.cc
@@ -306,10 +306,10 @@ base::TimeDelta::FromSeconds(30), kTestDirectoryBotJID); bool success = job->Run( base::TimeTicks::Now(), - base::BindRepeating(&DeviceCommandStartCRDSessionJobTest::VerifyResults, - base::Unretained(this), base::Unretained(job.get()), - RemoteCommandJob::SUCCEEDED, - CreateSuccessPayload(kTestAuthCode))); + base::BindOnce(&DeviceCommandStartCRDSessionJobTest::VerifyResults, + base::Unretained(this), base::Unretained(job.get()), + RemoteCommandJob::SUCCEEDED, + CreateSuccessPayload(kTestAuthCode))); EXPECT_TRUE(success); run_loop_.Run(); } @@ -328,10 +328,10 @@ base::TimeDelta::FromSeconds(30), kTestDirectoryBotJID); bool success = job->Run( base::TimeTicks::Now(), - base::BindRepeating(&DeviceCommandStartCRDSessionJobTest::VerifyResults, - base::Unretained(this), base::Unretained(job.get()), - RemoteCommandJob::SUCCEEDED, - CreateSuccessPayload(kTestAuthCode))); + base::BindOnce(&DeviceCommandStartCRDSessionJobTest::VerifyResults, + base::Unretained(this), base::Unretained(job.get()), + RemoteCommandJob::SUCCEEDED, + CreateSuccessPayload(kTestAuthCode))); EXPECT_TRUE(success); run_loop_.Run(); } @@ -350,7 +350,7 @@ base::TimeDelta::FromSeconds(30), kTestDirectoryBotJID); bool success = job->Run( base::TimeTicks::Now(), - base::BindRepeating( + base::BindOnce( &DeviceCommandStartCRDSessionJobTest::VerifyResults, base::Unretained(this), base::Unretained(job.get()), RemoteCommandJob::FAILED, @@ -373,15 +373,14 @@ std::make_unique<DeviceCommandStartCRDSessionJob>(&delegate); InitializeJob(job.get(), kUniqueID, test_start_time_, base::TimeDelta::FromSeconds(30), kTestDirectoryBotJID); - bool success = - job->Run(base::TimeTicks::Now(), - base::BindRepeating( - &DeviceCommandStartCRDSessionJobTest::VerifyResults, - base::Unretained(this), base::Unretained(job.get()), - RemoteCommandJob::FAILED, - CreateErrorPayload( - DeviceCommandStartCRDSessionJob::FAILURE_NOT_A_KIOSK, - std::string()))); + bool success = job->Run( + base::TimeTicks::Now(), + base::BindOnce(&DeviceCommandStartCRDSessionJobTest::VerifyResults, + base::Unretained(this), base::Unretained(job.get()), + RemoteCommandJob::FAILED, + CreateErrorPayload( + DeviceCommandStartCRDSessionJob::FAILURE_NOT_A_KIOSK, + std::string()))); EXPECT_TRUE(success); run_loop_.Run(); } @@ -398,13 +397,12 @@ std::make_unique<DeviceCommandStartCRDSessionJob>(&delegate); InitializeJob(job.get(), kUniqueID, test_start_time_, base::TimeDelta::FromSeconds(30), kTestDirectoryBotJID); - bool success = - job->Run(base::TimeTicks::Now(), - base::BindRepeating( - &DeviceCommandStartCRDSessionJobTest::VerifyResults, - base::Unretained(this), base::Unretained(job.get()), - RemoteCommandJob::FAILED, - CreateNotIdlePayload(base::TimeDelta::FromSeconds(1)))); + bool success = job->Run( + base::TimeTicks::Now(), + base::BindOnce(&DeviceCommandStartCRDSessionJobTest::VerifyResults, + base::Unretained(this), base::Unretained(job.get()), + RemoteCommandJob::FAILED, + CreateNotIdlePayload(base::TimeDelta::FromSeconds(1)))); EXPECT_TRUE(success); run_loop_.Run(); } @@ -423,7 +421,7 @@ base::TimeDelta::FromSeconds(30), kTestDirectoryBotJID); bool success = job->Run(base::TimeTicks::Now(), - base::BindRepeating( + base::BindOnce( &DeviceCommandStartCRDSessionJobTest::VerifyResults, base::Unretained(this), base::Unretained(job.get()), RemoteCommandJob::FAILED, @@ -446,15 +444,14 @@ std::make_unique<DeviceCommandStartCRDSessionJob>(&delegate); InitializeJob(job.get(), kUniqueID, test_start_time_, base::TimeDelta::FromSeconds(30), kTestDirectoryBotJID); - bool success = - job->Run(base::TimeTicks::Now(), - base::BindRepeating( - &DeviceCommandStartCRDSessionJobTest::VerifyResults, - base::Unretained(this), base::Unretained(job.get()), - RemoteCommandJob::FAILED, - CreateErrorPayload( - DeviceCommandStartCRDSessionJob::FAILURE_NO_ICE_CONFIG, - kTestNoICEConfigReason))); + bool success = job->Run( + base::TimeTicks::Now(), + base::BindOnce(&DeviceCommandStartCRDSessionJobTest::VerifyResults, + base::Unretained(this), base::Unretained(job.get()), + RemoteCommandJob::FAILED, + CreateErrorPayload( + DeviceCommandStartCRDSessionJob::FAILURE_NO_ICE_CONFIG, + kTestNoICEConfigReason))); EXPECT_TRUE(success); run_loop_.Run(); } @@ -473,7 +470,7 @@ base::TimeDelta::FromSeconds(30), kTestDirectoryBotJID); bool success = job->Run(base::TimeTicks::Now(), - base::BindRepeating( + base::BindOnce( &DeviceCommandStartCRDSessionJobTest::VerifyResults, base::Unretained(this), base::Unretained(job.get()), RemoteCommandJob::FAILED,
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.cc b/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.cc index cff0408..f00c11f 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.cc +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.cc
@@ -41,9 +41,8 @@ return now > issued_time() + kWipeUsersCommandExpirationTime; } -void DeviceCommandWipeUsersJob::RunImpl( - const CallbackWithResult& succeeded_callback, - const CallbackWithResult& failed_callback) { +void DeviceCommandWipeUsersJob::RunImpl(CallbackWithResult succeeded_callback, + CallbackWithResult failed_callback) { // Set callback which gets called after command is ACKd to the server. We want // to log out only after the server got the ACK, otherwise we could log out // before ACKing and then the server would never get the ACK. @@ -54,7 +53,7 @@ // callback gets called and signals that the command was successfully received // and will be executed. chromeos::user_removal_manager::InitiateUserRemoval( - base::BindOnce(succeeded_callback, nullptr)); + base::BindOnce(std::move(succeeded_callback), nullptr)); } } // namespace policy
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.h b/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.h index 659b319..16d8774 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.h +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.h
@@ -23,8 +23,8 @@ protected: // RemoteCommandJob: bool IsExpired(base::TimeTicks now) override; - void RunImpl(const CallbackWithResult& succeeded_callback, - const CallbackWithResult& failed_callback) override; + void RunImpl(CallbackWithResult succeeded_callback, + CallbackWithResult failed_callback) override; private: RemoteCommandsService* const service_;
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job_unittest.cc b/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job_unittest.cc index 9275442..07d624c8 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job_unittest.cc +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job_unittest.cc
@@ -114,13 +114,14 @@ std::unique_ptr<policy::RemoteCommandJob> job = CreateWipeUsersJob(kCommandAge, service_.get()); - auto check_result_callback = base::Bind( + auto check_result_callback = base::BindOnce( [](base::RunLoop* run_loop, policy::RemoteCommandJob* job) { EXPECT_EQ(policy::RemoteCommandJob::SUCCEEDED, job->status()); run_loop->Quit(); }, &run_loop_, job.get()); - EXPECT_TRUE(job->Run(base::TimeTicks::Now(), check_result_callback)); + EXPECT_TRUE( + job->Run(base::TimeTicks::Now(), std::move(check_result_callback))); // This call processes the CommitPendingWrite which persists the pref to disk, // and runs the passed callback which is the succeeded_callback. run_loop_.Run();
diff --git a/chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.cc b/chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.cc index fb5a8951..8db88f4 100644 --- a/chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.cc +++ b/chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.cc
@@ -33,8 +33,8 @@ return true; } -void UserCommandArcJob::RunImpl(const CallbackWithResult& succeeded_callback, - const CallbackWithResult& failed_callback) { +void UserCommandArcJob::RunImpl(CallbackWithResult succeeded_callback, + CallbackWithResult failed_callback) { SYSLOG(INFO) << "Running Arc command, payload = " << command_payload_; auto* const arc_policy_bridge = @@ -43,22 +43,22 @@ if (!arc_policy_bridge) { // ARC is not enabled for this profile, fail the remote command. base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(failed_callback, nullptr)); + FROM_HERE, base::BindOnce(std::move(failed_callback), nullptr)); return; } auto on_command_finished_callback = base::BindOnce( - [](const CallbackWithResult& succeeded_callback, - const CallbackWithResult& failed_callback, + [](CallbackWithResult succeeded_callback, + CallbackWithResult failed_callback, arc::mojom::CommandResultType result) { if (result == arc::mojom::CommandResultType::FAILURE || result == arc::mojom::CommandResultType::IGNORED) { - failed_callback.Run(nullptr); + std::move(failed_callback).Run(nullptr); return; } - succeeded_callback.Run(nullptr); + std::move(succeeded_callback).Run(nullptr); }, - succeeded_callback, failed_callback); + std::move(succeeded_callback), std::move(failed_callback)); // Documentation for RemoteCommandJob::RunImpl requires that the // implementation executes the command asynchronously.
diff --git a/chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.h b/chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.h index 35aafed..4997ecb 100644 --- a/chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.h +++ b/chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.h
@@ -25,8 +25,8 @@ protected: // RemoteCommandJob: bool ParseCommandPayload(const std::string& command_payload) override; - void RunImpl(const CallbackWithResult& succeeded_callback, - const CallbackWithResult& failed_callback) override; + void RunImpl(CallbackWithResult succeeded_callback, + CallbackWithResult failed_callback) override; private: Profile* const profile_;
diff --git a/chrome/browser/invalidation/profile_invalidation_provider_factory.cc b/chrome/browser/invalidation/profile_invalidation_provider_factory.cc index af6bfd9..7a26d0b 100644 --- a/chrome/browser/invalidation/profile_invalidation_provider_factory.cc +++ b/chrome/browser/invalidation/profile_invalidation_provider_factory.cc
@@ -10,11 +10,15 @@ #include "build/build_config.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/gcm/gcm_profile_service_factory.h" +#include "chrome/browser/gcm/instance_id/instance_id_profile_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_content_client.h" #include "components/gcm_driver/gcm_profile_service.h" +#include "components/gcm_driver/instance_id/instance_id_profile_service.h" +#include "components/invalidation/impl/fcm_invalidation_service.h" #include "components/invalidation/impl/invalidation_prefs.h" #include "components/invalidation/impl/invalidation_state_tracker.h" +#include "components/invalidation/impl/invalidation_switches.h" #include "components/invalidation/impl/invalidator_storage.h" #include "components/invalidation/impl/profile_identity_provider.h" #include "components/invalidation/impl/profile_invalidation_provider.h" @@ -26,7 +30,9 @@ #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_registry.h" #include "content/public/browser/storage_partition.h" +#include "content/public/common/service_manager_connection.h" #include "net/url_request/url_request_context_getter.h" +#include "services/data_decoder/public/cpp/safe_json_parser.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #if defined(OS_ANDROID) @@ -120,18 +126,38 @@ IdentityManagerFactory::GetForProfile(profile))); } - std::unique_ptr<TiclInvalidationService> service(new TiclInvalidationService( - GetUserAgent(), std::move(identity_provider), - std::unique_ptr<TiclSettingsProvider>( - new TiclProfileSettingsProvider(profile->GetPrefs())), - gcm::GCMProfileServiceFactory::GetForProfile(profile)->driver(), - profile->GetRequestContext(), - content::BrowserContext::GetDefaultStoragePartition(profile) - ->GetURLLoaderFactoryForBrowserProcess())); - service->Init(std::unique_ptr<syncer::InvalidationStateTracker>( - new InvalidatorStorage(profile->GetPrefs()))); + if (base::FeatureList::IsEnabled(invalidation::switches::kFCMInvalidations)) { + std::unique_ptr<FCMInvalidationService> service = + std::make_unique<FCMInvalidationService>( + std::move(identity_provider), + gcm::GCMProfileServiceFactory::GetForProfile(profile)->driver(), + instance_id::InstanceIDProfileServiceFactory::GetForProfile(profile) + ->driver(), + profile->GetPrefs(), + base::BindRepeating( + data_decoder::SafeJsonParser::Parse, + content::ServiceManagerConnection::GetForProcess() + ->GetConnector()), + content::BrowserContext::GetDefaultStoragePartition(profile) + ->GetURLLoaderFactoryForBrowserProcess() + .get()); + service->Init(); + return new ProfileInvalidationProvider(std::move(service)); - return new ProfileInvalidationProvider(std::move(service)); + } else { + std::unique_ptr<TiclInvalidationService> service = + std::make_unique<TiclInvalidationService>( + GetUserAgent(), std::move(identity_provider), + std::make_unique<TiclProfileSettingsProvider>(profile->GetPrefs()), + gcm::GCMProfileServiceFactory::GetForProfile(profile)->driver(), + profile->GetRequestContext(), + content::BrowserContext::GetDefaultStoragePartition(profile) + ->GetURLLoaderFactoryForBrowserProcess()); + service->Init(std::unique_ptr<syncer::InvalidationStateTracker>( + new InvalidatorStorage(profile->GetPrefs()))); + + return new ProfileInvalidationProvider(std::move(service)); + } #endif }
diff --git a/chrome/browser/prefs/pref_service_incognito_whitelist.cc b/chrome/browser/prefs/pref_service_incognito_whitelist.cc index c2b6380..7d8682c 100644 --- a/chrome/browser/prefs/pref_service_incognito_whitelist.cc +++ b/chrome/browser/prefs/pref_service_incognito_whitelist.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/prefs/pref_service_incognito_whitelist.h" #include <vector> + #include "build/build_config.h" #include "chrome/common/pref_names.h" #include "components/autofill/core/common/autofill_pref_names.h" @@ -53,7 +54,6 @@ #if defined(OS_CHROMEOS) #include "ash/public/cpp/ash_pref_names.h" -#include "ash/public/cpp/shelf_prefs.h" #include "chrome/browser/chromeos/crostini/crostini_pref_names.h" #include "chromeos/chromeos_pref_names.h" #include "chromeos/components/proximity_auth/proximity_auth_pref_names.h" @@ -76,44 +76,12 @@ const char* incognito_whitelist[] = { // ash/public/cpp/ash_pref_names.h #if defined(OS_CHROMEOS) - ash::prefs::kAccessibilityLargeCursorEnabled, - ash::prefs::kAccessibilityLargeCursorDipSize, - ash::prefs::kAccessibilityStickyKeysEnabled, + ash::prefs::kDetachableBaseDevices, ash::prefs::kEnableStylusTools, + ash::prefs::kHasSeenStylus, - // TODO(https://crbug.com/861722): Check with code owners why this pref is - // required in tests, if possible, update tests and remove. - ash::prefs::kAccessibilitySpokenFeedbackEnabled, - ash::prefs::kAccessibilityHighContrastEnabled, - ash::prefs::kAccessibilityScreenMagnifierCenterFocus, - ash::prefs::kAccessibilityScreenMagnifierEnabled, - ash::prefs::kAccessibilityScreenMagnifierScale, - ash::prefs::kAccessibilityVirtualKeyboardEnabled, - ash::prefs::kAccessibilityMonoAudioEnabled, - ash::prefs::kAccessibilityAutoclickEnabled, - ash::prefs::kAccessibilityAutoclickDelayMs, - ash::prefs::kAccessibilityCaretHighlightEnabled, - ash::prefs::kAccessibilityCursorHighlightEnabled, - ash::prefs::kAccessibilityFocusHighlightEnabled, - ash::prefs::kAccessibilitySelectToSpeakEnabled, - ash::prefs::kAccessibilitySwitchAccessEnabled, - ash::prefs::kAccessibilityDictationEnabled, - ash::prefs::kShouldAlwaysShowAccessibilityMenu, - ash::prefs::kDockedMagnifierEnabled, ash::prefs::kDockedMagnifierScale, - ash::prefs::kDockedMagnifierAcceleratorDialogHasBeenAccepted, - ash::prefs::kHighContrastAcceleratorDialogHasBeenAccepted, - ash::prefs::kScreenMagnifierAcceleratorDialogHasBeenAccepted, - ash::prefs::kDisplayMixedMirrorModeParams, ash::prefs::kDisplayPowerState, - ash::prefs::kDisplayProperties, ash::prefs::kDisplayRotationLock, - ash::prefs::kDisplayTouchAssociations, - ash::prefs::kDisplayTouchPortAssociations, - ash::prefs::kExternalDisplayMirrorInfo, ash::prefs::kSecondaryDisplays, - ash::prefs::kHasSeenStylus, ash::prefs::kShownPaletteWelcomeBubble, - ash::prefs::kEnableStylusTools, ash::prefs::kLaunchPaletteOnEjectEvent, - ash::prefs::kNightLightEnabled, ash::prefs::kNightLightTemperature, - ash::prefs::kNightLightScheduleType, ash::prefs::kNightLightCustomStartTime, - ash::prefs::kNightLightCustomEndTime, ash::prefs::kAllowScreenLock, - ash::prefs::kEnableAutoScreenLock, ash::prefs::kPowerAcScreenDimDelayMs, - ash::prefs::kPowerAcScreenOffDelayMs, ash::prefs::kPowerAcScreenLockDelayMs, + // TODO(https://crbug.com/861722): Check with derat@ before removing. + ash::prefs::kPowerAcScreenDimDelayMs, ash::prefs::kPowerAcScreenOffDelayMs, + ash::prefs::kPowerAcScreenLockDelayMs, ash::prefs::kPowerAcIdleWarningDelayMs, ash::prefs::kPowerAcIdleDelayMs, ash::prefs::kPowerBatteryScreenDimDelayMs, ash::prefs::kPowerBatteryScreenOffDelayMs, @@ -129,22 +97,9 @@ ash::prefs::kPowerUserActivityScreenDimDelayFactor, ash::prefs::kPowerWaitForInitialUserActivity, ash::prefs::kPowerForceNonzeroBrightnessForUserActivity, - ash::prefs::kShelfAlignment, ash::prefs::kShelfAlignmentLocal, - ash::prefs::kShelfAutoHideBehavior, ash::prefs::kShelfAutoHideBehaviorLocal, - ash::prefs::kShelfPreferences, ash::prefs::kShowLogoutButtonInTray, - ash::prefs::kLogoutDialogDurationMs, ash::prefs::kUserWallpaperInfo, - ash::prefs::kWallpaperColors, ash::prefs::kUserBluetoothAdapterEnabled, - ash::prefs::kSystemBluetoothAdapterEnabled, ash::prefs::kTapDraggingEnabled, - ash::prefs::kTapToClickEnabled, ash::prefs::kOwnerTapToClickEnabled, - ash::prefs::kTouchpadEnabled, ash::prefs::kTouchscreenEnabled, - ash::prefs::kQuickUnlockPinSalt, ash::prefs::kDetachableBaseDevices, -#endif // defined(OS_CHROMEOS) -// ash/public/cpp/shelf_prefs.h -#if defined(OS_CHROMEOS) - ash::kShelfAutoHideBehaviorAlways, ash::kShelfAutoHideBehaviorNever, - ash::kShelfAlignmentBottom, ash::kShelfAlignmentLeft, - ash::kShelfAlignmentRight, + // TODO(https://crbug.com/861722): Check with mukai@ before removing. + ash::prefs::kTouchpadEnabled, ash::prefs::kTouchscreenEnabled, #endif // defined(OS_CHROMEOS) // chrome/browser/chromeos/crostini/crostini_pref_names.h @@ -1165,9 +1120,8 @@ // storage default, from on disk to in memory. All items in this list will be // audited and checked with owners and removed from whitelist. void GetIncognitoWhitelist(std::vector<const char*>* whitelist) { - whitelist->insert( - whitelist->end(), incognito_whitelist, - incognito_whitelist + sizeof(incognito_whitelist) / sizeof(char*)); + whitelist->insert(whitelist->end(), incognito_whitelist, + incognito_whitelist + base::size(incognito_whitelist)); } } // namespace prefs
diff --git a/chrome/browser/prefs/pref_service_syncable_util.cc b/chrome/browser/prefs/pref_service_syncable_util.cc index 824f18a8..ce85fa2 100644 --- a/chrome/browser/prefs/pref_service_syncable_util.cc +++ b/chrome/browser/prefs/pref_service_syncable_util.cc
@@ -10,6 +10,9 @@ #include "chrome/browser/profiles/profile.h" #include "components/sync_preferences/pref_service_syncable.h" +#if defined(OS_CHROMEOS) +#include "ash/public/cpp/ash_pref_names.h" +#endif // defined(OS_CHROMEOS) sync_preferences::PrefServiceSyncable* PrefServiceSyncableFromProfile( Profile* profile) { @@ -30,18 +33,49 @@ std::unique_ptr<PrefValueStore::Delegate> delegate) { // List of keys that can be changed in the user prefs file by the incognito // profile. - std::vector<const char*> persistent_pref_names; + static const char* persistent_pref_names[] = { +#if defined(OS_CHROMEOS) + // Accessibility preferences should be persisted if they are changed in + // incognito mode. + ash::prefs::kAccessibilityLargeCursorEnabled, + ash::prefs::kAccessibilityLargeCursorDipSize, + ash::prefs::kAccessibilityStickyKeysEnabled, + ash::prefs::kAccessibilitySpokenFeedbackEnabled, + ash::prefs::kAccessibilityHighContrastEnabled, + ash::prefs::kAccessibilityScreenMagnifierCenterFocus, + ash::prefs::kAccessibilityScreenMagnifierEnabled, + ash::prefs::kAccessibilityScreenMagnifierScale, + ash::prefs::kAccessibilityVirtualKeyboardEnabled, + ash::prefs::kAccessibilityMonoAudioEnabled, + ash::prefs::kAccessibilityAutoclickEnabled, + ash::prefs::kAccessibilityAutoclickDelayMs, + ash::prefs::kAccessibilityCaretHighlightEnabled, + ash::prefs::kAccessibilityCursorHighlightEnabled, + ash::prefs::kAccessibilityFocusHighlightEnabled, + ash::prefs::kAccessibilitySelectToSpeakEnabled, + ash::prefs::kAccessibilitySwitchAccessEnabled, + ash::prefs::kAccessibilityDictationEnabled, + ash::prefs::kDockedMagnifierEnabled, + ash::prefs::kDockedMagnifierScale, + ash::prefs::kDockedMagnifierAcceleratorDialogHasBeenAccepted, + ash::prefs::kHighContrastAcceleratorDialogHasBeenAccepted, + ash::prefs::kScreenMagnifierAcceleratorDialogHasBeenAccepted, + ash::prefs::kShouldAlwaysShowAccessibilityMenu +#endif // defined(OS_CHROMEOS) + }; - // TODO(https://crbug.com/861722): Remove |GetIncognitoWhitelist| and its - // file. This list is ONLY added for transition of code from blacklist to - // whitelist. All whitelisted prefs should be added here to - // |persistent_pref_names|. - prefs::GetIncognitoWhitelist(&persistent_pref_names); + // TODO(https://crbug.com/861722): Remove |GetIncognitoWhitelist|, its + // file, and |persistent_prefs|. + // This list is ONLY added for transition of code from blacklist to whitelist. + std::vector<const char*> persistent_prefs; + prefs::GetIncognitoWhitelist(&persistent_prefs); + persistent_prefs.insert( + persistent_prefs.end(), persistent_pref_names, + persistent_pref_names + sizeof(persistent_pref_names) / sizeof(char*)); // TODO(https://crbug.com/861722): Current implementation does not cover // preferences from iOS. The code should be refactored to cover it. return pref_service->CreateIncognitoPrefService( - incognito_extension_pref_store, persistent_pref_names, - std::move(delegate)); + incognito_extension_pref_store, persistent_prefs, std::move(delegate)); }
diff --git a/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos.cc b/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos.cc index 080745b..7b6a8c0 100644 --- a/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos.cc +++ b/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos.cc
@@ -18,6 +18,7 @@ #include "base/files/file_util.h" #include "base/memory/memory_pressure_monitor_chromeos.h" #include "base/metrics/histogram_macros.h" +#include "base/process/memory.h" #include "base/process/process_handle.h" // kNullProcessHandle. #include "base/process/process_metrics.h" #include "base/strings/string16.h" @@ -380,10 +381,10 @@ // Sets OOM score. VLOG(3) << "Set OOM score " << chrome::kLowestRendererOomScore << " for focused tab " << pid; - std::map<int, int> dict; - dict[pid] = chrome::kLowestRendererOomScore; - DCHECK(GetDebugDaemonClient()); - GetDebugDaemonClient()->SetOomScoreAdj(dict, base::Bind(&OnSetOomScoreAdj)); + if (!base::AdjustOOMScore(pid, chrome::kLowestRendererOomScore)) + LOG(ERROR) << "Failed to set oom_score_adj to " + << chrome::kLowestRendererOomScore + << " for focused tab, pid: " << pid; } void TabManagerDelegate::AdjustFocusedTabScore(base::ProcessHandle pid) { @@ -766,7 +767,12 @@ // current cached score. if (oom_score_map_[pid] != score) { VLOG(3) << "Update OOM score " << score << " for " << *cur; - oom_scores_to_change[pid] = static_cast<int32_t>(score); + if (cur->app()) + oom_scores_to_change[pid] = static_cast<int32_t>(score); + else + if (!base::AdjustOOMScore(pid, score)) + LOG(ERROR) << "Failed to set oom_score_adj to " << score + << " for process " << pid; } priority += priority_increment; }
diff --git a/chrome/browser/resources/local_ntp/custom_backgrounds.css b/chrome/browser/resources/local_ntp/custom_backgrounds.css index 06b6e5f..5633720 100644 --- a/chrome/browser/resources/local_ntp/custom_backgrounds.css +++ b/chrome/browser/resources/local_ntp/custom_backgrounds.css
@@ -115,6 +115,17 @@ border-radius: 50%; } +#edit-bg-divider { + border-bottom: 1px solid rgb(232, 234, 237); + margin: 8px 0; + width: 100%; +} + +#custom-link-restore-default .bg-option-img { + background: rgb(241, 243, 244) url(icons/link_gray.svg) no-repeat center; + border-radius: 50%; +} + #edit-bg-restore-default .bg-option-img { background: rgb(241, 243, 244) url(icons/chrome.svg) no-repeat center; border-radius: 50%;
diff --git a/chrome/browser/resources/local_ntp/custom_backgrounds.js b/chrome/browser/resources/local_ntp/custom_backgrounds.js index 52a13054..0f8839f 100644 --- a/chrome/browser/resources/local_ntp/custom_backgrounds.js +++ b/chrome/browser/resources/local_ntp/custom_backgrounds.js
@@ -35,6 +35,8 @@ CANCEL: 'bg-sel-footer-cancel', CONNECT_GOOGLE_PHOTOS: 'edit-bg-google-photos', CONNECT_GOOGLE_PHOTOS_TEXT: 'edit-bg-google-photos-text', + CUSTOM_LINK_RESTORE_DEFAULT: 'custom-link-restore-default', + CUSTOM_LINK_RESTORE_DEFAULT_TEXT: 'custom-link-restore-default-text', DEFAULT_WALLPAPERS: 'edit-bg-default-wallpapers', DEFAULT_WALLPAPERS_TEXT: 'edit-bg-default-wallpapers-text', DONE: 'bg-sel-footer-done', @@ -672,6 +674,8 @@ configData.translatedStrings.uploadImage; $(customBackgrounds.IDS.RESTORE_DEFAULT_TEXT).textContent = configData.translatedStrings.restoreDefaultBackground; + $(customBackgrounds.IDS.CUSTOM_LINK_RESTORE_DEFAULT_TEXT).textContent = + configData.translatedStrings.restoreDefaultLinks; $(customBackgrounds.IDS.OPTIONS_TITLE).textContent = configData.translatedStrings.customizeBackground; $(customBackgrounds.IDS.REFRESH_TEXT).textContent = @@ -797,6 +801,20 @@ } }; + // Interactions with the "Restore default shortcuts" option. + var customLinksRestoreDefaultInteraction = function(event) { + editDialog.close(); + window.chrome.embeddedSearch.newTabPage.resetCustomLinks(); + }; + $(customBackgrounds.IDS.CUSTOM_LINK_RESTORE_DEFAULT).onclick = + customLinksRestoreDefaultInteraction; + $(customBackgrounds.IDS.CUSTOM_LINK_RESTORE_DEFAULT).onkeyup = function( + event) { + if (event.keyCode === customBackgrounds.KEYCODES.ENTER) { + customLinksRestoreDefaultInteraction(event); + } + }; + // Interactions with the "Chrome backgrounds" option. var defaultWallpapersInteraction = function(event) { customBackgrounds.loadChromeBackgrounds();
diff --git a/chrome/browser/resources/local_ntp/custom_links_edit.css b/chrome/browser/resources/local_ntp/custom_links_edit.css index ce2a8dc2..b07f963 100644 --- a/chrome/browser/resources/local_ntp/custom_links_edit.css +++ b/chrome/browser/resources/local_ntp/custom_links_edit.css
@@ -25,7 +25,9 @@ width: 100%; } -.dialog-title { +#dialog-title { + color: rgb(32, 33, 36); + font-family: 'Roboto', arial, sans-serif; font-size: 15px; line-height: 24px; margin-bottom: 16px; @@ -42,18 +44,72 @@ margin-bottom: 4px; } +.input-container { + position: relative; +} + input { - -webkit-padding-end: 8px; - -webkit-padding-start: 8px; background-color: rgb(232, 234, 237); border: none; border-radius: 4px; + caret-color: rgb(26, 115, 232); + color: rgb(32, 33, 36); + font-family: 'Roboto', arial, sans-serif; font-size: 13px; height: 32px; line-height: 24px; + outline: none; + padding-inline-end: 8px; + padding-inline-start: 8px; width: calc(100% - 16px); } +.underline { + border-bottom: 2px solid rgb(26, 115, 232); + bottom: 0; + box-sizing: border-box; + left: 0; + margin: auto; + opacity: 0; + position: absolute; + right: 0; + transition: opacity 120ms ease-out, width 0ms linear 180ms; + width: 0; +} + +input:focus + .underline { + opacity: 1; + transition: width 180ms ease-out, opacity 120ms ease-in; + width: 100%; +} + +.field-title.focused { + color: rgb(26, 115, 232); +} + +.error-msg { + color: rgb(217, 48, 37); + display: none; + font-size: 10px; + font-weight: 400; + margin-top: 6px; +} + +.invalid label { + color: rgb(217, 48, 37); +} + +.invalid .error-msg { + display: block; +} + +.invalid .underline { + border-color: rgb(217, 48, 37); + opacity: 1; + transition: width 180ms ease-out, opacity 120ms ease-in; + width: 100%; +} + .buttons-container { display: flex; justify-content: space-between; @@ -66,9 +122,14 @@ button { border: none; border-radius: 4px; + font-family: 'Roboto', arial, sans-serif; font-size: 12px; + font-weight: 500; height: 32px; padding: 0 16px; + transition-duration: 200ms; + transition-property: background-color, color, box-shadow, border; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } button.primary { @@ -76,12 +137,49 @@ color: white; } +button:focus:not(:active) { + box-shadow: 0 0 0 2px rgba(26, 115, 232, 0.4); +} + +button.primary:disabled { + background-color: rgb(241, 243, 244); + color: rgb(128, 134, 139); +} + +button.primary:hover:not(:disabled) { + background-color: rgb(41, 123, 231); + box-shadow: 0 1px 2px 0 rgba(66, 133, 244, 0.3), + 0 1px 3px 1px rgba(66, 133, 244, 0.15); +} + +button.primary:active:not(:disabled) { + box-shadow: 0 1px 2px 0 rgba(66, 133, 244, 0.3), + 0 3px 6px 2px rgba(66, 133, 244, 0.15); +} + button.secondary { background-color: white; - border: 1px solid rgb(218,220,224); + border: 1px solid rgb(218, 220, 224); color: rgb(26, 115, 232); } +button.secondary:disabled { + border-color: rgb(241, 243, 244); + color: rgb(128, 134, 139); +} + +button.secondary:hover:not(:disabled) { + background-color: rgba(66, 133, 244, 0.04); + border-color: rgb(210, 227, 252); +} + +button.secondary:active:not(:disabled) { + background-color: white; + border-color: white; + box-shadow: 0 1px 2px 0 rgba(60, 64, 67, 0.3), + 0 3px 6px 2px rgba(60, 64, 67, 0.15); +} + #cancel { margin-right: 8px; }
diff --git a/chrome/browser/resources/local_ntp/custom_links_edit.html b/chrome/browser/resources/local_ntp/custom_links_edit.html index d194d52..b665e9db 100644 --- a/chrome/browser/resources/local_ntp/custom_links_edit.html +++ b/chrome/browser/resources/local_ntp/custom_links_edit.html
@@ -11,24 +11,34 @@ </head> <body> <dialog id="edit-link-dialog"> - <div class="dialog-title">Edit shortcut</div> - <div class="field-container"> - <div class="field-title">Name</div> - <input class="field-input" autocomplete="no" tabindex="0"></input> - </div> - <div class="field-container"> - <div class="field-title">URL</div> - <input class="field-input" autocomplete="url" tabindex="0"></input> - </div> - <div class="buttons-container"> - <span> - <button id="delete" class="secondary">Remove</button> - </span> - <span class="right"> - <button id="cancel" class="secondary">Cancel</button> - <button id="done" class="primary">Done</button> - </span> - </div> + <div id="dialog-title"></div> + <form id="edit-form" action=""> + <div id="title" class="field-container"> + <label id="title-field-name" class="field-title"></label> + <div class="input-container"> + <input id="title-field" class="field-input" type="text" + autocomplete="no" tabindex="0" required></input> + <div class="underline"></div> + </div> + </div> + <div id="url" class="field-container"> + <label id="url-field-name" class="field-title"></label> + <div class="input-container"> + <input id="url-field" class="field-input" type="text" + autocomplete="url" tabindex="0" required></input> + <div class="underline"></div> + </div> + <div id="invalid-url" class="error-msg"></div> + </div> + <div class="buttons-container"> + <button id="delete" class="secondary" tabindex="0"></button> + <span class="right"> + <button id="cancel" class="secondary" tabindex="0"></button> + <button type="submit" id="done" class="primary" disabled="true" + tabindex="0"></button> + </span> + </div> + </form> </dialog> </body> </html>
diff --git a/chrome/browser/resources/local_ntp/custom_links_edit.js b/chrome/browser/resources/local_ntp/custom_links_edit.js index 3fa26f2..83d4fc7 100644 --- a/chrome/browser/resources/local_ntp/custom_links_edit.js +++ b/chrome/browser/resources/local_ntp/custom_links_edit.js
@@ -4,27 +4,6 @@ /** - * Enum for ids. - * @enum {string} - * @const - */ -const IDS = { - EDIT_DIALOG: 'edit-link-dialog', // Edit dialog. - CANCEL: 'cancel', // Cancel button. - DELETE: 'delete', // Delete button. - DONE: 'done', // Done button. -}; - - -/** - * The origin of this request, i.e. 'https://www.google.TLD' for the remote NTP, - * or 'chrome-search://local-ntp' for the local NTP. - * @const {string} - */ -let DOMAIN_ORIGIN = '{{ORIGIN}}'; - - -/** * Alias for document.getElementById. * @param {string} id The ID of the element to find. * @return {HTMLElement} The found element or null if not found. @@ -36,12 +15,175 @@ /** + * Enum for ids. + * @enum {string} + * @const + */ +const IDS = { + CANCEL: 'cancel', // Cancel button. + DELETE: 'delete', // Delete button. + DIALOG_TITLE: 'dialog-title', // Dialog title. + DONE: 'done', // Done button. + EDIT_DIALOG: 'edit-link-dialog', // Dialog element. + FORM: 'edit-form', // The edit link form. + INVALID_URL: 'invalid-url', // Invalid URL error message. + TITLE_FIELD: 'title-field', // Title input field. + TITLE_FIELD_NAME: 'title-field-name', // Title input field name. + URL_FIELD: 'url-field', // URL input field. + URL_FIELD_CONTAINER: 'url', // URL input field container. + URL_FIELD_NAME: 'url-field-name', // URL input field name. +}; + + +/** + * The origin of this request, i.e. 'https://www.google.TLD' for the remote NTP, + * or 'chrome-search://local-ntp' for the local NTP. + * @const {string} + */ +const DOMAIN_ORIGIN = '{{ORIGIN}}'; + + +/** + * List of parameters passed by query args. + * @type {Object} + */ +let queryArgs = {}; + + +/** + * The prepopulated data for the form. Includes title, url, and rid. + * @type {Object} + */ +let prepopulatedLink = { + rid: -1, + title: '', + url: '', +}; + + +/** + * True if the provided url is valid. + * @type {string} + */ +function isValidURL(url) { + let a = document.createElement('a'); + a.href = url; + // Invalid URLs will not match the current host. + let isValid = a.host && a.host != window.location.host; + return isValid; +} + + +/** + * Handler for the 'linkData' message from the host page. Pre-populates the url + * and title fields with link's data obtained using the rid. Called if we are + * editing an existing link. + * @param {number} rid Restricted id of the link to be edited. + */ +function prepopulateFields(rid) { + if (!isFinite(rid)) + return; + + // Grab the link data from the embeddedSearch API. + let data = chrome.embeddedSearch.newTabPage.getMostVisitedItemData(rid); + if (!data) + return; + prepopulatedLink.rid = rid; + $(IDS.TITLE_FIELD).value = prepopulatedLink.title = data.title; + $(IDS.URL_FIELD).value = prepopulatedLink.url = data.url; +} + + +/** + * Disables the "Done" button until the URL field is modified. + */ +function disableSubmitUntilTextInput() { + $(IDS.DONE).disabled = true; + let reenable = (event) => { + $(IDS.DONE).disabled = false; + $(IDS.URL_FIELD).removeEventListener('input', reenable); + }; + $(IDS.URL_FIELD).addEventListener('input', reenable); +} + + +/** + * Shows the invalid URL error message until the URL field is modified. + */ +function showInvalidUrlUntilTextInput() { + $(IDS.URL_FIELD_CONTAINER).classList.add('invalid'); + let reenable = (event) => { + $(IDS.URL_FIELD_CONTAINER).classList.remove('invalid'); + $(IDS.URL_FIELD).removeEventListener('input', reenable); + }; + $(IDS.URL_FIELD).addEventListener('input', reenable); +} + + +/** * Send a message to close the edit dialog. Called when the edit flow has been - * completed. + * completed. If the fields were unchanged, does not update the link data. * @param {!Event} event The click event. */ +function finishEditLink(event) { + // Show error message for invalid urls. + if (!isValidURL($(IDS.URL_FIELD).value)) { + showInvalidUrlUntilTextInput(); + disableSubmitUntilTextInput(); + return; + } + + // Do not update link if fields were unchanged. + if ($(IDS.TITLE_FIELD).value != prepopulatedLink.title || + $(IDS.URL_FIELD).value != prepopulatedLink.url) { + chrome.embeddedSearch.newTabPage.updateCustomLink( + prepopulatedLink.rid, $(IDS.URL_FIELD).value, $(IDS.TITLE_FIELD).value); + } + closeDialog(); +} + + +/** + * Call the EmbeddedSearchAPI to delete the link. Closes the dialog. + * @param {!Event} event The click event. + */ +function deleteLink(event) { + chrome.embeddedSearch.newTabPage.deleteMostVisitedItem(prepopulatedLink.rid); + closeDialog(); +} + + +/** + * Send a message to close the edit dialog, clears the url and title fields, and + * resets the button statuses. Called when the edit flow has been completed. + */ function closeDialog(event) { window.parent.postMessage({cmd: 'closeDialog'}, DOMAIN_ORIGIN); + $(IDS.FORM).reset(); + $(IDS.URL_FIELD_CONTAINER).classList.remove('invalid'); + $(IDS.DELETE).disabled = false; + $(IDS.DONE).disabled = false; + prepopulatedLink.rid = -1; + prepopulatedLink.title = ''; + prepopulatedLink.url = ''; +} + + +/** + * Event handler for messages from the host page. + * @param {Event} event Event received. + */ +function handlePostMessage(event) { + let cmd = event.data.cmd; + let args = event.data; + if (cmd === 'linkData') { + if (args.tid) { // We are editing a link, prepopulate the link data. + prepopulateFields(args.tid); + } else { // We are adding a link, disable the delete button. + $(IDS.DELETE).disabled = true; + disableSubmitUntilTextInput(); + } + } } @@ -49,10 +191,59 @@ * Does some initialization and shows the dialog window. */ function init() { - $(IDS.EDIT_DIALOG).showModal(); - $(IDS.DELETE).addEventListener('click', closeDialog); + // Parse query arguments. + let query = window.location.search.substring(1).split('&'); + queryArgs = {}; + for (let i = 0; i < query.length; ++i) { + let val = query[i].split('='); + if (val[0] == '') + continue; + queryArgs[decodeURIComponent(val[0])] = decodeURIComponent(val[1]); + } + + // Enable RTL. + // TODO(851293): Add RTL formatting. + if (queryArgs['rtl'] == '1') { + let html = document.querySelector('html'); + html.dir = 'rtl'; + } + + // Populate text content. + $(IDS.DIALOG_TITLE).textContent = queryArgs['title']; + $(IDS.TITLE_FIELD_NAME).textContent = queryArgs['nameField']; + $(IDS.TITLE_FIELD_NAME).name = queryArgs['nameField']; + $(IDS.URL_FIELD_NAME).textContent = queryArgs['urlField']; + $(IDS.URL_FIELD_NAME).name = queryArgs['urlField']; + $(IDS.DELETE).textContent = queryArgs['linkRemove']; + $(IDS.CANCEL).textContent = queryArgs['linkCancel']; + $(IDS.DONE).textContent = queryArgs['linkDone']; + $(IDS.INVALID_URL).textContent = queryArgs['invalidUrl']; + + // Set up event listeners. + $(IDS.DELETE).addEventListener('click', deleteLink); $(IDS.CANCEL).addEventListener('click', closeDialog); - $(IDS.DONE).addEventListener('click', closeDialog); + $(IDS.FORM).addEventListener('submit', (event) => { + // Prevent the form from submitting and modifying the URL. + event.preventDefault(); + finishEditLink(event); + }); + + // Change input field name to blue on input field focus. + let changeColor = (fieldTitle) => { + $(fieldTitle).classList.toggle('focused'); + }; + $(IDS.TITLE_FIELD) + .addEventListener('focusin', () => changeColor(IDS.TITLE_FIELD_NAME)); + $(IDS.TITLE_FIELD) + .addEventListener('blur', () => changeColor(IDS.TITLE_FIELD_NAME)); + $(IDS.URL_FIELD) + .addEventListener('focusin', () => changeColor(IDS.URL_FIELD_NAME)); + $(IDS.URL_FIELD) + .addEventListener('blur', () => changeColor(IDS.URL_FIELD_NAME)); + + $(IDS.EDIT_DIALOG).showModal(); + + window.addEventListener('message', handlePostMessage); }
diff --git a/chrome/browser/resources/local_ntp/icons/edit_menu.svg b/chrome/browser/resources/local_ntp/icons/edit_menu.svg new file mode 100644 index 0000000..a0feae1 --- /dev/null +++ b/chrome/browser/resources/local_ntp/icons/edit_menu.svg
@@ -0,0 +1,7 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"> + <g fill="none" fill-rule="evenodd"> + <circle cx="6" cy="3" r="1" fill="#000"/> + <circle cx="6" cy="6" r="1" fill="#000"/> + <circle cx="6" cy="9" r="1" fill="#000"/> + </g> +</svg>
diff --git a/chrome/browser/resources/local_ntp/icons/link_gray.svg b/chrome/browser/resources/local_ntp/icons/link_gray.svg new file mode 100644 index 0000000..0072bceb --- /dev/null +++ b/chrome/browser/resources/local_ntp/icons/link_gray.svg
@@ -0,0 +1,6 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"> + <g fill="none" fill-rule="evenodd"> + <polygon points="0 0 16 0 16 16 0 16"/> + <path fill="#5F6368" fill-rule="nonzero" d="M1.52,8 C1.52,6.632 2.632,5.52 4,5.52 L7.2,5.52 L7.2,4 L4,4 C1.792,4 0,5.792 0,8 C0,10.208 1.792,12 4,12 L7.2,12 L7.2,10.48 L4,10.48 C2.632,10.48 1.52,9.368 1.52,8 Z M4.8,8.8 L11.2,8.8 L11.2,7.2 L4.8,7.2 L4.8,8.8 Z M12,4 L8.8,4 L8.8,5.52 L12,5.52 C13.368,5.52 14.48,6.632 14.48,8 C14.48,9.368 13.368,10.48 12,10.48 L8.8,10.48 L8.8,12 L12,12 C14.208,12 16,10.208 16,8 C16,5.792 14.208,4 12,4 Z"/> + </g> +</svg>
diff --git a/chrome/browser/resources/local_ntp/local_ntp.html b/chrome/browser/resources/local_ntp/local_ntp.html index 2bb4148..ff88204 100644 --- a/chrome/browser/resources/local_ntp/local_ntp.html +++ b/chrome/browser/resources/local_ntp/local_ntp.html
@@ -103,6 +103,11 @@ <div class="bg-option-img"></div> <div id="edit-bg-upload-image-text" class="bg-option-text"></div> </div> + <div id="edit-bg-divider"></div> + <div id="custom-link-restore-default" class="bg-option" tabindex="0"> + <div class="bg-option-img"></div> + <div id="custom-link-restore-default-text" class="bg-option-text"></div> + </div> <div id="edit-bg-restore-default" class="bg-option" tabindex="0"> <div class="bg-option-img"></div> <div id="edit-bg-restore-default-text" class="bg-option-text"></div> @@ -160,8 +165,5 @@ </dialog> <div id="one-google-end-of-body"></div> - - <iframe id="custom-links-edit" name="custom-links-edit" - src="chrome-search://most-visited/edit.html"></iframe> </body> </html>
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js index 6a9fe79f..e1acb52 100644 --- a/chrome/browser/resources/local_ntp/local_ntp.js +++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -696,6 +696,8 @@ document.body.style.setProperty('--logo-iframe-width', width); document.body.style.setProperty('--logo-iframe-resize-duration', duration); } else if (cmd === 'startEditLink') { + $(IDS.CUSTOM_LINKS_EDIT_IFRAME) + .contentWindow.postMessage({cmd: 'linkData', tid: args.tid}, '*'); setEditCustomLinkDialogVisibility(true); } else if (cmd === 'closeDialog') { setEditCustomLinkDialogVisibility(false); @@ -977,6 +979,14 @@ if (configData.isCustomLinksEnabled) { args.push('enableCustomLinks=1'); + args.push( + 'addLink=' + encodeURIComponent(configData.translatedStrings.addLink)); + args.push( + 'addLinkTooltip=' + + encodeURIComponent(configData.translatedStrings.addLinkTooltip)); + args.push( + 'editLinkTooltip=' + + encodeURIComponent(configData.translatedStrings.editLinkTooltip)); } // Create the most visited iframe. @@ -992,7 +1002,43 @@ sendThemeInfoToMostVisitedIframe(); }; - // TODO(851293): Add translated title attribute to edit custom link iframe. + if (configData.isCustomLinksEnabled) { + // Collect arguments for the edit custom link iframe. + let clArgs = []; + + if (searchboxApiHandle.rtl) + clArgs.push('rtl=1'); + + clArgs.push( + 'title=' + + encodeURIComponent(configData.translatedStrings.editLinkTitle)); + clArgs.push( + 'nameField=' + + encodeURIComponent(configData.translatedStrings.nameField)); + clArgs.push( + 'urlField=' + + encodeURIComponent(configData.translatedStrings.urlField)); + clArgs.push( + 'linkRemove=' + + encodeURIComponent(configData.translatedStrings.linkRemove)); + clArgs.push( + 'linkCancel=' + + encodeURIComponent(configData.translatedStrings.linkCancel)); + clArgs.push( + 'linkDone=' + + encodeURIComponent(configData.translatedStrings.linkDone)); + clArgs.push( + 'invalidUrl=' + + encodeURIComponent(configData.translatedStrings.invalidUrl)); + + // Create the edit custom link iframe. + let clIframe = document.createElement('iframe'); + clIframe.id = IDS.CUSTOM_LINKS_EDIT_IFRAME; + clIframe.name = IDS.CUSTOM_LINKS_EDIT_IFRAME; + clIframe.title = configData.translatedStrings.editLinkTitle; + clIframe.src = 'chrome-search://most-visited/edit.html?' + clArgs.join('&'); + document.body.appendChild(clIframe); + } window.addEventListener('message', handlePostMessage);
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.css b/chrome/browser/resources/local_ntp/most_visited_single.css index c35439495..a0f0c25f 100644 --- a/chrome/browser/resources/local_ntp/most_visited_single.css +++ b/chrome/browser/resources/local_ntp/most_visited_single.css
@@ -384,7 +384,8 @@ padding: var(--md-tile-padding-vertical) var(--md-tile-padding-horizontal); position: relative; transition-property: - background, border-color, box-shadow, opacity, text-shadow; + background, background-color, border-color, box-shadow, opacity, + text-shadow; width: var(--md-tile-width); } @@ -394,7 +395,6 @@ .md-tile:hover { background-color: rgba(33, 32, 36, 0.06); - transition-duration: 0ms; } body.dark-theme .md-tile:hover { @@ -403,7 +403,7 @@ .md-tile:hover > .md-menu { opacity: 1; - transition-duration: 0ms; + transition-delay: 500ms; } .md-tile:active, @@ -411,6 +411,7 @@ background-color: white; box-shadow: 0 1px 3px 0 rgba(60, 64, 67, 0.3), 0 4px 8px 3px rgba(60, 64, 67, 0.15); + transition-delay: 500ms; transition-duration: 200ms; z-index: 10; } @@ -421,6 +422,7 @@ body.dark-theme .md-tile:active .md-menu::after { background-color: rgba(33, 32, 36, 0.71); + transition-delay: 500ms; } body.background-image .md-tile:active .md-title { @@ -558,6 +560,11 @@ width: var(--md-menu-size); } +.md-edit-menu::after { + --mask-width: var(--md-menu-size); + -webkit-mask-image: url(chrome-search://most-visited/edit_menu.svg); +} + body.dark-theme .md-menu::after { background-color: white; }
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.js b/chrome/browser/resources/local_ntp/most_visited_single.js index c258fc5..08fa6f0 100644 --- a/chrome/browser/resources/local_ntp/most_visited_single.js +++ b/chrome/browser/resources/local_ntp/most_visited_single.js
@@ -26,6 +26,7 @@ MD_ADD_ICON: 'md-add-icon', MD_ADD_BACKGROUND: 'md-add-background', MD_MENU: 'md-menu', + MD_EDIT_MENU: 'md-edit-menu', MD_TILE: 'md-tile', MD_TILE_INNER: 'md-tile-inner', MD_TITLE: 'md-title', @@ -382,6 +383,16 @@ /** + * Starts edit custom link flow. Tells host page to show the edit custom link + * dialog and pre-populate it with data obtained using the link's id. + * @param {?number} tid Restricted id of the tile we want to edit. + */ +function editCustomLink(tid) { + window.parent.postMessage({cmd: 'startEditLink', tid: tid}, DOMAIN_ORIGIN); +} + + +/** * Returns whether the given URL has a known, safe scheme. * @param {string} url URL to check. */ @@ -694,13 +705,23 @@ if (!data.isAddButton) { let mdMenu = document.createElement('button'); mdMenu.className = CLASSES.MD_MENU; - mdMenu.title = queryArgs['removeTooltip'] || ''; - mdMenu.addEventListener('click', function(ev) { - removeAllOldTiles(); - blacklistTile(mdTile); - ev.preventDefault(); - ev.stopPropagation(); - }); + if (isCustomLinksEnabled) { + mdMenu.classList.add(CLASSES.MD_EDIT_MENU); + mdMenu.title = queryArgs['editLinkTooltip'] || ''; + mdMenu.addEventListener('click', function(ev) { + editCustomLink(data.tid); + ev.preventDefault(); + ev.stopPropagation(); + }); + } else { + mdMenu.title = queryArgs['removeTooltip'] || ''; + mdMenu.addEventListener('click', function(ev) { + removeAllOldTiles(); + blacklistTile(mdTile); + ev.preventDefault(); + ev.stopPropagation(); + }); + } // Don't allow the event to bubble out to the containing tile, as that would // trigger navigation to the tile URL. mdMenu.addEventListener('keydown', function(event) {
diff --git a/chrome/browser/resources/settings/people_page/sync_page.html b/chrome/browser/resources/settings/people_page/sync_page.html index 6e40dcc1..73a16e10 100644 --- a/chrome/browser/resources/settings/people_page/sync_page.html +++ b/chrome/browser/resources/settings/people_page/sync_page.html
@@ -130,6 +130,7 @@ <settings-toggle-button id="unifiedConsentToggle" class="first" pref="{{prefs.unified_consent_given}}" label="$i18n{syncUnifiedConsentToggleTitle}" + on-settings-boolean-control-change="onUnifiedConsentToggleChange_" hidden="[[!shouldShowUnifiedConsentToggle_(unifiedConsentEnabled, syncStatus.disabled, syncStatus.signedIn)]]"> </settings-toggle-button>
diff --git a/chrome/browser/resources/settings/people_page/sync_page.js b/chrome/browser/resources/settings/people_page/sync_page.js index 20d8a86..348a879 100644 --- a/chrome/browser/resources/settings/people_page/sync_page.js +++ b/chrome/browser/resources/settings/people_page/sync_page.js
@@ -282,6 +282,17 @@ }, /** + * Handles the change event for the unfied consent toggle. + * @private + */ + onUnifiedConsentToggleChange_: function() { + if(!this.$$('#unifiedConsentToggle').checked){ + this.syncSectionOpened_ = true; + this.personalizeSectionOpened_ = true; + } + }, + + /** * Handler for when the sync preferences are updated. * @private */
diff --git a/chrome/browser/resources/signin/dice_sync_confirmation/BUILD.gn b/chrome/browser/resources/signin/dice_sync_confirmation/BUILD.gn index 12f0d83a..ccb77ab 100644 --- a/chrome/browser/resources/signin/dice_sync_confirmation/BUILD.gn +++ b/chrome/browser/resources/signin/dice_sync_confirmation/BUILD.gn
@@ -31,5 +31,8 @@ deps = [ "//ui/webui/resources/js:cr", ] - externs_list = [ "$externs_path/chrome_send.js" ] + externs_list = [ + "$externs_path/chrome_send.js", + "$externs_path/metrics_private.js", + ] }
diff --git a/chrome/browser/resources/signin/dice_sync_confirmation/sync_confirmation_app.js b/chrome/browser/resources/signin/dice_sync_confirmation/sync_confirmation_app.js index f083c37..9ed4b8e 100644 --- a/chrome/browser/resources/signin/dice_sync_confirmation/sync_confirmation_app.js +++ b/chrome/browser/resources/signin/dice_sync_confirmation/sync_confirmation_app.js
@@ -54,18 +54,20 @@ /** @private */ onConfirm_: function(e) { this.syncConfirmationBrowserProxy_.confirm( - this.getConsentDescription_(), this.getConsentConfirmation_(e.path)); + this.getConsentDescription_(), this.getConsentConfirmation_(e.path), + this.isConsentBump_, this.showMoreOptions_); }, /** @private */ onUndo_: function() { - this.syncConfirmationBrowserProxy_.undo(); + this.syncConfirmationBrowserProxy_.undo(this.isConsentBump_); }, /** @private */ onGoToSettings_: function(e) { this.syncConfirmationBrowserProxy_.goToSettings( - this.getConsentDescription_(), this.getConsentConfirmation_(e.path)); + this.getConsentDescription_(), this.getConsentConfirmation_(e.path), + this.isConsentBump_); }, /** @private */
diff --git a/chrome/browser/resources/signin/dice_sync_confirmation/sync_confirmation_browser_proxy.js b/chrome/browser/resources/signin/dice_sync_confirmation/sync_confirmation_browser_proxy.js index f6d3b10..ea5b733 100644 --- a/chrome/browser/resources/signin/dice_sync_confirmation/sync_confirmation_browser_proxy.js +++ b/chrome/browser/resources/signin/dice_sync_confirmation/sync_confirmation_browser_proxy.js
@@ -9,6 +9,31 @@ cr.define('sync.confirmation', function() { + /** + * ConsentBumpAction enum. + * These values are persisted to logs and should not be renumbered or re-used. + * See tools/metrics/histograms/enums.xml. + * @enum {number} + */ + const ConsentBumpAction = { + DEFAULT_OPT_IN: 0, + MORE_OPTIONS_OPT_IN: 1, + MORE_OPTIONS_REVIEW_SETTINGS: 2, + MORE_OPTIONS_MAKE_NO_CHANGES: 3, + }; + + /** + * The number of enum values in ConsentBumpAction. This should + * be kept in sync with the enum count in tools/metrics/histograms/enums.xml. + * @type {number} + */ + const CONSENT_BUMP_ACTION_COUNT = Object.keys(ConsentBumpAction).length; + + /** + * The metrics name corresponding to ConsentBumpAction. + */ + const CONSENT_BUMP_ACTION_METRIC_NAME = 'UnifiedConsent.ConsentBump.Action'; + /** @interface */ class SyncConfirmationBrowserProxy { /** @@ -17,11 +42,18 @@ * with in the UI. * @param {string} confirmation Text of the element that the user * clicked on. + * @param {boolean} isConsentBump Boolean indicating whether the + * confirmation dialog was a consent bump. + * @param {boolean} moreOptionsPage Boolean indicating whether the user + * selected confirm from the moreOptions page in the consent bump. */ - confirm(description, confirmation) {} + confirm(description, confirmation, isConsentBump, moreOptionsPage) {} - /** Called when the user undoes the Sync confirmation. */ - undo() {} + /** Called when the user undoes the Sync confirmation. + * @param {boolean} isConsentBump Boolean indicating whether the + * confirmation dialog was a consent bump. + */ + undo(isConsentBump) {} /** * Called when the user clicks on the Settings link in @@ -30,8 +62,10 @@ * with in the UI. * @param {string} confirmation Text of the element that the user * clicked on. + * @param {boolean} isConsentBump Boolean indicating whether the + * confirmation dialog was a consent bump. */ - goToSettings(description, confirmation) {} + goToSettings(description, confirmation, isConsentBump) {} /** @param {!Array<number>} height */ initializedWithSize(height) {} @@ -40,17 +74,30 @@ /** @implements {sync.confirmation.SyncConfirmationBrowserProxy} */ class SyncConfirmationBrowserProxyImpl { /** @override */ - confirm(description, confirmation) { + confirm(description, confirmation, isConsentBump, moreOptionsPage) { + if (isConsentBump) { + this.recordConsentBumpAction_( + moreOptionsPage ? ConsentBumpAction.MORE_OPTIONS_OPT_IN : + ConsentBumpAction.DEFAULT_OPT_IN); + } chrome.send('confirm', [description, confirmation]); } /** @override */ - undo() { + undo(isConsentBump) { + if (isConsentBump) { + this.recordConsentBumpAction_( + ConsentBumpAction.MORE_OPTIONS_MAKE_NO_CHANGES); + } chrome.send('undo'); } /** @override */ - goToSettings(description, confirmation) { + goToSettings(description, confirmation, isConsentBump) { + if (isConsentBump) { + this.recordConsentBumpAction_( + ConsentBumpAction.MORE_OPTIONS_REVIEW_SETTINGS); + } chrome.send('goToSettings', [description, confirmation]); } @@ -58,6 +105,12 @@ initializedWithSize(height) { chrome.send('initializedWithSize', height); } + + /** @private */ + recordConsentBumpAction_(action) { + chrome.metricsPrivate.recordEnumerationValue( + CONSENT_BUMP_ACTION_METRIC_NAME, action, CONSENT_BUMP_ACTION_COUNT); + } } cr.addSingletonGetter(SyncConfirmationBrowserProxyImpl); @@ -66,4 +119,4 @@ SyncConfirmationBrowserProxy: SyncConfirmationBrowserProxy, SyncConfirmationBrowserProxyImpl: SyncConfirmationBrowserProxyImpl, }; -}); \ No newline at end of file +});
diff --git a/chrome/browser/search/instant_service.cc b/chrome/browser/search/instant_service.cc index f37ccfd..f56d6dd3 100644 --- a/chrome/browser/search/instant_service.cc +++ b/chrome/browser/search/instant_service.cc
@@ -192,16 +192,16 @@ void InstantService::AddCustomLink(const GURL& url, const std::string& title) { if (most_visited_sites_) { - // Initialize custom links if they have not been initialized yet. - MaybeInitializeCustomLinks(); + // Initializes custom links if they have not been initialized yet. + most_visited_sites_->InitializeCustomLinks(); most_visited_sites_->AddCustomLink(url, base::UTF8ToUTF16(title)); } } void InstantService::DeleteCustomLink(const GURL& url) { if (most_visited_sites_) { - // Initialize custom links if they have not been initialized yet. - MaybeInitializeCustomLinks(); + // Initializes custom links if they have not been initialized yet. + most_visited_sites_->InitializeCustomLinks(); most_visited_sites_->DeleteCustomLink(url); } } @@ -533,7 +533,9 @@ background_info->FindKey(kNtpCustomBackgroundAttributionActionURL) ->GetString()); - if (action_url.SchemeIsCryptographic()) { + if (!action_url.SchemeIsCryptographic()) { + theme_info_->custom_background_attribution_action_url = GURL(); + } else { theme_info_->custom_background_attribution_action_url = action_url; } } @@ -551,13 +553,6 @@ theme_info_->custom_background_attribution_action_url = GURL(); } -void InstantService::MaybeInitializeCustomLinks() { - DCHECK(most_visited_sites_); - if (!most_visited_sites_->IsCustomLinksInitialized()) { - most_visited_sites_->InitializeCustomLinks(); - } -} - // static void InstantService::RegisterProfilePrefs(PrefRegistrySimple* registry) { registry->RegisterDictionaryPref(prefs::kNtpCustomBackgroundDict,
diff --git a/chrome/browser/search/instant_service.h b/chrome/browser/search/instant_service.h index 8a39767..24a6f3f 100644 --- a/chrome/browser/search/instant_service.h +++ b/chrome/browser/search/instant_service.h
@@ -157,10 +157,6 @@ // chrome-search://local-ntp/background.jpg void SetBackgroundToLocalResource(); - // Will initialize custom links from the current Most Visited sites if custom - // links have not been initialized yet. Otherwise, does nothing. - void MaybeInitializeCustomLinks(); - Profile* const profile_; // The process ids associated with Instant processes.
diff --git a/chrome/browser/search/instant_service_unittest.cc b/chrome/browser/search/instant_service_unittest.cc index 89e8d24..87cb417 100644 --- a/chrome/browser/search/instant_service_unittest.cc +++ b/chrome/browser/search/instant_service_unittest.cc
@@ -124,3 +124,38 @@ EXPECT_EQ(false, file_exists); } + +TEST_F(InstantServiceTest, CustomBackgroundAttributionActionUrlReset) { + const GURL kUrl("https://www.foo.com"); + const std::string kAttributionLine1 = "foo"; + const std::string kAttributionLine2 = "bar"; + const GURL kHttpsActionUrl("https://www.bar.com"); + const GURL kHttpActionUrl("http://www.bar.com"); + + SetUserSelectedDefaultSearchProvider("{google:baseURL}"); + instant_service_->SetCustomBackgroundURLWithAttributions( + kUrl, kAttributionLine1, kAttributionLine2, kHttpsActionUrl); + + ThemeBackgroundInfo* theme_info = instant_service_->GetThemeInfoForTesting(); + EXPECT_EQ(kHttpsActionUrl, + theme_info->custom_background_attribution_action_url); + + instant_service_->SetCustomBackgroundURLWithAttributions( + kUrl, kAttributionLine1, kAttributionLine2, kHttpActionUrl); + + theme_info = instant_service_->GetThemeInfoForTesting(); + EXPECT_EQ(GURL(), theme_info->custom_background_attribution_action_url); + + instant_service_->SetCustomBackgroundURLWithAttributions( + kUrl, kAttributionLine1, kAttributionLine2, kHttpsActionUrl); + + theme_info = instant_service_->GetThemeInfoForTesting(); + EXPECT_EQ(kHttpsActionUrl, + theme_info->custom_background_attribution_action_url); + + instant_service_->SetCustomBackgroundURLWithAttributions( + kUrl, kAttributionLine1, kAttributionLine2, GURL()); + + theme_info = instant_service_->GetThemeInfoForTesting(); + EXPECT_EQ(GURL(), theme_info->custom_background_attribution_action_url); +}
diff --git a/chrome/browser/search/local_ntp_source.cc b/chrome/browser/search/local_ntp_source.cc index 02569ce..021ee14 100644 --- a/chrome/browser/search/local_ntp_source.cc +++ b/chrome/browser/search/local_ntp_source.cc
@@ -153,6 +153,8 @@ AddString(translated_strings.get(), "searchboxPlaceholder", features::IsMDUIEnabled() ? IDS_GOOGLE_SEARCH_BOX_EMPTY_HINT_MD : IDS_GOOGLE_SEARCH_BOX_EMPTY_HINT); + + // Custom Backgrounds AddString(translated_strings.get(), "customizeBackground", IDS_NTP_CUSTOM_BG_CUSTOMIZE_BACKGROUND); AddString(translated_strings.get(), "connectGooglePhotos", @@ -187,6 +189,33 @@ AddString(translated_strings.get(), "photoLabel", IDS_NTP_CUSTOM_BG_GOOGLE_PHOTO_LABEL); + // Custom Links + AddString(translated_strings.get(), "addLink", + IDS_NTP_CUSTOM_LINKS_ADD_SHORTCUT_TITLE); + AddString(translated_strings.get(), "addLinkTooltip", + IDS_NTP_CUSTOM_LINKS_ADD_SHORTCUT_TOOLTIP); + AddString(translated_strings.get(), "editLinkTooltip", + IDS_NTP_CUSTOM_LINKS_EDIT_SHORTCUT_TOOLTIP); + AddString(translated_strings.get(), "editLinkTitle", + IDS_NTP_CUSTOM_LINKS_EDIT_SHORTCUT); + AddString(translated_strings.get(), "nameField", IDS_NTP_CUSTOM_LINKS_NAME); + AddString(translated_strings.get(), "urlField", IDS_NTP_CUSTOM_LINKS_URL); + AddString(translated_strings.get(), "linkRemove", + IDS_NTP_CUSTOM_LINKS_REMOVE); + AddString(translated_strings.get(), "linkCancel", + IDS_NTP_CUSTOM_LINKS_CANCEL); + AddString(translated_strings.get(), "linkDone", IDS_NTP_CUSTOM_LINKS_DONE); + AddString(translated_strings.get(), "invalidUrl", + IDS_NTP_CUSTOM_LINKS_INVALID_URL); + AddString(translated_strings.get(), "linkRemovedMsg", + IDS_NTP_CONFIRM_MSG_SHORTCUT_REMOVED); + AddString(translated_strings.get(), "linkEditedMsg", + IDS_NTP_CONFIRM_MSG_SHORTCUT_EDITED); + AddString(translated_strings.get(), "linkAddedMsg", + IDS_NTP_CONFIRM_MSG_SHORTCUT_ADDED); + AddString(translated_strings.get(), "restoreDefaultLinks", + IDS_NTP_CONFIRM_MSG_RESTORE_DEFAULTS); + // Voice Search AddString(translated_strings.get(), "audioError", IDS_NEW_TAB_VOICE_AUDIO_ERROR);
diff --git a/chrome/browser/search/most_visited_iframe_source.cc b/chrome/browser/search/most_visited_iframe_source.cc index 7abd3681d..3f51d9c1 100644 --- a/chrome/browser/search/most_visited_iframe_source.cc +++ b/chrome/browser/search/most_visited_iframe_source.cc
@@ -30,14 +30,13 @@ const char kUtilJSPath[] = "/util.js"; const char kCommonCSSPath[] = "/common.css"; -// Add custom link button icon. -const char kAddSvgPath[] = "/add_link.svg"; - -// Edit custom links dialog iframe, used by the local NTP and the Google remote -// NTP. +// Edit custom links dialog iframe and resources, used by the local NTP and the +// Google remote NTP. const char kEditHTMLPath[] = "/edit.html"; const char kEditCSSPath[] = "/edit.css"; const char kEditJSPath[] = "/edit.js"; +const char kAddSvgPath[] = "/add_link.svg"; +const char kEditMenuSvgPath[] = "/edit_menu.svg"; } // namespace @@ -104,6 +103,8 @@ SendJSWithOrigin(IDR_CUSTOM_LINKS_EDIT_JS, wc_getter, callback); } else if (path == kAddSvgPath) { SendResource(IDR_CUSTOM_LINKS_ADD_SVG, callback); + } else if (path == kEditMenuSvgPath) { + SendResource(IDR_CUSTOM_LINKS_EDIT_MENU_SVG, callback); } else { callback.Run(nullptr); } @@ -116,5 +117,6 @@ path == kThumbnailHTMLPath || path == kThumbnailCSSPath || path == kThumbnailJSPath || path == kUtilJSPath || path == kCommonCSSPath || path == kEditHTMLPath || - path == kEditCSSPath || path == kEditJSPath || path == kAddSvgPath; + path == kEditCSSPath || path == kEditJSPath || path == kAddSvgPath || + path == kEditMenuSvgPath; }
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index b80097e..bd75851 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -80,8 +80,6 @@ "cocoa/background_gradient_view.mm", "cocoa/base_bubble_controller.h", "cocoa/base_bubble_controller.mm", - "cocoa/bookmarks/bookmark_all_tabs_controller.h", - "cocoa/bookmarks/bookmark_all_tabs_controller.mm", "cocoa/bookmarks/bookmark_bar_bridge.h", "cocoa/bookmarks/bookmark_bar_bridge.mm", "cocoa/bookmarks/bookmark_bar_constants.h", @@ -102,8 +100,6 @@ "cocoa/bookmarks/bookmark_bar_toolbar_view.mm", "cocoa/bookmarks/bookmark_bar_view_cocoa.h", "cocoa/bookmarks/bookmark_bar_view_cocoa.mm", - "cocoa/bookmarks/bookmark_bubble_controller.h", - "cocoa/bookmarks/bookmark_bubble_controller.mm", "cocoa/bookmarks/bookmark_bubble_observer_cocoa.h", "cocoa/bookmarks/bookmark_bubble_observer_cocoa.mm", "cocoa/bookmarks/bookmark_bar_util.h", @@ -115,16 +111,10 @@ "cocoa/bookmarks/bookmark_context_menu_cocoa_controller.h", "cocoa/bookmarks/bookmark_context_menu_cocoa_controller.mm", "cocoa/bookmarks/bookmark_drag_drop_cocoa.mm", - "cocoa/bookmarks/bookmark_editor_base_controller.h", - "cocoa/bookmarks/bookmark_editor_base_controller.mm", - "cocoa/bookmarks/bookmark_editor_controller.h", - "cocoa/bookmarks/bookmark_editor_controller.mm", "cocoa/bookmarks/bookmark_folder_target.h", "cocoa/bookmarks/bookmark_folder_target.mm", "cocoa/bookmarks/bookmark_model_observer_for_cocoa.h", "cocoa/bookmarks/bookmark_model_observer_for_cocoa.mm", - "cocoa/bookmarks/bookmark_name_folder_controller.h", - "cocoa/bookmarks/bookmark_name_folder_controller.mm", "cocoa/bookmarks/bookmark_tree_browser_cell.h", "cocoa/bookmarks/bookmark_tree_browser_cell.mm", "cocoa/browser/exclusive_access_controller_views.h", @@ -207,8 +197,6 @@ "cocoa/dev_tools_controller.mm", "cocoa/device_chooser_content_view_cocoa.h", "cocoa/device_chooser_content_view_cocoa.mm", - "cocoa/dialog_text_field_editor.h", - "cocoa/dialog_text_field_editor.mm", "cocoa/download/background_theme.h", "cocoa/download/background_theme.mm", "cocoa/download/download_danger_prompt_impl.cc", @@ -862,14 +850,6 @@ allow_circular_includes_from = [] defines = [] - if (is_win) { - # For version_ui.cc: - if (use_lld) { - defines += [ "CHROMIUM_LINKER_NAME=\"lld-link\"" ] - } else { - defines += [ "CHROMIUM_LINKER_NAME=\"link.exe\"" ] - } - } libs = [] configs += [ @@ -2574,14 +2554,6 @@ # are obsolete before mac_views_browser will ever ship, so they aren't # linked in at all. sources -= [ - "cocoa/bookmarks/bookmark_all_tabs_controller.h", - "cocoa/bookmarks/bookmark_all_tabs_controller.mm", - "cocoa/bookmarks/bookmark_bubble_controller.h", - "cocoa/bookmarks/bookmark_bubble_controller.mm", - "cocoa/bookmarks/bookmark_editor_base_controller.h", - "cocoa/bookmarks/bookmark_editor_base_controller.mm", - "cocoa/bookmarks/bookmark_editor_controller.h", - "cocoa/bookmarks/bookmark_editor_controller.mm", "cocoa/constrained_web_dialog_delegate_mac.mm", "cocoa/content_settings/blocked_plugin_bubble_controller.h", "cocoa/content_settings/blocked_plugin_bubble_controller.mm",
diff --git a/chrome/browser/ui/app_list/crostini/crostini_app_model_builder_unittest.cc b/chrome/browser/ui/app_list/crostini/crostini_app_model_builder_unittest.cc index 63a2d270..378ed8e65 100644 --- a/chrome/browser/ui/app_list/crostini/crostini_app_model_builder_unittest.cc +++ b/chrome/browser/ui/app_list/crostini/crostini_app_model_builder_unittest.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ui/app_list/crostini/crostini_app_model_builder.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/chromeos/crostini/crostini_registry_service.h" #include "chrome/browser/chromeos/crostini/crostini_registry_service_factory.h" #include "chrome/browser/chromeos/crostini/crostini_test_helper.h" @@ -84,8 +83,6 @@ ~CrostiniAppModelBuilderTest() override {} void SetUp() override { - scoped_feature_list_.InitAndEnableFeature( - features::kExperimentalCrostiniUI); AppListTestBase::SetUp(); CreateBuilder(); } @@ -118,14 +115,14 @@ std::unique_ptr<CrostiniAppModelBuilder> builder_; private: - base::test::ScopedFeatureList scoped_feature_list_; - DISALLOW_COPY_AND_ASSIGN(CrostiniAppModelBuilderTest); }; // Test that the Terminal app is only shown when Crostini is enabled TEST_F(CrostiniAppModelBuilderTest, EnableCrostini) { + SetCrostiniUIAllowedForTesting(true); EXPECT_EQ(0u, model_updater_->ItemCount()); + CrostiniTestHelper::EnableCrostini(profile()); // Root folder + terminal app. EXPECT_THAT( @@ -134,6 +131,7 @@ EXPECT_THAT(GetAppNames(model_updater_.get()), testing::UnorderedElementsAre( kRootFolderName, GetFullName(kCrostiniTerminalAppName))); + SetCrostiniUIAllowedForTesting(false); } TEST_F(CrostiniAppModelBuilderTest, AppInstallation) {
diff --git a/chrome/browser/ui/ash/chrome_keyboard_ui.cc b/chrome/browser/ui/ash/chrome_keyboard_ui.cc index f2916a8..b4ed238 100644 --- a/chrome/browser/ui/ash/chrome_keyboard_ui.cc +++ b/chrome/browser/ui/ash/chrome_keyboard_ui.cc
@@ -490,13 +490,6 @@ } void ChromeKeyboardUI::SetShadowAroundKeyboard() { - // In the new keyboard UI, the shadows are drawn by the extension. - // TODO(https://crbug.com/856195): Remove this method when we switch - // completely to the new UI. The default extension may need to draw its own - // shadows too. - if (keyboard::IsVirtualKeyboardMdUiEnabled()) - return; - aura::Window* contents_window = keyboard_contents_->GetNativeView(); if (!shadow_) { shadow_ = std::make_unique<ui::Shadow>(); @@ -506,6 +499,15 @@ } shadow_->SetContentBounds(gfx::Rect(contents_window->bounds().size())); + + // In floating mode, make the shadow layer invisible because the shadows are + // drawn manually by the IME extension. + // TODO(https://crbug.com/856195): Remove this when we figure out how ChromeOS + // can draw custom shaped shadows, or how overscrolling can account for + // shadows drawn by IME. + shadow_->layer()->SetVisible( + keyboard_controller()->GetActiveContainerType() == + keyboard::ContainerType::FULL_WIDTH); } void ChromeKeyboardUI::SetupWebContents(content::WebContents* contents) {
diff --git a/chrome/browser/ui/ash/chrome_keyboard_ui_unittest.cc b/chrome/browser/ui/ash/chrome_keyboard_ui_unittest.cc index 3382f89..e07ee9743 100644 --- a/chrome/browser/ui/ash/chrome_keyboard_ui_unittest.cc +++ b/chrome/browser/ui/ash/chrome_keyboard_ui_unittest.cc
@@ -38,18 +38,3 @@ } // namespace using ChromeKeyboardUITest = ChromeRenderViewHostTestHarness; - -// A test for crbug.com/734534 -TEST_F(ChromeKeyboardUITest, DoesNotCrashWhenParentDoesNotExist) { - std::unique_ptr<content::WebContents> contents = CreateTestWebContents(); - TestChromeKeyboardUI keyboard_ui(std::move(contents)); - - EXPECT_FALSE(keyboard_ui.HasKeyboardWindow()); - aura::Window* view = keyboard_ui.GetKeyboardWindow(); - EXPECT_TRUE(keyboard_ui.HasKeyboardWindow()); - - EXPECT_FALSE(view->parent()); - - // Change window size to trigger OnWindowBoundsChanged. - view->SetBounds(gfx::Rect(0, 0, 1200, 800)); -}
diff --git a/chrome/browser/ui/ash/keyboard_controller_browsertest.cc b/chrome/browser/ui/ash/keyboard_controller_browsertest.cc index 1ae0625..92bc295 100644 --- a/chrome/browser/ui/ash/keyboard_controller_browsertest.cc +++ b/chrome/browser/ui/ash/keyboard_controller_browsertest.cc
@@ -147,6 +147,27 @@ EXPECT_EQ(gfx::Point(50, 50), contents_window->bounds().origin()); } +// A test for crbug.com/734534 +IN_PROC_BROWSER_TEST_F(VirtualKeyboardWebContentTest, + DoesNotCrashWhenParentDoesNotExist) { + auto* controller = keyboard::KeyboardController::Get(); + + controller->LoadKeyboardWindowInBackground(); + keyboard::KeyboardUI* keyboard_ui = controller->ui(); + ASSERT_TRUE(keyboard_ui); + + aura::Window* view = keyboard_ui->GetKeyboardWindow(); + EXPECT_TRUE(keyboard_ui->HasKeyboardWindow()); + + // Remove the keyboard window parent. + EXPECT_TRUE(view->parent()); + controller->DeactivateKeyboard(); + EXPECT_FALSE(view->parent()); + + // Change window size to trigger OnWindowBoundsChanged. + view->SetBounds(gfx::Rect(0, 0, 1200, 800)); +} + class VirtualKeyboardAppWindowTest : public extensions::PlatformAppBrowserTest { public: VirtualKeyboardAppWindowTest() {}
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller.h b/chrome/browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller.h deleted file mode 100644 index ec7f4b9..0000000 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller.h +++ /dev/null
@@ -1,47 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_ALL_TABS_CONTROLLER_H_ -#define CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_ALL_TABS_CONTROLLER_H_ - -#include <utility> -#include <vector> - -#include "base/strings/string16.h" -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_editor_base_controller.h" - -// A list of pairs containing the name and URL associated with each -// currently active tab in the active browser window. -typedef std::pair<base::string16, GURL> ActiveTabNameURLPair; -typedef std::vector<ActiveTabNameURLPair> ActiveTabsNameURLPairVector; - -// A controller for the Bookmark All Tabs sheet which is presented upon -// selecting the Bookmark All Tabs... menu item shown by the contextual -// menu in the bookmarks bar. -@interface BookmarkAllTabsController : BookmarkEditorBaseController { - @private - ActiveTabsNameURLPairVector activeTabPairsVector_; -} - -- (id)initWithParentWindow:(NSWindow*)parentWindow - profile:(Profile*)profile - parent:(const bookmarks::BookmarkNode*)parent - url:(const GURL&)url - title:(const base::string16&)title - configuration:(BookmarkEditor::Configuration)configuration; - -@end - -@interface BookmarkAllTabsController(TestingAPI) - -// Initializes the list of all tab names and URLs. Overridden by unit test -// to provide canned test data. -- (void)UpdateActiveTabPairs; - -// Provides testing access to tab pairs list. -- (ActiveTabsNameURLPairVector*)activeTabPairsVector; - -@end - -#endif // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_ALL_TABS_CONTROLLER_H_
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller.mm deleted file mode 100644 index 6dd4ac6..0000000 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller.mm +++ /dev/null
@@ -1,92 +0,0 @@ -// Copyright (c) 2012 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 "chrome/browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller.h" - -#include "base/strings/string16.h" -#include "base/strings/sys_string_conversions.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_tabstrip.h" -#include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h" -#include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "components/bookmarks/browser/bookmark_model.h" -#include "components/strings/grit/components_strings.h" -#include "content/public/browser/web_contents.h" -#include "ui/base/l10n/l10n_util_mac.h" - -using bookmarks::BookmarkModel; -using bookmarks::BookmarkNode; -using content::WebContents; - -@implementation BookmarkAllTabsController - -- (id)initWithParentWindow:(NSWindow*)parentWindow - profile:(Profile*)profile - parent:(const BookmarkNode*)parent - url:(const GURL&)url - title:(const base::string16&)title - configuration:(BookmarkEditor::Configuration)configuration { - NSString* nibName = @"BookmarkAllTabs"; - if ((self = [super initWithParentWindow:parentWindow - nibName:nibName - profile:profile - parent:parent - url:url - title:title - configuration:configuration])) { - } - return self; -} - -- (void)awakeFromNib { - [self setInitialName: - l10n_util::GetNSStringWithFixup(IDS_BOOKMARK_EDITOR_NEW_FOLDER_NAME)]; - [super awakeFromNib]; -} - -#pragma mark Bookmark Editing - -- (void)UpdateActiveTabPairs { - activeTabPairsVector_.clear(); - Browser* browser = chrome::GetLastActiveBrowser(); - const int tabCount = browser->tab_strip_model()->count(); - for (int i = 0; i < tabCount; ++i) { - WebContents* contents = browser->tab_strip_model()->GetWebContentsAt(i); - ActiveTabNameURLPair tabPair(contents->GetTitle(), contents->GetURL()); - activeTabPairsVector_.push_back(tabPair); - } -} - -// Called by -[BookmarkEditorBaseController ok:]. Creates the container -// folder for the tabs and then the bookmarks in that new folder. -// Returns a BOOL as an NSNumber indicating that the commit may proceed. -- (NSNumber*)didCommit { - const BookmarkNode* newParentNode = [self selectedNode]; - if (!newParentNode) - return [NSNumber numberWithBool:NO]; - int newIndex = newParentNode->child_count(); - // Create the new folder which will contain all of the tab URLs. - NSString* newFolderName = [self displayName]; - base::string16 newFolderString = base::SysNSStringToUTF16(newFolderName); - BookmarkModel* model = [self bookmarkModel]; - const BookmarkNode* newFolder = model->AddFolder(newParentNode, newIndex, - newFolderString); - // Get a list of all open tabs, create nodes for them, and add - // to the new folder node. - [self UpdateActiveTabPairs]; - int i = 0; - for (ActiveTabsNameURLPairVector::const_iterator it = - activeTabPairsVector_.begin(); - it != activeTabPairsVector_.end(); ++it, ++i) { - model->AddURL(newFolder, i, it->first, it->second); - } - return [NSNumber numberWithBool:YES]; -} - -- (ActiveTabsNameURLPairVector*)activeTabPairsVector { - return &activeTabPairsVector_; -} - -@end // BookmarkAllTabsController -
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller_unittest.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller_unittest.mm deleted file mode 100644 index 5bd4525c..0000000 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller_unittest.mm +++ /dev/null
@@ -1,91 +0,0 @@ -// Copyright (c) 2012 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 <Cocoa/Cocoa.h> - -#include "base/strings/sys_string_conversions.h" -#include "base/strings/utf_string_conversions.h" -#include "chrome/browser/bookmarks/bookmark_model_factory.h" -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller.h" -#include "chrome/browser/ui/cocoa/test/cocoa_profile_test.h" -#include "chrome/test/base/testing_profile.h" -#include "components/bookmarks/browser/bookmark_model.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/platform_test.h" - -using base::ASCIIToUTF16; -using bookmarks::BookmarkModel; -using bookmarks::BookmarkNode; - -@interface BookmarkAllTabsControllerOverride : BookmarkAllTabsController -@end - -@implementation BookmarkAllTabsControllerOverride - -- (void)UpdateActiveTabPairs { - ActiveTabsNameURLPairVector* activeTabPairsVector = - [self activeTabPairsVector]; - activeTabPairsVector->clear(); - activeTabPairsVector->push_back( - ActiveTabNameURLPair(ASCIIToUTF16("at-0"), GURL("http://at-0.com"))); - activeTabPairsVector->push_back( - ActiveTabNameURLPair(ASCIIToUTF16("at-1"), GURL("http://at-1.com"))); - activeTabPairsVector->push_back( - ActiveTabNameURLPair(ASCIIToUTF16("at-2"), GURL("http://at-2.com"))); -} - -@end - -class BookmarkAllTabsControllerTest : public CocoaProfileTest { - public: - const BookmarkNode* parent_node_; - BookmarkAllTabsControllerOverride* controller_; - const BookmarkNode* folder_a_; - - void CreateModel() { - BookmarkModel* model = - BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* root = model->bookmark_bar_node(); - folder_a_ = model->AddFolder(root, 0, ASCIIToUTF16("a")); - model->AddURL(folder_a_, 0, ASCIIToUTF16("a-0"), GURL("http://a-0.com")); - model->AddURL(folder_a_, 1, ASCIIToUTF16("a-1"), GURL("http://a-1.com")); - model->AddURL(folder_a_, 2, ASCIIToUTF16("a-2"), GURL("http://a-2.com")); - } - - virtual BookmarkAllTabsControllerOverride* CreateController() { - return [[BookmarkAllTabsControllerOverride alloc] - initWithParentWindow:test_window() - profile:profile() - parent:folder_a_ - url:GURL() - title:base::string16() - configuration:BookmarkEditor::SHOW_TREE]; - } - - void SetUp() override { - CocoaProfileTest::SetUp(); - ASSERT_TRUE(profile()); - - CreateModel(); - controller_ = CreateController(); - [controller_ runAsModalSheet]; - } - - void TearDown() override { - controller_ = NULL; - CocoaProfileTest::TearDown(); - } -}; - -TEST_F(BookmarkAllTabsControllerTest, BookmarkAllTabs) { - // OK button should always be enabled. - EXPECT_TRUE([controller_ okButtonEnabled]); - [controller_ selectTestNodeInBrowser:folder_a_]; - [controller_ setDisplayName:@"ALL MY TABS"]; - [controller_ ok:nil]; - EXPECT_EQ(4, folder_a_->child_count()); - const BookmarkNode* folderChild = folder_a_->GetChild(3); - EXPECT_EQ(folderChild->GetTitle(), ASCIIToUTF16("ALL MY TABS")); - EXPECT_EQ(3, folderChild->child_count()); -}
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm index 72422c5..dfab6a5 100644 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm
@@ -38,11 +38,9 @@ #import "chrome/browser/ui/cocoa/bookmarks/bookmark_button.h" #import "chrome/browser/ui/cocoa/bookmarks/bookmark_button_cell.h" #import "chrome/browser/ui/cocoa/bookmarks/bookmark_context_menu_cocoa_controller.h" -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.h" #import "chrome/browser/ui/cocoa/bookmarks/bookmark_folder_target.h" #import "chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.h" #import "chrome/browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa.h" -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_name_folder_controller.h" #import "chrome/browser/ui/cocoa/browser_window_controller.h" #import "chrome/browser/ui/cocoa/l10n_util.h" #import "chrome/browser/ui/cocoa/menu_button.h"
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller.h b/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller.h deleted file mode 100644 index 531133f..0000000 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller.h +++ /dev/null
@@ -1,113 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_BUBBLE_CONTROLLER_H_ -#define CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_BUBBLE_CONTROLLER_H_ - -#import <Cocoa/Cocoa.h> - -#include <memory> - -#include "base/mac/availability.h" -#include "base/mac/scoped_nsobject.h" -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa.h" -#import "chrome/browser/ui/cocoa/has_weak_browser_pointer.h" -#import "chrome/browser/ui/cocoa/omnibox_decoration_bubble_controller.h" -#import "ui/base/cocoa/touch_bar_forward_declarations.h" - -@class BookmarkBubbleController; -@class BubbleSyncPromoController; -@class DialogTextFieldEditor; - -namespace bookmarks { -class BookmarkBubbleObserver; -class BookmarkModel; -class BookmarkNode; -class ManagedBookmarkService; -} - -// Controller for the bookmark bubble. The bookmark bubble is a -// bubble that pops up when clicking on the STAR next to the URL to -// add or remove it as a bookmark. This bubble allows for editing of -// the bookmark in various ways (name, folder, etc.) -@interface BookmarkBubbleController - : OmniboxDecorationBubbleController<NSTouchBarDelegate, - HasWeakBrowserPointer> { - @private - // |managed_|, |model_| and |node_| are weak and owned by the current - // browser's profile. - bookmarks::ManagedBookmarkService* managedBookmarkService_; // weak - bookmarks::BookmarkModel* model_; // weak - const bookmarks::BookmarkNode* node_; // weak - - // Inform the observer when the bubble is shown or closed. - bookmarks::BookmarkBubbleObserver* bookmarkBubbleObserver_; // weak - - BOOL alreadyBookmarked_; - - // Ping me when the bookmark model changes out from under us. - std::unique_ptr<BookmarkModelObserverForCocoa> bookmarkObserver_; - - // Sync promo controller, if the sync promo is displayed. - base::scoped_nsobject<BubbleSyncPromoController> syncPromoController_; - - // Field editor for |nameTextField_|. - base::scoped_nsobject<DialogTextFieldEditor> textFieldEditor_; - - IBOutlet NSTextField* bigTitle_; // "Bookmark" or "Bookmark Added!" - IBOutlet NSTextField* nameTextField_; - IBOutlet NSPopUpButton* folderPopUpButton_; - IBOutlet NSView* syncPromoPlaceholder_; - IBOutlet NSView* fieldLabelsContainer_; - IBOutlet NSView* trailingButtonContainer_; -} - -@property(readonly, nonatomic) const bookmarks::BookmarkNode* node; - -// |node| is the bookmark node we edit in this bubble. -// |alreadyBookmarked| tells us if the node was bookmarked before the -// user clicked on the star. (if NO, this is a brand new bookmark). -// The owner of this object is responsible for showing the bubble if -// it desires it to be visible on the screen. It is not shown by the -// init routine. Closing of the window happens implicitly on dealloc. -- (id)initWithParentWindow:(NSWindow*)parentWindow - bubbleObserver:(bookmarks::BookmarkBubbleObserver*)bubbleObserver - managed:(bookmarks::ManagedBookmarkService*)managed - model:(bookmarks::BookmarkModel*)model - node:(const bookmarks::BookmarkNode*)node - alreadyBookmarked:(BOOL)alreadyBookmarked; - -// Actions for buttons in the dialog. -- (IBAction)ok:(id)sender; -- (IBAction)remove:(id)sender; -- (IBAction)cancel:(id)sender; - -// These actions send a -editBookmarkNode: action up the responder chain. -- (IBAction)edit:(id)sender; -- (IBAction)folderChanged:(id)sender; - -// Overridden to customize the touch bar. -- (NSTouchBar*)makeTouchBar API_AVAILABLE(macos(10.12.2)); - -@end - - -// Exposed only for unit testing. -@interface BookmarkBubbleController (ExposedForUnitTesting) - -@property(nonatomic, readonly) NSView* syncPromoPlaceholder; -@property(nonatomic, readonly) - bookmarks::BookmarkBubbleObserver* bookmarkBubbleObserver; - -- (void)addFolderNodes:(const bookmarks::BookmarkNode*)parent - toPopUpButton:(NSPopUpButton*)button - indentation:(int)indentation; -- (void)setTitle:(NSString*)title - parentFolder:(const bookmarks::BookmarkNode*)parent; -- (void)setParentFolderSelection:(const bookmarks::BookmarkNode*)parent; -+ (NSString*)chooseAnotherFolderString; -- (NSPopUpButton*)folderPopUpButton; -@end - -#endif // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_BUBBLE_CONTROLLER_H_
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller.mm deleted file mode 100644 index 7a9c9046..0000000 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller.mm +++ /dev/null
@@ -1,489 +0,0 @@ -// Copyright (c) 2012 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 "chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller.h" - -#include "base/mac/bundle_locations.h" -#import "base/mac/sdk_forward_declarations.h" -#include "base/metrics/user_metrics.h" -#include "base/strings/sys_string_conversions.h" -#include "chrome/browser/ui/bookmarks/bookmark_bubble_observer.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_finder.h" -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_button.h" -#import "chrome/browser/ui/cocoa/browser_window_controller.h" -#import "chrome/browser/ui/cocoa/bubble_sync_promo_controller.h" -#import "chrome/browser/ui/cocoa/dialog_text_field_editor.h" -#import "chrome/browser/ui/cocoa/info_bubble_view.h" -#import "chrome/browser/ui/cocoa/l10n_util.h" -#import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" -#import "chrome/browser/ui/cocoa/location_bar/star_decoration.h" -#include "chrome/browser/ui/sync/sync_promo_ui.h" -#include "chrome/common/chrome_features.h" -#include "chrome/grit/chromium_strings.h" -#include "chrome/grit/generated_resources.h" -#include "components/bookmarks/browser/bookmark_model.h" -#include "components/bookmarks/browser/bookmark_utils.h" -#include "components/bookmarks/managed/managed_bookmark_service.h" -#include "components/signin/core/browser/signin_metrics.h" -#include "components/strings/grit/components_strings.h" -#include "content/public/browser/notification_observer.h" -#include "content/public/browser/notification_registrar.h" -#include "content/public/browser/notification_service.h" -#include "ui/base/cocoa/cocoa_base_utils.h" -#import "ui/base/cocoa/touch_bar_util.h" -#include "ui/base/l10n/l10n_util_mac.h" - -using base::UserMetricsAction; -using bookmarks::BookmarkModel; -using bookmarks::BookmarkNode; - -namespace { - -// Touch bar identifier. -NSString* const kBookmarkBubbleTouchBarId = @"bookmark-bubble"; - -// Touch bar item identifiers. -NSString* const kRemoveTouchBarId = @"REMOVE"; -NSString* const kEditTouchBarId = @"EDIT"; -NSString* const kDoneTouchBarId = @"DONE"; - -} // end namespace - -@interface BookmarkBubbleController (PrivateAPI) -- (void)updateBookmarkNode; -- (void)fillInFolderList; -@end - -@implementation BookmarkBubbleController - -@synthesize node = node_; - - // Singleton object to act as a representedObject for the "choose another - // folder" item in the pop up. -+ (id)chooseAnotherFolderObject { - static id object = [[NSObject alloc] init]; - return object; -} - -- (id)initWithParentWindow:(NSWindow*)parentWindow - bubbleObserver:(bookmarks::BookmarkBubbleObserver*)bubbleObserver - managed:(bookmarks::ManagedBookmarkService*)managed - model:(BookmarkModel*)model - node:(const BookmarkNode*)node - alreadyBookmarked:(BOOL)alreadyBookmarked { - DCHECK(managed); - DCHECK(node); - if ((self = [super initWithWindowNibPath:@"BookmarkBubble" - parentWindow:parentWindow - anchoredAt:NSZeroPoint])) { - bookmarkBubbleObserver_ = bubbleObserver; - managedBookmarkService_ = managed; - model_ = model; - node_ = node; - alreadyBookmarked_ = alreadyBookmarked; - } - return self; -} - -- (void)awakeFromNib { - [super awakeFromNib]; - - [[nameTextField_ cell] setUsesSingleLineMode:YES]; - - Browser* browser = chrome::FindBrowserWithWindow(self.parentWindow); - if (SyncPromoUI::ShouldShowSyncPromo(browser->profile())) { - signin_metrics::RecordSigninImpressionUserActionForAccessPoint( - signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE); - - syncPromoController_.reset( - [[BubbleSyncPromoController alloc] - initWithBrowser:browser - promoStringId:IDS_BOOKMARK_SYNC_PROMO_MESSAGE - linkStringId:IDS_BOOKMARK_SYNC_PROMO_LINK - accessPoint: - signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE]); - [syncPromoPlaceholder_ addSubview:[syncPromoController_ view]]; - - // Resize the sync promo and its placeholder. - NSRect syncPromoPlaceholderFrame = [syncPromoPlaceholder_ frame]; - CGFloat syncPromoHeight = [syncPromoController_ - preferredHeightForWidth:syncPromoPlaceholderFrame.size.width]; - syncPromoPlaceholderFrame.size.height = syncPromoHeight; - - [syncPromoPlaceholder_ setFrame:syncPromoPlaceholderFrame]; - [[syncPromoController_ view] setFrame:syncPromoPlaceholderFrame]; - - // Adjust the height of the bubble so that the sync promo fits in it, - // except for its bottom border. The xib file hides the left and right - // borders of the sync promo. - NSRect bubbleFrame = [[self window] frame]; - bubbleFrame.size.height += - syncPromoHeight - [syncPromoController_ borderWidth]; - [[self window] setFrame:bubbleFrame display:YES]; - } -} - -- (void)browserWillBeDestroyed { - bookmarkBubbleObserver_ = nullptr; -} - -- (void)notifyBubbleClosed { - if (!bookmarkBubbleObserver_) - return; - - bookmarkBubbleObserver_->OnBookmarkBubbleHidden(); - bookmarkBubbleObserver_ = nullptr; -} - -// Close the bookmark bubble without changing anything. Unlike a -// typical dialog's OK/Cancel, where Cancel is "do nothing", all -// buttons on the bubble have the capacity to change the bookmark -// model. This is an IBOutlet-looking entry point to remove the -// dialog without touching the model. -- (void)dismissWithoutEditing:(id)sender { - [self close]; -} - -- (void)windowWillClose:(NSNotification*)notification { - // We caught a close so we don't need to watch for the parent closing. - bookmarkObserver_.reset(); - [self notifyBubbleClosed]; - - // Force the field editor to resign the first responder so that it'll - // be removed from the view hierarchy and its delegate be set to nil. - [[self window] endEditingFor:nameTextField_]; - - [super windowWillClose:notification]; -} - -// Override -[BaseBubbleController showWindow:] to tweak bubble location and -// set up UI elements. -- (void)showWindow:(id)sender { - NSWindow* window = [self window]; // Force load the NIB. - NSWindow* parentWindow = self.parentWindow; - BrowserWindowController* bwc = - [BrowserWindowController browserWindowControllerForWindow:parentWindow]; - - InfoBubbleView* bubble = self.bubble; - [bubble setArrowLocation:info_bubble::kTopTrailing]; - - // Insure decent positioning even in the absence of a browser controller, - // which will occur for some unit tests. - NSPoint arrowTip = bwc ? [bwc bookmarkBubblePoint] : - NSMakePoint([window frame].size.width, [window frame].size.height); - arrowTip = ui::ConvertPointFromWindowToScreen(parentWindow, arrowTip); - NSPoint bubbleArrowTip = [bubble arrowTip]; - bubbleArrowTip = [bubble convertPoint:bubbleArrowTip toView:nil]; - arrowTip.y -= bubbleArrowTip.y; - arrowTip.x -= bubbleArrowTip.x; - [window setFrameOrigin:arrowTip]; - - // Default is IDS_BOOKMARK_BUBBLE_PAGE_BOOKMARK; "Bookmark". - // If adding for the 1st time the string becomes "Bookmark Added!" - if (!alreadyBookmarked_) { - NSString* title = - l10n_util::GetNSString(IDS_BOOKMARK_BUBBLE_PAGE_BOOKMARKED); - [bigTitle_ setStringValue:title]; - } - - [self adjustForRTLIfNecessary]; - - [self fillInFolderList]; - - // Ping me when things change out from under us. Unlike a normal - // dialog, the bookmark bubble's cancel: means "don't add this as a - // bookmark", not "cancel editing". We must take extra care to not - // touch the bookmark in this selector. - bookmarkObserver_.reset(new BookmarkModelObserverForCocoa(model_, ^{ - [self dismissWithoutEditing:nil]; - })); - bookmarkObserver_->StartObservingNode(node_); - - [parentWindow addChildWindow:window ordered:NSWindowAbove]; - [window makeKeyAndOrderFront:self]; - [self registerKeyStateEventTap]; - - bookmarkBubbleObserver_->OnBookmarkBubbleShown(node_); - - [self decorationForBubble]->SetActive(true); -} - -- (void)close { - [[BrowserWindowController browserWindowControllerForWindow:self.parentWindow] - releaseToolbarVisibilityForOwner:self - withAnimation:YES]; - - [super close]; -} - -- (NSTouchBar*)makeTouchBar { - if (!base::FeatureList::IsEnabled(features::kDialogTouchBar)) - return nil; - - base::scoped_nsobject<NSTouchBar> touchBar([[ui::NSTouchBar() alloc] init]); - [touchBar - setCustomizationIdentifier:ui::GetTouchBarId(kBookmarkBubbleTouchBarId)]; - [touchBar setDelegate:self]; - - NSArray* dialogItems = @[ - ui::GetTouchBarItemId(kBookmarkBubbleTouchBarId, kRemoveTouchBarId), - ui::GetTouchBarItemId(kBookmarkBubbleTouchBarId, kEditTouchBarId), - ui::GetTouchBarItemId(kBookmarkBubbleTouchBarId, kDoneTouchBarId) - ]; - - [touchBar setDefaultItemIdentifiers:dialogItems]; - [touchBar setCustomizationAllowedItemIdentifiers:dialogItems]; - return touchBar.autorelease(); -} - -- (NSTouchBarItem*)touchBar:(NSTouchBar*)touchBar - makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier - API_AVAILABLE(macos(10.12.2)) { - NSButton* button = nil; - if ([identifier hasSuffix:kRemoveTouchBarId]) { - button = [NSButton buttonWithTitle:l10n_util::GetNSString( - IDS_BOOKMARK_BUBBLE_REMOVE_BOOKMARK) - target:self - action:@selector(remove:)]; - } else if ([identifier hasSuffix:kEditTouchBarId]) { - button = [NSButton - buttonWithTitle:l10n_util::GetNSString(IDS_BOOKMARK_BUBBLE_OPTIONS) - target:self - action:@selector(edit:)]; - } else if ([identifier hasSuffix:kDoneTouchBarId]) { - button = ui::GetBlueTouchBarButton(l10n_util::GetNSString(IDS_DONE), self, - @selector(ok:)); - } else { - return nil; - } - - base::scoped_nsobject<NSCustomTouchBarItem> item( - [[ui::NSCustomTouchBarItem() alloc] initWithIdentifier:identifier]); - [item setView:button]; - return item.autorelease(); -} - -// Delegate method: see |NSWindowDelegate| protocol. -- (id)windowWillReturnFieldEditor:(NSWindow*)sender toObject:(id)obj { - if (!base::FeatureList::IsEnabled(features::kDialogTouchBar)) - return nil; - - if (obj != nameTextField_) - return nil; - - if (!textFieldEditor_) - textFieldEditor_.reset([[DialogTextFieldEditor alloc] init]); - - return textFieldEditor_.get(); -} - -// Shows the bookmark editor sheet for more advanced editing. -- (void)showEditor { - [self ok:self]; - // Send the action up through the responder chain. - [NSApp sendAction:@selector(editBookmarkNode:) to:nil from:self]; -} - -- (IBAction)edit:(id)sender { - base::RecordAction(UserMetricsAction("BookmarkBubble_Edit")); - [self showEditor]; -} - -- (IBAction)ok:(id)sender { - [self updateBookmarkNode]; - [self close]; -} - -// By implementing this, ESC causes the window to go away. If clicking the -// star was what prompted this bubble to appear (i.e., not already bookmarked), -// remove the bookmark. -- (IBAction)cancel:(id)sender { - if (!alreadyBookmarked_) { - // |-remove:| calls |-close| so don't do it. - [self remove:sender]; - } else { - [self dismissWithoutEditing:nil]; - } -} - -- (IBAction)remove:(id)sender { - bookmarks::RemoveAllBookmarks(model_, node_->url()); - base::RecordAction(UserMetricsAction("BookmarkBubble_Unstar")); - node_ = NULL; // no longer valid - [self ok:sender]; -} - -// The controller is the target of the pop up button box action so it can -// handle when "choose another folder" was picked. -- (IBAction)folderChanged:(id)sender { - DCHECK([sender isEqual:folderPopUpButton_]); - // It is possible that due to model change our parent window has been closed - // but the popup is still showing and able to notify the controller of a - // folder change. We ignore the sender in this case. - if (!self.parentWindow) - return; - NSMenuItem* selected = [folderPopUpButton_ selectedItem]; - if ([selected representedObject] == - [[self class] chooseAnotherFolderObject]) { - base::RecordAction(UserMetricsAction("BookmarkBubble_EditFromCombobox")); - [self showEditor]; - } -} - -// The controller is the delegate of the window so it receives did resign key -// notifications. When key is resigned mirror Windows behavior and close the -// window. -- (void)windowDidResignKey:(NSNotification*)notification { - NSWindow* window = [self window]; - DCHECK_EQ([notification object], window); - if ([window isVisible]) { - // If the window isn't visible, it is already closed, and this notification - // has been sent as part of the closing operation, so no need to close. - [self ok:self]; - } -} - -// Look at the dialog; if the user has changed anything, update the -// bookmark node to reflect this. -- (void)updateBookmarkNode { - if (!node_) return; - - // First the title... - NSString* oldTitle = base::SysUTF16ToNSString(node_->GetTitle()); - NSString* newTitle = [nameTextField_ stringValue]; - if (![oldTitle isEqual:newTitle]) { - model_->SetTitle(node_, base::SysNSStringToUTF16(newTitle)); - base::RecordAction(UserMetricsAction("BookmarkBubble_ChangeTitleInBubble")); - } - // Then the parent folder. - const BookmarkNode* oldParent = node_->parent(); - NSMenuItem* selectedItem = [folderPopUpButton_ selectedItem]; - id representedObject = [selectedItem representedObject]; - if (representedObject == [[self class] chooseAnotherFolderObject]) { - // "Choose another folder..." - return; - } - const BookmarkNode* newParent = - static_cast<const BookmarkNode*>([representedObject pointerValue]); - DCHECK(newParent); - if (oldParent != newParent) { - int index = newParent->child_count(); - model_->Move(node_, newParent, index); - base::RecordAction(UserMetricsAction("BookmarkBubble_ChangeParent")); - } -} - -// Fill in all information related to the folder pop up button. -- (void)fillInFolderList { - [nameTextField_ setStringValue:base::SysUTF16ToNSString(node_->GetTitle())]; - DCHECK([folderPopUpButton_ numberOfItems] == 0); - [self addFolderNodes:model_->root_node() - toPopUpButton:folderPopUpButton_ - indentation:0]; - NSMenu* menu = [folderPopUpButton_ menu]; - [menu addItem:[NSMenuItem separatorItem]]; - NSString* title = [[self class] chooseAnotherFolderString]; - NSMenuItem *item = [menu addItemWithTitle:title - action:NULL - keyEquivalent:@""]; - [item setRepresentedObject:[[self class] chooseAnotherFolderObject]]; - // Finally, select the current parent. - NSValue* parentValue = [NSValue valueWithPointer:node_->parent()]; - NSInteger idx = [menu indexOfItemWithRepresentedObject:parentValue]; - [folderPopUpButton_ selectItemAtIndex:idx]; -} - -- (LocationBarDecoration*)decorationForBubble { - BrowserWindowController* browserWindowController = [BrowserWindowController - browserWindowControllerForWindow:[self parentWindow]]; - LocationBarViewMac* locationBar = [browserWindowController locationBarBridge]; - return locationBar ? locationBar->star_decoration() : nullptr; -} - -- (void)adjustForRTLIfNecessary { - // Info bubble view to: - // - Fix the leading margin on the title. - // - Flip containers. - cocoa_l10n_util::FlipAllSubviewsIfNecessary([bigTitle_ superview]); - // Margin on the labels. - cocoa_l10n_util::FlipAllSubviewsIfNecessary(fieldLabelsContainer_); - // Margin on the fields. - cocoa_l10n_util::FlipAllSubviewsIfNecessary([nameTextField_ superview]); - // Relative order of the done and options buttons. - cocoa_l10n_util::FlipAllSubviewsIfNecessary(trailingButtonContainer_); - if (cocoa_l10n_util::ShouldDoExperimentalRTLLayout()) { - // Fix up pop-up button from the nib. - [folderPopUpButton_ setUserInterfaceLayoutDirection: - NSUserInterfaceLayoutDirectionRightToLeft]; - [folderPopUpButton_ setAlignment:NSNaturalTextAlignment]; - } -} - -@end // BookmarkBubbleController - - -@implementation BookmarkBubbleController (ExposedForUnitTesting) - -- (NSView*)syncPromoPlaceholder { - return syncPromoPlaceholder_; -} - -- (bookmarks::BookmarkBubbleObserver*)bookmarkBubbleObserver { - return bookmarkBubbleObserver_; -} - -+ (NSString*)chooseAnotherFolderString { - return l10n_util::GetNSStringWithFixup( - IDS_BOOKMARK_BUBBLE_CHOOSER_ANOTHER_FOLDER); -} - -// For the given folder node, walk the tree and add folder names to -// the given pop up button. -- (void)addFolderNodes:(const BookmarkNode*)parent - toPopUpButton:(NSPopUpButton*)button - indentation:(int)indentation { - if (!model_->is_root_node(parent)) { - NSString* title = base::SysUTF16ToNSString(parent->GetTitle()); - NSMenu* menu = [button menu]; - NSMenuItem* item = [menu addItemWithTitle:title - action:NULL - keyEquivalent:@""]; - [item setRepresentedObject:[NSValue valueWithPointer:parent]]; - [item setIndentationLevel:indentation]; - ++indentation; - } - for (int i = 0; i < parent->child_count(); i++) { - const BookmarkNode* child = parent->GetChild(i); - if (child->is_folder() && child->IsVisible() && - managedBookmarkService_->CanBeEditedByUser(child)) { - [self addFolderNodes:child - toPopUpButton:button - indentation:indentation]; - } - } -} - -- (void)setTitle:(NSString*)title parentFolder:(const BookmarkNode*)parent { - [nameTextField_ setStringValue:title]; - [self setParentFolderSelection:parent]; -} - -// Pick a specific parent node in the selection by finding the right -// pop up button index. -- (void)setParentFolderSelection:(const BookmarkNode*)parent { - // Expectation: There is a parent mapping for all items in the - // folderPopUpButton except the last one ("Choose another folder..."). - NSMenu* menu = [folderPopUpButton_ menu]; - NSValue* parentValue = [NSValue valueWithPointer:parent]; - NSInteger idx = [menu indexOfItemWithRepresentedObject:parentValue]; - DCHECK(idx != -1); - [folderPopUpButton_ selectItemAtIndex:idx]; -} - -- (NSPopUpButton*)folderPopUpButton { - return folderPopUpButton_; -} - -@end // implementation BookmarkBubbleController(ExposedForUnitTesting)
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller_unittest.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller_unittest.mm deleted file mode 100644 index faf9bdcdb..0000000 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller_unittest.mm +++ /dev/null
@@ -1,559 +0,0 @@ -// Copyright (c) 2012 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 <Cocoa/Cocoa.h> - -#include "base/mac/mac_util.h" -#include "base/mac/scoped_nsobject.h" -#include "base/macros.h" -#include "base/strings/string16.h" -#include "base/strings/utf_string_conversions.h" -#include "base/test/scoped_feature_list.h" -#include "chrome/browser/bookmarks/bookmark_model_factory.h" -#include "chrome/browser/bookmarks/managed_bookmark_service_factory.h" -#include "chrome/browser/signin/signin_manager_factory.h" -#include "chrome/browser/ui/bookmarks/bookmark_bubble_observer.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_window.h" -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller.h" -#include "chrome/browser/ui/cocoa/browser_window_controller.h" -#import "chrome/browser/ui/cocoa/browser_window_touch_bar.h" -#import "chrome/browser/ui/cocoa/info_bubble_window.h" -#include "chrome/browser/ui/cocoa/test/cocoa_profile_test.h" -#include "chrome/common/chrome_features.h" -#include "chrome/test/base/testing_profile.h" -#include "components/bookmarks/browser/bookmark_model.h" -#include "components/bookmarks/managed/managed_bookmark_service.h" -#include "components/signin/core/browser/signin_manager.h" -#include "content/public/browser/notification_service.h" -#include "testing/gtest/include/gtest/gtest.h" -#import "testing/gtest_mac.h" -#include "testing/platform_test.h" -#import "ui/base/cocoa/touch_bar_forward_declarations.h" -#import "ui/base/cocoa/touch_bar_util.h" -#include "ui/base/material_design/material_design_controller.h" -#include "ui/base/ui_base_features.h" - -using base::ASCIIToUTF16; -using bookmarks::BookmarkBubbleObserver; -using bookmarks::BookmarkModel; -using bookmarks::BookmarkNode; -using content::WebContents; - -namespace { - -// URL of the test bookmark. -const char kTestBookmarkURL[] = "http://www.google.com"; - -// Touch bar identifier. -NSString* const kBookmarkBubbleTouchBarId = @"bookmark-bubble"; - -// Touch bar item identifiers. -NSString* const kRemoveTouchBarId = @"REMOVE"; -NSString* const kEditTouchBarId = @"EDIT"; -NSString* const kDoneTouchBarId = @"DONE"; - -class TestBookmarkBubbleObserver : public BookmarkBubbleObserver { - public: - TestBookmarkBubbleObserver() {} - ~TestBookmarkBubbleObserver() override {} - - // bookmarks::BookmarkBubbleObserver. - void OnBookmarkBubbleShown(const BookmarkNode* node) override { - ++shown_count_; - } - void OnBookmarkBubbleHidden() override { ++hidden_count_; } - - int shown_count() { return shown_count_; } - int hidden_count() { return hidden_count_; } - - private: - int shown_count_ = 0; - int hidden_count_ = 0; - - DISALLOW_COPY_AND_ASSIGN(TestBookmarkBubbleObserver); -}; - -class BookmarkBubbleControllerTest : public CocoaProfileTest { - public: - static int edits_; - BookmarkBubbleController* controller_; - TestBookmarkBubbleObserver test_observer_; - - BookmarkBubbleControllerTest() : controller_(nil) { - edits_ = 0; - } - - // CocoaProfileTest: - void SetUp() override { - // This file only tests Cocoa UI and can be deleted when kSecondaryUiMd is - // default. - scoped_feature_list_.InitAndDisableFeature(features::kSecondaryUiMd); - CocoaProfileTest::SetUp(); - } - - void TearDown() override { - [controller_ close]; - CocoaProfileTest::TearDown(); - } - - // Returns a controller but ownership not transferred. - // Only one of these will be valid at a time. - BookmarkBubbleController* ControllerForNode(const BookmarkNode* node) { - if (controller_ && !IsWindowClosing()) { - [controller_ close]; - controller_ = nil; - } - BookmarkModel* model = - BookmarkModelFactory::GetForBrowserContext(profile()); - bookmarks::ManagedBookmarkService* managed = - ManagedBookmarkServiceFactory::GetForProfile(profile()); - controller_ = [[BookmarkBubbleController alloc] - initWithParentWindow:browser()->window()->GetNativeWindow() - bubbleObserver:&test_observer_ - managed:managed - model:model - node:node - alreadyBookmarked:YES]; - EXPECT_TRUE([controller_ window]); - // The window must be gone or we'll fail a unit test with windows left open. - [static_cast<InfoBubbleWindow*>([controller_ window]) - setAllowedAnimations:info_bubble::kAnimateNone]; - [controller_ showWindow:nil]; - return controller_; - } - - BookmarkModel* GetBookmarkModel() { - return BookmarkModelFactory::GetForBrowserContext(profile()); - } - - const BookmarkNode* CreateTestBookmark() { - BookmarkModel* model = GetBookmarkModel(); - return model->AddURL(model->bookmark_bar_node(), - 0, - ASCIIToUTF16("Bookie markie title"), - GURL(kTestBookmarkURL)); - } - - bool IsWindowClosing() { - return [static_cast<InfoBubbleWindow*>([controller_ window]) isClosing]; - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; - - DISALLOW_COPY_AND_ASSIGN(BookmarkBubbleControllerTest); -}; - -// static -int BookmarkBubbleControllerTest::edits_; - -// Confirm basics about the bubble window (e.g. that its frame fits inside, or -// almost completely fits inside, its parent window's frame). -TEST_F(BookmarkBubbleControllerTest, TestBubbleWindow) { - const BookmarkNode* node = CreateTestBookmark(); - BookmarkBubbleController* controller = ControllerForNode(node); - EXPECT_TRUE(controller); - NSWindow* window = [controller window]; - EXPECT_TRUE(window); - NSRect browser_window_frame = [browser()->window()->GetNativeWindow() frame]; - // In this test case the bookmarks bubble's window frame extendeds slightly - // beyond its parent window's frame. - browser_window_frame.size.width += 1; - EXPECT_TRUE(NSContainsRect(browser_window_frame, [window frame])); -} - -// Test that we can handle closing the parent window -TEST_F(BookmarkBubbleControllerTest, TestClosingParentWindow) { - const BookmarkNode* node = CreateTestBookmark(); - BookmarkBubbleController* controller = ControllerForNode(node); - EXPECT_TRUE(controller); - NSWindow* window = [controller window]; - EXPECT_TRUE(window); - base::mac::ScopedNSAutoreleasePool pool; - [browser()->window()->GetNativeWindow() performClose:NSApp]; -} - - -// Confirm population of folder list -TEST_F(BookmarkBubbleControllerTest, TestFillInFolder) { - // Create some folders, including a nested folder - BookmarkModel* model = GetBookmarkModel(); - EXPECT_TRUE(model); - const BookmarkNode* bookmarkBarNode = model->bookmark_bar_node(); - EXPECT_TRUE(bookmarkBarNode); - const BookmarkNode* node1 = model->AddFolder(bookmarkBarNode, 0, - ASCIIToUTF16("one")); - EXPECT_TRUE(node1); - const BookmarkNode* node2 = model->AddFolder(bookmarkBarNode, 1, - ASCIIToUTF16("two")); - EXPECT_TRUE(node2); - const BookmarkNode* node3 = model->AddFolder(bookmarkBarNode, 2, - ASCIIToUTF16("three")); - EXPECT_TRUE(node3); - const BookmarkNode* node4 = model->AddFolder(node2, 0, ASCIIToUTF16("sub")); - EXPECT_TRUE(node4); - const BookmarkNode* node5 = model->AddURL(node1, 0, ASCIIToUTF16("title1"), - GURL(kTestBookmarkURL)); - EXPECT_TRUE(node5); - const BookmarkNode* node6 = model->AddURL(node3, 0, ASCIIToUTF16("title2"), - GURL(kTestBookmarkURL)); - EXPECT_TRUE(node6); - const BookmarkNode* node7 = model->AddURL( - node4, 0, ASCIIToUTF16("title3"), GURL("http://www.google.com/reader")); - EXPECT_TRUE(node7); - - BookmarkBubbleController* controller = ControllerForNode(node4); - EXPECT_TRUE(controller); - - NSArray* titles = - [[[controller folderPopUpButton] itemArray] valueForKey:@"title"]; - EXPECT_TRUE([titles containsObject:@"one"]); - EXPECT_TRUE([titles containsObject:@"two"]); - EXPECT_TRUE([titles containsObject:@"three"]); - EXPECT_TRUE([titles containsObject:@"sub"]); - EXPECT_FALSE([titles containsObject:@"title1"]); - EXPECT_FALSE([titles containsObject:@"title2"]); - - - // Verify that the top level folders are displayed correctly. - EXPECT_TRUE([titles containsObject:@"Other Bookmarks"]); - EXPECT_TRUE([titles containsObject:@"Bookmarks Bar"]); - if (model->mobile_node()->IsVisible()) { - EXPECT_TRUE([titles containsObject:@"Mobile Bookmarks"]); - } else { - EXPECT_FALSE([titles containsObject:@"Mobile Bookmarks"]); - } -} - -// Confirm ability to handle folders with blank name. -TEST_F(BookmarkBubbleControllerTest, TestFolderWithBlankName) { - // Create some folders, including a nested folder - BookmarkModel* model = GetBookmarkModel(); - EXPECT_TRUE(model); - const BookmarkNode* bookmarkBarNode = model->bookmark_bar_node(); - EXPECT_TRUE(bookmarkBarNode); - const BookmarkNode* node1 = model->AddFolder(bookmarkBarNode, 0, - ASCIIToUTF16("one")); - EXPECT_TRUE(node1); - const BookmarkNode* node2 = model->AddFolder(bookmarkBarNode, 1, - base::string16()); - EXPECT_TRUE(node2); - const BookmarkNode* node3 = model->AddFolder(bookmarkBarNode, 2, - ASCIIToUTF16("three")); - EXPECT_TRUE(node3); - const BookmarkNode* node2_1 = model->AddURL(node2, 0, ASCIIToUTF16("title1"), - GURL(kTestBookmarkURL)); - EXPECT_TRUE(node2_1); - - BookmarkBubbleController* controller = ControllerForNode(node1); - EXPECT_TRUE(controller); - - // One of the items should be blank and its node should be node2. - NSArray* items = [[controller folderPopUpButton] itemArray]; - EXPECT_GT([items count], 4U); - BOOL blankFolderFound = NO; - for (NSMenuItem* item in [[controller folderPopUpButton] itemArray]) { - if ([[item title] length] == 0 && - static_cast<const BookmarkNode*>([[item representedObject] - pointerValue]) == node2) { - blankFolderFound = YES; - break; - } - } - EXPECT_TRUE(blankFolderFound); -} - -// Click on edit; bubble gets closed. -TEST_F(BookmarkBubbleControllerTest, TestEdit) { - const BookmarkNode* node = CreateTestBookmark(); - BookmarkBubbleController* controller = ControllerForNode(node); - EXPECT_TRUE(controller); - - EXPECT_EQ(edits_, 0); - EXPECT_FALSE(IsWindowClosing()); - [controller edit:controller]; - EXPECT_EQ(edits_, 1); - EXPECT_TRUE(IsWindowClosing()); -} - -// CallClose; bubble gets closed. -// Also confirm bubble notifications get sent. -TEST_F(BookmarkBubbleControllerTest, TestClose) { - const BookmarkNode* node = CreateTestBookmark(); - EXPECT_EQ(edits_, 0); - - BookmarkBubbleController* controller = ControllerForNode(node); - EXPECT_TRUE(controller.bookmarkBubbleObserver); - EXPECT_EQ(1, test_observer_.shown_count()); - EXPECT_EQ(0, test_observer_.hidden_count()); - EXPECT_TRUE(controller); - EXPECT_FALSE(IsWindowClosing()); - [controller ok:controller]; - EXPECT_EQ(edits_, 0); - EXPECT_TRUE(IsWindowClosing()); - EXPECT_FALSE(controller.bookmarkBubbleObserver); - EXPECT_EQ(1, test_observer_.hidden_count()); -} - -// User changes title and parent folder in the UI -TEST_F(BookmarkBubbleControllerTest, TestUserEdit) { - BookmarkModel* model = GetBookmarkModel(); - EXPECT_TRUE(model); - const BookmarkNode* bookmarkBarNode = model->bookmark_bar_node(); - EXPECT_TRUE(bookmarkBarNode); - const BookmarkNode* node = model->AddURL(bookmarkBarNode, - 0, - ASCIIToUTF16("short-title"), - GURL(kTestBookmarkURL)); - const BookmarkNode* grandma = model->AddFolder(bookmarkBarNode, 0, - ASCIIToUTF16("grandma")); - EXPECT_TRUE(grandma); - const BookmarkNode* grandpa = model->AddFolder(bookmarkBarNode, 0, - ASCIIToUTF16("grandpa")); - EXPECT_TRUE(grandpa); - - BookmarkBubbleController* controller = ControllerForNode(node); - EXPECT_TRUE(controller); - - // simulate a user edit - [controller setTitle:@"oops" parentFolder:grandma]; - [controller edit:controller]; - - // Make sure bookmark has changed - EXPECT_EQ(node->GetTitle(), ASCIIToUTF16("oops")); - EXPECT_EQ(node->parent()->GetTitle(), ASCIIToUTF16("grandma")); -} - -// Confirm happiness with parent nodes that have the same name. -TEST_F(BookmarkBubbleControllerTest, TestNewParentSameName) { - BookmarkModel* model = GetBookmarkModel(); - EXPECT_TRUE(model); - const BookmarkNode* bookmarkBarNode = model->bookmark_bar_node(); - EXPECT_TRUE(bookmarkBarNode); - for (int i=0; i<2; i++) { - const BookmarkNode* node = model->AddURL(bookmarkBarNode, - 0, - ASCIIToUTF16("short-title"), - GURL(kTestBookmarkURL)); - EXPECT_TRUE(node); - const BookmarkNode* folder = model->AddFolder(bookmarkBarNode, 0, - ASCIIToUTF16("NAME")); - EXPECT_TRUE(folder); - folder = model->AddFolder(bookmarkBarNode, 0, ASCIIToUTF16("NAME")); - EXPECT_TRUE(folder); - folder = model->AddFolder(bookmarkBarNode, 0, ASCIIToUTF16("NAME")); - EXPECT_TRUE(folder); - BookmarkBubbleController* controller = ControllerForNode(node); - EXPECT_TRUE(controller); - - // simulate a user edit - [controller setParentFolderSelection:bookmarkBarNode->GetChild(i)]; - [controller edit:controller]; - - // Make sure bookmark has changed, and that the parent is what we - // expect. This proves nobody did searching based on name. - EXPECT_EQ(node->parent(), bookmarkBarNode->GetChild(i)); - } -} - -// Confirm happiness with nodes with the same Name -TEST_F(BookmarkBubbleControllerTest, TestDuplicateNodeNames) { - BookmarkModel* model = GetBookmarkModel(); - const BookmarkNode* bookmarkBarNode = model->bookmark_bar_node(); - EXPECT_TRUE(bookmarkBarNode); - const BookmarkNode* node1 = model->AddFolder(bookmarkBarNode, 0, - ASCIIToUTF16("NAME")); - EXPECT_TRUE(node1); - const BookmarkNode* node2 = model->AddFolder(bookmarkBarNode, 0, - ASCIIToUTF16("NAME")); - EXPECT_TRUE(node2); - BookmarkBubbleController* controller = ControllerForNode(bookmarkBarNode); - EXPECT_TRUE(controller); - - NSPopUpButton* button = [controller folderPopUpButton]; - [controller setParentFolderSelection:node1]; - NSMenuItem* item = [button selectedItem]; - id itemObject = [item representedObject]; - EXPECT_NSEQ([NSValue valueWithPointer:node1], itemObject); - [controller setParentFolderSelection:node2]; - item = [button selectedItem]; - itemObject = [item representedObject]; - EXPECT_NSEQ([NSValue valueWithPointer:node2], itemObject); -} - -// Click the "remove" button -TEST_F(BookmarkBubbleControllerTest, TestRemove) { - const BookmarkNode* node = CreateTestBookmark(); - BookmarkBubbleController* controller = ControllerForNode(node); - EXPECT_TRUE(controller); - - BookmarkModel* model = GetBookmarkModel(); - EXPECT_TRUE(model->IsBookmarked(GURL(kTestBookmarkURL))); - - [controller remove:controller]; - EXPECT_FALSE(model->IsBookmarked(GURL(kTestBookmarkURL))); - EXPECT_TRUE(IsWindowClosing()); -} - -// Confirm picking "choose another folder" caused edit: to be called. -TEST_F(BookmarkBubbleControllerTest, PopUpSelectionChanged) { - BookmarkModel* model = GetBookmarkModel(); - const BookmarkNode* node = model->AddURL(model->bookmark_bar_node(), - 0, ASCIIToUTF16("super-title"), - GURL(kTestBookmarkURL)); - BookmarkBubbleController* controller = ControllerForNode(node); - EXPECT_TRUE(controller); - - NSPopUpButton* button = [controller folderPopUpButton]; - [button selectItemWithTitle:[[controller class] chooseAnotherFolderString]]; - EXPECT_EQ(edits_, 0); - [button sendAction:[button action] to:[button target]]; - EXPECT_EQ(edits_, 1); -} - -// Create a controller that simulates the bookmark just now being created by -// the user clicking the star, then sending the "cancel" command to represent -// them pressing escape. The bookmark should not be there. -TEST_F(BookmarkBubbleControllerTest, EscapeRemovesNewBookmark) { - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile()); - bookmarks::ManagedBookmarkService* managed = - ManagedBookmarkServiceFactory::GetForProfile(profile()); - const BookmarkNode* node = CreateTestBookmark(); - BookmarkBubbleController* controller = [[BookmarkBubbleController alloc] - initWithParentWindow:browser()->window()->GetNativeWindow() - bubbleObserver:&test_observer_ - managed:managed - model:model - node:node - alreadyBookmarked:NO]; // The last param is the key difference. - EXPECT_TRUE([controller window]); - // Calls release on controller. - [controller cancel:nil]; - EXPECT_FALSE(model->IsBookmarked(GURL(kTestBookmarkURL))); -} - -// Create a controller where the bookmark already existed prior to clicking -// the star and test that sending a cancel command doesn't change the state -// of the bookmark. -TEST_F(BookmarkBubbleControllerTest, EscapeDoesntTouchExistingBookmark) { - const BookmarkNode* node = CreateTestBookmark(); - BookmarkBubbleController* controller = ControllerForNode(node); - EXPECT_TRUE(controller); - - [(id)controller cancel:nil]; - EXPECT_TRUE(GetBookmarkModel()->IsBookmarked(GURL(kTestBookmarkURL))); -} - -// Confirm indentation of items in pop-up menu -TEST_F(BookmarkBubbleControllerTest, TestMenuIndentation) { - // Create some folders, including a nested folder - BookmarkModel* model = GetBookmarkModel(); - EXPECT_TRUE(model); - const BookmarkNode* bookmarkBarNode = model->bookmark_bar_node(); - EXPECT_TRUE(bookmarkBarNode); - const BookmarkNode* node1 = model->AddFolder(bookmarkBarNode, 0, - ASCIIToUTF16("one")); - EXPECT_TRUE(node1); - const BookmarkNode* node2 = model->AddFolder(bookmarkBarNode, 1, - ASCIIToUTF16("two")); - EXPECT_TRUE(node2); - const BookmarkNode* node2_1 = model->AddFolder(node2, 0, - ASCIIToUTF16("two dot one")); - EXPECT_TRUE(node2_1); - const BookmarkNode* node3 = model->AddFolder(bookmarkBarNode, 2, - ASCIIToUTF16("three")); - EXPECT_TRUE(node3); - - BookmarkBubbleController* controller = ControllerForNode(node1); - EXPECT_TRUE(controller); - - // Compare the menu item indents against expectations. - static const int kExpectedIndent[] = {0, 1, 1, 2, 1, 0}; - NSArray* items = [[controller folderPopUpButton] itemArray]; - ASSERT_GE([items count], 6U); - for(int itemNo = 0; itemNo < 6; itemNo++) { - NSMenuItem* item = [items objectAtIndex:itemNo]; - EXPECT_EQ(kExpectedIndent[itemNo], [item indentationLevel]) - << "Unexpected indent for menu item #" << itemNo; - } -} - -// Confirm that the sync promo is displayed when the user is not signed in. -TEST_F(BookmarkBubbleControllerTest, SyncPromoNotSignedIn) { - const BookmarkNode* node = CreateTestBookmark(); - BookmarkBubbleController* controller = ControllerForNode(node); - - EXPECT_EQ(1u, [[controller.syncPromoPlaceholder subviews] count]); -} - -// Confirm that the sync promo is not displayed when the user is signed in. -TEST_F(BookmarkBubbleControllerTest, SyncPromoSignedIn) { - SigninManager* signin = SigninManagerFactory::GetForProfile(profile()); - signin->SetAuthenticatedAccountInfo("fake_username", "fake_username"); - - const BookmarkNode* node = CreateTestBookmark(); - BookmarkBubbleController* controller = ControllerForNode(node); - - EXPECT_EQ(0u, [[controller.syncPromoPlaceholder subviews] count]); -} - -// Tests to see if setting the title textfield multiple times will crash. -// See crbug.com/731284. -TEST_F(BookmarkBubbleControllerTest, TextfieldChanges) { - BookmarkModel* model = GetBookmarkModel(); - EXPECT_TRUE(model); - const BookmarkNode* bookmark_bar_node = model->bookmark_bar_node(); - EXPECT_TRUE(bookmark_bar_node); - const BookmarkNode* node = - model->AddURL(bookmark_bar_node, 0, ASCIIToUTF16("short-title"), - GURL(kTestBookmarkURL)); - - BookmarkBubbleController* controller = ControllerForNode(node); - EXPECT_TRUE(controller); - - const BookmarkNode* parent = node->parent(); - EXPECT_TRUE(parent); - - [controller setTitle:@"test" parentFolder:parent]; - [controller setTitle:@"" parentFolder:parent]; - [controller setTitle:@" " parentFolder:parent]; - [controller setTitle:@" test 2 " parentFolder:parent]; -} - -// Verifies the bubble's touch bar. -TEST_F(BookmarkBubbleControllerTest, TouchBar) { - if (@available(macOS 10.12.2, *)) { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(features::kDialogTouchBar); - - const BookmarkNode* node = CreateTestBookmark(); - NSTouchBar* touch_bar = [ControllerForNode(node) makeTouchBar]; - NSArray* touch_bar_items = [touch_bar itemIdentifiers]; - EXPECT_TRUE([touch_bar_items - containsObject:ui::GetTouchBarItemId(kBookmarkBubbleTouchBarId, - kRemoveTouchBarId)]); - EXPECT_TRUE([touch_bar_items - containsObject:ui::GetTouchBarItemId(kBookmarkBubbleTouchBarId, - kEditTouchBarId)]); - EXPECT_TRUE([touch_bar_items - containsObject:ui::GetTouchBarItemId(kBookmarkBubbleTouchBarId, - kDoneTouchBarId)]); - } -} - -} // namespace - -@implementation NSApplication (BookmarkBubbleUnitTest) -// Add handler for the editBookmarkNode: action to NSApp for testing purposes. -// Normally this would be sent up the responder tree correctly, but since -// tests run in the background, key window and main window are never set on -// NSApplication. Adding it to NSApplication directly removes the need for -// worrying about what the current window with focus is. -- (void)editBookmarkNode:(id)sender { - EXPECT_TRUE([sender respondsToSelector:@selector(node)]); - BookmarkBubbleControllerTest::edits_++; -} - -@end
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_base_controller.h b/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_base_controller.h deleted file mode 100644 index c80cbe0..0000000 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_base_controller.h +++ /dev/null
@@ -1,200 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_EDITOR_BASE_CONTROLLER_H_ -#define CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_EDITOR_BASE_CONTROLLER_H_ - -#import <Cocoa/Cocoa.h> - -#include <memory> - -#include "base/mac/availability.h" -#include "base/mac/scoped_nsobject.h" -#include "chrome/browser/ui/bookmarks/bookmark_editor.h" -#include "components/bookmarks/browser/bookmark_expanded_state_tracker.h" -#import "ui/base/cocoa/touch_bar_forward_declarations.h" - -class BookmarkEditorBaseControllerBridge; -@class BookmarkTreeBrowserCell; - -namespace bookmarks { -class BookmarkModel; -} - -// A base controller class for bookmark creation and editing dialogs which -// present the current bookmark folder structure in a tree view. Do not -// instantiate this controller directly -- use one of its derived classes. -// NOTE: If a derived class is intended to be dispatched via the -// BookmarkEditor::Show static function found in the accompanying -// implementation, that function will need to be update. -@interface BookmarkEditorBaseController - : NSWindowController<NSOutlineViewDelegate, NSTouchBarDelegate> { - @private - IBOutlet NSButton* newFolderButton_; - IBOutlet NSButton* okButton_; // Used for unit testing only. - IBOutlet NSTreeController* folderTreeController_; - IBOutlet NSOutlineView* folderTreeView_; - - NSWindow* parentWindow_; // weak - Profile* profile_; // weak - const bookmarks::BookmarkNode* parentNode_; // weak; owned by the model - GURL url_; // This and title_ are only used for new urls. - base::string16 title_; - BookmarkEditor::Configuration configuration_; - NSString* initialName_; - NSString* displayName_; // Bound to a text field in the dialog. - BOOL creatingNewFolders_; // True while in createNewFolders. - // An array of BookmarkFolderInfo where each item describes a folder in the - // BookmarkNode structure. - base::scoped_nsobject<NSArray> folderTreeArray_; - // Bound to the table view giving a path to the current selections, of which - // there should only ever be one. - base::scoped_nsobject<NSArray> tableSelectionPaths_; - // C++ bridge object that observes the BookmarkModel for me. - std::unique_ptr<BookmarkEditorBaseControllerBridge> observer_; -} - -@property(nonatomic, copy) NSString* initialName; -@property(nonatomic, copy) NSString* displayName; -@property(nonatomic, retain, readonly) NSArray* folderTreeArray; -@property(nonatomic, copy) NSArray* tableSelectionPaths; - -// Designated initializer. Derived classes should call through to this init. -// |url| and |title| are only used for BookmarkNode::Type::NEW_URL. -- (id)initWithParentWindow:(NSWindow*)parentWindow - nibName:(NSString*)nibName - profile:(Profile*)profile - parent:(const bookmarks::BookmarkNode*)parent - url:(const GURL&)url - title:(const base::string16&)title - configuration:(BookmarkEditor::Configuration)configuration; - -- (void)windowWillClose:(NSNotification*)notification; - -// Override to customize the touch bar. -- (NSTouchBar*)makeTouchBar API_AVAILABLE(macos(10.12.2)); - -// Run the bookmark editor as a modal sheet. Does not block. -- (void)runAsModalSheet; - -// Create a new folder at the end of the selected parent folder, give it -// an untitled name, and put it into editing mode. -- (IBAction)newFolder:(id)sender; - -// The cancel action will dismiss the dialog. Derived classes which -// override cancel:, must call this after accessing any dialog-related -// data. -- (IBAction)cancel:(id)sender; - -// The OK action will dismiss the dialog. This action is bound -// to the OK button of a dialog which presents a tree view of a profile's -// folder hierarchy and allows the creation of new folders within that tree. -// When the OK button is pressed, this function will: 1) call the derived -// class's -[willCommit] function, 2) create any new folders created by -// the user while the dialog is presented, 3) call the derived class's -// -[didCommit] function, and then 4) dismiss the dialog. At least one -// of -[willCommit] and -[didCommit] must be provided by the derived class -// and should return a NSNumber containing a BOOL or nil ('nil' means YES) -// indicating if the operation should be allowed to continue. -// Note: A derived class should not override the ok: action. -- (IBAction)ok:(id)sender; - -// Methods for use by derived classes only. - -// Determine and returns the rightmost selected/highlighted element (node) -// in the bookmark tree view if the tree view is showing, otherwise returns -// the original |parentNode_|. If the tree view is showing but nothing is -// selected then the root node is returned. -- (const bookmarks::BookmarkNode*)selectedNode; - -// Expands the set of BookmarkNodes in |nodes|. -- (void)expandNodes:( - const bookmarks::BookmarkExpandedStateTracker::Nodes&)nodes; - -// Returns the set of expanded BookmarkNodes. -- (bookmarks::BookmarkExpandedStateTracker::Nodes)getExpandedNodes; - -// Select/highlight the given node within the browser tree view. If the -// node is nil then select the bookmark bar node. Exposed for unit test. -- (void)selectNodeInBrowser:(const bookmarks::BookmarkNode*)node; - -// Notifications called when the BookmarkModel changes out from under me. -- (void)nodeRemoved:(const bookmarks::BookmarkNode*)node - fromParent:(const bookmarks::BookmarkNode*)parent; -- (void)modelChangedPreserveSelection:(BOOL)preserve; - -// Determines if the ok button should be enabled, can be overridden. -- (BOOL)okEnabled; - -// Accessors -- (bookmarks::BookmarkModel*)bookmarkModel; -- (Profile*)profile; -- (const bookmarks::BookmarkNode*)parentNode; -- (const GURL&)url; -- (const base::string16&)title; - -@end - -// Describes the profile's bookmark folder structure: the folder name, the -// original BookmarkNode pointer (if the folder already exists), a BOOL -// indicating if the folder is new (meaning: created during this session -// but not yet committed to the bookmark structure), and an NSArray of -// child folder BookmarkFolderInfo's following this same structure. -@interface BookmarkFolderInfo : NSObject { - @private - NSString* folderName_; - const bookmarks::BookmarkNode* folderNode_; // weak - NSMutableArray* children_; - BOOL newFolder_; -} - -@property(nonatomic, copy) NSString* folderName; -@property(nonatomic, assign) const bookmarks::BookmarkNode* folderNode; -@property(nonatomic, retain) NSMutableArray* children; -@property(nonatomic, assign) BOOL newFolder; - -// Convenience creator for adding a new folder to the editor's bookmark -// structure. This folder will be added to the bookmark model when the -// user accepts the dialog. |folderName| must be provided. -+ (id)bookmarkFolderInfoWithFolderName:(NSString*)folderName; - -// Designated initializer. |folderName| must be provided. For folders which -// already exist in the bookmark model, |folderNode| and |children| (if any -// children are already attached to this folder) must be provided and -// |newFolder| should be NO. For folders which the user has added during -// this session and which have not been committed yet, |newFolder| should be -// YES and |folderNode| and |children| should be NULL/nil. -- (id)initWithFolderName:(NSString*)folderName - folderNode:(const bookmarks::BookmarkNode*)folderNode - children:(NSMutableArray*)children - newFolder:(BOOL)newFolder; - -// Convenience creator used during construction of the editor's bookmark -// structure. |folderName| and |folderNode| must be provided. |children| -// is optional. Private: exposed here for unit testing purposes. -+ (id)bookmarkFolderInfoWithFolderName:(NSString*)folderName - folderNode: - (const bookmarks::BookmarkNode*)folderNode - children:(NSMutableArray*)children; - -@end - -@interface BookmarkEditorBaseController(TestingAPI) - -@property(nonatomic, readonly) BOOL okButtonEnabled; - -// Create any newly added folders. New folders are nodes in folderTreeArray -// which are marked as being new (i.e. their kFolderTreeNewFolderKey -// dictionary item is YES). This is called by -[ok:]. -- (void)createNewFolders; - -// Select the given bookmark node within the tree view. -- (void)selectTestNodeInBrowser:(const bookmarks::BookmarkNode*)node; - -// Return the dictionary for the folder selected in the tree. -- (BookmarkFolderInfo*)selectedFolder; - -@end - -#endif // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_EDITOR_BASE_CONTROLLER_H_
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_base_controller.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_base_controller.mm deleted file mode 100644 index 53e4063..0000000 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_base_controller.mm +++ /dev/null
@@ -1,803 +0,0 @@ -// Copyright (c) 2012 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 "chrome/browser/ui/cocoa/bookmarks/bookmark_editor_base_controller.h" - -#include "base/auto_reset.h" -#include "base/containers/stack.h" -#include "base/logging.h" -#include "base/mac/availability.h" -#include "base/mac/bundle_locations.h" -#include "base/mac/foundation_util.h" -#include "base/mac/mac_util.h" -#import "base/mac/sdk_forward_declarations.h" -#include "base/strings/sys_string_conversions.h" -#include "chrome/browser/bookmarks/bookmark_model_factory.h" -#include "chrome/browser/bookmarks/managed_bookmark_service_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/browser_dialogs.h" -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller.h" -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.h" -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_name_folder_controller.h" -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_tree_browser_cell.h" -#include "chrome/browser/ui/cocoa/browser_dialogs_views_mac.h" -#import "chrome/browser/ui/cocoa/browser_window_controller.h" -#include "chrome/common/chrome_features.h" -#include "chrome/grit/generated_resources.h" -#include "components/bookmarks/browser/bookmark_model.h" -#include "components/bookmarks/managed/managed_bookmark_service.h" -#include "components/strings/grit/components_strings.h" -#include "ui/base/cocoa/touch_bar_util.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/l10n/l10n_util_mac.h" -#include "ui/strings/grit/ui_strings.h" - -using bookmarks::BookmarkExpandedStateTracker; -using bookmarks::BookmarkModel; -using bookmarks::BookmarkNode; - -namespace { - -// Touch bar identifier. -NSString* const kBookmarkEditDialogTouchBarId = @"bookmark-edit-dialog"; - -// Touch bar item identifiers. -NSString* const kNewFolderTouchBarId = @"NEW-FOLDER"; -NSString* const kCancelTouchBarId = @"CANCEL"; -NSString* const kSaveTouchBarId = @"SAVE"; - -} // end namespace - -@interface BookmarkEditorBaseController () - -// Return the folder tree object for the given path. -- (BookmarkFolderInfo*)folderForIndexPath:(NSIndexPath*)path; - -// (Re)build the folder tree from the BookmarkModel's current state. -- (void)buildFolderTree; - -// Notifies the controller that the bookmark model has changed. -// |selection| specifies if the current selection should be -// maintained (usually YES). -- (void)modelChangedPreserveSelection:(BOOL)preserve; - -// Notifies the controller that a node has been removed. -- (void)nodeRemoved:(const BookmarkNode*)node - fromParent:(const BookmarkNode*)parent; - -// Given a folder node, collect an array containing BookmarkFolderInfos -// describing its subchildren which are also folders. -- (NSMutableArray*)addChildFoldersFromNode:(const BookmarkNode*)node; - -// Scan the folder tree stemming from the given tree folder and create -// any newly added folders. Pass down info for the folder which was -// selected before we began creating folders. -- (void)createNewFoldersForFolder:(BookmarkFolderInfo*)treeFolder - selectedFolderInfo:(BookmarkFolderInfo*)selectedFolderInfo; - -// Scan the folder tree looking for the given bookmark node and return -// the selection path thereto. -- (NSIndexPath*)selectionPathForNode:(const BookmarkNode*)node; - -// Implementation of getExpandedNodes. See description in header for details. -- (void)getExpandedNodes:(BookmarkExpandedStateTracker::Nodes*)nodes - folder:(BookmarkFolderInfo*)info - path:(std::vector<NSUInteger>*)path - root:(id)root; -@end - -// static; implemented for each platform. Update this function for new -// classes derived from BookmarkEditorBaseController. -void BookmarkEditor::Show(gfx::NativeWindow parent_window, - Profile* profile, - const EditDetails& details, - Configuration configuration) { - if (chrome::ShowAllDialogsWithViewsToolkit()) { - chrome::ShowBookmarkEditorViews(parent_window, profile, details, - configuration); - return; - } - - if (details.type == EditDetails::EXISTING_NODE && - details.existing_node->is_folder()) { - BookmarkNameFolderController* controller = - [[BookmarkNameFolderController alloc] - initWithParentWindow:parent_window - profile:profile - node:details.existing_node]; - [controller runAsModalSheet]; - return; - } - - if (details.type == EditDetails::NEW_FOLDER && details.urls.empty()) { - BookmarkNameFolderController* controller = - [[BookmarkNameFolderController alloc] - initWithParentWindow:parent_window - profile:profile - parent:details.parent_node - newIndex:details.index]; - [controller runAsModalSheet]; - return; - } - - BookmarkEditorBaseController* controller = nil; - if (details.type == EditDetails::NEW_FOLDER) { - controller = [[BookmarkAllTabsController alloc] - initWithParentWindow:parent_window - profile:profile - parent:details.parent_node - url:details.url - title:details.title - configuration:configuration]; - } else { - controller = [[BookmarkEditorController alloc] - initWithParentWindow:parent_window - profile:profile - parent:details.parent_node - node:details.existing_node - url:details.url - title:details.title - configuration:configuration]; - } - [controller runAsModalSheet]; -} - -// Adapter to tell BookmarkEditorBaseController when bookmarks change. -class BookmarkEditorBaseControllerBridge - : public bookmarks::BookmarkModelObserver { - public: - BookmarkEditorBaseControllerBridge(BookmarkEditorBaseController* controller) - : controller_(controller), - importing_(false) - { } - - // bookmarks::BookmarkModelObserver: - void BookmarkModelLoaded(BookmarkModel* model, bool ids_reassigned) override { - [controller_ modelChangedPreserveSelection:YES]; - } - - void BookmarkNodeMoved(BookmarkModel* model, - const BookmarkNode* old_parent, - int old_index, - const BookmarkNode* new_parent, - int new_index) override { - if (!importing_ && new_parent->GetChild(new_index)->is_folder()) - [controller_ modelChangedPreserveSelection:YES]; - } - - void BookmarkNodeAdded(BookmarkModel* model, - const BookmarkNode* parent, - int index) override { - if (!importing_ && parent->GetChild(index)->is_folder()) - [controller_ modelChangedPreserveSelection:YES]; - } - - void BookmarkNodeRemoved(BookmarkModel* model, - const BookmarkNode* parent, - int old_index, - const BookmarkNode* node, - const std::set<GURL>& removed_urls) override { - [controller_ nodeRemoved:node fromParent:parent]; - if (node->is_folder()) - [controller_ modelChangedPreserveSelection:NO]; - } - - void BookmarkAllUserNodesRemoved( - BookmarkModel* model, - const std::set<GURL>& removed_urls) override { - [controller_ modelChangedPreserveSelection:NO]; - } - - void BookmarkNodeChanged(BookmarkModel* model, - const BookmarkNode* node) override { - if (!importing_ && node->is_folder()) - [controller_ modelChangedPreserveSelection:YES]; - } - - void BookmarkNodeChildrenReordered(BookmarkModel* model, - const BookmarkNode* node) override { - if (!importing_) - [controller_ modelChangedPreserveSelection:YES]; - } - - void BookmarkNodeFaviconChanged(BookmarkModel* model, - const BookmarkNode* node) override { - // I care nothing for these 'favicons': I only show folders. - } - - void ExtensiveBookmarkChangesBeginning(BookmarkModel* model) override { - importing_ = true; - } - - // Invoked after a batch import finishes. This tells observers to update - // themselves if they were waiting for the update to finish. - void ExtensiveBookmarkChangesEnded(BookmarkModel* model) override { - importing_ = false; - [controller_ modelChangedPreserveSelection:YES]; - } - - private: - BookmarkEditorBaseController* controller_; // weak - bool importing_; -}; - - -#pragma mark - - -@implementation BookmarkEditorBaseController - -@synthesize initialName = initialName_; -@synthesize displayName = displayName_; - -- (id)initWithParentWindow:(NSWindow*)parentWindow - nibName:(NSString*)nibName - profile:(Profile*)profile - parent:(const BookmarkNode*)parent - url:(const GURL&)url - title:(const base::string16&)title - configuration:(BookmarkEditor::Configuration)configuration { - NSString* nibpath = [base::mac::FrameworkBundle() - pathForResource:nibName - ofType:@"nib"]; - if ((self = [super initWithWindowNibPath:nibpath owner:self])) { - parentWindow_ = parentWindow; - profile_ = profile; - parentNode_ = parent; - url_ = url; - title_ = title; - configuration_ = configuration; - initialName_ = [@"" retain]; - observer_.reset(new BookmarkEditorBaseControllerBridge(self)); - [self bookmarkModel]->AddObserver(observer_.get()); - } - return self; -} - -- (void)dealloc { - [self bookmarkModel]->RemoveObserver(observer_.get()); - [initialName_ release]; - [displayName_ release]; - [super dealloc]; -} - -- (void)awakeFromNib { - [self setDisplayName:[self initialName]]; - - if (configuration_ != BookmarkEditor::SHOW_TREE) { - // Remember the tree view's height; we will shrink our frame by that much. - NSRect frame = [[self window] frame]; - CGFloat browserHeight = [folderTreeView_ frame].size.height; - frame.size.height -= browserHeight; - frame.origin.y += browserHeight; - // Remove the folder tree and "new folder" button. - [folderTreeView_ removeFromSuperview]; - [newFolderButton_ removeFromSuperview]; - // Finally, commit the size change. - [[self window] setFrame:frame display:YES]; - } - - // Build up a tree of the current folder configuration. - [self buildFolderTree]; -} - -- (void)windowDidLoad { - if (configuration_ == BookmarkEditor::SHOW_TREE) { - [self selectNodeInBrowser:parentNode_]; - } -} - -/* TODO(jrg): -// Implementing this informal protocol allows us to open the sheet -// somewhere other than at the top of the window. NOTE: this means -// that I, the controller, am also the window's delegate. -- (NSRect)window:(NSWindow*)window willPositionSheet:(NSWindow*)sheet - usingRect:(NSRect)rect { - // adjust rect.origin.y to be the bottom of the toolbar - return rect; -} -*/ - -// TODO(jrg): consider NSModalSession. -- (void)runAsModalSheet { - // Lock down floating bar when in full-screen mode. Don't animate - // otherwise the pane will be misplaced. - [[BrowserWindowController browserWindowControllerForWindow:parentWindow_] - lockToolbarVisibilityForOwner:self - withAnimation:NO]; - [NSApp beginSheet:[self window] - modalForWindow:parentWindow_ - modalDelegate:self - didEndSelector:@selector(didEndSheet:returnCode:contextInfo:) - contextInfo:nil]; -} - -// This constant has to match the name of the method after it. -NSString* const kOkEnabledName = @"okEnabled"; -- (BOOL)okEnabled { - return YES; -} - -- (IBAction)ok:(id)sender { - NSWindow* window = [self window]; - [window makeFirstResponder:window]; - // At least one of these two functions should be provided by derived classes. - BOOL hasWillCommit = [self respondsToSelector:@selector(willCommit)]; - BOOL hasDidCommit = [self respondsToSelector:@selector(didCommit)]; - DCHECK(hasWillCommit || hasDidCommit); - BOOL shouldContinue = YES; - if (hasWillCommit) { - NSNumber* hasWillContinue = [self performSelector:@selector(willCommit)]; - if (hasWillContinue && [hasWillContinue isKindOfClass:[NSNumber class]]) - shouldContinue = [hasWillContinue boolValue]; - } - if (shouldContinue) - [self createNewFolders]; - if (hasDidCommit) { - NSNumber* hasDidContinue = [self performSelector:@selector(didCommit)]; - if (hasDidContinue && [hasDidContinue isKindOfClass:[NSNumber class]]) - shouldContinue = [hasDidContinue boolValue]; - } - if (shouldContinue) - [NSApp endSheet:window]; -} - -- (IBAction)cancel:(id)sender { - [NSApp endSheet:[self window]]; -} - -- (void)didEndSheet:(NSWindow*)sheet - returnCode:(int)returnCode - contextInfo:(void*)contextInfo { - [sheet close]; - [[BrowserWindowController browserWindowControllerForWindow:parentWindow_] - releaseToolbarVisibilityForOwner:self - withAnimation:YES]; -} - -- (void)windowWillClose:(NSNotification*)notification { - [self autorelease]; -} - -- (NSTouchBar*)makeTouchBar { - if (!base::FeatureList::IsEnabled(features::kDialogTouchBar)) - return nil; - - base::scoped_nsobject<NSTouchBar> touchBar([[ui::NSTouchBar() alloc] init]); - [touchBar setCustomizationIdentifier:ui::GetTouchBarId( - kBookmarkEditDialogTouchBarId)]; - [touchBar setDelegate:self]; - - NSArray* dialogItems = @[ - ui::GetTouchBarItemId(kBookmarkEditDialogTouchBarId, kNewFolderTouchBarId), - ui::GetTouchBarItemId(kBookmarkEditDialogTouchBarId, kCancelTouchBarId), - ui::GetTouchBarItemId(kBookmarkEditDialogTouchBarId, kSaveTouchBarId) - ]; - - [touchBar setDefaultItemIdentifiers:dialogItems]; - [touchBar setCustomizationAllowedItemIdentifiers:dialogItems]; - return touchBar.autorelease(); -} - -- (NSTouchBarItem*)touchBar:(NSTouchBar*)touchBar - makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier - API_AVAILABLE(macos(10.12.2)) { - NSButton* button = nil; - if ([identifier hasSuffix:kNewFolderTouchBarId]) { - button = - [NSButton buttonWithTitle:l10n_util::GetNSString( - IDS_BOOKMARK_EDITOR_NEW_FOLDER_BUTTON) - target:self - action:@selector(newFolder:)]; - } else if ([identifier hasSuffix:kCancelTouchBarId]) { - button = [NSButton buttonWithTitle:l10n_util::GetNSString(IDS_APP_CANCEL) - target:self - action:@selector(cancel:)]; - } else if ([identifier hasSuffix:kSaveTouchBarId]) { - button = ui::GetBlueTouchBarButton(l10n_util::GetNSString(IDS_SAVE), self, - @selector(ok:)); - } else { - return nil; - } - - base::scoped_nsobject<NSCustomTouchBarItem> item( - [[ui::NSCustomTouchBarItem() alloc] initWithIdentifier:identifier]); - [item setView:button]; - return item.autorelease(); -} - -#pragma mark Folder Tree Management - -- (BookmarkModel*)bookmarkModel { - return BookmarkModelFactory::GetForBrowserContext(profile_); -} - -- (Profile*)profile { - return profile_; -} - -- (const BookmarkNode*)parentNode { - return parentNode_; -} - -- (const GURL&)url { - return url_; -} - -- (const base::string16&)title{ - return title_; -} - -- (BookmarkFolderInfo*)folderForIndexPath:(NSIndexPath*)indexPath { - NSUInteger pathCount = [indexPath length]; - BookmarkFolderInfo* item = nil; - NSArray* treeNode = [self folderTreeArray]; - for (NSUInteger i = 0; i < pathCount; ++i) { - item = [treeNode objectAtIndex:[indexPath indexAtPosition:i]]; - treeNode = [item children]; - } - return item; -} - -- (NSIndexPath*)selectedIndexPath { - NSIndexPath* selectedIndexPath = nil; - NSArray* selections = [self tableSelectionPaths]; - if ([selections count]) { - DCHECK([selections count] == 1); // Should be exactly one selection. - selectedIndexPath = [selections objectAtIndex:0]; - } - return selectedIndexPath; -} - -- (BookmarkFolderInfo*)selectedFolder { - BookmarkFolderInfo* item = nil; - NSIndexPath* selectedIndexPath = [self selectedIndexPath]; - if (selectedIndexPath) { - item = [self folderForIndexPath:selectedIndexPath]; - } - return item; -} - -- (const BookmarkNode*)selectedNode { - const BookmarkNode* selectedNode = NULL; - // Determine a new parent node only if the browser is showing. - if (configuration_ == BookmarkEditor::SHOW_TREE) { - BookmarkFolderInfo* folderInfo = [self selectedFolder]; - if (folderInfo) - selectedNode = [folderInfo folderNode]; - } else { - // If the tree is not showing then we use the original parent. - selectedNode = parentNode_; - } - return selectedNode; -} - -- (void)expandNodes:(const BookmarkExpandedStateTracker::Nodes&)nodes { - id treeControllerRoot = [folderTreeController_ arrangedObjects]; - for (BookmarkExpandedStateTracker::Nodes::const_iterator i = nodes.begin(); - i != nodes.end(); ++i) { - NSIndexPath* path = [self selectionPathForNode:*i]; - id folderNode = [treeControllerRoot descendantNodeAtIndexPath:path]; - [folderTreeView_ expandItem:folderNode]; - } -} - -- (BookmarkExpandedStateTracker::Nodes)getExpandedNodes { - BookmarkExpandedStateTracker::Nodes nodes; - std::vector<NSUInteger> path; - NSArray* folderNodes = [self folderTreeArray]; - NSUInteger i = 0; - for (BookmarkFolderInfo* folder in folderNodes) { - path.push_back(i); - [self getExpandedNodes:&nodes - folder:folder - path:&path - root:[folderTreeController_ arrangedObjects]]; - path.clear(); - ++i; - } - return nodes; -} - -- (void)getExpandedNodes:(BookmarkExpandedStateTracker::Nodes*)nodes - folder:(BookmarkFolderInfo*)folder - path:(std::vector<NSUInteger>*)path - root:(id)root { - NSIndexPath* indexPath = [NSIndexPath indexPathWithIndexes:&(path->front()) - length:path->size()]; - id node = [root descendantNodeAtIndexPath:indexPath]; - if (![folderTreeView_ isItemExpanded:node]) - return; - nodes->insert([folder folderNode]); - NSArray* children = [folder children]; - NSUInteger i = 0; - for (BookmarkFolderInfo* childFolder in children) { - path->push_back(i); - [self getExpandedNodes:nodes folder:childFolder path:path root:root]; - path->pop_back(); - ++i; - } -} - -- (NSArray*)folderTreeArray { - return folderTreeArray_.get(); -} - -- (NSArray*)tableSelectionPaths { - return tableSelectionPaths_.get(); -} - -- (void)setTableSelectionPath:(NSIndexPath*)tableSelectionPath { - [self setTableSelectionPaths:[NSArray arrayWithObject:tableSelectionPath]]; -} - -- (void)setTableSelectionPaths:(NSArray*)tableSelectionPaths { - tableSelectionPaths_.reset([tableSelectionPaths retain]); -} - -- (void)selectNodeInBrowser:(const BookmarkNode*)node { - DCHECK(configuration_ == BookmarkEditor::SHOW_TREE); - NSIndexPath* selectionPath = [self selectionPathForNode:node]; - [self willChangeValueForKey:kOkEnabledName]; - [self setTableSelectionPath:selectionPath]; - [self didChangeValueForKey:kOkEnabledName]; -} - -- (NSIndexPath*)selectionPathForNode:(const BookmarkNode*)desiredNode { - // Back up the parent chain for desiredNode, building up a stack - // of ancestor nodes. Then crawl down the folderTreeArray looking - // for each ancestor in order while building up the selectionPath. - base::stack<const BookmarkNode*> nodeStack; - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile_); - const BookmarkNode* rootNode = model->root_node(); - const BookmarkNode* node = desiredNode; - while (node != rootNode) { - DCHECK(node); - nodeStack.push(node); - node = node->parent(); - } - NSUInteger stackSize = nodeStack.size(); - - NSIndexPath* path = nil; - NSArray* folders = [self folderTreeArray]; - while (!nodeStack.empty()) { - node = nodeStack.top(); - nodeStack.pop(); - // Find node in the current folders array. - NSUInteger i = 0; - for (BookmarkFolderInfo *folderInfo in folders) { - const BookmarkNode* testNode = [folderInfo folderNode]; - if (testNode == node) { - path = path ? [path indexPathByAddingIndex:i] : - [NSIndexPath indexPathWithIndex:i]; - folders = [folderInfo children]; - break; - } - ++i; - } - } - DCHECK([path length] == stackSize); - return path; -} - -- (NSMutableArray*)addChildFoldersFromNode:(const BookmarkNode*)node { - bookmarks::ManagedBookmarkService* managed = - ManagedBookmarkServiceFactory::GetForProfile(profile_); - NSMutableArray* childFolders = nil; - int childCount = node->child_count(); - for (int i = 0; i < childCount; ++i) { - const BookmarkNode* childNode = node->GetChild(i); - if (childNode->is_folder() && childNode->IsVisible() && - managed->CanBeEditedByUser(childNode)) { - NSString* childName = base::SysUTF16ToNSString(childNode->GetTitle()); - NSMutableArray* children = [self addChildFoldersFromNode:childNode]; - BookmarkFolderInfo* folderInfo = - [BookmarkFolderInfo bookmarkFolderInfoWithFolderName:childName - folderNode:childNode - children:children]; - if (!childFolders) - childFolders = [NSMutableArray arrayWithObject:folderInfo]; - else - [childFolders addObject:folderInfo]; - } - } - return childFolders; -} - -- (void)buildFolderTree { - // Build up a tree of the current folder configuration. - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile_); - const BookmarkNode* rootNode = model->root_node(); - NSMutableArray* baseArray = [self addChildFoldersFromNode:rootNode]; - DCHECK(baseArray); - [self willChangeValueForKey:@"folderTreeArray"]; - folderTreeArray_.reset([baseArray retain]); - [self didChangeValueForKey:@"folderTreeArray"]; -} - -- (void)modelChangedPreserveSelection:(BOOL)preserve { - if (creatingNewFolders_) - return; - const BookmarkNode* selectedNode = [self selectedNode]; - [self buildFolderTree]; - if (preserve && - selectedNode && - configuration_ == BookmarkEditor::SHOW_TREE) - [self selectNodeInBrowser:selectedNode]; -} - -- (void)nodeRemoved:(const BookmarkNode*)node - fromParent:(const BookmarkNode*)parent { - if (node->is_folder()) { - if (parentNode_ == node || parentNode_->HasAncestor(node)) { - parentNode_ = [self bookmarkModel]->bookmark_bar_node(); - if (configuration_ != BookmarkEditor::SHOW_TREE) { - // The user can't select a different folder, so just close up shop. - [self cancel:self]; - return; - } - } - - if (configuration_ == BookmarkEditor::SHOW_TREE) { - // For safety's sake, in case deleted node was an ancestor of selection, - // go back to a known safe place. - [self selectNodeInBrowser:parentNode_]; - } - } -} - -#pragma mark New Folder Handler - -- (void)createNewFoldersForFolder:(BookmarkFolderInfo*)folderInfo - selectedFolderInfo:(BookmarkFolderInfo*)selectedFolderInfo { - NSArray* subfolders = [folderInfo children]; - const BookmarkNode* parentNode = [folderInfo folderNode]; - DCHECK(parentNode); - NSUInteger i = 0; - for (BookmarkFolderInfo* subFolderInfo in subfolders) { - if ([subFolderInfo newFolder]) { - BookmarkModel* model = [self bookmarkModel]; - const BookmarkNode* newFolder = - model->AddFolder(parentNode, i, - base::SysNSStringToUTF16([subFolderInfo folderName])); - // Update our dictionary with the actual folder node just created. - [subFolderInfo setFolderNode:newFolder]; - [subFolderInfo setNewFolder:NO]; - } - [self createNewFoldersForFolder:subFolderInfo - selectedFolderInfo:selectedFolderInfo]; - ++i; - } -} - -- (IBAction)newFolder:(id)sender { - // Create a new folder off of the selected folder node. - BookmarkFolderInfo* parentInfo = [self selectedFolder]; - if (parentInfo) { - NSIndexPath* selection = [self selectedIndexPath]; - NSString* newFolderName = - l10n_util::GetNSStringWithFixup(IDS_BOOKMARK_EDITOR_NEW_FOLDER_NAME); - BookmarkFolderInfo* folderInfo = - [BookmarkFolderInfo bookmarkFolderInfoWithFolderName:newFolderName]; - [self willChangeValueForKey:@"folderTreeArray"]; - NSMutableArray* children = [parentInfo children]; - if (children) { - [children addObject:folderInfo]; - } else { - children = [NSMutableArray arrayWithObject:folderInfo]; - [parentInfo setChildren:children]; - } - [self didChangeValueForKey:@"folderTreeArray"]; - - // Expose the parent folder children. - [folderTreeView_ expandItem:parentInfo]; - - // Select the new folder node and put the folder name into edit mode. - selection = [selection indexPathByAddingIndex:[children count] - 1]; - [self setTableSelectionPath:selection]; - NSInteger row = [folderTreeView_ selectedRow]; - DCHECK(row >= 0); - - // Put the cell into single-line mode before putting it into edit mode. - NSCell* folderCell = [folderTreeView_ preparedCellAtColumn:0 row:row]; - [folderCell setUsesSingleLineMode:YES]; - - [folderTreeView_ editColumn:0 row:row withEvent:nil select:YES]; - } -} - -- (void)createNewFolders { - base::AutoReset<BOOL> creatingNewFoldersSetter(&creatingNewFolders_, YES); - // Scan the tree looking for nodes marked 'newFolder' and create those nodes. - NSArray* folderTreeArray = [self folderTreeArray]; - for (BookmarkFolderInfo *folderInfo in folderTreeArray) { - [self createNewFoldersForFolder:folderInfo - selectedFolderInfo:[self selectedFolder]]; - } -} - -#pragma mark For Unit Test Use Only - -- (BOOL)okButtonEnabled { - return [okButton_ isEnabled]; -} - -- (void)selectTestNodeInBrowser:(const BookmarkNode*)node { - [self selectNodeInBrowser:node]; -} - -- (BOOL)outlineView:(NSOutlineView*)outlineView - shouldEditTableColumn:(NSTableColumn*)tableColumn - item:(id)item { - BookmarkFolderInfo* info = - base::mac::ObjCCast<BookmarkFolderInfo>([item representedObject]); - return info.newFolder; -} - -@end // BookmarkEditorBaseController - -@implementation BookmarkFolderInfo - -@synthesize folderName = folderName_; -@synthesize folderNode = folderNode_; -@synthesize children = children_; -@synthesize newFolder = newFolder_; - -+ (id)bookmarkFolderInfoWithFolderName:(NSString*)folderName - folderNode:(const BookmarkNode*)folderNode - children:(NSMutableArray*)children { - return [[[BookmarkFolderInfo alloc] initWithFolderName:folderName - folderNode:folderNode - children:children - newFolder:NO] - autorelease]; -} - -+ (id)bookmarkFolderInfoWithFolderName:(NSString*)folderName { - return [[[BookmarkFolderInfo alloc] initWithFolderName:folderName - folderNode:NULL - children:nil - newFolder:YES] - autorelease]; -} - -- (id)initWithFolderName:(NSString*)folderName - folderNode:(const BookmarkNode*)folderNode - children:(NSMutableArray*)children - newFolder:(BOOL)newFolder { - if ((self = [super init])) { - // A folderName is always required, and if newFolder is NO then there - // should be a folderNode. Children is optional. - DCHECK(folderName && (newFolder || folderNode)); - if (folderName && (newFolder || folderNode)) { - folderName_ = [folderName copy]; - folderNode_ = folderNode; - children_ = [children retain]; - newFolder_ = newFolder; - } else { - NOTREACHED(); // Invalid init. - [self release]; - self = nil; - } - } - return self; -} - -- (id)init { - NOTREACHED(); // Should never be called. - return [self initWithFolderName:nil folderNode:nil children:nil newFolder:NO]; -} - -- (void)dealloc { - [folderName_ release]; - [children_ release]; - [super dealloc]; -} - -// Implementing isEqual: allows the NSTreeController to preserve the selection -// and open/shut state of outline items when the data changes. -- (BOOL)isEqual:(id)other { - return [other isKindOfClass:[BookmarkFolderInfo class]] && - folderNode_ == [(BookmarkFolderInfo*)other folderNode]; -} -@end
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_base_controller_unittest.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_base_controller_unittest.mm deleted file mode 100644 index 43754424..0000000 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_base_controller_unittest.mm +++ /dev/null
@@ -1,319 +0,0 @@ -// Copyright (c) 2012 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 <Cocoa/Cocoa.h> - -#include "base/mac/mac_util.h" -#include "base/strings/sys_string_conversions.h" -#include "base/strings/utf_string_conversions.h" -#include "base/test/scoped_feature_list.h" -#include "chrome/browser/bookmarks/bookmark_model_factory.h" -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.h" -#include "chrome/browser/ui/cocoa/test/cocoa_profile_test.h" -#include "chrome/common/chrome_features.h" -#include "chrome/test/base/test_browser_window.h" -#include "chrome/test/base/testing_profile.h" -#include "components/bookmarks/browser/bookmark_model.h" -#include "components/strings/grit/components_strings.h" -#include "testing/gtest/include/gtest/gtest.h" -#import "testing/gtest_mac.h" -#include "testing/platform_test.h" -#import "ui/base/cocoa/touch_bar_forward_declarations.h" -#import "ui/base/cocoa/touch_bar_util.h" -#include "ui/base/l10n/l10n_util_mac.h" - -using base::ASCIIToUTF16; -using bookmarks::BookmarkExpandedStateTracker; -using bookmarks::BookmarkModel; -using bookmarks::BookmarkNode; - -namespace { - -// Touch bar identifier. -NSString* const kBookmarkEditDialogTouchBarId = @"bookmark-edit-dialog"; - -// Touch bar item identifiers. -NSString* const kNewFolderTouchBarId = @"NEW-FOLDER"; -NSString* const kCancelTouchBarId = @"CANCEL"; -NSString* const kSaveTouchBarId = @"SAVE"; - -} // end namespace - -class BookmarkEditorBaseControllerTest : public CocoaProfileTest { - public: - BookmarkEditorBaseController* controller_; // weak - const BookmarkNode* folder_a_; - const BookmarkNode* folder_b_; - const BookmarkNode* folder_b_0_; - const BookmarkNode* folder_b_3_; - const BookmarkNode* folder_c_; - - void CreateModel() { - // Set up a small bookmark hierarchy, which will look as follows: - // a b c d - // a-0 b-0 c-0 - // a-1 b-00 c-1 - // a-2 b-1 c-2 - // b-2 c-3 - // b-3 - // b-30 - // b-31 - // b-4 - BookmarkModel* model = - BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* root = model->bookmark_bar_node(); - folder_a_ = model->AddFolder(root, 0, ASCIIToUTF16("a")); - model->AddURL(folder_a_, 0, ASCIIToUTF16("a-0"), GURL("http://a-0.com")); - model->AddURL(folder_a_, 1, ASCIIToUTF16("a-1"), GURL("http://a-1.com")); - model->AddURL(folder_a_, 2, ASCIIToUTF16("a-2"), GURL("http://a-2.com")); - - folder_b_ = model->AddFolder(root, 1, ASCIIToUTF16("b")); - folder_b_0_ = model->AddFolder(folder_b_, 0, ASCIIToUTF16("b-0")); - model->AddURL(folder_b_0_, 0, ASCIIToUTF16("bb-0"), - GURL("http://bb-0.com")); - model->AddURL(folder_b_, 1, ASCIIToUTF16("b-1"), GURL("http://b-1.com")); - model->AddURL(folder_b_, 2, ASCIIToUTF16("b-2"), GURL("http://b-2.com")); - folder_b_3_ = model->AddFolder(folder_b_, 3, ASCIIToUTF16("b-3")); - model->AddURL(folder_b_3_, 0, ASCIIToUTF16("b-30"), - GURL("http://b-30.com")); - model->AddURL(folder_b_3_, 1, ASCIIToUTF16("b-31"), - GURL("http://b-31.com")); - model->AddURL(folder_b_, 4, ASCIIToUTF16("b-4"), GURL("http://b-4.com")); - - folder_c_ = model->AddFolder(root, 2, ASCIIToUTF16("c")); - model->AddURL(folder_c_, 0, ASCIIToUTF16("c-0"), GURL("http://c-0.com")); - model->AddURL(folder_c_, 1, ASCIIToUTF16("c-1"), GURL("http://c-1.com")); - model->AddURL(folder_c_, 2, ASCIIToUTF16("c-2"), GURL("http://c-2.com")); - model->AddURL(folder_c_, 3, ASCIIToUTF16("c-3"), GURL("http://c-3.com")); - model->AddFolder(folder_c_, 4, ASCIIToUTF16("c-4")); - - model->AddURL(root, 3, ASCIIToUTF16("d"), GURL("http://d-0.com")); - } - - virtual BookmarkEditorBaseController* CreateController() { - return [[BookmarkEditorBaseController alloc] - initWithParentWindow:test_window() - nibName:@"BookmarkAllTabs" - profile:profile() - parent:folder_b_0_ - url:GURL() - title:base::string16() - configuration:BookmarkEditor::SHOW_TREE]; - } - - void SetUp() override { - CocoaProfileTest::SetUp(); - ASSERT_TRUE(profile()); - - CreateModel(); - controller_ = CreateController(); - EXPECT_TRUE([controller_ window]); - [controller_ runAsModalSheet]; - } - - void TearDown() override { - controller_ = NULL; - CocoaTest::TearDown(); - } - - Browser* CreateBrowser() override { - Browser::CreateParams params(profile(), true); - return CreateBrowserWithTestWindowForParams(¶ms).release(); - } -}; - -TEST_F(BookmarkEditorBaseControllerTest, VerifyBookmarkTestModel) { - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* root = model->bookmark_bar_node(); - EXPECT_EQ(4, root->child_count()); - // a - const BookmarkNode* child = root->GetChild(0); - EXPECT_EQ(3, child->child_count()); - const BookmarkNode* subchild = child->GetChild(0); - EXPECT_EQ(0, subchild->child_count()); - subchild = child->GetChild(1); - EXPECT_EQ(0, subchild->child_count()); - subchild = child->GetChild(2); - EXPECT_EQ(0, subchild->child_count()); - // b - child = root->GetChild(1); - EXPECT_EQ(5, child->child_count()); - subchild = child->GetChild(0); - EXPECT_EQ(1, subchild->child_count()); - const BookmarkNode* subsubchild = subchild->GetChild(0); - EXPECT_EQ(0, subsubchild->child_count()); - subchild = child->GetChild(1); - EXPECT_EQ(0, subchild->child_count()); - subchild = child->GetChild(2); - EXPECT_EQ(0, subchild->child_count()); - subchild = child->GetChild(3); - EXPECT_EQ(2, subchild->child_count()); - subsubchild = subchild->GetChild(0); - EXPECT_EQ(0, subsubchild->child_count()); - subsubchild = subchild->GetChild(1); - EXPECT_EQ(0, subsubchild->child_count()); - subchild = child->GetChild(4); - EXPECT_EQ(0, subchild->child_count()); - // c - child = root->GetChild(2); - EXPECT_EQ(5, child->child_count()); - subchild = child->GetChild(0); - EXPECT_EQ(0, subchild->child_count()); - subchild = child->GetChild(1); - EXPECT_EQ(0, subchild->child_count()); - subchild = child->GetChild(2); - EXPECT_EQ(0, subchild->child_count()); - subchild = child->GetChild(3); - EXPECT_EQ(0, subchild->child_count()); - subchild = child->GetChild(4); - EXPECT_EQ(0, subchild->child_count()); - // d - child = root->GetChild(3); - EXPECT_EQ(0, child->child_count()); - [controller_ cancel:nil]; -} - -TEST_F(BookmarkEditorBaseControllerTest, NodeSelection) { - EXPECT_TRUE([controller_ folderTreeArray]); - [controller_ selectTestNodeInBrowser:folder_b_3_]; - const BookmarkNode* node = [controller_ selectedNode]; - EXPECT_EQ(node, folder_b_3_); - [controller_ cancel:nil]; -} - -TEST_F(BookmarkEditorBaseControllerTest, CreateFolder) { - EXPECT_EQ(2, folder_b_3_->child_count()); - [controller_ selectTestNodeInBrowser:folder_b_3_]; - NSString* expectedName = - l10n_util::GetNSStringWithFixup(IDS_BOOKMARK_EDITOR_NEW_FOLDER_NAME); - [controller_ setDisplayName:expectedName]; - [controller_ newFolder:nil]; - NSArray* selectionPaths = [controller_ tableSelectionPaths]; - EXPECT_EQ(1U, [selectionPaths count]); - NSIndexPath* selectionPath = [selectionPaths objectAtIndex:0]; - EXPECT_EQ(4U, [selectionPath length]); - BookmarkFolderInfo* newFolderInfo = [controller_ selectedFolder]; - EXPECT_TRUE(newFolderInfo); - NSString* newFolderName = [newFolderInfo folderName]; - EXPECT_NSEQ(expectedName, newFolderName); - [controller_ createNewFolders]; - // Verify that the tab folder was added to the new folder. - EXPECT_EQ(3, folder_b_3_->child_count()); - [controller_ cancel:nil]; -} - -TEST_F(BookmarkEditorBaseControllerTest, CreateTwoFolders) { - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* bar = model->bookmark_bar_node(); - // Create 2 folders which are children of the bar. - [controller_ selectTestNodeInBrowser:bar]; - [controller_ newFolder:nil]; - [controller_ selectTestNodeInBrowser:bar]; - [controller_ newFolder:nil]; - // If we do NOT crash on createNewFolders, success! - // (e.g. http://crbug.com/47877 is fixed). - [controller_ createNewFolders]; - [controller_ cancel:nil]; -} - -TEST_F(BookmarkEditorBaseControllerTest, SelectedFolderDeleted) { - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile()); - [controller_ selectTestNodeInBrowser:folder_b_3_]; - EXPECT_EQ(folder_b_3_, [controller_ selectedNode]); - - // Delete the selected node, and verify it's no longer selected: - model->Remove(folder_b_->GetChild(3)); - EXPECT_NE(folder_b_3_, [controller_ selectedNode]); - - [controller_ cancel:nil]; -} - -TEST_F(BookmarkEditorBaseControllerTest, SelectedFoldersParentDeleted) { - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* root = model->bookmark_bar_node(); - [controller_ selectTestNodeInBrowser:folder_b_3_]; - EXPECT_EQ(folder_b_3_, [controller_ selectedNode]); - - // Delete the selected node's parent, and verify it's no longer selected: - model->Remove(root->GetChild(1)); - EXPECT_NE(folder_b_3_, [controller_ selectedNode]); - - [controller_ cancel:nil]; -} - -TEST_F(BookmarkEditorBaseControllerTest, FolderAdded) { - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* root = model->bookmark_bar_node(); - - // Add a folder node to the model, and verify it can be selected in the tree: - const BookmarkNode* folder_added = model->AddFolder( - root, 0, ASCIIToUTF16("added")); - [controller_ selectTestNodeInBrowser:folder_added]; - EXPECT_EQ(folder_added, [controller_ selectedNode]); - - [controller_ cancel:nil]; -} - -// Verifies expandeNodes and getExpandedNodes. -TEST_F(BookmarkEditorBaseControllerTest, ExpandedState) { - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile()); - - // Sets up the state we're going to expand. - BookmarkExpandedStateTracker::Nodes nodes; - nodes.insert(model->bookmark_bar_node()); - nodes.insert(folder_b_); - nodes.insert(folder_c_); - - // Initial state shouldn't match expected state, otherwise this test isn't - // really going to test anything. - BookmarkExpandedStateTracker::Nodes actual = [controller_ getExpandedNodes]; - EXPECT_NE(actual, nodes); - - [controller_ expandNodes:nodes]; - - actual = [controller_ getExpandedNodes]; - - EXPECT_EQ(nodes, actual); - - [controller_ cancel:nil]; -} - -// Verifies the dialog's touch bar. -TEST_F(BookmarkEditorBaseControllerTest, TouchBar) { - if (@available(macOS 10.12.2, *)) { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(features::kDialogTouchBar); - - NSTouchBar* touch_bar = [controller_ makeTouchBar]; - NSArray* touch_bar_items = [touch_bar itemIdentifiers]; - EXPECT_TRUE([touch_bar_items - containsObject:ui::GetTouchBarItemId(kBookmarkEditDialogTouchBarId, - kNewFolderTouchBarId)]); - EXPECT_TRUE([touch_bar_items - containsObject:ui::GetTouchBarItemId(kBookmarkEditDialogTouchBarId, - kCancelTouchBarId)]); - EXPECT_TRUE([touch_bar_items - containsObject:ui::GetTouchBarItemId(kBookmarkEditDialogTouchBarId, - kSaveTouchBarId)]); - } - - [controller_ cancel:nil]; -} - -class BookmarkFolderInfoTest : public CocoaTest { }; - -TEST_F(BookmarkFolderInfoTest, Construction) { - NSMutableArray* children = [NSMutableArray arrayWithObject:@"child"]; - // We just need a pointer, and any pointer will do. - const BookmarkNode* fakeNode = - reinterpret_cast<const BookmarkNode*>(&children); - BookmarkFolderInfo* info = - [BookmarkFolderInfo bookmarkFolderInfoWithFolderName:@"name" - folderNode:fakeNode - children:children]; - EXPECT_TRUE(info); - EXPECT_EQ([info folderName], @"name"); - EXPECT_EQ([info children], children); - EXPECT_EQ([info folderNode], fakeNode); -}
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.h b/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.h deleted file mode 100644 index 6f7aacc..0000000 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.h +++ /dev/null
@@ -1,43 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_EDITOR_CONTROLLER_H_ -#define CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_EDITOR_CONTROLLER_H_ - -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_editor_base_controller.h" - -@class DialogTextFieldEditor; - -// A controller for the bookmark editor, opened by 1) Edit... from the -// context menu of a bookmark button, and 2) Bookmark this Page...'s Edit -// button. -@interface BookmarkEditorController : BookmarkEditorBaseController { - @private - const bookmarks::BookmarkNode* node_; // weak; owned by the model - base::scoped_nsobject<NSString> initialUrl_; - NSString* displayURL_; // Bound to a text field in the dialog. - IBOutlet NSTextField* urlField_; - IBOutlet NSTextField* nameTextField_; - - // Field editor for |urlField_| and |nameTextField_|. - base::scoped_nsobject<DialogTextFieldEditor> touchBarFieldEditor_; -} - -@property(nonatomic, copy) NSString* displayURL; - -- (id)initWithParentWindow:(NSWindow*)parentWindow - profile:(Profile*)profile - parent:(const bookmarks::BookmarkNode*)parent - node:(const bookmarks::BookmarkNode*)node - url:(const GURL&)url - title:(const base::string16&)title - configuration:(BookmarkEditor::Configuration)configuration; - -@end - -@interface BookmarkEditorController (UnitTesting) -- (NSColor *)urlFieldColor; -@end - -#endif // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_EDITOR_CONTROLLER_H_
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.mm deleted file mode 100644 index b37ba22..0000000 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.mm +++ /dev/null
@@ -1,183 +0,0 @@ -// Copyright (c) 2011 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 "chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.h" - -#include "base/strings/string16.h" -#include "base/strings/sys_string_conversions.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/bookmarks/bookmark_utils.h" -#import "chrome/browser/ui/cocoa/dialog_text_field_editor.h" -#include "chrome/common/chrome_features.h" -#include "components/bookmarks/browser/bookmark_expanded_state_tracker.h" -#include "components/bookmarks/browser/bookmark_model.h" -#include "components/url_formatter/url_fixer.h" -#include "components/user_prefs/user_prefs.h" - -using bookmarks::BookmarkExpandedStateTracker; -using bookmarks::BookmarkModel; -using bookmarks::BookmarkNode; - -@interface BookmarkEditorController (Private) - -// Grab the url from the text field and convert. -- (GURL)GURLFromUrlField; - -@end - -@implementation BookmarkEditorController - -@synthesize displayURL = displayURL_; - -+ (NSSet*)keyPathsForValuesAffectingOkEnabled { - return [NSSet setWithObject:@"displayURL"]; -} - -- (id)initWithParentWindow:(NSWindow*)parentWindow - profile:(Profile*)profile - parent:(const BookmarkNode*)parent - node:(const BookmarkNode*)node - url:(const GURL&)url - title:(const base::string16&)title - configuration:(BookmarkEditor::Configuration)configuration { - if ((self = [super initWithParentWindow:parentWindow - nibName:@"BookmarkEditor" - profile:profile - parent:parent - url:url - title:title - configuration:configuration])) { - // "Add Page..." has no "node" so this may be NULL. - node_ = node; - touchBarFieldEditor_.reset([[DialogTextFieldEditor alloc] init]); - } - return self; -} - -- (void)dealloc { - [displayURL_ release]; - [super dealloc]; -} - -- (void)awakeFromNib { - NSTextFieldCell* nameFieldCell_ = [nameTextField_ cell]; - [nameFieldCell_ setUsesSingleLineMode:YES]; - - // Set text fields to match our bookmark. If the node is NULL we arrived here - // from an "Add Page..." item in a context menu. - if (node_) { - [self setInitialName:base::SysUTF16ToNSString(node_->GetTitle())]; - base::string16 urlString = - chrome::FormatBookmarkURLForDisplay(node_->url()); - initialUrl_.reset([base::SysUTF16ToNSString(urlString) retain]); - } else { - GURL url = [self url]; - [self setInitialName:base::SysUTF16ToNSString([self title])]; - if (url.is_valid()) - initialUrl_.reset([[NSString stringWithUTF8String:url.spec().c_str()] - retain]); - } - [self setDisplayURL:initialUrl_]; - [super awakeFromNib]; - [self expandNodes: - [self bookmarkModel]->expanded_state_tracker()->GetExpandedNodes()]; -} - -- (void)windowWillClose:(NSNotification*)notification { - [touchBarFieldEditor_ setFieldEditor:NO]; - touchBarFieldEditor_.reset(); - [super windowWillClose:notification]; -} - -- (id)windowWillReturnFieldEditor:(NSWindow*)sender toObject:(id)obj { - if (!base::FeatureList::IsEnabled(features::kDialogTouchBar)) - return nil; - - if (obj == urlField_ || obj == nameTextField_) - return touchBarFieldEditor_.get(); - - return nil; -} - -- (void)nodeRemoved:(const BookmarkNode*)node - fromParent:(const BookmarkNode*)parent -{ - // Be conservative; it is needed (e.g. "Add Page...") - node_ = NULL; - [self cancel:self]; -} - -#pragma mark Bookmark Editing - -// If possible, return a valid GURL from the URL text field. -- (GURL)GURLFromUrlField { - NSString* url = [self displayURL]; - return url_formatter::FixupURL([url UTF8String], std::string()); -} - -// Enable the OK button if there is a valid URL. -- (BOOL)okEnabled { - BOOL okEnabled = NO; - if ([[self displayURL] length]) { - GURL newURL = [self GURLFromUrlField]; - okEnabled = (newURL.is_valid()) ? YES : NO; - } - if (okEnabled) - [urlField_ setBackgroundColor:[NSColor whiteColor]]; - else - [urlField_ setBackgroundColor:[NSColor colorWithCalibratedRed:1.0 - green:0.67 - blue:0.67 - alpha:1.0]]; - return okEnabled; -} - -// The bookmark's URL is assumed to be valid (otherwise the OK button -// should not be enabled). Previously existing bookmarks for which the -// parent has not changed are updated in-place. Those for which the parent -// has changed are removed with a new node created under the new parent. -// Called by -[BookmarkEditorBaseController ok:]. -- (NSNumber*)didCommit { - NSString* name = [[self displayName] stringByTrimmingCharactersInSet: - [NSCharacterSet newlineCharacterSet]]; - base::string16 newTitle = base::SysNSStringToUTF16(name); - const BookmarkNode* newParentNode = [self selectedNode]; - GURL newURL = [self GURLFromUrlField]; - if (!newURL.is_valid()) { - // Shouldn't be reached -- OK button should be disabled if not valid! - NOTREACHED(); - return [NSNumber numberWithBool:NO]; - } - - // Determine where the new/replacement bookmark is to go. - BookmarkModel* model = [self bookmarkModel]; - // If there was an old node then we update the node, and move it to its new - // parent if the parent has changed (rather than deleting it from the old - // parent and adding to the new -- which also prevents the 'poofing' that - // occurs when a node is deleted). - if (node_) { - model->SetURL(node_, newURL); - model->SetTitle(node_, newTitle); - const BookmarkNode* oldParentNode = [self parentNode]; - if (newParentNode != oldParentNode) - model->Move(node_, newParentNode, newParentNode->child_count()); - } else { - // Otherwise, add a new bookmark at the end of the newly selected folder. - model->AddURL(newParentNode, newParentNode->child_count(), newTitle, - newURL); - } - - // Update the expanded state. - BookmarkExpandedStateTracker::Nodes expanded_nodes = [self getExpandedNodes]; - [self bookmarkModel]->expanded_state_tracker()-> - SetExpandedNodes(expanded_nodes); - return [NSNumber numberWithBool:YES]; -} - -- (NSColor *)urlFieldColor { - return [urlField_ backgroundColor]; -} - -@end // BookmarkEditorController -
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller_unittest.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller_unittest.mm deleted file mode 100644 index 13b0c00..0000000 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller_unittest.mm +++ /dev/null
@@ -1,528 +0,0 @@ -// Copyright (c) 2012 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 <Cocoa/Cocoa.h> - -#include "base/strings/string16.h" -#include "base/strings/sys_string_conversions.h" -#include "base/strings/utf_string_conversions.h" -#include "chrome/browser/bookmarks/bookmark_model_factory.h" -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.h" -#include "chrome/browser/ui/cocoa/test/cocoa_profile_test.h" -#include "chrome/test/base/testing_profile.h" -#include "components/bookmarks/browser/bookmark_model.h" -#include "testing/gtest/include/gtest/gtest.h" -#import "testing/gtest_mac.h" -#include "testing/platform_test.h" - -using base::ASCIIToUTF16; -using bookmarks::BookmarkModel; -using bookmarks::BookmarkNode; - -class BookmarkEditorControllerTest : public CocoaProfileTest { - public: - const BookmarkNode* default_node_; - const BookmarkNode* default_parent_; - const char* default_name_; - base::string16 default_title_; - BookmarkEditorController* controller_; - - void SetUp() override { - CocoaProfileTest::SetUp(); - ASSERT_TRUE(profile()); - - BookmarkModel* model = - BookmarkModelFactory::GetForBrowserContext(profile()); - default_parent_ = model->bookmark_bar_node(); - default_name_ = "http://www.zim-bop-a-dee.com/"; - default_title_ = ASCIIToUTF16("ooh title"); - const BookmarkNode* default_node = model->AddURL(default_parent_, 0, - default_title_, - GURL(default_name_)); - controller_ = [[BookmarkEditorController alloc] - initWithParentWindow:test_window() - profile:profile() - parent:default_parent_ - node:default_node - url:GURL() - title:base::string16() - configuration:BookmarkEditor::NO_TREE]; - [controller_ runAsModalSheet]; - } - - void TearDown() override { - controller_ = NULL; - CocoaProfileTest::TearDown(); - } -}; - -TEST_F(BookmarkEditorControllerTest, NoEdit) { - [controller_ cancel:nil]; - ASSERT_EQ(default_parent_->child_count(), 1); - const BookmarkNode* child = default_parent_->GetChild(0); - EXPECT_EQ(child->GetTitle(), default_title_); - EXPECT_EQ(child->url(), GURL(default_name_)); -} - -TEST_F(BookmarkEditorControllerTest, EditTitle) { - [controller_ setDisplayName:@"whamma jamma bamma"]; - [controller_ ok:nil]; - ASSERT_EQ(default_parent_->child_count(), 1); - const BookmarkNode* child = default_parent_->GetChild(0); - EXPECT_EQ(child->GetTitle(), ASCIIToUTF16("whamma jamma bamma")); - EXPECT_EQ(child->url(), GURL(default_name_)); -} - -TEST_F(BookmarkEditorControllerTest, EditURL) { - EXPECT_TRUE([controller_ okButtonEnabled]); - [controller_ setDisplayURL:@"http://yellow-sneakers.com/"]; - EXPECT_TRUE([controller_ okButtonEnabled]); - [controller_ ok:nil]; - ASSERT_EQ(default_parent_->child_count(), 1); - const BookmarkNode* child = default_parent_->GetChild(0); - EXPECT_EQ(child->GetTitle(), default_title_); - EXPECT_EQ(child->url(), GURL("http://yellow-sneakers.com/")); -} - -TEST_F(BookmarkEditorControllerTest, EditAndFixPrefix) { - [controller_ setDisplayURL:@"x"]; - [controller_ ok:nil]; - ASSERT_EQ(default_parent_->child_count(), 1); - const BookmarkNode* child = default_parent_->GetChild(0); - EXPECT_TRUE(child->url().is_valid()); -} - -TEST_F(BookmarkEditorControllerTest, NodeDeleted) { - // Delete the bookmark being edited and verify the sheet cancels itself: - ASSERT_TRUE([test_window() attachedSheet]); - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile()); - model->Remove(default_parent_->GetChild(0)); - ASSERT_FALSE([test_window() attachedSheet]); -} - -TEST_F(BookmarkEditorControllerTest, EditAndConfirmOKButton) { - // Confirm OK button enabled/disabled as appropriate: - // First test the URL. - EXPECT_TRUE([controller_ okButtonEnabled]); - [controller_ setDisplayURL:@""]; - EXPECT_FALSE([controller_ okButtonEnabled]); - [controller_ setDisplayURL:@"http://www.cnn.com"]; - EXPECT_TRUE([controller_ okButtonEnabled]); - // Then test the name. - [controller_ setDisplayName:@""]; - EXPECT_TRUE([controller_ okButtonEnabled]); - [controller_ setDisplayName:@" "]; - EXPECT_TRUE([controller_ okButtonEnabled]); - // Then little mix of both. - [controller_ setDisplayName:@"name"]; - EXPECT_TRUE([controller_ okButtonEnabled]); - [controller_ setDisplayURL:@""]; - EXPECT_FALSE([controller_ okButtonEnabled]); - [controller_ cancel:nil]; -} - -TEST_F(BookmarkEditorControllerTest, GoodAndBadURLsChangeColor) { - // Confirm that the background color of the URL edit field changes - // based on whether it contains a valid or invalid URL. - [controller_ setDisplayURL:@"http://www.cnn.com"]; - NSColor *urlColorA = [controller_ urlFieldColor]; - EXPECT_TRUE(urlColorA); - [controller_ setDisplayURL:@""]; - NSColor *urlColorB = [controller_ urlFieldColor]; - EXPECT_TRUE(urlColorB); - EXPECT_NSNE(urlColorA, urlColorB); - [controller_ setDisplayURL:@"http://www.google.com"]; - [controller_ cancel:nil]; - urlColorB = [controller_ urlFieldColor]; - EXPECT_TRUE(urlColorB); - EXPECT_NSEQ(urlColorA, urlColorB); -} - -class BookmarkEditorControllerNoNodeTest : public CocoaProfileTest { - public: - BookmarkEditorController* controller_; - - void SetUp() override { - CocoaProfileTest::SetUp(); - ASSERT_TRUE(profile()); - - BookmarkModel* model = - BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* parent = model->bookmark_bar_node(); - controller_ = [[BookmarkEditorController alloc] - initWithParentWindow:test_window() - profile:profile() - parent:parent - node:NULL - url:GURL() - title:base::string16() - configuration:BookmarkEditor::NO_TREE]; - - [controller_ runAsModalSheet]; - } - - void TearDown() override { - controller_ = NULL; - CocoaProfileTest::TearDown(); - } -}; - -TEST_F(BookmarkEditorControllerNoNodeTest, NoNodeNoTree) { - EXPECT_NSEQ(@"", [controller_ displayName]); - EXPECT_EQ(nil, [controller_ displayURL]); - EXPECT_FALSE([controller_ okButtonEnabled]); - [controller_ cancel:nil]; -} - -class BookmarkEditorControllerYesNodeTest : public CocoaProfileTest { - public: - base::string16 default_title_; - BookmarkEditorController* controller_; - - void SetUp() override { - CocoaProfileTest::SetUp(); - ASSERT_TRUE(profile()); - - BookmarkModel* model = - BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* parent = model->bookmark_bar_node(); - default_title_ = ASCIIToUTF16("wooh title"); - const BookmarkNode* node = - model->AddURL(parent, 0, default_title_, - GURL("http://www.zoom-baby-doo-da.com/")); - controller_ = [[BookmarkEditorController alloc] - initWithParentWindow:test_window() - profile:profile() - parent:parent - node:node - url:GURL() - title:base::string16() - configuration:BookmarkEditor::NO_TREE]; - - [controller_ runAsModalSheet]; - } - - void TearDown() override { - controller_ = NULL; - CocoaProfileTest::TearDown(); - } -}; - -TEST_F(BookmarkEditorControllerYesNodeTest, YesNodeShowTree) { - EXPECT_NSEQ(base::SysUTF16ToNSString(default_title_), - [controller_ displayName]); - EXPECT_NSEQ([NSString stringWithCString:"www.zoom-baby-doo-da.com" - encoding:NSUTF8StringEncoding], - [controller_ displayURL]); - [controller_ cancel:nil]; -} - - -class BookmarkEditorControllerUtf8NodeTest : public CocoaProfileTest { - public: - BookmarkEditorController* controller_; - - void SetUp() override { - CocoaProfileTest::SetUp(); - ASSERT_TRUE(profile()); - - BookmarkModel* model = - BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* parent = model->bookmark_bar_node(); - base::string16 title = ASCIIToUTF16("wooh title"); - const char* url_name = "http://www.foobar.com/心得寫作"; - const BookmarkNode* node = model->AddURL(parent, 0, title, GURL(url_name)); - controller_ = [[BookmarkEditorController alloc] - initWithParentWindow:test_window() - profile:profile() - parent:parent - node:node - url:GURL() - title:base::string16() - configuration:BookmarkEditor::NO_TREE]; - - [controller_ runAsModalSheet]; - } - - void TearDown() override { - controller_ = NULL; - CocoaProfileTest::TearDown(); - } -}; - -TEST_F(BookmarkEditorControllerUtf8NodeTest, DisplayUtf8Name) { - // The "http://" prefix is trimmed, but the UTF-8 formatted characters remain. - EXPECT_NSEQ([NSString stringWithCString:"www.foobar.com/心得寫作" - encoding:NSUTF8StringEncoding], - [controller_ displayURL]); - [controller_ cancel:nil]; -} - -using BookmarkEditorControllerEditKeepsSchemeTest = CocoaProfileTest; -TEST_F(BookmarkEditorControllerEditKeepsSchemeTest, EditKeepsScheme) { - // Edits the bookmark and ensures resulting URL keeps the same scheme, even - // when userinfo is present in the URL - ASSERT_TRUE(profile()); - - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* kParent = model->bookmark_bar_node(); - const base::string16 kTitle = ASCIIToUTF16("EditingKeepsScheme"); - - const GURL kUrl = GURL("http://javascript:scripttext@example.com/"); - const BookmarkNode* kNode = model->AddURL(kParent, 0, base::string16(), kUrl); - - BookmarkEditorController* controller = [[BookmarkEditorController alloc] - initWithParentWindow:test_window() - profile:profile() - parent:kParent - node:kNode - url:GURL() - title:base::string16() - configuration:BookmarkEditor::SHOW_TREE]; - - [controller runAsModalSheet]; - - // We expect only the trailing / to be trimmed when userinfo is present - EXPECT_NSEQ(base::SysUTF8ToNSString(kUrl.spec()), - [[controller displayURL] stringByAppendingString:@"/"]); - - [controller setDisplayName:base::SysUTF16ToNSString(kTitle)]; - - EXPECT_TRUE([controller okButtonEnabled]); - [controller ok:nil]; - - ASSERT_EQ(1, kParent->child_count()); - const BookmarkNode* kChild = kParent->GetChild(0); - EXPECT_EQ(kTitle, kChild->GetTitle()); - EXPECT_EQ(kUrl, kChild->url()); -} - -class BookmarkEditorControllerTreeTest : public CocoaProfileTest { - - public: - BookmarkEditorController* controller_; - const BookmarkNode* folder_a_; - const BookmarkNode* folder_b_; - const BookmarkNode* folder_bb_; - const BookmarkNode* folder_c_; - const BookmarkNode* bookmark_bb_3_; - GURL bb3_url_1_; - GURL bb3_url_2_; - - void CreateModel() { - // Set up a small bookmark hierarchy, which will look as follows: - // a b c d - // a-0 b-0 c-0 - // a-1 bb-0 c-1 - // a-2 bb-1 c-2 - // bb-2 - // bb-3 - // bb-4 - // b-1 - // b-2 - BookmarkModel* model = - BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* root = model->bookmark_bar_node(); - folder_a_ = model->AddFolder(root, 0, ASCIIToUTF16("a")); - model->AddURL(folder_a_, 0, ASCIIToUTF16("a-0"), GURL("http://a-0.com")); - model->AddURL(folder_a_, 1, ASCIIToUTF16("a-1"), GURL("http://a-1.com")); - model->AddURL(folder_a_, 2, ASCIIToUTF16("a-2"), GURL("http://a-2.com")); - - folder_b_ = model->AddFolder(root, 1, ASCIIToUTF16("b")); - model->AddURL(folder_b_, 0, ASCIIToUTF16("b-0"), GURL("http://b-0.com")); - folder_bb_ = model->AddFolder(folder_b_, 1, ASCIIToUTF16("bb")); - model->AddURL(folder_bb_, 0, ASCIIToUTF16("bb-0"), GURL("http://bb-0.com")); - model->AddURL(folder_bb_, 1, ASCIIToUTF16("bb-1"), GURL("http://bb-1.com")); - model->AddURL(folder_bb_, 2, ASCIIToUTF16("bb-2"), GURL("http://bb-2.com")); - - // To find it later, this bookmark name must always have a URL - // of http://bb-3.com or https://bb-3.com - bb3_url_1_ = GURL("http://bb-3.com"); - bb3_url_2_ = GURL("https://bb-3.com"); - bookmark_bb_3_ = model->AddURL(folder_bb_, 3, ASCIIToUTF16("bb-3"), - bb3_url_1_); - - model->AddURL(folder_bb_, 4, ASCIIToUTF16("bb-4"), GURL("http://bb-4.com")); - model->AddURL(folder_b_, 2, ASCIIToUTF16("b-1"), GURL("http://b-2.com")); - model->AddURL(folder_b_, 3, ASCIIToUTF16("b-2"), GURL("http://b-3.com")); - - folder_c_ = model->AddFolder(root, 2, ASCIIToUTF16("c")); - model->AddURL(folder_c_, 0, ASCIIToUTF16("c-0"), GURL("http://c-0.com")); - model->AddURL(folder_c_, 1, ASCIIToUTF16("c-1"), GURL("http://c-1.com")); - model->AddURL(folder_c_, 2, ASCIIToUTF16("c-2"), GURL("http://c-2.com")); - model->AddURL(folder_c_, 3, ASCIIToUTF16("c-3"), GURL("http://c-3.com")); - - model->AddURL(root, 3, ASCIIToUTF16("d"), GURL("http://d-0.com")); - } - - virtual BookmarkEditorController* CreateController() { - return [[BookmarkEditorController alloc] - initWithParentWindow:test_window() - profile:profile() - parent:folder_bb_ - node:bookmark_bb_3_ - url:GURL() - title:base::string16() - configuration:BookmarkEditor::SHOW_TREE]; - } - - void SetUp() override { - CocoaProfileTest::SetUp(); - ASSERT_TRUE(profile()); - - CreateModel(); - controller_ = CreateController(); - [controller_ runAsModalSheet]; - } - - void TearDown() override { - controller_ = NULL; - CocoaProfileTest::TearDown(); - } - - // After changing a node, pointers to the node may be invalid. This - // is because the node itself may not be updated; it may removed and - // a new one is added in that location. (Implementation detail of - // BookmarkEditorController). This method updates the class's - // bookmark_bb_3_ so that it points to the new node for testing. - void UpdateBB3() { - std::vector<const BookmarkNode*> nodes; - BookmarkModel* model = - BookmarkModelFactory::GetForBrowserContext(profile()); - model->GetNodesByURL(bb3_url_1_, &nodes); - if (nodes.empty()) - model->GetNodesByURL(bb3_url_2_, &nodes); - DCHECK(nodes.size()); - bookmark_bb_3_ = nodes[0]; - } - -}; - -TEST_F(BookmarkEditorControllerTreeTest, VerifyBookmarkTestModel) { - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile()); - model->root_node(); - const BookmarkNode* root = model->bookmark_bar_node(); - EXPECT_EQ(4, root->child_count()); - const BookmarkNode* child = root->GetChild(0); - EXPECT_EQ(3, child->child_count()); - const BookmarkNode* subchild = child->GetChild(0); - EXPECT_EQ(0, subchild->child_count()); - subchild = child->GetChild(1); - EXPECT_EQ(0, subchild->child_count()); - subchild = child->GetChild(2); - EXPECT_EQ(0, subchild->child_count()); - - child = root->GetChild(1); - EXPECT_EQ(4, child->child_count()); - subchild = child->GetChild(0); - EXPECT_EQ(0, subchild->child_count()); - subchild = child->GetChild(1); - EXPECT_EQ(5, subchild->child_count()); - const BookmarkNode* subsubchild = subchild->GetChild(0); - EXPECT_EQ(0, subsubchild->child_count()); - subsubchild = subchild->GetChild(1); - EXPECT_EQ(0, subsubchild->child_count()); - subsubchild = subchild->GetChild(2); - EXPECT_EQ(0, subsubchild->child_count()); - subsubchild = subchild->GetChild(3); - EXPECT_EQ(0, subsubchild->child_count()); - subsubchild = subchild->GetChild(4); - EXPECT_EQ(0, subsubchild->child_count()); - subchild = child->GetChild(2); - EXPECT_EQ(0, subchild->child_count()); - subchild = child->GetChild(3); - EXPECT_EQ(0, subchild->child_count()); - - child = root->GetChild(2); - EXPECT_EQ(4, child->child_count()); - subchild = child->GetChild(0); - EXPECT_EQ(0, subchild->child_count()); - subchild = child->GetChild(1); - EXPECT_EQ(0, subchild->child_count()); - subchild = child->GetChild(2); - EXPECT_EQ(0, subchild->child_count()); - subchild = child->GetChild(3); - EXPECT_EQ(0, subchild->child_count()); - - child = root->GetChild(3); - EXPECT_EQ(0, child->child_count()); - [controller_ cancel:nil]; -} - -TEST_F(BookmarkEditorControllerTreeTest, RenameBookmarkInPlace) { - const BookmarkNode* oldParent = bookmark_bb_3_->parent(); - [controller_ setDisplayName:@"NEW NAME"]; - [controller_ ok:nil]; - UpdateBB3(); - const BookmarkNode* newParent = bookmark_bb_3_->parent(); - ASSERT_EQ(newParent, oldParent); - int childIndex = newParent->GetIndexOf(bookmark_bb_3_); - ASSERT_EQ(3, childIndex); -} - -TEST_F(BookmarkEditorControllerTreeTest, ChangeBookmarkURLInPlace) { - const BookmarkNode* oldParent = bookmark_bb_3_->parent(); - [controller_ setDisplayURL:@"https://bb-3.com"]; - [controller_ ok:nil]; - UpdateBB3(); - const BookmarkNode* newParent = bookmark_bb_3_->parent(); - ASSERT_EQ(newParent, oldParent); - int childIndex = newParent->GetIndexOf(bookmark_bb_3_); - ASSERT_EQ(3, childIndex); -} - -TEST_F(BookmarkEditorControllerTreeTest, ChangeBookmarkFolder) { - [controller_ selectTestNodeInBrowser:folder_c_]; - [controller_ ok:nil]; - UpdateBB3(); - const BookmarkNode* parent = bookmark_bb_3_->parent(); - ASSERT_EQ(parent, folder_c_); - int childIndex = parent->GetIndexOf(bookmark_bb_3_); - ASSERT_EQ(4, childIndex); -} - -TEST_F(BookmarkEditorControllerTreeTest, ChangeNameAndBookmarkFolder) { - [controller_ setDisplayName:@"NEW NAME"]; - [controller_ selectTestNodeInBrowser:folder_c_]; - [controller_ ok:nil]; - UpdateBB3(); - const BookmarkNode* parent = bookmark_bb_3_->parent(); - ASSERT_EQ(parent, folder_c_); - int childIndex = parent->GetIndexOf(bookmark_bb_3_); - ASSERT_EQ(4, childIndex); - EXPECT_EQ(bookmark_bb_3_->GetTitle(), ASCIIToUTF16("NEW NAME")); -} - -TEST_F(BookmarkEditorControllerTreeTest, AddFolderWithFolderSelected) { - // Folders are NOT added unless the OK button is pressed. - [controller_ newFolder:nil]; - [controller_ cancel:nil]; - EXPECT_EQ(5, folder_bb_->child_count()); -} - -class BookmarkEditorControllerTreeNoNodeTest : - public BookmarkEditorControllerTreeTest { - public: - BookmarkEditorController* CreateController() override { - return [[BookmarkEditorController alloc] - initWithParentWindow:test_window() - profile:profile() - parent:folder_bb_ - node:nil - url:GURL() - title:base::string16() - configuration:BookmarkEditor::SHOW_TREE]; - } - -}; - -TEST_F(BookmarkEditorControllerTreeNoNodeTest, NewBookmarkNoNode) { - [controller_ setDisplayName:@"NEW BOOKMARK"]; - [controller_ setDisplayURL:@"http://NEWURL.com"]; - [controller_ ok:nil]; - const BookmarkNode* new_node = folder_bb_->GetChild(5); - ASSERT_EQ(0, new_node->child_count()); - EXPECT_EQ(new_node->GetTitle(), ASCIIToUTF16("NEW BOOKMARK")); - EXPECT_EQ(new_node->url(), GURL("http://NEWURL.com")); -}
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_name_folder_controller.h b/chrome/browser/ui/cocoa/bookmarks/bookmark_name_folder_controller.h deleted file mode 100644 index a449360..0000000 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_name_folder_controller.h +++ /dev/null
@@ -1,68 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_NAME_FOLDER_CONTROLLER_H_ -#define CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_NAME_FOLDER_CONTROLLER_H_ - -#import <Cocoa/Cocoa.h> - -#include <memory> - -#include "base/mac/scoped_nsobject.h" - -class BookmarkModelObserverForCocoa; -class Profile; - -namespace bookmarks { -class BookmarkNode; -} - -// A controller for dialog to let the user create a new folder or -// rename an existing folder. Accessible from a context menu on a -// bookmark button or the bookmark bar. -@interface BookmarkNameFolderController : NSWindowController { - @private - IBOutlet NSTextField* nameField_; - IBOutlet NSButton* okButton_; - - NSWindow* parentWindow_; // weak - Profile* profile_; // weak - - // Weak; owned by the model. Can be NULL (see below). Either node_ - // is non-NULL (renaming a folder), or parent_ is non-NULL (adding a - // new one). - const bookmarks::BookmarkNode* node_; - const bookmarks::BookmarkNode* parent_; - int newIndex_; - - base::scoped_nsobject<NSString> initialName_; - - // Ping me when things change out from under us. - std::unique_ptr<BookmarkModelObserverForCocoa> observer_; -} - -// Use the 1st initializer for a "rename existing folder" request. -// -// Use the 2nd initializer for an "add folder" request. If creating a -// new folder |parent| and |newIndex| specify where to put the new -// node. -- (id)initWithParentWindow:(NSWindow*)window - profile:(Profile*)profile - node:(const bookmarks::BookmarkNode*)node; -- (id)initWithParentWindow:(NSWindow*)window - profile:(Profile*)profile - parent:(const bookmarks::BookmarkNode*)parent - newIndex:(int)newIndex; -- (void)runAsModalSheet; -- (IBAction)cancel:(id)sender; -- (IBAction)ok:(id)sender; -@end - -@interface BookmarkNameFolderController(TestingAPI) -- (NSString*)folderName; -- (void)setFolderName:(NSString*)name; -- (NSButton*)okButton; -@end - -#endif // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_NAME_FOLDER_CONTROLLER_H_
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_name_folder_controller.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_name_folder_controller.mm deleted file mode 100644 index 0a20e6d..0000000 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_name_folder_controller.mm +++ /dev/null
@@ -1,134 +0,0 @@ -// Copyright (c) 2012 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 "chrome/browser/ui/cocoa/bookmarks/bookmark_name_folder_controller.h" - -#include "base/mac/bundle_locations.h" -#include "base/strings/sys_string_conversions.h" -#include "chrome/browser/bookmarks/bookmark_model_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa.h" -#include "components/strings/grit/components_strings.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/l10n/l10n_util_mac.h" - -using bookmarks::BookmarkModel; -using bookmarks::BookmarkNode; - -@implementation BookmarkNameFolderController - -// Common initializer (private). -- (id)initWithParentWindow:(NSWindow*)window - profile:(Profile*)profile - node:(const BookmarkNode*)node - parent:(const BookmarkNode*)parent - newIndex:(int)newIndex { - NSString* nibpath = [base::mac::FrameworkBundle() - pathForResource:@"BookmarkNameFolder" - ofType:@"nib"]; - if ((self = [super initWithWindowNibPath:nibpath owner:self])) { - parentWindow_ = window; - profile_ = profile; - node_ = node; - parent_ = parent; - newIndex_ = newIndex; - if (parent) { - DCHECK_LE(newIndex, parent->child_count()); - } - if (node_) { - initialName_.reset([base::SysUTF16ToNSString(node_->GetTitle()) retain]); - } else { - NSString* newString = - l10n_util::GetNSStringWithFixup(IDS_BOOKMARK_EDITOR_NEW_FOLDER_NAME); - initialName_.reset([newString retain]); - } - } - return self; -} - -- (id)initWithParentWindow:(NSWindow*)window - profile:(Profile*)profile - node:(const BookmarkNode*)node { - DCHECK(node); - return [self initWithParentWindow:window - profile:profile - node:node - parent:nil - newIndex:0]; -} - -- (id)initWithParentWindow:(NSWindow*)window - profile:(Profile*)profile - parent:(const BookmarkNode*)parent - newIndex:(int)newIndex { - DCHECK(parent); - return [self initWithParentWindow:window - profile:profile - node:nil - parent:parent - newIndex:newIndex]; -} - -- (void)awakeFromNib { - [nameField_ setStringValue:initialName_.get()]; - [[nameField_ cell] setUsesSingleLineMode:YES]; - - [okButton_ setTitle:l10n_util::GetNSStringWithFixup(node_ ? IDS_SAVE : - IDS_ADD)]; -} - -- (void)runAsModalSheet { - // Ping me when things change out from under us. - observer_.reset(new BookmarkModelObserverForCocoa( - BookmarkModelFactory::GetForBrowserContext(profile_), ^{ - [self cancel:nil]; - })); - observer_->StartObservingNode(node_); - [NSApp beginSheet:[self window] - modalForWindow:parentWindow_ - modalDelegate:self - didEndSelector:@selector(didEndSheet:returnCode:contextInfo:) - contextInfo:nil]; -} - -- (IBAction)cancel:(id)sender { - [NSApp endSheet:[self window]]; -} - -- (IBAction)ok:(id)sender { - NSString* name = [nameField_ stringValue]; - if ([name length] == 0) - name = l10n_util::GetNSStringWithFixup(IDS_BOOKMARK_EDITOR_NEW_FOLDER_NAME); - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile_); - if (node_) { - model->SetTitle(node_, base::SysNSStringToUTF16(name)); - } else { - model->AddFolder(parent_, - newIndex_, - base::SysNSStringToUTF16(name)); - } - [NSApp endSheet:[self window]]; -} - -- (void)didEndSheet:(NSWindow*)sheet - returnCode:(int)returnCode - contextInfo:(void*)contextInfo { - [[self window] orderOut:self]; - observer_.reset(NULL); - [self autorelease]; -} - -- (NSString*)folderName { - return [nameField_ stringValue]; -} - -- (void)setFolderName:(NSString*)name { - [nameField_ setStringValue:name]; -} - -- (NSButton*)okButton { - return okButton_; -} - -@end // BookmarkNameFolderController
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_name_folder_controller_unittest.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_name_folder_controller_unittest.mm deleted file mode 100644 index 2fdac1d..0000000 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_name_folder_controller_unittest.mm +++ /dev/null
@@ -1,170 +0,0 @@ -// Copyright (c) 2012 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 <Cocoa/Cocoa.h> - -#include "base/mac/scoped_nsobject.h" -#include "base/strings/utf_string_conversions.h" -#include "chrome/browser/bookmarks/bookmark_model_factory.h" -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_name_folder_controller.h" -#include "chrome/browser/ui/cocoa/test/cocoa_profile_test.h" -#include "chrome/test/base/testing_profile.h" -#include "components/bookmarks/browser/bookmark_model.h" -#include "testing/gtest/include/gtest/gtest.h" -#import "testing/gtest_mac.h" -#include "testing/platform_test.h" - -using base::ASCIIToUTF16; -using bookmarks::BookmarkModel; -using bookmarks::BookmarkNode; - -class BookmarkNameFolderControllerTest : public CocoaProfileTest { -}; - - -// Simple add of a node (at the end). -TEST_F(BookmarkNameFolderControllerTest, AddNew) { - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* parent = model->bookmark_bar_node(); - EXPECT_EQ(0, parent->child_count()); - - base::scoped_nsobject<BookmarkNameFolderController> controller( - [[BookmarkNameFolderController alloc] initWithParentWindow:test_window() - profile:profile() - parent:parent - newIndex:0]); - [controller window]; // force nib load - - // Do nothing. - [controller cancel:nil]; - EXPECT_EQ(0, parent->child_count()); - - // Change name then cancel. - [controller setFolderName:@"Bozo"]; - [controller cancel:nil]; - EXPECT_EQ(0, parent->child_count()); - - // Add a new folder. - [controller ok:nil]; - EXPECT_EQ(1, parent->child_count()); - EXPECT_TRUE(parent->GetChild(0)->is_folder()); - EXPECT_EQ(ASCIIToUTF16("Bozo"), parent->GetChild(0)->GetTitle()); -} - -// Add new but specify a sibling. -TEST_F(BookmarkNameFolderControllerTest, AddNewWithSibling) { - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* parent = model->bookmark_bar_node(); - - // Add 2 nodes. We will place the new folder in the middle of these. - model->AddURL(parent, 0, ASCIIToUTF16("title 1"), - GURL("http://www.google.com")); - model->AddURL(parent, 1, ASCIIToUTF16("title 3"), - GURL("http://www.google.com")); - EXPECT_EQ(2, parent->child_count()); - - base::scoped_nsobject<BookmarkNameFolderController> controller( - [[BookmarkNameFolderController alloc] initWithParentWindow:test_window() - profile:profile() - parent:parent - newIndex:1]); - [controller window]; // force nib load - - // Add a new folder. - [controller setFolderName:@"middle"]; - [controller ok:nil]; - - // Confirm we now have 3, and that the new one is in the middle. - EXPECT_EQ(3, parent->child_count()); - EXPECT_TRUE(parent->GetChild(1)->is_folder()); - EXPECT_EQ(ASCIIToUTF16("middle"), parent->GetChild(1)->GetTitle()); -} - -// Make sure we are allowed to create a folder named "New Folder". -TEST_F(BookmarkNameFolderControllerTest, AddNewDefaultName) { - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* parent = model->bookmark_bar_node(); - EXPECT_EQ(0, parent->child_count()); - - base::scoped_nsobject<BookmarkNameFolderController> controller( - [[BookmarkNameFolderController alloc] initWithParentWindow:test_window() - profile:profile() - parent:parent - newIndex:0]); - - [controller window]; // force nib load - - // Click OK without changing the name - [controller ok:nil]; - EXPECT_EQ(1, parent->child_count()); - EXPECT_TRUE(parent->GetChild(0)->is_folder()); -} - -// Make sure we are allowed to create a folder with an empty name. -TEST_F(BookmarkNameFolderControllerTest, AddNewBlankName) { - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* parent = model->bookmark_bar_node(); - EXPECT_EQ(0, parent->child_count()); - - base::scoped_nsobject<BookmarkNameFolderController> controller( - [[BookmarkNameFolderController alloc] initWithParentWindow:test_window() - profile:profile() - parent:parent - newIndex:0]); - [controller window]; // force nib load - - // Change the name to blank, click OK. - [controller setFolderName:@""]; - [controller ok:nil]; - EXPECT_EQ(1, parent->child_count()); - EXPECT_TRUE(parent->GetChild(0)->is_folder()); -} - -TEST_F(BookmarkNameFolderControllerTest, Rename) { - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* parent = model->bookmark_bar_node(); - const BookmarkNode* folder = model->AddFolder(parent, - parent->child_count(), - ASCIIToUTF16("folder")); - - // Rename the folder by creating a controller that originates from - // the node. - base::scoped_nsobject<BookmarkNameFolderController> controller( - [[BookmarkNameFolderController alloc] initWithParentWindow:test_window() - profile:profile() - node:folder]); - [controller window]; // force nib load - - EXPECT_NSEQ(@"folder", [controller folderName]); - [controller setFolderName:@"Zobo"]; - [controller ok:nil]; - EXPECT_EQ(1, parent->child_count()); - EXPECT_TRUE(parent->GetChild(0)->is_folder()); - EXPECT_EQ(ASCIIToUTF16("Zobo"), parent->GetChild(0)->GetTitle()); -} - -TEST_F(BookmarkNameFolderControllerTest, EditAndConfirmOKButton) { - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile()); - const BookmarkNode* parent = model->bookmark_bar_node(); - EXPECT_EQ(0, parent->child_count()); - - base::scoped_nsobject<BookmarkNameFolderController> controller( - [[BookmarkNameFolderController alloc] initWithParentWindow:test_window() - profile:profile() - parent:parent - newIndex:0]); - [controller window]; // force nib load - - // We start enabled since the default "New Folder" is added for us. - EXPECT_TRUE([[controller okButton] isEnabled]); - - [controller setFolderName:@"Bozo"]; - EXPECT_TRUE([[controller okButton] isEnabled]); - [controller setFolderName:@" "]; - EXPECT_TRUE([[controller okButton] isEnabled]); - - [controller setFolderName:@""]; - EXPECT_TRUE([[controller okButton] isEnabled]); -} -
diff --git a/chrome/browser/ui/cocoa/browser_window_controller.h b/chrome/browser/ui/cocoa/browser_window_controller.h index 5bf172eb..a3d71231 100644 --- a/chrome/browser/ui/cocoa/browser_window_controller.h +++ b/chrome/browser/ui/cocoa/browser_window_controller.h
@@ -21,7 +21,6 @@ #include "chrome/browser/extensions/browser_extension_window_controller.h" #include "chrome/browser/translate/chrome_translate_client.h" #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.h" -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller.h" #import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h" #import "chrome/browser/ui/cocoa/tabs/tab_window_controller.h" #import "chrome/browser/ui/cocoa/themed_window.h" @@ -104,7 +103,6 @@ StatusBubbleMac* statusBubble_; std::unique_ptr<BookmarkBubbleObserverCocoa> bookmarkBubbleObserver_; - BookmarkBubbleController* bookmarkBubbleController_; // Weak. BOOL initializing_; // YES while we are currently in initWithBrowser: BOOL ownsBrowser_; // Only ever NO when testing
diff --git a/chrome/browser/ui/cocoa/browser_window_controller.mm b/chrome/browser/ui/cocoa/browser_window_controller.mm index 534764a..13fd72264 100644 --- a/chrome/browser/ui/cocoa/browser_window_controller.mm +++ b/chrome/browser/ui/cocoa/browser_window_controller.mm
@@ -42,7 +42,6 @@ #import "chrome/browser/ui/cocoa/background_gradient_view.h" #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.h" #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_observer_cocoa.h" -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.h" #import "chrome/browser/ui/cocoa/browser/exclusive_access_controller_views.h" #include "chrome/browser/ui/cocoa/browser_dialogs_views_mac.h" #import "chrome/browser/ui/cocoa/browser_window_cocoa.h" @@ -443,7 +442,6 @@ [downloadShelfController_ browserWillBeDestroyed]; [bookmarkBarController_ browserWillBeDestroyed]; [avatarButtonController_ browserWillBeDestroyed]; - [bookmarkBubbleController_ browserWillBeDestroyed]; [super dealloc]; } @@ -1546,54 +1544,18 @@ bookmarkBubbleObserver_.reset(new BookmarkBubbleObserverCocoa(self)); - if (chrome::ShowPilotDialogsWithViewsToolkit()) { - chrome::ShowBookmarkBubbleViewsAtPoint( - gfx::ScreenPointFromNSPoint(ui::ConvertPointFromWindowToScreen( - [self window], [self bookmarkBubblePoint])), - [[self window] contentView], bookmarkBubbleObserver_.get(), - browser_.get(), url, alreadyMarked, - [self locationBarBridge]->star_decoration()); - } else { -#if BUILDFLAG(MAC_VIEWS_BROWSER) - NOTREACHED() << "MacViews Browser can't show cocoa dialogs"; -#else - BookmarkModel* model = - BookmarkModelFactory::GetForBrowserContext(browser_->profile()); - bookmarks::ManagedBookmarkService* managed = - ManagedBookmarkServiceFactory::GetForProfile(browser_->profile()); - const BookmarkNode* node = model->GetMostRecentlyAddedUserNodeForURL(url); - bookmarkBubbleController_ = [[BookmarkBubbleController alloc] - initWithParentWindow:[self window] - bubbleObserver:bookmarkBubbleObserver_.get() - managed:managed - model:model - node:node - alreadyBookmarked:alreadyMarked]; - [bookmarkBubbleController_ showWindow:self]; -#endif - } - DCHECK(bookmarkBubbleObserver_); + chrome::ShowBookmarkBubbleViewsAtPoint( + gfx::ScreenPointFromNSPoint(ui::ConvertPointFromWindowToScreen( + [self window], [self bookmarkBubblePoint])), + [[self window] contentView], bookmarkBubbleObserver_.get(), + browser_.get(), url, alreadyMarked, + [self locationBarBridge]->star_decoration()); } - (void)bookmarkBubbleClosed { - // Nil out the weak bookmark bubble controller reference. - bookmarkBubbleController_ = nil; bookmarkBubbleObserver_.reset(); } -// Handle the editBookmarkNode: action sent from bookmark bubble controllers. -- (void)editBookmarkNode:(id)sender { - BOOL responds = [sender respondsToSelector:@selector(node)]; - DCHECK(responds); - if (responds) { - const BookmarkNode* node = [sender node]; - if (node) - BookmarkEditor::Show([self window], browser_->profile(), - BookmarkEditor::EditDetails::EditNode(node), - BookmarkEditor::SHOW_TREE); - } -} - - (void)showTranslateBubbleForWebContents:(content::WebContents*)contents step:(translate::TranslateStep)step errorType:(translate::TranslateErrors::Type)
diff --git a/chrome/browser/ui/cocoa/browser_window_controller_private.mm b/chrome/browser/ui/cocoa/browser_window_controller_private.mm index 83dd6241..4fd390a 100644 --- a/chrome/browser/ui/cocoa/browser_window_controller_private.mm +++ b/chrome/browser/ui/cocoa/browser_window_controller_private.mm
@@ -335,11 +335,6 @@ NSWindow* sourceWindow = fullscreen ? regularWindow : fullscreenWindow; NSWindow* destWindow = fullscreen ? fullscreenWindow : regularWindow; - // Close the bookmark bubble, if it's open. Use |-ok:| instead of |-cancel:| - // or |-close| because that matches the behavior when the bubble loses key - // status. - [bookmarkBubbleController_ ok:self]; - // Save the current first responder so we can restore after views are moved. base::scoped_nsobject<FocusTracker> focusTracker( [[FocusTracker alloc] initWithWindow:sourceWindow]);
diff --git a/chrome/browser/ui/cocoa/dialog_text_field_editor.h b/chrome/browser/ui/cocoa/dialog_text_field_editor.h deleted file mode 100644 index f3b82c9..0000000 --- a/chrome/browser/ui/cocoa/dialog_text_field_editor.h +++ /dev/null
@@ -1,21 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_COCOA_DIALOG_TEXT_FIELD__EDITOR_H_ -#define CHROME_BROWSER_UI_COCOA_DIALOG_TEXT_FIELD__EDITOR_H_ - -#import <Cocoa/Cocoa.h> - -// This class is used to customize the field editors for dialog textfields. -// It intercepts touch bar methods to prevent the textfield's touch bar from -// overriding the dialog's touch bar. -// -// TODO(spqchan): Add the textfield's candidate list to the touch bar. I've -// tried to combine the parent's touch bar with the dialog's, but the result -// was buggy. -@interface DialogTextFieldEditor : NSTextView - -@end - -#endif // CHROME_BROWSER_UI_COCOA_DIALOG_TEXT_FIELD__EDITOR_H_ \ No newline at end of file
diff --git a/chrome/browser/ui/cocoa/dialog_text_field_editor.mm b/chrome/browser/ui/cocoa/dialog_text_field_editor.mm deleted file mode 100644 index 435aa01..0000000 --- a/chrome/browser/ui/cocoa/dialog_text_field_editor.mm +++ /dev/null
@@ -1,22 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "chrome/browser/ui/cocoa/dialog_text_field_editor.h" - -#import "ui/base/cocoa/touch_bar_forward_declarations.h" - -@implementation DialogTextFieldEditor - -- (instancetype)init { - if ((self = [super init])) { - [self setFieldEditor:YES]; - } - return self; -} - -- (NSTouchBar*)makeTouchBar { - return nil; -} - -@end
diff --git a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.cc b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.cc index f70dabe1..0e5e23df 100644 --- a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.cc +++ b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.cc
@@ -12,6 +12,7 @@ #include "chrome/browser/lifetime/application_lifetime.h" #include "chrome/browser/themes/theme_service.h" #include "chrome/browser/themes/theme_service_factory.h" +#include "chrome/browser/ui/extensions/hosted_app_browser_controller.h" #include "chrome/browser/ui/views/frame/browser_frame.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/browser_window_property_manager_win.h" @@ -218,6 +219,9 @@ } views::FrameMode BrowserDesktopWindowTreeHostWin::GetFrameMode() const { + if (IsOpaqueHostedAppFrame()) + return views::FrameMode::CUSTOM_DRAWN; + const views::FrameMode system_frame_mode = ShouldCustomDrawSystemTitlebar() ? views::FrameMode::SYSTEM_DRAWN_NO_CONTROLS @@ -246,6 +250,10 @@ // context of the BrowserView destructor. if (!browser_view_->browser()) return false; + + if (IsOpaqueHostedAppFrame()) + return false; + // We don't theme popup or app windows, so regardless of whether or not a // theme is active for normal browser windows, we don't want to use the custom // frame for popups/apps. @@ -337,6 +345,14 @@ tabstrip_bounds.bottom() + left_top.y(), right_bottom.y()}; } +bool BrowserDesktopWindowTreeHostWin::IsOpaqueHostedAppFrame() const { + // TODO(https://crbug.com/868239): Support Windows 7 Aero glass for hosted app + // window titlebar controls. + return extensions::HostedAppBrowserController:: + IsForExperimentalHostedAppBrowser(browser_view_->browser()) && + base::win::GetVersion() < base::win::VERSION_WIN10; +} + //////////////////////////////////////////////////////////////////////////////// // BrowserDesktopWindowTreeHost, public:
diff --git a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.h b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.h index ba4a8484..18965cab 100644 --- a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.h +++ b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.h
@@ -61,6 +61,8 @@ gfx::Insets GetClientEdgeThicknesses() const; MARGINS GetDWMFrameMargins() const; + bool IsOpaqueHostedAppFrame() const; + BrowserView* browser_view_; BrowserFrame* browser_frame_;
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc index b7c77b3..ae8a759 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc
@@ -35,7 +35,6 @@ #include "chrome/browser/ui/views/frame/browser_frame.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/hosted_app_button_container.h" -#include "chrome/browser/ui/views/frame/hosted_app_origin_text.h" #include "chrome/browser/ui/views/frame/immersive_mode_controller.h" #include "chrome/browser/ui/views/frame/top_container_view.h" #include "chrome/browser/ui/views/profiles/profile_indicator_icon.h" @@ -103,28 +102,10 @@ } } -void SetRightSide(gfx::Rect* rect, int x) { - rect->set_x(x - rect->width()); - DCHECK_EQ(rect->right(), x); -} - -void AlignVerticalCenterWith(gfx::Rect* rect, const gfx::Rect& sibling) { - rect->set_y(sibling.CenterPoint().y() - rect->height() / 2); - DCHECK_EQ(rect->CenterPoint().y(), sibling.CenterPoint().y()); -} - const views::WindowManagerFrameValues& frame_values() { return views::WindowManagerFrameValues::instance(); } -// TODO(estade): This is copied from ash::FrameCaptionButton. De-dupe. -int GetControlButtonSpacing() { - constexpr int kTouchOptimizedCaptionButtonsSpacing = 8; - return ui::MaterialDesignController::IsTouchOptimizedUiEnabled() - ? kTouchOptimizedCaptionButtonsSpacing - : 0; -} - } // namespace /////////////////////////////////////////////////////////////////////////////// @@ -505,9 +486,6 @@ if (hosted_app_button_container_) hosted_app_button_container_->SetPaintAsActive(should_paint_as_active); - - if (hosted_app_origin_text_) - hosted_app_origin_text_->SetPaintAsActive(should_paint_as_active); } /////////////////////////////////////////////////////////////////////////////// @@ -537,19 +515,14 @@ if (profile_indicator_icon()) LayoutIncognitoButton(); - if (hosted_app_extras_container_) { + if (hosted_app_button_container_) { const gfx::Rect* inverted_caption_button_bounds = frame()->GetNativeWindow()->GetRootWindow()->GetProperty( ash::kCaptionButtonBoundsKey); if (inverted_caption_button_bounds) { - gfx::Rect caption_button_bounds = - *inverted_caption_button_bounds + gfx::Vector2d(width(), 0); - gfx::Size hosted_app_size = - hosted_app_extras_container_->GetPreferredSize(); - hosted_app_extras_container_->SetBounds( - caption_button_bounds.x() - hosted_app_size.width(), - caption_button_bounds.y(), hosted_app_size.width(), - caption_button_bounds.height()); + hosted_app_button_container_->LayoutInContainer( + 0, inverted_caption_button_bounds->x() + width(), + inverted_caption_button_bounds->height()); } } @@ -572,6 +545,11 @@ if (profile_indicator_icon()) LayoutIncognitoButton(); + if (hosted_app_button_container_) { + hosted_app_button_container_->LayoutInContainer( + 0, caption_button_container_->x(), painted_height); + } + BrowserNonClientFrameView::Layout(); const bool immersive = browser_view()->immersive_mode_controller()->IsEnabled(); @@ -581,21 +559,6 @@ (tab_strip_visible || immersive) ? 0 : GetTopInset(/*restored=*/false); frame()->GetNativeWindow()->SetProperty(aura::client::kTopViewInset, inset); - if (hosted_app_origin_text_) { - // Align the right side of the text with the left side of the caption - // buttons. - gfx::Size origin_text_preferred_size = - hosted_app_origin_text_->GetPreferredSize(); - int origin_text_width = - std::min(width() - caption_button_container_->width(), - origin_text_preferred_size.width()); - gfx::Rect text_bounds(origin_text_width, - origin_text_preferred_size.height()); - SetRightSide(&text_bounds, caption_button_container_->x()); - AlignVerticalCenterWith(&text_bounds, caption_button_container_->bounds()); - hosted_app_origin_text_->SetBoundsRect(text_bounds); - } - // The top right corner must be occupied by a caption button for easy mouse // access. This check is agnostic to RTL layout. DCHECK_EQ(caption_button_container_->y(), 0); @@ -1007,36 +970,14 @@ ash::FrameCaptionButton::ColorMode::kThemed, *theme_color); } - // Add the origin text. + // Add the container for extra hosted app buttons (e.g app menu button). const float inactive_alpha_ratio = ash::FrameCaptionButton::GetInactiveButtonColorAlphaRatio(); SkColor inactive_color = SkColorSetA(active_color, 255 * inactive_alpha_ratio); - hosted_app_origin_text_ = - new HostedAppOriginText(browser, active_color, inactive_color); - - // Add the container for extra hosted app buttons (e.g app menu button). hosted_app_button_container_ = new HostedAppButtonContainer( - frame(), browser_view(), hosted_app_origin_text_, active_color, - inactive_color); - - if (IsMash()) { - hosted_app_extras_container_ = new views::View(); - auto layout = std::make_unique<views::BoxLayout>( - views::BoxLayout::kHorizontal, gfx::Insets(), - GetControlButtonSpacing()); - layout->set_cross_axis_alignment( - views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER); - layout->set_main_axis_alignment(views::BoxLayout::MAIN_AXIS_ALIGNMENT_END); - hosted_app_extras_container_->SetLayoutManager(std::move(layout)); - AddChildView(hosted_app_extras_container_); - - hosted_app_extras_container_->AddChildView(hosted_app_origin_text_); - hosted_app_extras_container_->AddChildView(hosted_app_button_container_); - } else { - caption_button_container_->AddChildViewAt(hosted_app_button_container_, 0); - AddChildView(hosted_app_origin_text_); - } + frame(), browser_view(), active_color, inactive_color); + AddChildView(hosted_app_button_container_); } void BrowserNonClientFrameViewAsh::UpdateFrameColors() {
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h index 95045cf..aa30c75 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h
@@ -28,7 +28,6 @@ class HostedAppNonClientFrameViewAshTest; } -class HostedAppOriginText; class HostedAppButtonContainer; class TabIconView; @@ -211,10 +210,6 @@ // Owned by views hierarchy. HostedAppButtonContainer* hosted_app_button_container_ = nullptr; - // URL origin text for hosted app windows. - // Owned by views hierarchy. - HostedAppOriginText* hosted_app_origin_text_ = nullptr; - // A view that contains the extra views used for hosted apps // (|hosted_app_button_container_| and |hosted_app_origin_text_|). // Only used in Mash.
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc index a816cef..6a2595d 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
@@ -811,8 +811,8 @@ return button_container->app_menu_button_->app_menu_for_testing(); } - SkColor GetActiveIconColor(HostedAppButtonContainer* button_container) { - return hosted_app_button_container_->active_icon_color_; + SkColor GetActiveColor(HostedAppButtonContainer* button_container) { + return hosted_app_button_container_->active_color_; } PageActionIconView* GetPageActionIcon(PageActionIconType type) { @@ -875,7 +875,7 @@ aura::Window* window = browser_view_->GetWidget()->GetNativeWindow(); EXPECT_EQ(GetThemeColor(),window->GetProperty(ash::kFrameActiveColorKey)); EXPECT_EQ(GetThemeColor(), window->GetProperty(ash::kFrameInactiveColorKey)); - EXPECT_EQ(SK_ColorWHITE, GetActiveIconColor(hosted_app_button_container_)); + EXPECT_EQ(SK_ColorWHITE, GetActiveColor(hosted_app_button_container_)); } // Make sure that for hosted apps, the height of the frame doesn't exceed the
diff --git a/chrome/browser/ui/views/frame/glass_browser_frame_view.cc b/chrome/browser/ui/views/frame/glass_browser_frame_view.cc index 10489a28a..16ddfec 100644 --- a/chrome/browser/ui/views/frame/glass_browser_frame_view.cc +++ b/chrome/browser/ui/views/frame/glass_browser_frame_view.cc
@@ -17,7 +17,6 @@ #include "chrome/browser/ui/view_ids.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/hosted_app_button_container.h" -#include "chrome/browser/ui/views/frame/hosted_app_origin_text.h" #include "chrome/browser/ui/views/profiles/profile_indicator_icon.h" #include "chrome/browser/ui/views/tabs/new_tab_button.h" #include "chrome/browser/ui/views/tabs/tab.h" @@ -68,22 +67,6 @@ width, height)); } -int AlignRight(views::View* view, - int next_leading_x, - int next_trailing_x, - int available_height) { - gfx::Size view_size; - if (view->visible()) - view_size = view->GetPreferredSize(); - const int width = std::min(view_size.width(), - std::max(0, next_trailing_x - next_leading_x)); - const int height = view_size.height(); - DCHECK_LE(height, available_height); - view->SetBounds(next_trailing_x - width, (available_height - height) / 2, - width, height); - return view->bounds().x(); -} - } // namespace /////////////////////////////////////////////////////////////////////////////// @@ -136,12 +119,8 @@ // HostedAppButtonContainer::UpdateIconsColor() via a delegate interface. SkColor active_color = GetTitlebarFeatureColor(true); SkColor inactive_color = GetTitlebarFeatureColor(false); - hosted_app_origin_text_ = new HostedAppOriginText( - browser_view->browser(), active_color, inactive_color); - AddChildView(hosted_app_origin_text_); hosted_app_button_container_ = new HostedAppButtonContainer( - frame, browser_view, hosted_app_origin_text_, active_color, - inactive_color); + frame, browser_view, active_color, inactive_color); AddChildView(hosted_app_button_container_); } @@ -526,7 +505,6 @@ if (hosted_app_button_container_) { hosted_app_button_container_->SetPaintAsActive(active); - hosted_app_origin_text_->SetPaintAsActive(active); } } @@ -933,13 +911,8 @@ if (hosted_app_button_container_) { DCHECK(!GetProfileSwitcherButton()); - next_trailing_x = AlignRight(hosted_app_button_container_, next_leading_x, - next_trailing_x, titlebar_visual_height); - hosted_app_button_container_->Layout(); - - next_trailing_x = AlignRight(hosted_app_origin_text_, next_leading_x, - next_trailing_x, titlebar_visual_height); - hosted_app_origin_text_->Layout(); + next_trailing_x = hosted_app_button_container_->LayoutInContainer( + next_leading_x, next_trailing_x, titlebar_visual_height); } if (ShowCustomTitle()) {
diff --git a/chrome/browser/ui/views/frame/glass_browser_frame_view.h b/chrome/browser/ui/views/frame/glass_browser_frame_view.h index b4a7bd0..1ed7fe6 100644 --- a/chrome/browser/ui/views/frame/glass_browser_frame_view.h +++ b/chrome/browser/ui/views/frame/glass_browser_frame_view.h
@@ -18,7 +18,6 @@ class BrowserView; class HostedAppButtonContainer; -class HostedAppOriginText; class GlassBrowserFrameView : public BrowserNonClientFrameView, public views::ButtonListener, @@ -197,9 +196,6 @@ // Menu button and page status icons. Only used by hosted app windows. HostedAppButtonContainer* hosted_app_button_container_ = nullptr; - // Sliding origin text. Only used by hosted app windows. - HostedAppOriginText* hosted_app_origin_text_ = nullptr; - // Custom-drawn caption buttons. Only used when custom-drawing the titlebar. Windows10CaptionButton* minimize_button_; Windows10CaptionButton* maximize_button_;
diff --git a/chrome/browser/ui/views/frame/hosted_app_button_container.cc b/chrome/browser/ui/views/frame/hosted_app_button_container.cc index 5404ca81..c1d621bf6 100644 --- a/chrome/browser/ui/views/frame/hosted_app_button_container.cc +++ b/chrome/browser/ui/views/frame/hosted_app_button_container.cc
@@ -190,17 +190,15 @@ } } -HostedAppButtonContainer::HostedAppButtonContainer( - views::Widget* widget, - BrowserView* browser_view, - HostedAppOriginText* hosted_app_origin_text, - SkColor active_icon_color, - SkColor inactive_icon_color) +HostedAppButtonContainer::HostedAppButtonContainer(views::Widget* widget, + BrowserView* browser_view, + SkColor active_color, + SkColor inactive_color) : scoped_widget_observer_(this), browser_view_(browser_view), - hosted_app_origin_text_(hosted_app_origin_text), - active_icon_color_(active_icon_color), - inactive_icon_color_(inactive_icon_color), + active_color_(active_color), + inactive_color_(inactive_color), + hosted_app_origin_text_(new HostedAppOriginText(browser_view->browser())), content_settings_container_(new ContentSettingsContainer(browser_view)), page_action_icon_container_view_(new PageActionIconContainerView( {PageActionIconType::kFind, PageActionIconType::kZoom}, @@ -226,6 +224,8 @@ layout.set_cross_axis_alignment( views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER); + AddChildView(hosted_app_origin_text_); + content_settings_container_->SetProperty(views::kHitTestComponentKey, static_cast<int>(HTCLIENT)); AddChildView(content_settings_container_); @@ -239,7 +239,7 @@ AddChildView(browser_actions_container_); AddChildView(app_menu_button_); - UpdateIconsColor(); + UpdateChildrenColor(); browser_view_->SetToolbarButtonProvider(this); browser_view_->immersive_mode_controller()->AddObserver(this); @@ -261,11 +261,29 @@ if (paint_as_active_ == active) return; paint_as_active_ = active; - UpdateIconsColor(); + UpdateChildrenColor(); +} + +int HostedAppButtonContainer::LayoutInContainer(int leading_x, + int trailing_x, + int available_height) { + if (available_height == 0) { + SetSize(gfx::Size()); + return trailing_x; + } + + gfx::Size preferred_size = GetPreferredSize(); + const int width = + std::min(preferred_size.width(), std::max(0, trailing_x - leading_x)); + const int height = preferred_size.height(); + DCHECK_LE(height, available_height); + SetBounds(trailing_x - width, (available_height - height) / 2, width, height); + Layout(); + return bounds().x(); } bool HostedAppButtonContainer::ShouldAnimate() const { - return !g_animation_disabled_for_testing && hosted_app_origin_text_ && + return !g_animation_disabled_for_testing && !browser_view_->immersive_mode_controller()->IsEnabled(); } @@ -289,12 +307,12 @@ g_animation_disabled_for_testing = true; } -void HostedAppButtonContainer::UpdateIconsColor() { - SkColor icon_color = - paint_as_active_ ? active_icon_color_ : inactive_icon_color_; - content_settings_container_->SetIconColor(icon_color); - page_action_icon_container_view_->SetIconColor(icon_color); - app_menu_button_->SetIconColor(icon_color); +void HostedAppButtonContainer::UpdateChildrenColor() { + SkColor color = paint_as_active_ ? active_color_ : inactive_color_; + hosted_app_origin_text_->SetTextColor(color); + content_settings_container_->SetIconColor(color); + page_action_icon_container_view_->SetIconColor(color); + app_menu_button_->SetIconColor(color); } void HostedAppButtonContainer::ChildPreferredSizeChanged(views::View* child) {
diff --git a/chrome/browser/ui/views/frame/hosted_app_button_container.h b/chrome/browser/ui/views/frame/hosted_app_button_container.h index f39a9cd..d7268438 100644 --- a/chrome/browser/ui/views/frame/hosted_app_button_container.h +++ b/chrome/browser/ui/views/frame/hosted_app_button_container.h
@@ -44,13 +44,12 @@ public ImmersiveModeController::Observer, public views::WidgetObserver { public: - // |active_icon_color| and |inactive_icon_color| indicate the colors to use + // |active_color| and |inactive_color| indicate the colors to use // for button icons when the window is focused and blurred respectively. HostedAppButtonContainer(views::Widget* widget, BrowserView* browser_view, - HostedAppOriginText* hosted_app_origin_text, - SkColor active_icon_color, - SkColor inactive_icon_color); + SkColor active_color, + SkColor inactive_color); ~HostedAppButtonContainer() override; void UpdateContentSettingViewsVisibility(); @@ -58,6 +57,8 @@ // Sets the container to paints its buttons the active/inactive color. void SetPaintAsActive(bool active); + int LayoutInContainer(int leading_x, int trailing_x, int available_height); + private: friend class HostedAppNonClientFrameViewAshTest; friend class HostedAppGlassBrowserFrameViewTest; @@ -80,7 +81,7 @@ const std::vector<ContentSettingImageView*>& GetContentSettingViewsForTesting() const; - void UpdateIconsColor(); + void UpdateChildrenColor(); // views::View: void ChildPreferredSizeChanged(views::View* child) override; @@ -124,15 +125,13 @@ // The containing browser view. BrowserView* browser_view_; - // The origin text to coordinate the titlebar animation with. - HostedAppOriginText* hosted_app_origin_text_ = nullptr; - - // Button colors. + // Button and text colors. bool paint_as_active_ = true; - const SkColor active_icon_color_; - const SkColor inactive_icon_color_; + const SkColor active_color_; + const SkColor inactive_color_; // Owned by the views hierarchy. + HostedAppOriginText* hosted_app_origin_text_ = nullptr; ContentSettingsContainer* content_settings_container_ = nullptr; PageActionIconContainerView* page_action_icon_container_view_ = nullptr; BrowserActionsContainer* browser_actions_container_ = nullptr;
diff --git a/chrome/browser/ui/views/frame/hosted_app_origin_text.cc b/chrome/browser/ui/views/frame/hosted_app_origin_text.cc index 3aee653..335d273 100644 --- a/chrome/browser/ui/views/frame/hosted_app_origin_text.cc +++ b/chrome/browser/ui/views/frame/hosted_app_origin_text.cc
@@ -27,10 +27,7 @@ } // namespace -HostedAppOriginText::HostedAppOriginText(Browser* browser, - SkColor active_color, - SkColor inactive_color) - : active_color_(active_color), inactive_color_(inactive_color) { +HostedAppOriginText::HostedAppOriginText(Browser* browser) { DCHECK( extensions::HostedAppBrowserController::IsForExperimentalHostedAppBrowser( browser)); @@ -42,7 +39,6 @@ .release(); label_->SetElideBehavior(gfx::ELIDE_HEAD); label_->SetSubpixelRenderingEnabled(false); - label_->SetEnabledColor(active_color); // Disable Label's auto readability to ensure consistent colors in the title // bar (see http://crbug.com/814121#c2). label_->SetAutoColorReadabilityEnabled(false); @@ -59,8 +55,8 @@ HostedAppOriginText::~HostedAppOriginText() = default; -void HostedAppOriginText::SetPaintAsActive(bool active) { - label_->SetEnabledColor(active ? active_color_ : inactive_color_); +void HostedAppOriginText::SetTextColor(SkColor color) { + label_->SetEnabledColor(color); } void HostedAppOriginText::StartSlideAnimation() {
diff --git a/chrome/browser/ui/views/frame/hosted_app_origin_text.h b/chrome/browser/ui/views/frame/hosted_app_origin_text.h index 18a6079..1e730fe 100644 --- a/chrome/browser/ui/views/frame/hosted_app_origin_text.h +++ b/chrome/browser/ui/views/frame/hosted_app_origin_text.h
@@ -20,13 +20,10 @@ // A URL's origin text with a slide in/out animation. class HostedAppOriginText : public views::View { public: - HostedAppOriginText(Browser* browser, - SkColor active_color, - SkColor inactive_color); + explicit HostedAppOriginText(Browser* browser); ~HostedAppOriginText() override; - // Sets whether to paint the text with the active/inactive color. - void SetPaintAsActive(bool active); + void SetTextColor(SkColor color); // Slides the text in and out. void StartSlideAnimation(); @@ -43,9 +40,6 @@ void AnimationComplete(); - const SkColor active_color_; - const SkColor inactive_color_; - base::WeakPtrFactory<HostedAppOriginText> weak_factory_{this}; DISALLOW_COPY_AND_ASSIGN(HostedAppOriginText);
diff --git a/chrome/browser/ui/views/harmony/chrome_typography.cc b/chrome/browser/ui/views/harmony/chrome_typography.cc index 83cf11f..5595b3b 100644 --- a/chrome/browser/ui/views/harmony/chrome_typography.cc +++ b/chrome/browser/ui/views/harmony/chrome_typography.cc
@@ -55,7 +55,7 @@ // consider dynamically resizing all of the toolbar based on the actual // final item height. static const int fixed_height = - ui::MaterialDesignController::IsTouchOptimizedUiEnabled() ? 22 : 18; + ui::MaterialDesignController::IsTouchOptimizedUiEnabled() ? 22 : 17; static const int toolbar_button_delta = GetFontSizeDeltaBoundedByAvailableHeight(fixed_height, fixed_height); *size_delta = toolbar_button_delta;
diff --git a/chrome/browser/ui/views/menu_interactive_uitest.cc b/chrome/browser/ui/views/menu_interactive_uitest.cc index c030c05..ff777d2 100644 --- a/chrome/browser/ui/views/menu_interactive_uitest.cc +++ b/chrome/browser/ui/views/menu_interactive_uitest.cc
@@ -6,6 +6,7 @@ #include "base/macros.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" +#include "chrome/browser/ui/browser_commands.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/interactive_test_utils.h" #include "chrome/test/base/test_browser_window.h" @@ -106,5 +107,35 @@ widget->Close(); } +// This test creates a menu without a parent widget, and tests that it +// can receive keyboard events. +// TODO(davidbienvenu): If possible, get test working for linux and +// mac. Only status_icon_win runs a menu with a null parent widget +// currently. +#ifdef OS_WIN +IN_PROC_BROWSER_TEST_F(MenuControllerUITest, FocusOnOrphanMenu) { + // Going into full screen mode prevents pre-test focus and mouse position + // state from affecting test, and helps ui_controls function correctly. + chrome::ToggleFullscreenMode(browser()); + MenuDelegate menu_delegate; + MenuItemView* menu_item = new MenuItemView(&menu_delegate); + std::unique_ptr<MenuRunner> menu_runner( + std::make_unique<MenuRunner>(menu_item, views::MenuRunner::CONTEXT_MENU)); + MenuItemView* first_item = + menu_item->AppendMenuItemWithLabel(1, base::ASCIIToUTF16("One")); + menu_item->AppendMenuItemWithLabel(2, base::ASCIIToUTF16("Two")); + menu_runner->RunMenuAt(nullptr, nullptr, gfx::Rect(), + views::MENU_ANCHOR_TOPLEFT, ui::MENU_SOURCE_NONE); + base::RunLoop loop; + // SendKeyPress fails if the window doesn't have focus. + ASSERT_TRUE(ui_controls::SendKeyPressNotifyWhenDone( + menu_item->GetSubmenu()->GetWidget()->GetNativeWindow(), ui::VKEY_DOWN, + false, false, false, false, loop.QuitClosure())); + loop.Run(); + EXPECT_TRUE(first_item->IsSelected()); + menu_runner->Cancel(); +} +#endif // OS_WIN + } // namespace test } // namespace views
diff --git a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc index d65f3b14..44ef769 100644 --- a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc +++ b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
@@ -6,6 +6,7 @@ #include "base/macros.h" #include "build/build_config.h" +#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_avatar_icon_util.h" #include "chrome/browser/signin/signin_promo.h" @@ -221,6 +222,9 @@ int dialog_width = opt_width.value_or(kModalDialogWidth); views::WebView* web_view = new views::WebView(browser->profile()); web_view->LoadInitialURL(GURL(url)); + // To record metrics using javascript, extensions are needed. + extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( + web_view->GetWebContents()); SigninWebDialogUI* web_dialog_ui = static_cast<SigninWebDialogUI*>( web_view->GetWebContents()->GetWebUI()->GetController());
diff --git a/chrome/browser/ui/webui/version_ui.cc b/chrome/browser/ui/webui/version_ui.cc index bc9b88c..746db9d5 100644 --- a/chrome/browser/ui/webui/version_ui.cc +++ b/chrome/browser/ui/webui/version_ui.cc
@@ -141,8 +141,6 @@ #endif #if defined(OS_WIN) - html_source->AddString("linker", CHROMIUM_LINKER_NAME); - base::string16 update_cohort_name = install_static::InstallDetails::Get().update_cohort_name(); if (!update_cohort_name.empty()) {
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn index a3f7530..4716327 100644 --- a/chrome/browser/web_applications/BUILD.gn +++ b/chrome/browser/web_applications/BUILD.gn
@@ -20,7 +20,7 @@ testonly = true deps = [ "//chrome/browser/web_applications/bookmark_apps:unit_tests", - "//chrome/browser/web_applications/components:components_unit_tests", + "//chrome/browser/web_applications/components:unit_tests", "//chrome/browser/web_applications/extensions:unit_tests", ] }
diff --git a/chrome/browser/web_applications/bookmark_apps/BUILD.gn b/chrome/browser/web_applications/bookmark_apps/BUILD.gn index 12dc550..c79a8c9 100644 --- a/chrome/browser/web_applications/bookmark_apps/BUILD.gn +++ b/chrome/browser/web_applications/bookmark_apps/BUILD.gn
@@ -8,6 +8,8 @@ source_set("bookmark_apps") { sources = [ + "external_web_apps.cc", + "external_web_apps.h", "policy/web_app_policy_constants.cc", "policy/web_app_policy_constants.h", "policy/web_app_policy_manager.cc", @@ -25,6 +27,7 @@ testonly = true sources = [ + "external_web_apps_unittest.cc", "policy/web_app_policy_manager_unittest.cc", ]
diff --git a/chrome/browser/web_applications/bookmark_apps/external_web_apps.cc b/chrome/browser/web_applications/bookmark_apps/external_web_apps.cc new file mode 100644 index 0000000..f65bc5d --- /dev/null +++ b/chrome/browser/web_applications/bookmark_apps/external_web_apps.cc
@@ -0,0 +1,80 @@ +// 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. + +#include "chrome/browser/web_applications/bookmark_apps/external_web_apps.h" + +#include <memory> +#include <string> +#include <utility> + +#include "base/callback.h" +#include "base/files/file_enumerator.h" +#include "base/json/json_file_value_serializer.h" +#include "base/threading/thread_restrictions.h" +#include "url/gurl.h" + +namespace web_app { + +static constexpr char kWebAppManifestUrl[] = "web_app_manifest_url"; +static constexpr char kWebAppStartUrl[] = "web_app_start_url"; + +void ScanDirForExternalWebApps(base::FilePath dir, + ScanDirForExternalWebAppsCallback callback) { + base::AssertBlockingAllowed(); + base::FilePath::StringType extension(FILE_PATH_LITERAL(".json")); + base::FileEnumerator json_files(dir, + false, // Recursive. + base::FileEnumerator::FILES); + + std::vector<web_app::PendingAppManager::AppInfo> app_infos; + + for (base::FilePath file = json_files.Next(); !file.empty(); + file = json_files.Next()) { + if (!file.MatchesExtension(extension)) { + continue; + } + + JSONFileValueDeserializer deserializer(file); + std::string error_msg; + std::unique_ptr<base::Value> value = + deserializer.Deserialize(nullptr, &error_msg); + if (!value) { + VLOG(2) << file.value() << " was not valid JSON: " << error_msg; + continue; + } + if (value->type() != base::Value::Type::DICTIONARY) { + VLOG(2) << file.value() << " was not a dictionary as the top level"; + continue; + } + std::unique_ptr<base::DictionaryValue> dict_value = + base::DictionaryValue::From(std::move(value)); + + std::string manifest_url_str; + if (!dict_value->GetString(kWebAppStartUrl, &manifest_url_str) || + manifest_url_str.empty() || !GURL(manifest_url_str).is_valid()) { + VLOG(2) << file.value() << " had an invalid " << kWebAppManifestUrl; + continue; + } + + std::string start_url_str; + if (!dict_value->GetString(kWebAppStartUrl, &start_url_str) || + start_url_str.empty()) { + VLOG(2) << file.value() << " had an invalid " << kWebAppStartUrl; + continue; + } + GURL start_url(start_url_str); + if (!start_url.is_valid()) { + VLOG(2) << file.value() << " had an invalid " << kWebAppStartUrl; + continue; + } + + app_infos.emplace_back( + std::move(start_url), + web_app::PendingAppManager::LaunchContainer::kWindow); + } + + std::move(callback).Run(std::move(app_infos)); +} + +} // namespace web_app
diff --git a/chrome/browser/web_applications/bookmark_apps/external_web_apps.h b/chrome/browser/web_applications/bookmark_apps/external_web_apps.h new file mode 100644 index 0000000..5976242 --- /dev/null +++ b/chrome/browser/web_applications/bookmark_apps/external_web_apps.h
@@ -0,0 +1,29 @@ +// 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. + +#ifndef CHROME_BROWSER_WEB_APPLICATIONS_BOOKMARK_APPS_EXTERNAL_WEB_APPS_H_ +#define CHROME_BROWSER_WEB_APPLICATIONS_BOOKMARK_APPS_EXTERNAL_WEB_APPS_H_ + +#include <vector> + +#include "base/callback_forward.h" +#include "base/files/file_path.h" +#include "chrome/browser/web_applications/components/pending_app_manager.h" + +namespace web_app { + +using ScanDirForExternalWebAppsCallback = + base::OnceCallback<void(std::vector<web_app::PendingAppManager::AppInfo>)>; + +// Scans the given directory (non-recursively) for *.json files that define +// "external web apps", the Web App analogs of "external extensions", described +// at https://developer.chrome.com/apps/external_extensions +// +// This function performs file I/O, and must not be scheduled on UI threads. +void ScanDirForExternalWebApps(base::FilePath dir, + ScanDirForExternalWebAppsCallback callback); + +} // namespace web_app + +#endif // CHROME_BROWSER_WEB_APPLICATIONS_BOOKMARK_APPS_EXTERNAL_WEB_APPS_H_
diff --git a/chrome/browser/web_applications/bookmark_apps/external_web_apps_unittest.cc b/chrome/browser/web_applications/bookmark_apps/external_web_apps_unittest.cc new file mode 100644 index 0000000..84c98b1 --- /dev/null +++ b/chrome/browser/web_applications/bookmark_apps/external_web_apps_unittest.cc
@@ -0,0 +1,92 @@ +// Copyright (c) 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. + +#include "chrome/browser/web_applications/bookmark_apps/external_web_apps.h" + +#include <algorithm> +#include <vector> + +#include "base/bind.h" +#include "base/callback.h" +#include "base/path_service.h" +#include "chrome/common/chrome_paths.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace { + +static constexpr char kWebAppDefaultApps[] = "web_app_default_apps"; + +// Returns the chrome/test/data/web_app_default_apps/sub_dir directory that +// holds the *.json data files from which ScanDirForExternalWebApps should +// extract URLs from. +static base::FilePath test_dir(const char* sub_dir) { + base::FilePath dir; + if (!base::PathService::Get(chrome::DIR_TEST_DATA, &dir)) { + ADD_FAILURE() + << "base::PathService::Get could not resolve chrome::DIR_TEST_DATA"; + } + return dir.AppendASCII(kWebAppDefaultApps).AppendASCII(sub_dir); +} + +using AppInfos = std::vector<web_app::PendingAppManager::AppInfo>; + +} // namespace + +class ScanDirForExternalWebAppsTest : public testing::Test {}; + +TEST_F(ScanDirForExternalWebAppsTest, GoodJson) { + // The good_json directory contains two good JSON files: + // chrome_platform_status.json and google_io_2016.json. + web_app::ScanDirForExternalWebApps( + test_dir("good_json"), base::BindOnce([](AppInfos app_infos) { + static std::string urls[] = { + "https://www.chromestatus.com/features", + "https://events.google.com/io2016/?utm_source=web_app_manifest", + }; + + EXPECT_EQ(2u, app_infos.size()); + + for (const auto& url : urls) { + EXPECT_NE( + app_infos.end(), + std::find( + app_infos.begin(), app_infos.end(), + web_app::PendingAppManager::AppInfo( + GURL(url), + web_app::PendingAppManager::LaunchContainer::kWindow))); + } + })); +} + +TEST_F(ScanDirForExternalWebAppsTest, BadJson) { + // The bad_json directory contains one (malformed) JSON file. + web_app::ScanDirForExternalWebApps(test_dir("bad_json"), + base::BindOnce([](AppInfos app_infos) { + EXPECT_EQ(0u, app_infos.size()); + })); +} + +TEST_F(ScanDirForExternalWebAppsTest, TxtButNoJson) { + // The txt_but_no_json directory contains one file, and the contents of that + // file is valid JSON, but that file's name does not end with ".json". + web_app::ScanDirForExternalWebApps(test_dir("txt_but_no_json"), + base::BindOnce([](AppInfos app_infos) { + EXPECT_EQ(0u, app_infos.size()); + })); +} + +TEST_F(ScanDirForExternalWebAppsTest, MixedJson) { + // The mixed_json directory contains one empty JSON file, one malformed JSON + // file and one good JSON file. ScanDirForExternalWebApps should still pick + // up that one good JSON file: polytimer.json. + web_app::ScanDirForExternalWebApps( + test_dir("mixed_json"), base::BindOnce([](AppInfos app_infos) { + EXPECT_EQ(1u, app_infos.size()); + if (app_infos.size() == 1) { + EXPECT_EQ(app_infos[0].url.spec(), + std::string("https://polytimer.rocks/?homescreen=1")); + } + })); +}
diff --git a/chrome/browser/web_applications/components/BUILD.gn b/chrome/browser/web_applications/components/BUILD.gn index 22723d2a..4a873648 100644 --- a/chrome/browser/web_applications/components/BUILD.gn +++ b/chrome/browser/web_applications/components/BUILD.gn
@@ -44,7 +44,7 @@ ] } -source_set("components_unit_tests") { +source_set("unit_tests") { testonly = true sources = [
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_data_retriever.cc b/chrome/browser/web_applications/extensions/bookmark_app_data_retriever.cc index f5946cb..6518d02 100644 --- a/chrome/browser/web_applications/extensions/bookmark_app_data_retriever.cc +++ b/chrome/browser/web_applications/extensions/bookmark_app_data_retriever.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/web_applications/extensions/bookmark_app_data_retriever.h" +#include <memory> #include <string> #include <utility> #include <vector> @@ -40,7 +41,7 @@ if (!entry) { base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, - base::BindOnce(std::move(get_web_app_info_callback_), base::nullopt)); + base::BindOnce(std::move(get_web_app_info_callback_), nullptr)); return; } @@ -113,11 +114,11 @@ content::NavigationEntry* entry = web_contents->GetController().GetLastCommittedEntry(); if (!entry || last_committed_nav_entry_unique_id != entry->GetUniqueID()) { - std::move(get_web_app_info_callback_).Run(base::nullopt); + std::move(get_web_app_info_callback_).Run(nullptr); return; } - base::Optional<WebApplicationInfo> info(web_app_info); + auto info = std::make_unique<WebApplicationInfo>(web_app_info); if (info->app_url.is_empty()) info->app_url = web_contents->GetLastCommittedURL(); @@ -130,7 +131,7 @@ } void BookmarkAppDataRetriever::OnGetWebApplicationInfoFailed() { - std::move(get_web_app_info_callback_).Run(base::nullopt); + std::move(get_web_app_info_callback_).Run(nullptr); } } // namespace extensions
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_data_retriever.h b/chrome/browser/web_applications/extensions/bookmark_app_data_retriever.h index 7d5643d2..467446c 100644 --- a/chrome/browser/web_applications/extensions/bookmark_app_data_retriever.h +++ b/chrome/browser/web_applications/extensions/bookmark_app_data_retriever.h
@@ -5,12 +5,12 @@ #ifndef CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_BOOKMARK_APP_DATA_RETRIEVER_H_ #define CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_BOOKMARK_APP_DATA_RETRIEVER_H_ +#include <memory> #include <vector> #include "base/callback_forward.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" -#include "base/optional.h" #include "chrome/common/chrome_render_frame.mojom.h" #include "chrome/common/web_application_info.h" @@ -25,7 +25,7 @@ class BookmarkAppDataRetriever { public: using GetWebApplicationInfoCallback = - base::OnceCallback<void(base::Optional<WebApplicationInfo>)>; + base::OnceCallback<void(std::unique_ptr<WebApplicationInfo>)>; using GetIconsCallback = base::OnceCallback<void(std::vector<WebApplicationInfo::IconInfo>)>;
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_data_retriever_unittest.cc b/chrome/browser/web_applications/extensions/bookmark_app_data_retriever_unittest.cc index 5bb5277..0a9fa2bd 100644 --- a/chrome/browser/web_applications/extensions/bookmark_app_data_retriever_unittest.cc +++ b/chrome/browser/web_applications/extensions/bookmark_app_data_retriever_unittest.cc
@@ -4,9 +4,11 @@ #include "chrome/browser/web_applications/extensions/bookmark_app_data_retriever.h" +#include <memory> #include <utility> #include <vector> +#include "base/optional.h" #include "base/strings/utf_string_conversions.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "chrome/test/base/testing_profile.h" @@ -85,8 +87,8 @@ void GetWebApplicationInfoCallback( base::OnceClosure quit_closure, - base::Optional<WebApplicationInfo> web_app_info) { - web_app_info_ = web_app_info; + std::unique_ptr<WebApplicationInfo> web_app_info) { + web_app_info_ = std::move(web_app_info); std::move(quit_closure).Run(); } @@ -101,14 +103,14 @@ return content::WebContentsTester::For(web_contents()); } - const base::Optional<WebApplicationInfo>& web_app_info() { + const std::unique_ptr<WebApplicationInfo>& web_app_info() { return web_app_info_.value(); } const std::vector<WebApplicationInfo::IconInfo>& icons() { return icons_; } private: - base::Optional<base::Optional<WebApplicationInfo>> web_app_info_; + base::Optional<std::unique_ptr<WebApplicationInfo>> web_app_info_; std::vector<WebApplicationInfo::IconInfo> icons_; DISALLOW_COPY_AND_ASSIGN(BookmarkAppDataRetrieverTest); @@ -124,7 +126,7 @@ base::Unretained(this), run_loop.QuitClosure())); run_loop.Run(); - EXPECT_EQ(base::nullopt, web_app_info()); + EXPECT_EQ(nullptr, web_app_info()); } TEST_F(BookmarkAppDataRetrieverTest, GetWebApplicationInfo_AppUrlAbsent) { @@ -242,7 +244,7 @@ DeleteContents(); run_loop.Run(); - EXPECT_EQ(base::nullopt, web_app_info()); + EXPECT_EQ(nullptr, web_app_info()); } TEST_F(BookmarkAppDataRetrieverTest, GetWebApplicationInfo_FrameNavigated) { @@ -261,7 +263,7 @@ web_contents_tester()->NavigateAndCommit(GURL(kFooUrl2)); run_loop.Run(); - EXPECT_EQ(base::nullopt, web_app_info()); + EXPECT_EQ(nullptr, web_app_info()); } TEST_F(BookmarkAppDataRetrieverTest, GetIcons_NoIconsProvided) {
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc b/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc index 53bff853..e0ef7280 100644 --- a/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc +++ b/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc
@@ -64,7 +64,7 @@ // when running callbacks to simulate async behavior in tests as well. class TestDataRetriever : public BookmarkAppDataRetriever { public: - explicit TestDataRetriever(base::Optional<WebApplicationInfo> web_app_info) + explicit TestDataRetriever(std::unique_ptr<WebApplicationInfo> web_app_info) : web_app_info_(std::move(web_app_info)) {} ~TestDataRetriever() override = default; @@ -73,7 +73,8 @@ GetWebApplicationInfoCallback callback) override { DCHECK(web_contents); base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), web_app_info_)); + FROM_HERE, + base::BindOnce(std::move(callback), std::move(web_app_info_))); } void GetIcons(const GURL& app_url, @@ -85,7 +86,7 @@ } private: - base::Optional<WebApplicationInfo> web_app_info_; + std::unique_ptr<WebApplicationInfo> web_app_info_; DISALLOW_COPY_AND_ASSIGN(TestDataRetriever); }; @@ -93,7 +94,7 @@ TEST_F(BookmarkAppInstallationTaskTest, ShortcutFromContents_Delete) { auto installer = std::make_unique<BookmarkAppShortcutInstallationTask>(); installer->SetDataRetrieverForTesting( - std::make_unique<TestDataRetriever>(base::nullopt)); + std::make_unique<TestDataRetriever>(nullptr)); base::RunLoop run_loop; installer->InstallFromWebContents( @@ -109,7 +110,7 @@ TEST_F(BookmarkAppInstallationTaskTest, ShortcutFromContents_NoWebAppInfo) { auto installer = std::make_unique<BookmarkAppShortcutInstallationTask>(); installer->SetDataRetrieverForTesting( - std::make_unique<TestDataRetriever>(base::nullopt)); + std::make_unique<TestDataRetriever>(nullptr)); base::RunLoop run_loop; installer->InstallFromWebContents( @@ -130,7 +131,7 @@ info.app_url = GURL(kWebAppUrl); info.title = base::UTF8ToUTF16(kWebAppTitle); installer->SetDataRetrieverForTesting(std::make_unique<TestDataRetriever>( - base::make_optional(std::move(info)))); + std::make_unique<WebApplicationInfo>(std::move(info)))); base::RunLoop run_loop; installer->InstallFromWebContents(
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.cc b/chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.cc index 459c675..dccc059b 100644 --- a/chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.cc +++ b/chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.h" +#include <memory> #include <utility> #include <vector> @@ -35,7 +36,7 @@ void BookmarkAppShortcutInstallationTask::OnGetWebApplicationInfo( ResultCallback result_callback, - base::Optional<WebApplicationInfo> web_app_info) { + std::unique_ptr<WebApplicationInfo> web_app_info) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); if (!web_app_info) { std::move(result_callback).Run(Result::kGetWebApplicationInfoFailed);
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.h b/chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.h index 393c34e6..71d117c 100644 --- a/chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.h +++ b/chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.h
@@ -5,11 +5,11 @@ #ifndef CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_BOOKMARK_APP_SHORTCUT_INSTALLATION_TASK_H_ #define CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_BOOKMARK_APP_SHORTCUT_INSTALLATION_TASK_H_ +#include <memory> #include <vector> #include "base/callback.h" #include "base/memory/weak_ptr.h" -#include "base/optional.h" #include "chrome/browser/web_applications/extensions/bookmark_app_installation_task.h" #include "chrome/common/web_application_info.h" @@ -30,8 +30,9 @@ ResultCallback callback); private: - void OnGetWebApplicationInfo(ResultCallback result_callback, - base::Optional<WebApplicationInfo> web_app_info); + void OnGetWebApplicationInfo( + ResultCallback result_callback, + std::unique_ptr<WebApplicationInfo> web_app_info); void OnGetIcons(ResultCallback result_callback, std::vector<WebApplicationInfo::IconInfo> icons);
diff --git a/chrome/browser/web_applications/web_app_provider.cc b/chrome/browser/web_applications/web_app_provider.cc index 6ccec79..5e4ef808 100644 --- a/chrome/browser/web_applications/web_app_provider.cc +++ b/chrome/browser/web_applications/web_app_provider.cc
@@ -4,8 +4,14 @@ #include "chrome/browser/web_applications/web_app_provider.h" +#include "base/bind.h" +#include "base/path_service.h" +#include "base/task_scheduler/post_task.h" +#include "build/build_config.h" +#include "chrome/browser/web_applications/bookmark_apps/external_web_apps.h" #include "chrome/browser/web_applications/bookmark_apps/policy/web_app_policy_manager.h" #include "chrome/browser/web_applications/web_app_provider_factory.h" +#include "chrome/common/chrome_paths.h" namespace web_app { @@ -17,9 +23,70 @@ WebAppProvider::WebAppProvider(PrefService* pref_service) : web_app_policy_manager_( std::make_unique<WebAppPolicyManager>(pref_service)) { - // TODO(nigeltao): install default web apps as per http://crbug.com/855281 +#if defined(OS_CHROMEOS) + // As of mid 2018, only Chrome OS has default web apps or external web apps. + // In the future, we might open external web apps to other flavors. + ScanForExternalWebApps(); +#endif // defined(OS_CHROMEOS) } WebAppProvider::~WebAppProvider() = default; +void WebAppProvider::ScanForExternalWebApps() { +#if !defined(OS_CHROMEOS) + // chrome::DIR_STANDALONE_EXTERNAL_EXTENSIONS is only defined for OS_LINUX. + // OS_CHROMEOS is a variant of OS_LINUX. +#else + // For manual testing, it can be useful to s/STANDALONE/USER/, as writing to + // "$HOME/.config/chromium/test-user/.config/chromium/External Extensions" + // does not require root ACLs, unlike "/usr/share/chromium/extensions". + // + // TODO(nigeltao): do we want to append a sub-directory name, analogous to + // the "arc" in "/usr/share/chromium/extensions/arc" as per + // chrome/browser/ui/app_list/arc/arc_default_app_list.cc? Or should we not + // sort "system apps" into directories based on their platform (e.g. ARC, + // PWA, etc.), and instead examine the JSON contents (e.g. an "activity" + // key means ARC, "web_app_start_url" key means PWA, etc.)? + base::FilePath dir; + if (!base::PathService::Get(chrome::DIR_STANDALONE_EXTERNAL_EXTENSIONS, + &dir)) { + LOG(ERROR) << "ScanForExternalWebApps: base::PathService::Get failed"; + return; + } + + auto callback = + base::BindOnce(&WebAppProvider::ScanForExternalWebAppsCallback, + weak_ptr_factory_.GetWeakPtr()); + + base::PostTaskWithTraits(FROM_HERE, + {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, + base::BindOnce(&web_app::ScanDirForExternalWebApps, + dir, std::move(callback))); +#endif // !defined(OS_CHROMEOS) +} + +void WebAppProvider::ScanForExternalWebAppsCallback( + std::vector<web_app::PendingAppManager::AppInfo> app_infos) { + // TODO(nigeltao/ortuno): we shouldn't need a *policy* manager to get to a + // PendingAppManager. As ortuno@ says, "We should refactor PendingAppManager + // to no longer be owned by WebAppPolicyManager. I made it that way since at + // the time, WebAppPolicyManager was its only client." + // + // TODO(nigeltao/ortuno): drop the const_cast. Either + // WebAppPolicyManager::pending_app_manager should lose the const or we + // should acquire a (non-const) PendingAppManager by other means. + auto& pending_app_manager = const_cast<web_app::PendingAppManager&>( + web_app_policy_manager_->pending_app_manager()); + + // TODO(nigeltao/ortuno): confirm that the PendingAppManager callee is + // responsible for filtering out already-installed apps. + // + // TODO(nigeltao/ortuno): does the PendingAppManager care which thread we're + // on (e.g. "the UI thread", "the File thread") when we call into it? Do we + // need to bounce to another thread from here? Note that, in the long term, + // we might not be in the browser process, so there might not be the concept + // of "the UI thread". + pending_app_manager.ProcessAppOperations(std::move(app_infos)); +} + } // namespace web_app
diff --git a/chrome/browser/web_applications/web_app_provider.h b/chrome/browser/web_applications/web_app_provider.h index f2bec23..9a7f35da 100644 --- a/chrome/browser/web_applications/web_app_provider.h +++ b/chrome/browser/web_applications/web_app_provider.h
@@ -6,8 +6,11 @@ #define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_PROVIDER_H_ #include <memory> +#include <vector> #include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "chrome/browser/web_applications/components/pending_app_manager.h" #include "components/keyed_service/core/keyed_service.h" #include "components/prefs/pref_service.h" @@ -29,8 +32,14 @@ ~WebAppProvider() override; private: + void ScanForExternalWebApps(); + void ScanForExternalWebAppsCallback( + std::vector<web_app::PendingAppManager::AppInfo>); + std::unique_ptr<WebAppPolicyManager> web_app_policy_manager_; + base::WeakPtrFactory<WebAppProvider> weak_ptr_factory_{this}; + DISALLOW_COPY_AND_ASSIGN(WebAppProvider); };
diff --git a/chrome/renderer/autofill/form_autofill_browsertest.cc b/chrome/renderer/autofill/form_autofill_browsertest.cc index 540e876..c9d8961 100644 --- a/chrome/renderer/autofill/form_autofill_browsertest.cc +++ b/chrome/renderer/autofill/form_autofill_browsertest.cc
@@ -1249,7 +1249,7 @@ // This will be considered as a value entered by the user. control_elements[1].SetValue(WebString::FromUTF16(ASCIIToUTF16("Earp"))); - control_elements[1].SetIsEnteredByUserForTest(); + control_elements[1].SetUserHasEditedTheFieldForTest(); // This will be ignored, the string will be sanitized into an empty string. control_elements[2].SetValue( @@ -1527,7 +1527,126 @@ control_elements[1].SetValue(WebString::FromUTF16(ASCIIToUTF16("____/__"))); control_elements[2].SetValue( WebString::FromUTF16(ASCIIToUTF16("John Smith"))); - control_elements[2].SetIsEnteredByUserForTest(); + control_elements[2].SetUserHasEditedTheFieldForTest(); + + // Find the form that contains the input element. + FormData form; + FormFieldData field; + EXPECT_TRUE( + FindFormAndFieldForFormControlElement(input_element, &form, &field)); + EXPECT_EQ(GetCanonicalOriginForDocument(web_frame->GetDocument()), + form.origin); + EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); + EXPECT_EQ(GURL("http://abc.com"), form.action); + + const std::vector<FormFieldData>& fields = form.fields; + ASSERT_EQ(3U, fields.size()); + + // Preview the form and verify that the cursor position has been updated. + form.fields[0].value = ASCIIToUTF16("1111-2222-3333-4444"); + form.fields[1].value = ASCIIToUTF16("03/2030"); + form.fields[2].value = ASCIIToUTF16("Susan Smith"); + form.fields[0].is_autofilled = true; + form.fields[1].is_autofilled = true; + form.fields[2].is_autofilled = true; + PreviewForm(form, input_element); + // The selection should be set after the 19th character. + EXPECT_EQ(19, input_element.SelectionStart()); + EXPECT_EQ(19, input_element.SelectionEnd()); + + // Fill the form. + FillForm(form, input_element); + + // Find the newly-filled form that contains the input element. + FormData form2; + FormFieldData field2; + EXPECT_TRUE( + FindFormAndFieldForFormControlElement(input_element, &form2, &field2)); + EXPECT_EQ(GetCanonicalOriginForDocument(web_frame->GetDocument()), + form2.origin); + EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); + EXPECT_EQ(GURL("http://abc.com"), form2.action); + + const std::vector<FormFieldData>& fields2 = form2.fields; + ASSERT_EQ(3U, fields2.size()); + + FormFieldData expected; + expected.form_control_type = "text"; + expected.max_length = WebInputElement::DefaultMaxLength(); + + expected.name = ASCIIToUTF16("cc"); + expected.value = ASCIIToUTF16("1111-2222-3333-4444"); + if (placeholder_creditcard) { + expected.label = ASCIIToUTF16(placeholder_creditcard); + expected.placeholder = ASCIIToUTF16(placeholder_creditcard); + } else { + expected.label.clear(); + expected.placeholder.clear(); + } + expected.is_autofilled = true; + EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); + + expected.name = ASCIIToUTF16("expiration_date"); + expected.value = ASCIIToUTF16("03/2030"); + if (placeholder_expiration) { + expected.label = ASCIIToUTF16(placeholder_expiration); + expected.placeholder = ASCIIToUTF16(placeholder_expiration); + } else { + expected.label.clear(); + expected.placeholder.clear(); + } + expected.is_autofilled = true; + EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); + + expected.name = ASCIIToUTF16("name"); + expected.value = ASCIIToUTF16("John Smith"); + if (placeholder_name) { + expected.label = ASCIIToUTF16(placeholder_name); + expected.placeholder = ASCIIToUTF16(placeholder_name); + } else { + expected.label.clear(); + expected.placeholder.clear(); + } + expected.is_autofilled = false; + EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); + + // Verify that the cursor position has been updated. + EXPECT_EQ(19, input_element.SelectionStart()); + EXPECT_EQ(19, input_element.SelectionEnd()); + } + + void TestFillFormJSModifiesUserInputValue(const char* html, + const char* placeholder_creditcard, + const char* placeholder_expiration, + const char* placeholder_name) { + LoadHTML(html); + WebLocalFrame* web_frame = GetMainFrame(); + ASSERT_NE(nullptr, web_frame); + + FormCache form_cache(web_frame); + std::vector<FormData> forms = form_cache.ExtractNewForms(); + ASSERT_EQ(1U, forms.size()); + + // Get the input element we want to find. + WebInputElement input_element = GetInputElementById("cc"); + WebFormElement form_element = input_element.Form(); + std::vector<WebFormControlElement> control_elements = + ExtractAutofillableElementsInForm(form_element); + + ASSERT_EQ(3U, control_elements.size()); + // We now modify the values. + // This will be ignored. + control_elements[0].SetValue( + WebString::FromUTF16(ASCIIToUTF16("____-____-____-____"))); + // This will be ignored. + control_elements[1].SetValue(WebString::FromUTF16(ASCIIToUTF16("____/__"))); + control_elements[2].SetValue( + WebString::FromUTF16(ASCIIToUTF16("john smith"))); + control_elements[2].SetUserHasEditedTheFieldForTest(); + + // Sometimes the JS modifies the value entered by the user. + ExecuteJavaScriptForTests( + "document.getElementById('name').value = 'John Smith';"); // Find the form that contains the input element. FormData form; @@ -4696,6 +4815,20 @@ "Credit Card Number", "Expiration Date", "Full Name"); } +TEST_F(FormAutofillTest, FillFormJSModifiesUserInputValue) { + TestFillFormJSModifiesUserInputValue( + "<FORM name='TestForm' action='http://abc.com' method='post'>" + " <INPUT type='text' id='cc' placeholder='Credit Card Number' " + "value='Credit Card'/>" + " <INPUT type='text' id='expiration_date' placeholder='Expiration Date' " + "value='Expiration Date'/>" + " <INPUT type='text' id='name' placeholder='Full Name' " + "value='Full Name'/>" + " <INPUT type='submit' value='Send'/>" + "</FORM>", + "Credit Card Number", "Expiration Date", "Full Name"); +} + TEST_F(FormAutofillTest, FillFormNonEmptyFieldsWithPlaceholderValues) { TestFillFormNonEmptyField( "<FORM name='TestForm' action='http://abc.com' method='post'>"
diff --git a/chrome/renderer/net/net_error_page_controller.cc b/chrome/renderer/net/net_error_page_controller.cc index 8187f5c..3131094e 100644 --- a/chrome/renderer/net/net_error_page_controller.cc +++ b/chrome/renderer/net/net_error_page_controller.cc
@@ -71,8 +71,11 @@ if (args.PeekNext().IsEmpty() || !args.PeekNext()->IsInt32()) return false; - if (delegate_) - delegate_->TrackClick(args.PeekNext()->Int32Value()); + if (delegate_) { + delegate_->TrackClick(args.PeekNext() + ->Int32Value(args.GetHolderCreationContext()) + .FromMaybe(0)); + } return true; }
diff --git a/chrome/renderer/searchbox/searchbox_extension.cc b/chrome/renderer/searchbox/searchbox_extension.cc index 05d2288b..49ce578 100644 --- a/chrome/renderer/searchbox/searchbox_extension.cc +++ b/chrome/renderer/searchbox/searchbox_extension.cc
@@ -835,8 +835,10 @@ if (!ntp_tiles::IsCustomLinksEnabled()) return; SearchBox* search_box = GetSearchBoxForCurrentContext(); - if (!search_box || !HasOrigin(GURL(chrome::kChromeSearchMostVisitedUrl))) + if (!search_box || !(HasOrigin(GURL(chrome::kChromeSearchMostVisitedUrl)) || + HasOrigin(GURL(chrome::kChromeSearchLocalNtpUrl)))) { return; + } search_box->ResetCustomLinks(); }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index f5bb116..c56047a 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -4063,7 +4063,6 @@ "../browser/ui/cocoa/autofill/autofill_tooltip_controller_unittest.mm", "../browser/ui/cocoa/background_gradient_view_unittest.mm", "../browser/ui/cocoa/base_bubble_controller_unittest.mm", - "../browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller_unittest.mm", "../browser/ui/cocoa/bookmarks/bookmark_bar_bridge_unittest.mm", "../browser/ui/cocoa/bookmarks/bookmark_bar_controller_unittest.mm", "../browser/ui/cocoa/bookmarks/bookmark_bar_folder_button_cell_unittest.mm", @@ -4075,16 +4074,12 @@ "../browser/ui/cocoa/bookmarks/bookmark_bar_unittest_helper.h", "../browser/ui/cocoa/bookmarks/bookmark_bar_unittest_helper.mm", "../browser/ui/cocoa/bookmarks/bookmark_bar_view_cocoa_unittest.mm", - "../browser/ui/cocoa/bookmarks/bookmark_bubble_controller_unittest.mm", "../browser/ui/cocoa/bookmarks/bookmark_button_cell_unittest.mm", "../browser/ui/cocoa/bookmarks/bookmark_button_unittest.mm", - "../browser/ui/cocoa/bookmarks/bookmark_editor_base_controller_unittest.mm", - "../browser/ui/cocoa/bookmarks/bookmark_editor_controller_unittest.mm", "../browser/ui/cocoa/bookmarks/bookmark_folder_target_unittest.mm", "../browser/ui/cocoa/bookmarks/bookmark_menu_bridge_unittest.mm", "../browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller_unittest.mm", "../browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa_unittest.mm", - "../browser/ui/cocoa/bookmarks/bookmark_name_folder_controller_unittest.mm", "../browser/ui/cocoa/bookmarks/bookmark_tree_browser_cell_unittest.mm", "../browser/ui/cocoa/browser/zoom_bubble_controller_unittest.mm", "../browser/ui/cocoa/browser_window_cocoa_unittest.mm", @@ -4219,10 +4214,6 @@ if (mac_views_browser) { sources -= [ - "../browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller_unittest.mm", - "../browser/ui/cocoa/bookmarks/bookmark_bubble_controller_unittest.mm", - "../browser/ui/cocoa/bookmarks/bookmark_editor_base_controller_unittest.mm", - "../browser/ui/cocoa/bookmarks/bookmark_editor_controller_unittest.mm", "../browser/ui/cocoa/content_settings/collected_cookies_mac_unittest.mm", "../browser/ui/cocoa/content_settings/cookie_details_unittest.mm", "../browser/ui/cocoa/content_settings/cookie_details_view_controller_unittest.mm",
diff --git a/chrome/test/data/chromeos/file_manager/package.deb b/chrome/test/data/chromeos/file_manager/package.deb new file mode 100644 index 0000000..479ba26 --- /dev/null +++ b/chrome/test/data/chromeos/file_manager/package.deb Binary files differ
diff --git a/chrome/test/data/web_app_default_apps/bad_json/malformed0.json b/chrome/test/data/web_app_default_apps/bad_json/malformed0.json new file mode 100644 index 0000000..520f87f --- /dev/null +++ b/chrome/test/data/web_app_default_apps/bad_json/malformed0.json
@@ -0,0 +1 @@ +This is not valid JSON.
diff --git a/chrome/test/data/web_app_default_apps/good_json/chrome_platform_status.json b/chrome/test/data/web_app_default_apps/good_json/chrome_platform_status.json new file mode 100644 index 0000000..f5e81a7 --- /dev/null +++ b/chrome/test/data/web_app_default_apps/good_json/chrome_platform_status.json
@@ -0,0 +1,4 @@ +{ + "web_app_manifest_url": "https://www.chromestatus.com/static/manifest.json", + "web_app_start_url": "https://www.chromestatus.com/features" +}
diff --git a/chrome/test/data/web_app_default_apps/good_json/google_io_2016.json b/chrome/test/data/web_app_default_apps/good_json/google_io_2016.json new file mode 100644 index 0000000..e7c5c10 --- /dev/null +++ b/chrome/test/data/web_app_default_apps/good_json/google_io_2016.json
@@ -0,0 +1,4 @@ +{ + "web_app_manifest_url": "https://events.google.com/io2016/manifest.json", + "web_app_start_url": "https://events.google.com/io2016/?utm_source=web_app_manifest" +}
diff --git a/chrome/test/data/web_app_default_apps/mixed_json/empty.json b/chrome/test/data/web_app_default_apps/mixed_json/empty.json new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/data/web_app_default_apps/mixed_json/empty.json
diff --git a/chrome/test/data/web_app_default_apps/mixed_json/malformed1.json b/chrome/test/data/web_app_default_apps/mixed_json/malformed1.json new file mode 100644 index 0000000..10cce0e --- /dev/null +++ b/chrome/test/data/web_app_default_apps/mixed_json/malformed1.json
@@ -0,0 +1,5 @@ +{ + "web_app_manifest_url": "https://www.chromestatus.com/static/manifest.json", + "web_app_start_url": "https://www.chromestatus.com/features", + "this is malformed JSON because there's no end quote +}
diff --git a/chrome/test/data/web_app_default_apps/mixed_json/polytimer.json b/chrome/test/data/web_app_default_apps/mixed_json/polytimer.json new file mode 100644 index 0000000..7858618 --- /dev/null +++ b/chrome/test/data/web_app_default_apps/mixed_json/polytimer.json
@@ -0,0 +1,4 @@ +{ + "web_app_manifest_url": "https://polytimer.rocks/manifest.json", + "web_app_start_url": "https://polytimer.rocks/?homescreen=1" +}
diff --git a/chrome/test/data/web_app_default_apps/txt_but_no_json/chrome_platform_status.txt b/chrome/test/data/web_app_default_apps/txt_but_no_json/chrome_platform_status.txt new file mode 100644 index 0000000..f5e81a7 --- /dev/null +++ b/chrome/test/data/web_app_default_apps/txt_but_no_json/chrome_platform_status.txt
@@ -0,0 +1,4 @@ +{ + "web_app_manifest_url": "https://www.chromestatus.com/static/manifest.json", + "web_app_start_url": "https://www.chromestatus.com/features" +}
diff --git a/chrome/utility/importer/bookmark_html_reader.cc b/chrome/utility/importer/bookmark_html_reader.cc index ae39a99e..192af0c8 100644 --- a/chrome/utility/importer/bookmark_html_reader.cc +++ b/chrome/utility/importer/bookmark_html_reader.cc
@@ -285,8 +285,13 @@ if (url_spec.empty()) return false; - url_spec = net::UnescapeURLComponent( - url_spec, net::UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS); + // Any occurrences of "%s" in the original URL string will have been escaped + // as "%25s" by the GURL constructor. Restore them back to "%s". + // Note: It is impossible to distinguish a literal "%25s" in the source string + // from "%s". If the source string does contain "%25s", it will unfortunately + // be converted to "%s" and erroneously used as a template. See + // https://crbug.com/868214. + base::ReplaceSubstringsAfterOffset(&url_spec, 0, "%25s", "%s"); // Replace replacement terms ("%s") in |url_spec| with {searchTerms}. url_spec =
diff --git a/chrome/utility/importer/bookmark_html_reader_unittest.cc b/chrome/utility/importer/bookmark_html_reader_unittest.cc index da75a76..12d48f0 100644 --- a/chrome/utility/importer/bookmark_html_reader_unittest.cc +++ b/chrome/utility/importer/bookmark_html_reader_unittest.cc
@@ -144,21 +144,51 @@ struct TestCase { const std::string url; const bool can_be_imported_as_search_engine; + const std::string expected_search_engine_url; } test_cases[] = { - { "http://www.example.%s.com", true }, - { "http://www.example.%S.com", true }, - { "http://www.example.%x.com", false }, - { "http://www.example.com", false }, - { "http://%s.example.com", true }, - { "http://www.example.%s.test.%s.com", true }, - { "http://www.test&test.%s.com", true }, - { "http://www.example.com?q=%s&foo=bar", true }, - { "http://www.example.com/%s/?q=%s&foo=bar", true }, - { "http//google.com", false }, - { "path", false }, - { "http:/path/%s/", true }, - { "path", false }, - { "", false }, + {"http://www.example.%s.com", true, + "http://www.example.{searchTerms}.com/"}, + {"http://www.example.%S.com", true, + "http://www.example.{searchTerms}.com/"}, + {"http://www.example.%x.com", false, "http://www.example.%x.com/"}, + {"http://www.example.com", false, ""}, + {"http://%s.example.com", true, "http://{searchTerms}.example.com/"}, + {"http://www.example.%s.test.%s.com", true, + "http://www.example.{searchTerms}.test.{searchTerms}.com/"}, + // Illegal characters in the host get escaped. + {"http://www.test&test.%s.com", true, + "http://www.test%26test.{searchTerms}.com/"}, + {"http://www.example.com?q=%s&foo=bar", true, + "http://www.example.com/?q={searchTerms}&foo=bar"}, + {"http://www.example.com/%s/?q=%s&foo=bar", true, + "http://www.example.com/{searchTerms}/?q={searchTerms}&foo=bar"}, + {"http//google.com", false, ""}, + {"path", false, ""}, + {"http:/path/%s/", true, "http://path/{searchTerms}/"}, + {"path", false, ""}, + {"", false, ""}, + // Cases with other percent-encoded characters. + {"http://www.example.com/search%3Fpage?q=%s&v=foo%26bar", true, + "http://www.example.com/search%3Fpage?q={searchTerms}&v=foo%26bar"}, + // Encoded percent symbol. + {"http://www.example.com/search?q=%s&v=foo%25bar", true, + "http://www.example.com/search?q={searchTerms}&v=foo%25bar"}, + // Literal "%s", escaped so as to not represent a replacement slot. + // Note: This is buggy due to the fact that the GURL constructor doesn't + // distinguish "%s" from "%25s", and can't be fixed without changing the + // interface to this function. https://crbug.com/868214. + {"http://www.example.com/search?q=%s&v=pepper%25salt", true, + "http://www.example.com/" + "search?q={searchTerms}&v=pepper{searchTerms}alt"}, + // Encoded Unicode character (U+2014). + {"http://www.example.com/search?q=%s&v=foo%E2%80%94bar", true, + "http://www.example.com/search?q={searchTerms}&v=foo%E2%80%94bar"}, + // Non-encoded Unicode character (U+2014) (should be auto-encoded). + {"http://www.example.com/search?q=%s&v=foo—bar", true, + "http://www.example.com/search?q={searchTerms}&v=foo%E2%80%94bar"}, + // Invalid characters that should be auto-encoded. + {"http://www.example.com/{search}?q=%s", true, + "http://www.example.com/%7Bsearch%7D?q={searchTerms}"}, }; std::string search_engine_url; @@ -166,6 +196,8 @@ EXPECT_EQ(test_cases[i].can_be_imported_as_search_engine, CanImportURLAsSearchEngine(GURL(test_cases[i].url), &search_engine_url)); + if (test_cases[i].can_be_imported_as_search_engine) + EXPECT_EQ(test_cases[i].expected_search_engine_url, search_engine_url); } }
diff --git a/chrome/utility/safe_browsing/mac/BUILD.gn b/chrome/utility/safe_browsing/mac/BUILD.gn index 4ac0be1..01a8fe9d 100644 --- a/chrome/utility/safe_browsing/mac/BUILD.gn +++ b/chrome/utility/safe_browsing/mac/BUILD.gn
@@ -46,6 +46,11 @@ "//third_party/zlib", ] + cflags = [ + # For HFSPlusForkData and HFSPlusVolumeHeader (crbug.com/619640). + "-Wno-address-of-packed-member", + ] + public_configs = [ ":dmg_public_config" ] }
diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn index cc811c4..5e59922a 100644 --- a/chromecast/browser/BUILD.gn +++ b/chromecast/browser/BUILD.gn
@@ -289,6 +289,8 @@ sources += [ "accessibility/accessibility_manager.cc", "accessibility/accessibility_manager.h", + "accessibility/accessibility_sound_delegate.h", + "accessibility/accessibility_sound_delegate_stub.h", "accessibility/touch_exploration_controller.cc", "accessibility/touch_exploration_controller.h", "accessibility/touch_exploration_manager.cc",
diff --git a/chromecast/browser/accessibility/accessibility_manager.cc b/chromecast/browser/accessibility/accessibility_manager.cc index dfc99dd..94de9913 100644 --- a/chromecast/browser/accessibility/accessibility_manager.cc +++ b/chromecast/browser/accessibility/accessibility_manager.cc
@@ -96,5 +96,11 @@ !magnification_controller_->IsEnabled()); } +void AccessibilityManager::SetAccessibilitySoundDelegate( + std::unique_ptr<AccessibilitySoundDelegate> delegate) { + touch_exploration_manager_->SetAccessibilitySoundDelegate( + std::move(delegate)); +} + } // namespace shell } // namespace chromecast
diff --git a/chromecast/browser/accessibility/accessibility_manager.h b/chromecast/browser/accessibility/accessibility_manager.h index ac46b10..0bddf1e6 100644 --- a/chromecast/browser/accessibility/accessibility_manager.h +++ b/chromecast/browser/accessibility/accessibility_manager.h
@@ -74,6 +74,10 @@ // TripleTapDetectorDelegate implementation void OnTripleTap(const gfx::Point& tap_location) override; + // Sets the delegate for earcons. + void SetAccessibilitySoundDelegate( + std::unique_ptr<AccessibilitySoundDelegate> delegate); + private: std::unique_ptr<FocusRingController> focus_ring_controller_; std::unique_ptr<AccessibilityFocusRingController>
diff --git a/chromecast/browser/accessibility/accessibility_sound_delegate.h b/chromecast/browser/accessibility/accessibility_sound_delegate.h new file mode 100644 index 0000000..13db069 --- /dev/null +++ b/chromecast/browser/accessibility/accessibility_sound_delegate.h
@@ -0,0 +1,26 @@ +// 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. + +#ifndef CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_DELEGATE_H_ +#define CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_DELEGATE_H_ + +namespace chromecast { +namespace shell { + +// Provides audio feedback for TouchExplorationController. + +class AccessibilitySoundDelegate { + public: + AccessibilitySoundDelegate() {} + virtual ~AccessibilitySoundDelegate() {} + virtual void PlayPassthroughEarcon() = 0; + virtual void PlayEnterScreenEarcon() = 0; + virtual void PlayExitScreenEarcon() = 0; + virtual void PlayTouchTypeEarcon() = 0; +}; + +} // namespace shell +} // namespace chromecast + +#endif // CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_DELEGATE_H_
diff --git a/chromecast/browser/accessibility/accessibility_sound_delegate_stub.h b/chromecast/browser/accessibility/accessibility_sound_delegate_stub.h new file mode 100644 index 0000000..89b843ce --- /dev/null +++ b/chromecast/browser/accessibility/accessibility_sound_delegate_stub.h
@@ -0,0 +1,26 @@ +// 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. + +#ifndef CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_DELEGATE_STUB_H_ +#define CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_DELEGATE_STUB_H_ + +#include "chromecast/browser/accessibility/accessibility_sound_delegate.h" + +namespace chromecast { +namespace shell { + +class AccessibilitySoundDelegateStub : public AccessibilitySoundDelegate { + public: + AccessibilitySoundDelegateStub() = default; + ~AccessibilitySoundDelegateStub() override = default; + void PlayPassthroughEarcon() override {} + void PlayEnterScreenEarcon() override {} + void PlayExitScreenEarcon() override {} + void PlayTouchTypeEarcon() override {} +}; + +} // namespace shell +} // namespace chromecast + +#endif // CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_DELEGATE_STUB_H_
diff --git a/chromecast/browser/accessibility/touch_exploration_controller.cc b/chromecast/browser/accessibility/touch_exploration_controller.cc index cad896b..a8a41b1 100644 --- a/chromecast/browser/accessibility/touch_exploration_controller.cc +++ b/chromecast/browser/accessibility/touch_exploration_controller.cc
@@ -40,9 +40,11 @@ TouchExplorationController::TouchExplorationController( aura::Window* root_window, - TouchExplorationControllerDelegate* delegate) + TouchExplorationControllerDelegate* delegate, + AccessibilitySoundDelegate* accessibility_sound_delegate) : root_window_(root_window), delegate_(delegate), + accessibility_sound_delegate_(accessibility_sound_delegate), state_(NO_FINGERS_DOWN), anchor_point_state_(ANCHOR_POINT_NONE), gesture_provider_(new ui::GestureProviderAura(this, this)), @@ -193,7 +195,7 @@ VLOG(1) << "Leaving screen"; // Indicates to the user that they are leaving the screen. - delegate_->PlayExitScreenEarcon(); + accessibility_sound_delegate_->PlayExitScreenEarcon(); if (current_touch_ids_.size() == 0) { SET_STATE(NO_FINGERS_DOWN); @@ -307,7 +309,7 @@ // handle it. int edge = FindEdgesWithinInset(event.location(), kLeavingScreenEdge); if (edge != NO_EDGE) { - delegate_->PlayEnterScreenEarcon(); + accessibility_sound_delegate_->PlayEnterScreenEarcon(); SET_STATE(EDGE_PASSTHROUGH); return ui::EVENT_REWRITE_CONTINUE; } @@ -711,7 +713,7 @@ if (lift_activation_bounds_.Contains(anchor_location.x(), anchor_location.y()) && lift_activation_bounds_.Contains(location)) { - delegate_->PlayTouchTypeEarcon(); + accessibility_sound_delegate_->PlayTouchTypeEarcon(); SendSimulatedTap(); } } @@ -849,7 +851,7 @@ if (sound_timer_.IsRunning()) sound_timer_.Stop(); - delegate_->PlayPassthroughEarcon(); + accessibility_sound_delegate_->PlayPassthroughEarcon(); SET_STATE(CORNER_PASSTHROUGH); return; }
diff --git a/chromecast/browser/accessibility/touch_exploration_controller.h b/chromecast/browser/accessibility/touch_exploration_controller.h index 6d120ac..53e1a21b 100644 --- a/chromecast/browser/accessibility/touch_exploration_controller.h +++ b/chromecast/browser/accessibility/touch_exploration_controller.h
@@ -12,6 +12,7 @@ #include "base/memory/weak_ptr.h" #include "base/timer/timer.h" #include "base/values.h" +#include "chromecast/browser/accessibility/accessibility_sound_delegate.h" #include "ui/accessibility/ax_enums.mojom.h" #include "ui/events/event.h" #include "ui/events/event_rewriter.h" @@ -39,22 +40,6 @@ public: virtual ~TouchExplorationControllerDelegate() {} - // This function should be called when the passthrough earcon should be - // played. - virtual void PlayPassthroughEarcon() = 0; - - // This function should be called when the exit screen earcon should be - // played. - virtual void PlayExitScreenEarcon() = 0; - - // This function should be called when the enter screen earcon should be - // played. - virtual void PlayEnterScreenEarcon() = 0; - - // This function should be called when the touch type earcon should - // be played. - virtual void PlayTouchTypeEarcon() = 0; - // Called when the user performed an accessibility gesture while in touch // accessibility mode, that should be forwarded to ChromeVox. virtual void HandleAccessibilityGesture(ax::mojom::Gesture gesture) = 0; @@ -178,7 +163,8 @@ public: TouchExplorationController( aura::Window* root_window, - TouchExplorationControllerDelegate* delegate); + TouchExplorationControllerDelegate* delegate, + AccessibilitySoundDelegate* accessibility_sound_delegate); ~TouchExplorationController() override; // Make synthesized touch events are anchored at this point. This is @@ -448,9 +434,12 @@ aura::Window* root_window_; - // Handles volume control. Not owned. + // Handles accessibility gestures. Not owned. TouchExplorationControllerDelegate* delegate_; + // Handles earcons. Not owned. + AccessibilitySoundDelegate* accessibility_sound_delegate_; + // A set of touch ids for fingers currently touching the screen. std::vector<int> current_touch_ids_;
diff --git a/chromecast/browser/accessibility/touch_exploration_controller_unittest.cc b/chromecast/browser/accessibility/touch_exploration_controller_unittest.cc index c1919da..2253d0a 100644 --- a/chromecast/browser/accessibility/touch_exploration_controller_unittest.cc +++ b/chromecast/browser/accessibility/touch_exploration_controller_unittest.cc
@@ -78,27 +78,37 @@ class MockTouchExplorationControllerDelegate : public TouchExplorationControllerDelegate { public: - void PlayPassthroughEarcon() override { ++num_times_passthrough_played_; } - void PlayExitScreenEarcon() override { ++num_times_exit_screen_played_; } - void PlayEnterScreenEarcon() override { ++num_times_enter_screen_played_; } - void PlayTouchTypeEarcon() override { ++num_times_touch_type_sound_played_; } void HandleAccessibilityGesture(ax::mojom::Gesture gesture) override { last_gesture_ = gesture; } const std::vector<float> VolumeChanges() const { return volume_changes_; } - size_t NumAdjustSounds() const { return num_times_adjust_sound_played_; } + ax::mojom::Gesture GetLastGesture() const { return last_gesture_; } + void ResetLastGesture() { last_gesture_ = ax::mojom::Gesture::kNone; } + + private: + std::vector<float> volume_changes_; + ax::mojom::Gesture last_gesture_ = ax::mojom::Gesture::kNone; +}; + +class MockAccessibilitySoundDelegate : public AccessibilitySoundDelegate { + public: + MockAccessibilitySoundDelegate() {} + ~MockAccessibilitySoundDelegate() override {} + + void PlayPassthroughEarcon() override { ++num_times_passthrough_played_; } + void PlayExitScreenEarcon() override { ++num_times_exit_screen_played_; } + void PlayEnterScreenEarcon() override { ++num_times_enter_screen_played_; } + void PlayTouchTypeEarcon() override { ++num_times_touch_type_sound_played_; } + size_t NumPassthroughSounds() const { return num_times_passthrough_played_; } size_t NumExitScreenSounds() const { return num_times_exit_screen_played_; } size_t NumEnterScreenSounds() const { return num_times_enter_screen_played_; } size_t NumTouchTypeSounds() const { return num_times_touch_type_sound_played_; } - ax::mojom::Gesture GetLastGesture() const { return last_gesture_; } - void ResetLastGesture() { last_gesture_ = ax::mojom::Gesture::kNone; } void ResetCountersToZero() { - num_times_adjust_sound_played_ = 0; num_times_passthrough_played_ = 0; num_times_exit_screen_played_ = 0; num_times_enter_screen_played_ = 0; @@ -106,13 +116,10 @@ } private: - std::vector<float> volume_changes_; - size_t num_times_adjust_sound_played_ = 0; size_t num_times_passthrough_played_ = 0; size_t num_times_exit_screen_played_ = 0; size_t num_times_enter_screen_played_ = 0; size_t num_times_touch_type_sound_played_ = 0; - ax::mojom::Gesture last_gesture_ = ax::mojom::Gesture::kNone; }; } // namespace @@ -298,8 +305,9 @@ if (!on && touch_exploration_controller_.get()) { touch_exploration_controller_.reset(); } else if (on && !touch_exploration_controller_.get()) { - touch_exploration_controller_.reset(new TouchExplorationControllerTestApi( - new TouchExplorationController(root_window(), &delegate_))); + touch_exploration_controller_.reset( + new TouchExplorationControllerTestApi(new TouchExplorationController( + root_window(), &delegate_, &accessibility_sound_delegate_))); cursor_client()->ShowCursor(); cursor_client()->DisableMouseEvents(); } @@ -317,7 +325,7 @@ // Checks that Corner Passthrough is working. Assumes that corner is the // bottom left corner or the bottom right corner. void AssertCornerPassthroughWorking(gfx::Point corner) { - ASSERT_EQ(0U, delegate_.NumPassthroughSounds()); + ASSERT_EQ(0U, accessibility_sound_delegate_.NumPassthroughSounds()); ui::TouchEvent first_press( ui::ET_TOUCH_PRESSED, corner, Now(), @@ -335,7 +343,7 @@ ui::TouchEvent passthrough_press( ui::ET_TOUCH_PRESSED, passthrough, Now(), ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 1)); - ASSERT_EQ(1U, delegate_.NumPassthroughSounds()); + ASSERT_EQ(1U, accessibility_sound_delegate_.NumPassthroughSounds()); generator_->Dispatch(&passthrough_press); generator_->ReleaseTouchId(1); generator_->PressTouchId(1); @@ -417,6 +425,7 @@ ui::GestureDetector::Config gesture_detector_config_; base::SimpleTestTickClock simulated_clock_; MockTouchExplorationControllerDelegate delegate_; + MockAccessibilitySoundDelegate accessibility_sound_delegate_; private: EventCapturer event_capturer_; @@ -1771,9 +1780,9 @@ ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 1)); generator_->Dispatch(&touch_event); - ASSERT_EQ(1U, delegate_.NumEnterScreenSounds()); + ASSERT_EQ(1U, accessibility_sound_delegate_.NumEnterScreenSounds()); generator_->ReleaseTouchId(1); - delegate_.ResetCountersToZero(); + accessibility_sound_delegate_.ResetCountersToZero(); } } @@ -1813,8 +1822,8 @@ generator_->MoveTouch(initial_press); generator_->MoveTouch(*point); generator_->ReleaseTouch(); - ASSERT_EQ(1U, delegate_.NumExitScreenSounds()); - delegate_.ResetCountersToZero(); + ASSERT_EQ(1U, accessibility_sound_delegate_.NumExitScreenSounds()); + accessibility_sound_delegate_.ResetCountersToZero(); } } @@ -1950,7 +1959,7 @@ gfx::Point tap_location = lift_activation.CenterPoint(); EnterTouchExplorationModeAtLocation(tap_location); ClearCapturedEvents(); - ASSERT_EQ(0U, delegate_.NumTouchTypeSounds()); + ASSERT_EQ(0U, accessibility_sound_delegate_.NumTouchTypeSounds()); // A touch release should trigger a tap. ui::TouchEvent touch_explore_release( @@ -1964,9 +1973,9 @@ EXPECT_EQ(ui::ET_TOUCH_PRESSED, captured_events[0]->type()); EXPECT_EQ(ui::ET_TOUCH_RELEASED, captured_events[1]->type()); EXPECT_EQ(ui::ET_MOUSE_MOVED, captured_events[2]->type()); - ASSERT_EQ(1U, delegate_.NumTouchTypeSounds()); + ASSERT_EQ(1U, accessibility_sound_delegate_.NumTouchTypeSounds()); ClearCapturedEvents(); - delegate_.ResetCountersToZero(); + accessibility_sound_delegate_.ResetCountersToZero(); // Touch explore inside the activation bounds, but lift outside. gfx::Point out_tap_location(tap_location.x(), lift_activation.bottom() + 20); @@ -1982,7 +1991,7 @@ const EventList& out_captured_events = GetCapturedEvents(); ASSERT_EQ(1U, out_captured_events.size()); EXPECT_EQ(ui::ET_MOUSE_MOVED, out_captured_events[0]->type()); - ASSERT_EQ(0U, delegate_.NumTouchTypeSounds()); + ASSERT_EQ(0U, accessibility_sound_delegate_.NumTouchTypeSounds()); } // Ensure that any touch release events received after
diff --git a/chromecast/browser/accessibility/touch_exploration_manager.cc b/chromecast/browser/accessibility/touch_exploration_manager.cc index 85035c0..cb9ee7c 100644 --- a/chromecast/browser/accessibility/touch_exploration_manager.cc +++ b/chromecast/browser/accessibility/touch_exploration_manager.cc
@@ -7,6 +7,7 @@ #include "chromecast/browser/accessibility/touch_exploration_manager.h" +#include "chromecast/browser/accessibility/accessibility_sound_delegate_stub.h" #include "chromecast/browser/cast_browser_context.h" #include "chromecast/browser/cast_browser_process.h" #include "chromecast/common/extensions_api/accessibility_private.h" @@ -26,8 +27,9 @@ : touch_exploration_enabled_(false), root_window_(root_window), activation_client_(activation_client), - accessibility_focus_ring_controller_( - accessibility_focus_ring_controller) { + accessibility_focus_ring_controller_(accessibility_focus_ring_controller), + accessibility_sound_delegate_( + std::make_unique<AccessibilitySoundDelegateStub>()) { UpdateTouchExplorationState(); } @@ -39,22 +41,6 @@ UpdateTouchExplorationState(); } -void TouchExplorationManager::PlayPassthroughEarcon() { - LOG(INFO) << "stub PlayPassthroughEarcon"; -} - -void TouchExplorationManager::PlayEnterScreenEarcon() { - LOG(INFO) << "stub PlayEnterScreenEarcon"; -} - -void TouchExplorationManager::PlayExitScreenEarcon() { - LOG(INFO) << "stub PlayExitScreenEarcon"; -} - -void TouchExplorationManager::PlayTouchTypeEarcon() { - LOG(INFO) << "stub PlayTouchTypeEarcon"; -} - void TouchExplorationManager::HandleAccessibilityGesture( ax::mojom::Gesture gesture) { // (Code copied from Chrome's @@ -99,7 +85,8 @@ if (touch_exploration_enabled_) { if (!touch_exploration_controller_.get()) { touch_exploration_controller_ = - std::make_unique<TouchExplorationController>(root_window_, this); + std::make_unique<TouchExplorationController>(root_window_, this, + accessibility_sound_delegate_.get()); } if (pass_through_surface) { const display::Display display = @@ -119,5 +106,11 @@ } } +void TouchExplorationManager::SetAccessibilitySoundDelegate( + std::unique_ptr<AccessibilitySoundDelegate> delegate) { + accessibility_sound_delegate_ = std::move(delegate); +} + + } // namespace shell } // namespace chromecast
diff --git a/chromecast/browser/accessibility/touch_exploration_manager.h b/chromecast/browser/accessibility/touch_exploration_manager.h index f109d0a..ed495f5 100644 --- a/chromecast/browser/accessibility/touch_exploration_manager.h +++ b/chromecast/browser/accessibility/touch_exploration_manager.h
@@ -8,8 +8,9 @@ #ifndef CHROMECAST_BROWSER_ACCESSIBILITY_TOUCH_EXPLORATION_MANAGER_H_ #define CHROMECAST_BROWSER_ACCESSIBILITY_TOUCH_EXPLORATION_MANAGER_H_ -#include "chromecast/graphics/accessibility/accessibility_focus_ring_controller.h" +#include "chromecast/browser/accessibility/accessibility_sound_delegate.h" #include "chromecast/browser/accessibility/touch_exploration_controller.h" +#include "chromecast/graphics/accessibility/accessibility_focus_ring_controller.h" #include "ui/wm/public/activation_change_observer.h" #include "ui/wm/public/activation_client.h" @@ -33,10 +34,6 @@ void Enable(bool enabled); // TouchExplorationControllerDelegate overrides: - void PlayPassthroughEarcon() override; - void PlayExitScreenEarcon() override; - void PlayEnterScreenEarcon() override; - void PlayTouchTypeEarcon() override; void HandleAccessibilityGesture(ax::mojom::Gesture gesture) override; // wm::ActivationChangeObserver overrides: @@ -49,6 +46,10 @@ // events are anchored at this point. void SetTouchAccessibilityAnchorPoint(const gfx::Point& anchor_point); + // Sets the delegate for earcons. + void SetAccessibilitySoundDelegate( + std::unique_ptr<AccessibilitySoundDelegate> delegate); + private: void UpdateTouchExplorationState(); @@ -59,6 +60,7 @@ aura::Window* root_window_; wm::ActivationClient* activation_client_; AccessibilityFocusRingController* accessibility_focus_ring_controller_; + std::unique_ptr<AccessibilitySoundDelegate> accessibility_sound_delegate_; DISALLOW_COPY_AND_ASSIGN(TouchExplorationManager); };
diff --git a/chromeos/chromeos_features.cc b/chromeos/chromeos_features.cc index c4a0d5b..99eb22f 100644 --- a/chromeos/chromeos_features.cc +++ b/chromeos/chromeos_features.cc
@@ -14,7 +14,7 @@ // Enables or disables native ChromeVox support for Arc. const base::Feature kChromeVoxArcSupport{"ChromeVoxArcSupport", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // If enabled, DriveFS will be used for Drive sync. const base::Feature kDriveFs{"DriveFS", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc index e480385..33d0acef 100644 --- a/components/autofill/content/renderer/form_autofill_util.cc +++ b/components/autofill/content/renderer/form_autofill_util.cc
@@ -866,7 +866,7 @@ // field is not skipped. (IsAutofillableInputElement(input_element) || IsTextAreaElement(*element)) && - (element->IsEnteredByUser() || + (element->UserHasEditedTheField() || !base::FeatureList::IsEnabled(features::kAutofillPrefilledFields)) && !SanitizedFieldIsEmpty(element->Value().Utf16()) && (!element->HasAttribute(kValue) ||
diff --git a/components/invalidation/impl/BUILD.gn b/components/invalidation/impl/BUILD.gn index 03a593c..55cca95 100644 --- a/components/invalidation/impl/BUILD.gn +++ b/components/invalidation/impl/BUILD.gn
@@ -65,6 +65,8 @@ if (!is_android) { sources += [ + "fcm_invalidation_service.cc", + "fcm_invalidation_service.h", "fcm_invalidator.cc", "fcm_invalidator.h", "fcm_network_handler.cc", @@ -158,6 +160,7 @@ # Non-Android tests. sources += [ "fake_invalidator_unittest.cc", + "fcm_invalidation_service_unittest.cc", "fcm_invalidator_unittest.cc", "fcm_network_handler_unittests.cc", "fcm_sync_invalidation_listener_unittest.cc",
diff --git a/components/invalidation/impl/fcm_invalidation_service.cc b/components/invalidation/impl/fcm_invalidation_service.cc new file mode 100644 index 0000000..305887c --- /dev/null +++ b/components/invalidation/impl/fcm_invalidation_service.cc
@@ -0,0 +1,311 @@ +// 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. + +#include "components/invalidation/impl/fcm_invalidation_service.h" + +#include "components/invalidation/impl/fcm_invalidator.h" +#include "components/invalidation/impl/fcm_network_handler.h" +#include "components/invalidation/impl/invalidation_service_util.h" +#include "components/invalidation/impl/invalidator.h" +#include "components/invalidation/public/invalidation_util.h" +#include "components/invalidation/public/invalidator_state.h" +#include "components/invalidation/public/object_id_invalidation_map.h" + +const char kFCMOAuthScope[] = + "https://www.googleapis.com/auth/firebase.messaging"; + +static const net::BackoffEntry::Policy kRequestAccessTokenBackoffPolicy = { + // Number of initial errors (in sequence) to ignore before applying + // exponential back-off rules. + 0, + + // Initial delay for exponential back-off in ms. + 2000, + + // Factor by which the waiting time will be multiplied. + 2, + + // Fuzzing percentage. ex: 10% will spread requests randomly + // between 90%-100% of the calculated time. + 0.2, // 20% + + // Maximum amount of time we are willing to delay our request in ms. + 1000 * 3600 * 4, // 4 hours. + + // Time to keep an entry from being discarded even when it + // has no significant state, -1 to never discard. + -1, + + // Don't use initial delay unless the last request was an error. + false, +}; + +namespace invalidation { + +FCMInvalidationService::FCMInvalidationService( + std::unique_ptr<IdentityProvider> identity_provider, + gcm::GCMDriver* gcm_driver, + instance_id::InstanceIDDriver* instance_id_driver, + PrefService* pref_service, + const syncer::ParseJSONCallback& parse_json, + network::mojom::URLLoaderFactory* loader_factory) + : identity_provider_(std::move(identity_provider)), + request_access_token_backoff_(&kRequestAccessTokenBackoffPolicy), + gcm_driver_(gcm_driver), + instance_id_driver_(instance_id_driver), + pref_service_(pref_service), + parse_json_(parse_json), + loader_factory_(loader_factory) {} + +FCMInvalidationService::~FCMInvalidationService() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + invalidator_registrar_.UpdateInvalidatorState( + syncer::INVALIDATOR_SHUTTING_DOWN); + identity_provider_->RemoveObserver(this); + if (IsStarted()) + StopInvalidator(); +} + +void FCMInvalidationService::Init() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + if (IsReadyToStart()) + StartInvalidator(); + + identity_provider_->AddObserver(this); +} + +void FCMInvalidationService::InitForTest(syncer::Invalidator* invalidator) { + // Here we perform the equivalent of Init() and StartInvalidator(), but with + // some minor changes to account for the fact that we're injecting the + // invalidator. + invalidator_.reset(invalidator); + + invalidator_->RegisterHandler(this); + CHECK(invalidator_->UpdateRegisteredIds( + this, invalidator_registrar_.GetAllRegisteredIds())); +} + +void FCMInvalidationService::RegisterInvalidationHandler( + syncer::InvalidationHandler* handler) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DVLOG(2) << "Registering an invalidation handler"; + invalidator_registrar_.RegisterHandler(handler); + logger_.OnRegistration(handler->GetOwnerName()); +} + +bool FCMInvalidationService::UpdateRegisteredInvalidationIds( + syncer::InvalidationHandler* handler, + const syncer::ObjectIdSet& ids) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DVLOG(2) << "Registering ids: " << ids.size(); + if (!invalidator_registrar_.UpdateRegisteredIds(handler, ids)) + return false; + if (invalidator_) { + CHECK(invalidator_->UpdateRegisteredIds( + this, invalidator_registrar_.GetAllRegisteredIds())); + } + logger_.OnUpdateIds(invalidator_registrar_.GetSanitizedHandlersIdsMap()); + return true; +} + +void FCMInvalidationService::UnregisterInvalidationHandler( + syncer::InvalidationHandler* handler) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DVLOG(2) << "Unregistering"; + invalidator_registrar_.UnregisterHandler(handler); + if (invalidator_) { + CHECK(invalidator_->UpdateRegisteredIds( + this, invalidator_registrar_.GetAllRegisteredIds())); + } + logger_.OnUnregistration(handler->GetOwnerName()); +} + +syncer::InvalidatorState FCMInvalidationService::GetInvalidatorState() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (invalidator_) { + DVLOG(2) << "GetInvalidatorState returning " + << invalidator_->GetInvalidatorState(); + return invalidator_->GetInvalidatorState(); + } + DVLOG(2) << "Invalidator currently stopped"; + return syncer::TRANSIENT_INVALIDATION_ERROR; +} + +std::string FCMInvalidationService::GetInvalidatorClientId() const { + NOTREACHED(); + return std::string(); +} + +InvalidationLogger* FCMInvalidationService::GetInvalidationLogger() { + return &logger_; +} + +void FCMInvalidationService::RequestDetailedStatus( + base::RepeatingCallback<void(const base::DictionaryValue&)> return_callback) + const { + if (IsStarted()) { + invalidator_->RequestDetailedStatus(return_callback); + } +} + +void FCMInvalidationService::RequestAccessToken() { + // Only one active request at a time. + if (access_token_fetcher_ != nullptr) + return; + request_access_token_retry_timer_.Stop(); + OAuth2TokenService::ScopeSet oauth2_scopes = {kFCMOAuthScope}; + // Invalidate previous token, otherwise the identity provider will return the + // same token again. + identity_provider_->InvalidateAccessToken(oauth2_scopes, access_token_); + access_token_.clear(); + access_token_fetcher_ = identity_provider_->FetchAccessToken( + "fcm_invalidation", oauth2_scopes, + base::BindOnce(&FCMInvalidationService::OnAccessTokenRequestCompleted, + base::Unretained(this))); +} + +void FCMInvalidationService::OnAccessTokenRequestCompleted( + GoogleServiceAuthError error, + std::string access_token) { + access_token_fetcher_.reset(); + if (error.state() == GoogleServiceAuthError::NONE) + OnAccessTokenRequestSucceeded(access_token); + else + OnAccessTokenRequestFailed(error); +} + +void FCMInvalidationService::OnAccessTokenRequestSucceeded( + std::string access_token) { + // Reset backoff time after successful response. + request_access_token_backoff_.Reset(); + access_token_ = access_token; + if (!IsStarted() && IsReadyToStart()) { + StartInvalidator(); + } else { + UpdateInvalidatorCredentials(); + } +} + +void FCMInvalidationService::OnAccessTokenRequestFailed( + GoogleServiceAuthError error) { + DCHECK_NE(error.state(), GoogleServiceAuthError::NONE); + switch (error.state()) { + case GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS: { + invalidator_registrar_.UpdateInvalidatorState( + syncer::INVALIDATION_CREDENTIALS_REJECTED); + break; + } + default: { + request_access_token_backoff_.InformOfRequest(false); + request_access_token_retry_timer_.Start( + FROM_HERE, request_access_token_backoff_.GetTimeUntilRelease(), + base::BindRepeating(&FCMInvalidationService::RequestAccessToken, + base::Unretained(this))); + break; + } + } +} + +void FCMInvalidationService::OnActiveAccountLogin() { + if (!IsStarted() && IsReadyToStart()) + StartInvalidator(); +} + +void FCMInvalidationService::OnActiveAccountRefreshTokenUpdated() { + if (!IsStarted() && IsReadyToStart()) + StartInvalidator(); + else + UpdateInvalidatorCredentials(); +} + +void FCMInvalidationService::OnActiveAccountRefreshTokenRemoved() { + access_token_.clear(); + if (IsStarted()) + UpdateInvalidatorCredentials(); +} + +void FCMInvalidationService::OnActiveAccountLogout() { + access_token_fetcher_.reset(); + request_access_token_retry_timer_.Stop(); + + if (IsStarted()) { + StopInvalidator(); + } +} + +void FCMInvalidationService::OnInvalidatorStateChange( + syncer::InvalidatorState state) { + invalidator_registrar_.UpdateInvalidatorState(state); + logger_.OnStateChange(state); +} + +void FCMInvalidationService::OnIncomingInvalidation( + const syncer::ObjectIdInvalidationMap& invalidation_map) { + invalidator_registrar_.DispatchInvalidationsToHandlers(invalidation_map); + + logger_.OnInvalidation(invalidation_map); +} + +std::string FCMInvalidationService::GetOwnerName() const { + return "FCM"; +} + +bool FCMInvalidationService::IsReadyToStart() { + if (!identity_provider_->IsActiveAccountAvailable()) { + DVLOG(2) << "Not starting FCMInvalidationService: " + << "active account is not available"; + return false; + } + + return true; +} + +bool FCMInvalidationService::IsStarted() const { + return invalidator_ != nullptr; +} + +void FCMInvalidationService::StartInvalidator() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(!invalidator_); + DCHECK(IsReadyToStart()); + + // access token before sending message to server. + if (access_token_.empty()) { + // TODO(melandory): move logic for recieving the token directly to + // the PerUserTopicRegistrationmanager. + DVLOG(1) << "FCMInvalidationService: " + << "Deferring start until we have an access token."; + RequestAccessToken(); + return; + } + + auto network = std::make_unique<syncer::FCMNetworkHandler>( + gcm_driver_, instance_id_driver_); + network->StartListening(); + invalidator_ = std::make_unique<syncer::FCMInvalidator>( + std::move(network), pref_service_, loader_factory_, parse_json_); + + invalidator_->RegisterHandler(this); + UpdateInvalidatorCredentials(); + CHECK(invalidator_->UpdateRegisteredIds( + this, invalidator_registrar_.GetAllRegisteredIds())); +} + +void FCMInvalidationService::UpdateInvalidatorCredentials() { + std::string email = identity_provider_->GetActiveAccountId(); + + DCHECK(!email.empty()) << "Expected user to be signed in."; + + invalidator_->UpdateCredentials(email, access_token_); +} + +void FCMInvalidationService::StopInvalidator() { + DCHECK(invalidator_); + // TODO(melandory): reset the network. + invalidator_->UnregisterHandler(this); + invalidator_.reset(); +} + +} // namespace invalidation
diff --git a/components/invalidation/impl/fcm_invalidation_service.h b/components/invalidation/impl/fcm_invalidation_service.h new file mode 100644 index 0000000..73b652fd --- /dev/null +++ b/components/invalidation/impl/fcm_invalidation_service.h
@@ -0,0 +1,131 @@ +// 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. + +#ifndef COMPONENTS_INVALIDATION_IMPL_FCM_INVALIDATION_SERVICE_H_ +#define COMPONENTS_INVALIDATION_IMPL_FCM_INVALIDATION_SERVICE_H_ + +#include "base/macros.h" +#include "base/timer/timer.h" +#include "components/invalidation/impl/invalidation_logger.h" +#include "components/invalidation/impl/invalidator_registrar.h" +#include "components/invalidation/public/identity_provider.h" +#include "components/invalidation/public/invalidation_handler.h" +#include "components/invalidation/public/invalidation_service.h" +#include "components/keyed_service/core/keyed_service.h" +#include "net/base/backoff_entry.h" +#include "services/network/public/mojom/url_loader_factory.mojom.h" + +namespace gcm { +class GCMDriver; +} + +class PrefService; + +namespace syncer { +class Invalidator; +} + +namespace instance_id { +class InstanceIDDriver; +} + +namespace invalidation { + +// This InvalidationService wraps the C++ Invalidation Client (FCM) library. +// It provides invalidations for desktop platforms (Win, Mac, Linux). +class FCMInvalidationService : public InvalidationService, + public IdentityProvider::Observer, + public syncer::InvalidationHandler { + public: + FCMInvalidationService(std::unique_ptr<IdentityProvider> identity_provider, + gcm::GCMDriver* gcm_driver, + instance_id::InstanceIDDriver* instance_id_driver, + PrefService* pref_service, + const syncer::ParseJSONCallback& parse_json, + network::mojom::URLLoaderFactory* loader_factory); + ~FCMInvalidationService() override; + + void Init(); + + // InvalidationService implementation. + // It is an error to have registered handlers when the service is destroyed. + void RegisterInvalidationHandler( + syncer::InvalidationHandler* handler) override; + bool UpdateRegisteredInvalidationIds(syncer::InvalidationHandler* handler, + const syncer::ObjectIdSet& ids) override; + void UnregisterInvalidationHandler( + syncer::InvalidationHandler* handler) override; + syncer::InvalidatorState GetInvalidatorState() const override; + std::string GetInvalidatorClientId() const override; + InvalidationLogger* GetInvalidationLogger() override; + void RequestDetailedStatus( + base::RepeatingCallback<void(const base::DictionaryValue&)> caller) + const override; + + void RequestAccessToken(); + + void OnAccessTokenRequestCompleted(GoogleServiceAuthError error, + std::string access_token); + void OnAccessTokenRequestSucceeded(std::string access_token); + void OnAccessTokenRequestFailed(GoogleServiceAuthError error); + + // IdentityProvider::Observer implementation. + void OnActiveAccountRefreshTokenUpdated() override; + void OnActiveAccountRefreshTokenRemoved() override; + void OnActiveAccountLogin() override; + void OnActiveAccountLogout() override; + + // syncer::InvalidationHandler implementation. + void OnInvalidatorStateChange(syncer::InvalidatorState state) override; + void OnIncomingInvalidation( + const syncer::ObjectIdInvalidationMap& invalidation_map) override; + std::string GetOwnerName() const override; + + protected: + friend class FCMInvalidationServiceTestDelegate; + + // Initializes with an injected invalidator. + void InitForTest(syncer::Invalidator* invalidator); + + private: + bool IsReadyToStart(); + bool IsStarted() const; + + void StartInvalidator(); + void StopInvalidator(); + void UpdateInvalidatorCredentials(); + + std::unique_ptr<IdentityProvider> identity_provider_; + // FCMInvalidationService needs to hold reference to access_token_fetcher_ + // for the duration of request in order to receive callbacks. + std::unique_ptr<ActiveAccountAccessTokenFetcher> access_token_fetcher_; + base::OneShotTimer request_access_token_retry_timer_; + net::BackoffEntry request_access_token_backoff_; + + syncer::InvalidatorRegistrar invalidator_registrar_; + std::unique_ptr<syncer::Invalidator> invalidator_; + + // FCMInvalidationService needs to remember access token in order to + // invalidate it with IdentityProvider. + std::string access_token_; + + // The invalidation logger object we use to record state changes + // and invalidations. + InvalidationLogger logger_; + + gcm::GCMDriver* gcm_driver_; + instance_id::InstanceIDDriver* instance_id_driver_; + + PrefService* pref_service_; + syncer::ParseJSONCallback parse_json_; + network::mojom::URLLoaderFactory* loader_factory_; + + SEQUENCE_CHECKER(sequence_checker_); + + DISALLOW_COPY_AND_ASSIGN(FCMInvalidationService); +}; + +} // namespace invalidation + +#endif // COMPONENTS_INVALIDATION_IMPL_FCM_INVALIDATION_SERVICE_H_
diff --git a/components/invalidation/impl/fcm_invalidation_service_unittest.cc b/components/invalidation/impl/fcm_invalidation_service_unittest.cc new file mode 100644 index 0000000..1176f419 --- /dev/null +++ b/components/invalidation/impl/fcm_invalidation_service_unittest.cc
@@ -0,0 +1,122 @@ +// 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. + +#include "components/invalidation/impl/fcm_invalidation_service.h" + +#include <memory> + +#include "base/bind.h" +#include "base/files/file_path.h" +#include "base/macros.h" +#include "base/memory/ptr_util.h" +#include "base/memory/weak_ptr.h" +#include "components/gcm_driver/fake_gcm_driver.h" +#include "components/gcm_driver/gcm_driver.h" +#include "components/invalidation/impl/fake_invalidator.h" +#include "components/invalidation/impl/gcm_invalidation_bridge.h" +#include "components/invalidation/impl/invalidation_service_test_template.h" +#include "components/invalidation/impl/invalidation_state_tracker.h" +#include "components/invalidation/impl/invalidator.h" +#include "components/invalidation/impl/json_unsafe_parser.h" +#include "components/invalidation/impl/profile_identity_provider.h" +#include "net/url_request/url_request_context_getter.h" +#include "services/identity/public/cpp/identity_test_environment.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "services/network/test/test_url_loader_factory.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace invalidation { + +class FCMInvalidationServiceTestDelegate { + public: + FCMInvalidationServiceTestDelegate() {} + + ~FCMInvalidationServiceTestDelegate() {} + + void CreateInvalidationService() { + CreateUninitializedInvalidationService(); + InitializeInvalidationService(); + } + + void CreateUninitializedInvalidationService() { + gcm_driver_.reset(new gcm::FakeGCMDriver()); + invalidation_service_.reset(new FCMInvalidationService( + std::make_unique<ProfileIdentityProvider>( + identity_test_env_.identity_manager()), + gcm_driver_.get(), nullptr, nullptr, + base::BindRepeating(&syncer::JsonUnsafeParser::Parse), + &url_loader_factory_)); + } + + void InitializeInvalidationService() { + fake_invalidator_ = new syncer::FakeInvalidator(); + invalidation_service_->InitForTest(fake_invalidator_); + } + + InvalidationService* GetInvalidationService() { + return invalidation_service_.get(); + } + + void DestroyInvalidationService() { invalidation_service_.reset(); } + + void TriggerOnInvalidatorStateChange(syncer::InvalidatorState state) { + fake_invalidator_->EmitOnInvalidatorStateChange(state); + } + + void TriggerOnIncomingInvalidation( + const syncer::ObjectIdInvalidationMap& invalidation_map) { + fake_invalidator_->EmitOnIncomingInvalidation(invalidation_map); + } + + identity::IdentityTestEnvironment identity_test_env_; + std::unique_ptr<gcm::GCMDriver> gcm_driver_; + syncer::FakeInvalidator* fake_invalidator_; // Owned by the service. + network::TestURLLoaderFactory url_loader_factory_; + + std::unique_ptr<FCMInvalidationService> invalidation_service_; +}; + +INSTANTIATE_TYPED_TEST_CASE_P(FCMInvalidationServiceTest, + InvalidationServiceTest, + FCMInvalidationServiceTestDelegate); + +namespace internal { + +class FakeCallbackContainer { + public: + FakeCallbackContainer() : called_(false), weak_ptr_factory_(this) {} + + void FakeCallback(const base::DictionaryValue& value) { called_ = true; } + + bool called_; + base::WeakPtrFactory<FakeCallbackContainer> weak_ptr_factory_; +}; + +} // namespace internal + +// Test that requesting for detailed status doesn't crash even if the +// underlying invalidator is not initialized. +TEST(FCMInvalidationServiceLoggingTest, DetailedStatusCallbacksWork) { + std::unique_ptr<FCMInvalidationServiceTestDelegate> delegate( + new FCMInvalidationServiceTestDelegate()); + + delegate->CreateUninitializedInvalidationService(); + invalidation::InvalidationService* const invalidator = + delegate->GetInvalidationService(); + + internal::FakeCallbackContainer fake_container; + invalidator->RequestDetailedStatus( + base::BindRepeating(&internal::FakeCallbackContainer::FakeCallback, + fake_container.weak_ptr_factory_.GetWeakPtr())); + EXPECT_FALSE(fake_container.called_); + + delegate->InitializeInvalidationService(); + + invalidator->RequestDetailedStatus( + base::BindRepeating(&internal::FakeCallbackContainer::FakeCallback, + fake_container.weak_ptr_factory_.GetWeakPtr())); + EXPECT_TRUE(fake_container.called_); +} + +} // namespace invalidation
diff --git a/components/invalidation/impl/invalidation_switches.cc b/components/invalidation/impl/invalidation_switches.cc index 05740e7..8411af3e 100644 --- a/components/invalidation/impl/invalidation_switches.cc +++ b/components/invalidation/impl/invalidation_switches.cc
@@ -18,5 +18,8 @@ const char kSyncAllowInsecureXmppConnection[] = "sync-allow-insecure-xmpp-connection"; +const base::Feature kFCMInvalidations = {"FCMInvalidations", + base::FEATURE_DISABLED_BY_DEFAULT}; + } // namespace switches } // namespace invalidation
diff --git a/components/invalidation/impl/invalidation_switches.h b/components/invalidation/impl/invalidation_switches.h index 72c3237be..2dd3145c 100644 --- a/components/invalidation/impl/invalidation_switches.h +++ b/components/invalidation/impl/invalidation_switches.h
@@ -5,12 +5,15 @@ #ifndef COMPONENTS_INVALIDATION_IMPL_INVALIDATION_SWITCHES_H #define COMPONENTS_INVALIDATION_IMPL_INVALIDATION_SWITCHES_H +#include "base/feature_list.h" + namespace invalidation { namespace switches { extern const char kInvalidationUseGCMChannel[]; extern const char kSyncNotificationHostPort[]; extern const char kSyncAllowInsecureXmppConnection[]; +extern const base::Feature kFCMInvalidations; } // namespace switches } // namespace invalidation
diff --git a/components/ntp_tiles/most_visited_sites.cc b/components/ntp_tiles/most_visited_sites.cc index 7a17663..644b5213 100644 --- a/components/ntp_tiles/most_visited_sites.cc +++ b/components/ntp_tiles/most_visited_sites.cc
@@ -210,8 +210,8 @@ if (!custom_links_ || !current_tiles_.has_value()) return; - custom_links_->Initialize(current_tiles_.value()); - BuildCurrentTiles(); + if (custom_links_->Initialize(current_tiles_.value())) + BuildCurrentTiles(); } void MostVisitedSites::UninitializeCustomLinks() { @@ -235,21 +235,24 @@ if (!custom_links_) return; - custom_links_->AddLink(url, title); + if (custom_links_->AddLink(url, title)) + BuildCurrentTiles(); } void MostVisitedSites::DeleteCustomLink(const GURL& url) { if (!custom_links_) return; - custom_links_->DeleteLink(url); + if (custom_links_->DeleteLink(url)) + BuildCurrentTiles(); } void MostVisitedSites::UndoDeleteCustomLink() { if (!custom_links_) return; - custom_links_->UndoDeleteLink(); + if (custom_links_->UndoDeleteLink()) + BuildCurrentTiles(); } void MostVisitedSites::AddOrRemoveBlacklistedUrl(const GURL& url,
diff --git a/components/ntp_tiles/most_visited_sites_unittest.cc b/components/ntp_tiles/most_visited_sites_unittest.cc index fce76cf..9bf6b1b 100644 --- a/components/ntp_tiles/most_visited_sites_unittest.cc +++ b/components/ntp_tiles/most_visited_sites_unittest.cc
@@ -1099,7 +1099,7 @@ ElementsAre(MatchesTile(kTestTitle, kTestUrl, TileSource::TOP_SITES))); // Initialize custom links and rebuild tiles. Tiles should be custom links. - EXPECT_CALL(*mock_custom_links_, Initialize(_)); + EXPECT_CALL(*mock_custom_links_, Initialize(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_custom_links_, IsInitialized()).WillOnce(Return(true)); EXPECT_CALL(*mock_custom_links_, GetLinks()) .WillOnce(ReturnRef(expected_links));
diff --git a/components/policy/core/common/cloud/cloud_policy_client.cc b/components/policy/core/common/cloud/cloud_policy_client.cc index ee50856..d59c231 100644 --- a/components/policy/core/common/cloud/cloud_policy_client.cc +++ b/components/policy/core/common/cloud/cloud_policy_client.cc
@@ -523,7 +523,7 @@ void CloudPolicyClient::FetchRemoteCommands( std::unique_ptr<RemoteCommandJob::UniqueIDType> last_command_id, const std::vector<em::RemoteCommandResult>& command_results, - const RemoteCommandCallback& callback) { + RemoteCommandCallback callback) { CHECK(is_registered()); std::unique_ptr<DeviceManagementRequestJob> request_job(service_->CreateJob( DeviceManagementRequestJob::TYPE_REMOTE_COMMANDS, GetURLLoaderFactory())); @@ -540,9 +540,11 @@ for (const auto& command_result : command_results) *request->add_command_results() = command_result; - const DeviceManagementRequestJob::Callback job_callback = - base::Bind(&CloudPolicyClient::OnRemoteCommandsFetched, - weak_ptr_factory_.GetWeakPtr(), request_job.get(), callback); + DeviceManagementRequestJob::Callback job_callback = + base::AdaptCallbackForRepeating( + base::BindOnce(&CloudPolicyClient::OnRemoteCommandsFetched, + weak_ptr_factory_.GetWeakPtr(), request_job.get(), + std::move(callback))); request_jobs_.push_back(std::move(request_job)); request_jobs_.back()->Start(job_callback); @@ -1006,7 +1008,7 @@ void CloudPolicyClient::OnRemoteCommandsFetched( const DeviceManagementRequestJob* job, - const RemoteCommandCallback& callback, + RemoteCommandCallback callback, DeviceManagementStatus status, int net_error, const em::DeviceManagementResponse& response) { @@ -1019,7 +1021,7 @@ status = DM_STATUS_RESPONSE_DECODING_ERROR; } } - callback.Run(status, commands); + std::move(callback).Run(status, commands); // Must call RemoveJob() last, because it frees |callback|. RemoveJob(job); }
diff --git a/components/policy/core/common/cloud/cloud_policy_client.h b/components/policy/core/common/cloud/cloud_policy_client.h index fb691219..61779fa 100644 --- a/components/policy/core/common/cloud/cloud_policy_client.h +++ b/components/policy/core/common/cloud/cloud_policy_client.h
@@ -68,7 +68,7 @@ const LicenseMap& map)>; // A callback which receives fetched remote commands. - using RemoteCommandCallback = base::Callback<void( + using RemoteCommandCallback = base::OnceCallback<void( DeviceManagementStatus, const std::vector<enterprise_management::RemoteCommand>&)>; @@ -241,7 +241,7 @@ std::unique_ptr<RemoteCommandJob::UniqueIDType> last_command_id, const std::vector<enterprise_management::RemoteCommandResult>& command_results, - const RemoteCommandCallback& callback); + RemoteCommandCallback callback); // Sends a device attribute update permission request to the server, uses // OAuth2 token |auth_token| to identify user who requests a permission to @@ -427,7 +427,7 @@ // Callback for remote command fetch requests. void OnRemoteCommandsFetched( const DeviceManagementRequestJob* job, - const RemoteCommandCallback& callback, + RemoteCommandCallback callback, DeviceManagementStatus status, int net_error, const enterprise_management::DeviceManagementResponse& response);
diff --git a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc index af54fed..d66491c 100644 --- a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc +++ b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
@@ -1148,15 +1148,15 @@ ElementsAre(MatchProto( remote_command_response_.remote_command_response().commands(0))))) .Times(1); - const CloudPolicyClient::RemoteCommandCallback callback = - base::Bind(&MockRemoteCommandsObserver::OnRemoteCommandsFetched, - base::Unretained(&remote_commands_observer)); + CloudPolicyClient::RemoteCommandCallback callback = + base::BindOnce(&MockRemoteCommandsObserver::OnRemoteCommandsFetched, + base::Unretained(&remote_commands_observer)); const std::vector<em::RemoteCommandResult> command_results( 1, remote_command_request_.remote_command_request().command_results(0)); client_->FetchRemoteCommands( std::make_unique<RemoteCommandJob::UniqueIDType>(kLastCommandId), - command_results, callback); + command_results, std::move(callback)); EXPECT_EQ(DM_STATUS_SUCCESS, client_->status()); }
diff --git a/components/policy/core/common/remote_commands/remote_command_job.cc b/components/policy/core/common/remote_commands/remote_command_job.cc index e0edfb7..60f79fc 100644 --- a/components/policy/core/common/remote_commands/remote_command_job.cc +++ b/components/policy/core/common/remote_commands/remote_command_job.cc
@@ -70,7 +70,7 @@ } bool RemoteCommandJob::Run(base::TimeTicks now, - const FinishedCallback& finished_callback) { + FinishedCallback finished_callback) { DCHECK(thread_checker_.CalledOnValidThread()); if (status_ == INVALID) { @@ -90,11 +90,12 @@ execution_started_time_ = now; status_ = RUNNING; - finished_callback_ = finished_callback; + finished_callback_ = std::move(finished_callback); - RunImpl(base::Bind(&RemoteCommandJob::OnCommandExecutionFinishedWithResult, + RunImpl( + base::BindOnce(&RemoteCommandJob::OnCommandExecutionFinishedWithResult, weak_factory_.GetWeakPtr(), true), - base::Bind(&RemoteCommandJob::OnCommandExecutionFinishedWithResult, + base::BindOnce(&RemoteCommandJob::OnCommandExecutionFinishedWithResult, weak_factory_.GetWeakPtr(), false)); // The command is expected to run asynchronously. @@ -116,8 +117,8 @@ TerminateImpl(); - if (!finished_callback_.is_null()) - finished_callback_.Run(); + if (finished_callback_) + std::move(finished_callback_).Run(); } base::TimeDelta RemoteCommandJob::GetCommandTimeout() const { @@ -162,8 +163,8 @@ result_payload_ = std::move(result_payload); - if (!finished_callback_.is_null()) - finished_callback_.Run(); + if (finished_callback_) + std::move(finished_callback_).Run(); } } // namespace policy
diff --git a/components/policy/core/common/remote_commands/remote_command_job.h b/components/policy/core/common/remote_commands/remote_command_job.h index 4bba1cd..4d159f0 100644 --- a/components/policy/core/common/remote_commands/remote_command_job.h +++ b/components/policy/core/common/remote_commands/remote_command_job.h
@@ -38,7 +38,7 @@ TERMINATED, // The job was terminated before finishing by itself. }; - using FinishedCallback = base::Closure; + using FinishedCallback = base::OnceClosure; virtual ~RemoteCommandJob(); @@ -60,7 +60,7 @@ // Returns true if the task is posted and the command marked as running. // Returns false otherwise, for example if the command is invalid or expired. // Subclasses should implement RunImpl() for actual work. - bool Run(base::TimeTicks now, const FinishedCallback& finished_callback); + bool Run(base::TimeTicks now, FinishedCallback finished_callback); // Attempts to terminate the running tasks associated with this command. Does // nothing if the task is already terminated or finished. It's guaranteed that @@ -102,7 +102,7 @@ }; using CallbackWithResult = - base::Callback<void(std::unique_ptr<ResultPayload>)>; + base::OnceCallback<void(std::unique_ptr<ResultPayload>)>; RemoteCommandJob(); @@ -127,8 +127,8 @@ // |succeeded_callback| or |failed_callback| on the thread that this method // was called. // Also see comments regarding Run(). - virtual void RunImpl(const CallbackWithResult& succeed_callback, - const CallbackWithResult& failed_callback) = 0; + virtual void RunImpl(CallbackWithResult succeed_callback, + CallbackWithResult failed_callback) = 0; // Subclasses should implement this method for actual command execution // termination. Be cautious that tasks might be running on another thread or
diff --git a/components/policy/core/common/remote_commands/remote_commands_queue.cc b/components/policy/core/common/remote_commands/remote_commands_queue.cc index 65a470b..4474100 100644 --- a/components/policy/core/common/remote_commands/remote_commands_queue.cc +++ b/components/policy/core/common/remote_commands/remote_commands_queue.cc
@@ -81,9 +81,10 @@ running_command_->GetCommandTimeout(), this, &RemoteCommandsQueue::OnCommandTimeout); - if (running_command_->Run(clock_->NowTicks(), - base::Bind(&RemoteCommandsQueue::CurrentJobFinished, - base::Unretained(this)))) { + if (running_command_->Run( + clock_->NowTicks(), + base::BindOnce(&RemoteCommandsQueue::CurrentJobFinished, + base::Unretained(this)))) { for (auto& observer : observer_list_) observer.OnJobStarted(running_command_.get()); } else {
diff --git a/components/policy/core/common/remote_commands/remote_commands_service.cc b/components/policy/core/common/remote_commands/remote_commands_service.cc index 34fc533..67b35671 100644 --- a/components/policy/core/common/remote_commands/remote_commands_service.cc +++ b/components/policy/core/common/remote_commands/remote_commands_service.cc
@@ -72,8 +72,8 @@ client_->FetchRemoteCommands( std::move(id_to_acknowledge), previous_results, - base::Bind(&RemoteCommandsService::OnRemoteCommandsFetched, - weak_factory_.GetWeakPtr())); + base::BindOnce(&RemoteCommandsService::OnRemoteCommandsFetched, + weak_factory_.GetWeakPtr())); return true; }
diff --git a/components/policy/core/common/remote_commands/remote_commands_service_unittest.cc b/components/policy/core/common/remote_commands/remote_commands_service_unittest.cc index 4230ee0..b03de33 100644 --- a/components/policy/core/common/remote_commands/remote_commands_service_unittest.cc +++ b/components/policy/core/common/remote_commands/remote_commands_service_unittest.cc
@@ -131,7 +131,7 @@ void FetchRemoteCommands( std::unique_ptr<RemoteCommandJob::UniqueIDType> last_command_id, const std::vector<em::RemoteCommandResult>& command_results, - const RemoteCommandCallback& callback) override { + RemoteCommandCallback callback) override { ASSERT_FALSE(expected_fetch_commands_calls_.empty()); const FetchCallExpectation fetch_call_expectation = @@ -144,7 +144,7 @@ base::BindOnce( &TestingCloudPolicyClientForRemoteCommands::DoFetchRemoteCommands, base::Unretained(this), std::move(last_command_id), command_results, - callback, fetch_call_expectation), + std::move(callback), fetch_call_expectation), base::TimeDelta::FromSeconds( kTestClientServerCommunicationDelayInSeconds)); } @@ -152,7 +152,7 @@ void DoFetchRemoteCommands( std::unique_ptr<RemoteCommandJob::UniqueIDType> last_command_id, const std::vector<em::RemoteCommandResult>& command_results, - const RemoteCommandCallback& callback, + RemoteCommandCallback callback, const FetchCallExpectation& fetch_call_expectation) { const std::vector<em::RemoteCommand> fetched_commands = server_->FetchCommands(std::move(last_command_id), command_results); @@ -167,7 +167,9 @@ // Simulate delay from DMServer back to client. base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, base::Bind(callback, DM_STATUS_SUCCESS, fetched_commands), + FROM_HERE, + base::BindOnce(std::move(callback), DM_STATUS_SUCCESS, + fetched_commands), base::TimeDelta::FromSeconds( kTestClientServerCommunicationDelayInSeconds)); }
diff --git a/components/policy/core/common/remote_commands/test_remote_command_job.cc b/components/policy/core/common/remote_commands/test_remote_command_job.cc index dba416c..aaf05603 100644 --- a/components/policy/core/common/remote_commands/test_remote_command_job.cc +++ b/components/policy/core/common/remote_commands/test_remote_command_job.cc
@@ -66,14 +66,15 @@ base::TimeDelta::FromHours(kCommandExpirationTimeInHours); } -void TestRemoteCommandJob::RunImpl(const CallbackWithResult& succeed_callback, - const CallbackWithResult& failed_callback) { +void TestRemoteCommandJob::RunImpl(CallbackWithResult succeed_callback, + CallbackWithResult failed_callback) { std::unique_ptr<ResultPayload> echo_payload( new EchoPayload(command_payload_)); base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, - base::BindOnce(succeed_ ? succeed_callback : failed_callback, - std::move(echo_payload)), + base::BindOnce( + succeed_ ? std::move(succeed_callback) : std::move(failed_callback), + std::move(echo_payload)), execution_duration_); }
diff --git a/components/policy/core/common/remote_commands/test_remote_command_job.h b/components/policy/core/common/remote_commands/test_remote_command_job.h index 9a387ea3..ed4ed0e 100644 --- a/components/policy/core/common/remote_commands/test_remote_command_job.h +++ b/components/policy/core/common/remote_commands/test_remote_command_job.h
@@ -29,8 +29,8 @@ // RemoteCommandJob: bool ParseCommandPayload(const std::string& command_payload) override; bool IsExpired(base::TimeTicks now) override; - void RunImpl(const CallbackWithResult& succeed_callback, - const CallbackWithResult& failed_callback) override; + void RunImpl(CallbackWithResult succeed_callback, + CallbackWithResult failed_callback) override; std::string command_payload_;
diff --git a/components/sync_sessions/local_session_event_handler_impl.cc b/components/sync_sessions/local_session_event_handler_impl.cc index a538a584..9eca13c 100644 --- a/components/sync_sessions/local_session_event_handler_impl.cc +++ b/components/sync_sessions/local_session_event_handler_impl.cc
@@ -172,24 +172,19 @@ // Placeholder tabs are those without WebContents, either because they // were never loaded into memory or they were evicted from memory // (typically only on Android devices). They only have a window ID and a - // tab ID, and we use the latter to properly reassociate the tab with the - // entity that was backing it. - if (synced_tab->IsPlaceholderTab()) { - // For tabs without WebContents update |window_id|, as it could have - // changed after a session restore. - // TODO(crbug.com/854493): Avoid associating placeholder tabs - // altogether, because it's not worth to update the window ID in tab - // entities. - AssociateRestoredPlaceholderTab(*synced_tab, tab_id, window_id, batch); - } else if (RELOAD_TABS == option) { + // tab ID, and we can use the latter to properly reassociate the tab with + // the entity that was backing it. The window ID could have changed, but + // noone really cares, because the window/tab hierarchy is constructed + // from the header entity (which has up-to-date IDs). Hence, in order to + // avoid unnecessary traffic, we avoid updating the entity. + if (!synced_tab->IsPlaceholderTab() && RELOAD_TABS == option) { AssociateTab(synced_tab, batch); } - // If the tab was syncable, it would have been added to the tracker - // either by the above Associate[RestoredPlaceholder]Tab call or by - // the OnLocalTabModified method invoking AssociateTab directly. - // Therefore, we can key whether this window has valid tabs based on - // the tab's presence in the tracker. + // If the tab was syncable, it would have been added to the tracker either + // by the above AssociateTab call or by the OnLocalTabModified method + // invoking AssociateTab directly. Therefore, we can key whether this + // window has valid tabs based on the tab's presence in the tracker. const sessions::SessionTab* tab = session_tracker_->LookupSessionTab(current_session_tag_, tab_id); if (tab) { @@ -386,46 +381,6 @@ } } -void LocalSessionEventHandlerImpl::AssociateRestoredPlaceholderTab( - const SyncedTabDelegate& tab_delegate, - SessionID tab_id, - SessionID new_window_id, - WriteBatch* batch) { - const int tab_node_id = - session_tracker_->LookupTabNodeFromTabId(current_session_tag_, tab_id); - - // If a placeholder tab is not present in the tracker, we must ignore it - // because the delegate doesn't expose sufficient information to start - // tracking the tab (e.g. navigations are missing). - if (tab_node_id == TabNodePool::kInvalidTabNodeID) { - DVLOG(1) << "Placeholder tab " << tab_id << " has no sync id."; - return; - } - - // Update the window id on the SessionTab itself. - sessions::SessionTab* local_tab = - session_tracker_->GetTab(current_session_tag_, tab_id); - if (local_tab->window_id == new_window_id) { - // Nothing to update. - return; - } - local_tab->window_id = new_window_id; - - // Filter out placeholder tabs that have been associated but don't have known - // sync data. - if (local_tab->navigations.empty()) { - return; - } - - // Rewrite the specifics based on the reassociated SessionTab to preserve - // the new window id. - auto specifics = std::make_unique<sync_pb::SessionSpecifics>(); - SessionTabToSyncData(*local_tab).Swap(specifics->mutable_tab()); - specifics->set_session_tag(current_session_tag_); - specifics->set_tab_node_id(tab_node_id); - batch->Put(std::move(specifics)); -} - sync_pb::SessionTab LocalSessionEventHandlerImpl::GetTabSpecificsFromDelegate( const SyncedTabDelegate& tab_delegate) const { sync_pb::SessionTab specifics;
diff --git a/components/sync_sessions/local_session_event_handler_impl.h b/components/sync_sessions/local_session_event_handler_impl.h index 9272381..43bdf59 100644 --- a/components/sync_sessions/local_session_event_handler_impl.h +++ b/components/sync_sessions/local_session_event_handler_impl.h
@@ -88,17 +88,6 @@ void AssociateTab(SyncedTabDelegate* const tab, WriteBatch* batch); - // It's possible that when we associate windows, tabs aren't all loaded - // into memory yet (e.g on android) and we don't have a WebContents. In this - // case we can't do a full association, but we still want to update tab IDs - // as they may have changed after a session was restored. This method - // new_window_id against the previously persisted window ID (from our - // TabNodePool) and updates it. - void AssociateRestoredPlaceholderTab(const SyncedTabDelegate& tab_delegate, - SessionID tab_id, - SessionID new_window_id, - WriteBatch* batch); - // Set |session_tab| from |tab_delegate|. sync_pb::SessionTab GetTabSpecificsFromDelegate( const SyncedTabDelegate& tab_delegate) const;
diff --git a/components/sync_sessions/local_session_event_handler_impl_unittest.cc b/components/sync_sessions/local_session_event_handler_impl_unittest.cc index 7aeb24bb..1f04906 100644 --- a/components/sync_sessions/local_session_event_handler_impl_unittest.cc +++ b/components/sync_sessions/local_session_event_handler_impl_unittest.cc
@@ -327,6 +327,56 @@ InitHandler(); } +// Tests that association does not refresh window IDs for placeholder tabs, even +// if the window ID changes across restarts. +TEST_F(LocalSessionEventHandlerImplTest, DontUpdateWindowIdForPlaceholderTab) { + const int kRegularTabNodeId = 1; + const int kPlaceholderTabNodeId = 2; + + // The tracker is initially restored from persisted state, containing a + // regular tab and a placeholder tab. This mimics + // SessionsSyncManager::InitFromSyncModel(). + sync_pb::SessionSpecifics regular_tab; + regular_tab.set_session_tag(kSessionTag); + regular_tab.set_tab_node_id(kRegularTabNodeId); + regular_tab.mutable_tab()->set_window_id(kWindowId1); + regular_tab.mutable_tab()->set_tab_id(kTabId1); + session_tracker_.ReassociateLocalTab(kRegularTabNodeId, + SessionID::FromSerializedValue(kTabId1)); + UpdateTrackerWithSpecifics(regular_tab, base::Time::Now(), &session_tracker_); + + sync_pb::SessionSpecifics placeholder_tab; + placeholder_tab.set_session_tag(kSessionTag); + placeholder_tab.set_tab_node_id(kPlaceholderTabNodeId); + placeholder_tab.mutable_tab()->set_window_id(kWindowId1); + placeholder_tab.mutable_tab()->set_tab_id(kTabId2); + session_tracker_.ReassociateLocalTab(kPlaceholderTabNodeId, + SessionID::FromSerializedValue(kTabId2)); + UpdateTrackerWithSpecifics(placeholder_tab, base::Time::Now(), + &session_tracker_); + + // Window ID has changed when the browser is started. + TestSyncedWindowDelegate* window = AddWindow(kWindowId2); + AddTab(kWindowId2, kFoo1, kTabId1); + PlaceholderTabDelegate t1_override(SessionID::FromSerializedValue(kTabId2)); + window->OverrideTabAt(1, &t1_override); + + // Verify that window ID is updated for the regular tab, but not for the + // placeholder tab. + auto mock_batch = std::make_unique<StrictMock<MockWriteBatch>>(); + EXPECT_CALL(*mock_batch, Put(Pointee(MatchesHeader(kSessionTag, {kWindowId2}, + {kTabId1, kTabId2})))); + EXPECT_CALL(*mock_batch, Put(Pointee(MatchesTab(kSessionTag, kWindowId2, + kTabId1, kRegularTabNodeId, + /*urls=*/{kFoo1})))); + EXPECT_CALL(*mock_batch, Commit()); + + EXPECT_CALL(mock_delegate_, CreateLocalSessionWriteBatch()) + .WillOnce(Return(ByMove(std::move(mock_batch)))); + + InitHandler(); +} + // Tests that association of windows and tabs gets deferred due to ongoing // session restore during startup. TEST_F(LocalSessionEventHandlerImplTest,
diff --git a/components/sync_sessions/session_sync_bridge_unittest.cc b/components/sync_sessions/session_sync_bridge_unittest.cc index 0e8b616..4c6971d 100644 --- a/components/sync_sessions/session_sync_bridge_unittest.cc +++ b/components/sync_sessions/session_sync_bridge_unittest.cc
@@ -517,7 +517,7 @@ /*tab_node_id=*/_, {"http://bar.com/"}))); } -TEST_F(SessionSyncBridgeTest, ShouldUpdateIdsDuringRestore) { +TEST_F(SessionSyncBridgeTest, ShouldNotUpdatePlaceholderTabsDuringRestore) { const int kWindowId1 = 1000001; const int kWindowId2 = 1000002; const int kTabId1 = 1000003; @@ -565,28 +565,21 @@ window->OverrideTabAt(0, &placeholder_tab1); window->OverrideTabAt(1, &placeholder_tab2); - // When the bridge gets restarted, we expected tab IDs being updated, but the - // rest of the information such as navigation URLs should be reused. + // When the bridge gets restarted, we only expect the header to be updated, + // and placeholder tabs stay unchanged with a stale window ID. EXPECT_CALL(mock_processor(), Put(header_storage_key, EntityDataHasSpecifics(MatchesHeader( kLocalSessionTag, {kWindowId2}, {kTabId1, kTabId2})), _)); - EXPECT_CALL(mock_processor(), Put(tab_storage_key1, - EntityDataHasSpecifics(MatchesTab( - kLocalSessionTag, kWindowId2, kTabId1, - kTabNodeId1, {"http://foo.com/"})), - _)); - EXPECT_CALL(mock_processor(), Put(tab_storage_key2, - EntityDataHasSpecifics(MatchesTab( - kLocalSessionTag, kWindowId2, kTabId2, - kTabNodeId2, {"http://bar.com/"})), - _)); // Start the bridge again. InitializeBridge(); StartSyncing(); + // Although we haven't notified the processor about the window-ID change, if + // it hypothetically asked for these entities, the returned entities are + // up-to-date. EXPECT_THAT(GetData(header_storage_key), EntityDataHasSpecifics(MatchesHeader( kLocalSessionTag, {kWindowId2}, {kTabId1, kTabId2})));
diff --git a/components/sync_sessions/sessions_sync_manager_unittest.cc b/components/sync_sessions/sessions_sync_manager_unittest.cc index 6481cb129..402576e6 100644 --- a/components/sync_sessions/sessions_sync_manager_unittest.cc +++ b/components/sync_sessions/sessions_sync_manager_unittest.cc
@@ -1812,18 +1812,17 @@ // and 2 tabs. VerifyLocalHeaderChange(out.back(), 1, 2); - // There should be two changes, one for the fully associated tab and one for - // the placeholder tab (window ID change). + // There should be one tab change, for the fully associated tab. The + // window-ID change for the placeholder tab is not reported to avoid traffic, + // since nothing relies on it. ASSERT_TRUE(AllOfChangesAreType(*FilterOutLocalHeaderChanges(&out), SyncChange::ACTION_UPDATE)); - ASSERT_EQ(2U, out.size()); + ASSERT_EQ(1U, out.size()); VerifyLocalTabChange(out[0], 2, kFoo2); - VerifyLocalTabChange(out[1], 2, kBar2); } -// Ensure model association updates the window ID for tabs whose window's ID has -// changed. -TEST_F(SessionsSyncManagerTest, WindowIdUpdatedOnRestore) { +// Ensure model association does not update the window ID for placeholder tabs. +TEST_F(SessionsSyncManagerTest, WindowIdNotUpdatedOnRestoreForPlaceholderTab) { SyncDataList in; SyncChangeList out; @@ -1851,11 +1850,8 @@ window->OverrideTabAt(0, &t0_override); InitWithSyncDataTakeOutput(in, &out); - // There should be one change for t0's window ID update. - ASSERT_EQ(1U, FilterOutLocalHeaderChanges(&out)->size()); - VerifyLocalTabChange(out[0], 1, kFoo1); - EXPECT_EQ(window->GetSessionId().id(), - out[0].sync_data().GetSpecifics().session().tab().window_id()); + // There should be no change other than the header update. + ASSERT_EQ(0U, FilterOutLocalHeaderChanges(&out)->size()); } // Ensure that the manager properly ignores a restored placeholder that refers
diff --git a/components/version_ui/resources/about_version.html b/components/version_ui/resources/about_version.html index db3ff36..68b9659 100644 --- a/components/version_ui/resources/about_version.html +++ b/components/version_ui/resources/about_version.html
@@ -140,12 +140,6 @@ <td class="label">$i18n{variations_cmd_name}</td> <td class="version-wide" id="variations-cmd"></td> </tr> -<if expr="is_win"> - <tr id="linker-section"> - <td class="label">Linker</td> - <td class="version" id="linker">$i18n{linker}</td> - </tr> -</if> </table> </div> <script src="chrome://resources/js/i18n_template.js"></script>
diff --git a/content/browser/android/select_popup.cc b/content/browser/android/select_popup.cc index 1ec666da..1c40ca4 100644 --- a/content/browser/android/select_popup.cc +++ b/content/browser/android/select_popup.cc
@@ -13,7 +13,6 @@ #include "content/public/common/menu_item.h" #include "content/public/common/use_zoom_for_dsf_policy.h" #include "jni/SelectPopup_jni.h" -#include "ui/android/window_android.h" #include "ui/gfx/geometry/rect_f.h" using base::android::AttachCurrentThread; @@ -162,11 +161,4 @@ rfhi->DidSelectPopupMenuItems(selected_indices); } -base::android::ScopedJavaLocalRef<jobject> SelectPopup::GetWindowAndroid( - JNIEnv* env, - const JavaParamRef<jobject>& obj) { - auto* window = web_contents_->GetNativeView()->GetWindowAndroid(); - return window ? window->GetJavaObject() : ScopedJavaLocalRef<jobject>(); -} - } // namespace content
diff --git a/content/browser/android/select_popup.h b/content/browser/android/select_popup.h index bef949c1..41839b3 100644 --- a/content/browser/android/select_popup.h +++ b/content/browser/android/select_popup.h
@@ -26,9 +26,6 @@ SelectPopup(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, WebContentsImpl* web_contents); - base::android::ScopedJavaLocalRef<jobject> GetWindowAndroid( - JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj); ~SelectPopup(); // Creates a popup menu with |items|.
diff --git a/content/browser/background_fetch/background_fetch_data_manager_unittest.cc b/content/browser/background_fetch/background_fetch_data_manager_unittest.cc index 6629f520..f386081 100644 --- a/content/browser/background_fetch/background_fetch_data_manager_unittest.cc +++ b/content/browser/background_fetch/background_fetch_data_manager_unittest.cc
@@ -603,7 +603,7 @@ void DidMatchCache(base::OnceClosure quit_closure, bool* out_result, blink::mojom::CacheStorageError error, - std::unique_ptr<ServiceWorkerResponse> response) { + blink::mojom::FetchAPIResponsePtr response) { if (error == blink::mojom::CacheStorageError::kSuccess) { DCHECK(response); *out_result = true;
diff --git a/content/browser/background_fetch/storage/get_settled_fetches_task.cc b/content/browser/background_fetch/storage/get_settled_fetches_task.cc index 21677fe..d9a417d 100644 --- a/content/browser/background_fetch/storage/get_settled_fetches_task.cc +++ b/content/browser/background_fetch/storage/get_settled_fetches_task.cc
@@ -10,6 +10,49 @@ #include "content/browser/cache_storage/cache_storage_manager.h" #include "content/browser/service_worker/service_worker_context_wrapper.h" +namespace mojo { + +// TODO(leonhsl): Deprecate this converter once we replace usages of +// content::ServiceWorkerResponse with blink::mojom::FetchAPIResponse in +// background_fetch codes. +template <> +struct TypeConverter<content::ServiceWorkerResponse, + blink::mojom::FetchAPIResponse> { + static content::ServiceWorkerResponse Convert( + const blink::mojom::FetchAPIResponse& input) { + content::ServiceWorkerResponse output; + output.url_list = std::move(input.url_list); + output.status_code = input.status_code; + output.status_text = std::move(input.status_text); + output.response_type = input.response_type; + output.headers.insert(input.headers.begin(), input.headers.end()); + if (input.blob) { + output.blob_uuid = input.blob->uuid; + output.blob_size = input.blob->size; + output.blob = base::MakeRefCounted<storage::BlobHandle>( + blink::mojom::BlobPtr(std::move(input.blob->blob))); + } + output.error = input.error; + output.response_time = input.response_time; + output.is_in_cache_storage = input.is_in_cache_storage; + if (input.cache_storage_cache_name) { + output.cache_storage_cache_name = + std::move(*(input.cache_storage_cache_name)); + } + output.cors_exposed_header_names = + std::move(input.cors_exposed_header_names); + if (input.side_data_blob) { + output.side_data_blob_uuid = input.side_data_blob->uuid; + output.side_data_blob_size = input.side_data_blob->size; + output.side_data_blob = base::MakeRefCounted<storage::BlobHandle>( + blink::mojom::BlobPtr(std::move(input.side_data_blob->blob))); + } + return output; + } +}; + +} // namespace mojo + namespace content { namespace background_fetch { @@ -165,14 +208,13 @@ BackgroundFetchSettledFetch* settled_fetch, base::OnceClosure callback, blink::mojom::CacheStorageError error, - std::unique_ptr<ServiceWorkerResponse> cache_response) { + blink::mojom::FetchAPIResponsePtr cache_response) { if (error != blink::mojom::CacheStorageError::kSuccess) { DCHECK(settled_fetch); FillUncachedResponse(settled_fetch, std::move(callback)); return; } - settled_fetch->response = std::move(*cache_response); - + settled_fetch->response = cache_response->To<ServiceWorkerResponse>(); std::move(callback).Run(); }
diff --git a/content/browser/background_fetch/storage/get_settled_fetches_task.h b/content/browser/background_fetch/storage/get_settled_fetches_task.h index b76465f..01cdae6 100644 --- a/content/browser/background_fetch/storage/get_settled_fetches_task.h +++ b/content/browser/background_fetch/storage/get_settled_fetches_task.h
@@ -61,7 +61,7 @@ void DidMatchRequest(BackgroundFetchSettledFetch* settled_fetch, base::OnceClosure callback, blink::mojom::CacheStorageError error, - std::unique_ptr<ServiceWorkerResponse> cache_response); + blink::mojom::FetchAPIResponsePtr cache_response); void FinishWithError(blink::mojom::BackgroundFetchError error) override;
diff --git a/content/browser/background_fetch/storage/mark_request_complete_task.cc b/content/browser/background_fetch/storage/mark_request_complete_task.cc index f416b06e4..f509d64 100644 --- a/content/browser/background_fetch/storage/mark_request_complete_task.cc +++ b/content/browser/background_fetch/storage/mark_request_complete_task.cc
@@ -19,6 +19,44 @@ #include "storage/browser/blob/blob_storage_context.h" #include "third_party/blink/public/mojom/blob/blob.mojom.h" +namespace mojo { + +// TODO(leonhsl): Deprecate this converter once we replace usages of +// content::ServiceWorkerResponse with blink::mojom::FetchAPIResponse in +// background_fetch codes. +template <> +struct TypeConverter<blink::mojom::FetchAPIResponsePtr, + content::ServiceWorkerResponse> { + static blink::mojom::FetchAPIResponsePtr Convert( + const content::ServiceWorkerResponse& input) { + blink::mojom::SerializedBlobPtr blob; + if (input.blob) { + blob = blink::mojom::SerializedBlob::New(); + blob->uuid = input.blob_uuid; + blob->size = input.blob_size; + blob->blob = input.blob->TakeBlobPtr().PassInterface(); + } + blink::mojom::SerializedBlobPtr side_data_blob; + if (input.side_data_blob) { + side_data_blob = blink::mojom::SerializedBlob::New(); + side_data_blob->uuid = input.side_data_blob_uuid; + side_data_blob->size = input.side_data_blob_size; + side_data_blob->blob = + input.side_data_blob->TakeBlobPtr().PassInterface(); + } + base::flat_map<std::string, std::string> headers(input.headers.begin(), + input.headers.end()); + return blink::mojom::FetchAPIResponse::New( + input.url_list, input.status_code, input.status_text, + input.response_type, headers, std::move(blob), input.error, + input.response_time, input.cache_storage_cache_name, + input.cors_exposed_header_names, input.is_in_cache_storage, + std::move(side_data_blob)); + } +}; + +} // namespace mojo + namespace content { namespace background_fetch { @@ -155,7 +193,7 @@ // We need to keep the handle refcounted while the write is happening, // so it's passed along to the callback. handle.value()->Put( - std::move(request), std::move(response), + std::move(request), blink::mojom::FetchAPIResponse::From(*response), base::BindOnce(&MarkRequestCompleteTask::DidWriteToCache, weak_factory_.GetWeakPtr(), std::move(handle), std::move(done_closure)));
diff --git a/content/browser/cache_storage/cache_storage.cc b/content/browser/cache_storage/cache_storage.cc index d91b54a..78508c8b 100644 --- a/content/browser/cache_storage/cache_storage.cc +++ b/content/browser/cache_storage/cache_storage.cc
@@ -104,7 +104,7 @@ ~CacheMatchResponse() = default; CacheStorageError error; - std::unique_ptr<ServiceWorkerResponse> service_worker_response; + blink::mojom::FetchAPIResponsePtr response; std::unique_ptr<storage::BlobDataHandle> blob_data_handle; }; @@ -717,7 +717,7 @@ void CacheStorage::WriteToCache( const std::string& cache_name, std::unique_ptr<ServiceWorkerFetchRequest> request, - std::unique_ptr<ServiceWorkerResponse> response, + blink::mojom::FetchAPIResponsePtr response, CacheStorage::ErrorCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); @@ -1038,7 +1038,7 @@ CacheStorageCacheHandle cache_handle, CacheStorageCache::ResponseCallback callback, CacheStorageError error, - std::unique_ptr<ServiceWorkerResponse> response) { + blink::mojom::FetchAPIResponsePtr response) { std::move(callback).Run(error, std::move(response)); } @@ -1076,10 +1076,9 @@ CacheMatchResponse* out_match_response, const base::RepeatingClosure& barrier_closure, CacheStorageError error, - std::unique_ptr<ServiceWorkerResponse> service_worker_response) { + blink::mojom::FetchAPIResponsePtr response) { out_match_response->error = error; - out_match_response->service_worker_response = - std::move(service_worker_response); + out_match_response->response = std::move(response); barrier_closure.Run(); } @@ -1090,7 +1089,7 @@ if (match_response.error == CacheStorageError::kErrorNotFound) continue; std::move(callback).Run(match_response.error, - std::move(match_response.service_worker_response)); + std::move(match_response.response)); return; } std::move(callback).Run(CacheStorageError::kErrorNotFound, nullptr); @@ -1099,7 +1098,7 @@ void CacheStorage::WriteToCacheImpl( const std::string& cache_name, std::unique_ptr<ServiceWorkerFetchRequest> request, - std::unique_ptr<ServiceWorkerResponse> response, + blink::mojom::FetchAPIResponsePtr response, CacheStorage::ErrorCallback callback) { CacheStorageCacheHandle cache_handle = GetLoadedCache(cache_name);
diff --git a/content/browser/cache_storage/cache_storage.h b/content/browser/cache_storage/cache_storage.h index af34ef1..a594d09 100644 --- a/content/browser/cache_storage/cache_storage.h +++ b/content/browser/cache_storage/cache_storage.h
@@ -121,7 +121,7 @@ // Puts the request/response pair in the cache. void WriteToCache(const std::string& cache_name, std::unique_ptr<ServiceWorkerFetchRequest> request, - std::unique_ptr<ServiceWorkerResponse> response, + blink::mojom::FetchAPIResponsePtr response, CacheStorage::ErrorCallback callback); // Sums the sizes of each cache and closes them. Runs |callback| with the @@ -214,18 +214,17 @@ void MatchCacheDidMatch(CacheStorageCacheHandle cache_handle, CacheStorageCache::ResponseCallback callback, blink::mojom::CacheStorageError error, - std::unique_ptr<ServiceWorkerResponse> response); + blink::mojom::FetchAPIResponsePtr response); // The MatchAllCaches callbacks are below. void MatchAllCachesImpl(std::unique_ptr<ServiceWorkerFetchRequest> request, blink::mojom::QueryParamsPtr match_params, CacheStorageCache::ResponseCallback callback); - void MatchAllCachesDidMatch( - CacheStorageCacheHandle cache_handle, - CacheMatchResponse* out_match_response, - const base::RepeatingClosure& barrier_closure, - blink::mojom::CacheStorageError error, - std::unique_ptr<ServiceWorkerResponse> service_worker_response); + void MatchAllCachesDidMatch(CacheStorageCacheHandle cache_handle, + CacheMatchResponse* out_match_response, + const base::RepeatingClosure& barrier_closure, + blink::mojom::CacheStorageError error, + blink::mojom::FetchAPIResponsePtr response); void MatchAllCachesDidMatchAll( std::unique_ptr<std::vector<CacheMatchResponse>> match_responses, CacheStorageCache::ResponseCallback callback); @@ -233,7 +232,7 @@ // WriteToCache callbacks. void WriteToCacheImpl(const std::string& cache_name, std::unique_ptr<ServiceWorkerFetchRequest> request, - std::unique_ptr<ServiceWorkerResponse> response, + blink::mojom::FetchAPIResponsePtr response, CacheStorage::ErrorCallback callback); void GetSizeThenCloseAllCachesImpl(SizeCallback callback);
diff --git a/content/browser/cache_storage/cache_storage_cache.cc b/content/browser/cache_storage/cache_storage_cache.cc index 198e9280..2b2797e 100644 --- a/content/browser/cache_storage/cache_storage_cache.cc +++ b/content/browser/cache_storage/cache_storage_cache.cc
@@ -14,6 +14,7 @@ #include "base/barrier_closure.h" #include "base/bind_helpers.h" +#include "base/containers/flat_map.h" #include "base/files/file_path.h" #include "base/guid.h" #include "base/macros.h" @@ -56,6 +57,8 @@ namespace { +using ResponseHeaderMap = base::flat_map<std::string, std::string>; + const size_t kMaxQueryCacheResultBytes = 1024 * 1024 * 10; // 10MB query cache limit @@ -131,8 +134,12 @@ bool VaryMatches(const ServiceWorkerHeaderMap& request, const ServiceWorkerHeaderMap& cached_request, - const ServiceWorkerHeaderMap& response) { - ServiceWorkerHeaderMap::const_iterator vary_iter = response.find("vary"); + const ResponseHeaderMap& response) { + auto vary_iter = std::find_if( + response.begin(), response.end(), + [](const ResponseHeaderMap::value_type& pair) -> bool { + return base::CompareCaseInsensitiveASCII(pair.first, "vary") == 0; + }); if (vary_iter == response.end()) return true; @@ -223,42 +230,41 @@ return request; } -std::unique_ptr<ServiceWorkerResponse> CreateResponse( +blink::mojom::FetchAPIResponsePtr CreateResponse( const proto::CacheMetadata& metadata, const std::string& cache_name) { - std::unique_ptr<std::vector<GURL>> url_list = - std::make_unique<std::vector<GURL>>(); + std::vector<GURL> url_list; // From Chrome 57, proto::CacheMetadata's url field was deprecated. UMA_HISTOGRAM_BOOLEAN("ServiceWorkerCache.Response.HasDeprecatedURL", metadata.response().has_url()); if (metadata.response().has_url()) { - url_list->push_back(GURL(metadata.response().url())); + url_list.push_back(GURL(metadata.response().url())); } else { - url_list->reserve(metadata.response().url_list_size()); + url_list.reserve(metadata.response().url_list_size()); for (int i = 0; i < metadata.response().url_list_size(); ++i) - url_list->push_back(GURL(metadata.response().url_list(i))); + url_list.push_back(GURL(metadata.response().url_list(i))); } - std::unique_ptr<ServiceWorkerHeaderMap> headers = - std::make_unique<ServiceWorkerHeaderMap>(); + ResponseHeaderMap headers; for (int i = 0; i < metadata.response().headers_size(); ++i) { const proto::CacheHeaderMap header = metadata.response().headers(i); DCHECK_EQ(std::string::npos, header.name().find('\0')); DCHECK_EQ(std::string::npos, header.value().find('\0')); - headers->insert(std::make_pair(header.name(), header.value())); + headers.insert(std::make_pair(header.name(), header.value())); } - return std::make_unique<ServiceWorkerResponse>( - std::move(url_list), metadata.response().status_code(), + return blink::mojom::FetchAPIResponse::New( + url_list, metadata.response().status_code(), metadata.response().status_text(), ProtoResponseTypeToFetchResponseType(metadata.response().response_type()), - std::move(headers), "", 0, nullptr /* blob */, + headers, nullptr /* blob */, blink::mojom::ServiceWorkerResponseError::kUnknown, base::Time::FromInternalValue(metadata.response().response_time()), - true /* is_in_cache_storage */, cache_name, - std::make_unique<ServiceWorkerHeaderList>( + cache_name, + std::vector<std::string>( metadata.response().cors_exposed_header_names().begin(), - metadata.response().cors_exposed_header_names().end())); + metadata.response().cors_exposed_header_names().end()), + true /* is_in_cache_storage */, nullptr /* side_data_blob */); } // The size of opaque (non-cors) resource responses are padded in order @@ -285,9 +291,9 @@ response->url_list_size()); } -bool ShouldPadResourceSize(const ServiceWorkerResponse* response) { - return ShouldPadResponseType(response->response_type, - !response->url_list.empty()); +bool ShouldPadResourceSize(const blink::mojom::FetchAPIResponse& response) { + return ShouldPadResponseType(response.response_type, + !response.url_list.empty()); } int64_t CalculateResponsePaddingInternal( @@ -357,7 +363,7 @@ // The state needed to pass between CacheStorageCache::Put callbacks. struct CacheStorageCache::PutContext { PutContext(std::unique_ptr<ServiceWorkerFetchRequest> request, - std::unique_ptr<ServiceWorkerResponse> response, + blink::mojom::FetchAPIResponsePtr response, blink::mojom::BlobPtr blob, blink::mojom::BlobPtr side_data_blob, CacheStorageCache::ErrorCallback callback) @@ -369,7 +375,7 @@ // Input parameters to the Put function. std::unique_ptr<ServiceWorkerFetchRequest> request; - std::unique_ptr<ServiceWorkerResponse> response; + blink::mojom::FetchAPIResponsePtr response; blink::mojom::BlobPtr blob; blink::mojom::BlobPtr side_data_blob; @@ -384,7 +390,7 @@ explicit QueryCacheResult(base::Time entry_time) : entry_time(entry_time) {} std::unique_ptr<ServiceWorkerFetchRequest> request; - std::unique_ptr<ServiceWorkerResponse> response; + blink::mojom::FetchAPIResponsePtr response; disk_cache::ScopedEntryPtr entry; base::Time entry_time; }; @@ -495,7 +501,7 @@ ResponsesCallback callback) { if (backend_state_ == BACKEND_CLOSED) { std::move(callback).Run(CacheStorageError::kErrorStorage, - std::vector<ServiceWorkerResponse>()); + std::vector<blink::mojom::FetchAPIResponsePtr>()); return; } @@ -544,8 +550,11 @@ base::CheckedNumeric<uint64_t> safe_side_data_size = 0; for (const auto& operation : operations) { if (operation->operation_type == blink::mojom::OperationType::kPut) { - safe_space_required += operation->response->blob_size; - safe_side_data_size += operation->response->side_data_blob_size; + safe_space_required += + (operation->response->blob ? operation->response->blob->size : 0); + safe_side_data_size += (operation->response->side_data_blob + ? operation->response->side_data_blob->size + : 0); } } if (!safe_space_required.IsValid() || !safe_side_data_size.IsValid()) { @@ -635,8 +644,6 @@ switch (operation->operation_type) { case blink::mojom::OperationType::kPut: if (skip_side_data) { - operation->response->side_data_blob_uuid = std::string(); - operation->response->side_data_blob_size = 0; operation->response->side_data_blob = nullptr; Put(std::move(operation), completion_callback); } else { @@ -967,7 +974,7 @@ if (query_cache_context->query_types & QUERY_CACHE_RESPONSES_WITH_BODIES) { query_cache_context->estimated_out_bytes += - match->response->EstimatedStructSize(); + EstimatedResponseSizeWithoutBlob(*match->response); if (query_cache_context->estimated_out_bytes > max_query_size_bytes_) { std::move(query_cache_context->callback) .Run(CacheStorageError::kErrorQueryTooLarge, nullptr); @@ -1000,11 +1007,29 @@ } // static +size_t CacheStorageCache::EstimatedResponseSizeWithoutBlob( + const blink::mojom::FetchAPIResponse& response) { + size_t size = sizeof(blink::mojom::FetchAPIResponse); + for (const auto& url : response.url_list) + size += url.spec().size(); + size += response.status_text.size(); + if (response.cache_storage_cache_name) + size += response.cache_storage_cache_name->size(); + for (const auto& key_and_value : response.headers) { + size += key_and_value.first.size(); + size += key_and_value.second.size(); + } + for (const auto& header : response.cors_exposed_header_names) + size += header.size(); + return size; +} + +// static int64_t CacheStorageCache::CalculateResponsePadding( - const ServiceWorkerResponse& response, + const blink::mojom::FetchAPIResponse& response, const crypto::SymmetricKey* padding_key, int side_data_size) { - if (!ShouldPadResourceSize(&response)) + if (!ShouldPadResourceSize(response)) return 0; return CalculateResponsePaddingInternal(response.url_list.back().spec(), padding_key, side_data_size); @@ -1028,7 +1053,7 @@ void CacheStorageCache::MatchDidMatchAll( ResponseCallback callback, CacheStorageError match_all_error, - std::vector<ServiceWorkerResponse> match_all_responses) { + std::vector<blink::mojom::FetchAPIResponsePtr> match_all_responses) { if (match_all_error != CacheStorageError::kSuccess) { std::move(callback).Run(match_all_error, nullptr); return; @@ -1039,10 +1064,8 @@ return; } - std::unique_ptr<ServiceWorkerResponse> response = - std::make_unique<ServiceWorkerResponse>(match_all_responses[0]); - - std::move(callback).Run(CacheStorageError::kSuccess, std::move(response)); + std::move(callback).Run(CacheStorageError::kSuccess, + std::move(match_all_responses[0])); } void CacheStorageCache::MatchAllImpl( @@ -1052,7 +1075,7 @@ DCHECK_NE(BACKEND_UNINITIALIZED, backend_state_); if (backend_state_ != BACKEND_OPEN) { std::move(callback).Run(CacheStorageError::kErrorStorage, - std::vector<ServiceWorkerResponse>()); + std::vector<blink::mojom::FetchAPIResponsePtr>()); return; } @@ -1068,15 +1091,16 @@ CacheStorageError error, std::unique_ptr<QueryCacheResults> query_cache_results) { if (error != CacheStorageError::kSuccess) { - std::move(callback).Run(error, std::vector<ServiceWorkerResponse>()); + std::move(callback).Run(error, + std::vector<blink::mojom::FetchAPIResponsePtr>()); return; } - std::vector<ServiceWorkerResponse> out_responses; + std::vector<blink::mojom::FetchAPIResponsePtr> out_responses; out_responses.reserve(query_cache_results->size()); for (auto& result : *query_cache_results) { - out_responses.push_back(*result.response); + out_responses.push_back(std::move(result.response)); } std::move(callback).Run(CacheStorageError::kSuccess, @@ -1232,14 +1256,11 @@ operation->request.headers, operation->request.referrer, operation->request.is_reload)); - std::unique_ptr<ServiceWorkerResponse> response = - std::make_unique<ServiceWorkerResponse>(*operation->response); - - Put(std::move(request), std::move(response), std::move(callback)); + Put(std::move(request), std::move(operation->response), std::move(callback)); } void CacheStorageCache::Put(std::unique_ptr<ServiceWorkerFetchRequest> request, - std::unique_ptr<ServiceWorkerResponse> response, + blink::mojom::FetchAPIResponsePtr response, ErrorCallback callback) { DCHECK(BACKEND_OPEN == backend_state_ || initializing_); @@ -1247,9 +1268,9 @@ blink::mojom::BlobPtr side_data_blob; if (response->blob) - blob = response->blob->Clone(); + blob.Bind(std::move(response->blob->blob)); if (response->side_data_blob) - side_data_blob = response->side_data_blob->Clone(); + side_data_blob.Bind(std::move(response->side_data_blob->blob)); UMA_HISTOGRAM_ENUMERATION("ServiceWorkerCache.Cache.AllWritesResponseType", response->response_type); @@ -1355,7 +1376,7 @@ response_metadata->add_url_list(url.spec()); response_metadata->set_response_time( put_context->response->response_time.ToInternalValue()); - for (ServiceWorkerHeaderMap::const_iterator it = + for (ResponseHeaderMap::const_iterator it = put_context->response->headers.begin(); it != put_context->response->headers.end(); ++it) { DCHECK_EQ(std::string::npos, it->first.find('\0')); @@ -1405,7 +1426,7 @@ if (rv > 0) storage::RecordBytesWritten(kRecordBytesLabel, rv); - if (ShouldPadResourceSize(put_context->response.get())) { + if (ShouldPadResourceSize(*put_context->response)) { cache_padding_ += CalculateResponsePadding(*put_context->response, cache_padding_key_.get(), 0 /* side_data_size */); @@ -1413,7 +1434,8 @@ // The metadata is written, now for the response content. The data is streamed // from the blob into the cache entry. - if (put_context->response->blob_uuid.empty()) { + if (!put_context->response->blob || + put_context->response->blob->uuid.empty()) { UpdateCacheSize(base::BindOnce(std::move(put_context->callback), CacheStorageError::kSuccess)); return; @@ -1508,7 +1530,7 @@ int64_t cache_padding = 0; if (error == CacheStorageError::kSuccess) { for (const auto& result : *query_cache_results) { - if (ShouldPadResourceSize(result.response.get())) { + if (ShouldPadResourceSize(*result.response)) { int32_t side_data_size = result.entry ? result.entry->GetDataSize(INDEX_SIDE_DATA) : 0; cache_padding += CalculateResponsePadding( @@ -1612,7 +1634,7 @@ for (auto& result : *query_cache_results) { disk_cache::ScopedEntryPtr entry = std::move(result.entry); - if (ShouldPadResourceSize(result.response.get())) { + if (ShouldPadResourceSize(*result.response)) { cache_padding_ -= CalculateResponsePadding(*result.response, cache_padding_key_.get(), entry->GetDataSize(INDEX_SIDE_DATA)); @@ -1836,15 +1858,17 @@ std::move(callback).Run(); } -void CacheStorageCache::PopulateResponseBody(disk_cache::ScopedEntryPtr entry, - ServiceWorkerResponse* response) { +void CacheStorageCache::PopulateResponseBody( + disk_cache::ScopedEntryPtr entry, + blink::mojom::FetchAPIResponse* response) { DCHECK(blob_storage_context_); // Create a blob with the response body data. - response->blob_size = entry->GetDataSize(INDEX_RESPONSE_BODY); - response->blob_uuid = base::GenerateGUID(); + response->blob = blink::mojom::SerializedBlob::New(); + response->blob->size = entry->GetDataSize(INDEX_RESPONSE_BODY); + response->blob->uuid = base::GenerateGUID(); auto blob_data = - std::make_unique<storage::BlobDataBuilder>(response->blob_uuid); + std::make_unique<storage::BlobDataBuilder>(response->blob->uuid); disk_cache::Entry* temp_entry = entry.get(); auto data_handle = base::MakeRefCounted<BlobDataHandle>(CreateCacheHandle(), @@ -1855,10 +1879,8 @@ auto blob_handle = blob_storage_context_->AddFinishedBlob(std::move(blob_data)); - blink::mojom::BlobPtr blob_ptr; - storage::BlobImpl::Create(std::move(blob_handle), MakeRequest(&blob_ptr)); - response->blob = - base::MakeRefCounted<storage::BlobHandle>(std::move(blob_ptr)); + storage::BlobImpl::Create(std::move(blob_handle), + MakeRequest(&response->blob->blob)); } CacheStorageCacheHandle CacheStorageCache::CreateCacheHandle() {
diff --git a/content/browser/cache_storage/cache_storage_cache.h b/content/browser/cache_storage/cache_storage_cache.h index f065161..16b89bc 100644 --- a/content/browser/cache_storage/cache_storage_cache.h +++ b/content/browser/cache_storage/cache_storage_cache.h
@@ -66,10 +66,10 @@ using BadMessageCallback = base::OnceCallback<void()>; using ResponseCallback = base::OnceCallback<void(blink::mojom::CacheStorageError, - std::unique_ptr<ServiceWorkerResponse>)>; + blink::mojom::FetchAPIResponsePtr)>; using ResponsesCallback = base::OnceCallback<void(blink::mojom::CacheStorageError, - std::vector<ServiceWorkerResponse>)>; + std::vector<blink::mojom::FetchAPIResponsePtr>)>; using Requests = std::vector<ServiceWorkerFetchRequest>; using RequestsCallback = base::OnceCallback<void(blink::mojom::CacheStorageError, @@ -101,7 +101,7 @@ int64_t cache_padding, std::unique_ptr<crypto::SymmetricKey> cache_padding_key); static int64_t CalculateResponsePadding( - const ServiceWorkerResponse& response, + const blink::mojom::FetchAPIResponse& response, const crypto::SymmetricKey* padding_key, int side_data_size); static int32_t GetResponsePaddingVersion(); @@ -187,7 +187,7 @@ // by non-CacheAPI owners. The Cache Storage API uses batch operations defined // in the dispatcher. void Put(std::unique_ptr<ServiceWorkerFetchRequest> request, - std::unique_ptr<ServiceWorkerResponse> response, + blink::mojom::FetchAPIResponsePtr response, ErrorCallback callback); // Async operations in progress will cancel and not run their callbacks. @@ -288,14 +288,17 @@ std::unique_ptr<proto::CacheMetadata> metadata); static bool QueryCacheResultCompare(const QueryCacheResult& lhs, const QueryCacheResult& rhs); + static size_t EstimatedResponseSizeWithoutBlob( + const blink::mojom::FetchAPIResponse& response); // Match callbacks void MatchImpl(std::unique_ptr<ServiceWorkerFetchRequest> request, blink::mojom::QueryParamsPtr match_params, ResponseCallback callback); - void MatchDidMatchAll(ResponseCallback callback, - blink::mojom::CacheStorageError match_all_error, - std::vector<ServiceWorkerResponse> match_all_responses); + void MatchDidMatchAll( + ResponseCallback callback, + blink::mojom::CacheStorageError match_all_error, + std::vector<blink::mojom::FetchAPIResponsePtr> match_all_responses); // MatchAll callbacks void MatchAllImpl(std::unique_ptr<ServiceWorkerFetchRequest> request, @@ -443,7 +446,7 @@ void DeleteBackendCompletedIO(); void PopulateResponseBody(disk_cache::ScopedEntryPtr entry, - ServiceWorkerResponse* response); + blink::mojom::FetchAPIResponse* response); // Virtual for testing. virtual CacheStorageCacheHandle CreateCacheHandle();
diff --git a/content/browser/cache_storage/cache_storage_cache_unittest.cc b/content/browser/cache_storage/cache_storage_cache_unittest.cc index d20905a..4a2b0f49 100644 --- a/content/browser/cache_storage/cache_storage_cache_unittest.cc +++ b/content/browser/cache_storage/cache_storage_cache_unittest.cc
@@ -61,6 +61,10 @@ const char kTestData[] = "Hello World"; const char kOrigin[] = "http://example.com"; const char kCacheName[] = "test_cache"; +const GURL kBodyUrl("http://example.com/body.html"); +const GURL kBodyUrlWithQuery("http://example.com/body.html?query=test"); +const GURL kNoBodyUrl("http://example.com/no_body.html"); +const ServiceWorkerHeaderMap kHeaders({{"a", "a"}, {"b", "b"}}); // Returns a BlobProtocolHandler that uses |blob_storage_context|. Caller owns // the memory. @@ -70,6 +74,16 @@ new storage::BlobProtocolHandler(blob_storage_context)); } +void SizeCallback(base::RunLoop* run_loop, + bool* callback_called, + int64_t* out_size, + int64_t size) { + *callback_called = true; + *out_size = size; + if (run_loop) + run_loop->Quit(); +} + // A disk_cache::Backend wrapper that can delay operations. class DelayableBackend : public disk_cache::Backend { public: @@ -204,8 +218,8 @@ return output; } -bool ResponseMetadataEqual(const ServiceWorkerResponse& expected, - const ServiceWorkerResponse& actual) { +bool ResponseMetadataEqual(const blink::mojom::FetchAPIResponse& expected, + const blink::mojom::FetchAPIResponse& actual) { EXPECT_EQ(expected.status_code, actual.status_code); if (expected.status_code != actual.status_code) return false; @@ -220,18 +234,20 @@ if (expected.url_list[i] != actual.url_list[i]) return false; } - EXPECT_EQ(expected.blob_size, actual.blob_size); - if (expected.blob_size != actual.blob_size) + EXPECT_EQ(!expected.blob, !actual.blob); + if (!expected.blob != !actual.blob) return false; - if (expected.blob_size == 0) { - EXPECT_STREQ("", actual.blob_uuid.c_str()); - if (!actual.blob_uuid.empty()) - return false; - } else { - EXPECT_STRNE("", actual.blob_uuid.c_str()); - if (actual.blob_uuid.empty()) - return false; + if (expected.blob) { + if (expected.blob->size == 0) { + EXPECT_STREQ("", actual.blob->uuid.c_str()); + if (!actual.blob->uuid.empty()) + return false; + } else { + EXPECT_STRNE("", actual.blob->uuid.c_str()); + if (actual.blob->uuid.empty()) + return false; + } } EXPECT_EQ(expected.response_time, actual.response_time); @@ -262,11 +278,11 @@ return expected_side_data == actual_body; } -ServiceWorkerResponse SetCacheName(const ServiceWorkerResponse& original) { - ServiceWorkerResponse result(original); - result.is_in_cache_storage = true; - result.cache_storage_cache_name = kCacheName; - return result; +blink::mojom::FetchAPIResponsePtr SetCacheName( + blink::mojom::FetchAPIResponsePtr response) { + response->is_in_cache_storage = true; + response->cache_storage_cache_name = kCacheName; + return response; } std::unique_ptr<crypto::SymmetricKey> CreateTestPaddingKey() { @@ -386,6 +402,14 @@ CreateRequests(blob_storage_context); + response_time_ = base::Time::Now(); + for (int i = 0; i < 100; ++i) + expected_blob_data_ += kTestData; + blob_handle_ = BuildBlobHandle("blob-id:myblob", expected_blob_data_); + storage::BlobImpl::Create( + std::make_unique<storage::BlobDataHandle>(*blob_handle_), + MakeRequest(&blob_ptr_)); + cache_ = std::make_unique<TestCacheStorageCache>( url::Origin::Create(GURL(kOrigin)), kCacheName, temp_dir_path, nullptr /* CacheStorage */, @@ -402,71 +426,46 @@ } void CreateRequests(ChromeBlobStorageContext* blob_storage_context) { - ServiceWorkerHeaderMap headers; - headers.insert(std::make_pair("a", "a")); - headers.insert(std::make_pair("b", "b")); body_request_ = - ServiceWorkerFetchRequest(GURL("http://example.com/body.html"), "GET", - headers, Referrer(), false); + ServiceWorkerFetchRequest(kBodyUrl, "GET", kHeaders, Referrer(), false); body_request_with_query_ = ServiceWorkerFetchRequest( - GURL("http://example.com/body.html?query=test"), "GET", headers, - Referrer(), false); - no_body_request_ = - ServiceWorkerFetchRequest(GURL("http://example.com/no_body.html"), - "GET", headers, Referrer(), false); - body_head_request_ = - ServiceWorkerFetchRequest(GURL("http://example.com/body.html"), "HEAD", - headers, Referrer(), false); - - std::string expected_response; - for (int i = 0; i < 100; ++i) - expected_blob_data_ += kTestData; - - blob_handle_ = BuildBlobHandle("blob-id:myblob", expected_blob_data_); - - scoped_refptr<storage::BlobHandle> blob; - blink::mojom::BlobPtr blob_ptr; - storage::BlobImpl::Create( - std::make_unique<storage::BlobDataHandle>(*blob_handle_), - MakeRequest(&blob_ptr)); - blob = base::MakeRefCounted<storage::BlobHandle>(std::move(blob_ptr)); - - body_response_ = CreateResponse( - "http://example.com/body.html", - std::make_unique<ServiceWorkerHeaderMap>(headers), blob_handle_->uuid(), - expected_blob_data_.size(), blob, - std::make_unique< - ServiceWorkerHeaderList>() /* cors_exposed_header_names */); - - body_response_with_query_ = - CreateResponse("http://example.com/body.html?query=test", - std::make_unique<ServiceWorkerHeaderMap>(headers), - blob_handle_->uuid(), expected_blob_data_.size(), blob, - std::make_unique<ServiceWorkerHeaderList>( - 1, "a") /* cors_exposed_header_names */); - - no_body_response_ = CreateResponse( - "http://example.com/no_body.html", - std::make_unique<ServiceWorkerHeaderMap>(headers), "", 0, nullptr, - std::make_unique< - ServiceWorkerHeaderList>() /* cors_exposed_header_names */); + kBodyUrlWithQuery, "GET", kHeaders, Referrer(), false); + no_body_request_ = ServiceWorkerFetchRequest(kNoBodyUrl, "GET", kHeaders, + Referrer(), false); + body_head_request_ = ServiceWorkerFetchRequest(kBodyUrl, "HEAD", kHeaders, + Referrer(), false); } - static ServiceWorkerResponse CreateResponse( - const std::string& url, - std::unique_ptr<ServiceWorkerHeaderMap> headers, - const std::string& blob_uuid, - uint64_t blob_size, - scoped_refptr<storage::BlobHandle> blob_handle, - std::unique_ptr<ServiceWorkerHeaderList> cors_exposed_header_names) { - return ServiceWorkerResponse( - std::make_unique<std::vector<GURL>>(1, GURL(url)), 200, "OK", - network::mojom::FetchResponseType::kDefault, std::move(headers), - blob_uuid, blob_size, std::move(blob_handle), - blink::mojom::ServiceWorkerResponseError::kUnknown, base::Time::Now(), - false /* is_in_cache_storage */, - std::string() /* cache_storage_cache_name */, - std::move(cors_exposed_header_names)); + blink::mojom::FetchAPIResponsePtr CreateBlobBodyResponse() { + auto blob = blink::mojom::SerializedBlob::New(); + blob->uuid = blob_handle_->uuid(); + blob->size = expected_blob_data_.size(); + // Use cloned blob pointer for all responses with blob body. + blob_ptr_->Clone(mojo::MakeRequest(&blob->blob)); + + blink::mojom::FetchAPIResponsePtr response = CreateNoBodyResponse(); + response->url_list = {kBodyUrl}; + response->blob = std::move(blob); + return response; + } + + blink::mojom::FetchAPIResponsePtr CreateBlobBodyResponseWithQuery() { + blink::mojom::FetchAPIResponsePtr response = CreateBlobBodyResponse(); + response->url_list = {kBodyUrlWithQuery}; + response->cors_exposed_header_names = {"a"}; + return response; + } + + blink::mojom::FetchAPIResponsePtr CreateNoBodyResponse() { + return blink::mojom::FetchAPIResponse::New( + std::vector<GURL>({kNoBodyUrl}), 200, "OK", + network::mojom::FetchResponseType::kDefault, + base::flat_map<std::string, std::string>(kHeaders.cbegin(), + kHeaders.cend()), + nullptr /* blob */, blink::mojom::ServiceWorkerResponseError::kUnknown, + response_time_, std::string() /* cache_storage_cache_name */, + std::vector<std::string>() /* cors_exposed_header_names */, + false /* is_in_cache_storage */, nullptr /* side_data_blob */); } std::unique_ptr<storage::BlobDataHandle> BuildBlobHandle( @@ -479,15 +478,13 @@ } void CopySideDataToResponse(storage::BlobDataHandle* side_data_blob_handle, - ServiceWorkerResponse* response) { - response->side_data_blob_uuid = side_data_blob_handle->uuid(); - response->side_data_blob_size = side_data_blob_handle->size(); - blink::mojom::BlobPtr blob_ptr; + blink::mojom::FetchAPIResponse* response) { + response->side_data_blob = blink::mojom::SerializedBlob::New(); + response->side_data_blob->uuid = side_data_blob_handle->uuid(); + response->side_data_blob->size = side_data_blob_handle->size(); storage::BlobImpl::Create( std::make_unique<storage::BlobDataHandle>(*side_data_blob_handle), - MakeRequest(&blob_ptr)); - response->side_data_blob = - base::MakeRefCounted<storage::BlobHandle>(std::move(blob_ptr)); + MakeRequest(&response->side_data_blob->blob)); } std::unique_ptr<ServiceWorkerFetchRequest> CopyFetchRequest( @@ -514,12 +511,12 @@ } bool Put(const ServiceWorkerFetchRequest& request, - const ServiceWorkerResponse& response) { + blink::mojom::FetchAPIResponsePtr response) { blink::mojom::BatchOperationPtr operation = blink::mojom::BatchOperation::New(); operation->operation_type = blink::mojom::OperationType::kPut; operation->request = request; - operation->response = response; + operation->response = std::move(response); std::vector<blink::mojom::BatchOperationPtr> operations; operations.emplace_back(std::move(operation)); @@ -542,7 +539,7 @@ bool MatchAll(const ServiceWorkerFetchRequest& request, blink::mojom::QueryParamsPtr match_params, - std::vector<ServiceWorkerResponse>* responses) { + std::vector<blink::mojom::FetchAPIResponsePtr>* responses) { base::RunLoop loop; cache_->MatchAll( CopyFetchRequest(request), std::move(match_params), @@ -552,7 +549,7 @@ return callback_error_ == CacheStorageError::kSuccess; } - bool MatchAll(std::vector<ServiceWorkerResponse>* responses) { + bool MatchAll(std::vector<blink::mojom::FetchAPIResponsePtr>* responses) { return MatchAll(ServiceWorkerFetchRequest(), nullptr, responses); } @@ -615,23 +612,23 @@ base::RunLoop run_loop; bool callback_called = false; - cache_->Size(base::BindOnce(&CacheStorageCacheTest::SizeCallback, - base::Unretained(this), &run_loop, - &callback_called)); + int64_t result = 0; + cache_->Size( + base::BindOnce(&SizeCallback, &run_loop, &callback_called, &result)); run_loop.Run(); EXPECT_TRUE(callback_called); - return callback_size_; + return result; } int64_t GetSizeThenClose() { base::RunLoop run_loop; bool callback_called = false; + int64_t result = 0; cache_->GetSizeThenClose( - base::BindOnce(&CacheStorageCacheTest::SizeCallback, - base::Unretained(this), &run_loop, &callback_called)); + base::BindOnce(&SizeCallback, &run_loop, &callback_called, &result)); run_loop.Run(); EXPECT_TRUE(callback_called); - return callback_size_; + return result; } void RequestsCallback(base::RunLoop* run_loop, @@ -663,10 +660,9 @@ run_loop->Quit(); } - void ResponseAndErrorCallback( - base::RunLoop* run_loop, - CacheStorageError error, - std::unique_ptr<ServiceWorkerResponse> response) { + void ResponseAndErrorCallback(base::RunLoop* run_loop, + CacheStorageError error, + blink::mojom::FetchAPIResponsePtr response) { callback_error_ = error; callback_response_ = std::move(response); @@ -676,9 +672,9 @@ void ResponsesAndErrorCallback( base::OnceClosure quit_closure, - std::vector<ServiceWorkerResponse>* responses_out, + std::vector<blink::mojom::FetchAPIResponsePtr>* responses_out, CacheStorageError error, - std::vector<ServiceWorkerResponse> responses) { + std::vector<blink::mojom::FetchAPIResponsePtr> responses) { callback_error_ = error; *responses_out = std::move(responses); std::move(quit_closure).Run(); @@ -691,25 +687,17 @@ run_loop->Quit(); } - void SizeCallback(base::RunLoop* run_loop, - bool* callback_called, - int64_t size) { - *callback_called = true; - callback_size_ = size; - if (run_loop) - run_loop->Quit(); - } - bool TestResponseType(network::mojom::FetchResponseType response_type) { - body_response_.response_type = response_type; - EXPECT_TRUE(Put(body_request_, body_response_)); + blink::mojom::FetchAPIResponsePtr body_response = CreateBlobBodyResponse(); + body_response->response_type = response_type; + EXPECT_TRUE(Put(body_request_, std::move(body_response))); EXPECT_TRUE(Match(body_request_)); EXPECT_TRUE(Delete(body_request_)); return response_type == callback_response_->response_type; } void VerifyAllOpsFail() { - EXPECT_FALSE(Put(no_body_request_, no_body_response_)); + EXPECT_FALSE(Put(no_body_request_, CreateNoBodyResponse())); EXPECT_FALSE(Match(no_body_request_)); EXPECT_FALSE(Delete(body_request_)); EXPECT_FALSE(Keys()); @@ -721,6 +709,11 @@ cache_->max_query_size_bytes_ = max_bytes; } + size_t EstimatedResponseSizeWithoutBlob( + const blink::mojom::FetchAPIResponse& response) { + return CacheStorageCache::EstimatedResponseSizeWithoutBlob(response); + } + protected: base::ScopedTempDir temp_dir_; TestBrowserThreadBundle browser_thread_bundle_; @@ -734,21 +727,20 @@ std::unique_ptr<TestCacheStorageCache> cache_; ServiceWorkerFetchRequest body_request_; - ServiceWorkerResponse body_response_; ServiceWorkerFetchRequest body_request_with_query_; - ServiceWorkerResponse body_response_with_query_; ServiceWorkerFetchRequest no_body_request_; - ServiceWorkerResponse no_body_response_; ServiceWorkerFetchRequest body_head_request_; std::unique_ptr<storage::BlobDataHandle> blob_handle_; + // Holds a Mojo connection to the BlobImpl containing |blob_handle_|. + blink::mojom::BlobPtr blob_ptr_; + base::Time response_time_; std::string expected_blob_data_; CacheStorageError callback_error_ = CacheStorageError::kSuccess; - std::unique_ptr<ServiceWorkerResponse> callback_response_; + blink::mojom::FetchAPIResponsePtr callback_response_; std::vector<std::string> callback_strings_; std::string bad_message_reason_; bool callback_closed_ = false; - int64_t callback_size_ = 0; }; class CacheStorageCacheTestP : public CacheStorageCacheTest, @@ -758,11 +750,11 @@ }; TEST_P(CacheStorageCacheTestP, PutNoBody) { - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); } TEST_P(CacheStorageCacheTestP, PutBody) { - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); } TEST_P(CacheStorageCacheTestP, PutBody_Multiple) { @@ -771,42 +763,45 @@ operation1->operation_type = blink::mojom::OperationType::kPut; operation1->request = body_request_; operation1->request.url = GURL("http://example.com/1"); - operation1->response = body_response_; + operation1->response = CreateBlobBodyResponse(); operation1->response->url_list.push_back(GURL("http://example.com/1")); + ServiceWorkerFetchRequest request1 = operation1->request; blink::mojom::BatchOperationPtr operation2 = blink::mojom::BatchOperation::New(); operation2->operation_type = blink::mojom::OperationType::kPut; operation2->request = body_request_; operation2->request.url = GURL("http://example.com/2"); - operation2->response = body_response_; + operation2->response = CreateBlobBodyResponse(); operation2->response->url_list.push_back(GURL("http://example.com/2")); + ServiceWorkerFetchRequest request2 = operation2->request; blink::mojom::BatchOperationPtr operation3 = blink::mojom::BatchOperation::New(); operation3->operation_type = blink::mojom::OperationType::kPut; operation3->request = body_request_; operation3->request.url = GURL("http://example.com/3"); - operation3->response = body_response_; + operation3->response = CreateBlobBodyResponse(); operation3->response->url_list.push_back(GURL("http://example.com/3")); + ServiceWorkerFetchRequest request3 = operation3->request; std::vector<blink::mojom::BatchOperationPtr> operations; - operations.push_back(operation1->Clone()); - operations.push_back(operation2->Clone()); - operations.push_back(operation3->Clone()); + operations.push_back(std::move(operation1)); + operations.push_back(std::move(operation2)); + operations.push_back(std::move(operation3)); EXPECT_EQ(CacheStorageError::kSuccess, BatchOperation(std::move(operations))); - EXPECT_TRUE(Match(operation1->request)); - EXPECT_TRUE(Match(operation2->request)); - EXPECT_TRUE(Match(operation3->request)); + EXPECT_TRUE(Match(request1)); + EXPECT_TRUE(Match(request2)); + EXPECT_TRUE(Match(request3)); } TEST_P(CacheStorageCacheTestP, MatchLimit) { - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); EXPECT_TRUE(Match(no_body_request_)); size_t max_size = no_body_request_.EstimatedStructSize() + - callback_response_->EstimatedStructSize(); + EstimatedResponseSizeWithoutBlob(*callback_response_); SetMaxQuerySizeBytes(max_size); EXPECT_TRUE(Match(no_body_request_)); @@ -816,16 +811,18 @@ } TEST_P(CacheStorageCacheTestP, MatchAllLimit) { - EXPECT_TRUE(Put(body_request_, no_body_response_)); - EXPECT_TRUE(Put(body_request_with_query_, no_body_response_)); + EXPECT_TRUE(Put(body_request_, CreateNoBodyResponse())); + EXPECT_TRUE(Put(body_request_with_query_, CreateNoBodyResponse())); EXPECT_TRUE(Match(body_request_)); - size_t body_request_size = body_request_.EstimatedStructSize() + - callback_response_->EstimatedStructSize(); - size_t query_request_size = body_request_with_query_.EstimatedStructSize() + - callback_response_->EstimatedStructSize(); + size_t body_request_size = + body_request_.EstimatedStructSize() + + EstimatedResponseSizeWithoutBlob(*callback_response_); + size_t query_request_size = + body_request_with_query_.EstimatedStructSize() + + EstimatedResponseSizeWithoutBlob(*callback_response_); - std::vector<ServiceWorkerResponse> responses; + std::vector<blink::mojom::FetchAPIResponsePtr> responses; blink::mojom::QueryParamsPtr match_params = blink::mojom::QueryParams::New(); // There is enough room for both requests and responses @@ -849,8 +846,8 @@ } TEST_P(CacheStorageCacheTestP, KeysLimit) { - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); size_t max_size = no_body_request_.EstimatedStructSize() + body_request_.EstimatedStructSize(); @@ -868,11 +865,12 @@ // browser side (http://crbug.com/425505). TEST_P(CacheStorageCacheTestP, ResponseURLDiffersFromRequestURL) { - no_body_response_.url_list.clear(); - no_body_response_.url_list.push_back(GURL("http://example.com/foobar")); + blink::mojom::FetchAPIResponsePtr no_body_response = CreateNoBodyResponse(); + no_body_response->url_list.clear(); + no_body_response->url_list.push_back(GURL("http://example.com/foobar")); EXPECT_STRNE("http://example.com/foobar", no_body_request_.url.spec().c_str()); - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); + EXPECT_TRUE(Put(no_body_request_, std::move(no_body_response))); EXPECT_TRUE(Match(no_body_request_)); ASSERT_EQ(1u, callback_response_->url_list.size()); EXPECT_STREQ("http://example.com/foobar", @@ -880,9 +878,10 @@ } TEST_P(CacheStorageCacheTestP, ResponseURLEmpty) { - no_body_response_.url_list.clear(); + blink::mojom::FetchAPIResponsePtr no_body_response = CreateNoBodyResponse(); + no_body_response->url_list.clear(); EXPECT_STRNE("", no_body_request_.url.spec().c_str()); - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); + EXPECT_TRUE(Put(no_body_request_, std::move(no_body_response))); EXPECT_TRUE(Match(no_body_request_)); EXPECT_EQ(0u, callback_response_->url_list.size()); } @@ -892,7 +891,7 @@ blink::mojom::BatchOperation::New(); operation->operation_type = blink::mojom::OperationType::kPut; operation->request = body_request_; - operation->response = body_response_; + operation->response = CreateBlobBodyResponse(); std::vector<blink::mojom::BatchOperationPtr> operations; operations.emplace_back(std::move(operation)); @@ -911,16 +910,20 @@ } TEST_P(CacheStorageCacheTestP, PutBadMessage) { - blink::mojom::BatchOperationPtr operation = - blink::mojom::BatchOperation::New(); - operation->operation_type = blink::mojom::OperationType::kPut; - operation->request = body_request_; - operation->response = body_response_; - operation->response->blob_size = UINT64_MAX; + blink::mojom::BatchOperationPtr operation1 = + blink::mojom::BatchOperation::New(blink::mojom::OperationType::kPut, + body_request_, CreateBlobBodyResponse(), + nullptr /* match_params */); + operation1->response->blob->size = std::numeric_limits<uint64_t>::max(); + blink::mojom::BatchOperationPtr operation2 = + blink::mojom::BatchOperation::New(blink::mojom::OperationType::kPut, + body_request_, CreateBlobBodyResponse(), + nullptr /* match_params */); + operation2->response->blob->size = std::numeric_limits<uint64_t>::max(); std::vector<blink::mojom::BatchOperationPtr> operations; - operations.push_back(operation->Clone()); - operations.push_back(operation->Clone()); + operations.push_back(std::move(operation1)); + operations.push_back(std::move(operation2)); EXPECT_EQ(CacheStorageError::kErrorStorage, BatchOperation(std::move(operations))); EXPECT_EQ("CSDH_UNEXPECTED_OPERATION", bad_message_reason_); @@ -929,15 +932,15 @@ } TEST_P(CacheStorageCacheTestP, PutReplace) { - EXPECT_TRUE(Put(body_request_, no_body_response_)); + EXPECT_TRUE(Put(body_request_, CreateNoBodyResponse())); EXPECT_TRUE(Match(body_request_)); EXPECT_FALSE(callback_response_->blob); - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); EXPECT_TRUE(Match(body_request_)); EXPECT_TRUE(callback_response_->blob); - EXPECT_TRUE(Put(body_request_, no_body_response_)); + EXPECT_TRUE(Put(body_request_, CreateNoBodyResponse())); EXPECT_TRUE(Match(body_request_)); EXPECT_FALSE(callback_response_->blob); } @@ -947,94 +950,94 @@ blink::mojom::BatchOperation::New(); operation1->operation_type = blink::mojom::OperationType::kPut; operation1->request = body_request_; - operation1->response = no_body_response_; + operation1->response = CreateNoBodyResponse(); blink::mojom::BatchOperationPtr operation2 = blink::mojom::BatchOperation::New(); operation2->operation_type = blink::mojom::OperationType::kPut; operation2->request = body_request_; - operation2->response = body_response_; + operation2->response = CreateBlobBodyResponse(); std::vector<blink::mojom::BatchOperationPtr> operations; - operations.push_back(operation1->Clone()); - operations.push_back(operation2->Clone()); + operations.push_back(std::move(operation1)); + operations.push_back(std::move(operation2)); EXPECT_EQ(CacheStorageError::kSuccess, BatchOperation(std::move(operations))); // |operation2| should win. - EXPECT_TRUE(Match(operation2->request)); + EXPECT_TRUE(Match(body_request_)); EXPECT_TRUE(callback_response_->blob); } TEST_P(CacheStorageCacheTestP, MatchNoBody) { - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); EXPECT_TRUE(Match(no_body_request_)); - EXPECT_TRUE(ResponseMetadataEqual(SetCacheName(no_body_response_), + EXPECT_TRUE(ResponseMetadataEqual(*SetCacheName(CreateNoBodyResponse()), *callback_response_)); EXPECT_FALSE(callback_response_->blob); } TEST_P(CacheStorageCacheTestP, MatchBody) { - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); EXPECT_TRUE(Match(body_request_)); - EXPECT_TRUE( - ResponseMetadataEqual(SetCacheName(body_response_), *callback_response_)); - EXPECT_TRUE(ResponseBodiesEqual(expected_blob_data_, - callback_response_->blob->get())); + EXPECT_TRUE(ResponseMetadataEqual(*SetCacheName(CreateBlobBodyResponse()), + *callback_response_)); + blink::mojom::BlobPtr blob(std::move(callback_response_->blob->blob)); + EXPECT_TRUE(ResponseBodiesEqual(expected_blob_data_, blob.get())); } TEST_P(CacheStorageCacheTestP, MatchBodyHead) { - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); EXPECT_FALSE(Match(body_head_request_)); } TEST_P(CacheStorageCacheTestP, MatchAll_Empty) { - std::vector<ServiceWorkerResponse> responses; + std::vector<blink::mojom::FetchAPIResponsePtr> responses; EXPECT_TRUE(MatchAll(&responses)); EXPECT_TRUE(responses.empty()); } TEST_P(CacheStorageCacheTestP, MatchAll_NoBody) { - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); - std::vector<ServiceWorkerResponse> responses; + std::vector<blink::mojom::FetchAPIResponsePtr> responses; EXPECT_TRUE(MatchAll(&responses)); ASSERT_EQ(1u, responses.size()); - EXPECT_TRUE( - ResponseMetadataEqual(SetCacheName(no_body_response_), responses[0])); - EXPECT_FALSE(responses[0].blob); + EXPECT_TRUE(ResponseMetadataEqual(*SetCacheName(CreateNoBodyResponse()), + *responses[0])); + EXPECT_FALSE(responses[0]->blob); } TEST_P(CacheStorageCacheTestP, MatchAll_Body) { - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); - std::vector<ServiceWorkerResponse> responses; + std::vector<blink::mojom::FetchAPIResponsePtr> responses; EXPECT_TRUE(MatchAll(&responses)); ASSERT_EQ(1u, responses.size()); - EXPECT_TRUE( - ResponseMetadataEqual(SetCacheName(body_response_), responses[0])); - EXPECT_TRUE( - ResponseBodiesEqual(expected_blob_data_, responses[0].blob->get())); + EXPECT_TRUE(ResponseMetadataEqual(*SetCacheName(CreateBlobBodyResponse()), + *responses[0])); + blink::mojom::BlobPtr blob(std::move(responses[0]->blob->blob)); + EXPECT_TRUE(ResponseBodiesEqual(expected_blob_data_, blob.get())); } TEST_P(CacheStorageCacheTestP, MatchAll_TwoResponsesThenOne) { - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); - std::vector<ServiceWorkerResponse> responses; + std::vector<blink::mojom::FetchAPIResponsePtr> responses; EXPECT_TRUE(MatchAll(&responses)); ASSERT_EQ(2u, responses.size()); - EXPECT_TRUE(responses[1].blob); + EXPECT_TRUE(responses[1]->blob); - EXPECT_TRUE( - ResponseMetadataEqual(SetCacheName(no_body_response_), responses[0])); - EXPECT_FALSE(responses[0].blob); - EXPECT_TRUE( - ResponseMetadataEqual(SetCacheName(body_response_), responses[1])); - EXPECT_TRUE( - ResponseBodiesEqual(expected_blob_data_, responses[1].blob->get())); + EXPECT_TRUE(ResponseMetadataEqual(*SetCacheName(CreateNoBodyResponse()), + *responses[0])); + EXPECT_FALSE(responses[0]->blob); + EXPECT_TRUE(ResponseMetadataEqual(*SetCacheName(CreateBlobBodyResponse()), + *responses[1])); + blink::mojom::BlobPtr blob(std::move(responses[1]->blob->blob)); + EXPECT_TRUE(ResponseBodiesEqual(expected_blob_data_, blob.get())); responses.clear(); @@ -1042,13 +1045,13 @@ EXPECT_TRUE(MatchAll(&responses)); ASSERT_EQ(1u, responses.size()); - EXPECT_TRUE( - ResponseMetadataEqual(SetCacheName(no_body_response_), responses[0])); - EXPECT_FALSE(responses[0].blob); + EXPECT_TRUE(ResponseMetadataEqual(*SetCacheName(CreateNoBodyResponse()), + *responses[0])); + EXPECT_FALSE(responses[0]->blob); } TEST_P(CacheStorageCacheTestP, Match_IgnoreSearch) { - EXPECT_TRUE(Put(body_request_with_query_, body_response_with_query_)); + EXPECT_TRUE(Put(body_request_with_query_, CreateBlobBodyResponseWithQuery())); EXPECT_FALSE(Match(body_request_)); blink::mojom::QueryParamsPtr match_params = blink::mojom::QueryParams::New(); @@ -1057,7 +1060,7 @@ } TEST_P(CacheStorageCacheTestP, Match_IgnoreMethod) { - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); ServiceWorkerFetchRequest post_request = body_request_; post_request.method = "POST"; @@ -1070,8 +1073,9 @@ TEST_P(CacheStorageCacheTestP, Match_IgnoreVary) { body_request_.headers["vary_foo"] = "foo"; - body_response_.headers["vary"] = "vary_foo"; - EXPECT_TRUE(Put(body_request_, body_response_)); + blink::mojom::FetchAPIResponsePtr body_response = CreateBlobBodyResponse(); + body_response->headers["vary"] = "vary_foo"; + EXPECT_TRUE(Put(body_request_, std::move(body_response))); EXPECT_TRUE(Match(body_request_)); body_request_.headers["vary_foo"] = "bar"; @@ -1083,7 +1087,7 @@ } TEST_P(CacheStorageCacheTestP, Keys_IgnoreSearch) { - EXPECT_TRUE(Put(body_request_with_query_, body_response_with_query_)); + EXPECT_TRUE(Put(body_request_with_query_, CreateBlobBodyResponseWithQuery())); EXPECT_TRUE(Keys(body_request_)); EXPECT_EQ(0u, callback_strings_.size()); @@ -1095,7 +1099,7 @@ } TEST_P(CacheStorageCacheTestP, Keys_IgnoreMethod) { - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); ServiceWorkerFetchRequest post_request = body_request_; post_request.method = "POST"; @@ -1110,8 +1114,9 @@ TEST_P(CacheStorageCacheTestP, Keys_IgnoreVary) { body_request_.headers["vary_foo"] = "foo"; - body_response_.headers["vary"] = "vary_foo"; - EXPECT_TRUE(Put(body_request_, body_response_)); + blink::mojom::FetchAPIResponsePtr body_response = CreateBlobBodyResponse(); + body_response->headers["vary"] = "vary_foo"; + EXPECT_TRUE(Put(body_request_, std::move(body_response))); EXPECT_TRUE(Keys(body_request_)); EXPECT_EQ(1u, callback_strings_.size()); @@ -1126,7 +1131,7 @@ } TEST_P(CacheStorageCacheTestP, Delete_IgnoreSearch) { - EXPECT_TRUE(Put(body_request_with_query_, body_response_with_query_)); + EXPECT_TRUE(Put(body_request_with_query_, CreateBlobBodyResponseWithQuery())); EXPECT_FALSE(Delete(body_request_)); blink::mojom::QueryParamsPtr match_params = blink::mojom::QueryParams::New(); @@ -1135,7 +1140,7 @@ } TEST_P(CacheStorageCacheTestP, Delete_IgnoreMethod) { - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); ServiceWorkerFetchRequest post_request = body_request_; post_request.method = "POST"; @@ -1148,8 +1153,9 @@ TEST_P(CacheStorageCacheTestP, Delete_IgnoreVary) { body_request_.headers["vary_foo"] = "foo"; - body_response_.headers["vary"] = "vary_foo"; - EXPECT_TRUE(Put(body_request_, body_response_)); + blink::mojom::FetchAPIResponsePtr body_response = CreateBlobBodyResponse(); + body_response->headers["vary"] = "vary_foo"; + EXPECT_TRUE(Put(body_request_, std::move(body_response))); body_request_.headers["vary_foo"] = "bar"; EXPECT_FALSE(Delete(body_request_)); @@ -1160,11 +1166,11 @@ } TEST_P(CacheStorageCacheTestP, MatchAll_IgnoreMethod) { - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); ServiceWorkerFetchRequest post_request = body_request_; post_request.method = "POST"; - std::vector<ServiceWorkerResponse> responses; + std::vector<blink::mojom::FetchAPIResponsePtr> responses; EXPECT_TRUE(MatchAll(post_request, nullptr, &responses)); EXPECT_EQ(0u, responses.size()); @@ -1177,9 +1183,10 @@ TEST_P(CacheStorageCacheTestP, MatchAll_IgnoreVary) { body_request_.headers["vary_foo"] = "foo"; - body_response_.headers["vary"] = "vary_foo"; - EXPECT_TRUE(Put(body_request_, body_response_)); - std::vector<ServiceWorkerResponse> responses; + blink::mojom::FetchAPIResponsePtr body_response = CreateBlobBodyResponse(); + body_response->headers["vary"] = "vary_foo"; + EXPECT_TRUE(Put(body_request_, std::move(body_response))); + std::vector<blink::mojom::FetchAPIResponsePtr> responses; EXPECT_TRUE(MatchAll(body_request_, nullptr, &responses)); EXPECT_EQ(1u, responses.size()); @@ -1195,11 +1202,11 @@ } TEST_P(CacheStorageCacheTestP, MatchAll_IgnoreSearch) { - EXPECT_TRUE(Put(body_request_, body_response_)); - EXPECT_TRUE(Put(body_request_with_query_, body_response_with_query_)); - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); + EXPECT_TRUE(Put(body_request_with_query_, CreateBlobBodyResponseWithQuery())); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); - std::vector<ServiceWorkerResponse> responses; + std::vector<blink::mojom::FetchAPIResponsePtr> responses; blink::mojom::QueryParamsPtr match_params = blink::mojom::QueryParams::New(); match_params->ignore_search = true; EXPECT_TRUE(MatchAll(body_request_, std::move(match_params), &responses)); @@ -1208,26 +1215,25 @@ // Order of returned responses is not guaranteed. std::set<std::string> matched_set; - for (const ServiceWorkerResponse& response : responses) { - ASSERT_EQ(1u, response.url_list.size()); - if (response.url_list[0].spec() == - "http://example.com/body.html?query=test") { - EXPECT_TRUE(ResponseMetadataEqual(SetCacheName(body_response_with_query_), - response)); - matched_set.insert(response.url_list[0].spec()); - } else if (response.url_list[0].spec() == "http://example.com/body.html") { - EXPECT_TRUE( - ResponseMetadataEqual(SetCacheName(body_response_), response)); - matched_set.insert(response.url_list[0].spec()); + for (const blink::mojom::FetchAPIResponsePtr& response : responses) { + ASSERT_EQ(1u, response->url_list.size()); + if (response->url_list[0].spec() == kBodyUrlWithQuery.spec()) { + EXPECT_TRUE(ResponseMetadataEqual( + *SetCacheName(CreateBlobBodyResponseWithQuery()), *response)); + matched_set.insert(response->url_list[0].spec()); + } else if (response->url_list[0].spec() == kBodyUrl.spec()) { + EXPECT_TRUE(ResponseMetadataEqual(*SetCacheName(CreateBlobBodyResponse()), + *response)); + matched_set.insert(response->url_list[0].spec()); } } EXPECT_EQ(2u, matched_set.size()); } TEST_P(CacheStorageCacheTestP, MatchAll_Head) { - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); - std::vector<ServiceWorkerResponse> responses; + std::vector<blink::mojom::FetchAPIResponsePtr> responses; blink::mojom::QueryParamsPtr match_params = blink::mojom::QueryParams::New(); match_params->ignore_search = true; EXPECT_TRUE(MatchAll(body_head_request_, match_params->Clone(), &responses)); @@ -1236,16 +1242,17 @@ match_params->ignore_method = true; EXPECT_TRUE(MatchAll(body_head_request_, match_params->Clone(), &responses)); ASSERT_EQ(1u, responses.size()); - EXPECT_TRUE( - ResponseMetadataEqual(SetCacheName(body_response_), responses[0])); - EXPECT_TRUE( - ResponseBodiesEqual(expected_blob_data_, responses[0].blob->get())); + EXPECT_TRUE(ResponseMetadataEqual(*SetCacheName(CreateBlobBodyResponse()), + *responses[0])); + blink::mojom::BlobPtr blob(std::move(responses[0]->blob->blob)); + EXPECT_TRUE(ResponseBodiesEqual(expected_blob_data_, blob.get())); } TEST_P(CacheStorageCacheTestP, Vary) { body_request_.headers["vary_foo"] = "foo"; - body_response_.headers["vary"] = "vary_foo"; - EXPECT_TRUE(Put(body_request_, body_response_)); + blink::mojom::FetchAPIResponsePtr body_response = CreateBlobBodyResponse(); + body_response->headers["vary"] = "vary_foo"; + EXPECT_TRUE(Put(body_request_, std::move(body_response))); EXPECT_TRUE(Match(body_request_)); body_request_.headers["vary_foo"] = "bar"; @@ -1256,8 +1263,9 @@ } TEST_P(CacheStorageCacheTestP, EmptyVary) { - body_response_.headers["vary"] = ""; - EXPECT_TRUE(Put(body_request_, body_response_)); + blink::mojom::FetchAPIResponsePtr body_response = CreateBlobBodyResponse(); + body_response->headers["vary"] = ""; + EXPECT_TRUE(Put(body_request_, std::move(body_response))); EXPECT_TRUE(Match(body_request_)); body_request_.headers["zoo"] = "zoo"; @@ -1265,7 +1273,7 @@ } TEST_P(CacheStorageCacheTestP, NoVaryButDiffHeaders) { - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); EXPECT_TRUE(Match(body_request_)); body_request_.headers["zoo"] = "zoo"; @@ -1275,8 +1283,9 @@ TEST_P(CacheStorageCacheTestP, VaryMultiple) { body_request_.headers["vary_foo"] = "foo"; body_request_.headers["vary_bar"] = "bar"; - body_response_.headers["vary"] = " vary_foo , vary_bar"; - EXPECT_TRUE(Put(body_request_, body_response_)); + blink::mojom::FetchAPIResponsePtr body_response = CreateBlobBodyResponse(); + body_response->headers["vary"] = " vary_foo , vary_bar"; + EXPECT_TRUE(Put(body_request_, std::move(body_response))); EXPECT_TRUE(Match(body_request_)); body_request_.headers["vary_bar"] = "foo"; @@ -1288,8 +1297,9 @@ TEST_P(CacheStorageCacheTestP, VaryNewHeader) { body_request_.headers["vary_foo"] = "foo"; - body_response_.headers["vary"] = " vary_foo, vary_bar"; - EXPECT_TRUE(Put(body_request_, body_response_)); + blink::mojom::FetchAPIResponsePtr body_response = CreateBlobBodyResponse(); + body_response->headers["vary"] = " vary_foo, vary_bar"; + EXPECT_TRUE(Put(body_request_, std::move(body_response))); EXPECT_TRUE(Match(body_request_)); body_request_.headers["vary_bar"] = "bar"; @@ -1297,8 +1307,9 @@ } TEST_P(CacheStorageCacheTestP, VaryStar) { - body_response_.headers["vary"] = "*"; - EXPECT_TRUE(Put(body_request_, body_response_)); + blink::mojom::FetchAPIResponsePtr body_response = CreateBlobBodyResponse(); + body_response->headers["vary"] = "*"; + EXPECT_TRUE(Put(body_request_, std::move(body_response))); EXPECT_FALSE(Match(body_request_)); } @@ -1308,8 +1319,8 @@ } TEST_P(CacheStorageCacheTestP, TwoKeys) { - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); EXPECT_TRUE(Keys()); std::vector<std::string> expected_keys{no_body_request_.url.spec(), body_request_.url.spec()}; @@ -1317,8 +1328,8 @@ } TEST_P(CacheStorageCacheTestP, TwoKeysThenOne) { - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); EXPECT_TRUE(Keys()); std::vector<std::string> expected_keys{no_body_request_.url.spec(), body_request_.url.spec()}; @@ -1331,9 +1342,9 @@ } TEST_P(CacheStorageCacheTestP, KeysWithIgnoreSearchTrue) { - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); - EXPECT_TRUE(Put(body_request_, body_response_)); - EXPECT_TRUE(Put(body_request_with_query_, body_response_with_query_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); + EXPECT_TRUE(Put(body_request_with_query_, CreateBlobBodyResponseWithQuery())); blink::mojom::QueryParamsPtr match_params = blink::mojom::QueryParams::New(); match_params->ignore_search = true; @@ -1345,9 +1356,9 @@ } TEST_P(CacheStorageCacheTestP, KeysWithIgnoreSearchFalse) { - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); - EXPECT_TRUE(Put(body_request_, body_response_)); - EXPECT_TRUE(Put(body_request_with_query_, body_response_with_query_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); + EXPECT_TRUE(Put(body_request_with_query_, CreateBlobBodyResponseWithQuery())); // Default value of ignore_search is false. blink::mojom::QueryParamsPtr match_params = blink::mojom::QueryParams::New(); @@ -1360,31 +1371,31 @@ } TEST_P(CacheStorageCacheTestP, DeleteNoBody) { - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); EXPECT_TRUE(Match(no_body_request_)); EXPECT_TRUE(Delete(no_body_request_)); EXPECT_FALSE(Match(no_body_request_)); EXPECT_FALSE(Delete(no_body_request_)); - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); EXPECT_TRUE(Match(no_body_request_)); EXPECT_TRUE(Delete(no_body_request_)); } TEST_P(CacheStorageCacheTestP, DeleteBody) { - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); EXPECT_TRUE(Match(body_request_)); EXPECT_TRUE(Delete(body_request_)); EXPECT_FALSE(Match(body_request_)); EXPECT_FALSE(Delete(body_request_)); - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); EXPECT_TRUE(Match(body_request_)); EXPECT_TRUE(Delete(body_request_)); } TEST_P(CacheStorageCacheTestP, DeleteWithIgnoreSearchTrue) { - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); - EXPECT_TRUE(Put(body_request_, body_response_)); - EXPECT_TRUE(Put(body_request_with_query_, body_response_with_query_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); + EXPECT_TRUE(Put(body_request_with_query_, CreateBlobBodyResponseWithQuery())); EXPECT_TRUE(Keys()); std::vector<std::string> expected_keys{no_body_request_.url.spec(), @@ -1405,9 +1416,9 @@ } TEST_P(CacheStorageCacheTestP, DeleteWithIgnoreSearchFalse) { - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); - EXPECT_TRUE(Put(body_request_, body_response_)); - EXPECT_TRUE(Put(body_request_with_query_, body_response_with_query_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); + EXPECT_TRUE(Put(body_request_with_query_, CreateBlobBodyResponseWithQuery())); EXPECT_TRUE(Keys()); std::vector<std::string> expected_keys{no_body_request_.url.spec(), @@ -1430,7 +1441,7 @@ TEST_P(CacheStorageCacheTestP, QuickStressNoBody) { for (int i = 0; i < 100; ++i) { EXPECT_FALSE(Match(no_body_request_)); - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); EXPECT_TRUE(Match(no_body_request_)); EXPECT_TRUE(Delete(no_body_request_)); } @@ -1439,7 +1450,7 @@ TEST_P(CacheStorageCacheTestP, QuickStressBody) { for (int i = 0; i < 100; ++i) { ASSERT_FALSE(Match(body_request_)); - ASSERT_TRUE(Put(body_request_, body_response_)); + ASSERT_TRUE(Put(body_request_, CreateBlobBodyResponse())); ASSERT_TRUE(Match(body_request_)); ASSERT_TRUE(Delete(body_request_)); } @@ -1456,36 +1467,35 @@ } TEST_P(CacheStorageCacheTestP, PutWithSideData) { - ServiceWorkerResponse response(body_response_); + blink::mojom::FetchAPIResponsePtr response = CreateBlobBodyResponse(); const std::string expected_side_data = "SideData"; std::unique_ptr<storage::BlobDataHandle> side_data_blob_handle = BuildBlobHandle("blob-id:mysideblob", expected_side_data); - CopySideDataToResponse(side_data_blob_handle.get(), &response); - EXPECT_TRUE(Put(body_request_, response)); + CopySideDataToResponse(side_data_blob_handle.get(), response.get()); + EXPECT_TRUE(Put(body_request_, std::move(response))); EXPECT_TRUE(Match(body_request_)); ASSERT_TRUE(callback_response_->blob); - EXPECT_TRUE(ResponseBodiesEqual(expected_blob_data_, - callback_response_->blob->get())); - EXPECT_TRUE(ResponseSideDataEqual(expected_side_data, - callback_response_->blob->get())); + blink::mojom::BlobPtr blob(std::move(callback_response_->blob->blob)); + EXPECT_TRUE(ResponseBodiesEqual(expected_blob_data_, blob.get())); + EXPECT_TRUE(ResponseSideDataEqual(expected_side_data, blob.get())); } TEST_P(CacheStorageCacheTestP, PutWithSideData_QuotaExceeded) { mock_quota_manager_->SetQuota(GURL(kOrigin), blink::mojom::StorageType::kTemporary, expected_blob_data_.size() - 1); - ServiceWorkerResponse response(body_response_); + blink::mojom::FetchAPIResponsePtr response = CreateBlobBodyResponse(); const std::string expected_side_data = "SideData"; std::unique_ptr<storage::BlobDataHandle> side_data_blob_handle = BuildBlobHandle("blob-id:mysideblob", expected_side_data); - CopySideDataToResponse(side_data_blob_handle.get(), &response); + CopySideDataToResponse(side_data_blob_handle.get(), response.get()); // When the available space is not enough for the body, Put operation must // fail. - EXPECT_FALSE(Put(body_request_, response)); + EXPECT_FALSE(Put(body_request_, std::move(response))); EXPECT_EQ(CacheStorageError::kErrorQuotaExceeded, callback_error_); } @@ -1493,39 +1503,39 @@ mock_quota_manager_->SetQuota(GURL(kOrigin), blink::mojom::StorageType::kTemporary, expected_blob_data_.size()); - ServiceWorkerResponse response(body_response_); + blink::mojom::FetchAPIResponsePtr response = CreateBlobBodyResponse(); const std::string expected_side_data = "SideData"; std::unique_ptr<storage::BlobDataHandle> side_data_blob_handle = BuildBlobHandle("blob-id:mysideblob", expected_side_data); - CopySideDataToResponse(side_data_blob_handle.get(), &response); + CopySideDataToResponse(side_data_blob_handle.get(), response.get()); // When the available space is enough for the body but not enough for the side // data, Put operation must succeed. - EXPECT_TRUE(Put(body_request_, response)); + EXPECT_TRUE(Put(body_request_, std::move(response))); EXPECT_TRUE(Match(body_request_)); ASSERT_TRUE(callback_response_->blob); - EXPECT_TRUE(ResponseBodiesEqual(expected_blob_data_, - callback_response_->blob->get())); + blink::mojom::BlobPtr blob(std::move(callback_response_->blob->blob)); + EXPECT_TRUE(ResponseBodiesEqual(expected_blob_data_, blob.get())); // The side data should not be written. - EXPECT_TRUE(ResponseSideDataEqual("", callback_response_->blob->get())); + EXPECT_TRUE(ResponseSideDataEqual("", blob.get())); } TEST_P(CacheStorageCacheTestP, PutWithSideData_BadMessage) { - ServiceWorkerResponse response(body_response_); + blink::mojom::FetchAPIResponsePtr response = CreateBlobBodyResponse(); const std::string expected_side_data = "SideData"; std::unique_ptr<storage::BlobDataHandle> side_data_blob_handle = BuildBlobHandle("blob-id:mysideblob", expected_side_data); - CopySideDataToResponse(side_data_blob_handle.get(), &response); + CopySideDataToResponse(side_data_blob_handle.get(), response.get()); blink::mojom::BatchOperationPtr operation = blink::mojom::BatchOperation::New(); operation->operation_type = blink::mojom::OperationType::kPut; operation->request = body_request_; - operation->response = response; - operation->response->blob_size = UINT64_MAX; + operation->response = std::move(response); + operation->response->blob->size = std::numeric_limits<uint64_t>::max(); std::vector<blink::mojom::BatchOperationPtr> operations; operations.emplace_back(std::move(operation)); @@ -1538,9 +1548,9 @@ TEST_P(CacheStorageCacheTestP, WriteSideData) { base::Time response_time(base::Time::Now()); - ServiceWorkerResponse response(body_response_); - response.response_time = response_time; - EXPECT_TRUE(Put(body_request_, response)); + blink::mojom::FetchAPIResponsePtr response = CreateBlobBodyResponse(); + response->response_time = response_time; + EXPECT_TRUE(Put(body_request_, std::move(response))); const std::string expected_side_data1 = "SideDataSample"; scoped_refptr<net::IOBuffer> buffer1( @@ -1550,10 +1560,9 @@ EXPECT_TRUE(Match(body_request_)); ASSERT_TRUE(callback_response_->blob); - EXPECT_TRUE(ResponseBodiesEqual(expected_blob_data_, - callback_response_->blob->get())); - EXPECT_TRUE(ResponseSideDataEqual(expected_side_data1, - callback_response_->blob->get())); + blink::mojom::BlobPtr blob1(std::move(callback_response_->blob->blob)); + EXPECT_TRUE(ResponseBodiesEqual(expected_blob_data_, blob1.get())); + EXPECT_TRUE(ResponseSideDataEqual(expected_side_data1, blob1.get())); const std::string expected_side_data2 = "New data"; scoped_refptr<net::IOBuffer> buffer2( @@ -1562,10 +1571,9 @@ expected_side_data2.length())); EXPECT_TRUE(Match(body_request_)); ASSERT_TRUE(callback_response_->blob); - EXPECT_TRUE(ResponseBodiesEqual(expected_blob_data_, - callback_response_->blob->get())); - EXPECT_TRUE(ResponseSideDataEqual(expected_side_data2, - callback_response_->blob->get())); + blink::mojom::BlobPtr blob2(std::move(callback_response_->blob->blob)); + EXPECT_TRUE(ResponseBodiesEqual(expected_blob_data_, blob2.get())); + EXPECT_TRUE(ResponseSideDataEqual(expected_side_data2, blob2.get())); ASSERT_TRUE(Delete(body_request_)); } @@ -1574,9 +1582,9 @@ mock_quota_manager_->SetQuota( GURL(kOrigin), blink::mojom::StorageType::kTemporary, 1024 * 1023); base::Time response_time(base::Time::Now()); - ServiceWorkerResponse response; - response.response_time = response_time; - EXPECT_TRUE(Put(no_body_request_, response)); + blink::mojom::FetchAPIResponsePtr response(CreateNoBodyResponse()); + response->response_time = response_time; + EXPECT_TRUE(Put(no_body_request_, std::move(response))); const size_t kSize = 1024 * 1024; scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); @@ -1589,10 +1597,10 @@ TEST_P(CacheStorageCacheTestP, WriteSideData_QuotaManagerModified) { base::Time response_time(base::Time::Now()); - ServiceWorkerResponse response; - response.response_time = response_time; + blink::mojom::FetchAPIResponsePtr response(CreateNoBodyResponse()); + response->response_time = response_time; EXPECT_EQ(0, quota_manager_proxy_->notify_storage_modified_count()); - EXPECT_TRUE(Put(no_body_request_, response)); + EXPECT_TRUE(Put(no_body_request_, std::move(response))); // Storage notification happens after the operation returns, so continue the // event loop. base::RunLoop().RunUntilIdle(); @@ -1610,9 +1618,9 @@ TEST_P(CacheStorageCacheTestP, WriteSideData_DifferentTimeStamp) { base::Time response_time(base::Time::Now()); - ServiceWorkerResponse response; - response.response_time = response_time; - EXPECT_TRUE(Put(no_body_request_, response)); + blink::mojom::FetchAPIResponsePtr response(CreateNoBodyResponse()); + response->response_time = response_time; + EXPECT_TRUE(Put(no_body_request_, std::move(response))); const size_t kSize = 10; scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); @@ -1633,23 +1641,6 @@ EXPECT_EQ(CacheStorageError::kErrorNotFound, callback_error_); } -TEST_F(CacheStorageCacheTest, CaselessServiceWorkerResponseHeaders) { - // CacheStorageCache depends on ServiceWorkerResponse having caseless - // headers so that it can quickly lookup vary headers. - ServiceWorkerResponse response( - std::make_unique<std::vector<GURL>>(), 200, "OK", - network::mojom::FetchResponseType::kDefault, - std::make_unique<ServiceWorkerHeaderMap>(), "", 0, nullptr /* blob */, - blink::mojom::ServiceWorkerResponseError::kUnknown, base::Time(), - false /* is_in_cache_storage */, - std::string() /* cache_storage_cache_name */, - std::make_unique< - ServiceWorkerHeaderList>() /* cors_exposed_header_names */); - response.headers["content-type"] = "foo"; - response.headers["Content-Type"] = "bar"; - EXPECT_EQ("bar", response.headers["content-type"]); -} - TEST_F(CacheStorageCacheTest, CaselessServiceWorkerFetchRequestHeaders) { // CacheStorageCache depends on ServiceWorkerFetchRequest having caseless // headers so that it can quickly lookup vary headers. @@ -1664,7 +1655,7 @@ TEST_P(CacheStorageCacheTestP, QuotaManagerModified) { EXPECT_EQ(0, quota_manager_proxy_->notify_storage_modified_count()); - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); // Storage notification happens after the operation returns, so continue the // event loop. base::RunLoop().RunUntilIdle(); @@ -1672,7 +1663,7 @@ EXPECT_LT(0, quota_manager_proxy_->last_notified_delta()); int64_t sum_delta = quota_manager_proxy_->last_notified_delta(); - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); base::RunLoop().RunUntilIdle(); EXPECT_EQ(2, quota_manager_proxy_->notify_storage_modified_count()); EXPECT_LT(sum_delta, quota_manager_proxy_->last_notified_delta()); @@ -1694,20 +1685,20 @@ TEST_P(CacheStorageCacheTestP, PutObeysQuotaLimits) { mock_quota_manager_->SetQuota(GURL(kOrigin), blink::mojom::StorageType::kTemporary, 0); - EXPECT_FALSE(Put(body_request_, body_response_)); + EXPECT_FALSE(Put(body_request_, CreateBlobBodyResponse())); EXPECT_EQ(CacheStorageError::kErrorQuotaExceeded, callback_error_); } TEST_P(CacheStorageCacheTestP, Size) { EXPECT_EQ(0, Size()); - EXPECT_TRUE(Put(no_body_request_, no_body_response_)); + EXPECT_TRUE(Put(no_body_request_, CreateNoBodyResponse())); EXPECT_LT(0, Size()); int64_t no_body_size = Size(); EXPECT_TRUE(Delete(no_body_request_)); EXPECT_EQ(0, Size()); - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); EXPECT_LT(no_body_size, Size()); EXPECT_TRUE(Delete(body_request_)); @@ -1719,12 +1710,13 @@ ServiceWorkerFetchRequest non_opaque_request(body_request_); non_opaque_request.url = GURL("http://example.com/no-pad.html"); - ServiceWorkerResponse non_opaque_response(body_response_); - non_opaque_response.response_time = response_time; + blink::mojom::FetchAPIResponsePtr non_opaque_response = + CreateBlobBodyResponse(); + non_opaque_response->response_time = response_time; EXPECT_EQ(0, CacheStorageCache::CalculateResponsePadding( - non_opaque_response, CreateTestPaddingKey().get(), + *non_opaque_response, CreateTestPaddingKey().get(), 0 /* side_data_size */)); - EXPECT_TRUE(Put(non_opaque_request, non_opaque_response)); + EXPECT_TRUE(Put(non_opaque_request, std::move(non_opaque_response))); int64_t unpadded_no_data_cache_size = Size(); // Now write some side data to that cache. @@ -1738,8 +1730,11 @@ unpadded_total_resource_size - unpadded_no_data_cache_size; EXPECT_EQ(expected_side_data.size(), static_cast<size_t>(unpadded_side_data_size)); + blink::mojom::FetchAPIResponsePtr non_opaque_response_clone = + CreateBlobBodyResponse(); + non_opaque_response_clone->response_time = response_time; EXPECT_EQ(0, CacheStorageCache::CalculateResponsePadding( - non_opaque_response, CreateTestPaddingKey().get(), + *non_opaque_response_clone, CreateTestPaddingKey().get(), unpadded_side_data_size)); // Now write an identically sized opaque response. @@ -1748,11 +1743,11 @@ // Same URL length means same cache sizes (ignoring padding). EXPECT_EQ(opaque_request.url.spec().length(), non_opaque_request.url.spec().length()); - ServiceWorkerResponse opaque_response(non_opaque_response); - opaque_response.response_type = network::mojom::FetchResponseType::kOpaque; - opaque_response.response_time = response_time; + blink::mojom::FetchAPIResponsePtr opaque_response(CreateBlobBodyResponse()); + opaque_response->response_type = network::mojom::FetchResponseType::kOpaque; + opaque_response->response_time = response_time; - EXPECT_TRUE(Put(opaque_request, opaque_response)); + EXPECT_TRUE(Put(opaque_request, std::move(opaque_response))); // This test is fragile. Right now it deterministically adds non-zero padding. // But if the url, padding key, or padding algorithm change it might become // zero. @@ -1784,11 +1779,11 @@ TEST_F(CacheStorageCacheTest, TestDifferentOpaqueSideDataSizes) { ServiceWorkerFetchRequest request(body_request_); - ServiceWorkerResponse response(body_response_); - response.response_type = network::mojom::FetchResponseType::kOpaque; + blink::mojom::FetchAPIResponsePtr response(CreateBlobBodyResponse()); + response->response_type = network::mojom::FetchResponseType::kOpaque; base::Time response_time(base::Time::Now()); - response.response_time = response_time; - EXPECT_TRUE(Put(request, response)); + response->response_time = response_time; + EXPECT_TRUE(Put(request, std::move(response))); int64_t opaque_cache_size_no_side_data = Size(); const std::string small_side_data(1024, 'X'); @@ -1816,27 +1811,27 @@ base::Time response_time(base::Time::Now()); - ServiceWorkerResponse response(body_response_); - response.response_type = network::mojom::FetchResponseType::kOpaque; - response.response_time = response_time; - EXPECT_TRUE(Put(request, response)); + blink::mojom::FetchAPIResponsePtr response(CreateBlobBodyResponse()); + response->response_type = network::mojom::FetchResponseType::kOpaque; + response->response_time = response_time; + EXPECT_TRUE(Put(request, std::move(response))); int64_t size_after_first_put = Size(); ServiceWorkerFetchRequest request2(body_request_); - ServiceWorkerResponse response2(body_response_); - response2.response_type = network::mojom::FetchResponseType::kOpaque; - response2.response_time = response_time; - EXPECT_TRUE(Put(request2, response2)); + blink::mojom::FetchAPIResponsePtr response2(CreateBlobBodyResponse()); + response2->response_type = network::mojom::FetchResponseType::kOpaque; + response2->response_time = response_time; + EXPECT_TRUE(Put(request2, std::move(response2))); EXPECT_EQ(size_after_first_put, Size()); } TEST_P(CacheStorageCacheTestP, GetSizeThenClose) { // Create the backend and put something in it. - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); // Get a reference to the response in the cache. EXPECT_TRUE(Match(body_request_)); - blink::mojom::BlobPtr blob = callback_response_->blob->TakeBlobPtr(); + blink::mojom::BlobPtr blob(std::move(callback_response_->blob->blob)); callback_response_ = nullptr; int64_t cache_size = Size(); @@ -1849,17 +1844,17 @@ TEST_P(CacheStorageCacheTestP, OpsFailOnClosedBackend) { // Create the backend and put something in it. - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); EXPECT_TRUE(Close()); VerifyAllOpsFail(); } TEST_P(CacheStorageCacheTestP, BlobReferenceDelaysClose) { // Create the backend and put something in it. - EXPECT_TRUE(Put(body_request_, body_response_)); + EXPECT_TRUE(Put(body_request_, CreateBlobBodyResponse())); // Get a reference to the response in the cache. EXPECT_TRUE(Match(body_request_)); - blink::mojom::BlobPtr blob = callback_response_->blob->TakeBlobPtr(); + blink::mojom::BlobPtr blob(std::move(callback_response_->blob->blob)); callback_response_ = nullptr; base::RunLoop loop; @@ -1891,7 +1886,7 @@ blink::mojom::BatchOperation::New(); operation1->operation_type = blink::mojom::OperationType::kPut; operation1->request = body_request_; - operation1->response = body_response_; + operation1->response = CreateBlobBodyResponse(); std::unique_ptr<base::RunLoop> close_loop1(new base::RunLoop()); std::vector<blink::mojom::BatchOperationPtr> operations1; @@ -1910,7 +1905,7 @@ blink::mojom::BatchOperation::New(); operation2->operation_type = blink::mojom::OperationType::kPut; operation2->request = body_request_; - operation2->response = body_response_; + operation2->response = CreateBlobBodyResponse(); delayable_backend->set_delay_open_entry(false); std::unique_ptr<base::RunLoop> close_loop2(new base::RunLoop());
diff --git a/content/browser/cache_storage/cache_storage_dispatcher_host.cc b/content/browser/cache_storage/cache_storage_dispatcher_host.cc index 60669ac..63b9d6a 100644 --- a/content/browser/cache_storage/cache_storage_dispatcher_host.cc +++ b/content/browser/cache_storage/cache_storage_dispatcher_host.cc
@@ -84,13 +84,14 @@ void OnCacheMatchCallback( blink::mojom::CacheStorageCache::MatchCallback callback, blink::mojom::CacheStorageError error, - std::unique_ptr<ServiceWorkerResponse> response) { + blink::mojom::FetchAPIResponsePtr response) { if (error != CacheStorageError::kSuccess) { std::move(callback).Run(blink::mojom::MatchResult::NewStatus(error)); return; } - std::move(callback).Run(blink::mojom::MatchResult::NewResponse(*response)); + std::move(callback).Run( + blink::mojom::MatchResult::NewResponse(std::move(response))); } void MatchAll(const base::Optional<ServiceWorkerFetchRequest>& request, @@ -120,7 +121,7 @@ void OnCacheMatchAllCallback( blink::mojom::CacheStorageCache::MatchAllCallback callback, blink::mojom::CacheStorageError error, - std::vector<ServiceWorkerResponse> responses) { + std::vector<blink::mojom::FetchAPIResponsePtr> responses) { if (error != CacheStorageError::kSuccess && error != CacheStorageError::kErrorNotFound) { std::move(callback).Run(blink::mojom::MatchAllResult::NewStatus(error)); @@ -371,14 +372,14 @@ void CacheStorageDispatcherHost::OnMatchCallback( blink::mojom::CacheStorage::MatchCallback callback, CacheStorageError error, - std::unique_ptr<ServiceWorkerResponse> response) { + blink::mojom::FetchAPIResponsePtr response) { if (error != CacheStorageError::kSuccess) { std::move(callback).Run(blink::mojom::MatchResult::NewStatus(error)); return; } std::move(callback).Run( - blink::mojom::MatchResult::NewResponse(std::move(*response))); + blink::mojom::MatchResult::NewResponse(std::move(response))); } void CacheStorageDispatcherHost::AddBinding(
diff --git a/content/browser/cache_storage/cache_storage_dispatcher_host.h b/content/browser/cache_storage/cache_storage_dispatcher_host.h index f4f9904..ade31c5 100644 --- a/content/browser/cache_storage/cache_storage_dispatcher_host.h +++ b/content/browser/cache_storage/cache_storage_dispatcher_host.h
@@ -83,7 +83,7 @@ blink::mojom::CacheStorageError error); void OnMatchCallback(blink::mojom::CacheStorage::MatchCallback callback, blink::mojom::CacheStorageError error, - std::unique_ptr<ServiceWorkerResponse> response); + blink::mojom::FetchAPIResponsePtr response); void OnOpenCallback(url::Origin origin, blink::mojom::CacheStorage::OpenCallback callback, CacheStorageCacheHandle cache_handle,
diff --git a/content/browser/cache_storage/cache_storage_manager.cc b/content/browser/cache_storage/cache_storage_manager.cc index be479cf..6eab90f 100644 --- a/content/browser/cache_storage/cache_storage_manager.cc +++ b/content/browser/cache_storage/cache_storage_manager.cc
@@ -255,7 +255,7 @@ CacheStorageOwner owner, const std::string& cache_name, std::unique_ptr<ServiceWorkerFetchRequest> request, - std::unique_ptr<ServiceWorkerResponse> response, + blink::mojom::FetchAPIResponsePtr response, CacheStorage::ErrorCallback callback) { // Cache API should write through the dispatcher. DCHECK_NE(owner, CacheStorageOwner::kCacheAPI);
diff --git a/content/browser/cache_storage/cache_storage_manager.h b/content/browser/cache_storage/cache_storage_manager.h index e7460ce3..b9f92ce 100644 --- a/content/browser/cache_storage/cache_storage_manager.h +++ b/content/browser/cache_storage/cache_storage_manager.h
@@ -110,7 +110,7 @@ CacheStorageOwner owner, const std::string& cache_name, std::unique_ptr<ServiceWorkerFetchRequest> request, - std::unique_ptr<ServiceWorkerResponse> response, + blink::mojom::FetchAPIResponsePtr response, CacheStorage::ErrorCallback callback); // This must be called before creating any of the public *Cache functions
diff --git a/content/browser/cache_storage/cache_storage_manager_unittest.cc b/content/browser/cache_storage/cache_storage_manager_unittest.cc index d62569b7..d1e328f3 100644 --- a/content/browser/cache_storage/cache_storage_manager_unittest.cc +++ b/content/browser/cache_storage/cache_storage_manager_unittest.cc
@@ -11,6 +11,7 @@ #include <set> #include <utility> +#include "base/containers/flat_map.h" #include "base/files/file_enumerator.h" #include "base/files/file_path.h" #include "base/files/file_util.h" @@ -62,6 +63,7 @@ namespace cache_storage_manager_unittest { using blink::mojom::StorageType; +using ResponseHeaderMap = base::flat_map<std::string, std::string>; class MockCacheStorageQuotaManagerProxy : public MockQuotaManagerProxy { public: @@ -222,7 +224,7 @@ void CacheMatchCallback(base::RunLoop* run_loop, CacheStorageError error, - std::unique_ptr<ServiceWorkerResponse> response) { + blink::mojom::FetchAPIResponsePtr response) { callback_error_ = error; callback_cache_handle_response_ = std::move(response); run_loop->Quit(); @@ -424,11 +426,10 @@ auto request = std::make_unique<ServiceWorkerFetchRequest>(); request->url = GURL(request_url); - auto response = std::make_unique<ServiceWorkerResponse>(); - base::RunLoop loop; cache_manager_->WriteToCache( - origin, owner, cache_name, std::move(request), std::move(response), + origin, owner, cache_name, std::move(request), + blink::mojom::FetchAPIResponse::New(), base::BindOnce(&CacheStorageManagerTest::ErrorCallback, base::Unretained(this), base::Unretained(&loop))); loop.Run(); @@ -447,10 +448,10 @@ bool CachePutWithRequestAndHeaders( CacheStorageCache* cache, const ServiceWorkerFetchRequest& request, - const ServiceWorkerHeaderMap& response_headers, + ResponseHeaderMap response_headers, FetchResponseType response_type = FetchResponseType::kDefault) { return CachePutWithStatusCode(cache, request, 200, response_type, - response_headers); + std::move(response_headers)); } bool CachePutWithStatusCode( @@ -458,8 +459,7 @@ const ServiceWorkerFetchRequest& request, int status_code, FetchResponseType response_type = FetchResponseType::kDefault, - const ServiceWorkerHeaderMap& response_headers = - ServiceWorkerHeaderMap()) { + ResponseHeaderMap response_headers = ResponseHeaderMap()) { std::string blob_uuid = base::GenerateGUID(); std::unique_ptr<storage::BlobDataBuilder> blob_data( new storage::BlobDataBuilder(blob_uuid)); @@ -468,29 +468,28 @@ std::unique_ptr<storage::BlobDataHandle> blob_data_handle = blob_storage_context_->AddFinishedBlob(std::move(blob_data)); - scoped_refptr<storage::BlobHandle> blob_handle; - blink::mojom::BlobPtr blob; - storage::BlobImpl::Create(std::move(blob_data_handle), MakeRequest(&blob)); - blob_handle = base::MakeRefCounted<storage::BlobHandle>(std::move(blob)); + blink::mojom::BlobPtrInfo blob_ptr_info; + storage::BlobImpl::Create(std::move(blob_data_handle), + MakeRequest(&blob_ptr_info)); - std::unique_ptr<std::vector<GURL>> url_list = - std::make_unique<std::vector<GURL>>(); - url_list->push_back(request.url); - ServiceWorkerResponse response( - std::move(url_list), status_code, "OK", response_type, - std::make_unique<ServiceWorkerHeaderMap>(response_headers), blob_uuid, - request.url.spec().size(), blob_handle, + auto blob = blink::mojom::SerializedBlob::New(); + blob->uuid = blob_uuid; + blob->size = request.url.spec().size(); + blob->blob = std::move(blob_ptr_info); + + auto response = blink::mojom::FetchAPIResponse::New( + std::vector<GURL>({request.url}), status_code, "OK", response_type, + response_headers, std::move(blob), blink::mojom::ServiceWorkerResponseError::kUnknown, base::Time(), - false /* is_in_cache_storage */, std::string() /* cache_storage_cache_name */, - std::make_unique< - ServiceWorkerHeaderList>() /* cors_exposed_header_names */); + std::vector<std::string>() /* cors_exposed_header_names */, + false /* is_in_cache_storage */, nullptr /* side_data_blob */); blink::mojom::BatchOperationPtr operation = blink::mojom::BatchOperation::New(); operation->operation_type = blink::mojom::OperationType::kPut; operation->request = request; - operation->response = response; + operation->response = std::move(response); std::vector<blink::mojom::BatchOperationPtr> operations; operations.emplace_back(std::move(operation)); @@ -508,13 +507,12 @@ bool CacheDelete(CacheStorageCache* cache, const GURL& url) { ServiceWorkerFetchRequest request; request.url = url; - ServiceWorkerResponse response; blink::mojom::BatchOperationPtr operation = blink::mojom::BatchOperation::New(); operation->operation_type = blink::mojom::OperationType::kDelete; operation->request = request; - operation->response = response; + operation->response = blink::mojom::FetchAPIResponse::New(); std::vector<blink::mojom::BatchOperationPtr> operations; operations.emplace_back(std::move(operation)); @@ -641,7 +639,7 @@ CacheStorageCacheHandle callback_cache_handle_; int callback_bool_; CacheStorageError callback_error_; - std::unique_ptr<ServiceWorkerResponse> callback_cache_handle_response_; + blink::mojom::FetchAPIResponsePtr callback_cache_handle_response_; std::unique_ptr<storage::BlobDataHandle> callback_data_handle_; CacheStorageIndex callback_cache_index_; @@ -1794,11 +1792,11 @@ request.url = url; request.headers["vary_foo"] = "foo"; - ServiceWorkerHeaderMap response_headers; + ResponseHeaderMap response_headers; response_headers["vary"] = "vary_foo"; - EXPECT_TRUE(CachePutWithRequestAndHeaders(callback_cache_handle_.value(), - request, response_headers)); + EXPECT_TRUE(CachePutWithRequestAndHeaders( + callback_cache_handle_.value(), request, std::move(response_headers))); EXPECT_TRUE(StorageMatchWithRequest(origin1_, "foo", request)); request.headers["vary_foo"] = "bar"; @@ -1847,7 +1845,7 @@ request.url = url; request.headers["vary_foo"] = "foo"; - ServiceWorkerHeaderMap response_headers; + ResponseHeaderMap response_headers; response_headers["vary"] = "vary_foo"; EXPECT_TRUE(CachePutWithRequestAndHeaders(callback_cache_handle_.value(),
diff --git a/content/browser/code_cache/generated_code_cache.cc b/content/browser/code_cache/generated_code_cache.cc index d0740fe..d968ba7a 100644 --- a/content/browser/code_cache/generated_code_cache.cc +++ b/content/browser/code_cache/generated_code_cache.cc
@@ -151,10 +151,10 @@ GeneratedCodeCache::~GeneratedCodeCache() = default; -void GeneratedCodeCache::WriteData( - const GURL& url, - const url::Origin& origin, - scoped_refptr<net::IOBufferWithSize> buffer) { +void GeneratedCodeCache::WriteData(const GURL& url, + const url::Origin& origin, + const base::Time& response_time, + const std::vector<uint8_t>& data) { // Silently ignore the requests. if (backend_state_ == kFailed) return; @@ -164,6 +164,17 @@ if (!IsAllowedToCache(url, origin)) return; + // Append the response time to the metadata. Code caches store + // response_time + generated code as a single entry. + scoped_refptr<net::IOBufferWithSize> buffer( + new net::IOBufferWithSize(data.size() + kResponseTimeSizeInBytes)); + int64_t serialized_time = + response_time.ToDeltaSinceWindowsEpoch().InMicroseconds(); + memcpy(buffer->data(), &serialized_time, kResponseTimeSizeInBytes); + if (!data.empty()) + memcpy(buffer->data() + kResponseTimeSizeInBytes, &data.front(), + data.size()); + std::string key = GetCacheKey(url, origin); if (backend_state_ != kInitialized) { // Insert it into the list of pending operations while the backend is
diff --git a/content/browser/code_cache/generated_code_cache.h b/content/browser/code_cache/generated_code_cache.h index 36d2991..bbeb7f92 100644 --- a/content/browser/code_cache/generated_code_cache.h +++ b/content/browser/code_cache/generated_code_cache.h
@@ -33,6 +33,7 @@ public: using ReadDataCallback = base::RepeatingCallback<void(scoped_refptr<net::IOBufferWithSize>)>; + static const int kResponseTimeSizeInBytes = sizeof(int64_t); // Creates a GeneratedCodeCache with the specified path and the maximum size. GeneratedCodeCache(const base::FilePath& path, int max_size_bytes); @@ -44,7 +45,8 @@ // it creates a new one. void WriteData(const GURL& url, const url::Origin& origin, - scoped_refptr<net::IOBufferWithSize>); + const base::Time& response_time, + const std::vector<uint8_t>& data); // Fetch entry corresponding to <url, origin> from the cache and pass // it using the ReadDataCallback.
diff --git a/content/browser/code_cache/generated_code_cache_unittest.cc b/content/browser/code_cache/generated_code_cache_unittest.cc index 3d50d595..af7e23eb 100644 --- a/content/browser/code_cache/generated_code_cache_unittest.cc +++ b/content/browser/code_cache/generated_code_cache_unittest.cc
@@ -55,10 +55,8 @@ void WriteToCache(const GURL& url, const url::Origin& origin, const std::string& data) { - scoped_refptr<net::IOBufferWithSize> buffer( - new net::IOBufferWithSize(data.length())); - memcpy(buffer->data(), data.c_str(), data.length()); - generated_code_cache_->WriteData(url, origin, buffer); + std::vector<uint8_t> vector_data(data.begin(), data.end()); + generated_code_cache_->WriteData(url, origin, base::Time(), vector_data); } void DeleteFromCache(const GURL& url, const url::Origin& origin) { @@ -85,7 +83,9 @@ received_null_ = true; return; } - std::string str(buffer->data(), buffer->size()); + std::string str( + buffer->data() + GeneratedCodeCache::kResponseTimeSizeInBytes, + buffer->size() - GeneratedCodeCache::kResponseTimeSizeInBytes); received_ = true; received_null_ = false; received_data_ = str;
diff --git a/content/browser/devtools/devtools_url_loader_interceptor.cc b/content/browser/devtools/devtools_url_loader_interceptor.cc index fa63a56..99e8fd1 100644 --- a/content/browser/devtools/devtools_url_loader_interceptor.cc +++ b/content/browser/devtools/devtools_url_loader_interceptor.cc
@@ -944,6 +944,7 @@ create_loader_params_->request.url, "", net::ForceSniffFileUrlsForHtml::kDisabled, &head->mime_type); + head->did_mime_sniff = true; } head->content_length = body_size; head->encoded_data_length = header_size;
diff --git a/content/browser/do_not_track_browsertest.cc b/content/browser/do_not_track_browsertest.cc index addb629..2617789d 100644 --- a/content/browser/do_not_track_browsertest.cc +++ b/content/browser/do_not_track_browsertest.cc
@@ -327,6 +327,38 @@ ExpectPageTextEq("1"); } +// Checks that the DNT header is preserved when fetching from a page controlled +// by a service worker which has a fetch handler and responds with fetch(). +IN_PROC_BROWSER_TEST_F(DoNotTrackTest, + FetchFromServiceWorkerControlledPage_RespondWithFetch) { + ASSERT_TRUE(embedded_test_server()->Start()); + if (!EnableDoNotTrack()) + return; + + { + // Register a service worker which controls /service_worker. + const GURL url = embedded_test_server()->GetURL( + "/service_worker/create_service_worker.html?" + "worker_url=/service_worker/fetch_event_respond_with_fetch.js"); + EXPECT_TRUE(NavigateToURL(shell(), url)); + const base::string16 title = base::ASCIIToUTF16("DONE"); + TitleWatcher watcher(shell()->web_contents(), title); + EXPECT_EQ(title, watcher.WaitAndGetTitle()); + } + + { + // Issue a request from a controlled page. + const GURL url = embedded_test_server()->GetURL( + "/service_worker/fetch_from_page.html?url=/echoheader?DNT"); + EXPECT_TRUE(NavigateToURL(shell(), url)); + const base::string16 title = base::ASCIIToUTF16("DONE"); + TitleWatcher watcher(shell()->web_contents(), title); + EXPECT_EQ(title, watcher.WaitAndGetTitle()); + } + + ExpectPageTextEq("1"); +} + } // namespace } // namespace content
diff --git a/content/browser/file_url_loader_factory.cc b/content/browser/file_url_loader_factory.cc index 822e0a0..cfed5f6 100644 --- a/content/browser/file_url_loader_factory.cc +++ b/content/browser/file_url_loader_factory.cc
@@ -557,6 +557,7 @@ ? net::ForceSniffFileUrlsForHtml::kEnabled : net::ForceSniffFileUrlsForHtml::kDisabled, &head.mime_type); + head.did_mime_sniff = true; } if (head.headers) { head.headers->AddHeader(
diff --git a/content/browser/fileapi/file_system_url_loader_factory.cc b/content/browser/fileapi/file_system_url_loader_factory.cc index 7ef37b18..183e2a9 100644 --- a/content/browser/fileapi/file_system_url_loader_factory.cc +++ b/content/browser/fileapi/file_system_url_loader_factory.cc
@@ -522,6 +522,7 @@ SniffMimeType(file_data_->data(), result, url_.ToGURL(), type_hint, net::ForceSniffFileUrlsForHtml::kDisabled, &head_.mime_type); + head_.did_mime_sniff = true; } client_->OnReceiveResponse(head_);
diff --git a/content/browser/fileapi/file_system_url_loader_factory_browsertest.cc b/content/browser/fileapi/file_system_url_loader_factory_browsertest.cc index 82cfc276..980fddb 100644 --- a/content/browser/fileapi/file_system_url_loader_factory_browsertest.cc +++ b/content/browser/fileapi/file_system_url_loader_factory_browsertest.cc
@@ -739,6 +739,7 @@ EXPECT_TRUE(client->has_received_completion()); EXPECT_EQ(mime_type_direct, client->response_head().mime_type); + EXPECT_TRUE(client->response_head().did_mime_sniff); } IN_PROC_BROWSER_TEST_F(FileSystemURLLoaderFactoryTest, FileIncognito) {
diff --git a/content/browser/loader/mime_sniffing_resource_handler.cc b/content/browser/loader/mime_sniffing_resource_handler.cc index 89e2c53..74707ef3 100644 --- a/content/browser/loader/mime_sniffing_resource_handler.cc +++ b/content/browser/loader/mime_sniffing_resource_handler.cc
@@ -250,6 +250,7 @@ // the mime type. However, even if it returns false, it returns a new type // that is probably better than the current one. response_->head.mime_type.assign(new_type); + response_->head.did_mime_sniff = true; if (!made_final_decision && (bytes_read > 0)) { controller->Resume();
diff --git a/content/browser/loader/mime_sniffing_resource_handler_unittest.cc b/content/browser/loader/mime_sniffing_resource_handler_unittest.cc index 6ac3538..6d23266 100644 --- a/content/browser/loader/mime_sniffing_resource_handler_unittest.cc +++ b/content/browser/loader/mime_sniffing_resource_handler_unittest.cc
@@ -473,6 +473,8 @@ EXPECT_EQ(1, test_handler->on_will_read_called()); EXPECT_EQ(1, test_handler->on_read_completed_called()); + EXPECT_TRUE(test_handler->resource_response()->head.did_mime_sniff); + // Process all messages to ensure proper test teardown. content::RunAllPendingInMessageLoop(); } @@ -601,6 +603,8 @@ EXPECT_EQ(1, test_handler->on_will_read_called()); EXPECT_EQ(1, test_handler->on_read_completed_called()); + EXPECT_FALSE(test_handler->resource_response()->head.did_mime_sniff); + if (!read_completed) { EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code());
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc index 4676ec4..6f423f6 100644 --- a/content/browser/loader/navigation_url_loader_impl.cc +++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -40,6 +40,7 @@ #include "content/browser/web_package/signed_exchange_utils.h" #include "content/browser/webui/url_data_manager_backend.h" #include "content/browser/webui/web_ui_url_loader_factory_internal.h" +#include "content/common/mime_sniffing_throttle.h" #include "content/common/navigation_subresource_loader_params.h" #include "content/common/net/record_load_histograms.h" #include "content/common/throttling_url_loader.h" @@ -695,11 +696,14 @@ // |interceptor| wants to handle the request with // |single_request_handler|. DCHECK(interceptor); + std::vector<std::unique_ptr<content::URLLoaderThrottle>> throttles = + CreateURLLoaderThrottles(); + throttles.push_back(std::make_unique<MimeSniffingThrottle>()); default_loader_used_ = false; url_loader_ = ThrottlingURLLoader::CreateLoaderAndStart( base::MakeRefCounted<SingleRequestURLLoaderFactory>( std::move(single_request_handler)), - CreateURLLoaderThrottles(), frame_tree_node_id_, + std::move(throttles), frame_tree_node_id_, global_request_id_.request_id, network::mojom::kURLLoadOptionNone, resource_request_.get(), this, kNavigationUrlLoaderTrafficAnnotation, base::ThreadTaskRunnerHandle::Get()); @@ -927,6 +931,7 @@ // Previews off. PreviewsState previews_state = PREVIEWS_OFF; std::unique_ptr<NavigationData> cloned_navigation_data; + if (IsLoaderInterceptionEnabled()) { bool must_download = download_utils::MustDownload( url_, head.headers.get(), head.mime_type); @@ -944,57 +949,71 @@ is_download = !response_intercepted && (must_download || !known_mime_type); is_stream = false; - } else { - ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get(); - net::URLRequest* url_request = rdh->GetURLRequest(global_request_id_); - // The |url_request| maybe have been removed from the resource dispatcher - // host during the time it took for OnReceiveResponse() to be received. - if (url_request) { - ResourceRequestInfoImpl* info = - ResourceRequestInfoImpl::ForRequest(url_request); - is_download = !response_intercepted && info->IsDownload(); - is_stream = info->is_stream(); - previews_state = info->GetPreviewsState(); - if (rdh->delegate()) { - NavigationData* navigation_data = - rdh->delegate()->GetNavigationData(url_request); - - // Clone the embedder's NavigationData before moving it to the UI - // thread. - if (navigation_data) - cloned_navigation_data = navigation_data->Clone(); - } - - // non-S13nServiceWorker: - // This is similar to what is done in - // ServiceWorkerControlleeHandler::MaybeCreateSubresourceLoaderParams() - // (which is used when S13nServiceWorker is on). It takes the matching - // ControllerServiceWorkerInfo (if any) associated with the request. It - // will be sent to the renderer process and used to intercept requests. - ServiceWorkerProviderHost* sw_provider_host = - ServiceWorkerRequestHandler::GetProviderHost(url_request); - if (sw_provider_host && sw_provider_host->controller()) { - subresource_loader_params_ = SubresourceLoaderParams(); - subresource_loader_params_->controller_service_worker_info = - mojom::ControllerServiceWorkerInfo::New(); - subresource_loader_params_->controller_service_worker_info->mode = - sw_provider_host->GetControllerMode(); - base::WeakPtr<ServiceWorkerObjectHost> sw_object_host = - sw_provider_host->GetOrCreateServiceWorkerObjectHost( - sw_provider_host->controller()); - if (sw_object_host) { - subresource_loader_params_->controller_service_worker_object_host = - sw_object_host; - subresource_loader_params_->controller_service_worker_info - ->object_info = sw_object_host->CreateIncompleteObjectInfo(); - } - } - } else { - is_download = is_stream = false; + // If NetworkService is on, or an interceptor handled the request, the + // request doesn't use ResourceDispatcherHost so + // CallOnReceivedResponse and return here. + if (base::FeatureList::IsEnabled(network::features::kNetworkService) || + !default_loader_used_) { + CallOnReceivedResponse(head, std::move(url_loader_client_endpoints), + std::move(cloned_navigation_data), is_download, + is_stream, previews_state); + return; } } + // NetworkService is off and an interceptor didn't handle the request, + // so it went to ResourceDispatcherHost. + ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get(); + net::URLRequest* url_request = rdh->GetURLRequest(global_request_id_); + + // The |url_request| maybe have been removed from the resource dispatcher + // host during the time it took for OnReceiveResponse() to be received. + if (url_request) { + ResourceRequestInfoImpl* info = + ResourceRequestInfoImpl::ForRequest(url_request); + is_download = !response_intercepted && info->IsDownload(); + is_stream = info->is_stream(); + previews_state = info->GetPreviewsState(); + if (rdh->delegate()) { + NavigationData* navigation_data = + rdh->delegate()->GetNavigationData(url_request); + + // Clone the embedder's NavigationData before moving it to the UI + // thread. + if (navigation_data) + cloned_navigation_data = navigation_data->Clone(); + } + + // non-S13nServiceWorker: + // This is similar to what is done in + // ServiceWorkerControlleeHandler::MaybeCreateSubresourceLoaderParams() + // (which is used when S13nServiceWorker is on). It takes the matching + // ControllerServiceWorkerInfo (if any) associated with the request. It + // will be sent to the renderer process and used to intercept requests. + ServiceWorkerProviderHost* sw_provider_host = + ServiceWorkerRequestHandler::GetProviderHost(url_request); + if (sw_provider_host && sw_provider_host->controller()) { + DCHECK(!blink::ServiceWorkerUtils::IsServicificationEnabled()); + subresource_loader_params_ = SubresourceLoaderParams(); + subresource_loader_params_->controller_service_worker_info = + mojom::ControllerServiceWorkerInfo::New(); + subresource_loader_params_->controller_service_worker_info->mode = + sw_provider_host->GetControllerMode(); + base::WeakPtr<ServiceWorkerObjectHost> sw_object_host = + sw_provider_host->GetOrCreateServiceWorkerObjectHost( + sw_provider_host->controller()); + if (sw_object_host) { + subresource_loader_params_->controller_service_worker_object_host = + sw_object_host; + subresource_loader_params_->controller_service_worker_info + ->object_info = sw_object_host->CreateIncompleteObjectInfo(); + } + } + } else { + is_download = is_stream = false; + } + CallOnReceivedResponse(head, std::move(url_loader_client_endpoints), std::move(cloned_navigation_data), is_download, is_stream, previews_state);
diff --git a/content/browser/loader/resource_dispatcher_host_unittest.cc b/content/browser/loader/resource_dispatcher_host_unittest.cc index a1ba8fe9..c9ef299 100644 --- a/content/browser/loader/resource_dispatcher_host_unittest.cc +++ b/content/browser/loader/resource_dispatcher_host_unittest.cc
@@ -2010,6 +2010,7 @@ client.RunUntilResponseReceived(); EXPECT_EQ("text/html", client.response_head().mime_type); + EXPECT_TRUE(client.response_head().did_mime_sniff); } // Tests that we don't sniff the mime type when the server provides one. @@ -2031,6 +2032,7 @@ client.RunUntilResponseReceived(); EXPECT_EQ("image/jpeg", client.response_head().mime_type); + EXPECT_FALSE(client.response_head().did_mime_sniff); } // Tests that we don't sniff the mime type when there is no message body.
diff --git a/content/browser/renderer_host/browser_compositor_view_mac.h b/content/browser/renderer_host/browser_compositor_view_mac.h index 46be85e..0d13a9a 100644 --- a/content/browser/renderer_host/browser_compositor_view_mac.h +++ b/content/browser/renderer_host/browser_compositor_view_mac.h
@@ -20,11 +20,12 @@ namespace ui { class AcceleratedWidgetMacNSView; -class RecyclableCompositorMac; } namespace content { +class RecyclableCompositorMac; + class BrowserCompositorMacClient { public: virtual SkColor BrowserCompositorMacGetGutterColor() const = 0; @@ -208,7 +209,7 @@ BrowserCompositorMacClient* client_ = nullptr; ui::AcceleratedWidgetMacNSView* accelerated_widget_mac_ns_view_ = nullptr; - std::unique_ptr<ui::RecyclableCompositorMac> recyclable_compositor_; + std::unique_ptr<RecyclableCompositorMac> recyclable_compositor_; std::unique_ptr<DelegatedFrameHost> delegated_frame_host_; std::unique_ptr<ui::Layer> root_layer_;
diff --git a/content/browser/renderer_host/browser_compositor_view_mac.mm b/content/browser/renderer_host/browser_compositor_view_mac.mm index 9bb2156..f9e9ad67 100644 --- a/content/browser/renderer_host/browser_compositor_view_mac.mm +++ b/content/browser/renderer_host/browser_compositor_view_mac.mm
@@ -20,7 +20,6 @@ #include "ui/accelerated_widget_mac/accelerated_widget_mac.h" #include "ui/accelerated_widget_mac/window_resize_helper_mac.h" #include "ui/base/layout.h" -#include "ui/compositor/recyclable_compositor_mac.h" #include "ui/display/screen.h" #include "ui/gfx/geometry/dip_util.h" @@ -38,9 +37,163 @@ base::LazyInstance<std::set<BrowserCompositorMac*>>::Leaky g_browser_compositors; +// A spare RecyclableCompositorMac kept around for recycling. +base::LazyInstance<base::circular_deque< + std::unique_ptr<RecyclableCompositorMac>>>::DestructorAtExit + g_spare_recyclable_compositors; + +void ReleaseSpareCompositors() { + // Allow at most one spare recyclable compositor. + while (g_spare_recyclable_compositors.Get().size() > 1) + g_spare_recyclable_compositors.Get().pop_front(); + + if (g_browser_compositors.Get().empty()) + g_spare_recyclable_compositors.Get().clear(); +} + } // namespace //////////////////////////////////////////////////////////////////////////////// +// RecyclableCompositorMac + +// A ui::Compositor and a gfx::AcceleratedWidget (and helper) that it draws +// into. This structure is used to efficiently recycle these structures across +// tabs (because creating a new ui::Compositor for each tab would be expensive +// in terms of time and resources). +class RecyclableCompositorMac : public ui::CompositorObserver { + public: + ~RecyclableCompositorMac() override; + + // Create a compositor, or recycle a preexisting one. + static std::unique_ptr<RecyclableCompositorMac> Create(); + + // Delete a compositor, or allow it to be recycled. + static void Recycle(std::unique_ptr<RecyclableCompositorMac> compositor); + + ui::Compositor* compositor() { return &compositor_; } + ui::AcceleratedWidgetMac* accelerated_widget_mac() { + return accelerated_widget_mac_.get(); + } + const gfx::Size pixel_size() const { return size_pixels_; } + float scale_factor() const { return scale_factor_; } + + // Suspend will prevent the compositor from producing new frames. This should + // be called to avoid creating spurious frames while changing state. + // Compositors are created as suspended. + void Suspend(); + void Unsuspend(); + + // Update the compositor's surface information, if needed. + void UpdateSurface(const gfx::Size& size_pixels, float scale_factor); + // Invalidate the compositor's surface information. + void InvalidateSurface(); + + // The viz::ParentLocalSurfaceIdAllocator for the ui::Compositor dispenses + // viz::LocalSurfaceIds that are renderered into by the ui::Compositor. + viz::ParentLocalSurfaceIdAllocator local_surface_id_allocator_; + gfx::Size size_pixels_; + float scale_factor_ = 1.f; + + private: + RecyclableCompositorMac(); + + // ui::CompositorObserver implementation: + void OnCompositingDidCommit(ui::Compositor* compositor) override; + void OnCompositingStarted(ui::Compositor* compositor, + base::TimeTicks start_time) override {} + void OnCompositingEnded(ui::Compositor* compositor) override {} + void OnCompositingLockStateChanged(ui::Compositor* compositor) override {} + void OnCompositingChildResizing(ui::Compositor* compositor) override {} + void OnCompositingShuttingDown(ui::Compositor* compositor) override {} + + std::unique_ptr<ui::AcceleratedWidgetMac> accelerated_widget_mac_; + ui::Compositor compositor_; + std::unique_ptr<ui::CompositorLock> compositor_suspended_lock_; + + DISALLOW_COPY_AND_ASSIGN(RecyclableCompositorMac); +}; + +RecyclableCompositorMac::RecyclableCompositorMac() + : accelerated_widget_mac_(new ui::AcceleratedWidgetMac()), + compositor_(content::GetContextFactoryPrivate()->AllocateFrameSinkId(), + content::GetContextFactory(), + content::GetContextFactoryPrivate(), + ui::WindowResizeHelperMac::Get()->task_runner(), + features::IsSurfaceSynchronizationEnabled(), + false /* enable_pixel_canvas */) { + compositor_.SetAcceleratedWidget( + accelerated_widget_mac_->accelerated_widget()); + Suspend(); + compositor_.AddObserver(this); +} + +RecyclableCompositorMac::~RecyclableCompositorMac() { + compositor_.RemoveObserver(this); +} + +void RecyclableCompositorMac::Suspend() { + // Requests a compositor lock without a timeout. + compositor_suspended_lock_ = + compositor_.GetCompositorLock(nullptr, base::TimeDelta()); +} + +void RecyclableCompositorMac::Unsuspend() { + compositor_suspended_lock_ = nullptr; +} + +void RecyclableCompositorMac::UpdateSurface(const gfx::Size& size_pixels, + float scale_factor) { + if (size_pixels != size_pixels_ || scale_factor != scale_factor_) { + size_pixels_ = size_pixels; + scale_factor_ = scale_factor; + compositor()->SetScaleAndSize(scale_factor_, size_pixels_, + local_surface_id_allocator_.GenerateId()); + } +} + +void RecyclableCompositorMac::InvalidateSurface() { + size_pixels_ = gfx::Size(); + scale_factor_ = 1.f; + local_surface_id_allocator_.Invalidate(); + compositor()->SetScaleAndSize( + scale_factor_, size_pixels_, + local_surface_id_allocator_.GetCurrentLocalSurfaceId()); +} + +void RecyclableCompositorMac::OnCompositingDidCommit( + ui::Compositor* compositor_that_did_commit) { + DCHECK_EQ(compositor_that_did_commit, compositor()); + accelerated_widget_mac_->SetSuspended(false); +} + +// static +std::unique_ptr<RecyclableCompositorMac> RecyclableCompositorMac::Create() { + DCHECK(ui::WindowResizeHelperMac::Get()->task_runner()); + if (!g_spare_recyclable_compositors.Get().empty()) { + std::unique_ptr<RecyclableCompositorMac> result; + result = std::move(g_spare_recyclable_compositors.Get().back()); + g_spare_recyclable_compositors.Get().pop_back(); + return result; + } + return std::unique_ptr<RecyclableCompositorMac>(new RecyclableCompositorMac); +} + +// static +void RecyclableCompositorMac::Recycle( + std::unique_ptr<RecyclableCompositorMac> compositor) { + compositor->accelerated_widget_mac_->SetSuspended(true); + + // Make this RecyclableCompositorMac recyclable for future instances. + g_spare_recyclable_compositors.Get().push_back(std::move(compositor)); + + // Post a task to free up the spare ui::Compositors when needed. Post this + // to the browser main thread so that we won't free any compositors while + // in a nested loop waiting to put up a new frame. + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, base::Bind(&ReleaseSpareCompositors)); +} + +//////////////////////////////////////////////////////////////////////////////// // BrowserCompositorMac BrowserCompositorMac::BrowserCompositorMac( @@ -79,6 +232,11 @@ size_t num_erased = g_browser_compositors.Get().erase(this); DCHECK_EQ(1u, num_erased); + + // If there are no compositors allocated, destroy the recyclable + // RecyclableCompositorMac. + if (g_browser_compositors.Get().empty()) + g_spare_recyclable_compositors.Get().clear(); } DelegatedFrameHost* BrowserCompositorMac::GetDelegatedFrameHost() { @@ -109,7 +267,7 @@ const gfx::CALayerParams* BrowserCompositorMac::GetLastCALayerParams() const { if (!recyclable_compositor_) return nullptr; - return recyclable_compositor_->widget()->GetCALayerParams(); + return recyclable_compositor_->accelerated_widget_mac()->GetCALayerParams(); } viz::FrameSinkId BrowserCompositorMac::GetRootFrameSinkId() { @@ -262,16 +420,14 @@ // Transition HasNoCompositor -> HasDetachedCompositor. if (state_ == HasNoCompositor && new_state < HasNoCompositor) { - recyclable_compositor_ = - ui::RecyclableCompositorMacFactory::Get()->CreateCompositor( - content::GetContextFactory(), content::GetContextFactoryPrivate()); + recyclable_compositor_ = RecyclableCompositorMac::Create(); recyclable_compositor_->UpdateSurface(dfh_size_pixels_, dfh_display_.device_scale_factor()); recyclable_compositor_->compositor()->SetRootLayer(root_layer_.get()); recyclable_compositor_->compositor()->SetBackgroundColor(background_color_); recyclable_compositor_->compositor()->SetDisplayColorSpace( dfh_display_.color_space()); - recyclable_compositor_->widget()->SetNSView( + recyclable_compositor_->accelerated_widget_mac()->SetNSView( accelerated_widget_mac_ns_view_); state_ = HasDetachedCompositor; } @@ -305,11 +461,10 @@ // Transition HasDetachedCompositor -> HasNoCompositor. if (state_ == HasDetachedCompositor && new_state > HasDetachedCompositor) { - recyclable_compositor_->widget()->ResetNSView(); + recyclable_compositor_->accelerated_widget_mac()->ResetNSView(); recyclable_compositor_->compositor()->SetRootLayer(nullptr); recyclable_compositor_->InvalidateSurface(); - ui::RecyclableCompositorMacFactory::Get()->RecycleCompositor( - std::move(recyclable_compositor_)); + RecyclableCompositorMac::Recycle(std::move(recyclable_compositor_)); state_ = HasNoCompositor; } @@ -337,8 +492,7 @@ *g_browser_compositors.Get().begin(); browser_compositor->client_->DestroyCompositorForShutdown(); } - - ui::RecyclableCompositorMacFactory::Get()->DisableRecyclingForShutdown(); + g_spare_recyclable_compositors.Get().clear(); } void BrowserCompositorMac::SetNeedsBeginFrames(bool needs_begin_frames) { @@ -423,7 +577,8 @@ if (!recyclable_compositor_) return false; - return !recyclable_compositor_->widget()->HasFrameOfSize(dfh_size_dip_); + return !recyclable_compositor_->accelerated_widget_mac()->HasFrameOfSize( + dfh_size_dip_); } void BrowserCompositorMac::SetParentUiLayer(ui::Layer* new_parent_ui_layer) {
diff --git a/content/browser/renderer_host/media/media_devices_manager.cc b/content/browser/renderer_host/media/media_devices_manager.cc index 354699f..ae5dbac 100644 --- a/content/browser/renderer_host/media/media_devices_manager.cc +++ b/content/browser/renderer_host/media/media_devices_manager.cc
@@ -693,7 +693,7 @@ } } - std::move(callback).Run(std::move(result), + std::move(callback).Run(result, video_input_capabilities_requested ? ComputeVideoInputCapabilities( enumeration[MEDIA_DEVICE_TYPE_VIDEO_INPUT],
diff --git a/content/browser/renderer_host/render_message_filter.cc b/content/browser/renderer_host/render_message_filter.cc index e00d79d..a410952 100644 --- a/content/browser/renderer_host/render_message_filter.cc +++ b/content/browser/renderer_host/render_message_filter.cc
@@ -48,6 +48,7 @@ #include "content/public/browser/browser_context.h" #include "content/public/browser/content_browser_client.h" #include "content/public/browser/resource_context.h" +#include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" #include "content/public/common/context_menu_params.h" #include "content/public/common/url_constants.h" @@ -214,22 +215,46 @@ return; } - net::HttpCache* cache = request_context_->GetURLRequestContext()-> - http_transaction_factory()->GetCache(); - if (!cache) - return; + DCHECK_CURRENTLY_ON(BrowserThread::IO); - // Use the same priority for the metadata write as for script - // resources (see defaultPriorityForResourceType() in WebKit's - // CachedResource.cpp). Note that WebURLRequest::PriorityMedium - // corresponds to net::LOW (see ConvertWebKitPriorityToNetPriority() - // in weburlloader_impl.cc). - const net::RequestPriority kPriority = net::LOW; - scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(data.size())); - if (!data.empty()) - memcpy(buf->data(), &data.front(), data.size()); - cache->WriteMetadata(url, kPriority, expected_response_time, buf.get(), - data.size()); + if (!base::FeatureList::IsEnabled(features::kIsolatedCodeCache)) { + net::HttpCache* cache = request_context_->GetURLRequestContext() + ->http_transaction_factory() + ->GetCache(); + if (!cache) + return; + + // Use the same priority for the metadata write as for script + // resources (see defaultPriorityForResourceType() in WebKit's + // CachedResource.cpp). Note that WebURLRequest::PriorityMedium + // corresponds to net::LOW (see ConvertWebKitPriorityToNetPriority() + // in weburlloader_impl.cc). + const net::RequestPriority kPriority = net::LOW; + scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(data.size())); + + if (!data.empty()) + memcpy(buf->data(), &data.front(), data.size()); + cache->WriteMetadata(url, kPriority, expected_response_time, buf.get(), + data.size()); + } else { + GURL requesting_url = + ChildProcessSecurityPolicyImpl::GetInstance()->GetOriginLock( + render_process_id_); + // If the origin_url isn't valid then render process might not be locked to + // an origin yet so we don't allow any writes to the disk. + if (!requesting_url.is_valid() || !url.is_valid()) + return; + url::Origin requesting_origin = url::Origin::Create(requesting_url); + + // Don't cache the code corresponding to unique origins. The same-origin + // checks should always fail for unique origins but the serialized value of + // unique origins does not ensure this. + if (requesting_origin.unique()) + return; + + generated_code_cache_context_->generated_code_cache()->WriteData( + url, requesting_origin, expected_response_time, data); + } } void RenderMessageFilter::FetchCachedCode(const GURL& url,
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc index 77718865..384f981 100644 --- a/content/browser/service_worker/service_worker_browsertest.cc +++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -2997,12 +2997,14 @@ const base::Closure& continuation, CacheStorageCacheHandle cache_handle, CacheStorageError error, - std::unique_ptr<ServiceWorkerResponse> response) { + blink::mojom::FetchAPIResponsePtr response) { ASSERT_EQ(CacheStorageError::kSuccess, error); ASSERT_TRUE(response->blob); - auto blob = response->blob; - response->blob->get()->ReadSideData(base::BindLambdaForTesting( - [blob, result, + blink::mojom::BlobPtr blob_ptr(std::move(response->blob->blob)); + auto blob_handle = + base::MakeRefCounted<storage::BlobHandle>(std::move(blob_ptr)); + blob_handle->get()->ReadSideData(base::BindLambdaForTesting( + [blob_handle, result, continuation](const base::Optional<std::vector<uint8_t>>& data) { if (data) *result = data->size();
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.cc b/content/browser/service_worker/service_worker_controllee_request_handler.cc index 1f017c5f..4574b2b8 100644 --- a/content/browser/service_worker/service_worker_controllee_request_handler.cc +++ b/content/browser/service_worker/service_worker_controllee_request_handler.cc
@@ -79,6 +79,34 @@ } // namespace +// RAII class that disallows calling SetControllerRegistration() on a provider +// host. +class ServiceWorkerControlleeRequestHandler:: + ScopedDisallowSetControllerRegistration { + public: + explicit ScopedDisallowSetControllerRegistration( + base::WeakPtr<ServiceWorkerProviderHost> provider_host) + : provider_host_(std::move(provider_host)) { + DCHECK(provider_host_->IsSetControllerRegistrationAllowed()) + << "The host already disallows using a registration; nested disallow " + "is not supported."; + provider_host_->AllowSetControllerRegistration(false); + } + + ~ScopedDisallowSetControllerRegistration() { + if (!provider_host_) + return; + DCHECK(!provider_host_->IsSetControllerRegistrationAllowed()) + << "Failed to disallow using a registration."; + provider_host_->AllowSetControllerRegistration(true); + } + + private: + base::WeakPtr<ServiceWorkerProviderHost> provider_host_; + + DISALLOW_COPY_AND_ASSIGN(ScopedDisallowSetControllerRegistration); +}; + ServiceWorkerControlleeRequestHandler::ServiceWorkerControlleeRequestHandler( base::WeakPtr<ServiceWorkerContextCore> context, base::WeakPtr<ServiceWorkerProviderHost> provider_host, @@ -115,9 +143,6 @@ ServiceWorkerControlleeRequestHandler:: ~ServiceWorkerControlleeRequestHandler() { MaybeScheduleUpdate(); - - if (is_main_resource_load_ && provider_host_) - provider_host_->SetAllowAssociation(true); } void ServiceWorkerControlleeRequestHandler::MaybeScheduleUpdate() { @@ -322,29 +347,28 @@ // Also prevent a registration from claiming this host while it's not // yet execution ready. - // TODO(falken): Make an RAII helper instead of all these explcit allow and - // disallow calls. - provider_host_->SetAllowAssociation(false); + auto disallow_controller = + std::make_unique<ScopedDisallowSetControllerRegistration>(provider_host_); stripped_url_ = net::SimplifyUrlForRequest(url); provider_host_->SetDocumentUrl(stripped_url_); provider_host_->SetTopmostFrameUrl(site_for_cookies); context_->storage()->FindRegistrationForDocument( stripped_url_, base::BindOnce(&self::DidLookupRegistrationForMainResource, - weak_factory_.GetWeakPtr())); + weak_factory_.GetWeakPtr(), + std::move(disallow_controller))); } void ServiceWorkerControlleeRequestHandler:: DidLookupRegistrationForMainResource( + std::unique_ptr<ScopedDisallowSetControllerRegistration> + disallow_controller, blink::ServiceWorkerStatusCode status, scoped_refptr<ServiceWorkerRegistration> registration) { // The job may have been canceled before this was invoked. if (JobWasCanceled()) return; - if (provider_host_) - provider_host_->SetAllowAssociation(true); - if (status != blink::ServiceWorkerStatusCode::kOk) { url_job_->FallbackToNetwork(); TRACE_EVENT_ASYNC_END1( @@ -400,12 +424,11 @@ context_->force_update_on_page_load(); if (need_to_update) { force_update_started_ = true; - provider_host_->SetAllowAssociation(false); context_->UpdateServiceWorker( registration.get(), true /* force_bypass_cache */, true /* skip_script_comparison */, base::BindOnce(&self::DidUpdateRegistration, weak_factory_.GetWeakPtr(), - registration)); + registration, std::move(disallow_controller))); return; } @@ -433,11 +456,11 @@ // Wait until it's activated before firing fetch events. if (active_version->status() == ServiceWorkerVersion::ACTIVATING) { - provider_host_->SetAllowAssociation(false); - registration->active_version()->RegisterStatusChangeCallback(base::BindOnce( - &ServiceWorkerControlleeRequestHandler:: - ContinueWithInScopeMainResourceRequest, - weak_factory_.GetWeakPtr(), registration, active_version)); + registration->active_version()->RegisterStatusChangeCallback( + base::BindOnce(&ServiceWorkerControlleeRequestHandler:: + ContinueWithInScopeMainResourceRequest, + weak_factory_.GetWeakPtr(), registration, active_version, + std::move(disallow_controller))); TRACE_EVENT_ASYNC_END1( "ServiceWorker", "ServiceWorkerControlleeRequestHandler::PrepareForMainResource", @@ -446,16 +469,16 @@ } ContinueWithInScopeMainResourceRequest(std::move(registration), - std::move(active_version)); + std::move(active_version), + std::move(disallow_controller)); } void ServiceWorkerControlleeRequestHandler:: ContinueWithInScopeMainResourceRequest( scoped_refptr<ServiceWorkerRegistration> registration, - scoped_refptr<ServiceWorkerVersion> active_version) { - if (provider_host_) - provider_host_->SetAllowAssociation(true); - + scoped_refptr<ServiceWorkerVersion> active_version, + std::unique_ptr<ScopedDisallowSetControllerRegistration> + disallow_controller) { // The job may have been canceled before this was invoked. In that // case, |url_job_| can't be used, so return. if (JobWasCanceled()) { @@ -507,6 +530,7 @@ return; } + disallow_controller.reset(); provider_host_->SetControllerRegistration( registration, false /* notify_controllerchange */); @@ -536,6 +560,8 @@ void ServiceWorkerControlleeRequestHandler::DidUpdateRegistration( const scoped_refptr<ServiceWorkerRegistration>& original_registration, + std::unique_ptr<ScopedDisallowSetControllerRegistration> + disallow_controller, blink::ServiceWorkerStatusCode status, const std::string& status_message, int64_t registration_id) { @@ -556,7 +582,8 @@ context_->storage()->FindRegistrationForDocument( stripped_url_, base::BindOnce(&self::DidLookupRegistrationForMainResource, - weak_factory_.GetWeakPtr())); + weak_factory_.GetWeakPtr(), + std::move(disallow_controller))); return; } DCHECK_EQ(original_registration->id(), registration_id); @@ -566,12 +593,14 @@ new_version->set_skip_waiting(true); new_version->RegisterStatusChangeCallback(base::BindOnce( &self::OnUpdatedVersionStatusChanged, weak_factory_.GetWeakPtr(), - original_registration, new_version)); + original_registration, new_version, std::move(disallow_controller))); } void ServiceWorkerControlleeRequestHandler::OnUpdatedVersionStatusChanged( const scoped_refptr<ServiceWorkerRegistration>& registration, - const scoped_refptr<ServiceWorkerVersion>& version) { + const scoped_refptr<ServiceWorkerVersion>& version, + std::unique_ptr<ScopedDisallowSetControllerRegistration> + disallow_controller) { // The job may have been canceled before this was invoked. if (JobWasCanceled()) return; @@ -588,12 +617,13 @@ context_->storage()->FindRegistrationForDocument( stripped_url_, base::BindOnce(&self::DidLookupRegistrationForMainResource, - weak_factory_.GetWeakPtr())); + weak_factory_.GetWeakPtr(), + std::move(disallow_controller))); return; } - version->RegisterStatusChangeCallback( - base::BindOnce(&self::OnUpdatedVersionStatusChanged, - weak_factory_.GetWeakPtr(), registration, version)); + version->RegisterStatusChangeCallback(base::BindOnce( + &self::OnUpdatedVersionStatusChanged, weak_factory_.GetWeakPtr(), + registration, version, std::move(disallow_controller))); } void ServiceWorkerControlleeRequestHandler::PrepareForSubResource() {
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.h b/content/browser/service_worker/service_worker_controllee_request_handler.h index ac25b8d..ad19d37 100644 --- a/content/browser/service_worker/service_worker_controllee_request_handler.h +++ b/content/browser/service_worker/service_worker_controllee_request_handler.h
@@ -86,28 +86,41 @@ base::Optional<SubresourceLoaderParams> MaybeCreateSubresourceLoaderParams() override; + // Exposed for testing. + ServiceWorkerURLJobWrapper* url_job() const { return url_job_.get(); } + private: FRIEND_TEST_ALL_PREFIXES(ServiceWorkerControlleeRequestHandlerTest, ActivateWaitingVersion); typedef ServiceWorkerControlleeRequestHandler self; + class ScopedDisallowSetControllerRegistration; + // For main resource case. void PrepareForMainResource(const GURL& url, const GURL& site_for_cookies); void DidLookupRegistrationForMainResource( + std::unique_ptr<ScopedDisallowSetControllerRegistration> + disallow_controller, blink::ServiceWorkerStatusCode status, scoped_refptr<ServiceWorkerRegistration> registration); void ContinueWithInScopeMainResourceRequest( scoped_refptr<ServiceWorkerRegistration> registration, - scoped_refptr<ServiceWorkerVersion> version); + scoped_refptr<ServiceWorkerVersion> version, + std::unique_ptr<ScopedDisallowSetControllerRegistration> + disallow_controller); void DidUpdateRegistration( const scoped_refptr<ServiceWorkerRegistration>& original_registration, + std::unique_ptr<ScopedDisallowSetControllerRegistration> + disallow_controller, blink::ServiceWorkerStatusCode status, const std::string& status_message, int64_t registration_id); void OnUpdatedVersionStatusChanged( const scoped_refptr<ServiceWorkerRegistration>& registration, - const scoped_refptr<ServiceWorkerVersion>& version); + const scoped_refptr<ServiceWorkerVersion>& version, + std::unique_ptr<ScopedDisallowSetControllerRegistration> + disallow_controller); // For sub resource case. void PrepareForSubResource();
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc index 54d82459..8a3941e2 100644 --- a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc +++ b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
@@ -11,6 +11,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/logging.h" #include "base/run_loop.h" +#include "base/test/scoped_feature_list.h" #include "components/offline_pages/buildflags/buildflags.h" #include "content/browser/service_worker/embedded_worker_test_helper.h" #include "content/browser/service_worker/service_worker_context_core.h" @@ -33,6 +34,7 @@ #include "services/network/public/cpp/resource_request_body.h" #include "services/network/public/mojom/request_context_frame_type.mojom.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h" namespace content { @@ -40,7 +42,8 @@ int kMockProviderId = 1; -class ServiceWorkerControlleeRequestHandlerTest : public testing::Test { +class ServiceWorkerControlleeRequestHandlerTest + : public testing::TestWithParam<bool> { public: class ServiceWorkerRequestTestResources { public: @@ -51,6 +54,7 @@ network::mojom::FetchRequestMode fetch_type = network::mojom::FetchRequestMode::kNoCORS) : test_(test), + resource_type_(type), request_(test->url_request_context_.CreateRequest( url, net::DEFAULT_PRIORITY, @@ -77,21 +81,57 @@ return static_cast<ServiceWorkerURLRequestJob*>(job_.get()); } + void MaybeCreateLoader() { + network::ResourceRequest resource_request; + resource_request.url = request_->url(); + resource_request.resource_type = resource_type_; + resource_request.headers = request()->extra_request_headers(); + handler_->MaybeCreateLoader( + resource_request, &test_->mock_resource_context_, + base::DoNothing()); + } + + ServiceWorkerURLJobWrapper* MaybeCreateJobWrapper() { + if (test_->IsServiceWorkerServicificationEnabled()) { + MaybeCreateLoader(); + return handler_->url_job(); + } else { + ServiceWorkerURLRequestJob* job = MaybeCreateJob(); + if (job) { + job_wrapper_ = + std::make_unique<ServiceWorkerURLJobWrapper>(job->GetWeakPtr()); + } + return job_wrapper_.get(); + } + } + void ResetHandler() { handler_.reset(nullptr); } net::URLRequest* request() const { return request_.get(); } private: ServiceWorkerControlleeRequestHandlerTest* test_; + const ResourceType resource_type_; std::unique_ptr<net::URLRequest> request_; std::unique_ptr<ServiceWorkerControlleeRequestHandler> handler_; + // |job_| and |job_wrapper_| are only for non-S13nServiceWorker cases. + // When S13nServiceWorker is enabled we use a job wrapper which is owned by + // |handler_|. std::unique_ptr<net::URLRequestJob> job_; + std::unique_ptr<ServiceWorkerURLJobWrapper> job_wrapper_; }; ServiceWorkerControlleeRequestHandlerTest() : browser_thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {} void SetUp() override { + if (IsServiceWorkerServicificationEnabled()) { + scoped_feature_list_.InitAndEnableFeature( + blink::features::kServiceWorkerServicification); + } else { + scoped_feature_list_.InitAndDisableFeature( + blink::features::kServiceWorkerServicification); + } SetUpWithHelper(new EmbeddedWorkerTestHelper(base::FilePath())); } @@ -144,7 +184,14 @@ host->info_->is_parent_frame_secure = is_secure; } + bool IsServiceWorkerServicificationEnabled() { return GetParam(); } + protected: + // |scoped_feature_list_| must be before |thread_bundle_|, since + // the thread bundle's destruction causes service worker-related + // objects to destruct, whose destructors need to know whether servicification + // is enabled. + base::test::ScopedFeatureList scoped_feature_list_; TestBrowserThreadBundle browser_thread_bundle_; std::unique_ptr<EmbeddedWorkerTestHelper> helper_; scoped_refptr<ServiceWorkerRegistration> registration_; @@ -170,7 +217,7 @@ } }; -TEST_F(ServiceWorkerControlleeRequestHandlerTest, DisallowServiceWorker) { +TEST_P(ServiceWorkerControlleeRequestHandlerTest, DisallowServiceWorker) { ServiceWorkerTestContentBrowserClient test_browser_client; ContentBrowserClient* old_browser_client = SetBrowserClientForTesting(&test_browser_client); @@ -187,7 +234,8 @@ // Conduct a main resource load. ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME); - ServiceWorkerURLRequestJob* sw_job = test_resources.MaybeCreateJob(); + ServiceWorkerURLJobWrapper* sw_job = test_resources.MaybeCreateJobWrapper(); + ASSERT_TRUE(sw_job); EXPECT_FALSE(sw_job->ShouldFallbackToNetwork()); EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker()); @@ -202,7 +250,7 @@ SetBrowserClientForTesting(old_browser_client); } -TEST_F(ServiceWorkerControlleeRequestHandlerTest, InsecureContext) { +TEST_P(ServiceWorkerControlleeRequestHandlerTest, InsecureContext) { // Store an activated worker. version_->set_fetch_handler_existence( ServiceWorkerVersion::FetchHandlerExistence::EXISTS); @@ -217,7 +265,8 @@ // Conduct a main resource load. ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME); - ServiceWorkerURLRequestJob* sw_job = test_resources.MaybeCreateJob(); + ServiceWorkerURLJobWrapper* sw_job = test_resources.MaybeCreateJobWrapper(); + ASSERT_TRUE(sw_job); EXPECT_FALSE(sw_job->ShouldFallbackToNetwork()); EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker()); @@ -230,7 +279,7 @@ EXPECT_FALSE(version_->HasControllee()); } -TEST_F(ServiceWorkerControlleeRequestHandlerTest, ActivateWaitingVersion) { +TEST_P(ServiceWorkerControlleeRequestHandlerTest, ActivateWaitingVersion) { // Store a registration that is installed but not activated yet. version_->set_fetch_handler_existence( ServiceWorkerVersion::FetchHandlerExistence::EXISTS); @@ -243,7 +292,8 @@ // Conduct a main resource load. ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME); - ServiceWorkerURLRequestJob* sw_job = test_resources.MaybeCreateJob(); + ServiceWorkerURLJobWrapper* sw_job = test_resources.MaybeCreateJobWrapper(); + ASSERT_TRUE(sw_job); EXPECT_FALSE(sw_job->ShouldFallbackToNetwork()); EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker()); @@ -251,19 +301,22 @@ base::RunLoop().RunUntilIdle(); - EXPECT_EQ(ServiceWorkerVersion::ACTIVATED, - version_->status()); + EXPECT_EQ(ServiceWorkerVersion::ACTIVATED, version_->status()); EXPECT_FALSE(sw_job->ShouldFallbackToNetwork()); EXPECT_TRUE(sw_job->ShouldForwardToServiceWorker()); EXPECT_TRUE(version_->HasControllee()); - // Navigations should trigger an update too. test_resources.ResetHandler(); - EXPECT_TRUE(version_->update_timer_.IsRunning()); + // Navigations should trigger an update too when S13nServiceWorker is + // disabled. Note that when S13nServiceWorker is enabled we defer scheduling + // update. See the comment on + // ServiceWorkerProviderHost::AddServiceWorkerToUpdate() for details. + if (!IsServiceWorkerServicificationEnabled()) + EXPECT_TRUE(version_->update_timer_.IsRunning()); } // Test that an installing registration is associated with a provider host. -TEST_F(ServiceWorkerControlleeRequestHandlerTest, InstallingRegistration) { +TEST_P(ServiceWorkerControlleeRequestHandlerTest, InstallingRegistration) { // Create an installing registration. version_->SetStatus(ServiceWorkerVersion::INSTALLING); version_->set_fetch_handler_existence( @@ -274,7 +327,7 @@ // Conduct a main resource load. ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME); - ServiceWorkerURLRequestJob* job = test_resources.MaybeCreateJob(); + ServiceWorkerURLJobWrapper* job = test_resources.MaybeCreateJobWrapper(); base::RunLoop().RunUntilIdle(); @@ -289,7 +342,7 @@ } // Test to not regress crbug/414118. -TEST_F(ServiceWorkerControlleeRequestHandlerTest, DeletedProviderHost) { +TEST_P(ServiceWorkerControlleeRequestHandlerTest, DeletedProviderHost) { // Store a registration so the call to FindRegistrationForDocument will read // from the database. version_->set_fetch_handler_existence( @@ -305,7 +358,8 @@ // Conduct a main resource load. ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME); - ServiceWorkerURLRequestJob* sw_job = test_resources.MaybeCreateJob(); + ServiceWorkerURLJobWrapper* sw_job = test_resources.MaybeCreateJobWrapper(); + ASSERT_TRUE(sw_job); EXPECT_FALSE(sw_job->ShouldFallbackToNetwork()); EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker()); @@ -323,7 +377,14 @@ // Tests the scenario where a controllee request handler was created // for a subresource request, but before MaybeCreateJob() is run, the // controller/active version becomes null. -TEST_F(ServiceWorkerControlleeRequestHandlerTest, LostActiveVersion) { +TEST_P(ServiceWorkerControlleeRequestHandlerTest, LostActiveVersion) { + // Skip this test when S13nServiceWorker is enabled because we don't use + // ServiceWorkerControlleeRequestHandler for subresource loading. + // TODO(bashi): Add a test in ServiceWorkerProviderHost to cover this + // scenario when S13nServiceWorker is enabled. + if (IsServiceWorkerServicificationEnabled()) + return; + // Store an activated worker. version_->set_fetch_handler_existence( ServiceWorkerVersion::FetchHandlerExistence::EXISTS); @@ -358,7 +419,14 @@ sub_job->response_type_); } -TEST_F(ServiceWorkerControlleeRequestHandlerTest, FallbackWithNoFetchHandler) { +TEST_P(ServiceWorkerControlleeRequestHandlerTest, FallbackWithNoFetchHandler) { + // Skip this test when S13nServiceWorker is enabled because we don't use + // ServiceWorkerControlleeRequestHandler for subresource loading. + // TODO(bashi): Add a test in ServiceWorkerProviderHost to cover this + // scenario when S13nServiceWorker is enabled. + if (IsServiceWorkerServicificationEnabled()) + return; + version_->set_fetch_handler_existence( ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST); version_->SetStatus(ServiceWorkerVersion::ACTIVATED); @@ -408,7 +476,7 @@ } #if BUILDFLAG(ENABLE_OFFLINE_PAGES) -TEST_F(ServiceWorkerControlleeRequestHandlerTest, FallbackWithOfflineHeader) { +TEST_P(ServiceWorkerControlleeRequestHandlerTest, FallbackWithOfflineHeader) { version_->set_fetch_handler_existence( ServiceWorkerVersion::FetchHandlerExistence::EXISTS); version_->SetStatus(ServiceWorkerVersion::ACTIVATED); @@ -424,12 +492,12 @@ // Sets an offline header to indicate force loading offline page. test_resources.request()->SetExtraRequestHeaderByName( "X-Chrome-offline", "reason=download", true); - ServiceWorkerURLRequestJob* sw_job = test_resources.MaybeCreateJob(); + ServiceWorkerURLJobWrapper* sw_job = test_resources.MaybeCreateJobWrapper(); EXPECT_FALSE(sw_job); } -TEST_F(ServiceWorkerControlleeRequestHandlerTest, FallbackWithNoOfflineHeader) { +TEST_P(ServiceWorkerControlleeRequestHandlerTest, FallbackWithNoOfflineHeader) { version_->set_fetch_handler_existence( ServiceWorkerVersion::FetchHandlerExistence::EXISTS); version_->SetStatus(ServiceWorkerVersion::ACTIVATED); @@ -445,11 +513,15 @@ // Empty offline header value should not cause fallback. test_resources.request()->SetExtraRequestHeaderByName("X-Chrome-offline", "", true); - ServiceWorkerURLRequestJob* sw_job = test_resources.MaybeCreateJob(); + ServiceWorkerURLJobWrapper* sw_job = test_resources.MaybeCreateJobWrapper(); EXPECT_TRUE(sw_job); } -#endif // BUILDFLAG(ENABLE_OFFLINE_PAGE +#endif // BUILDFLAG(ENABLE_OFFLINE_PAGE) + +INSTANTIATE_TEST_CASE_P(IsServiceWorkerServicificationEnabled, + ServiceWorkerControlleeRequestHandlerTest, + ::testing::Bool();); } // namespace service_worker_controllee_request_handler_unittest } // namespace content
diff --git a/content/browser/service_worker/service_worker_navigation_loader.cc b/content/browser/service_worker/service_worker_navigation_loader.cc index 24fa5a69..dbe84cc 100644 --- a/content/browser/service_worker/service_worker_navigation_loader.cc +++ b/content/browser/service_worker/service_worker_navigation_loader.cc
@@ -141,6 +141,10 @@ return response_type_ == ResponseType::FALLBACK_TO_NETWORK; } +bool ServiceWorkerNavigationLoader::ShouldForwardToServiceWorker() { + return response_type_ == ResponseType::FORWARD_TO_SERVICE_WORKER; +} + bool ServiceWorkerNavigationLoader::WasCanceled() const { return status_ == Status::kCancelled; }
diff --git a/content/browser/service_worker/service_worker_navigation_loader.h b/content/browser/service_worker/service_worker_navigation_loader.h index b394801..5b227c7 100644 --- a/content/browser/service_worker/service_worker_navigation_loader.h +++ b/content/browser/service_worker/service_worker_navigation_loader.h
@@ -87,6 +87,7 @@ void FallbackToNetwork(); void ForwardToServiceWorker(); bool ShouldFallbackToNetwork(); + bool ShouldForwardToServiceWorker(); bool WasCanceled() const; // The navigation request that was holding this job is
diff --git a/content/browser/service_worker/service_worker_object_host.cc b/content/browser/service_worker/service_worker_object_host.cc index cd4f6ea5..ff931e40 100644 --- a/content/browser/service_worker/service_worker_object_host.cc +++ b/content/browser/service_worker/service_worker_object_host.cc
@@ -18,6 +18,8 @@ namespace { +const int kMaxDebugLogSize = 256; + using StatusCallback = base::OnceCallback<void(blink::ServiceWorkerStatusCode)>; using PrepareExtendableMessageEventCallback = base::OnceCallback<bool(mojom::ExtendableMessageEventPtr*)>; @@ -190,21 +192,39 @@ : context_(context), provider_host_(provider_host), provider_origin_(url::Origin::Create(provider_host->document_url())), + provider_type_(provider_host->provider_type()), version_(std::move(version)), weak_ptr_factory_(this) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); DCHECK(context_ && provider_host_ && version_); DCHECK(context_->GetLiveRegistration(version_->registration_id())); version_->AddObserver(this); + AddToDebugLog(base::StringPrintf("ObjCtor:prov=%p,type=%d,this=%p", + provider_host_, provider_type_, this)); bindings_.set_connection_error_handler(base::BindRepeating( &ServiceWorkerObjectHost::OnConnectionError, base::Unretained(this))); } ServiceWorkerObjectHost::~ServiceWorkerObjectHost() { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + // TODO(crbug.com/838410): These CHECKs are temporary debugging for the linked + // bug. + AddToDebugLog(base::StringPrintf("ObjDtor:prov=%p,type=%d,this=%p", + provider_host_, provider_type_, this)); + CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); + if (in_dtor_) { + CrashOnDoubleDelete(); + return; + } + in_dtor_ = true; version_->RemoveObserver(this); } +void ServiceWorkerObjectHost::CrashOnDoubleDelete() { + std::string log = ServiceWorkerObjectHost::GetDebugLogString(); + DEBUG_ALIAS_FOR_CSTR(debug_log, log.c_str(), 2048); + CHECK(false); +} + void ServiceWorkerObjectHost::OnVersionStateChanged( ServiceWorkerVersion* version) { DCHECK(version); @@ -314,7 +334,34 @@ if (!bindings_.empty()) return; // Will destroy |this|. + AddToDebugLog(base::StringPrintf("HostErr:this=%p", this)); provider_host_->RemoveServiceWorkerObjectHost(version_->version_id()); } +// static +ServiceWorkerObjectHost::DebugLog* +ServiceWorkerObjectHost::GetDebugLogInstance() { + static base::NoDestructor<DebugLog> g_log; + return g_log.get(); +} + +// static +void ServiceWorkerObjectHost::AddToDebugLog(const std::string& event) { + DebugLog* log = GetDebugLogInstance(); + log->push_back(event); + if (log->size() > kMaxDebugLogSize) + log->pop_front(); +} + +// static +std::string ServiceWorkerObjectHost::GetDebugLogString() { + DebugLog* log = GetDebugLogInstance(); + std::string result; + // Traverse from the end so if the string gets truncated we still + // have the most recent events. + for (auto iter = log->rbegin(); iter != log->rend(); ++iter) + result += *iter + "\n"; + return result; +} + } // namespace content
diff --git a/content/browser/service_worker/service_worker_object_host.h b/content/browser/service_worker/service_worker_object_host.h index 0c43f3a..4d512c7 100644 --- a/content/browser/service_worker/service_worker_object_host.h +++ b/content/browser/service_worker/service_worker_object_host.h
@@ -7,9 +7,11 @@ #include <memory> +#include "base/containers/circular_deque.h" #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" +#include "base/no_destructor.h" #include "content/browser/service_worker/service_worker_version.h" #include "content/common/content_export.h" #include "content/common/service_worker/service_worker_types.h" @@ -46,6 +48,8 @@ scoped_refptr<ServiceWorkerVersion> version); ~ServiceWorkerObjectHost() override; + void CrashOnDoubleDelete(); + // ServiceWorkerVersion::Observer overrides. void OnVersionStateChanged(ServiceWorkerVersion* version) override; @@ -82,6 +86,12 @@ base::WeakPtr<ServiceWorkerObjectHost> AsWeakPtr(); + // TODO(crbug.com/838410): Instrumentation for the linked bug. + using DebugLog = base::circular_deque<std::string>; + static DebugLog* GetDebugLogInstance(); + static void AddToDebugLog(const std::string& event); + static std::string GetDebugLogString(); + private: friend class service_worker_object_host_unittest::ServiceWorkerObjectHostTest; @@ -108,6 +118,7 @@ // don't expect that context to change origins and still hold on to the // object. const url::Origin provider_origin_; + const blink::mojom::ServiceWorkerProviderType provider_type_; scoped_refptr<ServiceWorkerVersion> version_; // Typically both |bindings_| and |remote_objects_| contain only one Mojo // connection, corresponding to the content::WebServiceWorkerImpl in the @@ -120,6 +131,9 @@ mojo::AssociatedInterfacePtrSet<blink::mojom::ServiceWorkerObject> remote_objects_; + // TODO(crbug.com/838410): Temporary debugging for the linked bug. + bool in_dtor_ = false; + base::WeakPtrFactory<ServiceWorkerObjectHost> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(ServiceWorkerObjectHost);
diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc index 87824a9..0c7af212 100644 --- a/content/browser/service_worker/service_worker_provider_host.cc +++ b/content/browser/service_worker/service_worker_provider_host.cc
@@ -268,7 +268,6 @@ render_thread_id_(kDocumentMainThreadId), info_(std::move(info)), context_(context), - allow_association_(true), binding_(this), interface_provider_binding_(this) { DCHECK_NE(blink::mojom::ServiceWorkerProviderType::kUnknown, info_->type); @@ -297,7 +296,18 @@ } ServiceWorkerProviderHost::~ServiceWorkerProviderHost() { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + // TODO(crbug.com/838410): The CHECKs are temporary debugging for the linked + // bug. + CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); + CHECK(!in_dtor_); + in_dtor_ = true; + + if (!service_worker_object_hosts_.empty()) { + // Just log when hosts isn't empty. It'd be too noisy to record all provider + // ctor/dtor otherwise. + ServiceWorkerObjectHost::AddToDebugLog( + base::StringPrintf("ProvDtor:prov=%p,type=%d", this, info_->type)); + } if (context_) context_->UnregisterProviderHostByClientID(client_uuid_); @@ -500,7 +510,6 @@ if (controller_registration) { CHECK(IsContextSecureForServiceWorker()); - DCHECK(allow_association_); DCHECK(controller_registration->active_version()); #if DCHECK_IS_ON() DCHECK(IsMatchingRegistration(controller_registration.get())); @@ -559,8 +568,8 @@ void ServiceWorkerProviderHost::RemoveServiceWorkerObjectHost( int64_t version_id) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - DCHECK(base::ContainsKey(service_worker_object_hosts_, version_id)); + CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); + CHECK(base::ContainsKey(service_worker_object_hosts_, version_id)); service_worker_object_hosts_.erase(version_id); } @@ -688,8 +697,9 @@ } // TODO(crbug.com/866353): It shouldn't be necesary to check - // |allow_association_|. See the comment for SetAllowAssociation(). - if (allow_association_) + // |allow_set_controller_registration_|. See the comment for + // AllowSetControllerRegistration(). + if (allow_set_controller_registration_) SetControllerRegistration(registration, true /* notify_controllerchange */); }
diff --git a/content/browser/service_worker/service_worker_provider_host.h b/content/browser/service_worker/service_worker_provider_host.h index a6906b6b..1ccc838f 100644 --- a/content/browser/service_worker/service_worker_provider_host.h +++ b/content/browser/service_worker/service_worker_provider_host.h
@@ -296,6 +296,22 @@ scoped_refptr<ServiceWorkerRegistration> controller_registration, bool notify_controllerchange); + // For use by the ServiceWorkerControlleeRequestHandler to disallow a + // registration claiming this host while its main resource request is + // occurring. + // + // TODO(crbug.com/866353): This should be unneccessary: registration code + // already avoids claiming clients that are not execution ready. However + // there may be edge cases with shared workers (pre-NetS13nServiceWorker) and + // about:blank iframes, since |is_execution_ready_| is initialized true for + // them. Try to remove this after S13nServiceWorker. + void AllowSetControllerRegistration(bool allow) { + allow_set_controller_registration_ = allow; + } + bool IsSetControllerRegistrationAllowed() { + return allow_set_controller_registration_; + } + // Returns a handler for a request. May return nullptr if the request doesn't // require special handling. std::unique_ptr<ServiceWorkerRequestHandler> CreateRequestHandler( @@ -332,17 +348,6 @@ base::WeakPtr<ServiceWorkerObjectHost> GetOrCreateServiceWorkerObjectHost( scoped_refptr<ServiceWorkerVersion> version); - // For use by the ServiceWorkerControlleeRequestHandler to disallow a - // registration claiming this host while its main resource request is - // occurring. - // - // TODO(crbug.com/866353): This should be unneccessary: registration code - // already avoids claiming clients that are not execution ready. However - // there may be edge cases with shared workers (pre-NetS13nServiceWorker) and - // about:blank iframes, since |is_execution_ready_| is initialized true for - // them. Try to remove this after S13nServiceWorker. - void SetAllowAssociation(bool allow) { allow_association_ = allow; } - // Returns true if the context referred to by this host (i.e. |context_|) is // still alive. bool IsContextAlive(); @@ -645,6 +650,7 @@ // the provider host's controller is updated to match it. scoped_refptr<ServiceWorkerVersion> controller_; scoped_refptr<ServiceWorkerRegistration> controller_registration_; + bool allow_set_controller_registration_ = true; // For service worker execution contexts. The ServiceWorkerVersion of the // service worker this is a provider for. This is nullptr if the service @@ -654,8 +660,6 @@ base::WeakPtr<ServiceWorkerContextCore> context_; - bool allow_association_; - // |container_| is the Mojo endpoint to the renderer-side // ServiceWorkerContainer that |this| is a ServiceWorkerContainerHost for. mojom::ServiceWorkerContainerAssociatedPtr container_; @@ -688,6 +692,9 @@ // redirects. bool is_execution_ready_ = false; + // TODO(crbug.com/838410): Temporary debugging for the linked bug. + bool in_dtor_ = false; + // For service worker clients. The service workers in the chain of redirects // during the main resource request for this client. These workers should be // updated "soon". See AddServiceWorkerToUpdate() documentation.
diff --git a/content/browser/service_worker/service_worker_url_job_wrapper.cc b/content/browser/service_worker/service_worker_url_job_wrapper.cc index 52fc1fc8..eaf770d 100644 --- a/content/browser/service_worker/service_worker_url_job_wrapper.cc +++ b/content/browser/service_worker/service_worker_url_job_wrapper.cc
@@ -64,6 +64,14 @@ } } +bool ServiceWorkerURLJobWrapper::ShouldForwardToServiceWorker() { + if (url_loader_job_) { + return url_loader_job_->ShouldForwardToServiceWorker(); + } else { + return url_request_job_->ShouldForwardToServiceWorker(); + } +} + void ServiceWorkerURLJobWrapper::FailDueToLostController() { // This function is only called for subresource requests, so it can't // be called for |url_loader_job_|, which is for navigations.
diff --git a/content/browser/service_worker/service_worker_url_job_wrapper.h b/content/browser/service_worker/service_worker_url_job_wrapper.h index acaf609c..1bceeff 100644 --- a/content/browser/service_worker/service_worker_url_job_wrapper.h +++ b/content/browser/service_worker/service_worker_url_job_wrapper.h
@@ -22,7 +22,7 @@ // non-S13nServiceWorker). It wraps either a // ServiceWorkerURLRequestJob or a callback for URLLoader and forwards to the // underlying implementation. -class ServiceWorkerURLJobWrapper { +class CONTENT_EXPORT ServiceWorkerURLJobWrapper { public: // A helper used by the ServiceWorkerNavigationLoader or // ServiceWorkerURLRequestJob. @@ -72,6 +72,9 @@ // instead should fallback to the network. bool ShouldFallbackToNetwork(); + // Returns true if this job should be forwarded to a service worker. + bool ShouldForwardToServiceWorker(); + // Tells the job to abort with a start error. Currently this is only called // because the controller was lost. This function could be made more generic // if needed later.
diff --git a/content/browser/storage_partition_impl_unittest.cc b/content/browser/storage_partition_impl_unittest.cc index 2a3c801..ec8d0e0 100644 --- a/content/browser/storage_partition_impl_unittest.cc +++ b/content/browser/storage_partition_impl_unittest.cc
@@ -293,10 +293,9 @@ } void AddEntry(GURL url, url::Origin origin, const std::string& data) { - scoped_refptr<net::IOBufferWithSize> buffer( - new net::IOBufferWithSize(data.length())); - memcpy(buffer->data(), data.c_str(), data.length()); - code_cache_context_->generated_code_cache()->WriteData(url, origin, buffer); + std::vector<uint8_t> data_vector(data.begin(), data.end()); + code_cache_context_->generated_code_cache()->WriteData( + url, origin, base::Time(), data_vector); base::RunLoop().RunUntilIdle(); }
diff --git a/content/browser/web_package/signed_exchange_handler_unittest.cc b/content/browser/web_package/signed_exchange_handler_unittest.cc index 54a648f..d41021f 100644 --- a/content/browser/web_package/signed_exchange_handler_unittest.cc +++ b/content/browser/web_package/signed_exchange_handler_unittest.cc
@@ -48,7 +48,12 @@ // "wildcard_example.org.public.pem.cbor" has these dummy data in "ocsp" and // "sct" fields. constexpr base::StringPiece kDummyOCSPDer = "OCSP"; -constexpr base::StringPiece kDummySCTList = "SCT"; +constexpr char kDummySCTBytes[] = { + 0x00, 0x05, // Length of the sct list + 0x00, 0x03, 'S', 'C', 'T' // List entry: length and body +}; +constexpr base::StringPiece kDummySCTList(kDummySCTBytes, + sizeof(kDummySCTBytes)); std::string GetTestFileContents(base::StringPiece name) { base::FilePath path;
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index ab2d05c..6f5491e2 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -266,6 +266,10 @@ base::FeatureList::IsEnabled(features::kFontCacheScaling)); WebRuntimeFeatures::EnableFeatureFromString( + "FontSrcLocalMatching", + base::FeatureList::IsEnabled(features::kFontSrcLocalMatching)); + + WebRuntimeFeatures::EnableFeatureFromString( "FramebustingNeedsSameOriginOrUserGesture", base::FeatureList::IsEnabled( features::kFramebustingNeedsSameOriginOrUserGesture));
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn index cf983f0..ffe38296 100644 --- a/content/common/BUILD.gn +++ b/content/common/BUILD.gn
@@ -210,6 +210,10 @@ "media/midi_messages.h", "media/peer_connection_tracker_messages.h", "media/video_capture.h", + "mime_sniffing_throttle.cc", + "mime_sniffing_throttle.h", + "mime_sniffing_url_loader.cc", + "mime_sniffing_url_loader.h", "navigation_gesture.h", "navigation_params.cc", "navigation_params.h",
diff --git a/content/common/DEPS b/content/common/DEPS index 03fa018..5f9362d 100644 --- a/content/common/DEPS +++ b/content/common/DEPS
@@ -84,3 +84,8 @@ "+third_party/blink/public/web/web_triggering_event_info.h", "+third_party/blink/public/web/win/web_font_rendering.h", ] +specific_include_rules = { + '.*_unittest.*': [ + "+services/network/test", + ] +}
diff --git a/content/common/mime_sniffing_throttle.cc b/content/common/mime_sniffing_throttle.cc new file mode 100644 index 0000000..dfeabde --- /dev/null +++ b/content/common/mime_sniffing_throttle.cc
@@ -0,0 +1,60 @@ +// 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. + +#include "content/common/mime_sniffing_throttle.h" + +#include "content/common/mime_sniffing_url_loader.h" +#include "net/base/mime_sniffer.h" + +namespace content { + +MimeSniffingThrottle::MimeSniffingThrottle() : weak_factory_(this) {} + +MimeSniffingThrottle::~MimeSniffingThrottle() = default; + +void MimeSniffingThrottle::WillProcessResponse( + const GURL& response_url, + const network::ResourceResponseHead& response_head, + bool* defer) { + // No need to do mime sniffing again. + if (response_head.did_mime_sniff) + return; + + bool blocked_sniffing_mime = false; + std::string content_type_options; + if (response_head.headers && + response_head.headers->GetNormalizedHeader("x-content-type-options", + &content_type_options)) { + blocked_sniffing_mime = + base::LowerCaseEqualsASCII(content_type_options, "nosniff"); + } + + if (!blocked_sniffing_mime && + net::ShouldSniffMimeType(response_url, response_head.mime_type)) { + // Pause the response until the mime type becomes ready. + *defer = true; + + network::mojom::URLLoaderPtr new_loader; + network::mojom::URLLoaderClientRequest new_loader_request; + network::mojom::URLLoaderPtr source_loader; + network::mojom::URLLoaderClientRequest source_client_request; + MimeSniffingURLLoader* mime_sniffing_loader; + std::tie(new_loader, new_loader_request, mime_sniffing_loader) = + MimeSniffingURLLoader::CreateLoader(weak_factory_.GetWeakPtr(), + response_url, response_head); + delegate_->InterceptResponse(std::move(new_loader), + std::move(new_loader_request), &source_loader, + &source_client_request); + mime_sniffing_loader->Start(std::move(source_loader), + std::move(source_client_request)); + } +} + +void MimeSniffingThrottle::ResumeWithNewResponseHead( + const network::ResourceResponseHead& new_response_head) { + delegate_->UpdateDeferredResponseHead(new_response_head); + delegate_->Resume(); +} + +} // namespace content
diff --git a/content/common/mime_sniffing_throttle.h b/content/common/mime_sniffing_throttle.h new file mode 100644 index 0000000..f8f35189 --- /dev/null +++ b/content/common/mime_sniffing_throttle.h
@@ -0,0 +1,36 @@ +// 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. + +#ifndef CONTENT_COMMON_MIME_SNIFFING_THROTTLE_H_ +#define CONTENT_COMMON_MIME_SNIFFING_THROTTLE_H_ + +#include "base/memory/weak_ptr.h" +#include "content/common/content_export.h" +#include "content/public/common/url_loader_throttle.h" + +namespace content { + +// Throttle for mime type sniffing. This may intercept the request and +// modify the response's mime type in the response head. +class CONTENT_EXPORT MimeSniffingThrottle : public URLLoaderThrottle { + public: + MimeSniffingThrottle(); + ~MimeSniffingThrottle() override; + + // Implements URLLoaderThrottle. + void WillProcessResponse(const GURL& response_url, + const network::ResourceResponseHead& response_head, + bool* defer) override; + + // Called from MimeSniffingURLLoader once mime type is ready. + void ResumeWithNewResponseHead( + const network::ResourceResponseHead& new_response_head); + + private: + base::WeakPtrFactory<MimeSniffingThrottle> weak_factory_; +}; + +} // namespace content + +#endif // CONTENT_COMMON_MIME_SNIFFING_THROTTLE_H_
diff --git a/content/common/mime_sniffing_throttle_unittest.cc b/content/common/mime_sniffing_throttle_unittest.cc new file mode 100644 index 0000000..0e61e99 --- /dev/null +++ b/content/common/mime_sniffing_throttle_unittest.cc
@@ -0,0 +1,429 @@ +// 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. + +#include "content/common/mime_sniffing_throttle.h" + +#include <memory> + +#include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" +#include "content/common/mime_sniffing_url_loader.h" +#include "content/public/common/url_loader_throttle.h" +#include "mojo/public/cpp/system/data_pipe_utils.h" +#include "services/network/test/test_url_loader_client.h" +#include "services/network/test/test_url_loader_factory.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace content { + +namespace { + +class MojoDataPipeSender { + public: + MojoDataPipeSender(mojo::ScopedDataPipeProducerHandle handle) + : handle_(std::move(handle)), + watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC) {} + + void Start(std::string data, base::OnceClosure done_callback) { + data_ = std::move(data); + done_callback_ = std::move(done_callback); + watcher_.Watch(handle_.get(), + MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, + base::BindRepeating(&MojoDataPipeSender::OnWritable, + base::Unretained(this))); + } + + void OnWritable(MojoResult) { + uint32_t sending_bytes = data_.size() - sent_bytes_; + MojoResult result = handle_->WriteData( + data_.c_str() + sent_bytes_, &sending_bytes, MOJO_WRITE_DATA_FLAG_NONE); + switch (result) { + case MOJO_RESULT_OK: + break; + case MOJO_RESULT_FAILED_PRECONDITION: + // Finished unexpectedly. + std::move(done_callback_).Run(); + return; + case MOJO_RESULT_SHOULD_WAIT: + // Just wait until OnWritable() is called by the watcher. + return; + default: + NOTREACHED(); + return; + } + sent_bytes_ += sending_bytes; + if (data_.size() == sent_bytes_) + std::move(done_callback_).Run(); + } + + mojo::ScopedDataPipeProducerHandle ReleaseHandle() { + return std::move(handle_); + } + + bool has_succeeded() const { return data_.size() == sent_bytes_; } + + private: + mojo::ScopedDataPipeProducerHandle handle_; + mojo::SimpleWatcher watcher_; + base::OnceClosure done_callback_; + std::string data_; + uint32_t sent_bytes_ = 0; +}; + +class MockDelegate : public URLLoaderThrottle::Delegate { + public: + // Implements URLLoaderThrottle::Delegate. + void CancelWithError(int error_code, + base::StringPiece custom_reason) override { + NOTIMPLEMENTED(); + } + void Resume() override { + is_resumed_ = true; + // Resume from OnReceiveResponse() with a customized response header. + destination_loader_client()->OnReceiveResponse( + updated_response_head().value()); + } + + void SetPriority(net::RequestPriority priority) override { NOTIMPLEMENTED(); } + void UpdateDeferredResponseHead( + const network::ResourceResponseHead& new_response_head) override { + updated_response_head_ = new_response_head; + } + void PauseReadingBodyFromNet() override { NOTIMPLEMENTED(); } + void ResumeReadingBodyFromNet() override { NOTIMPLEMENTED(); } + void InterceptResponse( + network::mojom::URLLoaderPtr new_loader, + network::mojom::URLLoaderClientRequest new_client_request, + network::mojom::URLLoaderPtr* original_loader, + network::mojom::URLLoaderClientRequest* original_client_request) + override { + is_intercepted_ = true; + + destination_loader_ptr_ = std::move(new_loader); + ASSERT_TRUE(mojo::FuseInterface( + std::move(new_client_request), + destination_loader_client_.CreateInterfacePtr().PassInterface())); + source_loader_request_ = mojo::MakeRequest(original_loader); + *original_client_request = mojo::MakeRequest(&source_loader_client_ptr_); + } + + void LoadResponseBody(const std::string& body) { + if (!source_body_handle_.is_valid()) { + // Send OnStartLoadingResponseBody() if it's the first call. + mojo::ScopedDataPipeConsumerHandle consumer; + EXPECT_EQ(MOJO_RESULT_OK, + mojo::CreateDataPipe(nullptr, &source_body_handle_, &consumer)); + source_loader_client()->OnStartLoadingResponseBody(std::move(consumer)); + } + + MojoDataPipeSender sender(std::move(source_body_handle_)); + base::RunLoop loop; + sender.Start(body, loop.QuitClosure()); + loop.Run(); + + EXPECT_TRUE(sender.has_succeeded()); + source_body_handle_ = sender.ReleaseHandle(); + } + + void CompleteResponse() { + source_loader_client()->OnComplete(network::URLLoaderCompletionStatus()); + source_body_handle_.reset(); + } + + uint32_t ReadResponseBody(uint32_t size) { + std::vector<uint8_t> buffer(size); + MojoResult result = destination_loader_client_.response_body().ReadData( + buffer.data(), &size, MOJO_READ_DATA_FLAG_NONE); + switch (result) { + case MOJO_RESULT_OK: + return size; + case MOJO_RESULT_FAILED_PRECONDITION: + return 0; + case MOJO_RESULT_SHOULD_WAIT: + return 0; + default: + NOTREACHED(); + } + return 0; + } + + bool is_intercepted() const { return is_intercepted_; } + bool is_resumed() const { return is_resumed_; } + + const base::Optional<network::ResourceResponseHead>& updated_response_head() + const { + return updated_response_head_; + } + + network::TestURLLoaderClient* destination_loader_client() { + return &destination_loader_client_; + } + + network::mojom::URLLoaderClient* source_loader_client() { + return source_loader_client_ptr_.get(); + } + + private: + bool is_intercepted_ = false; + bool is_resumed_ = false; + base::Optional<network::ResourceResponseHead> updated_response_head_; + + // A pair of a loader and a loader client for destination of the response. + network::mojom::URLLoaderPtr destination_loader_ptr_; + network::TestURLLoaderClient destination_loader_client_; + + // A pair of a loader and a loader client for source of the response. + network::mojom::URLLoaderClientPtr source_loader_client_ptr_; + network::mojom::URLLoaderRequest source_loader_request_; + + mojo::ScopedDataPipeProducerHandle source_body_handle_; +}; + +} // namespace + +class MimeSniffingThrottleTest : public testing::Test { + protected: + // Be the first member so it is destroyed last. + base::test::ScopedTaskEnvironment scoped_task_environment_; +}; + +TEST_F(MimeSniffingThrottleTest, NoMimeTypeWithSniffableScheme) { + auto throttle = std::make_unique<MimeSniffingThrottle>(); + auto delegate = std::make_unique<MockDelegate>(); + throttle->set_delegate(delegate.get()); + + network::ResourceResponseHead response_head; + bool defer = false; + throttle->WillProcessResponse(GURL("https://example.com"), response_head, + &defer); + EXPECT_TRUE(defer); + EXPECT_TRUE(delegate->is_intercepted()); +} + +TEST_F(MimeSniffingThrottleTest, SniffableMimeTypeWithSniffableScheme) { + auto throttle = std::make_unique<MimeSniffingThrottle>(); + auto delegate = std::make_unique<MockDelegate>(); + throttle->set_delegate(delegate.get()); + + network::ResourceResponseHead response_head; + response_head.mime_type = "text/plain"; + bool defer = false; + throttle->WillProcessResponse(GURL("https://example.com"), response_head, + &defer); + EXPECT_TRUE(defer); + EXPECT_TRUE(delegate->is_intercepted()); +} + +TEST_F(MimeSniffingThrottleTest, NotSniffableMimeTypeWithSniffableScheme) { + auto throttle = std::make_unique<MimeSniffingThrottle>(); + auto delegate = std::make_unique<MockDelegate>(); + throttle->set_delegate(delegate.get()); + + network::ResourceResponseHead response_head; + response_head.mime_type = "text/javascript"; + bool defer = false; + throttle->WillProcessResponse(GURL("https://example.com"), response_head, + &defer); + EXPECT_FALSE(defer); + EXPECT_FALSE(delegate->is_intercepted()); +} + +TEST_F(MimeSniffingThrottleTest, NoMimeTypeWithNotSniffableScheme) { + auto throttle = std::make_unique<MimeSniffingThrottle>(); + auto delegate = std::make_unique<MockDelegate>(); + throttle->set_delegate(delegate.get()); + + network::ResourceResponseHead response_head; + bool defer = false; + throttle->WillProcessResponse(GURL("wss://example.com"), response_head, + &defer); + EXPECT_FALSE(defer); + EXPECT_FALSE(delegate->is_intercepted()); +} + +TEST_F(MimeSniffingThrottleTest, SniffableMimeTypeWithNotSniffableScheme) { + auto throttle = std::make_unique<MimeSniffingThrottle>(); + auto delegate = std::make_unique<MockDelegate>(); + throttle->set_delegate(delegate.get()); + + network::ResourceResponseHead response_head; + response_head.mime_type = "text/plain"; + bool defer = false; + throttle->WillProcessResponse(GURL("wss://example.com"), response_head, + &defer); + EXPECT_FALSE(defer); + EXPECT_FALSE(delegate->is_intercepted()); +} + +TEST_F(MimeSniffingThrottleTest, NotSniffableMimeTypeWithNotSniffableScheme) { + auto throttle = std::make_unique<MimeSniffingThrottle>(); + auto delegate = std::make_unique<MockDelegate>(); + throttle->set_delegate(delegate.get()); + + network::ResourceResponseHead response_head; + response_head.mime_type = "text/javascript"; + bool defer = false; + throttle->WillProcessResponse(GURL("wss://example.com"), response_head, + &defer); + EXPECT_FALSE(defer); + EXPECT_FALSE(delegate->is_intercepted()); +} + +TEST_F(MimeSniffingThrottleTest, SniffableButAlreadySniffed) { + auto throttle = std::make_unique<MimeSniffingThrottle>(); + auto delegate = std::make_unique<MockDelegate>(); + throttle->set_delegate(delegate.get()); + + network::ResourceResponseHead response_head; + response_head.mime_type = "text/plain"; + response_head.did_mime_sniff = true; + bool defer = false; + throttle->WillProcessResponse(GURL("https://example.com"), response_head, + &defer); + EXPECT_FALSE(defer); + EXPECT_FALSE(delegate->is_intercepted()); +} + +TEST_F(MimeSniffingThrottleTest, NoBody) { + auto throttle = std::make_unique<MimeSniffingThrottle>(); + auto delegate = std::make_unique<MockDelegate>(); + throttle->set_delegate(delegate.get()); + + GURL response_url("https://example.com"); + network::ResourceResponseHead response_head; + bool defer = false; + throttle->WillProcessResponse(response_url, response_head, &defer); + EXPECT_TRUE(defer); + EXPECT_TRUE(delegate->is_intercepted()); + + // Call OnComplete() without sending body. + delegate->source_loader_client()->OnComplete( + network::URLLoaderCompletionStatus()); + delegate->destination_loader_client()->RunUntilComplete(); + + // The mime type should be updated to the default mime type ("text/plain"). + EXPECT_TRUE(delegate->destination_loader_client()->has_received_response()); + EXPECT_EQ("text/plain", + delegate->destination_loader_client()->response_head().mime_type); +} + +TEST_F(MimeSniffingThrottleTest, Body_PlainText) { + auto throttle = std::make_unique<MimeSniffingThrottle>(); + auto delegate = std::make_unique<MockDelegate>(); + throttle->set_delegate(delegate.get()); + + GURL response_url("https://example.com"); + network::ResourceResponseHead response_head; + bool defer = false; + throttle->WillProcessResponse(response_url, response_head, &defer); + EXPECT_TRUE(defer); + EXPECT_TRUE(delegate->is_intercepted()); + + // Send the body and complete the response. + delegate->LoadResponseBody("This is a text."); + delegate->CompleteResponse(); + delegate->destination_loader_client()->RunUntilComplete(); + + // The mime type should be updated. + EXPECT_TRUE(delegate->is_resumed()); + EXPECT_EQ("text/plain", + delegate->destination_loader_client()->response_head().mime_type); +} + +TEST_F(MimeSniffingThrottleTest, Body_Docx) { + auto throttle = std::make_unique<MimeSniffingThrottle>(); + auto delegate = std::make_unique<MockDelegate>(); + throttle->set_delegate(delegate.get()); + + GURL response_url("https://example.com/hogehoge.docx"); + network::ResourceResponseHead response_head; + bool defer = false; + throttle->WillProcessResponse(response_url, response_head, &defer); + EXPECT_TRUE(defer); + EXPECT_TRUE(delegate->is_intercepted()); + + // Send the body and complete the response. + delegate->LoadResponseBody("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1"); + delegate->CompleteResponse(); + delegate->destination_loader_client()->RunUntilComplete(); + + // The mime type should be updated. + EXPECT_TRUE(delegate->is_resumed()); + EXPECT_EQ("application/msword", + delegate->destination_loader_client()->response_head().mime_type); +} + +TEST_F(MimeSniffingThrottleTest, Body_PNG) { + auto throttle = std::make_unique<MimeSniffingThrottle>(); + auto delegate = std::make_unique<MockDelegate>(); + throttle->set_delegate(delegate.get()); + + GURL response_url("https://example.com/hogehoge.docx"); + network::ResourceResponseHead response_head; + bool defer = false; + throttle->WillProcessResponse(response_url, response_head, &defer); + EXPECT_TRUE(defer); + EXPECT_TRUE(delegate->is_intercepted()); + + // Send the body and complete the response. + delegate->LoadResponseBody("\x89PNG\x0D\x0A\x1A\x0A"); + delegate->CompleteResponse(); + delegate->destination_loader_client()->RunUntilComplete(); + + // The mime type should be updated. + EXPECT_TRUE(delegate->is_resumed()); + EXPECT_EQ("image/png", + delegate->destination_loader_client()->response_head().mime_type); +} + +TEST_F(MimeSniffingThrottleTest, Body_LongPlainText) { + auto throttle = std::make_unique<MimeSniffingThrottle>(); + auto delegate = std::make_unique<MockDelegate>(); + throttle->set_delegate(delegate.get()); + + GURL response_url("https://example.com"); + network::ResourceResponseHead response_head; + bool defer = false; + throttle->WillProcessResponse(response_url, response_head, &defer); + EXPECT_TRUE(defer); + EXPECT_TRUE(delegate->is_intercepted()); + + // 64KiB is coming from the default value used in + // mojo::core::Core::CreateDataPipe(). + const uint32_t kDefaultDataPipeBufferSize = 64 * 1024; + std::string long_body(kDefaultDataPipeBufferSize * 2, 'x'); + + // Send the data to the MimeSniffingURLLoader. + // |delegate|'s MojoDataPipeSender sends the first + // |kDefaultDataPipeBufferSize| bytes to MimeSniffingURLLoader and + // MimeSniffingURLLoader will read the first |kDefaultDataPipeBufferSize| + // bytes of the body, so the MojoDataPipeSender can push the rest of + // |kDefaultDataPipeBufferSize| of the body soon and finishes sending the + // body. After this, MimeSniffingURLLoader is waiting to push the body to the + // destination data pipe since the pipe should be full until it's read. + delegate->LoadResponseBody(long_body); + scoped_task_environment_.RunUntilIdle(); + + // Read the half of the body. This unblocks MimeSniffingURLLoader to push the + // rest of the body to the data pipe. + uint32_t read_bytes = delegate->ReadResponseBody(long_body.size() / 2); + scoped_task_environment_.RunUntilIdle(); + + // Read the rest of the body. + read_bytes += delegate->ReadResponseBody(long_body.size() / 2); + scoped_task_environment_.RunUntilIdle(); + delegate->CompleteResponse(); + delegate->destination_loader_client()->RunUntilComplete(); + + // Check if all data has been read. + EXPECT_EQ(long_body.size(), read_bytes); + + // The mime type should be updated. + EXPECT_TRUE(delegate->is_resumed()); + EXPECT_EQ("text/plain", + delegate->destination_loader_client()->response_head().mime_type); +} + +} // namespace content
diff --git a/content/common/mime_sniffing_url_loader.cc b/content/common/mime_sniffing_url_loader.cc new file mode 100644 index 0000000..d7c2bce --- /dev/null +++ b/content/common/mime_sniffing_url_loader.cc
@@ -0,0 +1,355 @@ +// 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. + +#include "content/common/mime_sniffing_url_loader.h" + +#include "content/common/mime_sniffing_throttle.h" +#include "mojo/public/cpp/bindings/strong_binding.h" +#include "net/base/mime_sniffer.h" + +namespace content { + +// static +const char MimeSniffingURLLoader::kDefaultMimeType[] = "text/plain"; + +// static +std::tuple<network::mojom::URLLoaderPtr, + network::mojom::URLLoaderClientRequest, + MimeSniffingURLLoader*> +MimeSniffingURLLoader::CreateLoader( + base::WeakPtr<MimeSniffingThrottle> throttle, + const GURL& response_url, + const network::ResourceResponseHead& response_head) { + network::mojom::URLLoaderPtr url_loader; + network::mojom::URLLoaderClientPtr url_loader_client; + network::mojom::URLLoaderClientRequest url_loader_client_request = + mojo::MakeRequest(&url_loader_client); + auto loader = base::WrapUnique( + new MimeSniffingURLLoader(std::move(throttle), response_url, + response_head, std::move(url_loader_client))); + MimeSniffingURLLoader* loader_rawptr = loader.get(); + mojo::MakeStrongBinding(std::move(loader), mojo::MakeRequest(&url_loader)); + return std::make_tuple(std::move(url_loader), + std::move(url_loader_client_request), loader_rawptr); +} + +MimeSniffingURLLoader::MimeSniffingURLLoader( + base::WeakPtr<MimeSniffingThrottle> throttle, + const GURL& response_url, + const network::ResourceResponseHead& response_head, + network::mojom::URLLoaderClientPtr destination_url_loader_client) + : throttle_(throttle), + source_url_client_binding_(this), + destination_url_loader_client_(std::move(destination_url_loader_client)), + response_url_(response_url), + response_head_(response_head), + body_consumer_watcher_(FROM_HERE, + mojo::SimpleWatcher::ArmingPolicy::MANUAL), + body_producer_watcher_(FROM_HERE, + mojo::SimpleWatcher::ArmingPolicy::MANUAL) {} + +MimeSniffingURLLoader::~MimeSniffingURLLoader() = default; + +void MimeSniffingURLLoader::Start( + network::mojom::URLLoaderPtr source_url_loader, + network::mojom::URLLoaderClientRequest source_url_loader_client_request) { + source_url_loader_ = std::move(source_url_loader); + source_url_client_binding_.Bind(std::move(source_url_loader_client_request)); +} + +void MimeSniffingURLLoader::OnReceiveResponse( + const network::ResourceResponseHead& response_head) { + // OnReceiveResponse() shouldn't be called because MimeSniffingURLLoader is + // created by MimeSniffingThrottle::WillProcessResponse(), which is equivalent + // to OnReceiveResponse(). + NOTREACHED(); +} + +void MimeSniffingURLLoader::OnReceiveRedirect( + const net::RedirectInfo& redirect_info, + const network::ResourceResponseHead& response_head) { + // OnReceiveRedirect() shouldn't be called because MimeSniffingURLLoader is + // created by MimeSniffingThrottle::WillProcessResponse(), which is equivalent + // to OnReceiveResponse(). + NOTREACHED(); +} + +void MimeSniffingURLLoader::OnUploadProgress( + int64_t current_position, + int64_t total_size, + OnUploadProgressCallback ack_callback) { + destination_url_loader_client_->OnUploadProgress(current_position, total_size, + std::move(ack_callback)); +} + +void MimeSniffingURLLoader::OnReceiveCachedMetadata( + const std::vector<uint8_t>& data) { + destination_url_loader_client_->OnReceiveCachedMetadata(data); +} + +void MimeSniffingURLLoader::OnTransferSizeUpdated(int32_t transfer_size_diff) { + destination_url_loader_client_->OnTransferSizeUpdated(transfer_size_diff); +} + +void MimeSniffingURLLoader::OnStartLoadingResponseBody( + mojo::ScopedDataPipeConsumerHandle body) { + state_ = State::kSniffing; + body_consumer_handle_ = std::move(body); + body_consumer_watcher_.Watch( + body_consumer_handle_.get(), + MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, + base::BindRepeating(&MimeSniffingURLLoader::OnBodyReadable, + base::Unretained(this))); + body_consumer_watcher_.ArmOrNotify(); +} + +void MimeSniffingURLLoader::OnComplete( + const network::URLLoaderCompletionStatus& status) { + DCHECK(!complete_status_.has_value()); + switch (state_) { + case State::kWaitForBody: + // OnComplete() is called without OnStartLoadingResponseBody(). There is + // no response body in this case. Use |kDefaultMimeType| as its mime type + // even though it's empty. + state_ = State::kCompleted; + response_head_.mime_type = kDefaultMimeType; + if (!throttle_) { + Abort(); + return; + } + throttle_->ResumeWithNewResponseHead(response_head_); + destination_url_loader_client_->OnComplete(status); + return; + case State::kSniffing: + // Defer calling OnComplete() since we defer calling + // OnStartLoadingResponseBody() until mime sniffing has been finished. + complete_status_ = status; + return; + case State::kSending: + case State::kCompleted: + destination_url_loader_client_->OnComplete(status); + return; + } + NOTREACHED(); +} + +void MimeSniffingURLLoader::FollowRedirect( + const base::Optional<std::vector<std::string>>& + to_be_removed_request_headers, + const base::Optional<net::HttpRequestHeaders>& modified_request_headers) { + // MimeSniffingURLLoader starts handling the request after + // OnReceivedResponse(). A redirect response is not expected. + NOTREACHED(); +} + +void MimeSniffingURLLoader::ProceedWithResponse() { + source_url_loader_->ProceedWithResponse(); +} + +void MimeSniffingURLLoader::SetPriority(net::RequestPriority priority, + int32_t intra_priority_value) { + source_url_loader_->SetPriority(priority, intra_priority_value); +} + +void MimeSniffingURLLoader::PauseReadingBodyFromNet() { + source_url_loader_->PauseReadingBodyFromNet(); +} + +void MimeSniffingURLLoader::ResumeReadingBodyFromNet() { + source_url_loader_->ResumeReadingBodyFromNet(); +} + +void MimeSniffingURLLoader::OnBodyReadable(MojoResult) { + if (state_ == State::kSending) { + // The pipe becoming readable when kSending means all buffered body has + // already been sent. + ForwardBodyToClient(); + return; + } + DCHECK_EQ(State::kSniffing, state_); + + size_t start_size = buffered_body_.size(); + uint32_t read_bytes = net::kMaxBytesToSniff; + buffered_body_.resize(start_size + read_bytes); + MojoResult result = + body_consumer_handle_->ReadData(buffered_body_.data() + start_size, + &read_bytes, MOJO_READ_DATA_FLAG_NONE); + switch (result) { + case MOJO_RESULT_OK: + break; + case MOJO_RESULT_FAILED_PRECONDITION: + // Finished the body before mime type is completely decided. + buffered_body_.resize(start_size); + CompleteSniffing(); + return; + case MOJO_RESULT_SHOULD_WAIT: + body_consumer_watcher_.ArmOrNotify(); + return; + default: + NOTREACHED(); + return; + } + + DCHECK_EQ(MOJO_RESULT_OK, result); + buffered_body_.resize(start_size + read_bytes); + std::string new_type; + bool made_final_decision = + net::SniffMimeType(buffered_body_.data(), buffered_body_.size(), + response_url_, response_head_.mime_type, + net::ForceSniffFileUrlsForHtml::kDisabled, &new_type); + response_head_.mime_type = new_type; + response_head_.did_mime_sniff = true; + if (made_final_decision) { + CompleteSniffing(); + return; + } + body_consumer_watcher_.ArmOrNotify(); +} + +void MimeSniffingURLLoader::OnBodyWritable(MojoResult) { + DCHECK_EQ(State::kSending, state_); + if (bytes_remaining_in_buffer_ > 0) { + SendReceivedBodyToClient(); + } else { + ForwardBodyToClient(); + } +} + +void MimeSniffingURLLoader::CompleteSniffing() { + DCHECK_EQ(State::kSniffing, state_); + if (buffered_body_.empty()) { + // A data pipe for the body was received but no body was provided. Don't + // propagate OnStartLoadingResponseBody() in this case. We treat this + // situation as the same as when OnStartLoadingResponseBody() was not + // called. + // + // TODO(crbug.com/826868): Remove this once all loaders are aligned. + state_ = State::kWaitForBody; + if (complete_status_.has_value()) { + auto status = complete_status_.value(); + complete_status_.reset(); + OnComplete(status); + } + return; + } + + state_ = State::kSending; + bytes_remaining_in_buffer_ = buffered_body_.size(); + if (!throttle_) { + Abort(); + return; + } + throttle_->ResumeWithNewResponseHead(response_head_); + mojo::ScopedDataPipeConsumerHandle body_to_send; + MojoResult result = + mojo::CreateDataPipe(nullptr, &body_producer_handle_, &body_to_send); + if (result != MOJO_RESULT_OK) { + Abort(); + return; + } + // Set up the watcher for the producer handle. + body_producer_watcher_.Watch( + body_producer_handle_.get(), + MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, + base::BindRepeating(&MimeSniffingURLLoader::OnBodyWritable, + base::Unretained(this))); + // Send deferred messages. + destination_url_loader_client_->OnStartLoadingResponseBody( + std::move(body_to_send)); + // Call OnComplete() if OnComplete() has already been called. + if (complete_status_.has_value()) + destination_url_loader_client_->OnComplete(complete_status_.value()); + SendReceivedBodyToClient(); +} + +void MimeSniffingURLLoader::CompleteSending() { + DCHECK_EQ(State::kSending, state_); + state_ = State::kCompleted; + body_consumer_watcher_.Cancel(); + body_producer_watcher_.Cancel(); + body_consumer_handle_.reset(); + body_producer_handle_.reset(); +} + +void MimeSniffingURLLoader::SendReceivedBodyToClient() { + DCHECK_EQ(State::kSending, state_); + // Send the buffered data first. + DCHECK_GT(bytes_remaining_in_buffer_, 0u); + size_t start_position = buffered_body_.size() - bytes_remaining_in_buffer_; + uint32_t bytes_sent = bytes_remaining_in_buffer_; + MojoResult result = + body_producer_handle_->WriteData(buffered_body_.data() + start_position, + &bytes_sent, MOJO_WRITE_DATA_FLAG_NONE); + switch (result) { + case MOJO_RESULT_OK: + break; + case MOJO_RESULT_FAILED_PRECONDITION: + // The pipe is closed unexpectedly. |this| should be deleted once + // URLLoaderPtr on the destination is released. + Abort(); + return; + case MOJO_RESULT_SHOULD_WAIT: + body_producer_watcher_.ArmOrNotify(); + return; + default: + NOTREACHED(); + return; + } + bytes_remaining_in_buffer_ -= bytes_sent; + body_producer_watcher_.ArmOrNotify(); +} + +void MimeSniffingURLLoader::ForwardBodyToClient() { + DCHECK_EQ(0u, bytes_remaining_in_buffer_); + // Send the body from the consumer to the producer. + const void* buffer; + uint32_t buffer_size = 0; + MojoResult result = body_consumer_handle_->BeginReadData( + &buffer, &buffer_size, MOJO_BEGIN_READ_DATA_FLAG_NONE); + switch (result) { + case MOJO_RESULT_OK: + break; + case MOJO_RESULT_SHOULD_WAIT: + body_consumer_watcher_.ArmOrNotify(); + return; + case MOJO_RESULT_FAILED_PRECONDITION: + // All data has been sent. + CompleteSending(); + return; + default: + NOTREACHED(); + return; + } + + result = body_producer_handle_->WriteData(buffer, &buffer_size, + MOJO_WRITE_DATA_FLAG_NONE); + switch (result) { + case MOJO_RESULT_OK: + break; + case MOJO_RESULT_FAILED_PRECONDITION: + // The pipe is closed unexpectedly. |this| should be deleted once + // URLLoaderPtr on the destination is released. + Abort(); + return; + case MOJO_RESULT_SHOULD_WAIT: + body_consumer_handle_->EndReadData(0); + body_producer_watcher_.ArmOrNotify(); + return; + default: + NOTREACHED(); + return; + } + + body_consumer_handle_->EndReadData(buffer_size); + body_consumer_watcher_.ArmOrNotify(); +} + +void MimeSniffingURLLoader::Abort() { + source_url_loader_.reset(); + destination_url_loader_client_.reset(); + // |this| should be removed since the owner will destroy |this| or the owner + // has already been destroyed by some reason. +} + +} // namespace content
diff --git a/content/common/mime_sniffing_url_loader.h b/content/common/mime_sniffing_url_loader.h new file mode 100644 index 0000000..4e7a3c4 --- /dev/null +++ b/content/common/mime_sniffing_url_loader.h
@@ -0,0 +1,145 @@ +// 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. + +#ifndef CONTENT_COMMON_MIME_SNIFFING_URL_LOADER_H_ +#define CONTENT_COMMON_MIME_SNIFFING_URL_LOADER_H_ + +#include <tuple> + +#include "base/callback.h" +#include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" +#include "base/strings/string_piece.h" +#include "content/common/content_export.h" +#include "content/common/possibly_associated_interface_ptr.h" +#include "content/public/common/url_loader_throttle.h" +#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/system/data_pipe.h" +#include "mojo/public/cpp/system/simple_watcher.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "services/network/public/mojom/url_loader.mojom.h" +#include "services/network/public/mojom/url_loader_factory.mojom.h" + +namespace content { + +class MimeSniffingThrottle; + +// Reads the response body and determines its mime type. This url loader buffers +// the response body until the mime type is decided. MimeSniffingURLLoader +// is expected to be created just after receiving OnReceiveResponse(), so this +// handles only OnStartLoadingResponseBody() and OnComplete() as a +// network::mojom::URLLoaderClient. +// +// This loader has four state: +// kWaitForBody: The initial state until the body is received (= +// OnStartLoadingResponseBody() is called) or the response is +// finished (= OnComplete() is called). When body is provided, the +// state is changed to kSniffing. Otherwise the state goes to +// kCompleted. +// kSniffing: Receives the body from the source loader and estimate the mime +// type. The received body is kept in this loader until the mime type +// is decided. When the mime type is decided or all body has been +// received, this loader will dispatch queued messages like +// OnStartLoadingResponseBody() and OnComplete() to the destination +// loader client, and then the state is changed to kSending. +// kSending: Receives the body and send it to the destination loader client. All +// data has been read by this loader, the state goes to kCompleted. +// kCompleted: All data has been sent to the destination loader. +class CONTENT_EXPORT MimeSniffingURLLoader + : public network::mojom::URLLoaderClient, + public network::mojom::URLLoader { + public: + ~MimeSniffingURLLoader() override; + + // Start waiting for the body. + void Start( + network::mojom::URLLoaderPtr source_url_loader, + network::mojom::URLLoaderClientRequest source_url_loader_client_request); + + // network::mojom::URLLoaderPtr controls the lifetime of the loader. + static std::tuple<network::mojom::URLLoaderPtr, + network::mojom::URLLoaderClientRequest, + MimeSniffingURLLoader*> + CreateLoader(base::WeakPtr<MimeSniffingThrottle> throttle, + const GURL& response_url, + const network::ResourceResponseHead& response_head); + + private: + MimeSniffingURLLoader( + base::WeakPtr<MimeSniffingThrottle> throttle, + const GURL& response_url, + const network::ResourceResponseHead& response_head, + network::mojom::URLLoaderClientPtr destination_url_loader_client); + + // network::mojom::URLLoaderClient implementation (called from the source of + // the response): + void OnReceiveResponse( + const network::ResourceResponseHead& response_head) override; + void OnReceiveRedirect( + const net::RedirectInfo& redirect_info, + const network::ResourceResponseHead& response_head) override; + void OnUploadProgress(int64_t current_position, + int64_t total_size, + OnUploadProgressCallback ack_callback) override; + void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override; + void OnTransferSizeUpdated(int32_t transfer_size_diff) override; + void OnStartLoadingResponseBody( + mojo::ScopedDataPipeConsumerHandle body) override; + void OnComplete(const network::URLLoaderCompletionStatus& status) override; + + // network::mojom::URLLoader implementation (called from the destination of + // the response): + void FollowRedirect(const base::Optional<std::vector<std::string>>& + to_be_removed_request_headers, + const base::Optional<net::HttpRequestHeaders>& + modified_request_headers) override; + void ProceedWithResponse() override; + void SetPriority(net::RequestPriority priority, + int32_t intra_priority_value) override; + void PauseReadingBodyFromNet() override; + void ResumeReadingBodyFromNet() override; + + void OnBodyReadable(MojoResult); + void OnBodyWritable(MojoResult); + void CompleteSniffing(); + void CompleteSending(); + void SendReceivedBodyToClient(); + void ForwardBodyToClient(); + + void Abort(); + + static const char kDefaultMimeType[]; + + base::WeakPtr<MimeSniffingThrottle> throttle_; + + mojo::Binding<network::mojom::URLLoaderClient> source_url_client_binding_; + network::mojom::URLLoaderPtr source_url_loader_; + network::mojom::URLLoaderClientPtr destination_url_loader_client_; + + GURL response_url_; + + // Capture the response head to defer to send it to the destination until the + // mime type is decided. + network::ResourceResponseHead response_head_; + + enum class State { kWaitForBody, kSniffing, kSending, kCompleted }; + State state_ = State::kWaitForBody; + + // Set if OnComplete() is called during sniffing. + base::Optional<network::URLLoaderCompletionStatus> complete_status_; + + std::vector<char> buffered_body_; + size_t bytes_remaining_in_buffer_; + + mojo::ScopedDataPipeConsumerHandle body_consumer_handle_; + mojo::ScopedDataPipeProducerHandle body_producer_handle_; + mojo::SimpleWatcher body_consumer_watcher_; + mojo::SimpleWatcher body_producer_watcher_; + + DISALLOW_COPY_AND_ASSIGN(MimeSniffingURLLoader); +}; + +} // namespace content + +#endif // CONTENT_COMMON_MIME_SNIFFING_URL_LOADER_H_
diff --git a/content/common/service_worker/service_worker_fetch_response.typemap b/content/common/service_worker/service_worker_fetch_response.typemap deleted file mode 100644 index 60c7e5d5..0000000 --- a/content/common/service_worker/service_worker_fetch_response.typemap +++ /dev/null
@@ -1,13 +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. - -mojom = - "//third_party/blink/public/platform/modules/fetch/fetch_api_response.mojom" -public_headers = [ "//content/common/service_worker/service_worker_types.h" ] -traits_headers = [ "//content/common/service_worker/service_worker_fetch_response_mojom_traits.h" ] -sources = [ - "//content/common/service_worker/service_worker_fetch_response_mojom_traits.cc", -] -type_mappings = - [ "blink.mojom.FetchAPIResponse=::content::ServiceWorkerResponse" ]
diff --git a/content/common/service_worker/service_worker_fetch_response_mojom_traits.cc b/content/common/service_worker/service_worker_fetch_response_mojom_traits.cc deleted file mode 100644 index 64a9ed1b..0000000 --- a/content/common/service_worker/service_worker_fetch_response_mojom_traits.cc +++ /dev/null
@@ -1,63 +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. - -#include "content/common/service_worker/service_worker_fetch_response_mojom_traits.h" - -#include <map> -#include <string> -#include <unordered_map> -#include <utility> -#include <vector> - -#include "base/memory/scoped_refptr.h" -#include "content/common/service_worker/service_worker_types.h" -#include "content/public/common/referrer_struct_traits.h" -#include "ipc/ipc_message_utils.h" -#include "mojo/public/cpp/base/time_mojom_traits.h" -#include "url/mojom/url_gurl_mojom_traits.h" - -namespace mojo { - -bool StructTraits<blink::mojom::FetchAPIResponseDataView, - content::ServiceWorkerResponse>:: - Read(blink::mojom::FetchAPIResponseDataView data, - content::ServiceWorkerResponse* out) { - blink::mojom::SerializedBlobPtr serialized_blob_ptr; - blink::mojom::SerializedBlobPtr serialized_side_data_blob_ptr; - if (!data.ReadUrlList(&out->url_list) || - !data.ReadStatusText(&out->status_text) || - !data.ReadResponseType(&out->response_type) || - !data.ReadHeaders(&out->headers) || - !data.ReadBlob(&serialized_blob_ptr) || !data.ReadError(&out->error) || - !data.ReadResponseTime(&out->response_time) || - !data.ReadCacheStorageCacheName(&out->cache_storage_cache_name) || - !data.ReadCorsExposedHeaderNames(&out->cors_exposed_header_names) || - !data.ReadSideDataBlob(&serialized_side_data_blob_ptr)) { - return false; - } - - out->status_code = data.status_code(); - out->is_in_cache_storage = data.is_in_cache_storage(); - - if (serialized_blob_ptr) { - out->blob_uuid = serialized_blob_ptr->uuid; - out->blob_size = serialized_blob_ptr->size; - blink::mojom::BlobPtr blob_ptr; - blob_ptr.Bind(std::move(serialized_blob_ptr->blob)); - out->blob = base::MakeRefCounted<storage::BlobHandle>(std::move(blob_ptr)); - } - - if (serialized_side_data_blob_ptr) { - out->side_data_blob_uuid = serialized_side_data_blob_ptr->uuid; - out->side_data_blob_size = serialized_side_data_blob_ptr->size; - blink::mojom::BlobPtr blob_ptr; - blob_ptr.Bind(std::move(serialized_side_data_blob_ptr->blob)); - out->side_data_blob = - base::MakeRefCounted<storage::BlobHandle>(std::move(blob_ptr)); - } - - return true; -} - -} // namespace mojo
diff --git a/content/common/service_worker/service_worker_fetch_response_mojom_traits.h b/content/common/service_worker/service_worker_fetch_response_mojom_traits.h deleted file mode 100644 index 287ac17..0000000 --- a/content/common/service_worker/service_worker_fetch_response_mojom_traits.h +++ /dev/null
@@ -1,94 +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. -#ifndef CONTENT_COMMON_SERVICE_WORKER_SERVICE_WORKER_FETCH_RESPONSE_MOJOM_TRAITS_H_ -#define CONTENT_COMMON_SERVICE_WORKER_SERVICE_WORKER_FETCH_RESPONSE_MOJOM_TRAITS_H_ - -#include <map> -#include <string> -#include <vector> - -#include "base/numerics/safe_conversions.h" -#include "content/common/content_export.h" -#include "content/common/service_worker/service_worker_types.h" -#include "third_party/blink/public/mojom/blob/blob.mojom.h" -#include "third_party/blink/public/platform/modules/fetch/fetch_api_response.mojom.h" - -namespace mojo { - -template <> -struct CONTENT_EXPORT StructTraits<blink::mojom::FetchAPIResponseDataView, - content::ServiceWorkerResponse> { - static const std::vector<GURL>& url_list( - const content::ServiceWorkerResponse& response) { - return response.url_list; - } - static int status_code(const content::ServiceWorkerResponse& response) { - return response.status_code; - } - static bool is_in_cache_storage( - const content::ServiceWorkerResponse& response) { - return response.is_in_cache_storage; - } - static blink::mojom::SerializedBlobPtr blob( - const content::ServiceWorkerResponse& response) { - if (response.blob) { - blink::mojom::SerializedBlobPtr serialized_blob_ptr = - blink::mojom::SerializedBlob::New(); - serialized_blob_ptr->uuid = response.blob_uuid; - serialized_blob_ptr->size = response.blob_size; - serialized_blob_ptr->blob = response.blob->Clone().PassInterface(); - return serialized_blob_ptr; - } - return nullptr; - } - static const std::string& status_text( - const content::ServiceWorkerResponse& response) { - return response.status_text; - } - static network::mojom::FetchResponseType response_type( - const content::ServiceWorkerResponse& response) { - return response.response_type; - } - static std::map<std::string, - std::string, - content::ServiceWorkerCaseInsensitiveCompare> - headers(const content::ServiceWorkerResponse& response) { - return response.headers; - } - static blink::mojom::ServiceWorkerResponseError error( - const content::ServiceWorkerResponse& response) { - return response.error; - } - static const base::Time& response_time( - const content::ServiceWorkerResponse& response) { - return response.response_time; - } - static const std::string& cache_storage_cache_name( - const content::ServiceWorkerResponse& response) { - return response.cache_storage_cache_name; - } - static const std::vector<std::string>& cors_exposed_header_names( - const content::ServiceWorkerResponse& response) { - return response.cors_exposed_header_names; - } - static blink::mojom::SerializedBlobPtr side_data_blob( - const content::ServiceWorkerResponse& response) { - if (response.side_data_blob) { - blink::mojom::SerializedBlobPtr serialized_blob_ptr = - blink::mojom::SerializedBlob::New(); - serialized_blob_ptr->uuid = response.side_data_blob_uuid; - serialized_blob_ptr->size = response.side_data_blob_size; - serialized_blob_ptr->blob = - response.side_data_blob->Clone().PassInterface(); - return serialized_blob_ptr; - } - return nullptr; - } - static bool Read(blink::mojom::FetchAPIResponseDataView, - content::ServiceWorkerResponse* output); -}; - -} // namespace mojo - -#endif // CONTENT_COMMON_SERVICE_WORKER_SERVICE_WORKER_FETCH_RESPONSE_MOJOM_TRAITS_H_
diff --git a/content/common/service_worker/service_worker_loader_helpers.cc b/content/common/service_worker/service_worker_loader_helpers.cc index b01b6825..431207de 100644 --- a/content/common/service_worker/service_worker_loader_helpers.cc +++ b/content/common/service_worker/service_worker_loader_helpers.cc
@@ -64,15 +64,11 @@ net::HttpUtil::AssembleRawHeaders(buf.c_str(), buf.size())); // Populate |out_head|'s MIME type with the value from the HTTP response - // headers. If there is none, set a default value. - // TODO(crbug.com/771118): Make the MIME sniffer work for SW controlled page - // loads, so we don't need to set a simple default value. + // headers. if (out_head->mime_type.empty()) { std::string mime_type; - out_head->headers->GetMimeType(&mime_type); - if (mime_type.empty()) - mime_type = "text/plain"; - out_head->mime_type = mime_type; + if (out_head->headers->GetMimeType(&mime_type)) + out_head->mime_type = mime_type; } // Populate |out_head|'s charset with the value from the HTTP response
diff --git a/content/common/service_worker/service_worker_types.h b/content/common/service_worker/service_worker_types.h index cdcade92..b7a38be 100644 --- a/content/common/service_worker/service_worker_types.h +++ b/content/common/service_worker/service_worker_types.h
@@ -127,10 +127,10 @@ // represent the response a service worker provided to FetchEvent#respondWith. // - Background Fetch API: Uses this type to represent responses to background // fetches. -// - Cache Storage API: Uses this type to represent responses to requests. // Note that the Fetch API does not use this type; it uses ResourceResponse // instead. -// TODO(falken): Can everyone just use ResourceResponse? +// TODO(leonhsl): Remove this struct, instead, use +// blink::mojom::FetchAPIResponse everywhere. struct CONTENT_EXPORT ServiceWorkerResponse { ServiceWorkerResponse(); ServiceWorkerResponse(
diff --git a/content/common/service_worker/service_worker_types_unittest.cc b/content/common/service_worker/service_worker_types_unittest.cc index 8a077d53..87db85c 100644 --- a/content/common/service_worker/service_worker_types_unittest.cc +++ b/content/common/service_worker/service_worker_types_unittest.cc
@@ -4,7 +4,6 @@ #include "content/common/service_worker/service_worker_types.h" #include "base/guid.h" -#include "content/common/service_worker/service_worker_fetch_response_mojom_traits.h" #include "mojo/public/cpp/base/time_mojom_traits.h" #include "mojo/public/cpp/test_support/test_utils.h" #include "testing/gtest/include/gtest/gtest.h" @@ -45,42 +44,6 @@ net::LOAD_ONLY_FROM_CACHE | net::LOAD_BYPASS_CACHE)); } -// Tests that mojo serialization/deserialization of ServiceWorkerResponse works. -TEST(ServiceWorkerResponseTest, StructTraits) { - ServiceWorkerResponse input; - ServiceWorkerResponse output; - - input.url_list = {GURL("https://www.google.ca/"), - GURL("https://www.google.com")}; - input.status_code = 200; - input.status_text = "status_text"; - input.response_type = network::mojom::FetchResponseType::kDefault; - input.headers.insert( - std::pair<std::string, std::string>("header1", "value1")); - input.headers.insert( - std::pair<std::string, std::string>("header2", "value2")); - input.error = blink::mojom::ServiceWorkerResponseError::kUnknown; - input.response_time = base::Time::Now(); - input.is_in_cache_storage = true; - input.cache_storage_cache_name = "cache_name"; - - mojo::test::SerializeAndDeserialize<blink::mojom::FetchAPIResponse>(&input, - &output); - - EXPECT_EQ(input.url_list, output.url_list); - EXPECT_EQ(input.status_code, output.status_code); - EXPECT_EQ(input.status_text, output.status_text); - EXPECT_EQ(input.response_type, output.response_type); - EXPECT_EQ(input.headers, output.headers); - EXPECT_EQ(input.blob, output.blob); - EXPECT_EQ(input.error, output.error); - EXPECT_EQ(input.response_time, output.response_time); - EXPECT_EQ(input.is_in_cache_storage, output.is_in_cache_storage); - EXPECT_EQ(input.cache_storage_cache_name, output.cache_storage_cache_name); - EXPECT_EQ(input.cors_exposed_header_names, output.cors_exposed_header_names); - EXPECT_EQ(input.side_data_blob, output.side_data_blob); -} - TEST(ServiceWorkerRequestTest, SerialiazeDeserializeRoundTrip) { ServiceWorkerFetchRequest request( GURL("foo.com"), "GET", {{"User-Agent", "Chrome"}},
diff --git a/content/common/throttling_url_loader.cc b/content/common/throttling_url_loader.cc index 1a33248..7e49564 100644 --- a/content/common/throttling_url_loader.cc +++ b/content/common/throttling_url_loader.cc
@@ -44,6 +44,14 @@ loader_->SetPriority(priority); } + void UpdateDeferredResponseHead( + const network::ResourceResponseHead& new_response_head) override { + if (!loader_) + return; + ScopedDelegateCall scoped_delegate_call(this); + loader_->UpdateDeferredResponseHead(new_response_head); + } + void PauseReadingBodyFromNet() override { if (!loader_) return; @@ -193,7 +201,7 @@ void ThrottlingURLLoader::SetPriority(net::RequestPriority priority, int32_t intra_priority_value) { if (!url_loader_) { - if (!loader_cancelled_) { + if (!loader_completed_) { DCHECK_EQ(DEFERRED_START, deferred_stage_); priority_info_ = std::make_unique<PriorityInfo>(priority, intra_priority_value); @@ -230,7 +238,7 @@ network::ResourceRequest* url_request, scoped_refptr<base::SingleThreadTaskRunner> task_runner) { DCHECK_EQ(DEFERRED_NONE, deferred_stage_); - DCHECK(!loader_cancelled_); + DCHECK(!loader_completed_); if (options & network::mojom::kURLLoadOptionSynchronous) is_synchronous_ = true; @@ -294,7 +302,7 @@ bool throttle_deferred, bool* should_defer) { DCHECK(!deferring_throttles_.count(throttle)); - if (loader_cancelled_) + if (loader_completed_) return false; *should_defer |= throttle_deferred; if (throttle_deferred) @@ -308,14 +316,14 @@ return; deferring_throttles_.erase(throttle); - if (deferring_throttles_.empty() && !loader_cancelled_) + if (deferring_throttles_.empty() && !loader_completed_) Resume(); } void ThrottlingURLLoader::OnReceiveResponse( const network::ResourceResponseHead& response_head) { DCHECK_EQ(DEFERRED_NONE, deferred_stage_); - DCHECK(!loader_cancelled_); + DCHECK(!loader_completed_); DCHECK(deferring_throttles_.empty()); if (!throttles_.empty()) { @@ -344,7 +352,7 @@ const net::RedirectInfo& redirect_info, const network::ResourceResponseHead& response_head) { DCHECK_EQ(DEFERRED_NONE, deferred_stage_); - DCHECK(!loader_cancelled_); + DCHECK(!loader_completed_); DCHECK(deferring_throttles_.empty()); if (!throttles_.empty()) { @@ -386,7 +394,7 @@ int64_t total_size, OnUploadProgressCallback ack_callback) { DCHECK_EQ(DEFERRED_NONE, deferred_stage_); - DCHECK(!loader_cancelled_); + DCHECK(!loader_completed_); forwarding_client_->OnUploadProgress(current_position, total_size, std::move(ack_callback)); @@ -395,14 +403,14 @@ void ThrottlingURLLoader::OnReceiveCachedMetadata( const std::vector<uint8_t>& data) { DCHECK_EQ(DEFERRED_NONE, deferred_stage_); - DCHECK(!loader_cancelled_); + DCHECK(!loader_completed_); forwarding_client_->OnReceiveCachedMetadata(data); } void ThrottlingURLLoader::OnTransferSizeUpdated(int32_t transfer_size_diff) { DCHECK_EQ(DEFERRED_NONE, deferred_stage_); - DCHECK(!loader_cancelled_); + DCHECK(!loader_completed_); forwarding_client_->OnTransferSizeUpdated(transfer_size_diff); } @@ -410,7 +418,7 @@ void ThrottlingURLLoader::OnStartLoadingResponseBody( mojo::ScopedDataPipeConsumerHandle body) { DCHECK_EQ(DEFERRED_NONE, deferred_stage_); - DCHECK(!loader_cancelled_); + DCHECK(!loader_completed_); forwarding_client_->OnStartLoadingResponseBody(std::move(body)); } @@ -418,12 +426,14 @@ void ThrottlingURLLoader::OnComplete( const network::URLLoaderCompletionStatus& status) { DCHECK_EQ(DEFERRED_NONE, deferred_stage_); - DCHECK(!loader_cancelled_); + DCHECK(!loader_completed_); // This is the last expected message. Pipe closure before this is an error // (see OnClientConnectionError). After this it is expected and should be - // ignored. - DisconnectClient(nullptr); + // ignored. The owner of |this| is expected to destroy |this| when + // OnComplete() and all data has been read. Destruction of |this| will + // destroy |url_loader_| appropriately. + loader_completed_ = true; forwarding_client_->OnComplete(status); } @@ -437,7 +447,7 @@ void ThrottlingURLLoader::CancelWithError(int error_code, base::StringPiece custom_reason) { - if (loader_cancelled_) + if (loader_completed_) return; network::URLLoaderCompletionStatus status; @@ -450,7 +460,7 @@ } void ThrottlingURLLoader::Resume() { - if (loader_cancelled_ || deferred_stage_ == DEFERRED_NONE) + if (loader_completed_ || deferred_stage_ == DEFERRED_NONE) return; auto prev_deferred_stage = deferred_stage_; @@ -490,6 +500,13 @@ url_loader_->SetPriority(priority, -1); } +void ThrottlingURLLoader::UpdateDeferredResponseHead( + const network::ResourceResponseHead& new_response_head) { + DCHECK(response_info_); + DCHECK_EQ(DEFERRED_RESPONSE, deferred_stage_); + response_info_->response_head = new_response_head; +} + void ThrottlingURLLoader::PauseReadingBodyFromNet(URLLoaderThrottle* throttle) { if (pausing_reading_body_from_net_throttles_.empty() && url_loader_) url_loader_->PauseReadingBodyFromNet(); @@ -537,7 +554,7 @@ url_loader_ = nullptr; } - loader_cancelled_ = true; + loader_completed_ = true; } ThrottlingURLLoader::ThrottleEntry::ThrottleEntry(
diff --git a/content/common/throttling_url_loader.h b/content/common/throttling_url_loader.h index 9fb0cdf..7397d10 100644 --- a/content/common/throttling_url_loader.h +++ b/content/common/throttling_url_loader.h
@@ -120,6 +120,8 @@ void CancelWithError(int error_code, base::StringPiece custom_reason); void Resume(); void SetPriority(net::RequestPriority priority); + void UpdateDeferredResponseHead( + const network::ResourceResponseHead& new_response_head); void PauseReadingBodyFromNet(URLLoaderThrottle* throttle); void ResumeReadingBodyFromNet(URLLoaderThrottle* throttle); void InterceptResponse( @@ -138,7 +140,7 @@ DEFERRED_RESPONSE }; DeferredStage deferred_stage_ = DEFERRED_NONE; - bool loader_cancelled_ = false; + bool loader_completed_ = false; bool is_synchronous_ = false; struct ThrottleEntry {
diff --git a/content/common/typemaps.gni b/content/common/typemaps.gni index 6219420..e278a858d 100644 --- a/content/common/typemaps.gni +++ b/content/common/typemaps.gni
@@ -17,7 +17,6 @@ "//content/common/render_frame_metadata.typemap", "//content/common/service_worker/service_worker.typemap", "//content/common/service_worker/service_worker_fetch_request.typemap", - "//content/common/service_worker/service_worker_fetch_response.typemap", "//content/common/url_loader_factory_bundle.typemap", "//content/common/web_preferences.typemap", "//content/common/media/media_session.typemap",
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/SelectPopup.java b/content/public/android/java/src/org/chromium/content/browser/input/SelectPopup.java index 279534c5..0304ece3 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/SelectPopup.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/SelectPopup.java
@@ -46,7 +46,6 @@ } private final WebContentsImpl mWebContents; - private final Context mContext; private View mContainerView; private Ui mPopupView; private long mNativeSelectPopup; @@ -57,11 +56,9 @@ } /** - * Get {@link SelectPopup} object used for the give WebContents. {@link #create()} should - * precede any calls to this. + * Get {@link SelectPopup} object used for the give WebContents. * @param webContents {@link WebContents} object. - * @return {@link SelectPopup} object. {@code null} if not available because - * {@link #create()} is not called yet. + * @return {@link SelectPopup} object. */ public static SelectPopup fromWebContents(WebContents webContents) { return webContents.getOrSetUserData(SelectPopup.class, UserDataFactoryLazyHolder.INSTANCE); @@ -73,7 +70,6 @@ */ public SelectPopup(WebContents webContents) { mWebContents = (WebContentsImpl) webContents; - mContext = mWebContents.getContext(); ViewAndroidDelegate viewDelegate = mWebContents.getViewAndroidDelegate(); assert viewDelegate != null; mContainerView = viewDelegate.getContainerView(); @@ -135,6 +131,9 @@ PopupController.hidePopupsAndClearSelection(mWebContents); assert mNativeSelectPopupSourceFrame == 0 : "Zombie popup did not clear the frame source"; + Context context = mWebContents.getContext(); + if (context == null) return; + assert items.length == enabled.length; List<SelectPopupItem> popupItems = new ArrayList<SelectPopupItem>(); for (int i = 0; i < items.length; i++) { @@ -144,14 +143,10 @@ WebContentsAccessibilityImpl.fromWebContents(mWebContents); if (DeviceFormFactor.isTablet() && !multiple && !wcax.isTouchExplorationEnabled()) { mPopupView = new SelectPopupDropdown( - this, mContext, anchorView, popupItems, selectedIndices, rightAligned); + this, context, anchorView, popupItems, selectedIndices, rightAligned); } else { - WindowAndroid window = getWindowAndroid(); - if (window == null) return; - Context windowContext = window.getContext().get(); - if (windowContext == null) return; - mPopupView = new SelectPopupDialog( - this, windowContext, popupItems, multiple, selectedIndices); + mPopupView = + new SelectPopupDialog(this, context, popupItems, multiple, selectedIndices); } mNativeSelectPopupSourceFrame = nativeSelectPopupSourceFrame; mPopupView.show(); @@ -181,10 +176,6 @@ return mPopupView != null; } - private WindowAndroid getWindowAndroid() { - return (mNativeSelectPopup != 0) ? nativeGetWindowAndroid(mNativeSelectPopup) : null; - } - /** * Notifies that items were selected in the currently showing select popup. * @param indices Array of indices of the selected items. @@ -200,5 +191,4 @@ private native long nativeInit(WebContents webContents); private native void nativeSelectMenuItems( long nativeSelectPopup, long nativeSelectPopupSourceFrame, int[] indices); - private native WindowAndroid nativeGetWindowAndroid(long nativeSelectPopup); }
diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java index 048edab..306a085 100644 --- a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
@@ -205,6 +205,9 @@ setViewAndroidDelegate(viewDelegate); setTopLevelNativeWindow(windowAndroid); + // Internally registers the handler that controls showing <select> HTML elements. + SelectPopup.fromWebContents(this); + ViewEventSinkImpl.from(this).setAccessDelegate(accessDelegate); getRenderCoordinates().setDeviceScaleFactor(windowAndroid.getDisplay().getDipScale()); }
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index ed25385..f158ae2c 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -144,6 +144,12 @@ const base::Feature kFontCacheScaling{"FontCacheScaling", base::FEATURE_DISABLED_BY_DEFAULT}; +// Enables fixes for matching src: local() for web fonts correctly against full +// font name or postscript name. Rolling out behind a flag, as enabling this +// enables a font indexer on Android which we need to test in the field first. +const base::Feature kFontSrcLocalMatching{"FontSrcLocalMatching", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables a security restriction on iframes navigating their top frame. // When enabled, the navigation will only be permitted if the iframe is // same-origin to the top frame, or if a user gesture is being processed.
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index 51501914..54302587 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -43,6 +43,7 @@ CONTENT_EXPORT extern const base::Feature kExpensiveBackgroundTimerThrottling; CONTENT_EXPORT extern const base::Feature kExtendedMouseButtons; CONTENT_EXPORT extern const base::Feature kFontCacheScaling; +CONTENT_EXPORT extern const base::Feature kFontSrcLocalMatching; CONTENT_EXPORT extern const base::Feature kFramebustingNeedsSameOriginOrUserGesture; CONTENT_EXPORT extern const base::Feature kGamepadExtensions;
diff --git a/content/public/common/url_loader_throttle.cc b/content/public/common/url_loader_throttle.cc index a919a363..891164f 100644 --- a/content/public/common/url_loader_throttle.cc +++ b/content/public/common/url_loader_throttle.cc
@@ -9,6 +9,8 @@ namespace content { void URLLoaderThrottle::Delegate::SetPriority(net::RequestPriority priority) {} +void URLLoaderThrottle::Delegate::UpdateDeferredResponseHead( + const network::ResourceResponseHead& new_response_head) {} void URLLoaderThrottle::Delegate::PauseReadingBodyFromNet() {} void URLLoaderThrottle::Delegate::ResumeReadingBodyFromNet() {}
diff --git a/content/public/common/url_loader_throttle.h b/content/public/common/url_loader_throttle.h index 37faba0..5a263b53 100644 --- a/content/public/common/url_loader_throttle.h +++ b/content/public/common/url_loader_throttle.h
@@ -57,6 +57,13 @@ virtual void SetPriority(net::RequestPriority priority); + // Updates the response head which is deferred to be sent. This method needs + // to be called when the response is deferred on + // URLLoaderThrottle::WillProcessResponse() and before calling + // Delegate::Resume(). + virtual void UpdateDeferredResponseHead( + const network::ResourceResponseHead& new_response_head); + // Pauses/resumes reading response body if the resource is fetched from // network. virtual void PauseReadingBodyFromNet();
diff --git a/content/renderer/loader/resource_dispatcher.cc b/content/renderer/loader/resource_dispatcher.cc index 3d5bd290..390de26 100644 --- a/content/renderer/loader/resource_dispatcher.cc +++ b/content/renderer/loader/resource_dispatcher.cc
@@ -22,6 +22,7 @@ #include "base/time/time.h" #include "build/build_config.h" #include "content/common/inter_process_time_ticks_converter.h" +#include "content/common/mime_sniffing_throttle.h" #include "content/common/navigation_params.h" #include "content/common/net/record_load_histograms.h" #include "content/common/throttling_url_loader.h" @@ -45,6 +46,7 @@ #include "services/network/public/cpp/resource_request.h" #include "services/network/public/cpp/resource_response.h" #include "services/network/public/cpp/url_loader_completion_status.h" +#include "third_party/blink/public/common/service_worker/service_worker_utils.h" namespace content { @@ -696,10 +698,12 @@ uint32_t options = network::mojom::kURLLoadOptionNone; // TODO(jam): use this flag for ResourceDispatcherHost code path once // MojoLoading is the only IPC code path. - if (base::FeatureList::IsEnabled(network::features::kNetworkService) && + if ((blink::ServiceWorkerUtils::IsServicificationEnabled() || + base::FeatureList::IsEnabled(network::features::kNetworkService)) && request->fetch_request_context_type != REQUEST_CONTEXT_TYPE_FETCH) { // MIME sniffing should be disabled for a request initiated by fetch(). options |= network::mojom::kURLLoadOptionSniffMimeType; + throttles.push_back(std::make_unique<MimeSniffingThrottle>()); } if (is_sync) { options |= network::mojom::kURLLoadOptionSynchronous;
diff --git a/content/shell/browser/layout_test/layout_test_background_fetch_delegate.cc b/content/shell/browser/layout_test/layout_test_background_fetch_delegate.cc index 4be2439b..c58dc94 100644 --- a/content/shell/browser/layout_test/layout_test_background_fetch_delegate.cc +++ b/content/shell/browser/layout_test/layout_test_background_fetch_delegate.cc
@@ -6,11 +6,13 @@ #include "base/callback.h" #include "base/memory/ptr_util.h" +#include "base/test/scoped_feature_list.h" #include "components/download/content/factory/download_service_factory.h" #include "components/download/public/background_service/clients.h" #include "components/download/public/background_service/download_metadata.h" #include "components/download/public/background_service/download_params.h" #include "components/download/public/background_service/download_service.h" +#include "components/download/public/background_service/features.h" #include "content/public/browser/background_fetch_description.h" #include "content/public/browser/background_fetch_response.h" #include "content/public/browser/browser_context.h" @@ -195,10 +197,19 @@ clients->emplace(download::DownloadClient::BACKGROUND_FETCH, std::move(background_fetch_client)); - download_service_ = base::WrapUnique(download::BuildInMemoryDownloadService( - browser_context_, std::move(clients), base::FilePath(), - BrowserContext::GetBlobStorageContext(browser_context_), - BrowserThread::GetTaskRunnerForThread(BrowserThread::IO))); + // Use a ScopedFeatureList to enable and configure the download service as + // if done by Finch. We have a strict dependency on it. + { + base::test::ScopedFeatureList download_service_configuration; + download_service_configuration.InitAndEnableFeatureWithParameters( + download::kDownloadServiceFeature, {{"start_up_delay_ms", "0"}}); + + download_service_ = + base::WrapUnique(download::BuildInMemoryDownloadService( + browser_context_, std::move(clients), base::FilePath(), + BrowserContext::GetBlobStorageContext(browser_context_), + BrowserThread::GetTaskRunnerForThread(BrowserThread::IO))); + } } background_fetch_client_->RegisterDownload(download_guid, job_unique_id);
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index e754e7e..413b97c3 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -1603,6 +1603,7 @@ "../common/mac/attributed_string_coder_unittest.mm", "../common/manifest_util_unittest.cc", "../common/media/media_devices_unittest.cc", + "../common/mime_sniffing_throttle_unittest.cc", "../common/notifications/notification_struct_traits_unittest.cc", "../common/origin_util_unittest.cc", "../common/page_state_serialization_unittest.cc",
diff --git a/content/test/data/sxg/generate-test-sxgs.sh b/content/test/data/sxg/generate-test-sxgs.sh index 039006e..c020908e 100755 --- a/content/test/data/sxg/generate-test-sxgs.sh +++ b/content/test/data/sxg/generate-test-sxgs.sh
@@ -15,18 +15,20 @@ done tmpdir=$(mktemp -d) +sctdir=$tmpdir/scts +mkdir $sctdir # Make dummy OCSP and SCT data for cbor certificate chains. -echo -n OCSP >$tmpdir/ocsp; echo -n SCT >$tmpdir/sct +echo -n OCSP >$tmpdir/ocsp; echo -n SCT >$sctdir/dummy.sct # Generate the certificate chain of "*.example.org". gen-certurl -pem prime256v1-sha256.public.pem \ - -ocsp $tmpdir/ocsp -sct $tmpdir/sct > test.example.org.public.pem.cbor + -ocsp $tmpdir/ocsp -sctDir $sctdir > test.example.org.public.pem.cbor # Generate the certificate chain of "*.example.org", without # CanSignHttpExchangesDraft extension. gen-certurl -pem prime256v1-sha256-noext.public.pem \ - -ocsp $tmpdir/ocsp -sct $tmpdir/sct > test.example.org-noext.public.pem.cbor + -ocsp $tmpdir/ocsp -sctDir $sctdir > test.example.org-noext.public.pem.cbor # Generate the signed exchange file. gen-signedexchange \
diff --git a/content/test/data/sxg/test.example.com_invalid_test.sxg b/content/test/data/sxg/test.example.com_invalid_test.sxg index c88149827..8e3d869 100644 --- a/content/test/data/sxg/test.example.com_invalid_test.sxg +++ b/content/test/data/sxg/test.example.com_invalid_test.sxg Binary files differ
diff --git a/content/test/data/sxg/test.example.org-noext.public.pem.cbor b/content/test/data/sxg/test.example.org-noext.public.pem.cbor index 4eea6777..7238915 100644 --- a/content/test/data/sxg/test.example.org-noext.public.pem.cbor +++ b/content/test/data/sxg/test.example.org-noext.public.pem.cbor Binary files differ
diff --git a/content/test/data/sxg/test.example.org.public.pem.cbor b/content/test/data/sxg/test.example.org.public.pem.cbor index 66812b4..33d8d888 100644 --- a/content/test/data/sxg/test.example.org.public.pem.cbor +++ b/content/test/data/sxg/test.example.org.public.pem.cbor Binary files differ
diff --git a/content/test/data/sxg/test.example.org_hello.txt.sxg b/content/test/data/sxg/test.example.org_hello.txt.sxg index 52d7536..f70e336 100644 --- a/content/test/data/sxg/test.example.org_hello.txt.sxg +++ b/content/test/data/sxg/test.example.org_hello.txt.sxg Binary files differ
diff --git a/content/test/data/sxg/test.example.org_noext_test.sxg b/content/test/data/sxg/test.example.org_noext_test.sxg index 366151f1..e5494de 100644 --- a/content/test/data/sxg/test.example.org_noext_test.sxg +++ b/content/test/data/sxg/test.example.org_noext_test.sxg Binary files differ
diff --git a/content/test/data/sxg/test.example.org_test.sxg b/content/test/data/sxg/test.example.org_test.sxg index b2f5ef9..f40e6c19 100644 --- a/content/test/data/sxg/test.example.org_test.sxg +++ b/content/test/data/sxg/test.example.org_test.sxg Binary files differ
diff --git a/device/BUILD.gn b/device/BUILD.gn index 60b2c45..43e791c 100644 --- a/device/BUILD.gn +++ b/device/BUILD.gn
@@ -306,6 +306,8 @@ "bluetooth/test/fake_gatt_device_service_winrt.h", "bluetooth/test/fake_gatt_device_services_result_winrt.cc", "bluetooth/test/fake_gatt_device_services_result_winrt.h", + "bluetooth/test/fake_gatt_read_result_winrt.cc", + "bluetooth/test/fake_gatt_read_result_winrt.h", "bluetooth/test/fake_radio_winrt.cc", "bluetooth/test/fake_radio_winrt.h", ]
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic_mac.mm b/device/bluetooth/bluetooth_remote_gatt_characteristic_mac.mm index 2e91b58f..086b01e 100644 --- a/device/bluetooth/bluetooth_remote_gatt_characteristic_mac.mm +++ b/device/bluetooth/bluetooth_remote_gatt_characteristic_mac.mm
@@ -84,14 +84,12 @@ BluetoothRemoteGattCharacteristicMac::~BluetoothRemoteGattCharacteristicMac() { if (HasPendingRead()) { - std::pair<ValueCallback, ErrorCallback> callbacks; - callbacks.swap(read_characteristic_value_callbacks_); - callbacks.second.Run(BluetoothGattService::GATT_ERROR_FAILED); + read_characteristic_value_callbacks_.second.Run( + BluetoothGattService::GATT_ERROR_FAILED); } if (HasPendingWrite()) { - std::pair<base::Closure, ErrorCallback> callbacks; - callbacks.swap(write_characteristic_value_callbacks_); - callbacks.second.Run(BluetoothGattService::GATT_ERROR_FAILED); + write_characteristic_value_callbacks_.second.Run( + BluetoothGattService::GATT_ERROR_FAILED); } }
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc b/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc index c642513a..1ef8b7b 100644 --- a/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc +++ b/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc
@@ -29,7 +29,12 @@ namespace device { -class BluetoothRemoteGattCharacteristicTest : public BluetoothTest { +class BluetoothRemoteGattCharacteristicTest : +#if defined(OS_WIN) + public BluetoothTestWinrt { +#else + public BluetoothTest { +#endif public: // Creates adapter_, device_, service_, characteristic1_, & characteristic2_. // |properties| will be used for each characteristic. @@ -49,6 +54,7 @@ service_ = device_->GetGattServices()[0]; SimulateGattCharacteristic(service_, kTestUUIDDeviceName, properties); SimulateGattCharacteristic(service_, kTestUUIDDeviceName, properties); + base::RunLoop().RunUntilIdle(); ASSERT_EQ(2u, service_->GetCharacteristics().size()); characteristic1_ = service_->GetCharacteristics()[0]; characteristic2_ = service_->GetCharacteristics()[1]; @@ -131,18 +137,42 @@ ExpectedNotifyValue(notify_value_state); } + // A few tests below don't behave correctly on Classic Windows, but do for + // WinRT. Since a #if defined(OS_WIN) guard is not sufficient to distinguish + // these two cases, this small utility function is added. + bool IsClassicWin() { +#if defined(OS_WIN) + return !GetParam(); +#else + return false; +#endif + } + BluetoothDevice* device_ = nullptr; BluetoothRemoteGattService* service_ = nullptr; BluetoothRemoteGattCharacteristic* characteristic1_ = nullptr; BluetoothRemoteGattCharacteristic* characteristic2_ = nullptr; }; -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_WIN) +using BluetoothRemoteGattCharacteristicTestWinrt = + BluetoothRemoteGattCharacteristicTest; +using BluetoothRemoteGattCharacteristicTestWin32Only = + BluetoothRemoteGattCharacteristicTest; +using BluetoothRemoteGattCharacteristicTestWinrtOnly = + BluetoothRemoteGattCharacteristicTest; +#endif + +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_GetIdentifier GetIdentifier #else #define MAYBE_GetIdentifier DISABLED_GetIdentifier #endif +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, GetIdentifier) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_GetIdentifier) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -181,6 +211,7 @@ SimulateGattCharacteristic(service2, kTestUUIDDeviceName, /* properties */ 0); SimulateGattCharacteristic(service3, kTestUUIDDeviceName, /* properties */ 0); SimulateGattCharacteristic(service3, kTestUUIDDeviceName, /* properties */ 0); + base::RunLoop().RunUntilIdle(); BluetoothRemoteGattCharacteristic* char1 = service1->GetCharacteristics()[0]; BluetoothRemoteGattCharacteristic* char2 = service1->GetCharacteristics()[1]; BluetoothRemoteGattCharacteristic* char3 = service2->GetCharacteristics()[0]; @@ -210,12 +241,16 @@ EXPECT_NE(char5->GetIdentifier(), char6->GetIdentifier()); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_GetUUID GetUUID #else #define MAYBE_GetUUID DISABLED_GetUUID #endif +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, GetUUID) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_GetUUID) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -238,6 +273,7 @@ SimulateGattCharacteristic(service, kTestUUIDDeviceName, /* properties */ 0); SimulateGattCharacteristic(service, kTestUUIDAppearance, /* properties */ 0); SimulateGattCharacteristic(service, kTestUUIDAppearance, /* properties */ 0); + base::RunLoop().RunUntilIdle(); BluetoothRemoteGattCharacteristic* char1 = service->GetCharacteristics()[0]; BluetoothRemoteGattCharacteristic* char2 = service->GetCharacteristics()[1]; BluetoothRemoteGattCharacteristic* char3 = service->GetCharacteristics()[2]; @@ -254,12 +290,16 @@ EXPECT_EQ(uuid2, char3->GetUUID()); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_GetProperties GetProperties #else #define MAYBE_GetProperties DISABLED_GetProperties #endif +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, GetProperties) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_GetProperties) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -279,6 +319,7 @@ // Create two characteristics with different properties: SimulateGattCharacteristic(service, kTestUUIDDeviceName, /* properties */ 0); SimulateGattCharacteristic(service, kTestUUIDDeviceName, /* properties */ 7); + base::RunLoop().RunUntilIdle(); // Read the properties. Because ordering is unknown swap as necessary. int properties1 = service->GetCharacteristics()[0]->GetProperties(); @@ -289,13 +330,17 @@ EXPECT_EQ(7, properties2); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_GetService GetService #else #define MAYBE_GetService DISABLED_GetService #endif // Tests GetService. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, GetService) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_GetService) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -306,15 +351,20 @@ EXPECT_EQ(service_, characteristic2_->GetService()); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_ReadRemoteCharacteristic_Empty ReadRemoteCharacteristic_Empty #else #define MAYBE_ReadRemoteCharacteristic_Empty \ DISABLED_ReadRemoteCharacteristic_Empty #endif // Tests ReadRemoteCharacteristic and GetValue with empty value buffer. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + ReadRemoteCharacteristic_Empty) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_ReadRemoteCharacteristic_Empty) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -338,15 +388,20 @@ EXPECT_EQ(empty_vector, characteristic1_->GetValue()); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_WriteRemoteCharacteristic_Empty WriteRemoteCharacteristic_Empty #else #define MAYBE_WriteRemoteCharacteristic_Empty \ DISABLED_WriteRemoteCharacteristic_Empty #endif // Tests WriteRemoteCharacteristic with empty value buffer. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + WriteRemoteCharacteristic_Empty) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_WriteRemoteCharacteristic_Empty) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -369,7 +424,91 @@ EXPECT_EQ(empty_vector, last_write_value_); } -#if defined(OS_ANDROID) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) +#define MAYBE_Retry_ReadRemoteCharacteristic_DuringDestruction_Fails \ + Retry_ReadRemoteCharacteristic_DuringDestruction_Fails +#else +#define MAYBE_Retry_ReadRemoteCharacteristic_DuringDestruction_Fails \ + DISABLED_Retry_ReadRemoteCharacteristic_DuringDestruction_Fails +#endif +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + Retry_ReadRemoteCharacteristic_DuringDestruction_Fails) { +#else +TEST_F(BluetoothRemoteGattCharacteristicTest, + MAYBE_Retry_ReadRemoteCharacteristic_DuringDestruction_Fails) { +#endif + if (!PlatformSupportsLowEnergy()) { + LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; + return; + } + ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate( + BluetoothRemoteGattCharacteristic::PROPERTY_READ)); + + bool read_error_callback_called = false; + characteristic1_->ReadRemoteCharacteristic( + GetReadValueCallback(Call::NOT_EXPECTED), + base::BindLambdaForTesting( + [&](BluetoothRemoteGattService::GattErrorCode error_code) { + EXPECT_EQ(BluetoothRemoteGattService::GATT_ERROR_FAILED, + error_code); + read_error_callback_called = true; + // Retrying Read should fail: + characteristic1_->ReadRemoteCharacteristic( + GetReadValueCallback(Call::NOT_EXPECTED), + GetGattErrorCallback(Call::EXPECTED)); + })); + + DeleteDevice(device_); // TODO(576906) delete only the characteristic. + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(read_error_callback_called); + EXPECT_EQ(BluetoothRemoteGattService::GATT_ERROR_IN_PROGRESS, + last_gatt_error_code_); +} + +#if defined(OS_ANDROID) || defined(OS_MACOSX) +#define MAYBE_Retry_WriteRemoteCharacteristic_DuringDestruction_Fails \ + Retry_WriteRemoteCharacteristic_DuringDestruction_Fails +#else +#define MAYBE_Retry_WriteRemoteCharacteristic_DuringDestruction_Fails \ + DISABLED_Retry_WriteRemoteCharacteristic_DuringDestruction_Fails +#endif +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + Retry_WriteRemoteCharacteristic_DuringDestruction_Fails) { +#else +TEST_F(BluetoothRemoteGattCharacteristicTest, + MAYBE_Retry_WriteRemoteCharacteristic_DuringDestruction_Fails) { +#endif + if (!PlatformSupportsLowEnergy()) { + LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; + return; + } + ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate( + BluetoothRemoteGattCharacteristic::PROPERTY_WRITE)); + + bool write_error_callback_called = false; + characteristic1_->WriteRemoteCharacteristic( + {} /* value */, GetCallback(Call::NOT_EXPECTED), + base::BindLambdaForTesting( + [&](BluetoothRemoteGattService::GattErrorCode error_code) { + EXPECT_EQ(BluetoothRemoteGattService::GATT_ERROR_FAILED, + error_code); + write_error_callback_called = true; + // Retrying Write should fail: + characteristic1_->WriteRemoteCharacteristic( + {} /* value */, GetCallback(Call::NOT_EXPECTED), + GetGattErrorCallback(Call::EXPECTED)); + })); + + DeleteDevice(device_); // TODO(576906) delete only the characteristic. + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(write_error_callback_called); + EXPECT_EQ(BluetoothRemoteGattService::GATT_ERROR_IN_PROGRESS, + last_gatt_error_code_); +} + +#if defined(OS_ANDROID) #define MAYBE_ReadRemoteCharacteristic_AfterDeleted \ ReadRemoteCharacteristic_AfterDeleted #else @@ -379,8 +518,15 @@ // Tests ReadRemoteCharacteristic completing after Chrome objects are deleted. // macOS: Not applicable: This can never happen if CBPeripheral delegate is set // to nil. +// WinRT: Not applicable: Pending callbacks won't fire once the underlying +// object is destroyed. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, + ReadRemoteCharacteristic_AfterDeleted) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_ReadRemoteCharacteristic_AfterDeleted) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -411,8 +557,13 @@ #define MAYBE_ReadRemoteCharacteristic_Disconnected \ DISABLED_ReadRemoteCharacteristic_Disconnected #endif +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly, + ReadRemoteCharacteristic_Disconnected) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_ReadRemoteCharacteristic_Disconnected) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -425,10 +576,10 @@ GetGattErrorCallback(Call::EXPECTED)); // Set up for receiving a read response after disconnection. -// On macOS no events arrive after disconnection so there is no point +// On macOS or WinRT no events arrive after disconnection so there is no point // in building the infrastructure to test this behavior. FYI // the code CHECKs that responses arrive only when the device is connected. -#if !defined(OS_MACOSX) +#if defined(OS_ANDROID) RememberCharacteristicForSubsequentAction(characteristic1_); #endif @@ -440,8 +591,8 @@ last_gatt_error_code_); // Dispatch read response after disconnection. See above explanation for why -// we don't do this in macOS. -#if !defined(OS_MACOSX) +// we don't do this in macOS on WinRT. +#if defined(OS_ANDROID) std::vector<uint8_t> empty_vector; SimulateGattCharacteristicRead(nullptr /* use remembered characteristic */, empty_vector); @@ -449,7 +600,7 @@ #endif } -#if defined(OS_ANDROID) || defined(OS_WIN) +#if defined(OS_ANDROID) #define MAYBE_WriteRemoteCharacteristic_AfterDeleted \ WriteRemoteCharacteristic_AfterDeleted #else @@ -459,8 +610,15 @@ // Tests WriteRemoteCharacteristic completing after Chrome objects are deleted. // macOS: Not applicable: This can never happen if CBPeripheral delegate is set // to nil. +// WinRT: Not applicable: Pending callbacks won't fire once the underlying +// object is destroyed. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, + WriteRemoteCharacteristic_AfterDeleted) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_WriteRemoteCharacteristic_AfterDeleted) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -490,8 +648,13 @@ #define MAYBE_WriteRemoteCharacteristic_Disconnected \ DISABLED_WriteRemoteCharacteristic_Disconnected #endif +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly, + WriteRemoteCharacteristic_Disconnected) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_WriteRemoteCharacteristic_Disconnected) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -505,12 +668,12 @@ GetGattErrorCallback(Call::EXPECTED)); // Set up for receiving a write response after disconnection. -// On macOS no events arrive after disconnection so there is no point +// On macOS and WinRT no events arrive after disconnection so there is no point // in building the infrastructure to test this behavior. FYI // the code CHECKs that responses arrive only when the device is connected. -#if !defined(OS_MACOSX) +#if defined(OS_ANDROID) RememberCharacteristicForSubsequentAction(characteristic1_); -#endif // !defined(OS_MACOSX) +#endif // defined(OS_ANDROID) ASSERT_EQ(1u, adapter_->GetDevices().size()); SimulateGattDisconnection(adapter_->GetDevices()[0]); @@ -520,20 +683,24 @@ last_gatt_error_code_); // Dispatch write response after disconnection. See above explanation for why -// we don't do this in macOS. -#if !defined(OS_MACOSX) +// we don't do this in macOS and WinRT. +#if defined(OS_ANDROID) SimulateGattCharacteristicWrite(/* use remembered characteristic */ nullptr); base::RunLoop().RunUntilIdle(); -#endif // !defined(OS_MACOSX) +#endif // defined(OS_ANDROID) } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_ReadRemoteCharacteristic ReadRemoteCharacteristic #else #define MAYBE_ReadRemoteCharacteristic DISABLED_ReadRemoteCharacteristic #endif // Tests ReadRemoteCharacteristic and GetValue with non-empty value buffer. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, ReadRemoteCharacteristic) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_ReadRemoteCharacteristic) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -569,7 +736,7 @@ callback.Run(value); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_ReadRemoteCharacteristic_GattCharacteristicValueChangedNotCalled \ ReadRemoteCharacteristic_GattCharacteristicValueChangedNotCalled #else @@ -578,8 +745,13 @@ #endif // Tests that ReadRemoteCharacteristic doesn't result in a // GattCharacteristicValueChanged call. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + ReadRemoteCharacteristic_GattCharacteristicValueChangedNotCalled) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_ReadRemoteCharacteristic_GattCharacteristicValueChangedNotCalled) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -601,23 +773,27 @@ EXPECT_EQ(0, observer.gatt_characteristic_value_changed_count()); // TODO(https://crbug.com/699694): Remove this #if once the bug on Windows is // fixed. -#if defined(OS_WIN) - EXPECT_FALSE(observer.last_gatt_characteristic_id().empty()); - EXPECT_TRUE(observer.last_gatt_characteristic_uuid().IsValid()); -#else - EXPECT_TRUE(observer.last_gatt_characteristic_id().empty()); - EXPECT_FALSE(observer.last_gatt_characteristic_uuid().IsValid()); -#endif // defined(OS_WIN) + if (IsClassicWin()) { + EXPECT_FALSE(observer.last_gatt_characteristic_id().empty()); + EXPECT_TRUE(observer.last_gatt_characteristic_uuid().IsValid()); + } else { + EXPECT_TRUE(observer.last_gatt_characteristic_id().empty()); + EXPECT_FALSE(observer.last_gatt_characteristic_uuid().IsValid()); + } EXPECT_TRUE(observer.last_changed_characteristic_value().empty()); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_WriteRemoteCharacteristic WriteRemoteCharacteristic #else #define MAYBE_WriteRemoteCharacteristic DISABLED_WriteRemoteCharacteristic #endif // Tests WriteRemoteCharacteristic with non-empty value buffer. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, WriteRemoteCharacteristic) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_WriteRemoteCharacteristic) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -637,22 +813,26 @@ base::RunLoop().RunUntilIdle(); EXPECT_EQ(1, gatt_write_characteristic_attempts_); -#if !defined(OS_WIN) - // TODO(crbug.com/653291): remove this #if once the bug on windows is fixed. - EXPECT_EQ(0, observer.gatt_characteristic_value_changed_count()); -#endif + // TODO(crbug.com/653291): remove this if once the bug on windows is fixed. + if (!IsClassicWin()) + EXPECT_EQ(0, observer.gatt_characteristic_value_changed_count()); EXPECT_EQ(test_vector, last_write_value_); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_ReadRemoteCharacteristic_Twice ReadRemoteCharacteristic_Twice #else #define MAYBE_ReadRemoteCharacteristic_Twice \ DISABLED_ReadRemoteCharacteristic_Twice #endif // Tests ReadRemoteCharacteristic and GetValue multiple times. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + ReadRemoteCharacteristic_Twice) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_ReadRemoteCharacteristic_Twice) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -689,15 +869,20 @@ EXPECT_EQ(empty_vector, characteristic1_->GetValue()); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_WriteRemoteCharacteristic_Twice WriteRemoteCharacteristic_Twice #else #define MAYBE_WriteRemoteCharacteristic_Twice \ DISABLEDWriteRemoteCharacteristic_Twice #endif // Tests WriteRemoteCharacteristic multiple times. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + WriteRemoteCharacteristic_Twice) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_WriteRemoteCharacteristic_Twice) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -733,7 +918,7 @@ EXPECT_EQ(empty_vector, last_write_value_); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_ReadRemoteCharacteristic_MultipleCharacteristics \ ReadRemoteCharacteristic_MultipleCharacteristics #else @@ -741,8 +926,13 @@ DISABLED_ReadRemoteCharacteristic_MultipleCharacteristics #endif // Tests ReadRemoteCharacteristic on two characteristics. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + ReadRemoteCharacteristic_MultipleCharacteristics) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_ReadRemoteCharacteristic_MultipleCharacteristics) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -778,7 +968,7 @@ EXPECT_EQ(test_vector2, characteristic2_->GetValue()); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_WriteRemoteCharacteristic_MultipleCharacteristics \ WriteRemoteCharacteristic_MultipleCharacteristics #else @@ -786,8 +976,13 @@ DISABLED_WriteRemoteCharacteristic_MultipleCharacteristics #endif // Tests WriteRemoteCharacteristic on two characteristics. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + WriteRemoteCharacteristic_MultipleCharacteristics) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_WriteRemoteCharacteristic_MultipleCharacteristics) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -800,33 +995,29 @@ characteristic1_->WriteRemoteCharacteristic( test_vector1, GetCallback(Call::EXPECTED), GetGattErrorCallback(Call::NOT_EXPECTED)); -#if defined(OS_ANDROID) || defined(OS_MACOSX) - EXPECT_EQ(test_vector1, last_write_value_); -#endif + if (!IsClassicWin()) + EXPECT_EQ(test_vector1, last_write_value_); std::vector<uint8_t> test_vector2; test_vector2.push_back(222); characteristic2_->WriteRemoteCharacteristic( test_vector2, GetCallback(Call::EXPECTED), GetGattErrorCallback(Call::NOT_EXPECTED)); -#if defined(OS_ANDROID) || defined(OS_MACOSX) - EXPECT_EQ(test_vector2, last_write_value_); -#endif + if (!IsClassicWin()) + EXPECT_EQ(test_vector2, last_write_value_); EXPECT_EQ(0, callback_count_); EXPECT_EQ(0, error_callback_count_); SimulateGattCharacteristicWrite(characteristic1_); base::RunLoop().RunUntilIdle(); -#if !(defined(OS_ANDROID) || defined(OS_MACOSX)) - EXPECT_EQ(test_vector1, last_write_value_); -#endif + if (IsClassicWin()) + EXPECT_EQ(test_vector1, last_write_value_); SimulateGattCharacteristicWrite(characteristic2_); base::RunLoop().RunUntilIdle(); -#if !(defined(OS_ANDROID) || defined(OS_MACOSX)) - EXPECT_EQ(test_vector2, last_write_value_); -#endif + if (IsClassicWin()) + EXPECT_EQ(test_vector2, last_write_value_); EXPECT_EQ(2, gatt_write_characteristic_attempts_); EXPECT_EQ(2, callback_count_); @@ -835,7 +1026,7 @@ // TODO(591740): Remove if define for OS_ANDROID in this test. } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_RemoteCharacteristic_Nested_Read_Read \ RemoteCharacteristic_Nested_Read_Read #else @@ -844,8 +1035,13 @@ #endif // Tests a nested ReadRemoteCharacteristic from within another // ReadRemoteCharacteristic. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + RemoteCharacteristic_Nested_Read_Read) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_RemoteCharacteristic_Nested_Read_Read) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -882,7 +1078,7 @@ EXPECT_EQ(test_vector_2, characteristic1_->GetValue()); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_RemoteCharacteristic_Nested_Write_Write \ RemoteCharacteristic_Nested_Write_Write #else @@ -891,8 +1087,13 @@ #endif // Tests a nested WriteRemoteCharacteristic from within another // WriteRemoteCharacteristic. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + RemoteCharacteristic_Nested_Write_Write) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_RemoteCharacteristic_Nested_Write_Write) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -928,7 +1129,7 @@ EXPECT_EQ(test_vector_2, last_write_value_); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_RemoteCharacteristic_Nested_Read_Write \ RemoteCharacteristic_Nested_Read_Write #else @@ -937,8 +1138,13 @@ #endif // Tests a nested WriteRemoteCharacteristic from within a // ReadRemoteCharacteristic. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + RemoteCharacteristic_Nested_Read_Write) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_RemoteCharacteristic_Nested_Read_Write) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -977,7 +1183,7 @@ EXPECT_EQ(test_vector_2, last_write_value_); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_RemoteCharacteristic_Nested_Write_Read \ RemoteCharacteristic_Nested_Write_Read #else @@ -986,8 +1192,13 @@ #endif // Tests a nested ReadRemoteCharacteristic from within a // WriteRemoteCharacteristic. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + RemoteCharacteristic_Nested_Write_Read) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_RemoteCharacteristic_Nested_Write_Read) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -1026,13 +1237,19 @@ EXPECT_EQ(test_vector_2, characteristic1_->GetValue()); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_ReadError ReadError #else #define MAYBE_ReadError DISABLED_ReadError #endif // Tests ReadRemoteCharacteristic asynchronous error. +#if defined(OS_WIN) +// TODO(https://crbug.com/821766): Enable this test for WinRT once +// SimulateGattCharacteristicReadError() is implemented. +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, ReadError) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_ReadError) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -1055,13 +1272,19 @@ EXPECT_EQ(0, observer.gatt_characteristic_value_changed_count()); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_WriteError WriteError #else #define MAYBE_WriteError DISABLED_WriteError #endif // Tests WriteRemoteCharacteristic asynchronous error. +#if defined(OS_WIN) +// TODO(https://crbug.com/821766): Enable this test for WinRT once +// SimulateGattCharacteristicWriteError() is implemented. +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, WriteError) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_WriteError) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -1089,8 +1312,8 @@ #define MAYBE_ReadSynchronousError DISABLED_ReadSynchronousError #endif // Tests ReadRemoteCharacteristic synchronous error. -// Test not relevant for macOS since characteristic read cannot generate -// synchronous error. +// Test not relevant for macOS and WinRT since characteristic read cannot +// generate synchronous error. TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_ReadSynchronousError) { ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate()); @@ -1124,7 +1347,8 @@ #define MAYBE_WriteSynchronousError DISABLED_WriteSynchronousError #endif // Tests WriteRemoteCharacteristic synchronous error. -// This test doesn't apply to macOS synchronous API does exist. +// This test doesn't apply to macOS and WinRT since a synchronous API does not +// exist. TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_WriteSynchronousError) { ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate()); @@ -1152,7 +1376,7 @@ EXPECT_EQ(0, error_callback_count_); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_ReadRemoteCharacteristic_ReadPending \ ReadRemoteCharacteristic_ReadPending #else @@ -1160,8 +1384,13 @@ DISABLED_ReadRemoteCharacteristic_ReadPending #endif // Tests ReadRemoteCharacteristic error with a pending read operation. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + ReadRemoteCharacteristic_ReadPending) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_ReadRemoteCharacteristic_ReadPending) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -1192,7 +1421,7 @@ EXPECT_EQ(0, error_callback_count_); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_WriteRemoteCharacteristic_WritePending \ WriteRemoteCharacteristic_WritePending #else @@ -1200,8 +1429,13 @@ DISABLED_WriteRemoteCharacteristic_WritePending #endif // Tests WriteRemoteCharacteristic error with a pending write operation. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + WriteRemoteCharacteristic_WritePending) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_WriteRemoteCharacteristic_WritePending) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -1232,7 +1466,7 @@ EXPECT_EQ(0, error_callback_count_); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_ReadRemoteCharacteristic_WritePending \ ReadRemoteCharacteristic_WritePending #else @@ -1240,8 +1474,13 @@ DISABLED_ReadRemoteCharacteristic_WritePending #endif // Tests ReadRemoteCharacteristic error with a pending write operation. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + ReadRemoteCharacteristic_WritePending) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_ReadRemoteCharacteristic_WritePending) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -1273,7 +1512,7 @@ EXPECT_EQ(0, error_callback_count_); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_WriteRemoteCharacteristic_ReadPending \ WriteRemoteCharacteristic_ReadPending #else @@ -1281,8 +1520,13 @@ DISABLED_WriteRemoteCharacteristic_ReadPending #endif // Tests WriteRemoteCharacteristic error with a pending Read operation. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, + WriteRemoteCharacteristic_ReadPending) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_WriteRemoteCharacteristic_ReadPending) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -1375,7 +1619,7 @@ #endif // defined(OS_MACOSX) } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_Notification_During_WriteRemoteCharacteristic \ Notification_During_WriteRemoteCharacteristic #else @@ -1384,8 +1628,13 @@ #endif // Tests that a notification arriving during a pending write doesn't // cause a crash. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, + Notification_During_WriteRemoteCharacteristic) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_Notification_During_WriteRemoteCharacteristic) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -1416,7 +1665,7 @@ EXPECT_EQ(write_value, last_write_value_); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_StartNotifySession_NoNotifyOrIndicate \ StartNotifySession_NoNotifyOrIndicate #else @@ -1425,8 +1674,13 @@ #endif // StartNotifySession fails if characteristic doesn't have Notify or Indicate // property. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, + StartNotifySession_NoNotifyOrIndicate) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_StartNotifySession_NoNotifyOrIndicate) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -1445,7 +1699,7 @@ last_gatt_error_code_); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_StartNotifySession_NoConfigDescriptor \ StartNotifySession_NoConfigDescriptor #else @@ -1454,8 +1708,13 @@ #endif // StartNotifySession fails if the characteristic is missing the Client // Characteristic Configuration descriptor. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, + StartNotifySession_NoConfigDescriptor) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_StartNotifySession_NoConfigDescriptor) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -1474,7 +1733,7 @@ last_gatt_error_code_); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_StartNotifySession_MultipleConfigDescriptor \ StartNotifySession_MultipleConfigDescriptor #else @@ -1483,8 +1742,13 @@ #endif // StartNotifySession fails if the characteristic has multiple Client // Characteristic Configuration descriptors. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, + StartNotifySession_MultipleConfigDescriptor) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_StartNotifySession_MultipleConfigDescriptor) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -1560,13 +1824,17 @@ ASSERT_EQ(0u, notify_sessions_.size()); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_StartNotifySession StartNotifySession #else #define MAYBE_StartNotifySession DISABLED_StartNotifySession #endif // Tests StartNotifySession success on a characteristic that enabled Notify. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, StartNotifySession) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_StartNotifySession) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -1575,15 +1843,20 @@ /* properties: NOTIFY */ 0x10, NotifyValueState::NOTIFY)); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_StartNotifySession_OnIndicate StartNotifySession_OnIndicate #else #define MAYBE_StartNotifySession_OnIndicate \ DISABLED_StartNotifySession_OnIndicate #endif // Tests StartNotifySession success on a characteristic that enabled Indicate. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, + StartNotifySession_OnIndicate) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_StartNotifySession_OnIndicate) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -1592,7 +1865,7 @@ /* properties: INDICATE */ 0x20, NotifyValueState::INDICATE)); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_StartNotifySession_OnNotifyAndIndicate \ StartNotifySession_OnNotifyAndIndicate #else @@ -1601,8 +1874,13 @@ #endif // Tests StartNotifySession success on a characteristic that enabled Notify & // Indicate. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, + StartNotifySession_OnNotifyAndIndicate) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_StartNotifySession_OnNotifyAndIndicate) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -1612,14 +1890,19 @@ NotifyValueState::NOTIFY)); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_StartNotifySession_Multiple StartNotifySession_Multiple #else #define MAYBE_StartNotifySession_Multiple DISABLED_StartNotifySession_Multiple #endif // Tests multiple StartNotifySession success. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, + StartNotifySession_Multiple) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_StartNotifySession_Multiple) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -1781,7 +2064,7 @@ EXPECT_FALSE(notify_sessions_[0]->IsActive()); } -#if defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_MACOSX) #define MAYBE_StartNotifySession_Reentrant_Success_Success \ StartNotifySession_Reentrant_Success_Success #else @@ -1790,8 +2073,13 @@ #endif // Tests StartNotifySession reentrant in start notify session success callback // and the reentrant start notify session success. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, + StartNotifySession_Reentrant_Success_Success) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_StartNotifySession_Reentrant_Success_Success) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -1831,16 +2119,10 @@ } #if defined(OS_WIN) -#define MAYBE_StartNotifySession_Reentrant_Error_Error \ - StartNotifySession_Reentrant_Error_Error -#else -#define MAYBE_StartNotifySession_Reentrant_Error_Error \ - DISABLED_StartNotifySession_Reentrant_Error_Error -#endif // Tests StartNotifySession reentrant in start notify session error callback // and the reentrant start notify session error. -TEST_F(BluetoothRemoteGattCharacteristicTest, - MAYBE_StartNotifySession_Reentrant_Error_Error) { +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, + StartNotifySession_Reentrant_Error_Error) { ASSERT_NO_FATAL_FAILURE( FakeCharacteristicBoilerplate(/* properties: NOTIFY */ 0x10)); SimulateGattDescriptor( @@ -1870,6 +2152,7 @@ EXPECT_EQ(2, error_callback_count_); ASSERT_EQ(0u, notify_sessions_.size()); } +#endif #if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_StopNotifySession StopNotifySession @@ -2605,7 +2888,11 @@ #endif // TODO(786473) Android should report that services are discovered when a // characteristic is added, but currently does not. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, GattCharacteristicAdded) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_GattCharacteristicAdded) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -2618,15 +2905,20 @@ EXPECT_EQ(1, observer.gatt_services_discovered_count()); } -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_MACOSX) #define MAYBE_GattCharacteristicValueChanged GattCharacteristicValueChanged #else #define MAYBE_GattCharacteristicValueChanged \ DISABLED_GattCharacteristicValueChanged #endif // Tests Characteristic Value changes during a Notify Session. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, + GattCharacteristicValueChanged) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_GattCharacteristicValueChanged) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -2686,7 +2978,7 @@ observer.previous_characteristic_value_changed_values()); } -#if defined(OS_ANDROID) || defined(OS_WIN) +#if defined(OS_ANDROID) #define MAYBE_GattCharacteristicValueChanged_AfterDeleted \ GattCharacteristicValueChanged_AfterDeleted #else @@ -2697,8 +2989,13 @@ // destroyed. // macOS: Not applicable: This can never happen if CBPeripheral delegate is set // to nil. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, + GattCharacteristicValueChanged_AfterDeleted) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_GattCharacteristicValueChanged_AfterDeleted) { +#endif ASSERT_NO_FATAL_FAILURE(StartNotifyBoilerplate( /* properties: NOTIFY */ 0x10, NotifyValueState::NOTIFY)); TestBluetoothAdapterObserver observer(adapter_); @@ -2714,25 +3011,35 @@ EXPECT_EQ(0, observer.gatt_characteristic_value_changed_count()); } -#if defined(OS_ANDROID) || defined(OS_WIN) +#if defined(OS_ANDROID) #define MAYBE_GetDescriptors_FindNone GetDescriptors_FindNone #else #define MAYBE_GetDescriptors_FindNone DISABLED_GetDescriptors_FindNone #endif +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, + GetDescriptors_FindNone) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_GetDescriptors_FindNone) { +#endif ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate()); EXPECT_EQ(0u, characteristic1_->GetDescriptors().size()); } -#if defined(OS_ANDROID) || defined(OS_WIN) +#if defined(OS_ANDROID) #define MAYBE_GetDescriptors_and_GetDescriptor GetDescriptors_and_GetDescriptor #else #define MAYBE_GetDescriptors_and_GetDescriptor \ DISABLED_GetDescriptors_and_GetDescriptor #endif +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, + GetDescriptors_and_GetDescriptor) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_GetDescriptors_and_GetDescriptor) { +#endif ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate()); // Add several Descriptors: @@ -2775,12 +3082,16 @@ EXPECT_FALSE(c1_uuid1 == uuid3 || c1_uuid2 == uuid3); } -#if defined(OS_ANDROID) || defined(OS_WIN) +#if defined(OS_ANDROID) #define MAYBE_GetDescriptorsByUUID GetDescriptorsByUUID #else #define MAYBE_GetDescriptorsByUUID DISABLED_GetDescriptorsByUUID #endif +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, GetDescriptorsByUUID) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_GetDescriptorsByUUID) { +#endif ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate()); // Add several Descriptors: @@ -2872,12 +3183,18 @@ DISABLED_WriteWithoutResponseOnlyCharacteristic_WriteRemoteCharacteristicDuringDisconnect #endif // Tests that writing without response during a disconnect results in an error. -// Only applies to macOS whose events arrive all on the UI thread. See other -// *DuringDisconnect tests for Android and Windows whose events arrive on a -// different thread. +// Only applies to macOS and WinRT whose events arrive all on the UI thread. See +// other *DuringDisconnect tests for Android and Windows whose events arrive on +// a different thread. +#if defined(OS_WIN) +TEST_P( + BluetoothRemoteGattCharacteristicTestWinrtOnly, + WriteWithoutResponseOnlyCharacteristic_WriteRemoteCharacteristicDuringDisconnect) { +#else TEST_F( BluetoothRemoteGattCharacteristicTest, MAYBE_WriteWithoutResponseOnlyCharacteristic_WriteRemoteCharacteristicDuringDisconnect) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -2973,8 +3290,13 @@ // Tests that WriteWithoutResponse fails when a characteristic does not have the // required property. // TODO(https://crbug.com/831524): Enable for other platforms once supported. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly, + WriteWithoutResponse_PropertyNotPresent) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_WriteWithoutResponse_PropertyNotPresent) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -2996,8 +3318,13 @@ // Tests that WriteWithoutResponse fails when a characteristic already has a // pending write. // TODO(https://crbug.com/831524): Enable for other platforms once supported. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly, + WriteWithoutResponse_PendingWrite) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_WriteWithoutResponse_PendingWrite) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -3034,8 +3361,13 @@ // Tests that WriteWithoutResponse fails when a characteristic already has a // pending read. // TODO(https://crbug.com/831524): Enable for other platforms once supported. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly, + WriteWithoutResponse_PendingRead) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_WriteWithoutResponse_PendingRead) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -3071,8 +3403,13 @@ // Tests that WriteWithoutResponse indicates success if the proper conditions // are met. // TODO(https://crbug.com/831524): Enable for other platforms once supported. +#if defined(OS_WIN) +TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly, + WriteWithoutResponse_Success) { +#else TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_WriteWithoutResponse_Success) { +#endif if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -3287,4 +3624,21 @@ } #endif // defined(OS_MACOSX) +#if defined(OS_WIN) +INSTANTIATE_TEST_CASE_P( + /* no prefix */, + BluetoothRemoteGattCharacteristicTestWinrt, + ::testing::Bool()); + +INSTANTIATE_TEST_CASE_P( + /* no prefix */, + BluetoothRemoteGattCharacteristicTestWin32Only, + ::testing::Values(false)); + +INSTANTIATE_TEST_CASE_P( + /* no prefix */, + BluetoothRemoteGattCharacteristicTestWinrtOnly, + ::testing::Values(true)); +#endif // defined(OS_WIN) + } // namespace device
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.cc b/device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.cc index 8d2725e..9d1f17b 100644 --- a/device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.cc +++ b/device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.cc
@@ -6,10 +6,14 @@ #include <utility> +#include "base/bind_helpers.h" #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/strings/stringprintf.h" +#include "base/threading/thread_task_runner_handle.h" +#include "base/win/winrt_storage_util.h" #include "device/bluetooth/bluetooth_uuid.h" +#include "device/bluetooth/event_utils_winrt.h" namespace device { @@ -18,7 +22,21 @@ using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: GattCharacteristicProperties; using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + GattCommunicationStatus; +using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + GattCommunicationStatus_Success; +using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::GattReadResult; +using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + GattWriteOption_WriteWithResponse; +using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + GattWriteOption_WriteWithoutResponse; +using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: IGattCharacteristic; +using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + IGattReadResult; +using ABI::Windows::Foundation::IAsyncOperation; +using ABI::Windows::Storage::Streams::IBuffer; +using Microsoft::WRL::ComPtr; } // namespace @@ -26,7 +44,7 @@ std::unique_ptr<BluetoothRemoteGattCharacteristicWinrt> BluetoothRemoteGattCharacteristicWinrt::Create( BluetoothRemoteGattService* service, - IGattCharacteristic* characteristic) { + ComPtr<IGattCharacteristic> characteristic) { DCHECK(characteristic); GUID guid; HRESULT hr = characteristic->get_Uuid(&guid); @@ -52,11 +70,22 @@ } return base::WrapUnique(new BluetoothRemoteGattCharacteristicWinrt( - service, BluetoothUUID(guid), properties, attribute_handle)); + service, std::move(characteristic), BluetoothUUID(guid), properties, + attribute_handle)); } BluetoothRemoteGattCharacteristicWinrt:: - ~BluetoothRemoteGattCharacteristicWinrt() = default; + ~BluetoothRemoteGattCharacteristicWinrt() { + if (pending_read_callbacks_) { + pending_read_callbacks_->error_callback.Run( + BluetoothGattService::GATT_ERROR_FAILED); + } + + if (pending_write_callbacks_) { + pending_write_callbacks_->error_callback.Run( + BluetoothGattService::GATT_ERROR_FAILED); + } +} std::string BluetoothRemoteGattCharacteristicWinrt::GetIdentifier() const { return identifier_; @@ -90,14 +119,160 @@ void BluetoothRemoteGattCharacteristicWinrt::ReadRemoteCharacteristic( const ValueCallback& callback, const ErrorCallback& error_callback) { - NOTIMPLEMENTED(); + if (!(GetProperties() & PROPERTY_READ)) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::Bind(error_callback, + BluetoothRemoteGattService::GATT_ERROR_NOT_PERMITTED)); + return; + } + + if (pending_read_callbacks_ || pending_write_callbacks_) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::Bind(error_callback, + BluetoothRemoteGattService::GATT_ERROR_IN_PROGRESS)); + return; + } + + ComPtr<IAsyncOperation<GattReadResult*>> read_value_op; + HRESULT hr = characteristic_->ReadValueAsync(&read_value_op); + if (FAILED(hr)) { + VLOG(2) << "GattCharacteristic::ReadValueAsync failed: " + << logging::SystemErrorCodeToString(hr); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::Bind(error_callback, + BluetoothRemoteGattService::GATT_ERROR_FAILED)); + return; + } + + hr = PostAsyncResults( + std::move(read_value_op), + base::BindOnce(&BluetoothRemoteGattCharacteristicWinrt::OnReadValue, + weak_ptr_factory_.GetWeakPtr())); + + if (FAILED(hr)) { + VLOG(2) << "PostAsyncResults failed: " + << logging::SystemErrorCodeToString(hr); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::Bind(error_callback, + BluetoothRemoteGattService::GATT_ERROR_FAILED)); + return; + } + + pending_read_callbacks_ = + std::make_unique<PendingReadCallbacks>(callback, error_callback); } void BluetoothRemoteGattCharacteristicWinrt::WriteRemoteCharacteristic( const std::vector<uint8_t>& value, const base::Closure& callback, const ErrorCallback& error_callback) { - NOTIMPLEMENTED(); + if (!(GetProperties() & PROPERTY_WRITE) && + !(GetProperties() & PROPERTY_WRITE_WITHOUT_RESPONSE)) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::Bind(error_callback, + BluetoothRemoteGattService::GATT_ERROR_NOT_PERMITTED)); + return; + } + + if (pending_read_callbacks_ || pending_write_callbacks_) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::Bind(error_callback, + BluetoothRemoteGattService::GATT_ERROR_IN_PROGRESS)); + return; + } + + ComPtr<IBuffer> buffer; + HRESULT hr = + base::win::CreateIBufferFromData(value.data(), value.size(), &buffer); + if (FAILED(hr)) { + VLOG(2) << "base::win::CreateIBufferFromData failed: " + << logging::SystemErrorCodeToString(hr); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::Bind(error_callback, + BluetoothRemoteGattService::GATT_ERROR_FAILED)); + return; + } + + ComPtr<IAsyncOperation<GattCommunicationStatus>> write_value_op; + hr = characteristic_->WriteValueWithOptionAsync( + buffer.Get(), + (GetProperties() & PROPERTY_WRITE) ? GattWriteOption_WriteWithResponse + : GattWriteOption_WriteWithoutResponse, + + &write_value_op); + if (FAILED(hr)) { + VLOG(2) << "GattCharacteristic::WriteValueWithOptionAsync failed: " + << logging::SystemErrorCodeToString(hr); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::Bind(error_callback, + BluetoothRemoteGattService::GATT_ERROR_FAILED)); + return; + } + + hr = PostAsyncResults( + std::move(write_value_op), + base::BindOnce( + &BluetoothRemoteGattCharacteristicWinrt::OnWriteValueWithOption, + weak_ptr_factory_.GetWeakPtr())); + + if (FAILED(hr)) { + VLOG(2) << "PostAsyncResults failed: " + << logging::SystemErrorCodeToString(hr); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::Bind(error_callback, + BluetoothRemoteGattService::GATT_ERROR_FAILED)); + return; + } + + pending_write_callbacks_ = + std::make_unique<PendingWriteCallbacks>(callback, error_callback); +} + +bool BluetoothRemoteGattCharacteristicWinrt::WriteWithoutResponse( + base::span<const uint8_t> value) { + if (!(GetProperties() & PROPERTY_WRITE_WITHOUT_RESPONSE)) + return false; + + if (pending_read_callbacks_ || pending_write_callbacks_) + return false; + + ComPtr<IBuffer> buffer; + HRESULT hr = + base::win::CreateIBufferFromData(value.data(), value.size(), &buffer); + if (FAILED(hr)) { + VLOG(2) << "base::win::CreateIBufferFromData failed: " + << logging::SystemErrorCodeToString(hr); + return false; + } + + ComPtr<IAsyncOperation<GattCommunicationStatus>> write_value_op; + hr = characteristic_->WriteValueWithOptionAsync( + buffer.Get(), GattWriteOption_WriteWithoutResponse, &write_value_op); + if (FAILED(hr)) { + VLOG(2) << "GattCharacteristic::WriteValueWithOptionAsync failed: " + << logging::SystemErrorCodeToString(hr); + return false; + } + + // While we are ignoring the response, we still post the async_op in order to + // extend its lifetime until the operation has completed. + hr = PostAsyncResults(std::move(write_value_op), base::DoNothing()); + if (FAILED(hr)) { + VLOG(2) << "PostAsyncResults failed: " + << logging::SystemErrorCodeToString(hr); + return false; + } + + return true; +} + +IGattCharacteristic* +BluetoothRemoteGattCharacteristicWinrt::GetCharacteristicForTesting() { + return characteristic_.Get(); } void BluetoothRemoteGattCharacteristicWinrt::SubscribeToNotifications( @@ -114,17 +289,108 @@ NOTIMPLEMENTED(); } +BluetoothRemoteGattCharacteristicWinrt::PendingReadCallbacks:: + PendingReadCallbacks(ValueCallback callback, ErrorCallback error_callback) + : callback(std::move(callback)), + error_callback(std::move(error_callback)) {} +BluetoothRemoteGattCharacteristicWinrt::PendingReadCallbacks:: + ~PendingReadCallbacks() = default; + +BluetoothRemoteGattCharacteristicWinrt::PendingWriteCallbacks:: + PendingWriteCallbacks(base::OnceClosure callback, + ErrorCallback error_callback) + : callback(std::move(callback)), + error_callback(std::move(error_callback)) {} +BluetoothRemoteGattCharacteristicWinrt::PendingWriteCallbacks:: + ~PendingWriteCallbacks() = default; + BluetoothRemoteGattCharacteristicWinrt::BluetoothRemoteGattCharacteristicWinrt( BluetoothRemoteGattService* service, + ComPtr<IGattCharacteristic> characteristic, BluetoothUUID uuid, Properties properties, uint16_t attribute_handle) : service_(service), + characteristic_(std::move(characteristic)), uuid_(std::move(uuid)), properties_(properties), identifier_(base::StringPrintf("%s/%s_%04x", service_->GetIdentifier().c_str(), uuid_.value().c_str(), - attribute_handle)) {} + attribute_handle)), + weak_ptr_factory_(this) {} + +void BluetoothRemoteGattCharacteristicWinrt::OnReadValue( + ComPtr<IGattReadResult> read_result) { + DCHECK(pending_read_callbacks_); + auto pending_read_callbacks = std::move(pending_read_callbacks_); + + if (!read_result) { + pending_read_callbacks->error_callback.Run( + BluetoothGattService::GATT_ERROR_FAILED); + return; + } + + GattCommunicationStatus status; + HRESULT hr = read_result->get_Status(&status); + if (FAILED(hr)) { + VLOG(2) << "Getting GATT Communication Status failed: " + << logging::SystemErrorCodeToString(hr); + pending_read_callbacks->error_callback.Run( + BluetoothGattService::GATT_ERROR_FAILED); + return; + } + + // TODO(https://crbug.com/821766): Implement more fine-grained error reporting + // by inspecting protocol errors. + if (status != GattCommunicationStatus_Success) { + VLOG(2) << "Unexpected GattCommunicationStatus: " << status; + pending_read_callbacks->error_callback.Run( + BluetoothGattService::GATT_ERROR_FAILED); + return; + } + + ComPtr<IBuffer> value; + hr = read_result->get_Value(&value); + if (FAILED(hr)) { + VLOG(2) << "Getting Characteristic Value failed: " + << logging::SystemErrorCodeToString(hr); + pending_read_callbacks->error_callback.Run( + BluetoothGattService::GATT_ERROR_FAILED); + return; + } + + uint8_t* data = nullptr; + uint32_t length = 0; + hr = base::win::GetPointerToBufferData(value.Get(), &data, &length); + if (FAILED(hr)) { + VLOG(2) << "Getting Pointer To Buffer Data failed: " + << logging::SystemErrorCodeToString(hr); + pending_read_callbacks->error_callback.Run( + BluetoothGattService::GATT_ERROR_FAILED); + return; + } + + value_.assign(data, data + length); + pending_read_callbacks->callback.Run(value_); +} + +void BluetoothRemoteGattCharacteristicWinrt::OnWriteValueWithOption( + GattCommunicationStatus status) { + if (!pending_write_callbacks_) + return; + + auto pending_write_callbacks = std::move(pending_write_callbacks_); + // TODO(https://crbug.com/821766): Implement more fine-grained error reporting + // by inspecting protocol errors. + if (status != GattCommunicationStatus_Success) { + VLOG(2) << "Unexpected GattCommunicationStatus: " << status; + pending_write_callbacks->error_callback.Run( + BluetoothGattService::GATT_ERROR_FAILED); + return; + } + + std::move(pending_write_callbacks->callback).Run(); +} } // namespace device
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.h b/device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.h index 364993c..a8f7821 100644 --- a/device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.h +++ b/device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.h
@@ -6,6 +6,7 @@ #define DEVICE_BLUETOOTH_BLUETOOTH_REMOTE_GATT_CHARACTERISTIC_WINRT_H_ #include <windows.devices.bluetooth.genericattributeprofile.h> +#include <wrl/client.h> #include <stdint.h> @@ -29,8 +30,9 @@ public: static std::unique_ptr<BluetoothRemoteGattCharacteristicWinrt> Create( BluetoothRemoteGattService* service, - ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: - IGattCharacteristic* characteristic); + Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth:: + GenericAttributeProfile::IGattCharacteristic> + characteristic); ~BluetoothRemoteGattCharacteristicWinrt() override; // BluetoothGattCharacteristic: @@ -47,6 +49,11 @@ void WriteRemoteCharacteristic(const std::vector<uint8_t>& value, const base::Closure& callback, const ErrorCallback& error_callback) override; + bool WriteWithoutResponse(base::span<const uint8_t> value) override; + + ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + IGattCharacteristic* + GetCharacteristicForTesting(); protected: // BluetoothRemoteGattCharacteristic: @@ -59,16 +66,53 @@ const ErrorCallback& error_callback) override; private: - BluetoothRemoteGattCharacteristicWinrt(BluetoothRemoteGattService* service, - BluetoothUUID uuid, - Properties proporties, - uint16_t attribute_handle); + struct PendingReadCallbacks { + PendingReadCallbacks(ValueCallback callback, ErrorCallback error_callback); + ~PendingReadCallbacks(); + + ValueCallback callback; + ErrorCallback error_callback; + }; + + struct PendingWriteCallbacks { + PendingWriteCallbacks(base::OnceClosure callback, + ErrorCallback error_callback); + ~PendingWriteCallbacks(); + + base::OnceClosure callback; + ErrorCallback error_callback; + }; + + BluetoothRemoteGattCharacteristicWinrt( + BluetoothRemoteGattService* service, + Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth:: + GenericAttributeProfile::IGattCharacteristic> + characteristic, + BluetoothUUID uuid, + Properties proporties, + uint16_t attribute_handle); + + void OnReadValue(Microsoft::WRL::ComPtr< + ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + IGattReadResult> read_result); + + void OnWriteValueWithOption( + ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + GattCommunicationStatus status); BluetoothRemoteGattService* service_; + Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth:: + GenericAttributeProfile::IGattCharacteristic> + characteristic_; BluetoothUUID uuid_; Properties properties_; std::string identifier_; std::vector<uint8_t> value_; + std::unique_ptr<PendingReadCallbacks> pending_read_callbacks_; + std::unique_ptr<PendingWriteCallbacks> pending_write_callbacks_; + + base::WeakPtrFactory<BluetoothRemoteGattCharacteristicWinrt> + weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(BluetoothRemoteGattCharacteristicWinrt); };
diff --git a/device/bluetooth/test/bluetooth_test_win.cc b/device/bluetooth/test/bluetooth_test_win.cc index 3f54edb8b..eeb818b 100644 --- a/device/bluetooth/test/bluetooth_test_win.cc +++ b/device/bluetooth/test/bluetooth_test_win.cc
@@ -31,6 +31,7 @@ #include "device/bluetooth/bluetooth_device_winrt.h" #include "device/bluetooth/bluetooth_low_energy_win.h" #include "device/bluetooth/bluetooth_remote_gatt_characteristic_win.h" +#include "device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.h" #include "device/bluetooth/bluetooth_remote_gatt_descriptor_win.h" #include "device/bluetooth/bluetooth_remote_gatt_service_win.h" #include "device/bluetooth/bluetooth_uuid.h" @@ -38,6 +39,7 @@ #include "device/bluetooth/test/fake_bluetooth_le_advertisement_watcher_winrt.h" #include "device/bluetooth/test/fake_bluetooth_le_device_winrt.h" #include "device/bluetooth/test/fake_device_information_winrt.h" +#include "device/bluetooth/test/fake_gatt_characteristic_winrt.h" // Note: As UWP does not provide int specializations for IObservableVector and // VectorChangedEventHandler we need to supply our own. UUIDs were generated @@ -685,8 +687,6 @@ void BluetoothTestWinrt::SimulateGattConnectionError( BluetoothDevice* device, BluetoothDevice::ConnectErrorCode error_code) { - // Spin the message loop to make sure a device instance was obtained. - base::RunLoop().RunUntilIdle(); auto* const ble_device = static_cast<TestBluetoothDeviceWinrt*>(device)->ble_device(); DCHECK(ble_device); @@ -694,8 +694,6 @@ } void BluetoothTestWinrt::SimulateGattDisconnection(BluetoothDevice* device) { - // Spin the message loop to make sure a device instance was obtained. - base::RunLoop().RunUntilIdle(); auto* const ble_device = static_cast<TestBluetoothDeviceWinrt*>(device)->ble_device(); DCHECK(ble_device); @@ -762,6 +760,31 @@ ble_device->SimulateGattCharacteristic(service, uuid, properties); } +void BluetoothTestWinrt::SimulateGattCharacteristicRead( + BluetoothRemoteGattCharacteristic* characteristic, + const std::vector<uint8_t>& value) { + if (!GetParam() || !PlatformSupportsLowEnergy()) { + return BluetoothTestWin::SimulateGattCharacteristicRead(characteristic, + value); + } + + static_cast<FakeGattCharacteristicWinrt*>( + static_cast<BluetoothRemoteGattCharacteristicWinrt*>(characteristic) + ->GetCharacteristicForTesting()) + ->SimulateGattCharacteristicRead(value); +} + +void BluetoothTestWinrt::SimulateGattCharacteristicWrite( + BluetoothRemoteGattCharacteristic* characteristic) { + if (!GetParam() || !PlatformSupportsLowEnergy()) + return BluetoothTestWin::SimulateGattCharacteristicWrite(characteristic); + + static_cast<FakeGattCharacteristicWinrt*>( + static_cast<BluetoothRemoteGattCharacteristicWinrt*>(characteristic) + ->GetCharacteristicForTesting()) + ->SimulateGattCharacteristicWrite(); +} + void BluetoothTestWinrt::DeleteDevice(BluetoothDevice* device) { (!GetParam() || !PlatformSupportsLowEnergy()) ? BluetoothTestWin::DeleteDevice(device) @@ -777,4 +800,14 @@ ++gatt_disconnection_attempts_; } +void BluetoothTestWinrt::OnFakeBluetoothCharacteristicReadValue() { + ++gatt_read_characteristic_attempts_; +} + +void BluetoothTestWinrt::OnFakeBluetoothCharacteristicWriteValue( + std::vector<uint8_t> value) { + last_write_value_ = std::move(value); + ++gatt_write_characteristic_attempts_; +} + } // namespace device
diff --git a/device/bluetooth/test/bluetooth_test_win.h b/device/bluetooth/test/bluetooth_test_win.h index 3fcda8f..8a93078 100644 --- a/device/bluetooth/test/bluetooth_test_win.h +++ b/device/bluetooth/test/bluetooth_test_win.h
@@ -136,10 +136,17 @@ void SimulateGattCharacteristic(BluetoothRemoteGattService* service, const std::string& uuid, int properties) override; + void SimulateGattCharacteristicRead( + BluetoothRemoteGattCharacteristic* characteristic, + const std::vector<uint8_t>& value) override; + void SimulateGattCharacteristicWrite( + BluetoothRemoteGattCharacteristic* characteristic) override; void DeleteDevice(BluetoothDevice* device) override; void OnFakeBluetoothDeviceConnectGattCalled(); void OnFakeBluetoothGattDisconnect(); + void OnFakeBluetoothCharacteristicReadValue(); + void OnFakeBluetoothCharacteristicWriteValue(std::vector<uint8_t> value); private: base::test::ScopedFeatureList scoped_feature_list_;
diff --git a/device/bluetooth/test/fake_bluetooth_le_device_winrt.cc b/device/bluetooth/test/fake_bluetooth_le_device_winrt.cc index 5605ce62..0c983f7 100644 --- a/device/bluetooth/test/fake_bluetooth_le_device_winrt.cc +++ b/device/bluetooth/test/fake_bluetooth_le_device_winrt.cc
@@ -198,8 +198,8 @@ void FakeBluetoothLEDeviceWinrt::SimulateGattServicesDiscovered( const std::vector<std::string>& uuids) { for (const auto& uuid : uuids) { - fake_services_.push_back( - Make<FakeGattDeviceServiceWinrt>(uuid, service_attribute_handle_++)); + fake_services_.push_back(Make<FakeGattDeviceServiceWinrt>( + bluetooth_test_winrt_, uuid, service_attribute_handle_++)); } DCHECK(gatt_services_callback_);
diff --git a/device/bluetooth/test/fake_gatt_characteristic_winrt.cc b/device/bluetooth/test/fake_gatt_characteristic_winrt.cc index 07e9b46..ca20f85 100644 --- a/device/bluetooth/test/fake_gatt_characteristic_winrt.cc +++ b/device/bluetooth/test/fake_gatt_characteristic_winrt.cc
@@ -4,8 +4,16 @@ #include "device/bluetooth/test/fake_gatt_characteristic_winrt.h" +#include <utility> + +#include "base/logging.h" #include "base/strings/string_piece.h" +#include "base/threading/thread_task_runner_handle.h" +#include "base/win/async_operation.h" +#include "base/win/winrt_storage_util.h" #include "device/bluetooth/bluetooth_uuid.h" +#include "device/bluetooth/test/bluetooth_test_win.h" +#include "device/bluetooth/test/fake_gatt_read_result_winrt.h" namespace device { @@ -22,6 +30,8 @@ GattClientCharacteristicConfigurationDescriptorValue; using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: GattCommunicationStatus; +using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + GattCommunicationStatus_Success; using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::GattDescriptor; using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: GattPresentationFormat; @@ -34,18 +44,25 @@ GattValueChangedEventArgs; using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: GattWriteOption; +using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + GattWriteOption_WriteWithResponse; +using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + IGattReadResult; using ABI::Windows::Foundation::Collections::IVectorView; using ABI::Windows::Foundation::IAsyncOperation; using ABI::Windows::Foundation::ITypedEventHandler; using ABI::Windows::Storage::Streams::IBuffer; +using Microsoft::WRL::Make; } // namespace FakeGattCharacteristicWinrt::FakeGattCharacteristicWinrt( + BluetoothTestWinrt* bluetooth_test_winrt, int properties, base::StringPiece uuid, uint16_t attribute_handle) - : properties_(static_cast<GattCharacteristicProperties>(properties)), + : bluetooth_test_winrt_(bluetooth_test_winrt), + properties_(static_cast<GattCharacteristicProperties>(properties)), uuid_(BluetoothUUID::GetCanonicalValueAsGUID(uuid)), attribute_handle_(attribute_handle) {} @@ -94,7 +111,12 @@ HRESULT FakeGattCharacteristicWinrt::ReadValueAsync( IAsyncOperation<GattReadResult*>** value) { - return E_NOTIMPL; + auto async_op = Make<base::win::AsyncOperation<GattReadResult*>>(); + DCHECK(!read_value_callback_); + read_value_callback_ = async_op->callback(); + *value = async_op.Detach(); + bluetooth_test_winrt_->OnFakeBluetoothCharacteristicReadValue(); + return S_OK; } HRESULT FakeGattCharacteristicWinrt::ReadValueWithCacheModeAsync( @@ -113,7 +135,22 @@ IBuffer* value, GattWriteOption write_option, IAsyncOperation<GattCommunicationStatus>** async_op) { - return E_NOTIMPL; + uint8_t* data; + uint32_t size; + base::win::GetPointerToBufferData(value, &data, &size); + bluetooth_test_winrt_->OnFakeBluetoothCharacteristicWriteValue( + std::vector<uint8_t>(data, data + size)); + auto op = Make<base::win::AsyncOperation<GattCommunicationStatus>>(); + DCHECK(!write_value_callback_); + if (write_option == GattWriteOption_WriteWithResponse) { + write_value_callback_ = op->callback(); + } else { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(op->callback(), GattCommunicationStatus_Success)); + } + *async_op = op.Detach(); + return S_OK; } HRESULT FakeGattCharacteristicWinrt:: @@ -144,4 +181,15 @@ return E_NOTIMPL; } +void FakeGattCharacteristicWinrt::SimulateGattCharacteristicRead( + const std::vector<uint8_t>& data) { + if (read_value_callback_) + std::move(read_value_callback_).Run(Make<FakeGattReadResultWinrt>(data)); +} + +void FakeGattCharacteristicWinrt::SimulateGattCharacteristicWrite() { + if (write_value_callback_) + std::move(write_value_callback_).Run(GattCommunicationStatus_Success); +} + } // namespace device
diff --git a/device/bluetooth/test/fake_gatt_characteristic_winrt.h b/device/bluetooth/test/fake_gatt_characteristic_winrt.h index 280a265..370e53ca 100644 --- a/device/bluetooth/test/fake_gatt_characteristic_winrt.h +++ b/device/bluetooth/test/fake_gatt_characteristic_winrt.h
@@ -7,15 +7,21 @@ #include <windows.devices.bluetooth.genericattributeprofile.h> #include <windows.foundation.collections.h> +#include <wrl/client.h> #include <wrl/implements.h> #include <stdint.h> +#include <vector> + +#include "base/callback.h" #include "base/macros.h" #include "base/strings/string_piece_forward.h" namespace device { +class BluetoothTestWinrt; + class FakeGattCharacteristicWinrt : public Microsoft::WRL::RuntimeClass< Microsoft::WRL::RuntimeClassFlags< @@ -23,7 +29,8 @@ ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: IGattCharacteristic> { public: - FakeGattCharacteristicWinrt(int properties, + FakeGattCharacteristicWinrt(BluetoothTestWinrt* bluetooth_test_winrt, + int properties, base::StringPiece uuid, uint16_t attribute_handle); @@ -94,12 +101,24 @@ IFACEMETHODIMP remove_ValueChanged( EventRegistrationToken value_changed_event_cookie) override; + void SimulateGattCharacteristicRead(const std::vector<uint8_t>& data); + void SimulateGattCharacteristicWrite(); + private: + BluetoothTestWinrt* bluetooth_test_winrt_; ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: GattCharacteristicProperties properties_; GUID uuid_; uint16_t attribute_handle_; + base::OnceCallback<void( + Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth:: + GenericAttributeProfile::IGattReadResult>)> + read_value_callback_; + base::OnceCallback<void(ABI::Windows::Devices::Bluetooth:: + GenericAttributeProfile::GattCommunicationStatus)> + write_value_callback_; + DISALLOW_COPY_AND_ASSIGN(FakeGattCharacteristicWinrt); };
diff --git a/device/bluetooth/test/fake_gatt_device_service_winrt.cc b/device/bluetooth/test/fake_gatt_device_service_winrt.cc index fb84eba..f8c21fd 100644 --- a/device/bluetooth/test/fake_gatt_device_service_winrt.cc +++ b/device/bluetooth/test/fake_gatt_device_service_winrt.cc
@@ -43,9 +43,11 @@ } // namespace FakeGattDeviceServiceWinrt::FakeGattDeviceServiceWinrt( + BluetoothTestWinrt* bluetooth_test_winrt, base::StringPiece uuid, uint16_t attribute_handle) - : uuid_(BluetoothUUID::GetCanonicalValueAsGUID(uuid)), + : bluetooth_test_winrt_(bluetooth_test_winrt), + uuid_(BluetoothUUID::GetCanonicalValueAsGUID(uuid)), attribute_handle_(attribute_handle) {} FakeGattDeviceServiceWinrt::~FakeGattDeviceServiceWinrt() = default; @@ -158,8 +160,9 @@ void FakeGattDeviceServiceWinrt::SimulateGattCharacteristic( base::StringPiece uuid, int properties) { - fake_characteristics_.push_back(Make<FakeGattCharacteristicWinrt>( - properties, uuid, characteristic_attribute_handle_++)); + fake_characteristics_.push_back( + Make<FakeGattCharacteristicWinrt>(bluetooth_test_winrt_, properties, uuid, + characteristic_attribute_handle_++)); } } // namespace device
diff --git a/device/bluetooth/test/fake_gatt_device_service_winrt.h b/device/bluetooth/test/fake_gatt_device_service_winrt.h index a8513ff..f6b82dd 100644 --- a/device/bluetooth/test/fake_gatt_device_service_winrt.h +++ b/device/bluetooth/test/fake_gatt_device_service_winrt.h
@@ -18,6 +18,7 @@ namespace device { +class BluetoothTestWinrt; class FakeGattCharacteristicWinrt; class FakeGattDeviceServiceWinrt @@ -29,7 +30,9 @@ ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: IGattDeviceService3> { public: - FakeGattDeviceServiceWinrt(base::StringPiece uuid, uint16_t attribute_handle); + FakeGattDeviceServiceWinrt(BluetoothTestWinrt* bluetooth_test_winrt, + base::StringPiece uuid, + uint16_t attribute_handle); ~FakeGattDeviceServiceWinrt() override; // IGattDeviceService: @@ -111,6 +114,7 @@ void SimulateGattCharacteristic(base::StringPiece uuid, int proporties); private: + BluetoothTestWinrt* bluetooth_test_winrt_; GUID uuid_; uint16_t attribute_handle_;
diff --git a/device/bluetooth/test/fake_gatt_read_result_winrt.cc b/device/bluetooth/test/fake_gatt_read_result_winrt.cc new file mode 100644 index 0000000..abac978 --- /dev/null +++ b/device/bluetooth/test/fake_gatt_read_result_winrt.cc
@@ -0,0 +1,48 @@ +// 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. + +#include "device/bluetooth/test/fake_gatt_read_result_winrt.h" + +#include <wrl/client.h> + +#include <utility> + +#include "base/win/winrt_storage_util.h" + +namespace { + +using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + GattCommunicationStatus; +using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + GattCommunicationStatus_Success; +using ABI::Windows::Storage::Streams::IBuffer; +using Microsoft::WRL::ComPtr; +} // namespace + +namespace device { + +FakeGattReadResultWinrt::FakeGattReadResultWinrt(GattCommunicationStatus status) + : status_(status) {} + +FakeGattReadResultWinrt::FakeGattReadResultWinrt(std::vector<uint8_t> data) + : status_(GattCommunicationStatus_Success), data_(std::move(data)) {} + +FakeGattReadResultWinrt::~FakeGattReadResultWinrt() = default; + +HRESULT FakeGattReadResultWinrt::get_Status(GattCommunicationStatus* value) { + *value = status_; + return S_OK; +} + +HRESULT FakeGattReadResultWinrt::get_Value(IBuffer** value) { + ComPtr<IBuffer> buffer; + HRESULT hr = + base::win::CreateIBufferFromData(data_.data(), data_.size(), &buffer); + if (FAILED(hr)) + return hr; + + return buffer.CopyTo(value); +} + +} // namespace device
diff --git a/device/bluetooth/test/fake_gatt_read_result_winrt.h b/device/bluetooth/test/fake_gatt_read_result_winrt.h new file mode 100644 index 0000000..8fe5693 --- /dev/null +++ b/device/bluetooth/test/fake_gatt_read_result_winrt.h
@@ -0,0 +1,49 @@ +// 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. + +#ifndef DEVICE_BLUETOOTH_TEST_FAKE_GATT_READ_RESULT_WINRT_H_ +#define DEVICE_BLUETOOTH_TEST_FAKE_GATT_READ_RESULT_WINRT_H_ + +#include <windows.devices.bluetooth.genericattributeprofile.h> +#include <wrl/implements.h> + +#include <stdint.h> + +#include <vector> + +#include "base/macros.h" + +namespace device { + +class FakeGattReadResultWinrt + : public Microsoft::WRL::RuntimeClass< + Microsoft::WRL::RuntimeClassFlags< + Microsoft::WRL::WinRt | Microsoft::WRL::InhibitRoOriginateError>, + ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + IGattReadResult> { + public: + explicit FakeGattReadResultWinrt( + ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + GattCommunicationStatus status); + explicit FakeGattReadResultWinrt(std::vector<uint8_t> data); + ~FakeGattReadResultWinrt() override; + + // IGattReadResult: + IFACEMETHODIMP get_Status( + ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + GattCommunicationStatus* value) override; + IFACEMETHODIMP get_Value( + ABI::Windows::Storage::Streams::IBuffer** value) override; + + private: + ABI::Windows::Devices::Bluetooth::GenericAttributeProfile:: + GattCommunicationStatus status_; + std::vector<uint8_t> data_; + + DISALLOW_COPY_AND_ASSIGN(FakeGattReadResultWinrt); +}; + +} // namespace device + +#endif // DEVICE_BLUETOOTH_TEST_FAKE_GATT_READ_RESULT_WINRT_H_
diff --git a/docs/win_cross.md b/docs/win_cross.md index f5479c3..6376c7057 100644 --- a/docs/win_cross.md +++ b/docs/win_cross.md
@@ -58,7 +58,7 @@ need to be set: export DEPOT_TOOLS_WIN_TOOLCHAIN_BASE_URL=<path/to/sdk/zip/file> - export GYP_MSVS_<toolchain hash>=<hash value> + export GYP_MSVS_HASH_<toolchain hash>=<hash value> `<toolchain hash>` is hardcoded in `src/build/vs_toolchain.py` and can be found by setting `DEPOT_TOOLS_WIN_TOOLCHAIN_BASE_URL` and running `gclient sync`:
diff --git a/extensions/common/api/_api_features.json b/extensions/common/api/_api_features.json index 245e68cc..c0eb078 100644 --- a/extensions/common/api/_api_features.json +++ b/extensions/common/api/_api_features.json
@@ -274,7 +274,8 @@ "matches": [ "chrome://bookmarks/*", "chrome://extensions/*", - "chrome://settings/*" + "chrome://settings/*", + "chrome://sync-confirmation/*" ] }], "metricsPrivate.getIsCrashReportingEnabled": {
diff --git a/gin/arguments.cc b/gin/arguments.cc index 82d5f43..46552a5 100644 --- a/gin/arguments.cc +++ b/gin/arguments.cc
@@ -44,7 +44,7 @@ return result; } -v8::Local<v8::Context> Arguments::GetHolderCreationContext() { +v8::Local<v8::Context> Arguments::GetHolderCreationContext() const { return info_->Holder()->CreationContext(); }
diff --git a/gin/arguments.h b/gin/arguments.h index c0a7bc2..e793706f 100644 --- a/gin/arguments.h +++ b/gin/arguments.h
@@ -75,7 +75,7 @@ } // Returns the creation context of the Holder. - v8::Local<v8::Context> GetHolderCreationContext(); + v8::Local<v8::Context> GetHolderCreationContext() const; // Always check the return value whether the handle is empty before // dereferencing the handle.
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 0a1e7c9..3d451369 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -3369,6 +3369,17 @@ return gpu::ContextResult::kFatalFailure; } + // Only create webgl2-compute for passthrough cmd decoder. + if (attrib_helper.context_type == CONTEXT_TYPE_WEBGL2_COMPUTE) { + // Must not destroy ContextGroup if it is not initialized. + group_ = nullptr; + Destroy(true); + LOG(ERROR) + << "ContextResult::kFatalFailure: " + "webgl2-compute is not supported on validating command decoder."; + return gpu::ContextResult::kFatalFailure; + } + auto result = group_->Initialize(this, attrib_helper.context_type, disallowed_features); if (result != gpu::ContextResult::kSuccess) {
diff --git a/infra/config/global/cr-buildbucket.cfg b/infra/config/global/cr-buildbucket.cfg index fe596498..dd5aed3 100644 --- a/infra/config/global/cr-buildbucket.cfg +++ b/infra/config/global/cr-buildbucket.cfg
@@ -2358,6 +2358,7 @@ builders { name: "android-binary-size" mixins: "android-try" + mixins: "goma-j150" dimensions: "os:Ubuntu-14.04" recipe { name: "binary_size_trybot"
diff --git a/ios/chrome/browser/ui/omnibox/OWNERS b/ios/chrome/browser/ui/omnibox/OWNERS index 0c98d8e..704af7e 100644 --- a/ios/chrome/browser/ui/omnibox/OWNERS +++ b/ios/chrome/browser/ui/omnibox/OWNERS
@@ -1,5 +1,6 @@ justincohen@chromium.org rohitrao@chromium.org +stkhapugin@chromium.org jdonnelly@chromium.org # COMPONENT: UI>Browser>Omnibox
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/BUILD.gn b/ios/chrome/browser/ui/toolbar/adaptive/BUILD.gn index 6cd0825..cc44e605 100644 --- a/ios/chrome/browser/ui/toolbar/adaptive/BUILD.gn +++ b/ios/chrome/browser/ui/toolbar/adaptive/BUILD.gn
@@ -115,6 +115,25 @@ libs = [ "XCTest.framework" ] } +source_set("unit_tests") { + configs += [ "//build/config/compiler:enable_arc" ] + testonly = true + sources = [ + "adaptive_toolbar_view_controller_unittest.mm", + ] + deps = [ + ":adaptive_ui", + "//base", + "//base/test:test_support", + "//ios/chrome/browser/ui:ui_util", + "//ios/chrome/browser/ui/commands", + "//ios/chrome/browser/ui/popup_menu/public", + "//ios/chrome/browser/ui/toolbar/buttons", + "//testing/gtest", + "//third_party/ocmock", + ] +} + source_set("hooks") { configs += [ "//build/config/compiler:enable_arc" ] testonly = true
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller_unittest.mm b/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller_unittest.mm new file mode 100644 index 0000000..c02b3619 --- /dev/null +++ b/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller_unittest.mm
@@ -0,0 +1,116 @@ +// 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. + +#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.h" + +#import <UIKit/UIGestureRecognizerSubclass.h> + +#include "base/run_loop.h" +#import "base/test/ios/wait_util.h" +#include "base/test/scoped_task_environment.h" +#import "ios/chrome/browser/ui/commands/popup_menu_commands.h" +#import "ios/chrome/browser/ui/popup_menu/public/popup_menu_long_press_delegate.h" +#import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.h" +#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button.h" +#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.h" +#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h" +#include "ios/chrome/browser/ui/ui_util.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/platform_test.h" +#import "third_party/ocmock/OCMock/OCMock.h" +#include "third_party/ocmock/gtest_support.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { + +UIView* GetTabGridToolbarButton(UIView* parentView) { + if (parentView.accessibilityIdentifier == kToolbarStackButtonIdentifier) + return parentView; + + for (UIView* subview in parentView.subviews) { + UIView* buttonSubview = GetTabGridToolbarButton(subview); + if (buttonSubview) + return buttonSubview; + } + return nil; +} + +class AdaptiveToolbarViewControllerTest : public PlatformTest { + protected: + AdaptiveToolbarViewControllerTest() + : scopedTaskEnvironment_( + base::test::ScopedTaskEnvironment::MainThreadType::UI) {} + + base::test::ScopedTaskEnvironment scopedTaskEnvironment_; +}; + +TEST_F(AdaptiveToolbarViewControllerTest, DetectForceTouch) { + if (!IsUIRefreshPhase1Enabled()) + return; + + id dispatcher = OCMProtocolMock(@protocol(PopupMenuCommands)); + id longPressDelegate = OCMProtocolMock(@protocol(PopupMenuLongPressDelegate)); + ToolbarButtonFactory* factory = + [[ToolbarButtonFactory alloc] initWithStyle:NORMAL]; + + AdaptiveToolbarViewController* toolbar = + [[PrimaryToolbarViewController alloc] init]; + toolbar.buttonFactory = factory; + toolbar.longPressDelegate = longPressDelegate; + toolbar.dispatcher = dispatcher; + + UIView* buttonView = GetTabGridToolbarButton(toolbar.view); + + ASSERT_NE(buttonView, nil); + ASSERT_GE(buttonView.gestureRecognizers.count, 1UL); + + UIGestureRecognizer* gestureRecognizer = buttonView.gestureRecognizers[0]; + + id event = OCMClassMock([UIEvent class]); + + id touch = OCMClassMock([UITouch class]); + OCMStub([touch maximumPossibleForce]).andReturn(1); + OCMStub([touch force]).andReturn(0.7); + [gestureRecognizer touchesBegan:[NSSet setWithObject:touch] withEvent:event]; + [gestureRecognizer touchesMoved:[NSSet setWithObject:touch] withEvent:event]; + + // Check that the dispatcher is called when the force touch is detected. + OCMExpect([dispatcher showTabGridButtonPopup]); + + touch = OCMClassMock([UITouch class]); + OCMStub([touch maximumPossibleForce]).andReturn(1); + OCMStub([touch force]).andReturn(0.9); + [gestureRecognizer touchesMoved:[NSSet setWithObject:touch] withEvent:event]; + + base::test::ios::SpinRunLoopWithMinDelay(base::TimeDelta::FromSecondsD(0.05)); + + EXPECT_OCMOCK_VERIFY(dispatcher); + + // Check that the longPressDelegate is notified when the gesture recognizer + // changes, even with lower force. + [[[longPressDelegate expect] ignoringNonObjectArgs] + longPressFocusPointChangedTo:CGPointZero]; + + touch = OCMClassMock([UITouch class]); + OCMStub([touch maximumPossibleForce]).andReturn(1); + OCMStub([touch force]).andReturn(0.9); + [gestureRecognizer touchesMoved:[NSSet setWithObject:touch] withEvent:event]; + + base::test::ios::SpinRunLoopWithMinDelay(base::TimeDelta::FromSecondsD(0.05)); + + EXPECT_OCMOCK_VERIFY(longPressDelegate); + + // Change the state to Ended here, as the long press gesture recognizer isn't + // working on unit test (the state is cancelled). + gestureRecognizer.state = UIGestureRecognizerStateEnded; + + base::test::ios::SpinRunLoopWithMinDelay(base::TimeDelta::FromSecondsD(0.05)); + + EXPECT_OCMOCK_VERIFY(longPressDelegate); +} + +} // namespace
diff --git a/ios/chrome/browser/ui/util/BUILD.gn b/ios/chrome/browser/ui/util/BUILD.gn index be0c9bf..6abd6cb 100644 --- a/ios/chrome/browser/ui/util/BUILD.gn +++ b/ios/chrome/browser/ui/util/BUILD.gn
@@ -63,6 +63,7 @@ sources = [ "CRUILabel+AttributeUtils_unittest.mm", "core_text_util_unittest.mm", + "force_touch_long_press_gesture_recognizer_unittest.mm", "label_link_controller_unittest.mm", "label_observer_unittest.mm", "manual_text_framer_unittest.mm", @@ -76,6 +77,7 @@ "//ios/third_party/material_components_ios", "//ios/third_party/material_roboto_font_loader_ios", "//testing/gtest", + "//third_party/ocmock", "//url", ] }
diff --git a/ios/chrome/browser/ui/util/force_touch_long_press_gesture_recognizer_unittest.mm b/ios/chrome/browser/ui/util/force_touch_long_press_gesture_recognizer_unittest.mm new file mode 100644 index 0000000..f3909a7f --- /dev/null +++ b/ios/chrome/browser/ui/util/force_touch_long_press_gesture_recognizer_unittest.mm
@@ -0,0 +1,69 @@ +// 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. + +#import "ios/chrome/browser/ui/util/force_touch_long_press_gesture_recognizer.h" + +#import <UIKit/UIGestureRecognizerSubclass.h> + +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/platform_test.h" +#import "third_party/ocmock/OCMock/OCMock.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@interface ForceTouchLongPressGestureRecognizerReceiverForTest : NSObject + +@end + +@implementation ForceTouchLongPressGestureRecognizerReceiverForTest + +- (void)handleGestureRecognizer:(UIGestureRecognizer*)gesture { +} + +@end + +namespace { + +using ForceTouchLongPressGestureRecognizerTest = PlatformTest; + +TEST_F(ForceTouchLongPressGestureRecognizerTest, DetectForceTouch) { + ForceTouchLongPressGestureRecognizerReceiverForTest* testReceiver = + [[ForceTouchLongPressGestureRecognizerReceiverForTest alloc] init]; + + ForceTouchLongPressGestureRecognizer* gestureRecognizer = + [[ForceTouchLongPressGestureRecognizer alloc] + initWithTarget:testReceiver + action:@selector(handleGestureRecognizer:)]; + gestureRecognizer.forceThreshold = 0.6; + + ASSERT_EQ(UIGestureRecognizerStatePossible, gestureRecognizer.state); + + id event = OCMClassMock([UIEvent class]); + + id touch = OCMClassMock([UITouch class]); + OCMStub([touch maximumPossibleForce]).andReturn(1); + OCMStub([touch force]).andReturn(0.5); + [gestureRecognizer touchesBegan:[NSSet setWithObject:touch] withEvent:event]; + [gestureRecognizer touchesMoved:[NSSet setWithObject:touch] withEvent:event]; + + EXPECT_EQ(UIGestureRecognizerStatePossible, gestureRecognizer.state); + + touch = OCMClassMock([UITouch class]); + OCMStub([touch maximumPossibleForce]).andReturn(1); + OCMStub([touch force]).andReturn(0.7); + [gestureRecognizer touchesMoved:[NSSet setWithObject:touch] withEvent:event]; + + EXPECT_EQ(UIGestureRecognizerStateBegan, gestureRecognizer.state); + + touch = OCMClassMock([UITouch class]); + OCMStub([touch maximumPossibleForce]).andReturn(1); + OCMStub([touch force]).andReturn(0.7); + [gestureRecognizer touchesEnded:[NSSet setWithObject:touch] withEvent:event]; + + EXPECT_EQ(UIGestureRecognizerStateCancelled, gestureRecognizer.state); +} + +} // namespace
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn index a4facee..12ea7a3 100644 --- a/ios/chrome/test/BUILD.gn +++ b/ios/chrome/test/BUILD.gn
@@ -235,6 +235,7 @@ "//ios/chrome/browser/ui/table_view/cells:unit_tests", "//ios/chrome/browser/ui/tabs:unit_tests", "//ios/chrome/browser/ui/toolbar:unit_tests", + "//ios/chrome/browser/ui/toolbar/adaptive:unit_tests", "//ios/chrome/browser/ui/toolbar/clean:unit_tests", "//ios/chrome/browser/ui/toolbar/legacy:unit_tests", "//ios/chrome/browser/ui/tools_menu:unit_tests",
diff --git a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc index 95d1681a..feb0f9c4 100644 --- a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc +++ b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc
@@ -2467,10 +2467,52 @@ return true; } +// TODO(crbug.com/819930): Remove after https://crrev.com/c/1134929 and +// https://crrev.com/c/1136336 are merged. +// +// This is a hack making Chrome work before/after merging +// https://crrev.com/c/1136336 (for v3.14) and +// https://crrev.com/c/1134929 (for v4.4), which changes IDs of controls from +// V4L2_CID_MPEG_VIDEO_VP8_FRAME_HDR to V4L2_CID_MPEG_VIDEO_VP9_ENTROPY. +void V4L2SliceVideoDecodeAccelerator::ReplaceChromeMpegVideoCtrlId( + uint32_t* ctrl_id) { + static_assert( + V4L2_CID_MPEG_VIDEO_VP9_ENTROPY - V4L2_CID_MPEG_VIDEO_VP8_FRAME_HDR == 3, + "The difference between V4L2_CID_MPEG_VIDEO_VP9_ENTROPY and " + "V4L2_CID_MPEG_VIDEO_VP8_FRAME_HDR must be 3"); + if (*ctrl_id < V4L2_CID_MPEG_VIDEO_VP8_FRAME_HDR || + *ctrl_id > V4L2_CID_MPEG_VIDEO_VP9_ENTROPY) + return; + + // Prepare flags for each control since these controls are optional + // -1: uninitialized, 0: old kernel or unsupported control, 1: new kernel + static int flags[4] = {-1, -1, -1, -1}; + const size_t offset = *ctrl_id - V4L2_CID_MPEG_VIDEO_VP8_FRAME_HDR; + + if (flags[offset] < 0) { + struct v4l2_queryctrl query_ctrl = {}; + query_ctrl.id = *ctrl_id; + + flags[offset] = device_->Ioctl(VIDIOC_QUERYCTRL, &query_ctrl) == 0; + } + + if (!flags[offset]) { + static uint32_t kOldBase = V4L2_CID_MPEG_BASE + 512; + *ctrl_id = kOldBase + offset; + } +} + bool V4L2SliceVideoDecodeAccelerator::SubmitExtControls( struct v4l2_ext_controls* ext_ctrls) { DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread()); DCHECK_GT(ext_ctrls->config_store, 0u); + + // TODO(crbug.com/819930): Remove after https://crrev.com/c/1134929 and + // https://crrev.com/c/1136336 are merged. + for (size_t i = 0; i < ext_ctrls->count; ++i) { + ReplaceChromeMpegVideoCtrlId(&ext_ctrls->controls[i].id); + } + IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_S_EXT_CTRLS, ext_ctrls); return true; } @@ -2479,6 +2521,13 @@ struct v4l2_ext_controls* ext_ctrls) { DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread()); DCHECK_GT(ext_ctrls->config_store, 0u); + + // TODO(crbug.com/819930): Remove after https://crrev.com/c/1134929 and + // https://crrev.com/c/1136336 are merged. + for (size_t i = 0; i < ext_ctrls->count; ++i) { + ReplaceChromeMpegVideoCtrlId(&ext_ctrls->controls[i].id); + } + IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_G_EXT_CTRLS, ext_ctrls); return true; } @@ -2488,6 +2537,10 @@ memset(&query_ctrl, 0, sizeof(query_ctrl)); query_ctrl.id = ctrl_id; + // TODO(crbug.com/819930): Remove after https://crrev.com/c/1134929 and + // https://crrev.com/c/1136336 are merged. + ReplaceChromeMpegVideoCtrlId(&query_ctrl.id); + return (device_->Ioctl(VIDIOC_QUERYCTRL, &query_ctrl) == 0); }
diff --git a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h index fcf8e82..317d99e 100644 --- a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h +++ b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h
@@ -113,6 +113,17 @@ // on the next DecodeSurface(). Return true on success. bool SubmitSlice(int index, const uint8_t* data, size_t size); + // + // TODO(crbug.com/819930): Remove after https://crrev.com/c/1134929 and + // https://crrev.com/c/1136336 are merged. + // + // If |ctrl_id| is for a ChromeOS-specific control of MPEG video and + // https://crrev.com/c/1134929 and https://crrev.com/c/1136336 don't seem to + // be merged into the kernel, change the value of |ctrl_id| to one for the + // kernel. + // Otherwise, do nothing. + void ReplaceChromeMpegVideoCtrlId(uint32_t* ctrl_id); + // Submit controls in |ext_ctrls| to hardware. Return true on success. bool SubmitExtControls(struct v4l2_ext_controls* ext_ctrls);
diff --git a/mojo/public/cpp/bindings/array_traits_wtf_vector.h b/mojo/public/cpp/bindings/array_traits_wtf_vector.h index 83d2ba3f..c54bf3c 100644 --- a/mojo/public/cpp/bindings/array_traits_wtf_vector.h +++ b/mojo/public/cpp/bindings/array_traits_wtf_vector.h
@@ -10,7 +10,7 @@ namespace mojo { -template <typename U, size_t InlineCapacity> +template <typename U, WTF::wtf_size_t InlineCapacity> struct ArrayTraits<WTF::Vector<U, InlineCapacity>> { using Element = U;
diff --git a/services/network/public/cpp/network_ipc_param_traits.h b/services/network/public/cpp/network_ipc_param_traits.h index f330a76c..76ecabe 100644 --- a/services/network/public/cpp/network_ipc_param_traits.h +++ b/services/network/public/cpp/network_ipc_param_traits.h
@@ -204,6 +204,7 @@ IPC_STRUCT_TRAITS_MEMBER(ssl_info) IPC_STRUCT_TRAITS_MEMBER(cors_exposed_header_names) IPC_STRUCT_TRAITS_MEMBER(async_revalidation_requested) + IPC_STRUCT_TRAITS_MEMBER(did_mime_sniff) IPC_STRUCT_TRAITS_END() IPC_ENUM_TRAITS_MAX_VALUE(network::mojom::FetchResponseType,
diff --git a/services/network/public/cpp/resource_response.cc b/services/network/public/cpp/resource_response.cc index 7b26664..bfc4f4a 100644 --- a/services/network/public/cpp/resource_response.cc +++ b/services/network/public/cpp/resource_response.cc
@@ -60,6 +60,7 @@ head.should_report_corb_blocking; new_response->head.async_revalidation_requested = head.async_revalidation_requested; + new_response->head.did_mime_sniff = head.did_mime_sniff; return new_response; }
diff --git a/services/network/public/cpp/resource_response_info.cc b/services/network/public/cpp/resource_response_info.cc index 343ab0a..1d06888d 100644 --- a/services/network/public/cpp/resource_response_info.cc +++ b/services/network/public/cpp/resource_response_info.cc
@@ -29,7 +29,8 @@ cert_status(0), did_service_worker_navigation_preload(false), should_report_corb_blocking(false), - async_revalidation_requested(false) {} + async_revalidation_requested(false), + did_mime_sniff(false) {} ResourceResponseInfo::ResourceResponseInfo(const ResourceResponseInfo& other) = default;
diff --git a/services/network/public/cpp/resource_response_info.h b/services/network/public/cpp/resource_response_info.h index a55dec1..3c57609 100644 --- a/services/network/public/cpp/resource_response_info.h +++ b/services/network/public/cpp/resource_response_info.h
@@ -179,6 +179,10 @@ // possibly be set if the load_flags indicated SUPPORT_ASYNC_REVALIDATION. bool async_revalidation_requested; + // True if mime sniffing has been done. In that case, we don't need to do + // mime sniffing anymore. + bool did_mime_sniff; + // NOTE: When adding or changing fields here, also update // ResourceResponse::DeepCopy in resource_response.cc. };
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc index 86d6409..a318975f 100644 --- a/services/network/url_loader.cc +++ b/services/network/url_loader.cc
@@ -794,6 +794,7 @@ // the mime type. However, even if it returns false, it returns a new type // that is probably better than the current one. response_->head.mime_type.assign(new_type); + response_->head.did_mime_sniff = true; } if (is_more_corb_sniffing_needed_) {
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc index 68a4dcd3..2751de8 100644 --- a/services/network/url_loader_unittest.cc +++ b/services/network/url_loader_unittest.cc
@@ -521,6 +521,12 @@ DCHECK(ran_); return client_.response_head().mime_type; } + + bool did_mime_sniff() const { + DCHECK(ran_); + return client_.response_head().did_mime_sniff; + } + const base::Optional<net::SSLInfo>& ssl_info() const { DCHECK(ran_); return client_.ssl_info(); @@ -727,6 +733,7 @@ TEST_F(URLLoaderTest, DoNotSniffUnlessSpecified) { EXPECT_EQ(net::OK, Load(test_server()->GetURL("/content-sniffer-test0.html"))); + EXPECT_FALSE(did_mime_sniff()); ASSERT_TRUE(mime_type().empty()); } @@ -734,19 +741,22 @@ set_sniff(); EXPECT_EQ(net::OK, Load(test_server()->GetURL("/content-sniffer-test0.html"))); + EXPECT_TRUE(did_mime_sniff()); ASSERT_EQ(std::string("text/html"), mime_type()); } TEST_F(URLLoaderTest, RespectNoSniff) { set_sniff(); EXPECT_EQ(net::OK, Load(test_server()->GetURL("/nosniff-test.html"))); + EXPECT_FALSE(did_mime_sniff()); ASSERT_TRUE(mime_type().empty()); } -TEST_F(URLLoaderTest, DoNotSniffHTMLFromTextPlain) { +TEST_F(URLLoaderTest, SniffTextPlainDoesNotResultInHTML) { set_sniff(); EXPECT_EQ(net::OK, Load(test_server()->GetURL("/content-sniffer-test1.html"))); + EXPECT_TRUE(did_mime_sniff()); ASSERT_EQ(std::string("text/plain"), mime_type()); } @@ -754,6 +764,7 @@ set_sniff(); EXPECT_EQ(net::OK, Load(test_server()->GetURL("/content-sniffer-test2.html"))); + EXPECT_FALSE(did_mime_sniff()); ASSERT_EQ(std::string("image/gif"), mime_type()); } @@ -761,6 +772,7 @@ set_sniff(); EXPECT_EQ(net::OK, Load(test_server()->GetURL("/content-sniffer-test4.html"))); + EXPECT_TRUE(did_mime_sniff()); ASSERT_EQ(std::string("text/plain"), mime_type()); } @@ -776,6 +788,7 @@ std::string body; EXPECT_EQ(net::OK, Load(MultipleWritesInterceptor::GetURL(), &body)); EXPECT_EQ(kBody, body); + EXPECT_TRUE(did_mime_sniff()); ASSERT_EQ(std::string("text/plain"), mime_type()); } @@ -790,6 +803,7 @@ EXPECT_LE(first.size() + second.size(), static_cast<uint32_t>(net::kMaxBytesToSniff)); LoadPacketsAndVerifyContents(first, second); + EXPECT_TRUE(did_mime_sniff()); ASSERT_EQ(std::string("application/octet-stream"), mime_type()); } @@ -802,6 +816,7 @@ EXPECT_GE(first.size() + second.size(), static_cast<uint32_t>(net::kMaxBytesToSniff)); LoadPacketsAndVerifyContents(first, second); + EXPECT_TRUE(did_mime_sniff()); ASSERT_EQ(std::string("application/octet-stream"), mime_type()); } @@ -811,6 +826,7 @@ set_sniff(); std::string first(net::kMaxBytesToSniff - 100, 'a'); LoadPacketsAndVerifyContents(first, std::string()); + EXPECT_TRUE(did_mime_sniff()); ASSERT_EQ(std::string("text/plain"), mime_type()); } @@ -819,6 +835,7 @@ set_sniff(); std::string first(net::kMaxBytesToSniff + 100, 'a'); LoadPacketsAndVerifyContents(first, std::string()); + EXPECT_TRUE(did_mime_sniff()); ASSERT_EQ(std::string("text/plain"), mime_type()); }
diff --git a/sql/BUILD.gn b/sql/BUILD.gn index 9cbf8eb..000b29b 100644 --- a/sql/BUILD.gn +++ b/sql/BUILD.gn
@@ -15,6 +15,7 @@ "init_status.h", "initialization.cc", "initialization.h", + "internal_api_token.h", "meta_table.cc", "meta_table.h", "recovery.cc",
diff --git a/sql/connection.cc b/sql/connection.cc index b50f9f2..4813b8d0 100644 --- a/sql/connection.cc +++ b/sql/connection.cc
@@ -255,9 +255,15 @@ was_valid_ = was_valid_ && forced; } +static_assert( + Connection::kDefaultPageSize == SQLITE_DEFAULT_PAGE_SIZE, + "Connection::kDefaultPageSize must match the value configured into SQLite"); + +constexpr int Connection::kDefaultPageSize; + Connection::Connection() : db_(nullptr), - page_size_(0), + page_size_(kDefaultPageSize), cache_size_(0), exclusive_locking_(false), transaction_nesting_(0), @@ -433,9 +439,12 @@ return; } + // The constructor and set_page_size() ensure that page_size_ is never zero. + const int page_size = page_size_; + DCHECK(page_size); + // Use local settings if provided, otherwise use documented defaults. The // actual results could be fetching via PRAGMA calls. - const int page_size = page_size_ ? page_size_ : 1024; sqlite3_int64 preload_size = page_size * (cache_size_ ? cache_size_ : 2000); if (preload_size < 1) return; @@ -1004,17 +1013,9 @@ return false; } - if (page_size_) { - // Enforce SQLite restrictions on |page_size_|. - DCHECK(!(page_size_ & (page_size_ - 1))) - << " page_size_ " << page_size_ << " is not a power of two."; - const int kSqliteMaxPageSize = 32768; // from sqliteLimit.h - DCHECK_LE(page_size_, kSqliteMaxPageSize); - const std::string sql = - base::StringPrintf("PRAGMA page_size=%d", page_size_); - if (!null_db.Execute(sql.c_str())) - return false; - } + const std::string sql = base::StringPrintf("PRAGMA page_size=%d", page_size_); + if (!null_db.Execute(sql.c_str())) + return false; #if defined(OS_ANDROID) // Android compiles with SQLITE_DEFAULT_AUTOVACUUM. Unfortunately, @@ -1267,7 +1268,8 @@ } bool Connection::AttachDatabase(const base::FilePath& other_db_path, - const char* attachment_point) { + const char* attachment_point, + InternalApiToken) { DCHECK(ValidAttachmentPoint(attachment_point)); Statement s(GetUniqueStatement("ATTACH DATABASE ? AS ?")); @@ -1282,7 +1284,8 @@ return s.Run(); } -bool Connection::DetachDatabase(const char* attachment_point) { +bool Connection::DetachDatabase(const char* attachment_point, + InternalApiToken) { DCHECK(ValidAttachmentPoint(attachment_point)); Statement s(GetUniqueStatement("DETACH DATABASE ?")); @@ -1698,16 +1701,8 @@ const base::TimeDelta kBusyTimeout = base::TimeDelta::FromSeconds(kBusyTimeoutSeconds); - if (page_size_ != 0) { - // Enforce SQLite restrictions on |page_size_|. - DCHECK(!(page_size_ & (page_size_ - 1))) - << " page_size_ " << page_size_ << " is not a power of two."; - const int kSqliteMaxPageSize = 32768; // from sqliteLimit.h - DCHECK_LE(page_size_, kSqliteMaxPageSize); - const std::string sql = - base::StringPrintf("PRAGMA page_size=%d", page_size_); - ignore_result(ExecuteWithTimeout(sql.c_str(), kBusyTimeout)); - } + const std::string sql = base::StringPrintf("PRAGMA page_size=%d", page_size_); + ignore_result(ExecuteWithTimeout(sql.c_str(), kBusyTimeout)); if (cache_size_ != 0) { const std::string sql =
diff --git a/sql/connection.h b/sql/connection.h index 8083cf6..5fae55d4 100644 --- a/sql/connection.h +++ b/sql/connection.h
@@ -22,6 +22,7 @@ #include "base/sequence_checker.h" #include "base/threading/thread_restrictions.h" #include "base/time/tick_clock.h" +#include "sql/internal_api_token.h" #include "sql/sql_export.h" #include "sql/statement_id.h" @@ -39,7 +40,6 @@ namespace sql { class ConnectionMemoryDumpProvider; -class Recovery; class Statement; // To allow some test classes to be friended. @@ -50,7 +50,10 @@ class ScopedMockTimeSource; } // namespace test -class Connection; +// Exposes private Connection functionality to unit tests. +// +// This class is only defined in test targets. +class ConnectionTestPeer; // Handle to an open SQLite database. // @@ -76,17 +79,19 @@ // must be called before Init(), and will only have an effect on new // databases. // - // From sqlite.org: "The page size must be a power of two greater than or - // equal to 512 and less than or equal to SQLITE_MAX_PAGE_SIZE. The maximum - // value for SQLITE_MAX_PAGE_SIZE is 32768." + // The page size must be a power of two between 512 and 65536 inclusive. void set_page_size(int page_size) { - DCHECK(!page_size || (page_size >= 512)); - DCHECK(!page_size || !(page_size & (page_size - 1))) + DCHECK_GE(page_size, 512); + DCHECK_LE(page_size, 65536); + DCHECK(!(page_size & (page_size - 1))) << "page_size must be a power of two"; page_size_ = page_size; } + // The page size that will be used when creating a new database. + int page_size() const { return page_size_; } + // Sets the number of pages that will be cached in memory by sqlite. The // total cache size in bytes will be page_size * cache_size. This must be // called before Open() to have an effect. @@ -335,20 +340,22 @@ // Attached databases--------------------------------------------------------- - // SQLite supports attaching multiple database files to a single - // handle. Attach the database in |other_db_path| to the current - // handle under |attachment_point|. |attachment_point| should only - // contain characters from [a-zA-Z0-9_]. + // SQLite supports attaching multiple database files to a single connection. // - // Attaching a database while a transaction is open will have - // platform-dependent results, as explained below. + // Attach the database in |other_db_path| to the current connection under + // |attachment_point|. |attachment_point| must only contain characters from + // [a-zA-Z0-9_]. // // On the SQLite version shipped with Chrome (3.21+, Oct 2017), databases can // be attached while a transaction is opened. However, these databases cannot // be detached until the transaction is committed or aborted. + // + // These APIs are only exposed for use in recovery. They are extremely subtle + // and are not useful for features built on top of //sql. bool AttachDatabase(const base::FilePath& other_db_path, - const char* attachment_point); - bool DetachDatabase(const char* attachment_point); + const char* attachment_point, + InternalApiToken); + bool DetachDatabase(const char* attachment_point, InternalApiToken); // Statements ---------------------------------------------------------------- @@ -496,10 +503,16 @@ // the existence of specific files. static base::FilePath SharedMemoryFilePath(const base::FilePath& db_path); - private: - // For recovery module. - friend class Recovery; + // Default page size for newly created databases. + // + // Guaranteed to match SQLITE_DEFAULT_PAGE_SIZE. + static constexpr int kDefaultPageSize = 4096; + // Internal state accessed by other classes in //sql. + sqlite3* db(InternalApiToken) const { return db_; } + bool poisoned(InternalApiToken) const { return poisoned_; } + + private: // Allow test-support code to set/reset error expecter. friend class test::ScopedErrorExpecter; @@ -507,6 +520,8 @@ // (they should go through Statement). friend class Statement; + friend class ConnectionTestPeer; + friend class test::ScopedCommitHook; friend class test::ScopedScalarFunction; friend class test::ScopedMockTimeSource;
diff --git a/sql/connection_unittest.cc b/sql/connection_unittest.cc index a09fe824..22c57c1 100644 --- a/sql/connection_unittest.cc +++ b/sql/connection_unittest.cc
@@ -28,6 +28,20 @@ #include "third_party/sqlite/sqlite3.h" namespace sql { + +class ConnectionTestPeer { + public: + static bool AttachDatabase(Connection* db, + const base::FilePath& other_db_path, + const char* attachment_point) { + return db->AttachDatabase(other_db_path, attachment_point, + InternalApiToken()); + } + static bool DetachDatabase(Connection* db, const char* attachment_point) { + return db->DetachDatabase(attachment_point, InternalApiToken()); + } +}; + namespace test { // Allow a test to add a SQLite function in a scoped context. @@ -541,11 +555,7 @@ const std::string default_page_size = ExecuteWithResult(&db(), "PRAGMA page_size"); - // The database should have the default page size after raze. - EXPECT_NO_FATAL_FAILURE( - TestPageSize(db_path(), 0, default_page_size, 0, default_page_size)); - - // Sync user 32k pages. + // Sync uses 32k pages. EXPECT_NO_FATAL_FAILURE( TestPageSize(db_path(), 32768, "32768", 32768, "32768")); @@ -558,11 +568,12 @@ EXPECT_NO_FATAL_FAILURE( TestPageSize(db_path(), 2048, "2048", 4096, "4096")); - // Databases with no page size specified should result in the new default + // Databases with no page size specified should result in the default // page size. 2k has never been the default page size. ASSERT_NE("2048", default_page_size); - EXPECT_NO_FATAL_FAILURE( - TestPageSize(db_path(), 2048, "2048", 0, default_page_size)); + EXPECT_NO_FATAL_FAILURE(TestPageSize(db_path(), 2048, "2048", + Connection::kDefaultPageSize, + default_page_size)); } // Test that Raze() results are seen in other connections. @@ -1003,7 +1014,8 @@ // Cannot see the attached database, yet. EXPECT_FALSE(db().IsSQLValid("SELECT count(*) from other.bar")); - EXPECT_TRUE(db().AttachDatabase(attach_path, kAttachmentPoint)); + EXPECT_TRUE( + ConnectionTestPeer::AttachDatabase(&db(), attach_path, kAttachmentPoint)); EXPECT_TRUE(db().IsSQLValid("SELECT count(*) from other.bar")); // Queries can touch both databases after the ATTACH. @@ -1014,7 +1026,7 @@ EXPECT_EQ(1, s.ColumnInt(0)); } - EXPECT_TRUE(db().DetachDatabase(kAttachmentPoint)); + EXPECT_TRUE(ConnectionTestPeer::DetachDatabase(&db(), kAttachmentPoint)); EXPECT_FALSE(db().IsSQLValid("SELECT count(*) from other.bar")); } @@ -1037,7 +1049,8 @@ // Attach succeeds in a transaction. EXPECT_TRUE(db().BeginTransaction()); - EXPECT_TRUE(db().AttachDatabase(attach_path, kAttachmentPoint)); + EXPECT_TRUE( + ConnectionTestPeer::AttachDatabase(&db(), attach_path, kAttachmentPoint)); EXPECT_TRUE(db().IsSQLValid("SELECT count(*) from other.bar")); // Queries can touch both databases after the ATTACH. @@ -1052,14 +1065,14 @@ { sql::test::ScopedErrorExpecter expecter; expecter.ExpectError(SQLITE_ERROR); - EXPECT_FALSE(db().DetachDatabase(kAttachmentPoint)); + EXPECT_FALSE(ConnectionTestPeer::DetachDatabase(&db(), kAttachmentPoint)); EXPECT_TRUE(db().IsSQLValid("SELECT count(*) from other.bar")); ASSERT_TRUE(expecter.SawExpectedErrors()); } // Detach succeeds when the transaction is closed. db().RollbackTransaction(); - EXPECT_TRUE(db().DetachDatabase(kAttachmentPoint)); + EXPECT_TRUE(ConnectionTestPeer::DetachDatabase(&db(), kAttachmentPoint)); EXPECT_FALSE(db().IsSQLValid("SELECT count(*) from other.bar")); }
diff --git a/sql/internal_api_token.h b/sql/internal_api_token.h new file mode 100644 index 0000000..bb92747 --- /dev/null +++ b/sql/internal_api_token.h
@@ -0,0 +1,25 @@ +// 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. + +#ifndef SQL_INTERNAL_API_TOKEN_H_ +#define SQL_INTERNAL_API_TOKEN_H_ + +namespace sql { + +// Restricts access to APIs internal to the //sql package. +// +// This implements Java's package-private via the passkey idiom. +class InternalApiToken { + private: + // Must NOT be =default to disallow creation by uniform initialization. + InternalApiToken() {} + InternalApiToken(const InternalApiToken&) = default; + + friend class ConnectionTestPeer; + friend class Recovery; +}; + +} // namespace sql + +#endif // SQL_INTERNAL_API_TOKEN_H_
diff --git a/sql/recovery.cc b/sql/recovery.cc index 1c3d5fdf..64b0380 100644 --- a/sql/recovery.cc +++ b/sql/recovery.cc
@@ -149,19 +149,20 @@ // same recovery. if (!connection->is_open()) { // Warn about API mis-use. - DLOG_IF(FATAL, !connection->poisoned_) + DCHECK(connection->poisoned(InternalApiToken())) << "Illegal to recover with closed database"; return std::unique_ptr<Recovery>(); } - std::unique_ptr<Recovery> r(new Recovery(connection)); - if (!r->Init(db_path)) { + // Using `new` to access a non-public constructor + std::unique_ptr<Recovery> recovery(new Recovery(connection)); + if (!recovery->Init(db_path)) { // TODO(shess): Should Init() failure result in Raze()? - r->Shutdown(POISON); + recovery->Shutdown(POISON); return std::unique_ptr<Recovery>(); } - return r; + return recovery; } // static @@ -186,8 +187,7 @@ : db_(connection), recover_db_() { // Result should keep the page size specified earlier. - if (db_->page_size_) - recover_db_.set_page_size(db_->page_size_); + recover_db_.set_page_size(db_->page_size()); // Files with I/O errors cannot be safely memory-mapped. recover_db_.set_mmap_disabled(); @@ -239,7 +239,7 @@ } // Enable the recover virtual table for this connection. - int rc = chrome_sqlite3_recoverVtableInit(recover_db_.db_); + int rc = chrome_sqlite3_recoverVtableInit(recover_db_.db(InternalApiToken())); if (rc != SQLITE_OK) { RecordRecoveryEvent(RECOVERY_FAILED_VIRTUAL_TABLE_INIT); LOG(ERROR) << "Failed to initialize recover module: " @@ -254,7 +254,7 @@ return false; } - if (!recover_db_.AttachDatabase(db_path, "corrupt")) { + if (!recover_db_.AttachDatabase(db_path, "corrupt", InternalApiToken())) { RecordRecoveryEvent(RECOVERY_FAILED_ATTACH); base::UmaHistogramSparse("Sqlite.RecoveryAttachError", recover_db_.GetErrorCode()); @@ -301,16 +301,17 @@ // Backup the original db from the recovered db. const char* kMain = "main"; - sqlite3_backup* backup = sqlite3_backup_init(db_->db_, kMain, - recover_db_.db_, kMain); + sqlite3_backup* backup = + sqlite3_backup_init(db_->db(InternalApiToken()), kMain, + recover_db_.db(InternalApiToken()), kMain); if (!backup) { RecordRecoveryEvent(RECOVERY_FAILED_BACKUP_INIT); // Error code is in the destination database handle. - int err = sqlite3_extended_errcode(db_->db_); + int err = sqlite3_extended_errcode(db_->db(InternalApiToken())); base::UmaHistogramSparse("Sqlite.RecoveryHandle", err); LOG(ERROR) << "sqlite3_backup_init() failed: " - << sqlite3_errmsg(db_->db_); + << sqlite3_errmsg(db_->db(InternalApiToken())); return false; } @@ -329,7 +330,7 @@ RecordRecoveryEvent(RECOVERY_FAILED_BACKUP_STEP); base::UmaHistogramSparse("Sqlite.RecoveryStep", rc); LOG(ERROR) << "sqlite3_backup_step() failed: " - << sqlite3_errmsg(db_->db_); + << sqlite3_errmsg(db_->db(InternalApiToken())); } // The destination database was locked. Give up, but leave the data @@ -616,7 +617,7 @@ { Connection probe_db; if (!probe_db.OpenInMemory() || - probe_db.AttachDatabase(db_path, "corrupt") || + probe_db.AttachDatabase(db_path, "corrupt", InternalApiToken()) || probe_db.GetErrorCode() != SQLITE_NOTADB) { RecordRecoveryEvent(RECOVERY_FAILED_AUTORECOVERDB_BEGIN); return nullptr;
diff --git a/sql/recovery_unittest.cc b/sql/recovery_unittest.cc index 59bcaa40..ec7d902 100644 --- a/sql/recovery_unittest.cc +++ b/sql/recovery_unittest.cc
@@ -957,7 +957,7 @@ db.Close(); // Make sure the page size is read from the file. - db.set_page_size(0); + db.set_page_size(sql::Connection::kDefaultPageSize); ASSERT_TRUE(db.Open(db_path)); ASSERT_EQ(expected_final_page_size, ExecuteWithResult(&db, "PRAGMA page_size")); @@ -972,11 +972,12 @@ const std::string default_page_size = ExecuteWithResult(&db(), "PRAGMA page_size"); - // The database should have the default page size after recovery. - EXPECT_NO_FATAL_FAILURE( - TestPageSize(db_path(), 0, default_page_size, 0, default_page_size)); + // Check the default page size first. + EXPECT_NO_FATAL_FAILURE(TestPageSize( + db_path(), sql::Connection::kDefaultPageSize, default_page_size, + sql::Connection::kDefaultPageSize, default_page_size)); - // Sync user 32k pages. + // Sync uses 32k pages. EXPECT_NO_FATAL_FAILURE( TestPageSize(db_path(), 32768, "32768", 32768, "32768")); @@ -989,8 +990,9 @@ // Databases with no page size specified should recover with the new default // page size. 2k has never been the default page size. ASSERT_NE("2048", default_page_size); - EXPECT_NO_FATAL_FAILURE( - TestPageSize(db_path(), 2048, "2048", 0, default_page_size)); + EXPECT_NO_FATAL_FAILURE(TestPageSize(db_path(), 2048, "2048", + sql::Connection::kDefaultPageSize, + default_page_size)); } } // namespace
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG index 9a20e8cb..d25ff6a 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -64,7 +64,6 @@ crbug.com/591099 compositing/geometry/bounds-ignores-hidden.html [ Failure ] crbug.com/591099 compositing/layer-creation/stacking-context-overlap-nested.html [ Failure ] crbug.com/591099 compositing/perpendicular-layer-sorting.html [ Failure ] -crbug.com/591099 compositing/self-painting-layers.html [ Failure ] crbug.com/591099 compositing/squashing/squash-above-fixed-3.html [ Failure ] crbug.com/591099 compositing/squashing/squash-same-transform-ancestor.html [ Failure ] crbug.com/591099 compositing/squashing/squashing-inside-perspective.html [ Failure ] @@ -123,9 +122,6 @@ crbug.com/591099 external/wpt/css/css-fonts/font-variant-alternates-02.html [ Failure ] crbug.com/591099 external/wpt/css/css-fonts/font-variant-alternates-08.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid/alignment/grid-gutters-009.html [ Failure ] -crbug.com/591099 external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009.html [ Failure ] -crbug.com/591099 external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010.html [ Failure ] -crbug.com/591099 external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-011.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid/grid-layout-properties.html [ Failure ] crbug.com/591099 external/wpt/css/css-images/tiled-gradients.html [ Failure ] crbug.com/591099 external/wpt/css/css-masking/clip-path-svg-content/mask-objectboundingbox-content-clip-transform.svg [ Failure ] @@ -356,7 +352,7 @@ crbug.com/591099 external/wpt/fetch/cross-origin-resource-policy/fetch.any.html [ Timeout ] crbug.com/591099 external/wpt/fetch/http-cache/basic-auth-cache-test.html [ Timeout ] crbug.com/591099 external/wpt/fullscreen/api/document-exit-fullscreen-nested-in-iframe-manual.html [ Pass ] -crbug.com/591099 external/wpt/geolocation-API/PositionOptions.https.html [ Failure ] +crbug.com/591099 external/wpt/geolocation-API/PositionOptions.https.html [ Failure Pass ] crbug.com/591099 external/wpt/html-media-capture/capture_audio_cancel-manual.html [ Failure ] crbug.com/591099 external/wpt/html-media-capture/capture_image_cancel-manual.html [ Failure ] crbug.com/591099 external/wpt/html-media-capture/capture_video_cancel-manual.html [ Failure ] @@ -465,14 +461,14 @@ crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_outline_shorthand.html [ Failure ] crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_white-space_normal_wrapped.html [ Failure ] crbug.com/591099 external/wpt/workers/Worker_terminate_event_queue.htm [ Timeout ] +crbug.com/591099 external/wpt/workers/baseurl/alpha/worker-in-worker.html [ Pass ] crbug.com/591099 external/wpt/workers/constructors/Worker/same-origin.html [ Timeout ] crbug.com/591099 external/wpt/workers/semantics/interface-objects/004.html [ Failure ] -crbug.com/591099 external/wpt/xhr/open-url-redirected-worker-origin.htm [ Failure ] +crbug.com/591099 external/wpt/xhr/open-url-redirected-worker-origin.htm [ Failure Pass ] crbug.com/591099 external/wpt/xhr/send-authentication-prompt-2-manual.htm [ Failure ] crbug.com/591099 fast/backgrounds/background-clip-text.html [ Failure ] crbug.com/591099 fast/backgrounds/background-leakage-transforms.html [ Failure ] crbug.com/591099 fast/backgrounds/quirks-mode-line-box-backgrounds.html [ Failure ] -crbug.com/591099 fast/backgrounds/size/backgroundSize16.html [ Failure ] crbug.com/591099 fast/block/basic/quirk-percent-height-table-cell.html [ Failure ] crbug.com/591099 fast/block/block-width-recalc-with-relative-height.html [ Failure ] crbug.com/591099 fast/block/float-avoids-padding-inline-ancestors.html [ Crash ] @@ -489,7 +485,6 @@ crbug.com/591099 fast/box-sizing/replaced.html [ Failure ] crbug.com/591099 fast/css-generated-content/first-letter-next-sibling-crash.html [ Crash ] crbug.com/591099 fast/css-generated-content/float-first-letter-siblings-convert-to-inline.html [ Crash ] -crbug.com/591099 fast/css-grid-layout/grid-align-baseline-vertical.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-self-baseline-horiz-02.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-self-baseline-horiz-03.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-self-baseline-horiz-04.html [ Failure ] @@ -512,7 +507,6 @@ crbug.com/591099 fast/css/getComputedStyle/computed-style-percentage-top-with-position-inline.html [ Failure ] crbug.com/591099 fast/css/outline-narrowLine.html [ Failure ] crbug.com/591099 fast/css/transform-inline-style-remove.html [ Failure ] -crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-auto.html [ Failure ] crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-under.html [ Failure ] crbug.com/591099 fast/dom/nodesFromRect/nodesFromRect-basic.html [ Failure ] crbug.com/591099 fast/dynamic/first-letter-after-list-marker.html [ Failure ] @@ -520,29 +514,23 @@ crbug.com/591099 fast/encoding/utf-16-little-endian.html [ Failure ] crbug.com/591099 fast/events/touch/compositor-touch-hit-rects.html [ Failure ] crbug.com/591099 fast/events/wheel/mainthread-touchpad-fling-latching.html [ Pass ] -crbug.com/591099 fast/events/wheel/wheel-scroll-latching-on-scrollbar.html [ Pass ] -crbug.com/591099 fast/forms/text-control-intrinsic-widths.html [ Pass Timeout ] +crbug.com/591099 fast/events/wheel/wheel-scroll-latching-on-scrollbar.html [ Failure Pass ] +crbug.com/591099 fast/forms/text-control-intrinsic-widths.html [ Timeout ] crbug.com/591099 fast/inline-block/vertical-align-top-and-bottom-2.html [ Failure ] crbug.com/714962 fast/inline/continuation-outlines-with-layers-2.html [ Failure ] crbug.com/591099 fast/inline/continuation-outlines-with-layers.html [ Failure ] crbug.com/591099 fast/inline/continuation-outlines.html [ Failure ] -crbug.com/591099 fast/inline/inline-box-background-repeat-y.html [ Failure ] crbug.com/591099 fast/inline/inline-focus-ring-under-absolute-enclosing-relative-div.html [ Failure ] -crbug.com/591099 fast/inline/inline-with-empty-inline-children.html [ Failure ] crbug.com/591099 fast/inline/nested-text-descendants.html [ Failure ] crbug.com/591099 fast/inline/outline-continuations.html [ Failure ] crbug.com/714962 fast/inline/outline-offset.html [ Failure ] crbug.com/591099 fast/overflow/overflow-update-transform.html [ Failure ] crbug.com/591099 fast/overflow/recompute-overflow-of-layout-root-container.html [ Failure ] -crbug.com/591099 fast/parser/entities-in-html.html [ Failure ] -crbug.com/591099 fast/parser/entities-in-xhtml.xhtml [ Failure ] crbug.com/591099 fast/replaced/table-replaced-element.html [ Failure ] crbug.com/591099 fast/ruby/position-after.html [ Failure ] crbug.com/591099 fast/scrolling/content-box-smaller-than-scrollbar.html [ Failure ] crbug.com/591099 fast/scrolling/jquery-rtl-scroll-type.html [ Failure ] crbug.com/591099 fast/scrolling/scrollbar-tickmarks-hittest.html [ Failure Pass ] -crbug.com/591099 fast/sub-pixel/inline-block-with-padding.html [ Failure ] -crbug.com/591099 fast/sub-pixel/repaint-subpixel-layer-in-subpixel-composited-layer.html [ Failure ] crbug.com/591099 fast/sub-pixel/sub-pixel-border-2.html [ Failure ] crbug.com/591099 fast/table/border-collapsing/004-vertical.html [ Failure ] crbug.com/591099 fast/table/border-collapsing/composited-cell-collapsed-border.html [ Failure ] @@ -550,7 +538,7 @@ crbug.com/591099 fast/table/dynamic-descendant-percentage-height.html [ Failure ] crbug.com/591099 fast/table/empty-table-percent-height.html [ Failure ] crbug.com/591099 fast/table/height-percent-test-vertical.html [ Failure ] -crbug.com/591099 fast/table/percent-height-overflow-auto-content-in-cell.html [ Failure ] +crbug.com/591099 fast/table/percent-height-overflow-auto-content-in-cell.html [ Failure Pass ] crbug.com/591099 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Failure ] crbug.com/591099 fast/table/percent-height-replaced-content-in-cell.html [ Failure ] crbug.com/858998 fast/table/table-continuation-outline-paint-crash.html [ Failure ] @@ -576,7 +564,6 @@ crbug.com/591099 fast/writing-mode/fieldsets.html [ Failure ] crbug.com/591099 fast/writing-mode/percentage-height-orthogonal-writing-modes.html [ Failure ] crbug.com/591099 fast/writing-mode/table-percent-width-quirk.html [ Pass ] -crbug.com/591099 fullscreen/full-screen-with-flex-item.html [ Failure ] crbug.com/591099 hittesting/inline-with-clip-path.html [ Failure ] crbug.com/855039 html/details_summary/details-writing-mode-align-center.html [ Failure ] crbug.com/855039 html/details_summary/details-writing-mode-align-left.html [ Failure ] @@ -594,7 +581,6 @@ crbug.com/591099 http/tests/images/restyle-decode-error.html [ Failure ] crbug.com/591099 http/tests/local/blob/send-sliced-data-blob.html [ Crash Pass ] crbug.com/591099 http/tests/local/fileapi/select-dragged-file-input.html [ Skip ] -crbug.com/591099 http/tests/misc/acid3.html [ Failure ] crbug.com/591099 http/tests/misc/object-embedding-svg-delayed-size-negotiation.xhtml [ Failure ] crbug.com/591099 http/tests/preload/dynamic_remove_preload_href.html [ Failure Pass ] crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-appcache.https.html [ Crash Failure ] @@ -604,7 +590,6 @@ crbug.com/591099 idle-callback/test-runner-run-idle-tasks.html [ Pass ] crbug.com/714962 images/color-profile-background-clip-text.html [ Failure ] crbug.com/591099 images/color-profile-image-filter-all.html [ Failure ] -crbug.com/591099 images/feature-policy-max-downscaling-image.html [ Failure ] crbug.com/714962 inspector-protocol/css/css-get-platform-fonts.js [ Failure ] crbug.com/714962 inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-viewport.js [ Failure ] crbug.com/591099 inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot.js [ Failure ] @@ -613,12 +598,8 @@ crbug.com/591099 inspector-protocol/timeline/page-frames.js [ Failure Pass ] crbug.com/591099 paint/inline/focus-ring-under-absolute-with-relative-continuation.html [ Failure ] crbug.com/591099 paint/invalidation/background/background-misaligned.html [ Failure ] -crbug.com/591099 paint/invalidation/block-layout-inline-children-replaced.html [ Failure Pass ] -crbug.com/591099 paint/invalidation/box/box-inline-resize.html [ Failure Pass ] -crbug.com/591099 paint/invalidation/clip/clipped-relative.html [ Failure Pass ] crbug.com/591099 paint/invalidation/clip/control-clip.html [ Failure ] crbug.com/591099 paint/invalidation/clip/outline-clip-change.html [ Failure ] -crbug.com/591099 paint/invalidation/clip/replaced-clipped-positioned-not-wrong-incremental-repainting.html [ Failure Pass ] crbug.com/591099 paint/invalidation/compositing/clipping-should-not-repaint-composited-descendants.html [ Failure ] crbug.com/591099 paint/invalidation/compositing/subpixel-offset-scaled-transform-composited.html [ Failure ] crbug.com/591099 paint/invalidation/css-grid-layout/grid-item-change-column-repaint.html [ Failure ] @@ -634,8 +615,6 @@ crbug.com/591099 paint/invalidation/flexbox/scrollbars-changed.html [ Failure ] crbug.com/591099 paint/invalidation/float-new-in-block.html [ Failure ] crbug.com/591099 paint/invalidation/forms/slider-thumb-float.html [ Failure ] -crbug.com/591099 paint/invalidation/image/do-not-paint-below-image-baseline.html [ Failure Pass ] -crbug.com/591099 paint/invalidation/image/percent-size-image-resize-container.html [ Failure Pass ] crbug.com/591099 paint/invalidation/line-flow-with-floats-1.html [ Failure ] crbug.com/591099 paint/invalidation/line-flow-with-floats-10.html [ Failure ] crbug.com/591099 paint/invalidation/line-flow-with-floats-3.html [ Failure ] @@ -644,7 +623,6 @@ crbug.com/591099 paint/invalidation/line-flow-with-floats-6.html [ Failure ] crbug.com/591099 paint/invalidation/line-flow-with-floats-7.html [ Failure ] crbug.com/591099 paint/invalidation/line-flow-with-floats-9.html [ Failure ] -crbug.com/591099 paint/invalidation/list-marker-2.html [ Failure Pass ] crbug.com/824918 paint/invalidation/multicol/multicol-repaint.html [ Failure ] crbug.com/591099 paint/invalidation/offset-change-wrong-invalidation-with-float.html [ Failure ] crbug.com/591099 paint/invalidation/outline/focus-continuations.html [ Failure ] @@ -663,14 +641,11 @@ crbug.com/591099 paint/invalidation/overflow/justify-self-overflow-change.html [ Failure ] crbug.com/591099 paint/invalidation/position/intermediate-layout-position.html [ Failure ] crbug.com/591099 paint/invalidation/position/justify-content-position-change.html [ Failure ] -crbug.com/591099 paint/invalidation/position/positioned-list-offset-change-repaint.html [ Failure Pass ] crbug.com/714962 paint/invalidation/position/relative-positioned-movement-repaint.html [ Failure ] crbug.com/591099 paint/invalidation/position/relayout-fixed-position-after-scale.html [ Failure ] crbug.com/591099 paint/invalidation/resize-iframe-text.html [ Failure ] crbug.com/591099 paint/invalidation/scroll/fixed-child-of-transformed-move-after-scroll.html [ Failure ] crbug.com/591099 paint/invalidation/scroll/repaint-composited-child-in-scrolled-container.html [ Failure ] -crbug.com/591099 paint/invalidation/selection/selected-replaced.html [ Failure Pass ] -crbug.com/591099 paint/invalidation/selection/selection-clear-after-move.html [ Failure Pass ] crbug.com/591099 paint/invalidation/selection/selection-rl.html [ Failure ] crbug.com/591099 paint/invalidation/stacking-context-lost.html [ Failure ] crbug.com/591099 paint/invalidation/svg/animated-path-inside-transformed-html.xhtml [ Failure Pass ] @@ -692,10 +667,10 @@ crbug.com/591099 printing/iframe-svg-in-object-print.html [ Failure ] crbug.com/591099 scrollbars/auto-scrollbar-fit-content.html [ Failure ] crbug.com/591099 storage/indexeddb/cursor-continue-validity.html [ Timeout ] -crbug.com/591099 storage/indexeddb/index-cursor.html [ Timeout ] +crbug.com/591099 storage/indexeddb/index-cursor.html [ Pass Timeout ] crbug.com/591099 storage/indexeddb/mozilla/indexes.html [ Timeout ] crbug.com/591099 storage/indexeddb/mozilla/test_objectStore_openKeyCursor.html [ Timeout ] -crbug.com/591099 storage/indexeddb/objectstore-cursor.html [ Pass Timeout ] +crbug.com/591099 storage/indexeddb/objectstore-cursor.html [ Pass ] crbug.com/591099 storage/indexeddb/objectstore-keycursor.html [ Pass Timeout ] crbug.com/591099 svg/custom/object-sizing-no-width-height.xhtml [ Failure ] crbug.com/591099 svg/filters/feTurbulence-bad-seeds.html [ Failure ] @@ -718,25 +693,24 @@ crbug.com/591099 tables/mozilla/bugs/bug2973.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug30692.html [ Failure ] crbug.com/591099 tables/mozilla/bugs/bug50695-2.html [ Failure ] -crbug.com/591099 tables/mozilla/bugs/bug5538.html [ Failure Pass ] crbug.com/591099 tables/mozilla/bugs/bug55527.html [ Failure ] crbug.com/591099 tables/mozilla_expected_failures/bugs/bug3166-16.html [ Failure ] crbug.com/591099 virtual/android/ [ Skip ] crbug.com/591099 virtual/exotic-color-space/ [ Skip ] crbug.com/591099 virtual/feature-policy-vibrate/ [ Skip ] crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-filter-all.html [ Failure ] -crbug.com/591099 virtual/gpu-rasterization/images/feature-policy-max-downscaling-image.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-blending-color-over-image.html [ Pass ] crbug.com/591099 virtual/layout_ng/ [ Skip ] crbug.com/824918 virtual/layout_ng_experimental/ [ Skip ] crbug.com/591099 virtual/mojo-blob-urls/external/wpt/FileAPI/url/sandboxed-iframe.html [ Pass Timeout ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/compositor-touch-hit-rects.html [ Failure ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/wheel/mainthread-touchpad-fling-latching.html [ Pass ] -crbug.com/591099 virtual/mouseevent_fractional/fast/events/wheel/wheel-scroll-latching-on-scrollbar.html [ Failure Pass ] +crbug.com/591099 virtual/mouseevent_fractional/fast/events/wheel/wheel-scroll-latching-on-scrollbar.html [ Pass ] crbug.com/591099 virtual/new-remote-playback-pipeline/ [ Skip ] crbug.com/591099 virtual/outofblink-cors-ns/external/wpt/xhr/send-redirect-bogus-sync.htm [ Pass ] crbug.com/591099 virtual/outofblink-cors/ [ Skip ] crbug.com/591099 virtual/paint-timing/external/wpt/paint-timing/sibling-painting-first-image.html [ Failure ] +crbug.com/591099 virtual/paint-touchaction-rects/fast/events/touch/compositor-touch-hit-rects-non-composited-scroll.html [ Failure ] crbug.com/591099 virtual/paint-touchaction-rects/fast/events/touch/compositor-touch-hit-rects-scroll.html [ Failure ] crbug.com/591099 virtual/paint-touchaction-rects/fast/events/touch/touch-rect-assert-first-layer-special.html [ Failure ] crbug.com/591099 virtual/paint-touchaction-rects/fast/events/touch/touch-rect-crash-on-unpromote-layer.html [ Failure ] @@ -749,5 +723,4 @@ crbug.com/591099 virtual/threaded/ [ Skip ] crbug.com/591099 virtual/user-activation-v2/fast/events/mouse-cursor.html [ Failure ] crbug.com/591099 virtual/user-activation-v2/fast/events/touch/compositor-touch-hit-rects.html [ Failure ] -crbug.com/591099 virtual/user-activation-v2/fullscreen/full-screen-with-flex-item.html [ Failure ] -crbug.com/591099 virtual/video-surface-layer/media/video-display-toggle.html [ Failure ] +crbug.com/591099 virtual/user-activation-v2/fullscreen/full-screen-with-flex-item.html [ Failure Timeout ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService index 7a0b5c8..c0ff02c4 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService
@@ -3,7 +3,6 @@ Bug(none) external/wpt/clear-site-data/storage.https.html [ Failure ] Bug(none) external/wpt/clear-site-data/navigation.https.html [ Timeout ] -Bug(none) external/wpt/html/browsers/offline/appcache/workers/appcache-worker.html [ Timeout ] crbug.com/829417 external/wpt/html/browsers/offline/appcache/workers/appcache-worker.https.html [ Timeout ] crbug.com/771118 external/wpt/service-workers/service-worker/mime-sniffing.https.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/MSANExpectations b/third_party/WebKit/LayoutTests/MSANExpectations index c8682262..b2dfecb 100644 --- a/third_party/WebKit/LayoutTests/MSANExpectations +++ b/third_party/WebKit/LayoutTests/MSANExpectations
@@ -143,3 +143,6 @@ crbug.com/856601 [ Linux ] external/wpt/touch-events/idlharness.window.html [ Pass Timeout ] crbug.com/856601 [ Linux ] virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-IDL-enumerateDevices.html [ Pass Timeout ] crbug.com/856601 [ Linux ] virtual/feature-policy-permissions/external/wpt/mediacapture-streams/idlharness.https.window.html [ Pass Timeout ] +crbug.com/856601 [ Linux ] virtual/outofblink-cors-ns/external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Timeout Pass ] +crbug.com/856601 [ Linux ] virtual/outofblink-cors/external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Timeout Pass ] +crbug.com/856601 [ Linux ] virtual/service-worker-servicification/external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Timeout Pass ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index 4547fa5c..41bf08e4 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -1719,10 +1719,6 @@ # ====== Out of Blink CORS related tests END ====== -crbug.com/771118 virtual/service-worker-servicification/external/wpt/service-workers/service-worker/mime-sniffing.https.html [ Failure ] -crbug.com/771118 virtual/outofblink-cors/external/wpt/service-workers/service-worker/mime-sniffing.https.html [ Failure ] -crbug.com/771118 virtual/outofblink-cors-ns/external/wpt/service-workers/service-worker/mime-sniffing.https.html [ Failure ] - crbug.com/492664 [ Linux ] external/wpt/css/css-writing-modes/box-offsets-rel-pos-vlr-005.xht [ Failure ] crbug.com/492664 [ Linux ] external/wpt/css/css-writing-modes/box-offsets-rel-pos-vrl-004.xht [ Failure ] crbug.com/492664 [ Mac ] external/wpt/css/css-writing-modes/bidi-embed-002.html [ Failure ] @@ -3657,6 +3653,7 @@ crbug.com/659610 fast/css-grid-layout/grid-baseline.html [ Failure ] crbug.com/659610 fast/css-grid-layout/grid-baseline-margins.html [ Failure ] crbug.com/511177 external/wpt/css/css-grid/grid-layout-properties.html [ Failure ] +crbug.com/868380 external/wpt/css/css-grid/grid-model/grid-container-ignores-first-letter-002.html [ Failure ] crbug.com/707359 [ Mac ] fast/css-grid-layout/grid-align-baseline-vertical.html [ Failure ] crbug.com/707359 [ Mac ] fast/css-grid-layout/grid-self-baseline-03.html [ Failure ] crbug.com/707359 [ Mac ] fast/css-grid-layout/grid-self-baseline-04.html [ Failure ] @@ -4733,11 +4730,6 @@ crbug.com/859102 virtual/gpu/fast/canvas/color-space/canvas-drawImage-p3.html [ Pass Failure ] crbug.com/859102 virtual/gpu/fast/canvas/color-space/canvas-drawImage-rec2020.html [ Pass Failure ] -# Sheriff 2018-07-24 -crbug.com/866965 [ Linux ] virtual/outofblink-cors-ns/external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Timeout Pass ] -crbug.com/866965 [ Linux ] virtual/outofblink-cors/external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Timeout Pass ] -crbug.com/866965 [ Linux ] virtual/service-worker-servicification/external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Timeout Pass ] - crbug.com/867532 [ Linux ] external/wpt/workers/modules/dedicated-worker-import-data-url.any.worker.html [ Timeout Pass ] crbug.com/867532 [ Linux ] external/wpt/workers/modules/dedicated-worker-import.any.worker.html [ Timeout Pass ] crbug.com/867628 [ Mac ] virtual/user-activation-v2/fast/events/middleClickAutoscroll-click-hyperlink.html [ Failure Pass ]
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json index 31a3d20..a5f04738 100644 --- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json +++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -45541,6 +45541,18 @@ {} ] ], + "css/css-grid/grid-model/grid-container-ignores-first-letter-002.html": [ + [ + "/css/css-grid/grid-model/grid-container-ignores-first-letter-002.html", + [ + [ + "/css/css-grid/grid-model/grid-container-ignores-first-letter-002-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-grid/grid-model/grid-display-grid-001.html": [ [ "/css/css-grid/grid-model/grid-display-grid-001.html", @@ -123193,6 +123205,11 @@ {} ] ], + "css/css-grid/grid-model/grid-container-ignores-first-letter-002-ref.html": [ + [ + {} + ] + ], "css/css-grid/grid-model/support/grid.css": [ [ {} @@ -146663,11 +146680,6 @@ {} ] ], - "html/browsers/the-window-object/security-window/window-security.https-expected.txt": [ - [ - {} - ] - ], "html/browsers/the-window-object/support/noopener-target.html": [ [ {} @@ -155138,11 +155150,6 @@ {} ] ], - "html/semantics/forms/the-button-element/button-events-expected.txt": [ - [ - {} - ] - ], "html/semantics/forms/the-button-element/button-validation-expected.txt": [ [ {} @@ -158738,6 +158745,11 @@ {} ] ], + "interfaces/SVG.idl": [ + [ + {} + ] + ], "interfaces/WebCryptoAPI.idl": [ [ {} @@ -168938,6 +168950,11 @@ {} ] ], + "svg/idlharness.window-expected.txt": [ + [ + {} + ] + ], "svg/interfaces-expected.txt": [ [ {} @@ -222666,6 +222683,14 @@ {} ] ], + "html/semantics/tabular-data/processing-model-1/span-limits-2.html": [ + [ + "/html/semantics/tabular-data/processing-model-1/span-limits-2.html", + { + "timeout": "long" + } + ] + ], "html/semantics/tabular-data/processing-model-1/span-limits.html": [ [ "/html/semantics/tabular-data/processing-model-1/span-limits.html", @@ -252106,12 +252131,10 @@ {} ] ], - "svg/interfaces.html": [ + "svg/idlharness.window.js": [ [ - "/svg/interfaces.html", - { - "timeout": "long" - } + "/svg/idlharness.window.html", + {} ] ], "svg/path/error-handling/bounding.svg": [ @@ -313875,6 +313898,14 @@ "157c7945bc8f6e020f3e123789489269f318d91e", "testharness" ], + "css/css-grid/grid-model/grid-container-ignores-first-letter-002-ref.html": [ + "d5ceb684425ee527bdab8a10a572edbbdcdaee4d", + "support" + ], + "css/css-grid/grid-model/grid-container-ignores-first-letter-002.html": [ + "5c53a56b9177187d082698ace609865a20f44728", + "reftest" + ], "css/css-grid/grid-model/grid-container-ignores-first-line-001.html": [ "aec98e4e7bf245637903a1f06d2e5d5519b8da66", "testharness" @@ -359908,7 +359939,7 @@ "support" ], "html/browsers/offline/appcache/workers/resources/appcache-worker.py": [ - "8681ab72485c543d1e22de75cee685478090a848", + "9c9b3fa2f1855f0af3b683c579f0e09d5c0fd0e9", "support" ], "html/browsers/offline/application-cache-api/.gitkeep": [ @@ -360515,12 +360546,8 @@ "da39a3ee5e6b4b0d3255bfef95601890afd80709", "support" ], - "html/browsers/the-window-object/security-window/window-security.https-expected.txt": [ - "a033d653f2d9b0ddb3474f660fb7c83e37d73f16", - "support" - ], "html/browsers/the-window-object/security-window/window-security.https.html": [ - "16f41760b88216c36fbdfba95d249cf99f33b8a3", + "90f87da9922464fc0286a999f86a31ad472c720d", "testharness" ], "html/browsers/the-window-object/support/noopener-target.html": [ @@ -360592,11 +360619,11 @@ "support" ], "html/browsers/the-window-object/window-properties.https-expected.txt": [ - "f3ce1d8416df1174e77ecd1c78e08f082dab3581", + "cdbae9b968385e2a06e175b7610b97b07e655453", "support" ], "html/browsers/the-window-object/window-properties.https.html": [ - "ee0ade0a8de422597c362d15cf4a9dd446e4af00", + "84deb167fddab9c221ce8a545fbcdc5911bddbd8", "testharness" ], "html/browsers/the-window-object/window-prototype-chain-expected.txt": [ @@ -371843,12 +371870,8 @@ "2572c669271b48b218a4ff058789fabed5f3751c", "testharness" ], - "html/semantics/forms/the-button-element/button-events-expected.txt": [ - "4a40047e4855a5220a92d4a82b84ea512c031d4b", - "support" - ], "html/semantics/forms/the-button-element/button-events.html": [ - "322fc4a9f013595a9ac2550401a2743b2ab85b07", + "06ba4c26b76ac5027081299c9818226b62d07dcf", "testharness" ], "html/semantics/forms/the-button-element/button-labels.html": [ @@ -375387,8 +375410,12 @@ "2bee37bc667b7aaf9ffc2be912288540896e3f03", "support" ], + "html/semantics/tabular-data/processing-model-1/span-limits-2.html": [ + "057ca3ab3b2dbef61936a6d30655c233bed9af76", + "testharness" + ], "html/semantics/tabular-data/processing-model-1/span-limits.html": [ - "8e22913e1a3cae5de1413765e5e8de559d5178f2", + "4ce32045b1f2c338f6d956da66fbf093163de361", "testharness" ], "html/semantics/tabular-data/the-caption-element/.gitkeep": [ @@ -378559,6 +378586,10 @@ "42cb812276c3a1fe0f10c19856deec3b003c68bb", "support" ], + "interfaces/SVG.idl": [ + "cec20bcccb2d7ee5402f1554471caa7253026b21", + "support" + ], "interfaces/WebCryptoAPI.idl": [ "a6c7bfdf5f98a32533ba95d76fed71dc4cc6dc38", "support" @@ -378716,7 +378747,7 @@ "support" ], "interfaces/filter-effects.idl": [ - "901c6d05e91de736ae1d627eca584e5c024786fa", + "ac18d472517953807d548a7bc3b53f7fe777fb66", "support" ], "interfaces/fullscreen.idl": [ @@ -405091,14 +405122,18 @@ "18f7e83a130c87f91d6bb11c0e515c4e6302a106", "testharness" ], + "svg/idlharness.window-expected.txt": [ + "dc5c19dcfaff8f13a85af5b98a49142976a775a0", + "support" + ], + "svg/idlharness.window.js": [ + "df7ef720b335325da4e1f7be9ab3968002efc2af", + "testharness" + ], "svg/interfaces-expected.txt": [ "1a9bf0c8fb17f538fab799d2cad3313cd6128e49", "support" ], - "svg/interfaces.html": [ - "6045de5e5dc7810f89ca2c9a526f9e4380ae365c", - "testharness" - ], "svg/linking/reftests/href-a-element-attr-change.html": [ "74ac37244250ec2d03a50b3e487b39d344ca7dc1", "reftest"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/grid-model/grid-container-ignores-first-letter-002-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/grid-model/grid-container-ignores-first-letter-002-ref.html new file mode 100644 index 0000000..1d89a21 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/grid-model/grid-container-ignores-first-letter-002-ref.html
@@ -0,0 +1,7 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Grid Layout Test Reference</title> +<link rel="author" title="Rune Lillesveen" href="mailto:futhark@chromium.org"> +<button style="display:grid"> + First letter should not be red +</button>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/grid-model/grid-container-ignores-first-letter-002.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/grid-model/grid-container-ignores-first-letter-002.html new file mode 100644 index 0000000..42014ad --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/grid-model/grid-container-ignores-first-letter-002.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Grid Layout Test: '::first-letter' is ignored in button grid containers</title> +<link rel="author" title="Rune Lillesveen" href="mailto:futhark@chromium.org"> +<link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-containers"> +<link rel="help" href="http://www.w3.org/TR/css3-selectors/#first-letter"> +<link rel="match" href="grid-container-ignores-first-letter-002-ref.html"> +<style> + /* The combination of button, grid, nested inlines, and ::first-letter crashes Blink */ + button { display: grid } + button::first-letter { color: red } +</style> +<button> + <span> + <span>First letter should not be red</span> + </span> +</button>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/offline/appcache/workers/resources/appcache-worker.py b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/offline/appcache/workers/resources/appcache-worker.py index 22d02fe..00281a2b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/offline/appcache/workers/resources/appcache-worker.py +++ b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/offline/appcache/workers/resources/appcache-worker.py
@@ -30,7 +30,7 @@ }); } -function importNotInCacheSciptTest() { +function importNotInCacheScriptTest() { return new Promise((resolve, reject) => { try { importScripts('appcache-worker-import.py?type=not-in-cache'); @@ -41,7 +41,7 @@ }); } -function importFallbackSciptTest() { +function importFallbackScriptTest() { return new Promise((resolve, reject) => { info = ''; try { @@ -87,8 +87,8 @@ initPromise .then(importCachedScriptTest) - .then(importNotInCacheSciptTest) - .then(importFallbackSciptTest) + .then(importNotInCacheScriptTest) + .then(importFallbackScriptTest) .then(fetchCachedFileTest) .then(fetchNotInCacheFileTest) .then(_ => postMessage('Done: %s'),
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/the-window-object/security-window/window-security.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/the-window-object/security-window/window-security.https-expected.txt deleted file mode 100644 index 9a352599..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/the-window-object/security-window/window-security.https-expected.txt +++ /dev/null
@@ -1,129 +0,0 @@ -This is a testharness.js-based test. -PASS Window Security testing -PASS A SecurityError exception must be thrown when window.applicationCache is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.devicePixelRatio is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.document is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.external is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.frameElement is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.history is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.innerWidth is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.innerHeight is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.locationbar is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.localStorage is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.menubar is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.name is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.navigator is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onabort is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onafterprint is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onbeforeprint is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onbeforeunload is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onblur is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.oncancel is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.oncanplay is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.oncanplaythrough is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onchange is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onclick is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onclose is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.oncontextmenu is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.oncuechange is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.ondblclick is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.ondrag is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.ondragend is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.ondragenter is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.ondragleave is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.ondragover is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.ondragstart is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.ondrop is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.ondurationchange is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onemptied is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onended is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onerror is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onfocus is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onhashchange is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.oninput is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.oninvalid is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onkeydown is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onkeypress is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onkeyup is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onload is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onloadeddata is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onloadedmetadata is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onloadstart is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onmessage is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onmousedown is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onmousemove is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onmouseout is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onmouseover is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onmouseup is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onmousewheel is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onoffline is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.ononline is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onpause is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onplay is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onplaying is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onpagehide is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onpageshow is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onpopstate is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onprogress is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onratechange is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onreset is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onresize is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onscroll is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onseeked is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onseeking is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onselect is accessed from a different origin. -FAIL A SecurityError exception must be thrown when window.onshow is accessed from a different origin. assert_true: window.onshow should exist. expected true got false -PASS A SecurityError exception must be thrown when window.onstalled is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onstorage is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onsubmit is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onsuspend is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.ontimeupdate is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onunload is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onvolumechange is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.onwaiting is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.pageXOffset is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.pageYOffset is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.personalbar is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.screen is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.scrollbars is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.statusbar is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.status is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.screenX is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.screenY is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.sessionStorage is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.toolbar is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.alert is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.clearInterval is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.clearTimeout is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.confirm is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.getComputedStyle is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.getSelection is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.matchMedia is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.moveBy is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.moveTo is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.open is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.print is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.prompt is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.resizeTo is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.resizeBy is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.scroll is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.scrollTo is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.scrollBy is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.setInterval is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.setTimeout is accessed from a different origin. -PASS A SecurityError exception must be thrown when window.stop is accessed from a different origin. -PASS A SecurityError exception should not be thrown when window.closed is accessed from a different origin. -PASS A SecurityError exception should not be thrown when window.frames is accessed from a different origin. -PASS A SecurityError exception should not be thrown when window.length is accessed from a different origin. -PASS A SecurityError exception should not be thrown when window.location is accessed from a different origin. -PASS A SecurityError exception should not be thrown when window.opener is accessed from a different origin. -PASS A SecurityError exception should not be thrown when window.parent is accessed from a different origin. -PASS A SecurityError exception should not be thrown when window.self is accessed from a different origin. -PASS A SecurityError exception should not be thrown when window.top is accessed from a different origin. -PASS A SecurityError exception should not be thrown when window.window is accessed from a different origin. -PASS A SecurityError exception should not be thrown when window.blur is accessed from a different origin. -PASS A SecurityError exception should not be thrown when window.close is accessed from a different origin. -PASS A SecurityError exception should not be thrown when window.focus is accessed from a different origin. -PASS A SecurityError exception should not be thrown when window.postMessage is accessed from a different origin. -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/the-window-object/security-window/window-security.https.html b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/the-window-object/security-window/window-security.https.html index 91260148..1fb0ed7 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/the-window-object/security-window/window-security.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/the-window-object/security-window/window-security.https.html
@@ -96,7 +96,6 @@ {name: "onseeked"}, {name: "onseeking"}, {name: "onselect"}, - {name: "onshow"}, {name: "onstalled"}, {name: "onstorage"}, {name: "onsubmit"},
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/the-window-object/window-properties.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/the-window-object/window-properties.https-expected.txt index 1722de3..706f4d5 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/the-window-object/window-properties.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/the-window-object/window-properties.https-expected.txt
@@ -128,7 +128,6 @@ PASS Window attribute: onseeked PASS Window attribute: onseeking PASS Window attribute: onselect -FAIL Window attribute: onshow assert_true: onshow in window expected true got false PASS Window attribute: onstalled PASS Window attribute: onstorage PASS Window attribute: onsubmit
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/the-window-object/window-properties.https.html b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/the-window-object/window-properties.https.html index 5ad6335..603f9832 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/the-window-object/window-properties.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/the-window-object/window-properties.https.html
@@ -181,7 +181,6 @@ "onseeked", "onseeking", "onselect", - "onshow", "onstalled", "onstorage", "onsubmit",
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/the-button-element/button-events-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/the-button-element/button-events-expected.txt deleted file mode 100644 index 7bdf5c30..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/the-button-element/button-events-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS The submit event must be fired when click a button in submit status -PASS The reset event must be fired when click a button in reset status -FAIL The show event must be fired when click a button in menu status assert_equals: The button type should be 'menu'. expected "menu" but got "submit" -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/the-button-element/button-events.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/the-button-element/button-events.html index 9d308bb..4d924e4 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/the-button-element/button-events.html +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/the-button-element/button-events.html
@@ -9,17 +9,13 @@ <form name="fm1" style="display:none"> <button id="btn">BUTTON</button> <button id="menu_btn" type="menu" menu="menu">MENU BUTTON</button> - <menu id="menu" label="MENU"> - <li>Menu item</li> - </menu> </form> <script> var btn = document.getElementById("btn"), menu_btn = document.getElementById("menu_btn"), t1 = async_test("The submit event must be fired when click a button in submit status"), - t2 = async_test("The reset event must be fired when click a button in reset status"), - t3 = async_test("The show event must be fired when click a button in menu status"); + t2 = async_test("The reset event must be fired when click a button in reset status"); document.forms.fm1.onsubmit = t1.step_func(function (evt) { evt.preventDefault(); @@ -38,14 +34,6 @@ t2.done(); }); -document.getElementById("menu").onshow = t3.step_func(function (evt) { - assert_true(evt.isTrusted, "The isTrusted attribute of the show event should be true."); - assert_equals(evt.relatedTarget, menu_btn, "The relatedTarget attribute should be initialized to the related button element."); - assert_true(evt.cancelable, "The cancelable attribute of the show event should be true."); - assert_true(evt instanceof RelatedEvent, "The show event is an instance of RelatedEvent interface."); - t3.done(); -}); - t1.step(function () { btn.type = "submit"; assert_equals(btn.type, "submit", "The button type should be 'submit'."); @@ -58,9 +46,4 @@ btn.click(); }); -t3.step(function () { - assert_equals(menu_btn.type, "menu", "The button type should be 'menu'."); - menu_btn.click(); -}); - </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/SVG.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/SVG.idl new file mode 100644 index 0000000..1c34e47 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/SVG.idl
@@ -0,0 +1,690 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content of this file was automatically extracted from the +// "Scalable Vector Graphics (SVG) 2" spec. +// See: https://svgwg.org/svg2-draft/ + +[Exposed=Window] +interface SVGElement : Element { + + [SameObject] readonly attribute SVGAnimatedString className; + + readonly attribute SVGSVGElement? ownerSVGElement; + readonly attribute SVGElement? viewportElement; +}; + +SVGElement includes GlobalEventHandlers; +SVGElement includes DocumentAndElementEventHandlers; +SVGElement includes SVGElementInstance; +SVGElement includes HTMLOrSVGElement; + +dictionary SVGBoundingBoxOptions { + boolean fill = true; + boolean stroke = false; + boolean markers = false; + boolean clipped = false; +}; + +interface SVGGraphicsElement : SVGElement { + [SameObject] readonly attribute SVGAnimatedTransformList transform; + + DOMRect getBBox(optional SVGBoundingBoxOptions options); + DOMMatrix? getCTM(); + DOMMatrix? getScreenCTM(); +}; + +SVGGraphicsElement includes SVGTests; + +[Exposed=Window] +interface SVGGeometryElement : SVGGraphicsElement { + [SameObject] readonly attribute SVGAnimatedNumber pathLength; + + boolean isPointInFill(optional DOMPointInit point); + boolean isPointInStroke(optional DOMPointInit point); + float getTotalLength(); + DOMPoint getPointAtLength(float distance); +}; + +[Exposed=Window] +interface SVGNumber { + attribute float value; +}; + +[Exposed=Window] +interface SVGLength { + + // Length Unit Types + const unsigned short SVG_LENGTHTYPE_UNKNOWN = 0; + const unsigned short SVG_LENGTHTYPE_NUMBER = 1; + const unsigned short SVG_LENGTHTYPE_PERCENTAGE = 2; + const unsigned short SVG_LENGTHTYPE_EMS = 3; + const unsigned short SVG_LENGTHTYPE_EXS = 4; + const unsigned short SVG_LENGTHTYPE_PX = 5; + const unsigned short SVG_LENGTHTYPE_CM = 6; + const unsigned short SVG_LENGTHTYPE_MM = 7; + const unsigned short SVG_LENGTHTYPE_IN = 8; + const unsigned short SVG_LENGTHTYPE_PT = 9; + const unsigned short SVG_LENGTHTYPE_PC = 10; + + readonly attribute unsigned short unitType; + attribute float value; + attribute float valueInSpecifiedUnits; + attribute DOMString valueAsString; + + void newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits); + void convertToSpecifiedUnits(unsigned short unitType); +}; + +[Exposed=Window] +interface SVGAngle { + + // Angle Unit Types + const unsigned short SVG_ANGLETYPE_UNKNOWN = 0; + const unsigned short SVG_ANGLETYPE_UNSPECIFIED = 1; + const unsigned short SVG_ANGLETYPE_DEG = 2; + const unsigned short SVG_ANGLETYPE_RAD = 3; + const unsigned short SVG_ANGLETYPE_GRAD = 4; + + readonly attribute unsigned short unitType; + attribute float value; + attribute float valueInSpecifiedUnits; + attribute DOMString valueAsString; + + void newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits); + void convertToSpecifiedUnits(unsigned short unitType); +}; + +[Exposed=Window] +interface SVGNumberList { + + readonly attribute unsigned long length; + readonly attribute unsigned long numberOfItems; + + void clear(); + SVGNumber initialize(SVGNumber newItem); + getter SVGNumber getItem(unsigned long index); + SVGNumber insertItemBefore(SVGNumber newItem, unsigned long index); + SVGNumber replaceItem(SVGNumber newItem, unsigned long index); + SVGNumber removeItem(unsigned long index); + SVGNumber appendItem(SVGNumber newItem); + setter void (unsigned long index, SVGNumber newItem); +}; + +[Exposed=Window] +interface SVGLengthList { + + readonly attribute unsigned long length; + readonly attribute unsigned long numberOfItems; + + void clear(); + SVGLength initialize(SVGLength newItem); + getter SVGLength getItem(unsigned long index); + SVGLength insertItemBefore(SVGLength newItem, unsigned long index); + SVGLength replaceItem(SVGLength newItem, unsigned long index); + SVGLength removeItem(unsigned long index); + SVGLength appendItem(SVGLength newItem); + setter void (unsigned long index, SVGLength newItem); +}; + +[Exposed=Window] +interface SVGAnimatedBoolean { + attribute boolean baseVal; + readonly attribute boolean animVal; +}; + +[Exposed=Window] +interface SVGAnimatedEnumeration { + attribute unsigned short baseVal; + readonly attribute unsigned short animVal; +}; + +[Exposed=Window] +interface SVGAnimatedInteger { + attribute long baseVal; + readonly attribute long animVal; +}; + +[Exposed=Window] +interface SVGAnimatedNumber { + attribute float baseVal; + readonly attribute float animVal; +}; + +[Exposed=Window] +interface SVGAnimatedLength { + [SameObject] readonly attribute SVGLength baseVal; + [SameObject] readonly attribute SVGLength animVal; +}; + +[Exposed=Window] +interface SVGAnimatedAngle { + [SameObject] readonly attribute SVGAngle baseVal; + [SameObject] readonly attribute SVGAngle animVal; +}; + +[Exposed=Window] +interface SVGAnimatedString { + attribute DOMString baseVal; + readonly attribute DOMString animVal; +}; + +[Exposed=Window] +interface SVGAnimatedRect { + [SameObject] readonly attribute DOMRect baseVal; + [SameObject] readonly attribute DOMRectReadOnly animVal; +}; + +[Exposed=Window] +interface SVGAnimatedNumberList { + [SameObject] readonly attribute SVGNumberList baseVal; + [SameObject] readonly attribute SVGNumberList animVal; +}; + +[Exposed=Window] +interface SVGAnimatedLengthList { + [SameObject] readonly attribute SVGLengthList baseVal; + [SameObject] readonly attribute SVGLengthList animVal; +}; + +[Exposed=Window] +interface SVGStringList { + + readonly attribute unsigned long length; + readonly attribute unsigned long numberOfItems; + + void clear(); + DOMString initialize(DOMString newItem); + getter DOMString getItem(unsigned long index); + DOMString insertItemBefore(DOMString newItem, unsigned long index); + DOMString replaceItem(DOMString newItem, unsigned long index); + DOMString removeItem(unsigned long index); + DOMString appendItem(DOMString newItem); + setter void (unsigned long index, DOMString newItem); +}; + +[Exposed=Window] +interface SVGUnitTypes { + // Unit Types + const unsigned short SVG_UNIT_TYPE_UNKNOWN = 0; + const unsigned short SVG_UNIT_TYPE_USERSPACEONUSE = 1; + const unsigned short SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2; +}; + +interface mixin SVGTests { + [SameObject] readonly attribute SVGStringList requiredExtensions; + [SameObject] readonly attribute SVGStringList systemLanguage; +}; + +interface mixin SVGFitToViewBox { + [SameObject] readonly attribute SVGAnimatedRect viewBox; + [SameObject] readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio; +}; + +interface mixin SVGZoomAndPan { + + // Zoom and Pan Types + const unsigned short SVG_ZOOMANDPAN_UNKNOWN = 0; + const unsigned short SVG_ZOOMANDPAN_DISABLE = 1; + const unsigned short SVG_ZOOMANDPAN_MAGNIFY = 2; + + attribute unsigned short zoomAndPan; +}; + +interface mixin SVGURIReference { + [SameObject] readonly attribute SVGAnimatedString href; +}; + +partial interface Document { + readonly attribute SVGSVGElement? rootElement; +}; + +[Exposed=Window] +interface SVGSVGElement : SVGGraphicsElement { + + [SameObject] readonly attribute SVGAnimatedLength x; + [SameObject] readonly attribute SVGAnimatedLength y; + [SameObject] readonly attribute SVGAnimatedLength width; + [SameObject] readonly attribute SVGAnimatedLength height; + + attribute float currentScale; + [SameObject] readonly attribute DOMPointReadOnly currentTranslate; + + NodeList getIntersectionList(DOMRectReadOnly rect, SVGElement? referenceElement); + NodeList getEnclosureList(DOMRectReadOnly rect, SVGElement? referenceElement); + boolean checkIntersection(SVGElement element, DOMRectReadOnly rect); + boolean checkEnclosure(SVGElement element, DOMRectReadOnly rect); + + void deselectAll(); + + SVGNumber createSVGNumber(); + SVGLength createSVGLength(); + SVGAngle createSVGAngle(); + DOMPoint createSVGPoint(); + DOMMatrix createSVGMatrix(); + DOMRect createSVGRect(); + SVGTransform createSVGTransform(); + SVGTransform createSVGTransformFromMatrix(DOMMatrixReadOnly matrix); + + Element getElementById(DOMString elementId); + + // Deprecated methods that have no effect when called, + // but which are kept for compatibility reasons. + unsigned long suspendRedraw(unsigned long maxWaitMilliseconds); + void unsuspendRedraw(unsigned long suspendHandleID); + void unsuspendRedrawAll(); + void forceRedraw(); +}; + +SVGSVGElement includes SVGFitToViewBox; +SVGSVGElement includes SVGZoomAndPan; +SVGSVGElement includes WindowEventHandlers; + +[Exposed=Window] +interface SVGGElement : SVGGraphicsElement { +}; + +[Exposed=Window] +interface SVGUnknownElement : SVGGraphicsElement { +}; + +[Exposed=Window] +interface SVGDefsElement : SVGGraphicsElement { +}; + +[Exposed=Window] +interface SVGDescElement : SVGElement { +}; + +[Exposed=Window] +interface SVGMetadataElement : SVGElement { +}; + +[Exposed=Window] +interface SVGTitleElement : SVGElement { +}; + +[Exposed=Window] +interface SVGSymbolElement : SVGGraphicsElement { +}; + +SVGSymbolElement includes SVGFitToViewBox; + +[Exposed=Window] +interface SVGUseElement : SVGGraphicsElement { + [SameObject] readonly attribute SVGAnimatedLength x; + [SameObject] readonly attribute SVGAnimatedLength y; + [SameObject] readonly attribute SVGAnimatedLength width; + [SameObject] readonly attribute SVGAnimatedLength height; + [SameObject] readonly attribute SVGElement? instanceRoot; + [SameObject] readonly attribute SVGElement? animatedInstanceRoot; +}; + +SVGUseElement includes SVGURIReference; + +[Exposed=Window] +interface SVGUseElementShadowRoot : ShadowRoot { +}; + +interface mixin SVGElementInstance { + [SameObject] readonly attribute SVGElement? correspondingElement; + [SameObject] readonly attribute SVGUseElement? correspondingUseElement; +}; + +[Constructor(Animation source, Animatable newTarget), Exposed=Window] +interface ShadowAnimation : Animation { + [SameObject] readonly attribute Animation sourceAnimation; +}; + +[Exposed=Window] +interface SVGSwitchElement : SVGGraphicsElement { +}; + +interface mixin GetSVGDocument { + Document getSVGDocument(); +}; + +[Exposed=Window] +interface SVGStyleElement : SVGElement { + attribute DOMString type; + attribute DOMString media; + attribute DOMString title; +}; + +SVGStyleElement includes LinkStyle; + +[Exposed=Window] +interface SVGTransform { + + // Transform Types + const unsigned short SVG_TRANSFORM_UNKNOWN = 0; + const unsigned short SVG_TRANSFORM_MATRIX = 1; + const unsigned short SVG_TRANSFORM_TRANSLATE = 2; + const unsigned short SVG_TRANSFORM_SCALE = 3; + const unsigned short SVG_TRANSFORM_ROTATE = 4; + const unsigned short SVG_TRANSFORM_SKEWX = 5; + const unsigned short SVG_TRANSFORM_SKEWY = 6; + + readonly attribute unsigned short type; + [SameObject] readonly attribute DOMMatrix matrix; + readonly attribute float angle; + + void setMatrix(DOMMatrixReadOnly matrix); + void setTranslate(float tx, float ty); + void setScale(float sx, float sy); + void setRotate(float angle, float cx, float cy); + void setSkewX(float angle); + void setSkewY(float angle); +}; + +[Exposed=Window] +interface SVGTransformList { + + readonly attribute unsigned long length; + readonly attribute unsigned long numberOfItems; + + void clear(); + SVGTransform initialize(SVGTransform newItem); + getter SVGTransform getItem(unsigned long index); + SVGTransform insertItemBefore(SVGTransform newItem, unsigned long index); + SVGTransform replaceItem(SVGTransform newItem, unsigned long index); + SVGTransform removeItem(unsigned long index); + SVGTransform appendItem(SVGTransform newItem); + setter void (unsigned long index, SVGTransform newItem); + + // Additional methods not common to other list interfaces. + SVGTransform createSVGTransformFromMatrix(DOMMatrixReadOnly matrix); + SVGTransform? consolidate(); +}; + +[Exposed=Window] +interface SVGAnimatedTransformList { + [SameObject] readonly attribute SVGTransformList baseVal; + [SameObject] readonly attribute SVGTransformList animVal; +}; + +[Exposed=Window] +interface SVGPreserveAspectRatio { + + // Alignment Types + const unsigned short SVG_PRESERVEASPECTRATIO_UNKNOWN = 0; + const unsigned short SVG_PRESERVEASPECTRATIO_NONE = 1; + const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMIN = 2; + const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3; + const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4; + const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMID = 5; + const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMID = 6; + const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMID = 7; + const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMAX = 8; + const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9; + const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10; + + // Meet-or-slice Types + const unsigned short SVG_MEETORSLICE_UNKNOWN = 0; + const unsigned short SVG_MEETORSLICE_MEET = 1; + const unsigned short SVG_MEETORSLICE_SLICE = 2; + + attribute unsigned short align; + attribute unsigned short meetOrSlice; +}; + +[Exposed=Window] +interface SVGAnimatedPreserveAspectRatio { + [SameObject] readonly attribute SVGPreserveAspectRatio baseVal; + [SameObject] readonly attribute SVGPreserveAspectRatio animVal; +}; + +[Exposed=Window] +interface SVGPathElement : SVGGeometryElement { +}; + +[Exposed=Window] +interface SVGRectElement : SVGGeometryElement { + [SameObject] readonly attribute SVGAnimatedLength x; + [SameObject] readonly attribute SVGAnimatedLength y; + [SameObject] readonly attribute SVGAnimatedLength width; + [SameObject] readonly attribute SVGAnimatedLength height; + [SameObject] readonly attribute SVGAnimatedLength rx; + [SameObject] readonly attribute SVGAnimatedLength ry; +}; + +[Exposed=Window] +interface SVGCircleElement : SVGGeometryElement { + [SameObject] readonly attribute SVGAnimatedLength cx; + [SameObject] readonly attribute SVGAnimatedLength cy; + [SameObject] readonly attribute SVGAnimatedLength r; +}; + +[Exposed=Window] +interface SVGEllipseElement : SVGGeometryElement { + [SameObject] readonly attribute SVGAnimatedLength cx; + [SameObject] readonly attribute SVGAnimatedLength cy; + [SameObject] readonly attribute SVGAnimatedLength rx; + [SameObject] readonly attribute SVGAnimatedLength ry; +}; + +[Exposed=Window] +interface SVGLineElement : SVGGeometryElement { + [SameObject] readonly attribute SVGAnimatedLength x1; + [SameObject] readonly attribute SVGAnimatedLength y1; + [SameObject] readonly attribute SVGAnimatedLength x2; + [SameObject] readonly attribute SVGAnimatedLength y2; +}; + +interface mixin SVGAnimatedPoints { + [SameObject] readonly attribute SVGPointList points; + [SameObject] readonly attribute SVGPointList animatedPoints; +}; + +[Exposed=Window] +interface SVGPointList { + + readonly attribute unsigned long length; + readonly attribute unsigned long numberOfItems; + + void clear(); + DOMPoint initialize(DOMPoint newItem); + getter DOMPoint getItem(unsigned long index); + DOMPoint insertItemBefore(DOMPoint newItem, unsigned long index); + DOMPoint replaceItem(DOMPoint newItem, unsigned long index); + DOMPoint removeItem(unsigned long index); + DOMPoint appendItem(DOMPoint newItem); + setter void (unsigned long index, DOMPoint newItem); +}; + +[Exposed=Window] +interface SVGPolylineElement : SVGGeometryElement { +}; + +SVGPolylineElement includes SVGAnimatedPoints; + +[Exposed=Window] +interface SVGPolygonElement : SVGGeometryElement { +}; + +SVGPolygonElement includes SVGAnimatedPoints; + +[Exposed=Window] +interface SVGTextContentElement : SVGGraphicsElement { + + // lengthAdjust Types + const unsigned short LENGTHADJUST_UNKNOWN = 0; + const unsigned short LENGTHADJUST_SPACING = 1; + const unsigned short LENGTHADJUST_SPACINGANDGLYPHS = 2; + + [SameObject] readonly attribute SVGAnimatedLength textLength; + [SameObject] readonly attribute SVGAnimatedEnumeration lengthAdjust; + + long getNumberOfChars(); + float getComputedTextLength(); + float getSubStringLength(unsigned long charnum, unsigned long nchars); + DOMPoint getStartPositionOfChar(unsigned long charnum); + DOMPoint getEndPositionOfChar(unsigned long charnum); + DOMRect getExtentOfChar(unsigned long charnum); + float getRotationOfChar(unsigned long charnum); + long getCharNumAtPosition(optional DOMPointInit point); + void selectSubString(unsigned long charnum, unsigned long nchars); +}; + +[Exposed=Window] +interface SVGTextPositioningElement : SVGTextContentElement { + [SameObject] readonly attribute SVGAnimatedLengthList x; + [SameObject] readonly attribute SVGAnimatedLengthList y; + [SameObject] readonly attribute SVGAnimatedLengthList dx; + [SameObject] readonly attribute SVGAnimatedLengthList dy; + [SameObject] readonly attribute SVGAnimatedNumberList rotate; +}; + +[Exposed=Window] +interface SVGTextElement : SVGTextPositioningElement { +}; + +[Exposed=Window] +interface SVGTSpanElement : SVGTextPositioningElement { +}; + +[Exposed=Window] +interface SVGTextPathElement : SVGTextContentElement { + + // textPath Method Types + const unsigned short TEXTPATH_METHODTYPE_UNKNOWN = 0; + const unsigned short TEXTPATH_METHODTYPE_ALIGN = 1; + const unsigned short TEXTPATH_METHODTYPE_STRETCH = 2; + + // textPath Spacing Types + const unsigned short TEXTPATH_SPACINGTYPE_UNKNOWN = 0; + const unsigned short TEXTPATH_SPACINGTYPE_AUTO = 1; + const unsigned short TEXTPATH_SPACINGTYPE_EXACT = 2; + + [SameObject] readonly attribute SVGAnimatedLength startOffset; + [SameObject] readonly attribute SVGAnimatedEnumeration method; + [SameObject] readonly attribute SVGAnimatedEnumeration spacing; +}; + +SVGTextPathElement includes SVGURIReference; + +[Exposed=Window] +interface SVGImageElement : SVGGraphicsElement { + [SameObject] readonly attribute SVGAnimatedLength x; + [SameObject] readonly attribute SVGAnimatedLength y; + [SameObject] readonly attribute SVGAnimatedLength width; + [SameObject] readonly attribute SVGAnimatedLength height; + [SameObject] readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio; + attribute DOMString? crossOrigin; +}; + +SVGImageElement includes SVGURIReference; + +[Exposed=Window] +interface SVGForeignObjectElement : SVGGraphicsElement { + [SameObject] readonly attribute SVGAnimatedLength x; + [SameObject] readonly attribute SVGAnimatedLength y; + [SameObject] readonly attribute SVGAnimatedLength width; + [SameObject] readonly attribute SVGAnimatedLength height; +}; + +[Exposed=Window] +interface SVGMarkerElement : SVGElement { + + // Marker Unit Types + const unsigned short SVG_MARKERUNITS_UNKNOWN = 0; + const unsigned short SVG_MARKERUNITS_USERSPACEONUSE = 1; + const unsigned short SVG_MARKERUNITS_STROKEWIDTH = 2; + + // Marker Orientation Types + const unsigned short SVG_MARKER_ORIENT_UNKNOWN = 0; + const unsigned short SVG_MARKER_ORIENT_AUTO = 1; + const unsigned short SVG_MARKER_ORIENT_ANGLE = 2; + + [SameObject] readonly attribute SVGAnimatedLength refX; + [SameObject] readonly attribute SVGAnimatedLength refY; + [SameObject] readonly attribute SVGAnimatedEnumeration markerUnits; + [SameObject] readonly attribute SVGAnimatedLength markerWidth; + [SameObject] readonly attribute SVGAnimatedLength markerHeight; + [SameObject] readonly attribute SVGAnimatedEnumeration orientType; + [SameObject] readonly attribute SVGAnimatedAngle orientAngle; + attribute DOMString orient; + + void setOrientToAuto(); + void setOrientToAngle(SVGAngle angle); +}; + +SVGMarkerElement includes SVGFitToViewBox; + +[Exposed=Window] +interface SVGGradientElement : SVGElement { + + // Spread Method Types + const unsigned short SVG_SPREADMETHOD_UNKNOWN = 0; + const unsigned short SVG_SPREADMETHOD_PAD = 1; + const unsigned short SVG_SPREADMETHOD_REFLECT = 2; + const unsigned short SVG_SPREADMETHOD_REPEAT = 3; + + [SameObject] readonly attribute SVGAnimatedEnumeration gradientUnits; + [SameObject] readonly attribute SVGAnimatedTransformList gradientTransform; + [SameObject] readonly attribute SVGAnimatedEnumeration spreadMethod; +}; + +SVGGradientElement includes SVGURIReference; + +[Exposed=Window] +interface SVGLinearGradientElement : SVGGradientElement { + [SameObject] readonly attribute SVGAnimatedLength x1; + [SameObject] readonly attribute SVGAnimatedLength y1; + [SameObject] readonly attribute SVGAnimatedLength x2; + [SameObject] readonly attribute SVGAnimatedLength y2; +}; + +[Exposed=Window] +interface SVGRadialGradientElement : SVGGradientElement { + [SameObject] readonly attribute SVGAnimatedLength cx; + [SameObject] readonly attribute SVGAnimatedLength cy; + [SameObject] readonly attribute SVGAnimatedLength r; + [SameObject] readonly attribute SVGAnimatedLength fx; + [SameObject] readonly attribute SVGAnimatedLength fy; + [SameObject] readonly attribute SVGAnimatedLength fr; +}; + +[Exposed=Window] +interface SVGStopElement : SVGElement { + [SameObject] readonly attribute SVGAnimatedNumber offset; +}; + +[Exposed=Window] +interface SVGPatternElement : SVGElement { + [SameObject] readonly attribute SVGAnimatedEnumeration patternUnits; + [SameObject] readonly attribute SVGAnimatedEnumeration patternContentUnits; + [SameObject] readonly attribute SVGAnimatedTransformList patternTransform; + [SameObject] readonly attribute SVGAnimatedLength x; + [SameObject] readonly attribute SVGAnimatedLength y; + [SameObject] readonly attribute SVGAnimatedLength width; + [SameObject] readonly attribute SVGAnimatedLength height; +}; + +SVGPatternElement includes SVGFitToViewBox; +SVGPatternElement includes SVGURIReference; + +[Exposed=Window] +interface SVGScriptElement : SVGElement { + attribute DOMString type; + attribute DOMString? crossOrigin; +}; + +SVGScriptElement includes SVGURIReference; + +[Exposed=Window] +interface SVGAElement : SVGGraphicsElement { + [SameObject] readonly attribute SVGAnimatedString target; + [SameObject] readonly attribute SVGAnimatedString download; + [SameObject] readonly attribute SVGAnimatedString rel; + [SameObject] readonly attribute SVGAnimatedString relList; + [SameObject] readonly attribute SVGAnimatedString hreflang; + [SameObject] readonly attribute SVGAnimatedString type; +}; + +SVGAElement includes SVGURIReference; +SVGAElement includes HTMLHyperlinkElementUtils; + +[Exposed=Window] +interface SVGViewElement : SVGElement {}; + +SVGViewElement includes SVGFitToViewBox; +SVGViewElement includes SVGZoomAndPan;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/filter-effects.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/filter-effects.idl index 2e374648..d2d7b35 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/filter-effects.idl +++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/filter-effects.idl
@@ -11,7 +11,7 @@ readonly attribute SVGAnimatedLength height; }; -SVGFilterElement implements SVGURIReference; +SVGFilterElement includes SVGURIReference; interface mixin SVGFilterPrimitiveStandardAttributes { readonly attribute SVGAnimatedLength x; @@ -227,7 +227,7 @@ }; SVGFEImageElement includes SVGFilterPrimitiveStandardAttributes; -SVGFEImageElement implements SVGURIReference; +SVGFEImageElement includes SVGURIReference; interface SVGFEMergeElement : SVGElement { };
diff --git a/third_party/WebKit/LayoutTests/external/wpt/svg/idlharness.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/svg/idlharness.window-expected.txt new file mode 100644 index 0000000..1a3ba786 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/svg/idlharness.window-expected.txt
@@ -0,0 +1,1853 @@ +This is a testharness.js-based test. +Found 1849 tests; 1721 PASS, 128 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS SVG interfaces +PASS Partial interface Document: original interface defined +PASS SVGElement interface: existence and properties of interface object +PASS SVGElement interface object length +PASS SVGElement interface object name +PASS SVGElement interface: existence and properties of interface prototype object +PASS SVGElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGElement interface: attribute className +PASS Unscopable handled correctly for className property on SVGElement +PASS SVGElement interface: attribute ownerSVGElement +PASS Unscopable handled correctly for ownerSVGElement property on SVGElement +PASS SVGElement interface: attribute viewportElement +PASS Unscopable handled correctly for viewportElement property on SVGElement +FAIL SVGElement interface: attribute correspondingElement assert_true: The prototype object must have a property "correspondingElement" expected true got false +PASS Unscopable handled correctly for correspondingElement property on SVGElement +FAIL SVGElement interface: attribute correspondingUseElement assert_true: The prototype object must have a property "correspondingUseElement" expected true got false +PASS Unscopable handled correctly for correspondingUseElement property on SVGElement +PASS SVGGraphicsElement interface: existence and properties of interface object +PASS SVGGraphicsElement interface object length +PASS SVGGraphicsElement interface object name +PASS SVGGraphicsElement interface: existence and properties of interface prototype object +PASS SVGGraphicsElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGGraphicsElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGGraphicsElement interface: attribute transform +PASS Unscopable handled correctly for transform property on SVGGraphicsElement +PASS SVGGraphicsElement interface: operation getBBox(SVGBoundingBoxOptions) +PASS Unscopable handled correctly for getBBox(SVGBoundingBoxOptions) on SVGGraphicsElement +PASS SVGGraphicsElement interface: operation getCTM() +PASS Unscopable handled correctly for getCTM() on SVGGraphicsElement +PASS SVGGraphicsElement interface: operation getScreenCTM() +PASS Unscopable handled correctly for getScreenCTM() on SVGGraphicsElement +PASS SVGGraphicsElement interface: attribute requiredExtensions +PASS Unscopable handled correctly for requiredExtensions property on SVGGraphicsElement +PASS SVGGraphicsElement interface: attribute systemLanguage +PASS Unscopable handled correctly for systemLanguage property on SVGGraphicsElement +PASS SVGGeometryElement interface: existence and properties of interface object +PASS SVGGeometryElement interface object length +PASS SVGGeometryElement interface object name +PASS SVGGeometryElement interface: existence and properties of interface prototype object +PASS SVGGeometryElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGGeometryElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGGeometryElement interface: attribute pathLength +PASS Unscopable handled correctly for pathLength property on SVGGeometryElement +FAIL SVGGeometryElement interface: operation isPointInFill(DOMPointInit) assert_equals: property has wrong .length expected 0 but got 1 +PASS Unscopable handled correctly for isPointInFill(DOMPointInit) on SVGGeometryElement +FAIL SVGGeometryElement interface: operation isPointInStroke(DOMPointInit) assert_equals: property has wrong .length expected 0 but got 1 +PASS Unscopable handled correctly for isPointInStroke(DOMPointInit) on SVGGeometryElement +PASS SVGGeometryElement interface: operation getTotalLength() +PASS Unscopable handled correctly for getTotalLength() on SVGGeometryElement +PASS SVGGeometryElement interface: operation getPointAtLength(float) +PASS Unscopable handled correctly for getPointAtLength(float) on SVGGeometryElement +PASS SVGNumber interface: existence and properties of interface object +PASS SVGNumber interface object length +PASS SVGNumber interface object name +PASS SVGNumber interface: existence and properties of interface prototype object +PASS SVGNumber interface: existence and properties of interface prototype object's "constructor" property +PASS SVGNumber interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGNumber interface: attribute value +PASS Unscopable handled correctly for value property on SVGNumber +PASS SVGNumber must be primary interface of objects.svg.createSVGNumber() +PASS Stringification of objects.svg.createSVGNumber() +PASS SVGNumber interface: objects.svg.createSVGNumber() must inherit property "value" with the proper type +PASS SVGLength interface: existence and properties of interface object +PASS SVGLength interface object length +PASS SVGLength interface object name +PASS SVGLength interface: existence and properties of interface prototype object +PASS SVGLength interface: existence and properties of interface prototype object's "constructor" property +PASS SVGLength interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGLength interface: constant SVG_LENGTHTYPE_UNKNOWN on interface object +PASS SVGLength interface: constant SVG_LENGTHTYPE_UNKNOWN on interface prototype object +PASS SVGLength interface: constant SVG_LENGTHTYPE_NUMBER on interface object +PASS SVGLength interface: constant SVG_LENGTHTYPE_NUMBER on interface prototype object +PASS SVGLength interface: constant SVG_LENGTHTYPE_PERCENTAGE on interface object +PASS SVGLength interface: constant SVG_LENGTHTYPE_PERCENTAGE on interface prototype object +PASS SVGLength interface: constant SVG_LENGTHTYPE_EMS on interface object +PASS SVGLength interface: constant SVG_LENGTHTYPE_EMS on interface prototype object +PASS SVGLength interface: constant SVG_LENGTHTYPE_EXS on interface object +PASS SVGLength interface: constant SVG_LENGTHTYPE_EXS on interface prototype object +PASS SVGLength interface: constant SVG_LENGTHTYPE_PX on interface object +PASS SVGLength interface: constant SVG_LENGTHTYPE_PX on interface prototype object +PASS SVGLength interface: constant SVG_LENGTHTYPE_CM on interface object +PASS SVGLength interface: constant SVG_LENGTHTYPE_CM on interface prototype object +PASS SVGLength interface: constant SVG_LENGTHTYPE_MM on interface object +PASS SVGLength interface: constant SVG_LENGTHTYPE_MM on interface prototype object +PASS SVGLength interface: constant SVG_LENGTHTYPE_IN on interface object +PASS SVGLength interface: constant SVG_LENGTHTYPE_IN on interface prototype object +PASS SVGLength interface: constant SVG_LENGTHTYPE_PT on interface object +PASS SVGLength interface: constant SVG_LENGTHTYPE_PT on interface prototype object +PASS SVGLength interface: constant SVG_LENGTHTYPE_PC on interface object +PASS SVGLength interface: constant SVG_LENGTHTYPE_PC on interface prototype object +PASS SVGLength interface: attribute unitType +PASS Unscopable handled correctly for unitType property on SVGLength +PASS SVGLength interface: attribute value +PASS Unscopable handled correctly for value property on SVGLength +PASS SVGLength interface: attribute valueInSpecifiedUnits +PASS Unscopable handled correctly for valueInSpecifiedUnits property on SVGLength +PASS SVGLength interface: attribute valueAsString +PASS Unscopable handled correctly for valueAsString property on SVGLength +PASS SVGLength interface: operation newValueSpecifiedUnits(unsigned short, float) +PASS Unscopable handled correctly for newValueSpecifiedUnits(unsigned short, float) on SVGLength +PASS SVGLength interface: operation convertToSpecifiedUnits(unsigned short) +PASS Unscopable handled correctly for convertToSpecifiedUnits(unsigned short) on SVGLength +PASS SVGLength must be primary interface of objects.svg.createSVGLength() +PASS Stringification of objects.svg.createSVGLength() +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_UNKNOWN" with the proper type +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_NUMBER" with the proper type +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PERCENTAGE" with the proper type +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_EMS" with the proper type +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_EXS" with the proper type +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PX" with the proper type +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_CM" with the proper type +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_MM" with the proper type +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_IN" with the proper type +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PT" with the proper type +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PC" with the proper type +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "unitType" with the proper type +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "value" with the proper type +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "valueInSpecifiedUnits" with the proper type +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "valueAsString" with the proper type +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "newValueSpecifiedUnits(unsigned short, float)" with the proper type +PASS SVGLength interface: calling newValueSpecifiedUnits(unsigned short, float) on objects.svg.createSVGLength() with too few arguments must throw TypeError +PASS SVGLength interface: objects.svg.createSVGLength() must inherit property "convertToSpecifiedUnits(unsigned short)" with the proper type +PASS SVGLength interface: calling convertToSpecifiedUnits(unsigned short) on objects.svg.createSVGLength() with too few arguments must throw TypeError +PASS SVGAngle interface: existence and properties of interface object +PASS SVGAngle interface object length +PASS SVGAngle interface object name +PASS SVGAngle interface: existence and properties of interface prototype object +PASS SVGAngle interface: existence and properties of interface prototype object's "constructor" property +PASS SVGAngle interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGAngle interface: constant SVG_ANGLETYPE_UNKNOWN on interface object +PASS SVGAngle interface: constant SVG_ANGLETYPE_UNKNOWN on interface prototype object +PASS SVGAngle interface: constant SVG_ANGLETYPE_UNSPECIFIED on interface object +PASS SVGAngle interface: constant SVG_ANGLETYPE_UNSPECIFIED on interface prototype object +PASS SVGAngle interface: constant SVG_ANGLETYPE_DEG on interface object +PASS SVGAngle interface: constant SVG_ANGLETYPE_DEG on interface prototype object +PASS SVGAngle interface: constant SVG_ANGLETYPE_RAD on interface object +PASS SVGAngle interface: constant SVG_ANGLETYPE_RAD on interface prototype object +PASS SVGAngle interface: constant SVG_ANGLETYPE_GRAD on interface object +PASS SVGAngle interface: constant SVG_ANGLETYPE_GRAD on interface prototype object +PASS SVGAngle interface: attribute unitType +PASS Unscopable handled correctly for unitType property on SVGAngle +PASS SVGAngle interface: attribute value +PASS Unscopable handled correctly for value property on SVGAngle +PASS SVGAngle interface: attribute valueInSpecifiedUnits +PASS Unscopable handled correctly for valueInSpecifiedUnits property on SVGAngle +PASS SVGAngle interface: attribute valueAsString +PASS Unscopable handled correctly for valueAsString property on SVGAngle +PASS SVGAngle interface: operation newValueSpecifiedUnits(unsigned short, float) +PASS Unscopable handled correctly for newValueSpecifiedUnits(unsigned short, float) on SVGAngle +PASS SVGAngle interface: operation convertToSpecifiedUnits(unsigned short) +PASS Unscopable handled correctly for convertToSpecifiedUnits(unsigned short) on SVGAngle +PASS SVGAngle must be primary interface of objects.svg.createSVGAngle() +PASS Stringification of objects.svg.createSVGAngle() +PASS SVGAngle interface: objects.svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_UNKNOWN" with the proper type +PASS SVGAngle interface: objects.svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_UNSPECIFIED" with the proper type +PASS SVGAngle interface: objects.svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_DEG" with the proper type +PASS SVGAngle interface: objects.svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_RAD" with the proper type +PASS SVGAngle interface: objects.svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_GRAD" with the proper type +PASS SVGAngle interface: objects.svg.createSVGAngle() must inherit property "unitType" with the proper type +PASS SVGAngle interface: objects.svg.createSVGAngle() must inherit property "value" with the proper type +PASS SVGAngle interface: objects.svg.createSVGAngle() must inherit property "valueInSpecifiedUnits" with the proper type +PASS SVGAngle interface: objects.svg.createSVGAngle() must inherit property "valueAsString" with the proper type +PASS SVGAngle interface: objects.svg.createSVGAngle() must inherit property "newValueSpecifiedUnits(unsigned short, float)" with the proper type +PASS SVGAngle interface: calling newValueSpecifiedUnits(unsigned short, float) on objects.svg.createSVGAngle() with too few arguments must throw TypeError +PASS SVGAngle interface: objects.svg.createSVGAngle() must inherit property "convertToSpecifiedUnits(unsigned short)" with the proper type +PASS SVGAngle interface: calling convertToSpecifiedUnits(unsigned short) on objects.svg.createSVGAngle() with too few arguments must throw TypeError +PASS SVGNumberList interface: existence and properties of interface object +PASS SVGNumberList interface object length +PASS SVGNumberList interface object name +PASS SVGNumberList interface: existence and properties of interface prototype object +PASS SVGNumberList interface: existence and properties of interface prototype object's "constructor" property +PASS SVGNumberList interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGNumberList interface: attribute length +PASS Unscopable handled correctly for length property on SVGNumberList +PASS SVGNumberList interface: attribute numberOfItems +PASS Unscopable handled correctly for numberOfItems property on SVGNumberList +PASS SVGNumberList interface: operation clear() +PASS Unscopable handled correctly for clear() on SVGNumberList +PASS SVGNumberList interface: operation initialize(SVGNumber) +PASS Unscopable handled correctly for initialize(SVGNumber) on SVGNumberList +PASS SVGNumberList interface: operation getItem(unsigned long) +PASS Unscopable handled correctly for getItem(unsigned long) on SVGNumberList +PASS SVGNumberList interface: operation insertItemBefore(SVGNumber, unsigned long) +PASS Unscopable handled correctly for insertItemBefore(SVGNumber, unsigned long) on SVGNumberList +PASS SVGNumberList interface: operation replaceItem(SVGNumber, unsigned long) +PASS Unscopable handled correctly for replaceItem(SVGNumber, unsigned long) on SVGNumberList +PASS SVGNumberList interface: operation removeItem(unsigned long) +PASS Unscopable handled correctly for removeItem(unsigned long) on SVGNumberList +PASS SVGNumberList interface: operation appendItem(SVGNumber) +PASS Unscopable handled correctly for appendItem(SVGNumber) on SVGNumberList +PASS SVGNumberList must be primary interface of objects.text.rotate.baseVal +PASS Stringification of objects.text.rotate.baseVal +PASS SVGNumberList interface: objects.text.rotate.baseVal must inherit property "length" with the proper type +PASS SVGNumberList interface: objects.text.rotate.baseVal must inherit property "numberOfItems" with the proper type +PASS SVGNumberList interface: objects.text.rotate.baseVal must inherit property "clear()" with the proper type +PASS SVGNumberList interface: objects.text.rotate.baseVal must inherit property "initialize(SVGNumber)" with the proper type +PASS SVGNumberList interface: calling initialize(SVGNumber) on objects.text.rotate.baseVal with too few arguments must throw TypeError +PASS SVGNumberList interface: objects.text.rotate.baseVal must inherit property "getItem(unsigned long)" with the proper type +PASS SVGNumberList interface: calling getItem(unsigned long) on objects.text.rotate.baseVal with too few arguments must throw TypeError +PASS SVGNumberList interface: objects.text.rotate.baseVal must inherit property "insertItemBefore(SVGNumber, unsigned long)" with the proper type +PASS SVGNumberList interface: calling insertItemBefore(SVGNumber, unsigned long) on objects.text.rotate.baseVal with too few arguments must throw TypeError +PASS SVGNumberList interface: objects.text.rotate.baseVal must inherit property "replaceItem(SVGNumber, unsigned long)" with the proper type +PASS SVGNumberList interface: calling replaceItem(SVGNumber, unsigned long) on objects.text.rotate.baseVal with too few arguments must throw TypeError +PASS SVGNumberList interface: objects.text.rotate.baseVal must inherit property "removeItem(unsigned long)" with the proper type +PASS SVGNumberList interface: calling removeItem(unsigned long) on objects.text.rotate.baseVal with too few arguments must throw TypeError +PASS SVGNumberList interface: objects.text.rotate.baseVal must inherit property "appendItem(SVGNumber)" with the proper type +PASS SVGNumberList interface: calling appendItem(SVGNumber) on objects.text.rotate.baseVal with too few arguments must throw TypeError +PASS SVGLengthList interface: existence and properties of interface object +PASS SVGLengthList interface object length +PASS SVGLengthList interface object name +PASS SVGLengthList interface: existence and properties of interface prototype object +PASS SVGLengthList interface: existence and properties of interface prototype object's "constructor" property +PASS SVGLengthList interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGLengthList interface: attribute length +PASS Unscopable handled correctly for length property on SVGLengthList +PASS SVGLengthList interface: attribute numberOfItems +PASS Unscopable handled correctly for numberOfItems property on SVGLengthList +PASS SVGLengthList interface: operation clear() +PASS Unscopable handled correctly for clear() on SVGLengthList +PASS SVGLengthList interface: operation initialize(SVGLength) +PASS Unscopable handled correctly for initialize(SVGLength) on SVGLengthList +PASS SVGLengthList interface: operation getItem(unsigned long) +PASS Unscopable handled correctly for getItem(unsigned long) on SVGLengthList +PASS SVGLengthList interface: operation insertItemBefore(SVGLength, unsigned long) +PASS Unscopable handled correctly for insertItemBefore(SVGLength, unsigned long) on SVGLengthList +PASS SVGLengthList interface: operation replaceItem(SVGLength, unsigned long) +PASS Unscopable handled correctly for replaceItem(SVGLength, unsigned long) on SVGLengthList +PASS SVGLengthList interface: operation removeItem(unsigned long) +PASS Unscopable handled correctly for removeItem(unsigned long) on SVGLengthList +PASS SVGLengthList interface: operation appendItem(SVGLength) +PASS Unscopable handled correctly for appendItem(SVGLength) on SVGLengthList +PASS SVGAnimatedBoolean interface: existence and properties of interface object +PASS SVGAnimatedBoolean interface object length +PASS SVGAnimatedBoolean interface object name +PASS SVGAnimatedBoolean interface: existence and properties of interface prototype object +PASS SVGAnimatedBoolean interface: existence and properties of interface prototype object's "constructor" property +PASS SVGAnimatedBoolean interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGAnimatedBoolean interface: attribute baseVal +PASS Unscopable handled correctly for baseVal property on SVGAnimatedBoolean +PASS SVGAnimatedBoolean interface: attribute animVal +PASS Unscopable handled correctly for animVal property on SVGAnimatedBoolean +PASS SVGAnimatedBoolean must be primary interface of objects.feConvolveMatrix.preserveAlpha +PASS Stringification of objects.feConvolveMatrix.preserveAlpha +PASS SVGAnimatedBoolean interface: objects.feConvolveMatrix.preserveAlpha must inherit property "baseVal" with the proper type +PASS SVGAnimatedBoolean interface: objects.feConvolveMatrix.preserveAlpha must inherit property "animVal" with the proper type +PASS SVGAnimatedEnumeration interface: existence and properties of interface object +PASS SVGAnimatedEnumeration interface object length +PASS SVGAnimatedEnumeration interface object name +PASS SVGAnimatedEnumeration interface: existence and properties of interface prototype object +PASS SVGAnimatedEnumeration interface: existence and properties of interface prototype object's "constructor" property +PASS SVGAnimatedEnumeration interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGAnimatedEnumeration interface: attribute baseVal +PASS Unscopable handled correctly for baseVal property on SVGAnimatedEnumeration +PASS SVGAnimatedEnumeration interface: attribute animVal +PASS Unscopable handled correctly for animVal property on SVGAnimatedEnumeration +PASS SVGAnimatedEnumeration must be primary interface of objects.text.lengthAdjust +PASS Stringification of objects.text.lengthAdjust +PASS SVGAnimatedEnumeration interface: objects.text.lengthAdjust must inherit property "baseVal" with the proper type +PASS SVGAnimatedEnumeration interface: objects.text.lengthAdjust must inherit property "animVal" with the proper type +PASS SVGAnimatedInteger interface: existence and properties of interface object +PASS SVGAnimatedInteger interface object length +PASS SVGAnimatedInteger interface object name +PASS SVGAnimatedInteger interface: existence and properties of interface prototype object +PASS SVGAnimatedInteger interface: existence and properties of interface prototype object's "constructor" property +PASS SVGAnimatedInteger interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGAnimatedInteger interface: attribute baseVal +PASS Unscopable handled correctly for baseVal property on SVGAnimatedInteger +PASS SVGAnimatedInteger interface: attribute animVal +PASS Unscopable handled correctly for animVal property on SVGAnimatedInteger +PASS SVGAnimatedInteger must be primary interface of objects.feConvolveMatrix.orderX +PASS Stringification of objects.feConvolveMatrix.orderX +PASS SVGAnimatedInteger interface: objects.feConvolveMatrix.orderX must inherit property "baseVal" with the proper type +PASS SVGAnimatedInteger interface: objects.feConvolveMatrix.orderX must inherit property "animVal" with the proper type +PASS SVGAnimatedNumber interface: existence and properties of interface object +PASS SVGAnimatedNumber interface object length +PASS SVGAnimatedNumber interface object name +PASS SVGAnimatedNumber interface: existence and properties of interface prototype object +PASS SVGAnimatedNumber interface: existence and properties of interface prototype object's "constructor" property +PASS SVGAnimatedNumber interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGAnimatedNumber interface: attribute baseVal +PASS Unscopable handled correctly for baseVal property on SVGAnimatedNumber +PASS SVGAnimatedNumber interface: attribute animVal +PASS Unscopable handled correctly for animVal property on SVGAnimatedNumber +PASS SVGAnimatedNumber must be primary interface of objects.stop.offset +PASS Stringification of objects.stop.offset +PASS SVGAnimatedNumber interface: objects.stop.offset must inherit property "baseVal" with the proper type +PASS SVGAnimatedNumber interface: objects.stop.offset must inherit property "animVal" with the proper type +PASS SVGAnimatedLength interface: existence and properties of interface object +PASS SVGAnimatedLength interface object length +PASS SVGAnimatedLength interface object name +PASS SVGAnimatedLength interface: existence and properties of interface prototype object +PASS SVGAnimatedLength interface: existence and properties of interface prototype object's "constructor" property +PASS SVGAnimatedLength interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGAnimatedLength interface: attribute baseVal +PASS Unscopable handled correctly for baseVal property on SVGAnimatedLength +PASS SVGAnimatedLength interface: attribute animVal +PASS Unscopable handled correctly for animVal property on SVGAnimatedLength +PASS SVGAnimatedLength must be primary interface of objects.svg.x +PASS Stringification of objects.svg.x +PASS SVGAnimatedLength interface: objects.svg.x must inherit property "baseVal" with the proper type +PASS SVGAnimatedLength interface: objects.svg.x must inherit property "animVal" with the proper type +PASS SVGAnimatedAngle interface: existence and properties of interface object +PASS SVGAnimatedAngle interface object length +PASS SVGAnimatedAngle interface object name +PASS SVGAnimatedAngle interface: existence and properties of interface prototype object +PASS SVGAnimatedAngle interface: existence and properties of interface prototype object's "constructor" property +PASS SVGAnimatedAngle interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGAnimatedAngle interface: attribute baseVal +PASS Unscopable handled correctly for baseVal property on SVGAnimatedAngle +PASS SVGAnimatedAngle interface: attribute animVal +PASS Unscopable handled correctly for animVal property on SVGAnimatedAngle +PASS SVGAnimatedAngle must be primary interface of objects.marker.orientAngle +PASS Stringification of objects.marker.orientAngle +PASS SVGAnimatedAngle interface: objects.marker.orientAngle must inherit property "baseVal" with the proper type +PASS SVGAnimatedAngle interface: objects.marker.orientAngle must inherit property "animVal" with the proper type +PASS SVGAnimatedString interface: existence and properties of interface object +PASS SVGAnimatedString interface object length +PASS SVGAnimatedString interface object name +PASS SVGAnimatedString interface: existence and properties of interface prototype object +PASS SVGAnimatedString interface: existence and properties of interface prototype object's "constructor" property +PASS SVGAnimatedString interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGAnimatedString interface: attribute baseVal +PASS Unscopable handled correctly for baseVal property on SVGAnimatedString +PASS SVGAnimatedString interface: attribute animVal +PASS Unscopable handled correctly for animVal property on SVGAnimatedString +PASS SVGAnimatedString must be primary interface of objects.a.target +PASS Stringification of objects.a.target +PASS SVGAnimatedString interface: objects.a.target must inherit property "baseVal" with the proper type +PASS SVGAnimatedString interface: objects.a.target must inherit property "animVal" with the proper type +PASS SVGAnimatedRect interface: existence and properties of interface object +PASS SVGAnimatedRect interface object length +PASS SVGAnimatedRect interface object name +PASS SVGAnimatedRect interface: existence and properties of interface prototype object +PASS SVGAnimatedRect interface: existence and properties of interface prototype object's "constructor" property +PASS SVGAnimatedRect interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGAnimatedRect interface: attribute baseVal +PASS Unscopable handled correctly for baseVal property on SVGAnimatedRect +PASS SVGAnimatedRect interface: attribute animVal +PASS Unscopable handled correctly for animVal property on SVGAnimatedRect +PASS SVGAnimatedRect must be primary interface of objects.svg.viewBox +PASS Stringification of objects.svg.viewBox +FAIL SVGAnimatedRect interface: objects.svg.viewBox must inherit property "baseVal" with the proper type Unrecognized type DOMRect +FAIL SVGAnimatedRect interface: objects.svg.viewBox must inherit property "animVal" with the proper type Unrecognized type DOMRectReadOnly +PASS SVGAnimatedNumberList interface: existence and properties of interface object +PASS SVGAnimatedNumberList interface object length +PASS SVGAnimatedNumberList interface object name +PASS SVGAnimatedNumberList interface: existence and properties of interface prototype object +PASS SVGAnimatedNumberList interface: existence and properties of interface prototype object's "constructor" property +PASS SVGAnimatedNumberList interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGAnimatedNumberList interface: attribute baseVal +PASS Unscopable handled correctly for baseVal property on SVGAnimatedNumberList +PASS SVGAnimatedNumberList interface: attribute animVal +PASS Unscopable handled correctly for animVal property on SVGAnimatedNumberList +PASS SVGAnimatedNumberList must be primary interface of objects.text.rotate +PASS Stringification of objects.text.rotate +PASS SVGAnimatedNumberList interface: objects.text.rotate must inherit property "baseVal" with the proper type +PASS SVGAnimatedNumberList interface: objects.text.rotate must inherit property "animVal" with the proper type +PASS SVGAnimatedLengthList interface: existence and properties of interface object +PASS SVGAnimatedLengthList interface object length +PASS SVGAnimatedLengthList interface object name +PASS SVGAnimatedLengthList interface: existence and properties of interface prototype object +PASS SVGAnimatedLengthList interface: existence and properties of interface prototype object's "constructor" property +PASS SVGAnimatedLengthList interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGAnimatedLengthList interface: attribute baseVal +PASS Unscopable handled correctly for baseVal property on SVGAnimatedLengthList +PASS SVGAnimatedLengthList interface: attribute animVal +PASS Unscopable handled correctly for animVal property on SVGAnimatedLengthList +PASS SVGAnimatedLengthList must be primary interface of objects.text.x +PASS Stringification of objects.text.x +PASS SVGAnimatedLengthList interface: objects.text.x must inherit property "baseVal" with the proper type +PASS SVGAnimatedLengthList interface: objects.text.x must inherit property "animVal" with the proper type +PASS SVGStringList interface: existence and properties of interface object +PASS SVGStringList interface object length +PASS SVGStringList interface object name +PASS SVGStringList interface: existence and properties of interface prototype object +PASS SVGStringList interface: existence and properties of interface prototype object's "constructor" property +PASS SVGStringList interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGStringList interface: attribute length +PASS Unscopable handled correctly for length property on SVGStringList +PASS SVGStringList interface: attribute numberOfItems +PASS Unscopable handled correctly for numberOfItems property on SVGStringList +PASS SVGStringList interface: operation clear() +PASS Unscopable handled correctly for clear() on SVGStringList +PASS SVGStringList interface: operation initialize(DOMString) +PASS Unscopable handled correctly for initialize(DOMString) on SVGStringList +PASS SVGStringList interface: operation getItem(unsigned long) +PASS Unscopable handled correctly for getItem(unsigned long) on SVGStringList +PASS SVGStringList interface: operation insertItemBefore(DOMString, unsigned long) +PASS Unscopable handled correctly for insertItemBefore(DOMString, unsigned long) on SVGStringList +PASS SVGStringList interface: operation replaceItem(DOMString, unsigned long) +PASS Unscopable handled correctly for replaceItem(DOMString, unsigned long) on SVGStringList +PASS SVGStringList interface: operation removeItem(unsigned long) +PASS Unscopable handled correctly for removeItem(unsigned long) on SVGStringList +PASS SVGStringList interface: operation appendItem(DOMString) +PASS Unscopable handled correctly for appendItem(DOMString) on SVGStringList +PASS SVGStringList must be primary interface of objects.a.requiredExtensions +PASS Stringification of objects.a.requiredExtensions +PASS SVGStringList interface: objects.a.requiredExtensions must inherit property "length" with the proper type +PASS SVGStringList interface: objects.a.requiredExtensions must inherit property "numberOfItems" with the proper type +PASS SVGStringList interface: objects.a.requiredExtensions must inherit property "clear()" with the proper type +PASS SVGStringList interface: objects.a.requiredExtensions must inherit property "initialize(DOMString)" with the proper type +PASS SVGStringList interface: calling initialize(DOMString) on objects.a.requiredExtensions with too few arguments must throw TypeError +PASS SVGStringList interface: objects.a.requiredExtensions must inherit property "getItem(unsigned long)" with the proper type +PASS SVGStringList interface: calling getItem(unsigned long) on objects.a.requiredExtensions with too few arguments must throw TypeError +PASS SVGStringList interface: objects.a.requiredExtensions must inherit property "insertItemBefore(DOMString, unsigned long)" with the proper type +PASS SVGStringList interface: calling insertItemBefore(DOMString, unsigned long) on objects.a.requiredExtensions with too few arguments must throw TypeError +PASS SVGStringList interface: objects.a.requiredExtensions must inherit property "replaceItem(DOMString, unsigned long)" with the proper type +PASS SVGStringList interface: calling replaceItem(DOMString, unsigned long) on objects.a.requiredExtensions with too few arguments must throw TypeError +PASS SVGStringList interface: objects.a.requiredExtensions must inherit property "removeItem(unsigned long)" with the proper type +PASS SVGStringList interface: calling removeItem(unsigned long) on objects.a.requiredExtensions with too few arguments must throw TypeError +PASS SVGStringList interface: objects.a.requiredExtensions must inherit property "appendItem(DOMString)" with the proper type +PASS SVGStringList interface: calling appendItem(DOMString) on objects.a.requiredExtensions with too few arguments must throw TypeError +PASS SVGUnitTypes interface: existence and properties of interface object +PASS SVGUnitTypes interface object length +PASS SVGUnitTypes interface object name +PASS SVGUnitTypes interface: existence and properties of interface prototype object +PASS SVGUnitTypes interface: existence and properties of interface prototype object's "constructor" property +PASS SVGUnitTypes interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGUnitTypes interface: constant SVG_UNIT_TYPE_UNKNOWN on interface object +PASS SVGUnitTypes interface: constant SVG_UNIT_TYPE_UNKNOWN on interface prototype object +PASS SVGUnitTypes interface: constant SVG_UNIT_TYPE_USERSPACEONUSE on interface object +PASS SVGUnitTypes interface: constant SVG_UNIT_TYPE_USERSPACEONUSE on interface prototype object +PASS SVGUnitTypes interface: constant SVG_UNIT_TYPE_OBJECTBOUNDINGBOX on interface object +PASS SVGUnitTypes interface: constant SVG_UNIT_TYPE_OBJECTBOUNDINGBOX on interface prototype object +PASS SVGSVGElement interface: existence and properties of interface object +PASS SVGSVGElement interface object length +PASS SVGSVGElement interface object name +PASS SVGSVGElement interface: existence and properties of interface prototype object +PASS SVGSVGElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGSVGElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGSVGElement interface: attribute x +PASS Unscopable handled correctly for x property on SVGSVGElement +PASS SVGSVGElement interface: attribute y +PASS Unscopable handled correctly for y property on SVGSVGElement +PASS SVGSVGElement interface: attribute width +PASS Unscopable handled correctly for width property on SVGSVGElement +PASS SVGSVGElement interface: attribute height +PASS Unscopable handled correctly for height property on SVGSVGElement +PASS SVGSVGElement interface: attribute currentScale +PASS Unscopable handled correctly for currentScale property on SVGSVGElement +PASS SVGSVGElement interface: attribute currentTranslate +PASS Unscopable handled correctly for currentTranslate property on SVGSVGElement +PASS SVGSVGElement interface: operation getIntersectionList(DOMRectReadOnly, SVGElement) +PASS Unscopable handled correctly for getIntersectionList(DOMRectReadOnly, SVGElement) on SVGSVGElement +PASS SVGSVGElement interface: operation getEnclosureList(DOMRectReadOnly, SVGElement) +PASS Unscopable handled correctly for getEnclosureList(DOMRectReadOnly, SVGElement) on SVGSVGElement +PASS SVGSVGElement interface: operation checkIntersection(SVGElement, DOMRectReadOnly) +PASS Unscopable handled correctly for checkIntersection(SVGElement, DOMRectReadOnly) on SVGSVGElement +PASS SVGSVGElement interface: operation checkEnclosure(SVGElement, DOMRectReadOnly) +PASS Unscopable handled correctly for checkEnclosure(SVGElement, DOMRectReadOnly) on SVGSVGElement +PASS SVGSVGElement interface: operation deselectAll() +PASS Unscopable handled correctly for deselectAll() on SVGSVGElement +PASS SVGSVGElement interface: operation createSVGNumber() +PASS Unscopable handled correctly for createSVGNumber() on SVGSVGElement +PASS SVGSVGElement interface: operation createSVGLength() +PASS Unscopable handled correctly for createSVGLength() on SVGSVGElement +PASS SVGSVGElement interface: operation createSVGAngle() +PASS Unscopable handled correctly for createSVGAngle() on SVGSVGElement +PASS SVGSVGElement interface: operation createSVGPoint() +PASS Unscopable handled correctly for createSVGPoint() on SVGSVGElement +PASS SVGSVGElement interface: operation createSVGMatrix() +PASS Unscopable handled correctly for createSVGMatrix() on SVGSVGElement +PASS SVGSVGElement interface: operation createSVGRect() +PASS Unscopable handled correctly for createSVGRect() on SVGSVGElement +PASS SVGSVGElement interface: operation createSVGTransform() +PASS Unscopable handled correctly for createSVGTransform() on SVGSVGElement +PASS SVGSVGElement interface: operation createSVGTransformFromMatrix(DOMMatrixReadOnly) +PASS Unscopable handled correctly for createSVGTransformFromMatrix(DOMMatrixReadOnly) on SVGSVGElement +PASS SVGSVGElement interface: operation getElementById(DOMString) +PASS Unscopable handled correctly for getElementById(DOMString) on SVGSVGElement +PASS SVGSVGElement interface: operation suspendRedraw(unsigned long) +PASS Unscopable handled correctly for suspendRedraw(unsigned long) on SVGSVGElement +PASS SVGSVGElement interface: operation unsuspendRedraw(unsigned long) +PASS Unscopable handled correctly for unsuspendRedraw(unsigned long) on SVGSVGElement +PASS SVGSVGElement interface: operation unsuspendRedrawAll() +PASS Unscopable handled correctly for unsuspendRedrawAll() on SVGSVGElement +PASS SVGSVGElement interface: operation forceRedraw() +PASS Unscopable handled correctly for forceRedraw() on SVGSVGElement +PASS SVGSVGElement interface: attribute viewBox +PASS Unscopable handled correctly for viewBox property on SVGSVGElement +PASS SVGSVGElement interface: attribute preserveAspectRatio +PASS Unscopable handled correctly for preserveAspectRatio property on SVGSVGElement +PASS SVGSVGElement interface: constant SVG_ZOOMANDPAN_UNKNOWN on interface object +PASS SVGSVGElement interface: constant SVG_ZOOMANDPAN_UNKNOWN on interface prototype object +PASS SVGSVGElement interface: constant SVG_ZOOMANDPAN_DISABLE on interface object +PASS SVGSVGElement interface: constant SVG_ZOOMANDPAN_DISABLE on interface prototype object +PASS SVGSVGElement interface: constant SVG_ZOOMANDPAN_MAGNIFY on interface object +PASS SVGSVGElement interface: constant SVG_ZOOMANDPAN_MAGNIFY on interface prototype object +PASS SVGSVGElement interface: attribute zoomAndPan +PASS Unscopable handled correctly for zoomAndPan property on SVGSVGElement +PASS SVGSVGElement must be primary interface of objects.svg +PASS Stringification of objects.svg +PASS SVGSVGElement interface: objects.svg must inherit property "x" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "y" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "width" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "height" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "currentScale" with the proper type +FAIL SVGSVGElement interface: objects.svg must inherit property "currentTranslate" with the proper type Unrecognized type DOMPointReadOnly +PASS SVGSVGElement interface: objects.svg must inherit property "getIntersectionList(DOMRectReadOnly, SVGElement)" with the proper type +PASS SVGSVGElement interface: calling getIntersectionList(DOMRectReadOnly, SVGElement) on objects.svg with too few arguments must throw TypeError +PASS SVGSVGElement interface: objects.svg must inherit property "getEnclosureList(DOMRectReadOnly, SVGElement)" with the proper type +PASS SVGSVGElement interface: calling getEnclosureList(DOMRectReadOnly, SVGElement) on objects.svg with too few arguments must throw TypeError +PASS SVGSVGElement interface: objects.svg must inherit property "checkIntersection(SVGElement, DOMRectReadOnly)" with the proper type +PASS SVGSVGElement interface: calling checkIntersection(SVGElement, DOMRectReadOnly) on objects.svg with too few arguments must throw TypeError +PASS SVGSVGElement interface: objects.svg must inherit property "checkEnclosure(SVGElement, DOMRectReadOnly)" with the proper type +PASS SVGSVGElement interface: calling checkEnclosure(SVGElement, DOMRectReadOnly) on objects.svg with too few arguments must throw TypeError +PASS SVGSVGElement interface: objects.svg must inherit property "deselectAll()" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "createSVGNumber()" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "createSVGLength()" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "createSVGAngle()" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "createSVGPoint()" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "createSVGMatrix()" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "createSVGRect()" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "createSVGTransform()" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "createSVGTransformFromMatrix(DOMMatrixReadOnly)" with the proper type +PASS SVGSVGElement interface: calling createSVGTransformFromMatrix(DOMMatrixReadOnly) on objects.svg with too few arguments must throw TypeError +PASS SVGSVGElement interface: objects.svg must inherit property "getElementById(DOMString)" with the proper type +PASS SVGSVGElement interface: calling getElementById(DOMString) on objects.svg with too few arguments must throw TypeError +PASS SVGSVGElement interface: objects.svg must inherit property "suspendRedraw(unsigned long)" with the proper type +PASS SVGSVGElement interface: calling suspendRedraw(unsigned long) on objects.svg with too few arguments must throw TypeError +PASS SVGSVGElement interface: objects.svg must inherit property "unsuspendRedraw(unsigned long)" with the proper type +PASS SVGSVGElement interface: calling unsuspendRedraw(unsigned long) on objects.svg with too few arguments must throw TypeError +PASS SVGSVGElement interface: objects.svg must inherit property "unsuspendRedrawAll()" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "forceRedraw()" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "viewBox" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "preserveAspectRatio" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "SVG_ZOOMANDPAN_UNKNOWN" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "SVG_ZOOMANDPAN_DISABLE" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "SVG_ZOOMANDPAN_MAGNIFY" with the proper type +PASS SVGSVGElement interface: objects.svg must inherit property "zoomAndPan" with the proper type +PASS SVGGraphicsElement interface: objects.svg must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.svg must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.svg with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.svg must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.svg must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.svg must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.svg must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.svg must inherit property "className" with the proper type +PASS SVGElement interface: objects.svg must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.svg must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.svg must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.svg must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGGElement interface: existence and properties of interface object +PASS SVGGElement interface object length +PASS SVGGElement interface object name +PASS SVGGElement interface: existence and properties of interface prototype object +PASS SVGGElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGGElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGGElement must be primary interface of objects.g +PASS Stringification of objects.g +PASS SVGGraphicsElement interface: objects.g must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.g must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.g with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.g must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.g must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.g must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.g must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.g must inherit property "className" with the proper type +PASS SVGElement interface: objects.g must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.g must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.g must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.g must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +FAIL SVGUnknownElement interface: existence and properties of interface object assert_own_property: self does not have own property "SVGUnknownElement" expected property "SVGUnknownElement" missing +FAIL SVGUnknownElement interface object length assert_own_property: self does not have own property "SVGUnknownElement" expected property "SVGUnknownElement" missing +FAIL SVGUnknownElement interface object name assert_own_property: self does not have own property "SVGUnknownElement" expected property "SVGUnknownElement" missing +FAIL SVGUnknownElement interface: existence and properties of interface prototype object assert_own_property: self does not have own property "SVGUnknownElement" expected property "SVGUnknownElement" missing +FAIL SVGUnknownElement interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "SVGUnknownElement" expected property "SVGUnknownElement" missing +FAIL SVGUnknownElement interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "SVGUnknownElement" expected property "SVGUnknownElement" missing +PASS SVGDefsElement interface: existence and properties of interface object +PASS SVGDefsElement interface object length +PASS SVGDefsElement interface object name +PASS SVGDefsElement interface: existence and properties of interface prototype object +PASS SVGDefsElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGDefsElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGDefsElement must be primary interface of objects.defs +PASS Stringification of objects.defs +PASS SVGGraphicsElement interface: objects.defs must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.defs must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.defs with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.defs must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.defs must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.defs must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.defs must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.defs must inherit property "className" with the proper type +PASS SVGElement interface: objects.defs must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.defs must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.defs must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.defs must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGDescElement interface: existence and properties of interface object +PASS SVGDescElement interface object length +PASS SVGDescElement interface object name +PASS SVGDescElement interface: existence and properties of interface prototype object +PASS SVGDescElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGDescElement interface: existence and properties of interface prototype object's @@unscopables property +FAIL SVGDescElement must be primary interface of objects.Desc assert_equals: objects.Desc's prototype is not SVGDescElement.prototype expected object "[object SVGDescElement]" but got object "[object SVGElement]" +FAIL Stringification of objects.Desc assert_equals: class string of objects.Desc expected "[object SVGDescElement]" but got "[object SVGElement]" +PASS SVGElement interface: objects.Desc must inherit property "className" with the proper type +PASS SVGElement interface: objects.Desc must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.Desc must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.Desc must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.Desc must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGMetadataElement interface: existence and properties of interface object +PASS SVGMetadataElement interface object length +PASS SVGMetadataElement interface object name +PASS SVGMetadataElement interface: existence and properties of interface prototype object +PASS SVGMetadataElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGMetadataElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGMetadataElement must be primary interface of objects.metadata +PASS Stringification of objects.metadata +PASS SVGElement interface: objects.metadata must inherit property "className" with the proper type +PASS SVGElement interface: objects.metadata must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.metadata must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.metadata must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.metadata must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGTitleElement interface: existence and properties of interface object +PASS SVGTitleElement interface object length +PASS SVGTitleElement interface object name +PASS SVGTitleElement interface: existence and properties of interface prototype object +PASS SVGTitleElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGTitleElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGTitleElement must be primary interface of objects.title +PASS Stringification of objects.title +PASS SVGElement interface: objects.title must inherit property "className" with the proper type +PASS SVGElement interface: objects.title must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.title must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.title must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.title must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +FAIL SVGSymbolElement interface: existence and properties of interface object assert_equals: prototype of SVGSymbolElement is not SVGGraphicsElement expected function "function SVGGraphicsElement() { [native code] }" but got function "function SVGElement() { [native code] }" +PASS SVGSymbolElement interface object length +PASS SVGSymbolElement interface object name +FAIL SVGSymbolElement interface: existence and properties of interface prototype object assert_equals: prototype of SVGSymbolElement.prototype is not SVGGraphicsElement.prototype expected object "[object SVGGraphicsElement]" but got object "[object SVGElement]" +PASS SVGSymbolElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGSymbolElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGSymbolElement interface: attribute viewBox +PASS Unscopable handled correctly for viewBox property on SVGSymbolElement +PASS SVGSymbolElement interface: attribute preserveAspectRatio +PASS Unscopable handled correctly for preserveAspectRatio property on SVGSymbolElement +PASS SVGSymbolElement must be primary interface of objects.symbol +PASS Stringification of objects.symbol +PASS SVGSymbolElement interface: objects.symbol must inherit property "viewBox" with the proper type +PASS SVGSymbolElement interface: objects.symbol must inherit property "preserveAspectRatio" with the proper type +FAIL SVGGraphicsElement interface: objects.symbol must inherit property "transform" with the proper type assert_inherits: property "transform" not found in prototype chain +FAIL SVGGraphicsElement interface: objects.symbol must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type assert_inherits: property "getBBox" not found in prototype chain +FAIL SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.symbol with too few arguments must throw TypeError assert_inherits: property "getBBox" not found in prototype chain +FAIL SVGGraphicsElement interface: objects.symbol must inherit property "getCTM()" with the proper type assert_inherits: property "getCTM" not found in prototype chain +FAIL SVGGraphicsElement interface: objects.symbol must inherit property "getScreenCTM()" with the proper type assert_inherits: property "getScreenCTM" not found in prototype chain +FAIL SVGGraphicsElement interface: objects.symbol must inherit property "requiredExtensions" with the proper type assert_inherits: property "requiredExtensions" not found in prototype chain +FAIL SVGGraphicsElement interface: objects.symbol must inherit property "systemLanguage" with the proper type assert_inherits: property "systemLanguage" not found in prototype chain +PASS SVGElement interface: objects.symbol must inherit property "className" with the proper type +PASS SVGElement interface: objects.symbol must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.symbol must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.symbol must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.symbol must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGUseElement interface: existence and properties of interface object +PASS SVGUseElement interface object length +PASS SVGUseElement interface object name +PASS SVGUseElement interface: existence and properties of interface prototype object +PASS SVGUseElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGUseElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGUseElement interface: attribute x +PASS Unscopable handled correctly for x property on SVGUseElement +PASS SVGUseElement interface: attribute y +PASS Unscopable handled correctly for y property on SVGUseElement +PASS SVGUseElement interface: attribute width +PASS Unscopable handled correctly for width property on SVGUseElement +PASS SVGUseElement interface: attribute height +PASS Unscopable handled correctly for height property on SVGUseElement +FAIL SVGUseElement interface: attribute instanceRoot assert_true: The prototype object must have a property "instanceRoot" expected true got false +PASS Unscopable handled correctly for instanceRoot property on SVGUseElement +FAIL SVGUseElement interface: attribute animatedInstanceRoot assert_true: The prototype object must have a property "animatedInstanceRoot" expected true got false +PASS Unscopable handled correctly for animatedInstanceRoot property on SVGUseElement +PASS SVGUseElement interface: attribute href +PASS Unscopable handled correctly for href property on SVGUseElement +PASS SVGUseElement must be primary interface of objects.use +PASS Stringification of objects.use +PASS SVGUseElement interface: objects.use must inherit property "x" with the proper type +PASS SVGUseElement interface: objects.use must inherit property "y" with the proper type +PASS SVGUseElement interface: objects.use must inherit property "width" with the proper type +PASS SVGUseElement interface: objects.use must inherit property "height" with the proper type +FAIL SVGUseElement interface: objects.use must inherit property "instanceRoot" with the proper type assert_inherits: property "instanceRoot" not found in prototype chain +FAIL SVGUseElement interface: objects.use must inherit property "animatedInstanceRoot" with the proper type assert_inherits: property "animatedInstanceRoot" not found in prototype chain +PASS SVGUseElement interface: objects.use must inherit property "href" with the proper type +PASS SVGGraphicsElement interface: objects.use must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.use must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.use with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.use must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.use must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.use must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.use must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.use must inherit property "className" with the proper type +PASS SVGElement interface: objects.use must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.use must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.use must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.use must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +FAIL SVGUseElementShadowRoot interface: existence and properties of interface object assert_own_property: self does not have own property "SVGUseElementShadowRoot" expected property "SVGUseElementShadowRoot" missing +FAIL SVGUseElementShadowRoot interface object length assert_own_property: self does not have own property "SVGUseElementShadowRoot" expected property "SVGUseElementShadowRoot" missing +FAIL SVGUseElementShadowRoot interface object name assert_own_property: self does not have own property "SVGUseElementShadowRoot" expected property "SVGUseElementShadowRoot" missing +FAIL SVGUseElementShadowRoot interface: existence and properties of interface prototype object assert_own_property: self does not have own property "SVGUseElementShadowRoot" expected property "SVGUseElementShadowRoot" missing +FAIL SVGUseElementShadowRoot interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "SVGUseElementShadowRoot" expected property "SVGUseElementShadowRoot" missing +FAIL SVGUseElementShadowRoot interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "SVGUseElementShadowRoot" expected property "SVGUseElementShadowRoot" missing +FAIL ShadowAnimation interface: existence and properties of interface object assert_own_property: self does not have own property "ShadowAnimation" expected property "ShadowAnimation" missing +FAIL ShadowAnimation interface object length assert_own_property: self does not have own property "ShadowAnimation" expected property "ShadowAnimation" missing +FAIL ShadowAnimation interface object name assert_own_property: self does not have own property "ShadowAnimation" expected property "ShadowAnimation" missing +FAIL ShadowAnimation interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ShadowAnimation" expected property "ShadowAnimation" missing +FAIL ShadowAnimation interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ShadowAnimation" expected property "ShadowAnimation" missing +FAIL ShadowAnimation interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "ShadowAnimation" expected property "ShadowAnimation" missing +FAIL ShadowAnimation interface: attribute sourceAnimation assert_own_property: self does not have own property "ShadowAnimation" expected property "ShadowAnimation" missing +PASS Unscopable handled correctly for sourceAnimation property on ShadowAnimation +PASS SVGSwitchElement interface: existence and properties of interface object +PASS SVGSwitchElement interface object length +PASS SVGSwitchElement interface object name +PASS SVGSwitchElement interface: existence and properties of interface prototype object +PASS SVGSwitchElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGSwitchElement interface: existence and properties of interface prototype object's @@unscopables property +FAIL SVGSwitchElement must be primary interface of objects.Switch assert_equals: objects.Switch's prototype is not SVGSwitchElement.prototype expected object "[object SVGSwitchElement]" but got object "[object SVGElement]" +FAIL Stringification of objects.Switch assert_equals: class string of objects.Switch expected "[object SVGSwitchElement]" but got "[object SVGElement]" +FAIL SVGGraphicsElement interface: objects.Switch must inherit property "transform" with the proper type assert_inherits: property "transform" not found in prototype chain +FAIL SVGGraphicsElement interface: objects.Switch must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type assert_inherits: property "getBBox" not found in prototype chain +FAIL SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.Switch with too few arguments must throw TypeError assert_inherits: property "getBBox" not found in prototype chain +FAIL SVGGraphicsElement interface: objects.Switch must inherit property "getCTM()" with the proper type assert_inherits: property "getCTM" not found in prototype chain +FAIL SVGGraphicsElement interface: objects.Switch must inherit property "getScreenCTM()" with the proper type assert_inherits: property "getScreenCTM" not found in prototype chain +FAIL SVGGraphicsElement interface: objects.Switch must inherit property "requiredExtensions" with the proper type assert_inherits: property "requiredExtensions" not found in prototype chain +FAIL SVGGraphicsElement interface: objects.Switch must inherit property "systemLanguage" with the proper type assert_inherits: property "systemLanguage" not found in prototype chain +PASS SVGElement interface: objects.Switch must inherit property "className" with the proper type +PASS SVGElement interface: objects.Switch must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.Switch must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.Switch must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.Switch must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGStyleElement interface: existence and properties of interface object +PASS SVGStyleElement interface object length +PASS SVGStyleElement interface object name +PASS SVGStyleElement interface: existence and properties of interface prototype object +PASS SVGStyleElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGStyleElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGStyleElement interface: attribute type +PASS Unscopable handled correctly for type property on SVGStyleElement +PASS SVGStyleElement interface: attribute media +PASS Unscopable handled correctly for media property on SVGStyleElement +PASS SVGStyleElement interface: attribute title +PASS Unscopable handled correctly for title property on SVGStyleElement +PASS SVGStyleElement must be primary interface of objects.style +PASS Stringification of objects.style +PASS SVGStyleElement interface: objects.style must inherit property "type" with the proper type +PASS SVGStyleElement interface: objects.style must inherit property "media" with the proper type +PASS SVGStyleElement interface: objects.style must inherit property "title" with the proper type +PASS SVGElement interface: objects.style must inherit property "className" with the proper type +PASS SVGElement interface: objects.style must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.style must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.style must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.style must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGTransform interface: existence and properties of interface object +PASS SVGTransform interface object length +PASS SVGTransform interface object name +PASS SVGTransform interface: existence and properties of interface prototype object +PASS SVGTransform interface: existence and properties of interface prototype object's "constructor" property +PASS SVGTransform interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGTransform interface: constant SVG_TRANSFORM_UNKNOWN on interface object +PASS SVGTransform interface: constant SVG_TRANSFORM_UNKNOWN on interface prototype object +PASS SVGTransform interface: constant SVG_TRANSFORM_MATRIX on interface object +PASS SVGTransform interface: constant SVG_TRANSFORM_MATRIX on interface prototype object +PASS SVGTransform interface: constant SVG_TRANSFORM_TRANSLATE on interface object +PASS SVGTransform interface: constant SVG_TRANSFORM_TRANSLATE on interface prototype object +PASS SVGTransform interface: constant SVG_TRANSFORM_SCALE on interface object +PASS SVGTransform interface: constant SVG_TRANSFORM_SCALE on interface prototype object +PASS SVGTransform interface: constant SVG_TRANSFORM_ROTATE on interface object +PASS SVGTransform interface: constant SVG_TRANSFORM_ROTATE on interface prototype object +PASS SVGTransform interface: constant SVG_TRANSFORM_SKEWX on interface object +PASS SVGTransform interface: constant SVG_TRANSFORM_SKEWX on interface prototype object +PASS SVGTransform interface: constant SVG_TRANSFORM_SKEWY on interface object +PASS SVGTransform interface: constant SVG_TRANSFORM_SKEWY on interface prototype object +PASS SVGTransform interface: attribute type +PASS Unscopable handled correctly for type property on SVGTransform +PASS SVGTransform interface: attribute matrix +PASS Unscopable handled correctly for matrix property on SVGTransform +PASS SVGTransform interface: attribute angle +PASS Unscopable handled correctly for angle property on SVGTransform +PASS SVGTransform interface: operation setMatrix(DOMMatrixReadOnly) +PASS Unscopable handled correctly for setMatrix(DOMMatrixReadOnly) on SVGTransform +PASS SVGTransform interface: operation setTranslate(float, float) +PASS Unscopable handled correctly for setTranslate(float, float) on SVGTransform +PASS SVGTransform interface: operation setScale(float, float) +PASS Unscopable handled correctly for setScale(float, float) on SVGTransform +PASS SVGTransform interface: operation setRotate(float, float, float) +PASS Unscopable handled correctly for setRotate(float, float, float) on SVGTransform +PASS SVGTransform interface: operation setSkewX(float) +PASS Unscopable handled correctly for setSkewX(float) on SVGTransform +PASS SVGTransform interface: operation setSkewY(float) +PASS Unscopable handled correctly for setSkewY(float) on SVGTransform +PASS SVGTransform must be primary interface of objects.svg.createSVGTransform() +PASS Stringification of objects.svg.createSVGTransform() +PASS SVGTransform interface: objects.svg.createSVGTransform() must inherit property "SVG_TRANSFORM_UNKNOWN" with the proper type +PASS SVGTransform interface: objects.svg.createSVGTransform() must inherit property "SVG_TRANSFORM_MATRIX" with the proper type +PASS SVGTransform interface: objects.svg.createSVGTransform() must inherit property "SVG_TRANSFORM_TRANSLATE" with the proper type +PASS SVGTransform interface: objects.svg.createSVGTransform() must inherit property "SVG_TRANSFORM_SCALE" with the proper type +PASS SVGTransform interface: objects.svg.createSVGTransform() must inherit property "SVG_TRANSFORM_ROTATE" with the proper type +PASS SVGTransform interface: objects.svg.createSVGTransform() must inherit property "SVG_TRANSFORM_SKEWX" with the proper type +PASS SVGTransform interface: objects.svg.createSVGTransform() must inherit property "SVG_TRANSFORM_SKEWY" with the proper type +PASS SVGTransform interface: objects.svg.createSVGTransform() must inherit property "type" with the proper type +FAIL SVGTransform interface: objects.svg.createSVGTransform() must inherit property "matrix" with the proper type Unrecognized type DOMMatrix +PASS SVGTransform interface: objects.svg.createSVGTransform() must inherit property "angle" with the proper type +PASS SVGTransform interface: objects.svg.createSVGTransform() must inherit property "setMatrix(DOMMatrixReadOnly)" with the proper type +PASS SVGTransform interface: calling setMatrix(DOMMatrixReadOnly) on objects.svg.createSVGTransform() with too few arguments must throw TypeError +PASS SVGTransform interface: objects.svg.createSVGTransform() must inherit property "setTranslate(float, float)" with the proper type +PASS SVGTransform interface: calling setTranslate(float, float) on objects.svg.createSVGTransform() with too few arguments must throw TypeError +PASS SVGTransform interface: objects.svg.createSVGTransform() must inherit property "setScale(float, float)" with the proper type +PASS SVGTransform interface: calling setScale(float, float) on objects.svg.createSVGTransform() with too few arguments must throw TypeError +PASS SVGTransform interface: objects.svg.createSVGTransform() must inherit property "setRotate(float, float, float)" with the proper type +PASS SVGTransform interface: calling setRotate(float, float, float) on objects.svg.createSVGTransform() with too few arguments must throw TypeError +PASS SVGTransform interface: objects.svg.createSVGTransform() must inherit property "setSkewX(float)" with the proper type +PASS SVGTransform interface: calling setSkewX(float) on objects.svg.createSVGTransform() with too few arguments must throw TypeError +PASS SVGTransform interface: objects.svg.createSVGTransform() must inherit property "setSkewY(float)" with the proper type +PASS SVGTransform interface: calling setSkewY(float) on objects.svg.createSVGTransform() with too few arguments must throw TypeError +PASS SVGTransformList interface: existence and properties of interface object +PASS SVGTransformList interface object length +PASS SVGTransformList interface object name +PASS SVGTransformList interface: existence and properties of interface prototype object +PASS SVGTransformList interface: existence and properties of interface prototype object's "constructor" property +PASS SVGTransformList interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGTransformList interface: attribute length +PASS Unscopable handled correctly for length property on SVGTransformList +PASS SVGTransformList interface: attribute numberOfItems +PASS Unscopable handled correctly for numberOfItems property on SVGTransformList +PASS SVGTransformList interface: operation clear() +PASS Unscopable handled correctly for clear() on SVGTransformList +PASS SVGTransformList interface: operation initialize(SVGTransform) +PASS Unscopable handled correctly for initialize(SVGTransform) on SVGTransformList +PASS SVGTransformList interface: operation getItem(unsigned long) +PASS Unscopable handled correctly for getItem(unsigned long) on SVGTransformList +PASS SVGTransformList interface: operation insertItemBefore(SVGTransform, unsigned long) +PASS Unscopable handled correctly for insertItemBefore(SVGTransform, unsigned long) on SVGTransformList +PASS SVGTransformList interface: operation replaceItem(SVGTransform, unsigned long) +PASS Unscopable handled correctly for replaceItem(SVGTransform, unsigned long) on SVGTransformList +PASS SVGTransformList interface: operation removeItem(unsigned long) +PASS Unscopable handled correctly for removeItem(unsigned long) on SVGTransformList +PASS SVGTransformList interface: operation appendItem(SVGTransform) +PASS Unscopable handled correctly for appendItem(SVGTransform) on SVGTransformList +PASS SVGTransformList interface: operation createSVGTransformFromMatrix(DOMMatrixReadOnly) +PASS Unscopable handled correctly for createSVGTransformFromMatrix(DOMMatrixReadOnly) on SVGTransformList +PASS SVGTransformList interface: operation consolidate() +PASS Unscopable handled correctly for consolidate() on SVGTransformList +PASS SVGTransformList must be primary interface of objects.pattern.patternTransform.baseVal +PASS Stringification of objects.pattern.patternTransform.baseVal +PASS SVGTransformList interface: objects.pattern.patternTransform.baseVal must inherit property "length" with the proper type +PASS SVGTransformList interface: objects.pattern.patternTransform.baseVal must inherit property "numberOfItems" with the proper type +PASS SVGTransformList interface: objects.pattern.patternTransform.baseVal must inherit property "clear()" with the proper type +PASS SVGTransformList interface: objects.pattern.patternTransform.baseVal must inherit property "initialize(SVGTransform)" with the proper type +PASS SVGTransformList interface: calling initialize(SVGTransform) on objects.pattern.patternTransform.baseVal with too few arguments must throw TypeError +PASS SVGTransformList interface: objects.pattern.patternTransform.baseVal must inherit property "getItem(unsigned long)" with the proper type +PASS SVGTransformList interface: calling getItem(unsigned long) on objects.pattern.patternTransform.baseVal with too few arguments must throw TypeError +PASS SVGTransformList interface: objects.pattern.patternTransform.baseVal must inherit property "insertItemBefore(SVGTransform, unsigned long)" with the proper type +PASS SVGTransformList interface: calling insertItemBefore(SVGTransform, unsigned long) on objects.pattern.patternTransform.baseVal with too few arguments must throw TypeError +PASS SVGTransformList interface: objects.pattern.patternTransform.baseVal must inherit property "replaceItem(SVGTransform, unsigned long)" with the proper type +PASS SVGTransformList interface: calling replaceItem(SVGTransform, unsigned long) on objects.pattern.patternTransform.baseVal with too few arguments must throw TypeError +PASS SVGTransformList interface: objects.pattern.patternTransform.baseVal must inherit property "removeItem(unsigned long)" with the proper type +PASS SVGTransformList interface: calling removeItem(unsigned long) on objects.pattern.patternTransform.baseVal with too few arguments must throw TypeError +PASS SVGTransformList interface: objects.pattern.patternTransform.baseVal must inherit property "appendItem(SVGTransform)" with the proper type +PASS SVGTransformList interface: calling appendItem(SVGTransform) on objects.pattern.patternTransform.baseVal with too few arguments must throw TypeError +PASS SVGTransformList interface: objects.pattern.patternTransform.baseVal must inherit property "createSVGTransformFromMatrix(DOMMatrixReadOnly)" with the proper type +PASS SVGTransformList interface: calling createSVGTransformFromMatrix(DOMMatrixReadOnly) on objects.pattern.patternTransform.baseVal with too few arguments must throw TypeError +PASS SVGTransformList interface: objects.pattern.patternTransform.baseVal must inherit property "consolidate()" with the proper type +PASS SVGAnimatedTransformList interface: existence and properties of interface object +PASS SVGAnimatedTransformList interface object length +PASS SVGAnimatedTransformList interface object name +PASS SVGAnimatedTransformList interface: existence and properties of interface prototype object +PASS SVGAnimatedTransformList interface: existence and properties of interface prototype object's "constructor" property +PASS SVGAnimatedTransformList interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGAnimatedTransformList interface: attribute baseVal +PASS Unscopable handled correctly for baseVal property on SVGAnimatedTransformList +PASS SVGAnimatedTransformList interface: attribute animVal +PASS Unscopable handled correctly for animVal property on SVGAnimatedTransformList +PASS SVGAnimatedTransformList must be primary interface of objects.pattern.patternTransform +PASS Stringification of objects.pattern.patternTransform +PASS SVGAnimatedTransformList interface: objects.pattern.patternTransform must inherit property "baseVal" with the proper type +PASS SVGAnimatedTransformList interface: objects.pattern.patternTransform must inherit property "animVal" with the proper type +PASS SVGPreserveAspectRatio interface: existence and properties of interface object +PASS SVGPreserveAspectRatio interface object length +PASS SVGPreserveAspectRatio interface object name +PASS SVGPreserveAspectRatio interface: existence and properties of interface prototype object +PASS SVGPreserveAspectRatio interface: existence and properties of interface prototype object's "constructor" property +PASS SVGPreserveAspectRatio interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_UNKNOWN on interface object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_UNKNOWN on interface prototype object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_NONE on interface object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_NONE on interface prototype object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMINYMIN on interface object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMINYMIN on interface prototype object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMIDYMIN on interface object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMIDYMIN on interface prototype object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMAXYMIN on interface object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMAXYMIN on interface prototype object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMINYMID on interface object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMINYMID on interface prototype object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMIDYMID on interface object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMIDYMID on interface prototype object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMAXYMID on interface object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMAXYMID on interface prototype object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMINYMAX on interface object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMINYMAX on interface prototype object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMIDYMAX on interface object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMIDYMAX on interface prototype object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMAXYMAX on interface object +PASS SVGPreserveAspectRatio interface: constant SVG_PRESERVEASPECTRATIO_XMAXYMAX on interface prototype object +PASS SVGPreserveAspectRatio interface: constant SVG_MEETORSLICE_UNKNOWN on interface object +PASS SVGPreserveAspectRatio interface: constant SVG_MEETORSLICE_UNKNOWN on interface prototype object +PASS SVGPreserveAspectRatio interface: constant SVG_MEETORSLICE_MEET on interface object +PASS SVGPreserveAspectRatio interface: constant SVG_MEETORSLICE_MEET on interface prototype object +PASS SVGPreserveAspectRatio interface: constant SVG_MEETORSLICE_SLICE on interface object +PASS SVGPreserveAspectRatio interface: constant SVG_MEETORSLICE_SLICE on interface prototype object +PASS SVGPreserveAspectRatio interface: attribute align +PASS Unscopable handled correctly for align property on SVGPreserveAspectRatio +PASS SVGPreserveAspectRatio interface: attribute meetOrSlice +PASS Unscopable handled correctly for meetOrSlice property on SVGPreserveAspectRatio +PASS SVGPreserveAspectRatio must be primary interface of objects.image.preserveAspectRatio.baseVal +PASS Stringification of objects.image.preserveAspectRatio.baseVal +PASS SVGPreserveAspectRatio interface: objects.image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_UNKNOWN" with the proper type +PASS SVGPreserveAspectRatio interface: objects.image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_NONE" with the proper type +PASS SVGPreserveAspectRatio interface: objects.image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMINYMIN" with the proper type +PASS SVGPreserveAspectRatio interface: objects.image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMIDYMIN" with the proper type +PASS SVGPreserveAspectRatio interface: objects.image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMAXYMIN" with the proper type +PASS SVGPreserveAspectRatio interface: objects.image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMINYMID" with the proper type +PASS SVGPreserveAspectRatio interface: objects.image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMIDYMID" with the proper type +PASS SVGPreserveAspectRatio interface: objects.image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMAXYMID" with the proper type +PASS SVGPreserveAspectRatio interface: objects.image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMINYMAX" with the proper type +PASS SVGPreserveAspectRatio interface: objects.image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMIDYMAX" with the proper type +PASS SVGPreserveAspectRatio interface: objects.image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMAXYMAX" with the proper type +PASS SVGPreserveAspectRatio interface: objects.image.preserveAspectRatio.baseVal must inherit property "SVG_MEETORSLICE_UNKNOWN" with the proper type +PASS SVGPreserveAspectRatio interface: objects.image.preserveAspectRatio.baseVal must inherit property "SVG_MEETORSLICE_MEET" with the proper type +PASS SVGPreserveAspectRatio interface: objects.image.preserveAspectRatio.baseVal must inherit property "SVG_MEETORSLICE_SLICE" with the proper type +PASS SVGPreserveAspectRatio interface: objects.image.preserveAspectRatio.baseVal must inherit property "align" with the proper type +PASS SVGPreserveAspectRatio interface: objects.image.preserveAspectRatio.baseVal must inherit property "meetOrSlice" with the proper type +PASS SVGAnimatedPreserveAspectRatio interface: existence and properties of interface object +PASS SVGAnimatedPreserveAspectRatio interface object length +PASS SVGAnimatedPreserveAspectRatio interface object name +PASS SVGAnimatedPreserveAspectRatio interface: existence and properties of interface prototype object +PASS SVGAnimatedPreserveAspectRatio interface: existence and properties of interface prototype object's "constructor" property +PASS SVGAnimatedPreserveAspectRatio interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGAnimatedPreserveAspectRatio interface: attribute baseVal +PASS Unscopable handled correctly for baseVal property on SVGAnimatedPreserveAspectRatio +PASS SVGAnimatedPreserveAspectRatio interface: attribute animVal +PASS Unscopable handled correctly for animVal property on SVGAnimatedPreserveAspectRatio +PASS SVGAnimatedPreserveAspectRatio must be primary interface of objects.image.preserveAspectRatio +PASS Stringification of objects.image.preserveAspectRatio +PASS SVGAnimatedPreserveAspectRatio interface: objects.image.preserveAspectRatio must inherit property "baseVal" with the proper type +PASS SVGAnimatedPreserveAspectRatio interface: objects.image.preserveAspectRatio must inherit property "animVal" with the proper type +PASS SVGPathElement interface: existence and properties of interface object +PASS SVGPathElement interface object length +PASS SVGPathElement interface object name +PASS SVGPathElement interface: existence and properties of interface prototype object +PASS SVGPathElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGPathElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGPathElement must be primary interface of objects.path +PASS Stringification of objects.path +PASS SVGGeometryElement interface: objects.path must inherit property "pathLength" with the proper type +PASS SVGGeometryElement interface: objects.path must inherit property "isPointInFill(DOMPointInit)" with the proper type +PASS SVGGeometryElement interface: calling isPointInFill(DOMPointInit) on objects.path with too few arguments must throw TypeError +PASS SVGGeometryElement interface: objects.path must inherit property "isPointInStroke(DOMPointInit)" with the proper type +PASS SVGGeometryElement interface: calling isPointInStroke(DOMPointInit) on objects.path with too few arguments must throw TypeError +PASS SVGGeometryElement interface: objects.path must inherit property "getTotalLength()" with the proper type +PASS SVGGeometryElement interface: objects.path must inherit property "getPointAtLength(float)" with the proper type +PASS SVGGeometryElement interface: calling getPointAtLength(float) on objects.path with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.path must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.path must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.path with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.path must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.path must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.path must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.path must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.path must inherit property "className" with the proper type +PASS SVGElement interface: objects.path must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.path must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.path must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.path must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGRectElement interface: existence and properties of interface object +PASS SVGRectElement interface object length +PASS SVGRectElement interface object name +PASS SVGRectElement interface: existence and properties of interface prototype object +PASS SVGRectElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGRectElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGRectElement interface: attribute x +PASS Unscopable handled correctly for x property on SVGRectElement +PASS SVGRectElement interface: attribute y +PASS Unscopable handled correctly for y property on SVGRectElement +PASS SVGRectElement interface: attribute width +PASS Unscopable handled correctly for width property on SVGRectElement +PASS SVGRectElement interface: attribute height +PASS Unscopable handled correctly for height property on SVGRectElement +PASS SVGRectElement interface: attribute rx +PASS Unscopable handled correctly for rx property on SVGRectElement +PASS SVGRectElement interface: attribute ry +PASS Unscopable handled correctly for ry property on SVGRectElement +PASS SVGRectElement must be primary interface of objects.rect +PASS Stringification of objects.rect +PASS SVGRectElement interface: objects.rect must inherit property "x" with the proper type +PASS SVGRectElement interface: objects.rect must inherit property "y" with the proper type +PASS SVGRectElement interface: objects.rect must inherit property "width" with the proper type +PASS SVGRectElement interface: objects.rect must inherit property "height" with the proper type +PASS SVGRectElement interface: objects.rect must inherit property "rx" with the proper type +PASS SVGRectElement interface: objects.rect must inherit property "ry" with the proper type +PASS SVGGeometryElement interface: objects.rect must inherit property "pathLength" with the proper type +PASS SVGGeometryElement interface: objects.rect must inherit property "isPointInFill(DOMPointInit)" with the proper type +PASS SVGGeometryElement interface: calling isPointInFill(DOMPointInit) on objects.rect with too few arguments must throw TypeError +PASS SVGGeometryElement interface: objects.rect must inherit property "isPointInStroke(DOMPointInit)" with the proper type +PASS SVGGeometryElement interface: calling isPointInStroke(DOMPointInit) on objects.rect with too few arguments must throw TypeError +PASS SVGGeometryElement interface: objects.rect must inherit property "getTotalLength()" with the proper type +PASS SVGGeometryElement interface: objects.rect must inherit property "getPointAtLength(float)" with the proper type +PASS SVGGeometryElement interface: calling getPointAtLength(float) on objects.rect with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.rect must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.rect must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.rect with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.rect must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.rect must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.rect must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.rect must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.rect must inherit property "className" with the proper type +PASS SVGElement interface: objects.rect must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.rect must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.rect must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.rect must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGCircleElement interface: existence and properties of interface object +PASS SVGCircleElement interface object length +PASS SVGCircleElement interface object name +PASS SVGCircleElement interface: existence and properties of interface prototype object +PASS SVGCircleElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGCircleElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGCircleElement interface: attribute cx +PASS Unscopable handled correctly for cx property on SVGCircleElement +PASS SVGCircleElement interface: attribute cy +PASS Unscopable handled correctly for cy property on SVGCircleElement +PASS SVGCircleElement interface: attribute r +PASS Unscopable handled correctly for r property on SVGCircleElement +PASS SVGCircleElement must be primary interface of objects.circle +PASS Stringification of objects.circle +PASS SVGCircleElement interface: objects.circle must inherit property "cx" with the proper type +PASS SVGCircleElement interface: objects.circle must inherit property "cy" with the proper type +PASS SVGCircleElement interface: objects.circle must inherit property "r" with the proper type +PASS SVGGeometryElement interface: objects.circle must inherit property "pathLength" with the proper type +PASS SVGGeometryElement interface: objects.circle must inherit property "isPointInFill(DOMPointInit)" with the proper type +PASS SVGGeometryElement interface: calling isPointInFill(DOMPointInit) on objects.circle with too few arguments must throw TypeError +PASS SVGGeometryElement interface: objects.circle must inherit property "isPointInStroke(DOMPointInit)" with the proper type +PASS SVGGeometryElement interface: calling isPointInStroke(DOMPointInit) on objects.circle with too few arguments must throw TypeError +PASS SVGGeometryElement interface: objects.circle must inherit property "getTotalLength()" with the proper type +PASS SVGGeometryElement interface: objects.circle must inherit property "getPointAtLength(float)" with the proper type +PASS SVGGeometryElement interface: calling getPointAtLength(float) on objects.circle with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.circle must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.circle must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.circle with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.circle must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.circle must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.circle must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.circle must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.circle must inherit property "className" with the proper type +PASS SVGElement interface: objects.circle must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.circle must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.circle must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.circle must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGEllipseElement interface: existence and properties of interface object +PASS SVGEllipseElement interface object length +PASS SVGEllipseElement interface object name +PASS SVGEllipseElement interface: existence and properties of interface prototype object +PASS SVGEllipseElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGEllipseElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGEllipseElement interface: attribute cx +PASS Unscopable handled correctly for cx property on SVGEllipseElement +PASS SVGEllipseElement interface: attribute cy +PASS Unscopable handled correctly for cy property on SVGEllipseElement +PASS SVGEllipseElement interface: attribute rx +PASS Unscopable handled correctly for rx property on SVGEllipseElement +PASS SVGEllipseElement interface: attribute ry +PASS Unscopable handled correctly for ry property on SVGEllipseElement +PASS SVGEllipseElement must be primary interface of objects.ellipse +PASS Stringification of objects.ellipse +PASS SVGEllipseElement interface: objects.ellipse must inherit property "cx" with the proper type +PASS SVGEllipseElement interface: objects.ellipse must inherit property "cy" with the proper type +PASS SVGEllipseElement interface: objects.ellipse must inherit property "rx" with the proper type +PASS SVGEllipseElement interface: objects.ellipse must inherit property "ry" with the proper type +PASS SVGGeometryElement interface: objects.ellipse must inherit property "pathLength" with the proper type +PASS SVGGeometryElement interface: objects.ellipse must inherit property "isPointInFill(DOMPointInit)" with the proper type +PASS SVGGeometryElement interface: calling isPointInFill(DOMPointInit) on objects.ellipse with too few arguments must throw TypeError +PASS SVGGeometryElement interface: objects.ellipse must inherit property "isPointInStroke(DOMPointInit)" with the proper type +PASS SVGGeometryElement interface: calling isPointInStroke(DOMPointInit) on objects.ellipse with too few arguments must throw TypeError +PASS SVGGeometryElement interface: objects.ellipse must inherit property "getTotalLength()" with the proper type +PASS SVGGeometryElement interface: objects.ellipse must inherit property "getPointAtLength(float)" with the proper type +PASS SVGGeometryElement interface: calling getPointAtLength(float) on objects.ellipse with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.ellipse must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.ellipse must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.ellipse with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.ellipse must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.ellipse must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.ellipse must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.ellipse must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.ellipse must inherit property "className" with the proper type +PASS SVGElement interface: objects.ellipse must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.ellipse must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.ellipse must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.ellipse must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGLineElement interface: existence and properties of interface object +PASS SVGLineElement interface object length +PASS SVGLineElement interface object name +PASS SVGLineElement interface: existence and properties of interface prototype object +PASS SVGLineElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGLineElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGLineElement interface: attribute x1 +PASS Unscopable handled correctly for x1 property on SVGLineElement +PASS SVGLineElement interface: attribute y1 +PASS Unscopable handled correctly for y1 property on SVGLineElement +PASS SVGLineElement interface: attribute x2 +PASS Unscopable handled correctly for x2 property on SVGLineElement +PASS SVGLineElement interface: attribute y2 +PASS Unscopable handled correctly for y2 property on SVGLineElement +PASS SVGLineElement must be primary interface of objects.line +PASS Stringification of objects.line +PASS SVGLineElement interface: objects.line must inherit property "x1" with the proper type +PASS SVGLineElement interface: objects.line must inherit property "y1" with the proper type +PASS SVGLineElement interface: objects.line must inherit property "x2" with the proper type +PASS SVGLineElement interface: objects.line must inherit property "y2" with the proper type +PASS SVGGeometryElement interface: objects.line must inherit property "pathLength" with the proper type +PASS SVGGeometryElement interface: objects.line must inherit property "isPointInFill(DOMPointInit)" with the proper type +PASS SVGGeometryElement interface: calling isPointInFill(DOMPointInit) on objects.line with too few arguments must throw TypeError +PASS SVGGeometryElement interface: objects.line must inherit property "isPointInStroke(DOMPointInit)" with the proper type +PASS SVGGeometryElement interface: calling isPointInStroke(DOMPointInit) on objects.line with too few arguments must throw TypeError +PASS SVGGeometryElement interface: objects.line must inherit property "getTotalLength()" with the proper type +PASS SVGGeometryElement interface: objects.line must inherit property "getPointAtLength(float)" with the proper type +PASS SVGGeometryElement interface: calling getPointAtLength(float) on objects.line with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.line must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.line must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.line with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.line must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.line must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.line must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.line must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.line must inherit property "className" with the proper type +PASS SVGElement interface: objects.line must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.line must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.line must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.line must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGPointList interface: existence and properties of interface object +PASS SVGPointList interface object length +PASS SVGPointList interface object name +PASS SVGPointList interface: existence and properties of interface prototype object +PASS SVGPointList interface: existence and properties of interface prototype object's "constructor" property +PASS SVGPointList interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGPointList interface: attribute length +PASS Unscopable handled correctly for length property on SVGPointList +PASS SVGPointList interface: attribute numberOfItems +PASS Unscopable handled correctly for numberOfItems property on SVGPointList +PASS SVGPointList interface: operation clear() +PASS Unscopable handled correctly for clear() on SVGPointList +PASS SVGPointList interface: operation initialize(DOMPoint) +PASS Unscopable handled correctly for initialize(DOMPoint) on SVGPointList +PASS SVGPointList interface: operation getItem(unsigned long) +PASS Unscopable handled correctly for getItem(unsigned long) on SVGPointList +PASS SVGPointList interface: operation insertItemBefore(DOMPoint, unsigned long) +PASS Unscopable handled correctly for insertItemBefore(DOMPoint, unsigned long) on SVGPointList +PASS SVGPointList interface: operation replaceItem(DOMPoint, unsigned long) +PASS Unscopable handled correctly for replaceItem(DOMPoint, unsigned long) on SVGPointList +PASS SVGPointList interface: operation removeItem(unsigned long) +PASS Unscopable handled correctly for removeItem(unsigned long) on SVGPointList +PASS SVGPointList interface: operation appendItem(DOMPoint) +PASS Unscopable handled correctly for appendItem(DOMPoint) on SVGPointList +PASS SVGPointList must be primary interface of objects.polygon.points +PASS Stringification of objects.polygon.points +PASS SVGPointList interface: objects.polygon.points must inherit property "length" with the proper type +PASS SVGPointList interface: objects.polygon.points must inherit property "numberOfItems" with the proper type +PASS SVGPointList interface: objects.polygon.points must inherit property "clear()" with the proper type +PASS SVGPointList interface: objects.polygon.points must inherit property "initialize(DOMPoint)" with the proper type +PASS SVGPointList interface: calling initialize(DOMPoint) on objects.polygon.points with too few arguments must throw TypeError +PASS SVGPointList interface: objects.polygon.points must inherit property "getItem(unsigned long)" with the proper type +PASS SVGPointList interface: calling getItem(unsigned long) on objects.polygon.points with too few arguments must throw TypeError +PASS SVGPointList interface: objects.polygon.points must inherit property "insertItemBefore(DOMPoint, unsigned long)" with the proper type +PASS SVGPointList interface: calling insertItemBefore(DOMPoint, unsigned long) on objects.polygon.points with too few arguments must throw TypeError +PASS SVGPointList interface: objects.polygon.points must inherit property "replaceItem(DOMPoint, unsigned long)" with the proper type +PASS SVGPointList interface: calling replaceItem(DOMPoint, unsigned long) on objects.polygon.points with too few arguments must throw TypeError +PASS SVGPointList interface: objects.polygon.points must inherit property "removeItem(unsigned long)" with the proper type +PASS SVGPointList interface: calling removeItem(unsigned long) on objects.polygon.points with too few arguments must throw TypeError +PASS SVGPointList interface: objects.polygon.points must inherit property "appendItem(DOMPoint)" with the proper type +PASS SVGPointList interface: calling appendItem(DOMPoint) on objects.polygon.points with too few arguments must throw TypeError +PASS SVGPolylineElement interface: existence and properties of interface object +PASS SVGPolylineElement interface object length +PASS SVGPolylineElement interface object name +PASS SVGPolylineElement interface: existence and properties of interface prototype object +PASS SVGPolylineElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGPolylineElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGPolylineElement interface: attribute points +PASS Unscopable handled correctly for points property on SVGPolylineElement +PASS SVGPolylineElement interface: attribute animatedPoints +PASS Unscopable handled correctly for animatedPoints property on SVGPolylineElement +PASS SVGPolylineElement must be primary interface of objects.polyline +PASS Stringification of objects.polyline +PASS SVGPolylineElement interface: objects.polyline must inherit property "points" with the proper type +PASS SVGPolylineElement interface: objects.polyline must inherit property "animatedPoints" with the proper type +PASS SVGGeometryElement interface: objects.polyline must inherit property "pathLength" with the proper type +PASS SVGGeometryElement interface: objects.polyline must inherit property "isPointInFill(DOMPointInit)" with the proper type +PASS SVGGeometryElement interface: calling isPointInFill(DOMPointInit) on objects.polyline with too few arguments must throw TypeError +PASS SVGGeometryElement interface: objects.polyline must inherit property "isPointInStroke(DOMPointInit)" with the proper type +PASS SVGGeometryElement interface: calling isPointInStroke(DOMPointInit) on objects.polyline with too few arguments must throw TypeError +PASS SVGGeometryElement interface: objects.polyline must inherit property "getTotalLength()" with the proper type +PASS SVGGeometryElement interface: objects.polyline must inherit property "getPointAtLength(float)" with the proper type +PASS SVGGeometryElement interface: calling getPointAtLength(float) on objects.polyline with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.polyline must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.polyline must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.polyline with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.polyline must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.polyline must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.polyline must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.polyline must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.polyline must inherit property "className" with the proper type +PASS SVGElement interface: objects.polyline must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.polyline must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.polyline must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.polyline must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGPolygonElement interface: existence and properties of interface object +PASS SVGPolygonElement interface object length +PASS SVGPolygonElement interface object name +PASS SVGPolygonElement interface: existence and properties of interface prototype object +PASS SVGPolygonElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGPolygonElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGPolygonElement interface: attribute points +PASS Unscopable handled correctly for points property on SVGPolygonElement +PASS SVGPolygonElement interface: attribute animatedPoints +PASS Unscopable handled correctly for animatedPoints property on SVGPolygonElement +PASS SVGPolygonElement must be primary interface of objects.polygon +PASS Stringification of objects.polygon +PASS SVGPolygonElement interface: objects.polygon must inherit property "points" with the proper type +PASS SVGPolygonElement interface: objects.polygon must inherit property "animatedPoints" with the proper type +PASS SVGGeometryElement interface: objects.polygon must inherit property "pathLength" with the proper type +PASS SVGGeometryElement interface: objects.polygon must inherit property "isPointInFill(DOMPointInit)" with the proper type +PASS SVGGeometryElement interface: calling isPointInFill(DOMPointInit) on objects.polygon with too few arguments must throw TypeError +PASS SVGGeometryElement interface: objects.polygon must inherit property "isPointInStroke(DOMPointInit)" with the proper type +PASS SVGGeometryElement interface: calling isPointInStroke(DOMPointInit) on objects.polygon with too few arguments must throw TypeError +PASS SVGGeometryElement interface: objects.polygon must inherit property "getTotalLength()" with the proper type +PASS SVGGeometryElement interface: objects.polygon must inherit property "getPointAtLength(float)" with the proper type +PASS SVGGeometryElement interface: calling getPointAtLength(float) on objects.polygon with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.polygon must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.polygon must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.polygon with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.polygon must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.polygon must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.polygon must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.polygon must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.polygon must inherit property "className" with the proper type +PASS SVGElement interface: objects.polygon must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.polygon must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.polygon must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.polygon must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGTextContentElement interface: existence and properties of interface object +PASS SVGTextContentElement interface object length +PASS SVGTextContentElement interface object name +PASS SVGTextContentElement interface: existence and properties of interface prototype object +PASS SVGTextContentElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGTextContentElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGTextContentElement interface: constant LENGTHADJUST_UNKNOWN on interface object +PASS SVGTextContentElement interface: constant LENGTHADJUST_UNKNOWN on interface prototype object +PASS SVGTextContentElement interface: constant LENGTHADJUST_SPACING on interface object +PASS SVGTextContentElement interface: constant LENGTHADJUST_SPACING on interface prototype object +PASS SVGTextContentElement interface: constant LENGTHADJUST_SPACINGANDGLYPHS on interface object +PASS SVGTextContentElement interface: constant LENGTHADJUST_SPACINGANDGLYPHS on interface prototype object +PASS SVGTextContentElement interface: attribute textLength +PASS Unscopable handled correctly for textLength property on SVGTextContentElement +PASS SVGTextContentElement interface: attribute lengthAdjust +PASS Unscopable handled correctly for lengthAdjust property on SVGTextContentElement +PASS SVGTextContentElement interface: operation getNumberOfChars() +PASS Unscopable handled correctly for getNumberOfChars() on SVGTextContentElement +PASS SVGTextContentElement interface: operation getComputedTextLength() +PASS Unscopable handled correctly for getComputedTextLength() on SVGTextContentElement +PASS SVGTextContentElement interface: operation getSubStringLength(unsigned long, unsigned long) +PASS Unscopable handled correctly for getSubStringLength(unsigned long, unsigned long) on SVGTextContentElement +PASS SVGTextContentElement interface: operation getStartPositionOfChar(unsigned long) +PASS Unscopable handled correctly for getStartPositionOfChar(unsigned long) on SVGTextContentElement +PASS SVGTextContentElement interface: operation getEndPositionOfChar(unsigned long) +PASS Unscopable handled correctly for getEndPositionOfChar(unsigned long) on SVGTextContentElement +PASS SVGTextContentElement interface: operation getExtentOfChar(unsigned long) +PASS Unscopable handled correctly for getExtentOfChar(unsigned long) on SVGTextContentElement +PASS SVGTextContentElement interface: operation getRotationOfChar(unsigned long) +PASS Unscopable handled correctly for getRotationOfChar(unsigned long) on SVGTextContentElement +FAIL SVGTextContentElement interface: operation getCharNumAtPosition(DOMPointInit) assert_equals: property has wrong .length expected 0 but got 1 +PASS Unscopable handled correctly for getCharNumAtPosition(DOMPointInit) on SVGTextContentElement +PASS SVGTextContentElement interface: operation selectSubString(unsigned long, unsigned long) +PASS Unscopable handled correctly for selectSubString(unsigned long, unsigned long) on SVGTextContentElement +PASS SVGTextPositioningElement interface: existence and properties of interface object +PASS SVGTextPositioningElement interface object length +PASS SVGTextPositioningElement interface object name +PASS SVGTextPositioningElement interface: existence and properties of interface prototype object +PASS SVGTextPositioningElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGTextPositioningElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGTextPositioningElement interface: attribute x +PASS Unscopable handled correctly for x property on SVGTextPositioningElement +PASS SVGTextPositioningElement interface: attribute y +PASS Unscopable handled correctly for y property on SVGTextPositioningElement +PASS SVGTextPositioningElement interface: attribute dx +PASS Unscopable handled correctly for dx property on SVGTextPositioningElement +PASS SVGTextPositioningElement interface: attribute dy +PASS Unscopable handled correctly for dy property on SVGTextPositioningElement +PASS SVGTextPositioningElement interface: attribute rotate +PASS Unscopable handled correctly for rotate property on SVGTextPositioningElement +PASS SVGTextElement interface: existence and properties of interface object +PASS SVGTextElement interface object length +PASS SVGTextElement interface object name +PASS SVGTextElement interface: existence and properties of interface prototype object +PASS SVGTextElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGTextElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGTextElement must be primary interface of objects.text +PASS Stringification of objects.text +PASS SVGTextPositioningElement interface: objects.text must inherit property "x" with the proper type +PASS SVGTextPositioningElement interface: objects.text must inherit property "y" with the proper type +PASS SVGTextPositioningElement interface: objects.text must inherit property "dx" with the proper type +PASS SVGTextPositioningElement interface: objects.text must inherit property "dy" with the proper type +PASS SVGTextPositioningElement interface: objects.text must inherit property "rotate" with the proper type +PASS SVGTextContentElement interface: objects.text must inherit property "LENGTHADJUST_UNKNOWN" with the proper type +PASS SVGTextContentElement interface: objects.text must inherit property "LENGTHADJUST_SPACING" with the proper type +PASS SVGTextContentElement interface: objects.text must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type +PASS SVGTextContentElement interface: objects.text must inherit property "textLength" with the proper type +PASS SVGTextContentElement interface: objects.text must inherit property "lengthAdjust" with the proper type +PASS SVGTextContentElement interface: objects.text must inherit property "getNumberOfChars()" with the proper type +PASS SVGTextContentElement interface: objects.text must inherit property "getComputedTextLength()" with the proper type +PASS SVGTextContentElement interface: objects.text must inherit property "getSubStringLength(unsigned long, unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getSubStringLength(unsigned long, unsigned long) on objects.text with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.text must inherit property "getStartPositionOfChar(unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getStartPositionOfChar(unsigned long) on objects.text with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.text must inherit property "getEndPositionOfChar(unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getEndPositionOfChar(unsigned long) on objects.text with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.text must inherit property "getExtentOfChar(unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getExtentOfChar(unsigned long) on objects.text with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.text must inherit property "getRotationOfChar(unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getRotationOfChar(unsigned long) on objects.text with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.text must inherit property "getCharNumAtPosition(DOMPointInit)" with the proper type +PASS SVGTextContentElement interface: calling getCharNumAtPosition(DOMPointInit) on objects.text with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.text must inherit property "selectSubString(unsigned long, unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling selectSubString(unsigned long, unsigned long) on objects.text with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.text must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.text must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.text with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.text must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.text must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.text must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.text must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.text must inherit property "className" with the proper type +PASS SVGElement interface: objects.text must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.text must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.text must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.text must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGTSpanElement interface: existence and properties of interface object +PASS SVGTSpanElement interface object length +PASS SVGTSpanElement interface object name +PASS SVGTSpanElement interface: existence and properties of interface prototype object +PASS SVGTSpanElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGTSpanElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGTSpanElement must be primary interface of objects.tspan +PASS Stringification of objects.tspan +PASS SVGTextPositioningElement interface: objects.tspan must inherit property "x" with the proper type +PASS SVGTextPositioningElement interface: objects.tspan must inherit property "y" with the proper type +PASS SVGTextPositioningElement interface: objects.tspan must inherit property "dx" with the proper type +PASS SVGTextPositioningElement interface: objects.tspan must inherit property "dy" with the proper type +PASS SVGTextPositioningElement interface: objects.tspan must inherit property "rotate" with the proper type +PASS SVGTextContentElement interface: objects.tspan must inherit property "LENGTHADJUST_UNKNOWN" with the proper type +PASS SVGTextContentElement interface: objects.tspan must inherit property "LENGTHADJUST_SPACING" with the proper type +PASS SVGTextContentElement interface: objects.tspan must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type +PASS SVGTextContentElement interface: objects.tspan must inherit property "textLength" with the proper type +PASS SVGTextContentElement interface: objects.tspan must inherit property "lengthAdjust" with the proper type +PASS SVGTextContentElement interface: objects.tspan must inherit property "getNumberOfChars()" with the proper type +PASS SVGTextContentElement interface: objects.tspan must inherit property "getComputedTextLength()" with the proper type +PASS SVGTextContentElement interface: objects.tspan must inherit property "getSubStringLength(unsigned long, unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getSubStringLength(unsigned long, unsigned long) on objects.tspan with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.tspan must inherit property "getStartPositionOfChar(unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getStartPositionOfChar(unsigned long) on objects.tspan with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.tspan must inherit property "getEndPositionOfChar(unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getEndPositionOfChar(unsigned long) on objects.tspan with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.tspan must inherit property "getExtentOfChar(unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getExtentOfChar(unsigned long) on objects.tspan with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.tspan must inherit property "getRotationOfChar(unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getRotationOfChar(unsigned long) on objects.tspan with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.tspan must inherit property "getCharNumAtPosition(DOMPointInit)" with the proper type +PASS SVGTextContentElement interface: calling getCharNumAtPosition(DOMPointInit) on objects.tspan with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.tspan must inherit property "selectSubString(unsigned long, unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling selectSubString(unsigned long, unsigned long) on objects.tspan with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.tspan must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.tspan must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.tspan with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.tspan must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.tspan must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.tspan must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.tspan must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.tspan must inherit property "className" with the proper type +PASS SVGElement interface: objects.tspan must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.tspan must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.tspan must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.tspan must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGTextPathElement interface: existence and properties of interface object +PASS SVGTextPathElement interface object length +PASS SVGTextPathElement interface object name +PASS SVGTextPathElement interface: existence and properties of interface prototype object +PASS SVGTextPathElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGTextPathElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGTextPathElement interface: constant TEXTPATH_METHODTYPE_UNKNOWN on interface object +PASS SVGTextPathElement interface: constant TEXTPATH_METHODTYPE_UNKNOWN on interface prototype object +PASS SVGTextPathElement interface: constant TEXTPATH_METHODTYPE_ALIGN on interface object +PASS SVGTextPathElement interface: constant TEXTPATH_METHODTYPE_ALIGN on interface prototype object +PASS SVGTextPathElement interface: constant TEXTPATH_METHODTYPE_STRETCH on interface object +PASS SVGTextPathElement interface: constant TEXTPATH_METHODTYPE_STRETCH on interface prototype object +PASS SVGTextPathElement interface: constant TEXTPATH_SPACINGTYPE_UNKNOWN on interface object +PASS SVGTextPathElement interface: constant TEXTPATH_SPACINGTYPE_UNKNOWN on interface prototype object +PASS SVGTextPathElement interface: constant TEXTPATH_SPACINGTYPE_AUTO on interface object +PASS SVGTextPathElement interface: constant TEXTPATH_SPACINGTYPE_AUTO on interface prototype object +PASS SVGTextPathElement interface: constant TEXTPATH_SPACINGTYPE_EXACT on interface object +PASS SVGTextPathElement interface: constant TEXTPATH_SPACINGTYPE_EXACT on interface prototype object +PASS SVGTextPathElement interface: attribute startOffset +PASS Unscopable handled correctly for startOffset property on SVGTextPathElement +PASS SVGTextPathElement interface: attribute method +PASS Unscopable handled correctly for method property on SVGTextPathElement +PASS SVGTextPathElement interface: attribute spacing +PASS Unscopable handled correctly for spacing property on SVGTextPathElement +PASS SVGTextPathElement interface: attribute href +PASS Unscopable handled correctly for href property on SVGTextPathElement +PASS SVGTextPathElement must be primary interface of objects.textPath +PASS Stringification of objects.textPath +PASS SVGTextPathElement interface: objects.textPath must inherit property "TEXTPATH_METHODTYPE_UNKNOWN" with the proper type +PASS SVGTextPathElement interface: objects.textPath must inherit property "TEXTPATH_METHODTYPE_ALIGN" with the proper type +PASS SVGTextPathElement interface: objects.textPath must inherit property "TEXTPATH_METHODTYPE_STRETCH" with the proper type +PASS SVGTextPathElement interface: objects.textPath must inherit property "TEXTPATH_SPACINGTYPE_UNKNOWN" with the proper type +PASS SVGTextPathElement interface: objects.textPath must inherit property "TEXTPATH_SPACINGTYPE_AUTO" with the proper type +PASS SVGTextPathElement interface: objects.textPath must inherit property "TEXTPATH_SPACINGTYPE_EXACT" with the proper type +PASS SVGTextPathElement interface: objects.textPath must inherit property "startOffset" with the proper type +PASS SVGTextPathElement interface: objects.textPath must inherit property "method" with the proper type +PASS SVGTextPathElement interface: objects.textPath must inherit property "spacing" with the proper type +PASS SVGTextPathElement interface: objects.textPath must inherit property "href" with the proper type +PASS SVGTextContentElement interface: objects.textPath must inherit property "LENGTHADJUST_UNKNOWN" with the proper type +PASS SVGTextContentElement interface: objects.textPath must inherit property "LENGTHADJUST_SPACING" with the proper type +PASS SVGTextContentElement interface: objects.textPath must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type +PASS SVGTextContentElement interface: objects.textPath must inherit property "textLength" with the proper type +PASS SVGTextContentElement interface: objects.textPath must inherit property "lengthAdjust" with the proper type +PASS SVGTextContentElement interface: objects.textPath must inherit property "getNumberOfChars()" with the proper type +PASS SVGTextContentElement interface: objects.textPath must inherit property "getComputedTextLength()" with the proper type +PASS SVGTextContentElement interface: objects.textPath must inherit property "getSubStringLength(unsigned long, unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getSubStringLength(unsigned long, unsigned long) on objects.textPath with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.textPath must inherit property "getStartPositionOfChar(unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getStartPositionOfChar(unsigned long) on objects.textPath with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.textPath must inherit property "getEndPositionOfChar(unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getEndPositionOfChar(unsigned long) on objects.textPath with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.textPath must inherit property "getExtentOfChar(unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getExtentOfChar(unsigned long) on objects.textPath with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.textPath must inherit property "getRotationOfChar(unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling getRotationOfChar(unsigned long) on objects.textPath with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.textPath must inherit property "getCharNumAtPosition(DOMPointInit)" with the proper type +PASS SVGTextContentElement interface: calling getCharNumAtPosition(DOMPointInit) on objects.textPath with too few arguments must throw TypeError +PASS SVGTextContentElement interface: objects.textPath must inherit property "selectSubString(unsigned long, unsigned long)" with the proper type +PASS SVGTextContentElement interface: calling selectSubString(unsigned long, unsigned long) on objects.textPath with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.textPath must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.textPath must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.textPath with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.textPath must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.textPath must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.textPath must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.textPath must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.textPath must inherit property "className" with the proper type +PASS SVGElement interface: objects.textPath must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.textPath must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.textPath must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.textPath must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGImageElement interface: existence and properties of interface object +PASS SVGImageElement interface object length +PASS SVGImageElement interface object name +PASS SVGImageElement interface: existence and properties of interface prototype object +PASS SVGImageElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGImageElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGImageElement interface: attribute x +PASS Unscopable handled correctly for x property on SVGImageElement +PASS SVGImageElement interface: attribute y +PASS Unscopable handled correctly for y property on SVGImageElement +PASS SVGImageElement interface: attribute width +PASS Unscopable handled correctly for width property on SVGImageElement +PASS SVGImageElement interface: attribute height +PASS Unscopable handled correctly for height property on SVGImageElement +PASS SVGImageElement interface: attribute preserveAspectRatio +PASS Unscopable handled correctly for preserveAspectRatio property on SVGImageElement +FAIL SVGImageElement interface: attribute crossOrigin assert_true: The prototype object must have a property "crossOrigin" expected true got false +PASS Unscopable handled correctly for crossOrigin property on SVGImageElement +PASS SVGImageElement interface: attribute href +PASS Unscopable handled correctly for href property on SVGImageElement +PASS SVGImageElement must be primary interface of objects.image +PASS Stringification of objects.image +PASS SVGImageElement interface: objects.image must inherit property "x" with the proper type +PASS SVGImageElement interface: objects.image must inherit property "y" with the proper type +PASS SVGImageElement interface: objects.image must inherit property "width" with the proper type +PASS SVGImageElement interface: objects.image must inherit property "height" with the proper type +PASS SVGImageElement interface: objects.image must inherit property "preserveAspectRatio" with the proper type +FAIL SVGImageElement interface: objects.image must inherit property "crossOrigin" with the proper type assert_inherits: property "crossOrigin" not found in prototype chain +PASS SVGImageElement interface: objects.image must inherit property "href" with the proper type +PASS SVGGraphicsElement interface: objects.image must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.image must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.image with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.image must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.image must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.image must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.image must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.image must inherit property "className" with the proper type +PASS SVGElement interface: objects.image must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.image must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.image must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.image must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGForeignObjectElement interface: existence and properties of interface object +PASS SVGForeignObjectElement interface object length +PASS SVGForeignObjectElement interface object name +PASS SVGForeignObjectElement interface: existence and properties of interface prototype object +PASS SVGForeignObjectElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGForeignObjectElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGForeignObjectElement interface: attribute x +PASS Unscopable handled correctly for x property on SVGForeignObjectElement +PASS SVGForeignObjectElement interface: attribute y +PASS Unscopable handled correctly for y property on SVGForeignObjectElement +PASS SVGForeignObjectElement interface: attribute width +PASS Unscopable handled correctly for width property on SVGForeignObjectElement +PASS SVGForeignObjectElement interface: attribute height +PASS Unscopable handled correctly for height property on SVGForeignObjectElement +PASS SVGForeignObjectElement must be primary interface of objects.foreignObject +PASS Stringification of objects.foreignObject +PASS SVGForeignObjectElement interface: objects.foreignObject must inherit property "x" with the proper type +PASS SVGForeignObjectElement interface: objects.foreignObject must inherit property "y" with the proper type +PASS SVGForeignObjectElement interface: objects.foreignObject must inherit property "width" with the proper type +PASS SVGForeignObjectElement interface: objects.foreignObject must inherit property "height" with the proper type +PASS SVGGraphicsElement interface: objects.foreignObject must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.foreignObject must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.foreignObject with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.foreignObject must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.foreignObject must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.foreignObject must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.foreignObject must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.foreignObject must inherit property "className" with the proper type +PASS SVGElement interface: objects.foreignObject must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.foreignObject must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.foreignObject must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.foreignObject must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGMarkerElement interface: existence and properties of interface object +PASS SVGMarkerElement interface object length +PASS SVGMarkerElement interface object name +PASS SVGMarkerElement interface: existence and properties of interface prototype object +PASS SVGMarkerElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGMarkerElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGMarkerElement interface: constant SVG_MARKERUNITS_UNKNOWN on interface object +PASS SVGMarkerElement interface: constant SVG_MARKERUNITS_UNKNOWN on interface prototype object +PASS SVGMarkerElement interface: constant SVG_MARKERUNITS_USERSPACEONUSE on interface object +PASS SVGMarkerElement interface: constant SVG_MARKERUNITS_USERSPACEONUSE on interface prototype object +PASS SVGMarkerElement interface: constant SVG_MARKERUNITS_STROKEWIDTH on interface object +PASS SVGMarkerElement interface: constant SVG_MARKERUNITS_STROKEWIDTH on interface prototype object +PASS SVGMarkerElement interface: constant SVG_MARKER_ORIENT_UNKNOWN on interface object +PASS SVGMarkerElement interface: constant SVG_MARKER_ORIENT_UNKNOWN on interface prototype object +PASS SVGMarkerElement interface: constant SVG_MARKER_ORIENT_AUTO on interface object +PASS SVGMarkerElement interface: constant SVG_MARKER_ORIENT_AUTO on interface prototype object +PASS SVGMarkerElement interface: constant SVG_MARKER_ORIENT_ANGLE on interface object +PASS SVGMarkerElement interface: constant SVG_MARKER_ORIENT_ANGLE on interface prototype object +PASS SVGMarkerElement interface: attribute refX +PASS Unscopable handled correctly for refX property on SVGMarkerElement +PASS SVGMarkerElement interface: attribute refY +PASS Unscopable handled correctly for refY property on SVGMarkerElement +PASS SVGMarkerElement interface: attribute markerUnits +PASS Unscopable handled correctly for markerUnits property on SVGMarkerElement +PASS SVGMarkerElement interface: attribute markerWidth +PASS Unscopable handled correctly for markerWidth property on SVGMarkerElement +PASS SVGMarkerElement interface: attribute markerHeight +PASS Unscopable handled correctly for markerHeight property on SVGMarkerElement +PASS SVGMarkerElement interface: attribute orientType +PASS Unscopable handled correctly for orientType property on SVGMarkerElement +PASS SVGMarkerElement interface: attribute orientAngle +PASS Unscopable handled correctly for orientAngle property on SVGMarkerElement +FAIL SVGMarkerElement interface: attribute orient assert_true: The prototype object must have a property "orient" expected true got false +PASS Unscopable handled correctly for orient property on SVGMarkerElement +PASS SVGMarkerElement interface: operation setOrientToAuto() +PASS Unscopable handled correctly for setOrientToAuto() on SVGMarkerElement +PASS SVGMarkerElement interface: operation setOrientToAngle(SVGAngle) +PASS Unscopable handled correctly for setOrientToAngle(SVGAngle) on SVGMarkerElement +PASS SVGMarkerElement interface: attribute viewBox +PASS Unscopable handled correctly for viewBox property on SVGMarkerElement +PASS SVGMarkerElement interface: attribute preserveAspectRatio +PASS Unscopable handled correctly for preserveAspectRatio property on SVGMarkerElement +PASS SVGMarkerElement must be primary interface of objects.marker +PASS Stringification of objects.marker +PASS SVGMarkerElement interface: objects.marker must inherit property "SVG_MARKERUNITS_UNKNOWN" with the proper type +PASS SVGMarkerElement interface: objects.marker must inherit property "SVG_MARKERUNITS_USERSPACEONUSE" with the proper type +PASS SVGMarkerElement interface: objects.marker must inherit property "SVG_MARKERUNITS_STROKEWIDTH" with the proper type +PASS SVGMarkerElement interface: objects.marker must inherit property "SVG_MARKER_ORIENT_UNKNOWN" with the proper type +PASS SVGMarkerElement interface: objects.marker must inherit property "SVG_MARKER_ORIENT_AUTO" with the proper type +PASS SVGMarkerElement interface: objects.marker must inherit property "SVG_MARKER_ORIENT_ANGLE" with the proper type +PASS SVGMarkerElement interface: objects.marker must inherit property "refX" with the proper type +PASS SVGMarkerElement interface: objects.marker must inherit property "refY" with the proper type +PASS SVGMarkerElement interface: objects.marker must inherit property "markerUnits" with the proper type +PASS SVGMarkerElement interface: objects.marker must inherit property "markerWidth" with the proper type +PASS SVGMarkerElement interface: objects.marker must inherit property "markerHeight" with the proper type +PASS SVGMarkerElement interface: objects.marker must inherit property "orientType" with the proper type +PASS SVGMarkerElement interface: objects.marker must inherit property "orientAngle" with the proper type +FAIL SVGMarkerElement interface: objects.marker must inherit property "orient" with the proper type assert_inherits: property "orient" not found in prototype chain +PASS SVGMarkerElement interface: objects.marker must inherit property "setOrientToAuto()" with the proper type +PASS SVGMarkerElement interface: objects.marker must inherit property "setOrientToAngle(SVGAngle)" with the proper type +PASS SVGMarkerElement interface: calling setOrientToAngle(SVGAngle) on objects.marker with too few arguments must throw TypeError +PASS SVGMarkerElement interface: objects.marker must inherit property "viewBox" with the proper type +PASS SVGMarkerElement interface: objects.marker must inherit property "preserveAspectRatio" with the proper type +PASS SVGElement interface: objects.marker must inherit property "className" with the proper type +PASS SVGElement interface: objects.marker must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.marker must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.marker must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.marker must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGGradientElement interface: existence and properties of interface object +PASS SVGGradientElement interface object length +PASS SVGGradientElement interface object name +PASS SVGGradientElement interface: existence and properties of interface prototype object +PASS SVGGradientElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGGradientElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGGradientElement interface: constant SVG_SPREADMETHOD_UNKNOWN on interface object +PASS SVGGradientElement interface: constant SVG_SPREADMETHOD_UNKNOWN on interface prototype object +PASS SVGGradientElement interface: constant SVG_SPREADMETHOD_PAD on interface object +PASS SVGGradientElement interface: constant SVG_SPREADMETHOD_PAD on interface prototype object +PASS SVGGradientElement interface: constant SVG_SPREADMETHOD_REFLECT on interface object +PASS SVGGradientElement interface: constant SVG_SPREADMETHOD_REFLECT on interface prototype object +PASS SVGGradientElement interface: constant SVG_SPREADMETHOD_REPEAT on interface object +PASS SVGGradientElement interface: constant SVG_SPREADMETHOD_REPEAT on interface prototype object +PASS SVGGradientElement interface: attribute gradientUnits +PASS Unscopable handled correctly for gradientUnits property on SVGGradientElement +PASS SVGGradientElement interface: attribute gradientTransform +PASS Unscopable handled correctly for gradientTransform property on SVGGradientElement +PASS SVGGradientElement interface: attribute spreadMethod +PASS Unscopable handled correctly for spreadMethod property on SVGGradientElement +PASS SVGGradientElement interface: attribute href +PASS Unscopable handled correctly for href property on SVGGradientElement +PASS SVGLinearGradientElement interface: existence and properties of interface object +PASS SVGLinearGradientElement interface object length +PASS SVGLinearGradientElement interface object name +PASS SVGLinearGradientElement interface: existence and properties of interface prototype object +PASS SVGLinearGradientElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGLinearGradientElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGLinearGradientElement interface: attribute x1 +PASS Unscopable handled correctly for x1 property on SVGLinearGradientElement +PASS SVGLinearGradientElement interface: attribute y1 +PASS Unscopable handled correctly for y1 property on SVGLinearGradientElement +PASS SVGLinearGradientElement interface: attribute x2 +PASS Unscopable handled correctly for x2 property on SVGLinearGradientElement +PASS SVGLinearGradientElement interface: attribute y2 +PASS Unscopable handled correctly for y2 property on SVGLinearGradientElement +PASS SVGLinearGradientElement must be primary interface of objects.linearGradient +PASS Stringification of objects.linearGradient +PASS SVGLinearGradientElement interface: objects.linearGradient must inherit property "x1" with the proper type +PASS SVGLinearGradientElement interface: objects.linearGradient must inherit property "y1" with the proper type +PASS SVGLinearGradientElement interface: objects.linearGradient must inherit property "x2" with the proper type +PASS SVGLinearGradientElement interface: objects.linearGradient must inherit property "y2" with the proper type +PASS SVGGradientElement interface: objects.linearGradient must inherit property "SVG_SPREADMETHOD_UNKNOWN" with the proper type +PASS SVGGradientElement interface: objects.linearGradient must inherit property "SVG_SPREADMETHOD_PAD" with the proper type +PASS SVGGradientElement interface: objects.linearGradient must inherit property "SVG_SPREADMETHOD_REFLECT" with the proper type +PASS SVGGradientElement interface: objects.linearGradient must inherit property "SVG_SPREADMETHOD_REPEAT" with the proper type +PASS SVGGradientElement interface: objects.linearGradient must inherit property "gradientUnits" with the proper type +PASS SVGGradientElement interface: objects.linearGradient must inherit property "gradientTransform" with the proper type +PASS SVGGradientElement interface: objects.linearGradient must inherit property "spreadMethod" with the proper type +PASS SVGGradientElement interface: objects.linearGradient must inherit property "href" with the proper type +PASS SVGElement interface: objects.linearGradient must inherit property "className" with the proper type +PASS SVGElement interface: objects.linearGradient must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.linearGradient must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.linearGradient must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.linearGradient must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGRadialGradientElement interface: existence and properties of interface object +PASS SVGRadialGradientElement interface object length +PASS SVGRadialGradientElement interface object name +PASS SVGRadialGradientElement interface: existence and properties of interface prototype object +PASS SVGRadialGradientElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGRadialGradientElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGRadialGradientElement interface: attribute cx +PASS Unscopable handled correctly for cx property on SVGRadialGradientElement +PASS SVGRadialGradientElement interface: attribute cy +PASS Unscopable handled correctly for cy property on SVGRadialGradientElement +PASS SVGRadialGradientElement interface: attribute r +PASS Unscopable handled correctly for r property on SVGRadialGradientElement +PASS SVGRadialGradientElement interface: attribute fx +PASS Unscopable handled correctly for fx property on SVGRadialGradientElement +PASS SVGRadialGradientElement interface: attribute fy +PASS Unscopable handled correctly for fy property on SVGRadialGradientElement +PASS SVGRadialGradientElement interface: attribute fr +PASS Unscopable handled correctly for fr property on SVGRadialGradientElement +PASS SVGRadialGradientElement must be primary interface of objects.radialGradient +PASS Stringification of objects.radialGradient +PASS SVGRadialGradientElement interface: objects.radialGradient must inherit property "cx" with the proper type +PASS SVGRadialGradientElement interface: objects.radialGradient must inherit property "cy" with the proper type +PASS SVGRadialGradientElement interface: objects.radialGradient must inherit property "r" with the proper type +PASS SVGRadialGradientElement interface: objects.radialGradient must inherit property "fx" with the proper type +PASS SVGRadialGradientElement interface: objects.radialGradient must inherit property "fy" with the proper type +PASS SVGRadialGradientElement interface: objects.radialGradient must inherit property "fr" with the proper type +PASS SVGGradientElement interface: objects.radialGradient must inherit property "SVG_SPREADMETHOD_UNKNOWN" with the proper type +PASS SVGGradientElement interface: objects.radialGradient must inherit property "SVG_SPREADMETHOD_PAD" with the proper type +PASS SVGGradientElement interface: objects.radialGradient must inherit property "SVG_SPREADMETHOD_REFLECT" with the proper type +PASS SVGGradientElement interface: objects.radialGradient must inherit property "SVG_SPREADMETHOD_REPEAT" with the proper type +PASS SVGGradientElement interface: objects.radialGradient must inherit property "gradientUnits" with the proper type +PASS SVGGradientElement interface: objects.radialGradient must inherit property "gradientTransform" with the proper type +PASS SVGGradientElement interface: objects.radialGradient must inherit property "spreadMethod" with the proper type +PASS SVGGradientElement interface: objects.radialGradient must inherit property "href" with the proper type +PASS SVGElement interface: objects.radialGradient must inherit property "className" with the proper type +PASS SVGElement interface: objects.radialGradient must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.radialGradient must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.radialGradient must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.radialGradient must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGStopElement interface: existence and properties of interface object +PASS SVGStopElement interface object length +PASS SVGStopElement interface object name +PASS SVGStopElement interface: existence and properties of interface prototype object +PASS SVGStopElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGStopElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGStopElement interface: attribute offset +PASS Unscopable handled correctly for offset property on SVGStopElement +PASS SVGStopElement must be primary interface of objects.stop +PASS Stringification of objects.stop +PASS SVGStopElement interface: objects.stop must inherit property "offset" with the proper type +PASS SVGElement interface: objects.stop must inherit property "className" with the proper type +PASS SVGElement interface: objects.stop must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.stop must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.stop must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.stop must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGPatternElement interface: existence and properties of interface object +PASS SVGPatternElement interface object length +PASS SVGPatternElement interface object name +PASS SVGPatternElement interface: existence and properties of interface prototype object +PASS SVGPatternElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGPatternElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGPatternElement interface: attribute patternUnits +PASS Unscopable handled correctly for patternUnits property on SVGPatternElement +PASS SVGPatternElement interface: attribute patternContentUnits +PASS Unscopable handled correctly for patternContentUnits property on SVGPatternElement +PASS SVGPatternElement interface: attribute patternTransform +PASS Unscopable handled correctly for patternTransform property on SVGPatternElement +PASS SVGPatternElement interface: attribute x +PASS Unscopable handled correctly for x property on SVGPatternElement +PASS SVGPatternElement interface: attribute y +PASS Unscopable handled correctly for y property on SVGPatternElement +PASS SVGPatternElement interface: attribute width +PASS Unscopable handled correctly for width property on SVGPatternElement +PASS SVGPatternElement interface: attribute height +PASS Unscopable handled correctly for height property on SVGPatternElement +PASS SVGPatternElement interface: attribute viewBox +PASS Unscopable handled correctly for viewBox property on SVGPatternElement +PASS SVGPatternElement interface: attribute preserveAspectRatio +PASS Unscopable handled correctly for preserveAspectRatio property on SVGPatternElement +PASS SVGPatternElement interface: attribute href +PASS Unscopable handled correctly for href property on SVGPatternElement +PASS SVGPatternElement must be primary interface of objects.pattern +PASS Stringification of objects.pattern +PASS SVGPatternElement interface: objects.pattern must inherit property "patternUnits" with the proper type +PASS SVGPatternElement interface: objects.pattern must inherit property "patternContentUnits" with the proper type +PASS SVGPatternElement interface: objects.pattern must inherit property "patternTransform" with the proper type +PASS SVGPatternElement interface: objects.pattern must inherit property "x" with the proper type +PASS SVGPatternElement interface: objects.pattern must inherit property "y" with the proper type +PASS SVGPatternElement interface: objects.pattern must inherit property "width" with the proper type +PASS SVGPatternElement interface: objects.pattern must inherit property "height" with the proper type +PASS SVGPatternElement interface: objects.pattern must inherit property "viewBox" with the proper type +PASS SVGPatternElement interface: objects.pattern must inherit property "preserveAspectRatio" with the proper type +PASS SVGPatternElement interface: objects.pattern must inherit property "href" with the proper type +PASS SVGElement interface: objects.pattern must inherit property "className" with the proper type +PASS SVGElement interface: objects.pattern must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.pattern must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.pattern must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.pattern must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGScriptElement interface: existence and properties of interface object +PASS SVGScriptElement interface object length +PASS SVGScriptElement interface object name +PASS SVGScriptElement interface: existence and properties of interface prototype object +PASS SVGScriptElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGScriptElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGScriptElement interface: attribute type +PASS Unscopable handled correctly for type property on SVGScriptElement +FAIL SVGScriptElement interface: attribute crossOrigin assert_true: The prototype object must have a property "crossOrigin" expected true got false +PASS Unscopable handled correctly for crossOrigin property on SVGScriptElement +PASS SVGScriptElement interface: attribute href +PASS Unscopable handled correctly for href property on SVGScriptElement +PASS SVGScriptElement must be primary interface of objects.script +PASS Stringification of objects.script +PASS SVGScriptElement interface: objects.script must inherit property "type" with the proper type +FAIL SVGScriptElement interface: objects.script must inherit property "crossOrigin" with the proper type assert_inherits: property "crossOrigin" not found in prototype chain +PASS SVGScriptElement interface: objects.script must inherit property "href" with the proper type +PASS SVGElement interface: objects.script must inherit property "className" with the proper type +PASS SVGElement interface: objects.script must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.script must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.script must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.script must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGAElement interface: existence and properties of interface object +PASS SVGAElement interface object length +PASS SVGAElement interface object name +PASS SVGAElement interface: existence and properties of interface prototype object +PASS SVGAElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGAElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGAElement interface: attribute target +PASS Unscopable handled correctly for target property on SVGAElement +FAIL SVGAElement interface: attribute download assert_true: The prototype object must have a property "download" expected true got false +PASS Unscopable handled correctly for download property on SVGAElement +FAIL SVGAElement interface: attribute rel assert_true: The prototype object must have a property "rel" expected true got false +PASS Unscopable handled correctly for rel property on SVGAElement +FAIL SVGAElement interface: attribute relList assert_true: The prototype object must have a property "relList" expected true got false +PASS Unscopable handled correctly for relList property on SVGAElement +FAIL SVGAElement interface: attribute hreflang assert_true: The prototype object must have a property "hreflang" expected true got false +PASS Unscopable handled correctly for hreflang property on SVGAElement +FAIL SVGAElement interface: attribute type assert_true: The prototype object must have a property "type" expected true got false +PASS Unscopable handled correctly for type property on SVGAElement +PASS SVGAElement interface: attribute href +PASS Unscopable handled correctly for href property on SVGAElement +PASS SVGAElement must be primary interface of objects.a +PASS Stringification of objects.a +PASS SVGAElement interface: objects.a must inherit property "target" with the proper type +FAIL SVGAElement interface: objects.a must inherit property "download" with the proper type assert_inherits: property "download" not found in prototype chain +FAIL SVGAElement interface: objects.a must inherit property "rel" with the proper type assert_inherits: property "rel" not found in prototype chain +FAIL SVGAElement interface: objects.a must inherit property "relList" with the proper type assert_inherits: property "relList" not found in prototype chain +FAIL SVGAElement interface: objects.a must inherit property "hreflang" with the proper type assert_inherits: property "hreflang" not found in prototype chain +FAIL SVGAElement interface: objects.a must inherit property "type" with the proper type assert_inherits: property "type" not found in prototype chain +PASS SVGAElement interface: objects.a must inherit property "href" with the proper type +PASS SVGGraphicsElement interface: objects.a must inherit property "transform" with the proper type +PASS SVGGraphicsElement interface: objects.a must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type +PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on objects.a with too few arguments must throw TypeError +PASS SVGGraphicsElement interface: objects.a must inherit property "getCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.a must inherit property "getScreenCTM()" with the proper type +PASS SVGGraphicsElement interface: objects.a must inherit property "requiredExtensions" with the proper type +PASS SVGGraphicsElement interface: objects.a must inherit property "systemLanguage" with the proper type +PASS SVGElement interface: objects.a must inherit property "className" with the proper type +PASS SVGElement interface: objects.a must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.a must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.a must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.a must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS SVGViewElement interface: existence and properties of interface object +PASS SVGViewElement interface object length +PASS SVGViewElement interface object name +PASS SVGViewElement interface: existence and properties of interface prototype object +PASS SVGViewElement interface: existence and properties of interface prototype object's "constructor" property +PASS SVGViewElement interface: existence and properties of interface prototype object's @@unscopables property +PASS SVGViewElement interface: attribute viewBox +PASS Unscopable handled correctly for viewBox property on SVGViewElement +PASS SVGViewElement interface: attribute preserveAspectRatio +PASS Unscopable handled correctly for preserveAspectRatio property on SVGViewElement +PASS SVGViewElement interface: constant SVG_ZOOMANDPAN_UNKNOWN on interface object +PASS SVGViewElement interface: constant SVG_ZOOMANDPAN_UNKNOWN on interface prototype object +PASS SVGViewElement interface: constant SVG_ZOOMANDPAN_DISABLE on interface object +PASS SVGViewElement interface: constant SVG_ZOOMANDPAN_DISABLE on interface prototype object +PASS SVGViewElement interface: constant SVG_ZOOMANDPAN_MAGNIFY on interface object +PASS SVGViewElement interface: constant SVG_ZOOMANDPAN_MAGNIFY on interface prototype object +PASS SVGViewElement interface: attribute zoomAndPan +PASS Unscopable handled correctly for zoomAndPan property on SVGViewElement +PASS SVGViewElement must be primary interface of objects.view +PASS Stringification of objects.view +PASS SVGViewElement interface: objects.view must inherit property "viewBox" with the proper type +PASS SVGViewElement interface: objects.view must inherit property "preserveAspectRatio" with the proper type +PASS SVGViewElement interface: objects.view must inherit property "SVG_ZOOMANDPAN_UNKNOWN" with the proper type +PASS SVGViewElement interface: objects.view must inherit property "SVG_ZOOMANDPAN_DISABLE" with the proper type +PASS SVGViewElement interface: objects.view must inherit property "SVG_ZOOMANDPAN_MAGNIFY" with the proper type +PASS SVGViewElement interface: objects.view must inherit property "zoomAndPan" with the proper type +PASS SVGElement interface: objects.view must inherit property "className" with the proper type +PASS SVGElement interface: objects.view must inherit property "ownerSVGElement" with the proper type +PASS SVGElement interface: objects.view must inherit property "viewportElement" with the proper type +FAIL SVGElement interface: objects.view must inherit property "correspondingElement" with the proper type assert_inherits: property "correspondingElement" not found in prototype chain +FAIL SVGElement interface: objects.view must inherit property "correspondingUseElement" with the proper type assert_inherits: property "correspondingUseElement" not found in prototype chain +PASS WorkerGlobalScope interface: existence and properties of interface object +PASS Document interface: attribute rootElement +PASS Unscopable handled correctly for rootElement property on Document +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/svg/idlharness.window.js b/third_party/WebKit/LayoutTests/external/wpt/svg/idlharness.window.js new file mode 100644 index 0000000..d71807a --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/svg/idlharness.window.js
@@ -0,0 +1,237 @@ +// META: script=/resources/WebIDLParser.js +// META: script=/resources/idlharness.js + +// https://svgwg.org/svg2-draft/ + +'use strict'; + +let objects = {}; + +const elements = [ + 'svg', + 'g', + 'defs', + 'Desc', + 'title', + 'symbol', + 'use', + 'image', + 'Switch', + 'style', + 'path', + 'rect', + 'circle', + 'ellipse', + 'line', + 'polyline', + 'polygon', + 'text', + 'tspan', + 'tref', + 'textPath', + 'altGlyph', + 'altGlyphDef', + 'altGlyphItem', + 'glyphRef', + 'marker', + 'colorProfile', + 'linearGradient', + 'radialGradient', + 'meshGradient', + 'stop', + 'pattern', + 'clipPath', + 'mask', + 'cursor', + 'a', + 'view', + 'script', + 'animate', + 'set', + 'animateMotion', + 'mPath', + 'animateColor', + 'animateColor', + 'animateTransform', + 'font', + 'glyph', + 'missingglyph', + 'khern', + 'vkern', + 'fontface', + 'fontfacesrc', + 'fontfaceuri', + 'fontfaceformat', + 'fontfacename', + 'metadata', + 'foreignObject', + 'filter', + 'feBlend', + 'feColorMatrix', + 'feComponentTransfer', + 'feFuncR', + 'feFuncG', + 'feFuncB', + 'feFuncA', + 'feComposite', + 'feConvolveMatrix', + 'feDiffuseLighting', + 'fePointLight', + 'feSpotLight', + 'feDisplacementMap', + 'feDropShadow', + 'feFlood', + 'feGaussianBlur', + 'feDisplacementMap', + 'feDropShadow', + 'feImage', + 'feMerge', + 'feMergeNode', + 'feMorphology', + 'feSpecularLighting', + 'feTile', + 'feTurbulence', +]; + +idl_test( + ['SVG'], + ['cssom', 'web-animations', 'html', 'dom'], + idlArray => { + const svgUrl = 'http://www.w3.org/2000/svg'; + for (const element of elements) { + try { + objects[element] = document.createElementNS(svgUrl, element); + } catch (e) { + // Will be surfaced by idlharess.js's test_object below. + } + } + + idlArray.add_untested_idls('interface CSSPseudoElement {};') + idlArray.add_objects({ + SVGAnimatedBoolean: ['objects.feConvolveMatrix.preserveAlpha'], + SVGAnimatedString: ['objects.a.target'], + SVGStringList: ['objects.a.requiredExtensions'], + SVGAnimatedEnumeration: ['objects.text.lengthAdjust'], + SVGAnimatedInteger: ['objects.feConvolveMatrix.orderX'], + SVGNumber: ['objects.svg.createSVGNumber()'], + SVGAnimatedNumber: ['objects.stop.offset'], + SVGNumberList: ['objects.text.rotate.baseVal'], + SVGAnimatedNumberList: ['objects.text.rotate'], + SVGLength: ['objects.svg.createSVGLength()'], + SVGAnimatedLength: ['objects.svg.x'], + SVGAnimatedLengthList: ['objects.text.x'], + SVGAngle: ['objects.svg.createSVGAngle()'], + SVGAnimatedAngle: ['objects.marker.orientAngle'], + SVGRect: ['objects.svg.createSVGRect()'], + SVGAnimatedRect: ['objects.svg.viewBox'], + SVGSVGElement: ['objects.svg'], + SVGGElement: ['objects.g'], + SVGDefsElement: ['objects.defs'], + SVGDescElement: ['objects.Desc'], + SVGTitleElement: ['objects.title'], + SVGSymbolElement: ['objects.symbol'], + SVGUseElement: ['objects.use'], + SVGImageElement: ['objects.image'], + SVGSwitchElement: ['objects.Switch'], + SVGStyleElement: ['objects.style'], + SVGPoint: ['objects.svg.createSVGPoint()'], + SVGPointList: ['objects.polygon.points'], + SVGMatrix: ['objects.svg.createSVGMatrix()'], + SVGTransform: ['objects.svg.createSVGTransform()'], + SVGTransformList: ['objects.pattern.patternTransform.baseVal'], + SVGAnimatedTransformList: ['objects.pattern.patternTransform'], + SVGPreserveAspectRatio: ['objects.image.preserveAspectRatio.baseVal'], + SVGAnimatedPreserveAspectRatio: ['objects.image.preserveAspectRatio'], + SVGPathSegClosePath: ['objects.path.createSVGPathSegClosePath()'], + SVGPathSegMovetoAbs: ['objects.path.createSVGPathSegMovetoAbs(0,0)'], + SVGPathSegMovetoRel: ['objects.path.createSVGPathSegMovetoRel(0,0)'], + SVGPathSegLinetoAbs: ['objects.path.createSVGPathSegLinetoAbs(0,0)'], + SVGPathSegLinetoRel: ['objects.path.createSVGPathSegLinetoRel(0,0)'], + SVGPathSegCurvetoCubicAbs: ['objects.path.createSVGPathSegCurvetoCubicAbs(0,0,0,0,0,0)'], + SVGPathSegCurvetoCubicRel: ['objects.path.createSVGPathSegCurvetoCubicRel(0,0,0,0,0,0)'], + SVGPathSegCurvetoQuadraticAbs: ['objects.path.createSVGPathSegCurvetoQuadraticAbs(0,0,0,0)'], + SVGPathSegCurvetoQuadraticRel: ['objects.path.createSVGPathSegCurvetoQuadraticRel(0,0,0,0)'], + SVGPathSegArcAbs: ['objects.path.createSVGPathSegArcAbs(0,0,0,0,0,true,true)'], + SVGPathSegArcRel: ['objects.path.createSVGPathSegArcRel(0,0,0,0,0,true,true)'], + SVGPathSegLinetoHorizontalAbs: ['objects.path.createSVGPathSegLinetoHorizontalAbs(0)'], + SVGPathSegLinetoHorizontalRel: ['objects.path.createSVGPathSegLinetoHorizontalRel(0)'], + SVGPathSegLinetoVerticalAbs: ['objects.path.createSVGPathSegLinetoVerticalAbs(0)'], + SVGPathSegLinetoVerticalRel: ['objects.path.createSVGPathSegLinetoVerticalRel(0)'], + SVGPathSegCurvetoCubicSmoothAbs: ['objects.path.createSVGPathSegCurvetoCubicSmoothAbs(0,0,0,0)'], + SVGPathSegCurvetoCubicSmoothRel: ['objects.path.createSVGPathSegCurvetoCubicSmoothRel(0,0,0,0)'], + SVGPathSegCurvetoQuadraticSmoothAbs: ['objects.path.createSVGPathSegCurvetoQuadraticSmoothAbs(0,0)'], + SVGPathSegCurvetoQuadraticSmoothRel: ['objects.path.createSVGPathSegCurvetoQuadraticSmoothRel(0,0)'], + SVGPathSegList: ['objects.path.pathSegList'], + SVGPathElement: ['objects.path'], + SVGRectElement: ['objects.rect'], + SVGCircleElement: ['objects.circle'], + SVGEllipseElement: ['objects.ellipse'], + SVGLineElement: ['objects.line'], + SVGPolylineElement: ['objects.polyline'], + SVGPolygonElement: ['objects.polygon'], + SVGTextElement: ['objects.text'], + SVGTSpanElement: ['objects.tspan'], + SVGTRefElement: ['objects.tref'], + SVGTextPathElement: ['objects.textPath'], + SVGAltGlyphElement: ['objects.altGlyph'], + SVGAltGlyphDefElement: ['objects.altGlyphDef'], + SVGAltGlyphItemElement: ['objects.altGlyphItem'], + SVGGlyphRefElement: ['objects.glyphRef'], + SVGMarkerElement: ['objects.marker'], + SVGColorProfileElement: ['objects.colorProfile'], + SVGLinearGradientElement: ['objects.linearGradient'], + SVGRadialGradientElement: ['objects.radialGradient'], + SVGMeshGradientElement: ['objects.meshGradient'], + SVGStopElement: ['objects.stop'], + SVGPatternElement: ['objects.pattern'], + SVGClipPathElement: ['objects.clipPath'], + SVGMaskElement: ['objects.mask'], + SVGCursorElement: ['objects.cursor'], + SVGAElement: ['objects.a'], + SVGViewElement: ['objects.view'], + SVGScriptElement: ['objects.script'], + SVGAnimateElement: ['objects.animate'], + SVGSetElement: ['objects.set'], + SVGAnimateMotionElement: ['objects.animateMotion'], + SVGMPathElement: ['objects.mPath'], + SVGAnimateColorElement: ['objects.animateColor'], + SVGAnimateTransformElement: ['objects.animateTransform'], + SVGFontElement: ['objects.font'], + SVGGlyphElement: ['objects.glyph'], + SVGMissingGlyphElement: ['objects.missingglyph'], + SVGHKernElement: ['objects.hkern'], + SVGVKernElement: ['objects.vkern'], + SVGFontFaceElement: ['objects.fontface'], + SVGFontFaceSrcElement: ['objects.fontfacesrc'], + SVGFontFaceUriElement: ['objects.fontfaceuri'], + SVGFontFaceFormatElement: ['objects.fontfaceformat'], + SVGMetadataElement: ['objects.metadata'], + SVGForeignObjectElement: ['objects.foreignObject'], + SVGFilterElement: ['objects.filter'], + SVGFEBlendElement: ['objects.feBlend'], + SVGFEColorMatrixElement: ['objects.feColorMatrix'], + SVGFEComponentTransferElement: ['objects.feComponentTransfer'], + SVGFEFuncRElement: ['objects.feFuncR'], + SVGFEFuncGElement: ['objects.feFuncG'], + SVGFEFuncBElement: ['objects.feFuncB'], + SVGFEFuncAElement: ['objects.feFuncA'], + SVGFECompositeElement: ['objects.feComposite'], + SVGFEConvolveMatrixElement: ['objects.feConvolveMatrix'], + SVGFEDiffuseLightingElement: ['objects.feDiffuseLighting'], + SVGFEPointLightElement: ['objects.fePointLight'], + SVGFESpotLightElement: ['objects.feSpotLight'], + SVGFEDisplacementMapElement: ['objects.feDisplacementMap'], + SVGFEDropShadowElement: ['objects.feDropShadow'], + SVGFEFloodElement: ['objects.feFlood'], + SVGFEGaussianBlurElement: ['objects.feGaussianBlur'], + SVGFEImageElement: ['objects.feImage'], + SVGFEMergeElement: ['objects.feMerge'], + SVGFEMergeNodeElement: ['objects.feMergeNode'], + SVGFEMorphologyElement: ['objects.feMorphology'], + SVGFESpecularLightingElement: ['objects.feSpecularLighting'], + SVGFETileElement: ['objects.feTile'], + SVGFETurbulenceElement: ['objects.feTurbulence'] + }); + }, + 'SVG interfaces' +);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/svg/interfaces.html b/third_party/WebKit/LayoutTests/external/wpt/svg/interfaces.html deleted file mode 100644 index 698e6e7..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/svg/interfaces.html +++ /dev/null
@@ -1,1550 +0,0 @@ -<!doctype html> -<title>SVG interface tests</title> -<meta name=timeout content=long> -<div id=log></div> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/resources/WebIDLParser.js></script> -<script src=/resources/idlharness.js></script> -<script type=text/plain id=untested_idl> -interface EventTarget {}; -interface Node : EventTarget {}; -interface Document : Node {}; -interface ProcessingInstruction : Node {}; -interface Element : Node {}; -interface HTMLElement : Element {}; -[Global=Window, Exposed=Window] interface Window {}; - -// Just need to know that DOMStringMap exists; its details are tested elsewhere. -interface DOMStringMap { }; - -[TreatNonObjectAsNull] -callback EventHandlerNonNull = any (Event event); -typedef EventHandlerNonNull? EventHandler; - -[TreatNonObjectAsNull] -callback OnErrorEventHandlerNonNull = any ((Event or DOMString) event, optional DOMString source, optional unsigned long lineno, optional unsigned long column, optional any error); -typedef OnErrorEventHandlerNonNull? OnErrorEventHandler; - -[TreatNonObjectAsNull] -callback OnBeforeUnloadEventHandlerNonNull = DOMString? (Event event); -typedef OnBeforeUnloadEventHandlerNonNull? OnBeforeUnloadEventHandler; - -[NoInterfaceObject] -interface GlobalEventHandlers { - attribute EventHandler onabort; - attribute EventHandler onautocomplete; - attribute EventHandler onautocompleteerror; - attribute EventHandler onblur; - attribute EventHandler oncancel; - attribute EventHandler oncanplay; - attribute EventHandler oncanplaythrough; - attribute EventHandler onchange; - attribute EventHandler onclick; - attribute EventHandler onclose; - attribute EventHandler oncontextmenu; - attribute EventHandler oncuechange; - attribute EventHandler ondblclick; - attribute EventHandler ondrag; - attribute EventHandler ondragend; - attribute EventHandler ondragenter; - attribute EventHandler ondragexit; - attribute EventHandler ondragleave; - attribute EventHandler ondragover; - attribute EventHandler ondragstart; - attribute EventHandler ondrop; - attribute EventHandler ondurationchange; - attribute EventHandler onemptied; - attribute EventHandler onended; - attribute OnErrorEventHandler onerror; - attribute EventHandler onfocus; - attribute EventHandler oninput; - attribute EventHandler oninvalid; - attribute EventHandler onkeydown; - attribute EventHandler onkeypress; - attribute EventHandler onkeyup; - attribute EventHandler onload; - attribute EventHandler onloadeddata; - attribute EventHandler onloadedmetadata; - attribute EventHandler onloadstart; - attribute EventHandler onmousedown; - [LenientThis] attribute EventHandler onmouseenter; - [LenientThis] attribute EventHandler onmouseleave; - attribute EventHandler onmousemove; - attribute EventHandler onmouseout; - attribute EventHandler onmouseover; - attribute EventHandler onmouseup; - attribute EventHandler onwheel; - attribute EventHandler onpause; - attribute EventHandler onplay; - attribute EventHandler onplaying; - attribute EventHandler onprogress; - attribute EventHandler onratechange; - attribute EventHandler onreset; - attribute EventHandler onresize; - attribute EventHandler onscroll; - attribute EventHandler onseeked; - attribute EventHandler onseeking; - attribute EventHandler onselect; - attribute EventHandler onshow; - attribute EventHandler onsort; - attribute EventHandler onstalled; - attribute EventHandler onsubmit; - attribute EventHandler onsuspend; - attribute EventHandler ontimeupdate; - attribute EventHandler ontoggle; - attribute EventHandler onvolumechange; - attribute EventHandler onwaiting; -}; - -[NoInterfaceObject] -interface WindowEventHandlers { - attribute EventHandler onafterprint; - attribute EventHandler onbeforeprint; - attribute OnBeforeUnloadEventHandler onbeforeunload; - attribute EventHandler onhashchange; - attribute EventHandler onlanguagechange; - attribute EventHandler onmessage; - attribute EventHandler onoffline; - attribute EventHandler ononline; - attribute EventHandler onpagehide; - attribute EventHandler onpageshow; - attribute EventHandler onpopstate; - attribute EventHandler onrejectionhandled; - attribute EventHandler onstorage; - attribute EventHandler onunhandledrejection; - attribute EventHandler onunload; -}; - -[NoInterfaceObject]interface LinkStyle { - readonly attribute StyleSheet? sheet; -}; - - -[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0, - optional unrestricted double z = 0, optional unrestricted double w = 1), - Exposed=(Window,Worker)] -interface DOMPointReadOnly { - [NewObject] static DOMPointReadOnly fromPoint(optional DOMPointInit point); - - readonly attribute unrestricted double x; - readonly attribute unrestricted double y; - readonly attribute unrestricted double z; - readonly attribute unrestricted double w; - - DOMPoint matrixTransform(optional DOMMatrixInit matrix); -}; - -[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0, - optional unrestricted double z = 0, optional unrestricted double w = 1), - Exposed=(Window,Worker)] -interface DOMPoint : DOMPointReadOnly { - [NewObject] static DOMPoint fromPoint(optional DOMPointInit other); - - inherit attribute unrestricted double x; - inherit attribute unrestricted double y; - inherit attribute unrestricted double z; - inherit attribute unrestricted double w; -}; - -dictionary DOMPointInit { - unrestricted double x = 0; - unrestricted double y = 0; - unrestricted double z = 0; - unrestricted double w = 1; -}; - -[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0, - optional unrestricted double width = 0, optional unrestricted double height = 0), - Exposed=(Window,Worker)] -interface DOMRectReadOnly { - [NewObject] static DOMRectReadOnly fromRect(optional DOMRectInit other); - - readonly attribute unrestricted double x; - readonly attribute unrestricted double y; - readonly attribute unrestricted double width; - readonly attribute unrestricted double height; - readonly attribute unrestricted double top; - readonly attribute unrestricted double right; - readonly attribute unrestricted double bottom; - readonly attribute unrestricted double left; -}; - -[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0, - optional unrestricted double width = 0, optional unrestricted double height = 0), - Exposed=(Window,Worker)] -interface DOMRect : DOMRectReadOnly { - [NewObject] static DOMRect fromRect(optional DOMRectInit other); - - inherit attribute unrestricted double x; - inherit attribute unrestricted double y; - inherit attribute unrestricted double width; - inherit attribute unrestricted double height; -}; - -dictionary DOMRectInit { - unrestricted double x = 0; - unrestricted double y = 0; - unrestricted double width = 0; - unrestricted double height = 0; -}; - -[Constructor(sequence<unrestricted double> numberSequence), - Exposed=(Window,Worker)] -interface DOMMatrixReadOnly { - [NewObject] static DOMMatrixReadOnly fromMatrix(optional DOMMatrixInit other); - [NewObject] static DOMMatrixReadOnly fromString(DOMString transformList); - [NewObject] static DOMMatrixReadOnly fromFloat32Array(Float32Array array32); - [NewObject] static DOMMatrixReadOnly fromFloat64Array(Float64Array array64); - - // These attributes are simple aliases for certain elements of the 4x4 matrix - readonly attribute unrestricted double a; - readonly attribute unrestricted double b; - readonly attribute unrestricted double c; - readonly attribute unrestricted double d; - readonly attribute unrestricted double e; - readonly attribute unrestricted double f; - - readonly attribute unrestricted double m11; - readonly attribute unrestricted double m12; - readonly attribute unrestricted double m13; - readonly attribute unrestricted double m14; - readonly attribute unrestricted double m21; - readonly attribute unrestricted double m22; - readonly attribute unrestricted double m23; - readonly attribute unrestricted double m24; - readonly attribute unrestricted double m31; - readonly attribute unrestricted double m32; - readonly attribute unrestricted double m33; - readonly attribute unrestricted double m34; - readonly attribute unrestricted double m41; - readonly attribute unrestricted double m42; - readonly attribute unrestricted double m43; - readonly attribute unrestricted double m44; - - readonly attribute boolean is2D; - readonly attribute boolean isIdentity; - - // Immutable transform methods - DOMMatrix translate(unrestricted double tx, - unrestricted double ty, - optional unrestricted double tz = 0); - DOMMatrix scale(unrestricted double scale, - optional unrestricted double originX = 0, - optional unrestricted double originY = 0); - DOMMatrix scale3d(unrestricted double scale, - optional unrestricted double originX = 0, - optional unrestricted double originY = 0, - optional unrestricted double originZ = 0); - DOMMatrix scaleNonUniform(unrestricted double scaleX, - optional unrestricted double scaleY = 1, - optional unrestricted double scaleZ = 1, - optional unrestricted double originX = 0, - optional unrestricted double originY = 0, - optional unrestricted double originZ = 0); - DOMMatrix rotate(unrestricted double angle, - optional unrestricted double originX = 0, - optional unrestricted double originY = 0); - DOMMatrix rotateFromVector(unrestricted double x, - unrestricted double y); - DOMMatrix rotateAxisAngle(unrestricted double x, - unrestricted double y, - unrestricted double z, - unrestricted double angle); - DOMMatrix skewX(unrestricted double sx); - DOMMatrix skewY(unrestricted double sy); - DOMMatrix multiply(optional DOMMatrixInit other); - DOMMatrix flipX(); - DOMMatrix flipY(); - DOMMatrix inverse(); - - DOMPoint transformPoint(optional DOMPointInit point); - Float32Array toFloat32Array(); - Float64Array toFloat64Array(); - stringifier; -}; - -[Constructor(sequence<unrestricted double> numberSequence), - Exposed=(Window,Worker)] -interface DOMMatrix : DOMMatrixReadOnly { - [NewObject] static DOMMatrix fromMatrix(optional DOMMatrixInit other); - [NewObject] static DOMMatrix fromString(DOMString transformList); - [NewObject] static DOMMatrix fromFloat32Array(Float32Array array32); - [NewObject] static DOMMatrix fromFloat64Array(Float64Array array64); - - // These attributes are simple aliases for certain elements of the 4x4 matrix - inherit attribute unrestricted double a; - inherit attribute unrestricted double b; - inherit attribute unrestricted double c; - inherit attribute unrestricted double d; - inherit attribute unrestricted double e; - inherit attribute unrestricted double f; - - inherit attribute unrestricted double m11; - inherit attribute unrestricted double m12; - inherit attribute unrestricted double m13; - inherit attribute unrestricted double m14; - inherit attribute unrestricted double m21; - inherit attribute unrestricted double m22; - inherit attribute unrestricted double m23; - inherit attribute unrestricted double m24; - inherit attribute unrestricted double m31; - inherit attribute unrestricted double m32; - inherit attribute unrestricted double m33; - inherit attribute unrestricted double m34; - inherit attribute unrestricted double m41; - inherit attribute unrestricted double m42; - inherit attribute unrestricted double m43; - inherit attribute unrestricted double m44; - - // Mutable transform methods - DOMMatrix multiplySelf(optional DOMMatrixInit other); - DOMMatrix preMultiplySelf(optional DOMMatrixInit other); - DOMMatrix translateSelf(unrestricted double tx, - unrestricted double ty, - optional unrestricted double tz = 0); - DOMMatrix scaleSelf(unrestricted double scale, - optional unrestricted double originX = 0, - optional unrestricted double originY = 0); - DOMMatrix scale3dSelf(unrestricted double scale, - optional unrestricted double originX = 0, - optional unrestricted double originY = 0, - optional unrestricted double originZ = 0); - DOMMatrix scaleNonUniformSelf(unrestricted double scaleX, - optional unrestricted double scaleY = 1, - optional unrestricted double scaleZ = 1, - optional unrestricted double originX = 0, - optional unrestricted double originY = 0, - optional unrestricted double originZ = 0); - DOMMatrix rotateSelf(unrestricted double angle, - optional unrestricted double originX = 0, - optional unrestricted double originY = 0); - DOMMatrix rotateFromVectorSelf(unrestricted double x, - unrestricted double y); - DOMMatrix rotateAxisAngleSelf(unrestricted double x, - unrestricted double y, - unrestricted double z, - unrestricted double angle); - DOMMatrix skewXSelf(unrestricted double sx); - DOMMatrix skewYSelf(unrestricted double sy); - DOMMatrix invertSelf(); - - DOMMatrix setMatrixValue(DOMString transformList); -}; - -dictionary DOMMatrixInit { - unrestricted double a; - unrestricted double b; - unrestricted double c; - unrestricted double d; - unrestricted double e; - unrestricted double f; - unrestricted double m11; - unrestricted double m12; - unrestricted double m13 = 0; - unrestricted double m14 = 0; - unrestricted double m21; - unrestricted double m22; - unrestricted double m23 = 0; - unrestricted double m24 = 0; - unrestricted double m31 = 0; - unrestricted double m32 = 0; - unrestricted double m33 = 1; - unrestricted double m34 = 0; - unrestricted double m41; - unrestricted double m42; - unrestricted double m43 = 0; - unrestricted double m44 = 1; - boolean is2D; -}; -</script> -<script type=text/plain id=idl> -interface SVGElement : Element { - - [SameObject] readonly attribute SVGAnimatedString className; - [SameObject] readonly attribute DOMStringMap dataset; - - readonly attribute SVGSVGElement? ownerSVGElement; - readonly attribute SVGElement? viewportElement; - - attribute long tabIndex; - void focus(); - void blur(); -}; - -SVGElement implements GlobalEventHandlers; - -dictionary SVGBoundingBoxOptions { - boolean fill = true; - boolean stroke = false; - boolean markers = false; - boolean clipped = false; -}; - -interface SVGGraphicsElement : SVGElement { - [SameObject] readonly attribute SVGAnimatedTransformList transform; - - DOMRect getBBox(optional SVGBoundingBoxOptions options); - DOMMatrix? getCTM(); - DOMMatrix? getScreenCTM(); -}; - -SVGGraphicsElement implements SVGTests; - -interface SVGGeometryElement : SVGGraphicsElement { - [SameObject] readonly attribute SVGAnimatedNumber pathLength; - - boolean isPointInFill(DOMPoint point); - boolean isPointInStroke(DOMPoint point); - float getTotalLength(); - DOMPoint getPointAtLength(float distance); -}; - -interface SVGNumber { - attribute float value; -}; - -interface SVGLength { - - // Length Unit Types - const unsigned short SVG_LENGTHTYPE_UNKNOWN = 0; - const unsigned short SVG_LENGTHTYPE_NUMBER = 1; - const unsigned short SVG_LENGTHTYPE_PERCENTAGE = 2; - const unsigned short SVG_LENGTHTYPE_EMS = 3; - const unsigned short SVG_LENGTHTYPE_EXS = 4; - const unsigned short SVG_LENGTHTYPE_PX = 5; - const unsigned short SVG_LENGTHTYPE_CM = 6; - const unsigned short SVG_LENGTHTYPE_MM = 7; - const unsigned short SVG_LENGTHTYPE_IN = 8; - const unsigned short SVG_LENGTHTYPE_PT = 9; - const unsigned short SVG_LENGTHTYPE_PC = 10; - - readonly attribute unsigned short unitType; - attribute float value; - attribute float valueInSpecifiedUnits; - attribute DOMString valueAsString; - - void newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits); - void convertToSpecifiedUnits(unsigned short unitType); -}; - -interface SVGAngle { - - // Angle Unit Types - const unsigned short SVG_ANGLETYPE_UNKNOWN = 0; - const unsigned short SVG_ANGLETYPE_UNSPECIFIED = 1; - const unsigned short SVG_ANGLETYPE_DEG = 2; - const unsigned short SVG_ANGLETYPE_RAD = 3; - const unsigned short SVG_ANGLETYPE_GRAD = 4; - - readonly attribute unsigned short unitType; - attribute float value; - attribute float valueInSpecifiedUnits; - attribute DOMString valueAsString; - - void newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits); - void convertToSpecifiedUnits(unsigned short unitType); -}; - -interface SVGNumberList { - - readonly attribute unsigned long length; - readonly attribute unsigned long numberOfItems; - - void clear(); - SVGNumber initialize(SVGNumber newItem); - getter SVGNumber getItem(unsigned long index); - SVGNumber insertItemBefore(SVGNumber newItem, unsigned long index); - SVGNumber replaceItem(SVGNumber newItem, unsigned long index); - SVGNumber removeItem(unsigned long index); - SVGNumber appendItem(SVGNumber newItem); - setter void (unsigned long index, SVGNumber newItem); -}; - -interface SVGLengthList { - - readonly attribute unsigned long length; - readonly attribute unsigned long numberOfItems; - - void clear(); - SVGLength initialize(SVGLength newItem); - getter SVGLength getItem(unsigned long index); - SVGLength insertItemBefore(SVGLength newItem, unsigned long index); - SVGLength replaceItem(SVGLength newItem, unsigned long index); - SVGLength removeItem(unsigned long index); - SVGLength appendItem(SVGLength newItem); - setter void (unsigned long index, SVGLength newItem); -}; - -interface SVGAnimatedBoolean { - attribute boolean baseVal; - readonly attribute boolean animVal; -}; - -interface SVGAnimatedEnumeration { - attribute unsigned short baseVal; - readonly attribute unsigned short animVal; -}; - -interface SVGAnimatedInteger { - attribute long baseVal; - readonly attribute long animVal; -}; - -interface SVGAnimatedNumber { - attribute float baseVal; - readonly attribute float animVal; -}; - -interface SVGAnimatedLength { - [SameObject] readonly attribute SVGLength baseVal; - [SameObject] readonly attribute SVGLength animVal; -}; - -interface SVGAnimatedAngle { - [SameObject] readonly attribute SVGAngle baseVal; - [SameObject] readonly attribute SVGAngle animVal; -}; - -interface SVGAnimatedString { - attribute DOMString baseVal; - readonly attribute DOMString animVal; -}; - -interface SVGAnimatedRect { - [SameObject] readonly attribute DOMRect baseVal; - [SameObject] readonly attribute DOMRectReadOnly animVal; -}; - -interface SVGAnimatedNumberList { - [SameObject] readonly attribute SVGNumberList baseVal; - [SameObject] readonly attribute SVGNumberList animVal; -}; - -interface SVGAnimatedLengthList { - [SameObject] readonly attribute SVGLengthList baseVal; - [SameObject] readonly attribute SVGLengthList animVal; -}; - -interface SVGStringList { - - readonly attribute unsigned long length; - readonly attribute unsigned long numberOfItems; - - void clear(); - DOMString initialize(DOMString newItem); - getter DOMString getItem(unsigned long index); - DOMString insertItemBefore(DOMString newItem, unsigned long index); - DOMString replaceItem(DOMString newItem, unsigned long index); - DOMString removeItem(unsigned long index); - DOMString appendItem(DOMString newItem); - setter void (unsigned long index, DOMString newItem); -}; - -interface SVGUnitTypes { - // Unit Types - const unsigned short SVG_UNIT_TYPE_UNKNOWN = 0; - const unsigned short SVG_UNIT_TYPE_USERSPACEONUSE = 1; - const unsigned short SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2; -}; - -[NoInterfaceObject] -interface SVGTests { - [SameObject] readonly attribute SVGStringList requiredExtensions; - [SameObject] readonly attribute SVGStringList systemLanguage; -}; - -[NoInterfaceObject] -interface SVGFitToViewBox { - [SameObject] readonly attribute SVGAnimatedRect viewBox; - [SameObject] readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio; -}; - -[NoInterfaceObject] -interface SVGZoomAndPan { - - // Zoom and Pan Types - const unsigned short SVG_ZOOMANDPAN_UNKNOWN = 0; - const unsigned short SVG_ZOOMANDPAN_DISABLE = 1; - const unsigned short SVG_ZOOMANDPAN_MAGNIFY = 2; - - attribute unsigned short zoomAndPan; -}; - -[NoInterfaceObject] -interface SVGURIReference { - [SameObject] readonly attribute SVGAnimatedString href; -}; - -partial interface Document { - readonly attribute SVGSVGElement? rootElement; -}; - -interface SVGSVGElement : SVGGraphicsElement { - - [SameObject] readonly attribute SVGAnimatedLength x; - [SameObject] readonly attribute SVGAnimatedLength y; - [SameObject] readonly attribute SVGAnimatedLength width; - [SameObject] readonly attribute SVGAnimatedLength height; - - attribute float currentScale; - [SameObject] readonly attribute DOMPointReadOnly currentTranslate; - - NodeList getIntersectionList(DOMRectReadOnly rect, SVGElement? referenceElement); - NodeList getEnclosureList(DOMRectReadOnly rect, SVGElement? referenceElement); - boolean checkIntersection(SVGElement element, DOMRectReadOnly rect); - boolean checkEnclosure(SVGElement element, DOMRectReadOnly rect); - - void deselectAll(); - - SVGNumber createSVGNumber(); - SVGLength createSVGLength(); - SVGAngle createSVGAngle(); - DOMPoint createSVGPoint(); - DOMMatrix createSVGMatrix(); - DOMRect createSVGRect(); - SVGTransform createSVGTransform(); - SVGTransform createSVGTransformFromMatrix(DOMMatrixReadOnly matrix); - - // Deprecated methods that have no effect when called, - // but which are kept for compatibility reasons. - unsigned long suspendRedraw(unsigned long maxWaitMilliseconds); - void unsuspendRedraw(unsigned long suspendHandleID); - void unsuspendRedrawAll(); - void forceRedraw(); -}; - -SVGSVGElement implements SVGFitToViewBox; -SVGSVGElement implements SVGZoomAndPan; -SVGSVGElement implements WindowEventHandlers; - -interface SVGGElement : SVGGraphicsElement { -}; - -interface SVGUnknownElement : SVGGraphicsElement { -}; - -interface SVGDefsElement : SVGGraphicsElement { -}; - -interface SVGDescElement : SVGElement { -}; - -interface SVGMetadataElement : SVGElement { -}; - -interface SVGTitleElement : SVGElement { -}; - -interface SVGSymbolElement : SVGElement { -}; - -SVGSymbolElement implements SVGFitToViewBox; - -interface SVGUseElement : SVGGraphicsElement { - [SameObject] readonly attribute SVGAnimatedLength x; - [SameObject] readonly attribute SVGAnimatedLength y; - [SameObject] readonly attribute SVGAnimatedLength width; - [SameObject] readonly attribute SVGAnimatedLength height; -}; - -SVGUseElement implements SVGURIReference; - -interface SVGSwitchElement : SVGGraphicsElement { -}; - -[NoInterfaceObject] -interface GetSVGDocument { - Document getSVGDocument(); -}; - -interface SVGStyleElement : SVGElement { - attribute DOMString type; - attribute DOMString media; - attribute DOMString title; -}; - -SVGStyleElement implements LinkStyle; - -interface SVGTransform { - - // Transform Types - const unsigned short SVG_TRANSFORM_UNKNOWN = 0; - const unsigned short SVG_TRANSFORM_MATRIX = 1; - const unsigned short SVG_TRANSFORM_TRANSLATE = 2; - const unsigned short SVG_TRANSFORM_SCALE = 3; - const unsigned short SVG_TRANSFORM_ROTATE = 4; - const unsigned short SVG_TRANSFORM_SKEWX = 5; - const unsigned short SVG_TRANSFORM_SKEWY = 6; - - readonly attribute unsigned short type; - [SameObject] readonly attribute DOMMatrix matrix; - readonly attribute float angle; - - void setMatrix(DOMMatrixReadOnly matrix); - void setTranslate(float tx, float ty); - void setScale(float sx, float sy); - void setRotate(float angle, float cx, float cy); - void setSkewX(float angle); - void setSkewY(float angle); -}; - -interface SVGTransformList { - - readonly attribute unsigned long length; - readonly attribute unsigned long numberOfItems; - - void clear(); - SVGTransform initialize(SVGTransform newItem); - getter SVGTransform getItem(unsigned long index); - SVGTransform insertItemBefore(SVGTransform newItem, unsigned long index); - SVGTransform replaceItem(SVGTransform newItem, unsigned long index); - SVGTransform removeItem(unsigned long index); - SVGTransform appendItem(SVGTransform newItem); - setter void (unsigned long index, SVGTransform newItem); - - // Additional methods not common to other list interfaces. - SVGTransform createSVGTransformFromMatrix(DOMMatrixReadOnly matrix); - SVGTransform? consolidate(); -}; - -interface SVGAnimatedTransformList { - [SameObject] readonly attribute SVGTransformList baseVal; - [SameObject] readonly attribute SVGTransformList animVal; -}; - -interface SVGPreserveAspectRatio { - - // Alignment Types - const unsigned short SVG_PRESERVEASPECTRATIO_UNKNOWN = 0; - const unsigned short SVG_PRESERVEASPECTRATIO_NONE = 1; - const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMIN = 2; - const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3; - const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4; - const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMID = 5; - const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMID = 6; - const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMID = 7; - const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMAX = 8; - const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9; - const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10; - - // Meet-or-slice Types - const unsigned short SVG_MEETORSLICE_UNKNOWN = 0; - const unsigned short SVG_MEETORSLICE_MEET = 1; - const unsigned short SVG_MEETORSLICE_SLICE = 2; - - attribute unsigned short align; - attribute unsigned short meetOrSlice; -}; - -interface SVGAnimatedPreserveAspectRatio { - [SameObject] readonly attribute SVGPreserveAspectRatio baseVal; - [SameObject] readonly attribute SVGPreserveAspectRatio animVal; -}; - -interface SVGPathElement : SVGGeometryElement { -}; - -interface SVGRectElement : SVGGeometryElement { - [SameObject] readonly attribute SVGAnimatedLength x; - [SameObject] readonly attribute SVGAnimatedLength y; - [SameObject] readonly attribute SVGAnimatedLength width; - [SameObject] readonly attribute SVGAnimatedLength height; - [SameObject] readonly attribute SVGAnimatedLength rx; - [SameObject] readonly attribute SVGAnimatedLength ry; -}; - -interface SVGCircleElement : SVGGeometryElement { - [SameObject] readonly attribute SVGAnimatedLength cx; - [SameObject] readonly attribute SVGAnimatedLength cy; - [SameObject] readonly attribute SVGAnimatedLength r; -}; - -interface SVGEllipseElement : SVGGeometryElement { - [SameObject] readonly attribute SVGAnimatedLength cx; - [SameObject] readonly attribute SVGAnimatedLength cy; - [SameObject] readonly attribute SVGAnimatedLength rx; - [SameObject] readonly attribute SVGAnimatedLength ry; -}; - -interface SVGLineElement : SVGGeometryElement { - [SameObject] readonly attribute SVGAnimatedLength x1; - [SameObject] readonly attribute SVGAnimatedLength y1; - [SameObject] readonly attribute SVGAnimatedLength x2; - [SameObject] readonly attribute SVGAnimatedLength y2; -}; - -[NoInterfaceObject] -interface SVGAnimatedPoints { - [SameObject] readonly attribute SVGPointList points; - [SameObject] readonly attribute SVGPointList animatedPoints; -}; - -interface SVGPointList { - - readonly attribute unsigned long length; - readonly attribute unsigned long numberOfItems; - - void clear(); - DOMPoint initialize(DOMPoint newItem); - getter DOMPoint getItem(unsigned long index); - DOMPoint insertItemBefore(DOMPoint newItem, unsigned long index); - DOMPoint replaceItem(DOMPoint newItem, unsigned long index); - DOMPoint removeItem(unsigned long index); - DOMPoint appendItem(DOMPoint newItem); - setter void (unsigned long index, DOMPoint newItem); -}; - -interface SVGPolylineElement : SVGGeometryElement { -}; - -SVGPolylineElement implements SVGAnimatedPoints; - -interface SVGPolygonElement : SVGGeometryElement { -}; - -SVGPolygonElement implements SVGAnimatedPoints; - -interface SVGTextContentElement : SVGGraphicsElement { - - // lengthAdjust Types - const unsigned short LENGTHADJUST_UNKNOWN = 0; - const unsigned short LENGTHADJUST_SPACING = 1; - const unsigned short LENGTHADJUST_SPACINGANDGLYPHS = 2; - - [SameObject] readonly attribute SVGAnimatedLength textLength; - [SameObject] readonly attribute SVGAnimatedEnumeration lengthAdjust; - - long getNumberOfChars(); - float getComputedTextLength(); - float getSubStringLength(unsigned long charnum, unsigned long nchars); - DOMPoint getStartPositionOfChar(unsigned long charnum); - DOMPoint getEndPositionOfChar(unsigned long charnum); - DOMRect getExtentOfChar(unsigned long charnum); - float getRotationOfChar(unsigned long charnum); - long getCharNumAtPosition(DOMPoint point); - void selectSubString(unsigned long charnum, unsigned long nchars); -}; - -interface SVGTextPositioningElement : SVGTextContentElement { - [SameObject] readonly attribute SVGAnimatedLengthList x; - [SameObject] readonly attribute SVGAnimatedLengthList y; - [SameObject] readonly attribute SVGAnimatedLengthList dx; - [SameObject] readonly attribute SVGAnimatedLengthList dy; - [SameObject] readonly attribute SVGAnimatedNumberList rotate; -}; - -interface SVGTextElement : SVGTextPositioningElement { -}; - -interface SVGTSpanElement : SVGTextPositioningElement { -}; - -interface SVGTextPathElement : SVGTextContentElement { - - // textPath Method Types - const unsigned short TEXTPATH_METHODTYPE_UNKNOWN = 0; - const unsigned short TEXTPATH_METHODTYPE_ALIGN = 1; - const unsigned short TEXTPATH_METHODTYPE_STRETCH = 2; - - // textPath Spacing Types - const unsigned short TEXTPATH_SPACINGTYPE_UNKNOWN = 0; - const unsigned short TEXTPATH_SPACINGTYPE_AUTO = 1; - const unsigned short TEXTPATH_SPACINGTYPE_EXACT = 2; - - [SameObject] readonly attribute SVGAnimatedLength startOffset; - [SameObject] readonly attribute SVGAnimatedEnumeration method; - [SameObject] readonly attribute SVGAnimatedEnumeration spacing; -}; - -SVGTextPathElement implements SVGURIReference; - -interface SVGImageElement : SVGGraphicsElement { - [SameObject] readonly attribute SVGAnimatedLength x; - [SameObject] readonly attribute SVGAnimatedLength y; - [SameObject] readonly attribute SVGAnimatedLength width; - [SameObject] readonly attribute SVGAnimatedLength height; - [SameObject] readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio; - attribute DOMString crossOrigin; -}; - -SVGImageElement implements SVGURIReference; - -interface SVGForeignObjectElement : SVGGraphicsElement { - [SameObject] readonly attribute SVGAnimatedLength x; - [SameObject] readonly attribute SVGAnimatedLength y; - [SameObject] readonly attribute SVGAnimatedLength width; - [SameObject] readonly attribute SVGAnimatedLength height; -}; - -interface SVGMarkerElement : SVGElement { - - // Marker Unit Types - const unsigned short SVG_MARKERUNITS_UNKNOWN = 0; - const unsigned short SVG_MARKERUNITS_USERSPACEONUSE = 1; - const unsigned short SVG_MARKERUNITS_STROKEWIDTH = 2; - - // Marker Orientation Types - const unsigned short SVG_MARKER_ORIENT_UNKNOWN = 0; - const unsigned short SVG_MARKER_ORIENT_AUTO = 1; - const unsigned short SVG_MARKER_ORIENT_ANGLE = 2; - - [SameObject] readonly attribute SVGAnimatedLength refX; - [SameObject] readonly attribute SVGAnimatedLength refY; - [SameObject] readonly attribute SVGAnimatedEnumeration markerUnits; - [SameObject] readonly attribute SVGAnimatedLength markerWidth; - [SameObject] readonly attribute SVGAnimatedLength markerHeight; - [SameObject] readonly attribute SVGAnimatedEnumeration orientType; - [SameObject] readonly attribute SVGAnimatedAngle orientAngle; - attribute DOMString orient; - - void setOrientToAuto(); - void setOrientToAngle(SVGAngle angle); -}; - -SVGMarkerElement implements SVGFitToViewBox; - -interface SVGSolidcolorElement : SVGElement { -}; - -interface SVGGradientElement : SVGElement { - - // Spread Method Types - const unsigned short SVG_SPREADMETHOD_UNKNOWN = 0; - const unsigned short SVG_SPREADMETHOD_PAD = 1; - const unsigned short SVG_SPREADMETHOD_REFLECT = 2; - const unsigned short SVG_SPREADMETHOD_REPEAT = 3; - - [SameObject] readonly attribute SVGAnimatedEnumeration gradientUnits; - [SameObject] readonly attribute SVGAnimatedTransformList gradientTransform; - [SameObject] readonly attribute SVGAnimatedEnumeration spreadMethod; -}; - -SVGGradientElement implements SVGURIReference; - -interface SVGLinearGradientElement : SVGGradientElement { - [SameObject] readonly attribute SVGAnimatedLength x1; - [SameObject] readonly attribute SVGAnimatedLength y1; - [SameObject] readonly attribute SVGAnimatedLength x2; - [SameObject] readonly attribute SVGAnimatedLength y2; -}; - -interface SVGRadialGradientElement : SVGGradientElement { - [SameObject] readonly attribute SVGAnimatedLength cx; - [SameObject] readonly attribute SVGAnimatedLength cy; - [SameObject] readonly attribute SVGAnimatedLength r; - [SameObject] readonly attribute SVGAnimatedLength fx; - [SameObject] readonly attribute SVGAnimatedLength fy; - [SameObject] readonly attribute SVGAnimatedLength fr; -}; - -interface SVGMeshElement : SVGGradientElement { -}; - -interface SVGMeshrowElement : SVGElement { -}; - -interface SVGMeshpatchElement : SVGElement { -}; - -interface SVGStopElement : SVGElement { - [SameObject] readonly attribute SVGAnimatedNumber offset; -}; - -interface SVGPatternElement : SVGElement { - [SameObject] readonly attribute SVGAnimatedEnumeration patternUnits; - [SameObject] readonly attribute SVGAnimatedEnumeration patternContentUnits; - [SameObject] readonly attribute SVGAnimatedTransformList patternTransform; - [SameObject] readonly attribute SVGAnimatedLength x; - [SameObject] readonly attribute SVGAnimatedLength y; - [SameObject] readonly attribute SVGAnimatedLength width; - [SameObject] readonly attribute SVGAnimatedLength height; -}; - -SVGPatternElement implements SVGFitToViewBox; -SVGPatternElement implements SVGURIReference; - -interface SVGHatchElement : SVGElement { -}; - -interface SVGHatchpathElement : SVGElement { -}; - -interface SVGCursorElement : SVGElement { - [SameObject] readonly attribute SVGAnimatedLength x; - [SameObject] readonly attribute SVGAnimatedLength y; -}; - -SVGCursorElement implements SVGURIReference; - -interface SVGScriptElement : SVGElement { - attribute DOMString type; - attribute DOMString crossOrigin; -}; - -SVGScriptElement implements SVGURIReference; - -interface SVGAElement : SVGGraphicsElement { - [SameObject] readonly attribute SVGAnimatedString target; -}; - -SVGAElement implements SVGURIReference; - -interface SVGViewElement : SVGElement {}; - -SVGViewElement implements SVGFitToViewBox; -SVGViewElement implements SVGZoomAndPan; - -interface SVGFilterElement : SVGElement { - readonly attribute SVGAnimatedEnumeration filterUnits; - readonly attribute SVGAnimatedEnumeration primitiveUnits; - readonly attribute SVGAnimatedLength x; - readonly attribute SVGAnimatedLength y; - readonly attribute SVGAnimatedLength width; - readonly attribute SVGAnimatedLength height; -}; - -SVGFilterElement implements SVGURIReference; - -[NoInterfaceObject] -interface SVGFilterPrimitiveStandardAttributes { - readonly attribute SVGAnimatedLength x; - readonly attribute SVGAnimatedLength y; - readonly attribute SVGAnimatedLength width; - readonly attribute SVGAnimatedLength height; - readonly attribute SVGAnimatedString result; -}; - -interface SVGFEBlendElement : SVGElement { - - // Blend Mode Types - const unsigned short SVG_FEBLEND_MODE_UNKNOWN = 0; - const unsigned short SVG_FEBLEND_MODE_NORMAL = 1; - const unsigned short SVG_FEBLEND_MODE_MULTIPLY = 2; - const unsigned short SVG_FEBLEND_MODE_SCREEN = 3; - const unsigned short SVG_FEBLEND_MODE_DARKEN = 4; - const unsigned short SVG_FEBLEND_MODE_LIGHTEN = 5; - - readonly attribute SVGAnimatedString in1; - readonly attribute SVGAnimatedString in2; - readonly attribute SVGAnimatedEnumeration mode; -}; - -SVGFEBlendElement implements SVGFilterPrimitiveStandardAttributes; - -interface SVGFEColorMatrixElement : SVGElement { - - // Color Matrix Types - const unsigned short SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0; - const unsigned short SVG_FECOLORMATRIX_TYPE_MATRIX = 1; - const unsigned short SVG_FECOLORMATRIX_TYPE_SATURATE = 2; - const unsigned short SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3; - const unsigned short SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4; - - readonly attribute SVGAnimatedString in1; - readonly attribute SVGAnimatedEnumeration type; - readonly attribute SVGAnimatedNumberList values; -}; - -SVGFEColorMatrixElement implements SVGFilterPrimitiveStandardAttributes; - -interface SVGFEComponentTransferElement : SVGElement { - readonly attribute SVGAnimatedString in1; -}; - -SVGFEComponentTransferElement implements SVGFilterPrimitiveStandardAttributes; - -interface SVGComponentTransferFunctionElement : SVGElement { - - // Component Transfer Types - const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0; - const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY = 1; - const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_TABLE = 2; - const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3; - const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_LINEAR = 4; - const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_GAMMA = 5; - - readonly attribute SVGAnimatedEnumeration type; - readonly attribute SVGAnimatedNumberList tableValues; - readonly attribute SVGAnimatedNumber slope; - readonly attribute SVGAnimatedNumber intercept; - readonly attribute SVGAnimatedNumber amplitude; - readonly attribute SVGAnimatedNumber exponent; - readonly attribute SVGAnimatedNumber offset; -}; - -interface SVGFEFuncRElement : SVGComponentTransferFunctionElement { -}; - -interface SVGFEFuncGElement : SVGComponentTransferFunctionElement { -}; - -interface SVGFEFuncBElement : SVGComponentTransferFunctionElement { -}; - -interface SVGFEFuncAElement : SVGComponentTransferFunctionElement { -}; - -interface SVGFECompositeElement : SVGElement { - - // Composite Operators - const unsigned short SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0; - const unsigned short SVG_FECOMPOSITE_OPERATOR_OVER = 1; - const unsigned short SVG_FECOMPOSITE_OPERATOR_IN = 2; - const unsigned short SVG_FECOMPOSITE_OPERATOR_OUT = 3; - const unsigned short SVG_FECOMPOSITE_OPERATOR_ATOP = 4; - const unsigned short SVG_FECOMPOSITE_OPERATOR_XOR = 5; - const unsigned short SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6; - - readonly attribute SVGAnimatedString in1; - readonly attribute SVGAnimatedString in2; - readonly attribute SVGAnimatedEnumeration operator; - readonly attribute SVGAnimatedNumber k1; - readonly attribute SVGAnimatedNumber k2; - readonly attribute SVGAnimatedNumber k3; - readonly attribute SVGAnimatedNumber k4; -}; - -SVGFECompositeElement implements SVGFilterPrimitiveStandardAttributes; - -interface SVGFEConvolveMatrixElement : SVGElement { - - // Edge Mode Values - const unsigned short SVG_EDGEMODE_UNKNOWN = 0; - const unsigned short SVG_EDGEMODE_DUPLICATE = 1; - const unsigned short SVG_EDGEMODE_WRAP = 2; - const unsigned short SVG_EDGEMODE_NONE = 3; - - readonly attribute SVGAnimatedString in1; - readonly attribute SVGAnimatedInteger orderX; - readonly attribute SVGAnimatedInteger orderY; - readonly attribute SVGAnimatedNumberList kernelMatrix; - readonly attribute SVGAnimatedNumber divisor; - readonly attribute SVGAnimatedNumber bias; - readonly attribute SVGAnimatedInteger targetX; - readonly attribute SVGAnimatedInteger targetY; - readonly attribute SVGAnimatedEnumeration edgeMode; - readonly attribute SVGAnimatedNumber kernelUnitLengthX; - readonly attribute SVGAnimatedNumber kernelUnitLengthY; -}; - -SVGFEConvolveMatrixElement implements SVGFilterPrimitiveStandardAttributes; - -interface SVGFEDiffuseLightingElement : SVGElement { - readonly attribute SVGAnimatedString in1; - readonly attribute SVGAnimatedNumber surfaceScale; - readonly attribute SVGAnimatedNumber diffuseConstant; - readonly attribute SVGAnimatedNumber kernelUnitLengthX; - readonly attribute SVGAnimatedNumber kernelUnitLengthY; -}; - -SVGFEDiffuseLightingElement implements SVGFilterPrimitiveStandardAttributes; - -interface SVGFEDistantLightElement : SVGElement { - readonly attribute SVGAnimatedNumber azimuth; - readonly attribute SVGAnimatedNumber elevation; -}; - -interface SVGFEPointLightElement : SVGElement { - readonly attribute SVGAnimatedNumber x; - readonly attribute SVGAnimatedNumber y; - readonly attribute SVGAnimatedNumber z; -}; - -interface SVGFESpotLightElement : SVGElement { - readonly attribute SVGAnimatedNumber x; - readonly attribute SVGAnimatedNumber y; - readonly attribute SVGAnimatedNumber z; - readonly attribute SVGAnimatedNumber pointsAtX; - readonly attribute SVGAnimatedNumber pointsAtY; - readonly attribute SVGAnimatedNumber pointsAtZ; - readonly attribute SVGAnimatedNumber specularExponent; - readonly attribute SVGAnimatedNumber limitingConeAngle; -}; - -interface SVGFEDisplacementMapElement : SVGElement { - - // Channel Selectors - const unsigned short SVG_CHANNEL_UNKNOWN = 0; - const unsigned short SVG_CHANNEL_R = 1; - const unsigned short SVG_CHANNEL_G = 2; - const unsigned short SVG_CHANNEL_B = 3; - const unsigned short SVG_CHANNEL_A = 4; - - readonly attribute SVGAnimatedString in1; - readonly attribute SVGAnimatedString in2; - readonly attribute SVGAnimatedNumber scale; - readonly attribute SVGAnimatedEnumeration xChannelSelector; - readonly attribute SVGAnimatedEnumeration yChannelSelector; -}; - -SVGFEDisplacementMapElement implements SVGFilterPrimitiveStandardAttributes; - -interface SVGFEDropShadowElement : SVGElement { - readonly attribute SVGAnimatedString in1; - readonly attribute SVGAnimatedNumber dx; - readonly attribute SVGAnimatedNumber dy; - readonly attribute SVGAnimatedNumber stdDeviationX; - readonly attribute SVGAnimatedNumber stdDeviationY; - - void setStdDeviation(float stdDeviationX, float stdDeviationY); -}; - -SVGFEDropShadowElement implements SVGFilterPrimitiveStandardAttributes; - -interface SVGFEFloodElement : SVGElement { -}; - -SVGFEFloodElement implements SVGFilterPrimitiveStandardAttributes; - -interface SVGFEGaussianBlurElement : SVGElement { - - // Edge Mode Values - const unsigned short SVG_EDGEMODE_UNKNOWN = 0; - const unsigned short SVG_EDGEMODE_DUPLICATE = 1; - const unsigned short SVG_EDGEMODE_WRAP = 2; - const unsigned short SVG_EDGEMODE_NONE = 3; - - readonly attribute SVGAnimatedString in1; - readonly attribute SVGAnimatedNumber stdDeviationX; - readonly attribute SVGAnimatedNumber stdDeviationY; - readonly attribute SVGAnimatedEnumeration edgeMode; - - void setStdDeviation(float stdDeviationX, float stdDeviationY); -}; - -SVGFEGaussianBlurElement implements SVGFilterPrimitiveStandardAttributes; - -interface SVGFEImageElement : SVGElement { - readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio; - readonly attribute SVGAnimatedString crossOrigin; -}; - -SVGFEImageElement implements SVGFilterPrimitiveStandardAttributes; -SVGFEImageElement implements SVGURIReference; - -interface SVGFEMergeElement : SVGElement { -}; - -SVGFEMergeElement implements SVGFilterPrimitiveStandardAttributes; - -interface SVGFEMergeNodeElement : SVGElement { - readonly attribute SVGAnimatedString in1; -}; - -interface SVGFEMorphologyElement : SVGElement { - - // Morphology Operators - const unsigned short SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0; - const unsigned short SVG_MORPHOLOGY_OPERATOR_ERODE = 1; - const unsigned short SVG_MORPHOLOGY_OPERATOR_DILATE = 2; - - readonly attribute SVGAnimatedString in1; - readonly attribute SVGAnimatedEnumeration operator; - readonly attribute SVGAnimatedNumber radiusX; - readonly attribute SVGAnimatedNumber radiusY; -}; - -SVGFEMorphologyElement implements SVGFilterPrimitiveStandardAttributes; - -interface SVGFEOffsetElement : SVGElement { - readonly attribute SVGAnimatedString in1; - readonly attribute SVGAnimatedNumber dx; - readonly attribute SVGAnimatedNumber dy; -}; - -SVGFEOffsetElement implements SVGFilterPrimitiveStandardAttributes; - -interface SVGFESpecularLightingElement : SVGElement { - readonly attribute SVGAnimatedString in1; - readonly attribute SVGAnimatedNumber surfaceScale; - readonly attribute SVGAnimatedNumber specularConstant; - readonly attribute SVGAnimatedNumber specularExponent; - readonly attribute SVGAnimatedNumber kernelUnitLengthX; - readonly attribute SVGAnimatedNumber kernelUnitLengthY; -}; - -SVGFESpecularLightingElement implements SVGFilterPrimitiveStandardAttributes; - -interface SVGFETileElement : SVGElement { - readonly attribute SVGAnimatedString in1; -}; - -SVGFETileElement implements SVGFilterPrimitiveStandardAttributes; - -interface SVGFETurbulenceElement : SVGElement { - - // Turbulence Types - const unsigned short SVG_TURBULENCE_TYPE_UNKNOWN = 0; - const unsigned short SVG_TURBULENCE_TYPE_FRACTALNOISE = 1; - const unsigned short SVG_TURBULENCE_TYPE_TURBULENCE = 2; - - // Stitch Options - const unsigned short SVG_STITCHTYPE_UNKNOWN = 0; - const unsigned short SVG_STITCHTYPE_STITCH = 1; - const unsigned short SVG_STITCHTYPE_NOSTITCH = 2; - - readonly attribute SVGAnimatedNumber baseFrequencyX; - readonly attribute SVGAnimatedNumber baseFrequencyY; - readonly attribute SVGAnimatedInteger numOctaves; - readonly attribute SVGAnimatedNumber seed; - readonly attribute SVGAnimatedEnumeration stitchTiles; - readonly attribute SVGAnimatedEnumeration type; -}; - -SVGFETurbulenceElement implements SVGFilterPrimitiveStandardAttributes; -</script> -<script> -var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); -var g = document.createElementNS("http://www.w3.org/2000/svg", "g"); -var defs = document.createElementNS("http://www.w3.org/2000/svg", "defs"); -var Desc = document.createElementNS("http://www.w3.org/2000/svg", "desc"); -var title = document.createElementNS("http://www.w3.org/2000/svg", "title"); -var symbol = document.createElementNS("http://www.w3.org/2000/svg", "symbol"); -var use = document.createElementNS("http://www.w3.org/2000/svg", "use"); -var image = document.createElementNS("http://www.w3.org/2000/svg", "image"); -var Switch = document.createElementNS("http://www.w3.org/2000/svg", "switch"); -var style = document.createElementNS("http://www.w3.org/2000/svg", "style"); -var path = document.createElementNS("http://www.w3.org/2000/svg", "path"); -var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); -var circle = document.createElementNS("http://www.w3.org/2000/svg", "circle"); -var ellipse = document.createElementNS("http://www.w3.org/2000/svg", "ellipse"); -var line = document.createElementNS("http://www.w3.org/2000/svg", "line"); -var polyline = document.createElementNS("http://www.w3.org/2000/svg", "polyline"); -var polygon = document.createElementNS("http://www.w3.org/2000/svg", "polygon"); -var text = document.createElementNS("http://www.w3.org/2000/svg", "text"); -var tspan = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); -var tref = document.createElementNS("http://www.w3.org/2000/svg", "tref"); -var textPath = document.createElementNS("http://www.w3.org/2000/svg", "textPath"); -var altGlyph = document.createElementNS("http://www.w3.org/2000/svg", "altGlyph"); -var altGlyphDef = document.createElementNS("http://www.w3.org/2000/svg", - "altGlyphDef"); -var altGlyphItem = document.createElementNS("http://www.w3.org/2000/svg", - "altGlyphItem"); -var glyphRef = document.createElementNS("http://www.w3.org/2000/svg", - "glyphRef"); -var marker = document.createElementNS("http://www.w3.org/2000/svg", "marker"); -var colorProfile = document.createElementNS("http://www.w3.org/2000/svg", - "color-profile"); -var linearGradient = document.createElementNS("http://www.w3.org/2000/svg", - "linearGradient"); -var radialGradient = document.createElementNS("http://www.w3.org/2000/svg", - "radialGradient"); -var meshGradient = document.createElementNS("http://www.w3.org/2000/svg", - "meshGradient"); -var stop = document.createElementNS("http://www.w3.org/2000/svg", "stop"); -var pattern = document.createElementNS("http://www.w3.org/2000/svg", "pattern"); -var clipPath = document.createElementNS("http://www.w3.org/2000/svg", "clipPath"); -var mask = document.createElementNS("http://www.w3.org/2000/svg", "mask"); -var cursor = document.createElementNS("http://www.w3.org/2000/svg", "cursor"); -var a = document.createElementNS("http://www.w3.org/2000/svg", "a"); -var view = document.createElementNS("http://www.w3.org/2000/svg", "view"); -var script = document.createElementNS("http://www.w3.org/2000/svg", "script"); -var animate = document.createElementNS("http://www.w3.org/2000/svg", "animate"); -var set = document.createElementNS("http://www.w3.org/2000/svg", "set"); -var animateMotion = document.createElementNS("http://www.w3.org/2000/svg", - "animateMotion"); -var mPath = document.createElementNS("http://www.w3.org/2000/svg", "mPath"); -var animateColor = document.createElementNS("http://www.w3.org/2000/svg", - "animateColor"); -var animateColor = document.createElementNS("http://www.w3.org/2000/svg", - "animateColor"); -var animateTransform = document.createElementNS("http://www.w3.org/2000/svg", - "animateTransform"); -var font = document.createElementNS("http://www.w3.org/2000/svg", "font"); -var glyph = document.createElementNS("http://www.w3.org/2000/svg", "glyph"); -var missingglyph = document.createElementNS("http://www.w3.org/2000/svg", - "missing-glyph"); -var khern = document.createElementNS("http://www.w3.org/2000/svg", "hkern"); -var vkern = document.createElementNS("http://www.w3.org/2000/svg", "vkern"); -var fontface = document.createElementNS("http://www.w3.org/2000/svg", "font-face"); -var fontfacesrc = document.createElementNS("http://www.w3.org/2000/svg", - "font-face-src"); -var fontfaceuri = document.createElementNS("http://www.w3.org/2000/svg", - "font-face-uri"); -var fontfaceformat = document.createElementNS("http://www.w3.org/2000/svg", - "font-face-format"); -var fontfacename = document.createElementNS("http://www.w3.org/2000/svg", - "font-face-name"); -var metadata = document.createElementNS("http://www.w3.org/2000/svg", - "metadata"); -var foreignObject = document.createElementNS("http://www.w3.org/2000/svg", - "foreignObject"); -var filter = document.createElementNS("http://www.w3.org/2000/svg", "filter"); -var feBlend = document.createElementNS("http://www.w3.org/2000/svg", "feBlend"); -var feColorMatrix = document.createElementNS("http://www.w3.org/2000/svg", - "feColorMatrix"); -var feComponentTransfer = document.createElementNS("http://www.w3.org/2000/svg", - "feComponentTransfer"); -var feFuncR = document.createElementNS("http://www.w3.org/2000/svg", "feFuncR"); -var feFuncG = document.createElementNS("http://www.w3.org/2000/svg", "feFuncG"); -var feFuncB = document.createElementNS("http://www.w3.org/2000/svg", "feFuncB"); -var feFuncA = document.createElementNS("http://www.w3.org/2000/svg", "feFuncA"); -var feComposite = document.createElementNS("http://www.w3.org/2000/svg", - "feComposite"); -var feConvolveMatrix = document.createElementNS("http://www.w3.org/2000/svg", - "feConvolveMatrix"); -var feDiffuseLighting = document.createElementNS("http://www.w3.org/2000/svg", - "feDiffuseLighting"); -var fePointLight = document.createElementNS("http://www.w3.org/2000/svg", - "fePointLight"); -var feSpotLight = document.createElementNS("http://www.w3.org/2000/svg", - "feSpotLight"); -var feDisplacementMap = document.createElementNS("http://www.w3.org/2000/svg", - "feDisplacementMap"); -var feDropShadow = document.createElementNS("http://www.w3.org/2000/svg", - "feDropShadow"); -var feFlood = document.createElementNS("http://www.w3.org/2000/svg", "feFlood"); -var feGaussianBlur = document.createElementNS("http://www.w3.org/2000/svg", - "feGaussianBlur"); -var feDisplacementMap = document.createElementNS("http://www.w3.org/2000/svg", - "feDisplacementMap"); -var feDropShadow = document.createElementNS("http://www.w3.org/2000/svg", - "feDropShadow"); -var feImage = document.createElementNS("http://www.w3.org/2000/svg", "feImage"); -var feMerge = document.createElementNS("http://www.w3.org/2000/svg", "feMerge"); -var feMergeNode = document.createElementNS("http://www.w3.org/2000/svg", - "feMergeNode"); -var feMorphology = document.createElementNS("http://www.w3.org/2000/svg", - "feMorphology"); -var feSpecularLighting = document.createElementNS("http://www.w3.org/2000/svg", - "feSpecularLighting"); -var feTile = document.createElementNS("http://www.w3.org/2000/svg", - "feTile"); -var feTurbulence = document.createElementNS("http://www.w3.org/2000/svg", - "feTurbulence"); - - -var idlArray = new IdlArray(); -var idls = document.getElementById("idl").textContent; -var untestedIdls = document.getElementById("untested_idl").textContent; -idlArray.add_untested_idls(untestedIdls); -idlArray.add_idls(idls); -idlArray.add_objects({ - SVGAnimatedBoolean: ['feConvolveMatrix.preserveAlpha'], - SVGAnimatedString: ['a.target'], - SVGStringList: ['a.requiredExtensions'], - SVGAnimatedEnumeration: ['text.lengthAdjust'], - SVGAnimatedInteger: ['feConvolveMatrix.orderX'], - SVGNumber: ['svg.createSVGNumber()'], - SVGAnimatedNumber: ['stop.offset'], - SVGNumberList: ['text.rotate.baseVal'], - SVGAnimatedNumberList: ['text.rotate'], - SVGLength: ['svg.createSVGLength()'], - SVGAnimatedLength: ['svg.x'], - SVGAnimatedLengthList: ['text.x'], - SVGAngle: ['svg.createSVGAngle()'], - SVGAnimatedAngle: ['marker.orientAngle'], - SVGRect: ['svg.createSVGRect()'], - SVGAnimatedRect: ['svg.viewBox'], - SVGSVGElement: ['svg'], - SVGGElement: ['g'], - SVGDefsElement: ['defs'], - SVGDescElement: ['Desc'], - SVGTitleElement: ['title'], - SVGSymbolElement: ['symbol'], - SVGUseElement: ['use'], - SVGImageElement: ['image'], - SVGSwitchElement: ['Switch'], - SVGStyleElement: ['style'], - SVGPoint: ['svg.createSVGPoint()'], - SVGPointList: ['polygon.points'], - SVGMatrix: ['svg.createSVGMatrix()'], - SVGTransform: ['svg.createSVGTransform()'], - SVGTransformList: ['pattern.patternTransform.baseVal'], - SVGAnimatedTransformList: ['pattern.patternTransform'], - SVGPreserveAspectRatio: ['image.preserveAspectRatio.baseVal'], - SVGAnimatedPreserveAspectRatio: ['image.preserveAspectRatio'], - SVGPathSegClosePath: ['path.createSVGPathSegClosePath()'], - SVGPathSegMovetoAbs: ['path.createSVGPathSegMovetoAbs(0,0)'], - SVGPathSegMovetoRel: ['path.createSVGPathSegMovetoRel(0,0)'], - SVGPathSegLinetoAbs: ['path.createSVGPathSegLinetoAbs(0,0)'], - SVGPathSegLinetoRel: ['path.createSVGPathSegLinetoRel(0,0)'], - SVGPathSegCurvetoCubicAbs: ['path.createSVGPathSegCurvetoCubicAbs(0,0,0,0,0,0)'], - SVGPathSegCurvetoCubicRel: ['path.createSVGPathSegCurvetoCubicRel(0,0,0,0,0,0)'], - SVGPathSegCurvetoQuadraticAbs: ['path.createSVGPathSegCurvetoQuadraticAbs(0,0,0,0)'], - SVGPathSegCurvetoQuadraticRel: ['path.createSVGPathSegCurvetoQuadraticRel(0,0,0,0)'], - SVGPathSegArcAbs: ['path.createSVGPathSegArcAbs(0,0,0,0,0,true,true)'], - SVGPathSegArcRel: ['path.createSVGPathSegArcRel(0,0,0,0,0,true,true)'], - SVGPathSegLinetoHorizontalAbs: ['path.createSVGPathSegLinetoHorizontalAbs(0)'], - SVGPathSegLinetoHorizontalRel: ['path.createSVGPathSegLinetoHorizontalRel(0)'], - SVGPathSegLinetoVerticalAbs: ['path.createSVGPathSegLinetoVerticalAbs(0)'], - SVGPathSegLinetoVerticalRel: ['path.createSVGPathSegLinetoVerticalRel(0)'], - SVGPathSegCurvetoCubicSmoothAbs: ['path.createSVGPathSegCurvetoCubicSmoothAbs(0,0,0,0)'], - SVGPathSegCurvetoCubicSmoothRel: ['path.createSVGPathSegCurvetoCubicSmoothRel(0,0,0,0)'], - SVGPathSegCurvetoQuadraticSmoothAbs: ['path.createSVGPathSegCurvetoQuadraticSmoothAbs(0,0)'], - SVGPathSegCurvetoQuadraticSmoothRel: ['path.createSVGPathSegCurvetoQuadraticSmoothRel(0,0)'], - SVGPathSegList: ['path.pathSegList'], - SVGPathElement: ['path'], - SVGRectElement: ['rect'], - SVGCircleElement: ['circle'], - SVGEllipseElement: ['ellipse'], - SVGLineElement: ['line'], - SVGPolylineElement: ['polyline'], - SVGPolygonElement: ['polygon'], - SVGTextElement: ['text'], - SVGTSpanElement: ['tspan'], - SVGTRefElement: ['tref'], - SVGTextPathElement: ['textPath'], - SVGAltGlyphElement: ['altGlyph'], - SVGAltGlyphDefElement: ['altGlyphDef'], - SVGAltGlyphItemElement: ['altGlyphItem'], - SVGGlyphRefElement: ['glyphRef'], - SVGMarkerElement: ['marker'], - SVGColorProfileElement: ['colorProfile'], - SVGLinearGradientElement: ['linearGradient'], - SVGRadialGradientElement: ['radialGradient'], - SVGMeshGradientElement: ['meshGradient'], - SVGStopElement: ['stop'], - SVGPatternElement: ['pattern'], - SVGClipPathElement: ['clipPath'], - SVGMaskElement: ['mask'], - SVGCursorElement: ['cursor'], - SVGAElement: ['a'], - SVGViewElement: ['view'], - SVGScriptElement: ['script'], - SVGAnimateElement: ['animate'], - SVGSetElement: ['set'], - SVGAnimateMotionElement: ['animateMotion'], - SVGMPathElement: ['mPath'], - SVGAnimateColorElement: ['animateColor'], - SVGAnimateTransformElement: ['animateTransform'], - SVGFontElement: ['font'], - SVGGlyphElement: ['glyph'], - SVGMissingGlyphElement: ['missingglyph'], - SVGHKernElement: ['hkern'], - SVGVKernElement: ['vkern'], - SVGFontFaceElement: ['fontface'], - SVGFontFaceSrcElement: ['fontfacesrc'], - SVGFontFaceUriElement: ['fontfaceuri'], - SVGFontFaceFormatElement: ['fontfaceformat'], - SVGMetadataElement: ['metadata'], - SVGForeignObjectElement: ['foreignObject'], - SVGFilterElement: ['filter'], - SVGFEBlendElement: ['feBlend'], - SVGFEColorMatrixElement: ['feColorMatrix'], - SVGFEComponentTransferElement: ['feComponentTransfer'], - SVGFEFuncRElement: ['feFuncR'], - SVGFEFuncGElement: ['feFuncG'], - SVGFEFuncBElement: ['feFuncB'], - SVGFEFuncAElement: ['feFuncA'], - SVGFECompositeElement: ['feComposite'], - SVGFEConvolveMatrixElement: ['feConvolveMatrix'], - SVGFEDiffuseLightingElement: ['feDiffuseLighting'], - SVGFEPointLightElement: ['fePointLight'], - SVGFESpotLightElement: ['feSpotLight'], - SVGFEDisplacementMapElement: ['feDisplacementMap'], - SVGFEDropShadowElement: ['feDropShadow'], - SVGFEFloodElement: ['feFlood'], - SVGFEGaussianBlurElement: ['feGaussianBlur'], - SVGFEImageElement: ['feImage'], - SVGFEMergeElement: ['feMerge'], - SVGFEMergeNodeElement: ['feMergeNode'], - SVGFEMorphologyElement: ['feMorphology'], - SVGFESpecularLightingElement: ['feSpecularLighting'], - SVGFETileElement: ['feTile'], - SVGFETurbulenceElement: ['feTurbulence'] -}); -idlArray.test(); -</script> -
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt index 06a8843..1c35bb81 100644 --- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: line 1: Percentages row tracks and gutters for indefinite height grid containers will be resolved against the intrinsic height instead of being treated as auto and zero respectively. This change will happen in M70, around October 2018. See https://www.chromestatus.com/feature/6708326821789696 for more details. Test that setting and getting grid-template-columns and grid-template-rows works as expected On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-multiple-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-multiple-expected.txt index e4bbf1d..171b686f3 100644 --- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-multiple-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-multiple-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: line 1: Percentages row tracks and gutters for indefinite height grid containers will be resolved against the intrinsic height instead of being treated as auto and zero respectively. This change will happen in M70, around October 2018. See https://www.chromestatus.com/feature/6708326821789696 for more details. Test that setting and getting grid-template-columns and grid-template-rows works as expected On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-indefinite-calculated-height-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-indefinite-calculated-height-crash-expected.txt index aa65cff0..003c7dd5 100644 --- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-indefinite-calculated-height-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-indefinite-calculated-height-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Percentages row tracks and gutters for indefinite height grid containers will be resolved against the intrinsic height instead of being treated as auto and zero respectively. This change will happen in M70, around October 2018. See https://www.chromestatus.com/feature/6708326821789696 for more details. This test has PASSED if it didn't CRASH on Debug builds.
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/named-grid-line-get-set-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/named-grid-line-get-set-expected.txt index 9642bff1..d5aa4584a 100644 --- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/named-grid-line-get-set-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/named-grid-line-get-set-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: line 1: Percentages row tracks and gutters for indefinite height grid containers will be resolved against the intrinsic height instead of being treated as auto and zero respectively. This change will happen in M70, around October 2018. See https://www.chromestatus.com/feature/6708326821789696 for more details. Test that setting and getting grid-template-columns and grid-template-rows works as expected On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-intrinsic-track-breadth-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-intrinsic-track-breadth-expected.txt index ba5bfed04..76688553 100644 --- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-intrinsic-track-breadth-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-intrinsic-track-breadth-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: line 48: Percentages row tracks and gutters for indefinite height grid containers will be resolved against the intrinsic height instead of being treated as auto and zero respectively. This change will happen in M70, around October 2018. See https://www.chromestatus.com/feature/6708326821789696 for more details. This test checks that percentage track breadths of intrinsic size are treated as auto. XXXXX
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size-expected.txt index 62f078c..b00933a5 100644 --- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: line 48: Percentages row tracks and gutters for indefinite height grid containers will be resolved against the intrinsic height instead of being treated as auto and zero respectively. This change will happen in M70, around October 2018. See https://www.chromestatus.com/feature/6708326821789696 for more details. This test checks that percentages of indefinite sizes are treated as min-content (for the min track sizing function) or max-content (for the max track sizing function). XXX
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size-in-auto-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size-in-auto-expected.txt index 62f078c..b00933a5 100644 --- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size-in-auto-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size-in-auto-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: line 48: Percentages row tracks and gutters for indefinite height grid containers will be resolved against the intrinsic height instead of being treated as auto and zero respectively. This change will happen in M70, around October 2018. See https://www.chromestatus.com/feature/6708326821789696 for more details. This test checks that percentages of indefinite sizes are treated as min-content (for the min track sizing function) or max-content (for the max track sizing function). XXX
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size-in-minmax-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size-in-minmax-crash-expected.txt index bb3bd54..27d6511 100644 --- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size-in-minmax-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size-in-minmax-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Percentages row tracks and gutters for indefinite height grid containers will be resolved against the intrinsic height instead of being treated as auto and zero respectively. This change will happen in M70, around October 2018. See https://www.chromestatus.com/feature/6708326821789696 for more details. The test works as expected if it does not crash.
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-track-breadths-regarding-container-size-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-track-breadths-regarding-container-size-expected.txt index 29459ebb..ff19d200 100644 --- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-track-breadths-regarding-container-size-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-track-breadths-regarding-container-size-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: line 48: Percentages row tracks and gutters for indefinite height grid containers will be resolved against the intrinsic height instead of being treated as auto and zero respectively. This change will happen in M70, around October 2018. See https://www.chromestatus.com/feature/6708326821789696 for more details. This test checks percentage track breadths are resolved properly regarding the container size. XX
diff --git a/third_party/WebKit/LayoutTests/fast/history/history-back-initial-vs-final-url.html b/third_party/WebKit/LayoutTests/fast/history/history-back-initial-vs-final-url.html index ab02c29..b2e871d 100644 --- a/third_party/WebKit/LayoutTests/fast/history/history-back-initial-vs-final-url.html +++ b/third_party/WebKit/LayoutTests/fast/history/history-back-initial-vs-final-url.html
@@ -11,7 +11,7 @@ <li>Final URL loaded.</li> </ol> -<iframe a width="200" height="200" onunload="" src="resources/frame-initial-url.html"></iframe> +<iframe a width="200" height="200" onunload=""></iframe> <script> if (window.testRunner) { @@ -36,6 +36,15 @@ sessionStorage.didNav = true; } }; + +// Wait for the onload event before starting the first navigation. Not waiting +// may cause the second history entry to replace the current one instead of +// being appended. history.back() failed for this reason. +// See https://crbug.com/862580 +window.onload = function() { + document.querySelector("iframe").src = "resources/frame-initial-url.html" +} + </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/geometry/root-layer-update-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/geometry/root-layer-update-expected.txt index 04cb2b2..c7ebd3a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/geometry/root-layer-update-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/geometry/root-layer-update-expected.txt
@@ -7,7 +7,7 @@ LayoutInline {A} at (0,0) size 149x19 [color=#0000EE] LayoutText {#text} at (0,0) size 149x19 text run at (0,0) width 149: "rdar://problem/7026010" - LayoutBR {BR} at (149,0) size 0x0 + LayoutBR {BR} at (149,0) size 0x19 LayoutText {#text} at (0,20) size 461x19 text run at (0,20) width 461: "Test for the root layer getting correctly positioned. You should see no red." layer at (350,1) size 100x100
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/iframes/composited-iframe-alignment-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/iframes/composited-iframe-alignment-expected.txt index f719046..e31a98e 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/iframes/composited-iframe-alignment-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/iframes/composited-iframe-alignment-expected.txt
@@ -6,8 +6,8 @@ LayoutText {#text} at (0,0) size 769x39 text run at (0,0) width 769: "Simple test of composited iframe content. There should be a blue box with a gray background inside the black border. The" text run at (0,20) width 469: "gray background should fit perfectly within the block border with no gaps." - LayoutBR {BR} at (469,20) size 0x0 - LayoutBR {BR} at (0,40) size 0x0 + LayoutBR {BR} at (469,20) size 0x19 + LayoutBR {BR} at (0,40) size 0x19 layer at (100,100) size 440x340 LayoutIFrame (positioned) {IFRAME} at (100,100) size 440x340 [border: (20px solid #000000)] layer at (0,0) size 400x300
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/img-layer-object-fit-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/img-layer-object-fit-expected.txt index ba3d8f5..9516d29 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/img-layer-object-fit-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/img-layer-object-fit-expected.txt
@@ -3,10 +3,10 @@ layer at (0,0) size 800x156 LayoutNGBlockFlow {HTML} at (0,0) size 800x156 LayoutNGBlockFlow {BODY} at (8,8) size 784x140 - LayoutBR {BR} at (100,15) size 0x0 - LayoutBR {BR} at (100,50) size 0x0 - LayoutBR {BR} at (100,85) size 0x0 - LayoutBR {BR} at (100,120) size 0x0 + LayoutBR {BR} at (100,15) size 0x19 + LayoutBR {BR} at (100,50) size 0x19 + LayoutBR {BR} at (100,85) size 0x19 + LayoutBR {BR} at (100,120) size 0x19 layer at (8,8) size 100x30 LayoutImage {IMG} at (0,0) size 100x30 layer at (8,43) size 100x30
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/overflow/ancestor-overflow-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/overflow/ancestor-overflow-expected.txt index 7d4b054..52cb132 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/overflow/ancestor-overflow-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/overflow/ancestor-overflow-expected.txt
@@ -12,7 +12,7 @@ LayoutText {#text} at (368,167) size 4x19 text run at (368,167) width 4: " " LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (554,167) size 0x0 + LayoutBR {BR} at (554,167) size 0x19 LayoutText {#text} at (182,354) size 4x19 text run at (182,354) width 4: " " LayoutText {#text} at (368,354) size 4x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/overflow/overflow-scroll-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/overflow/overflow-scroll-expected.txt index f74f0a60..246190f 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/overflow/overflow-scroll-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/overflow/overflow-scroll-expected.txt
@@ -14,7 +14,7 @@ LayoutText {#text} at (524,157) size 4x19 text run at (524,157) width 4: " " LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (700,157) size 0x0 + LayoutBR {BR} at (700,157) size 0x19 LayoutText {#text} at (172,334) size 4x19 text run at (172,334) width 4: " " LayoutText {#text} at (348,334) size 4x19 @@ -22,7 +22,7 @@ LayoutText {#text} at (524,334) size 4x19 text run at (524,334) width 4: " " LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (700,334) size 0x0 + LayoutBR {BR} at (700,334) size 0x19 LayoutText {#text} at (172,511) size 4x19 text run at (172,511) width 4: " " LayoutText {#text} at (348,511) size 4x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/self-painting-layers-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/self-painting-layers-expected.txt index b092162..8353fd0 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/self-painting-layers-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/self-painting-layers-expected.txt
@@ -15,13 +15,14 @@ LayoutNGBlockFlow {DIV} at (1,1) size 285x500 LayoutText {#text} at (0,6) size 107x36 text run at (0,6) width 107: "Scrolled" - LayoutBR {BR} at (107,6) size 0x0 + LayoutBR {BR} at (107,6) size 0x36 LayoutText {#text} at (0,54) size 48x36 text run at (0,54) width 48: "text" - LayoutBR {BR} at (48,54) size 0x0 + LayoutBR {BR} at (48,54) size 0x36 LayoutText {#text} at (0,102) size 63x36 text run at (0,102) width 63: "here." layer at (19,53) size 300x200 LayoutFlexibleBox (relative positioned) {DIV} at (0,0) size 300x200 - LayoutNGBlockFlow {DIV} at (150,0) size 0x0 LayoutFlexibleBox {DIV} at (0,0) size 300x200 +layer at (19,53) size 300x200 + LayoutNGBlockFlow (positioned) {DIV} at (0,0) size 300x200
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/text-on-large-layer-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/text-on-large-layer-expected.txt index 1662fcf..eab375a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/text-on-large-layer-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/text-on-large-layer-expected.txt
@@ -7,6 +7,6 @@ LayoutNGBlockFlow (positioned) {DIV} at (3,1) size 2000x10000 LayoutText {#text} at (0,0) size 542x19 text run at (0,0) width 542: "This is some text inside a very large composited layer to test that it is rendered sharply." - LayoutBR {BR} at (542,0) size 0x0 + LayoutBR {BR} at (542,0) size 0x19 LayoutText {#text} at (0,20) size 212x19 text run at (0,20) width 212: "The test passes if this text is crisp."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/basic/comments-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/basic/comments-expected.txt index aa11b21..46cc041 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/basic/comments-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/basic/comments-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x240 - LayoutText {#text} at (0,0) size 336x224 + LayoutText {#text} at (0,0) size 336x240 text run at (0,0) width 232: "/* This is a CSS1 comment. */" text run at (232,0) width 0: " " text run at (0,16) width 336: ".one {color: green;} /* Another comment */"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/basic/contextual_selectors-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/basic/contextual_selectors-expected.txt index e524e17..dcdd43b 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/basic/contextual_selectors-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/basic/contextual_selectors-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x64 - LayoutText {#text} at (0,0) size 472x48 + LayoutText {#text} at (0,0) size 472x64 text run at (0,0) width 288: "P {color: navy; font-family: serif;}" text run at (288,0) width 0: " " text run at (0,16) width 472: "HTML BODY TABLE P {color: purple; font-family: sans-serif;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/basic/grouping-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/basic/grouping-expected.txt index e55cde2b..2724f2d 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/basic/grouping-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/basic/grouping-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x32 - LayoutText {#text} at (0,0) size 272x16 + LayoutText {#text} at (0,0) size 272x32 text run at (0,0) width 272: ".one, .two, .three {color: green;}" text run at (272,0) width 0: " " text run at (0,16) width 0: " "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_bottom_inline-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_bottom_inline-expected.txt index 2ac285840..af4738a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_bottom_inline-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_bottom_inline-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x48 - LayoutText {#text} at (0,0) size 328x32 + LayoutText {#text} at (0,0) size 328x48 text run at (0,0) width 328: ".one {border-bottom: purple double 10px;}" text run at (328,0) width 0: " " text run at (0,16) width 320: ".two {border-bottom: purple thin solid;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_inline-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_inline-expected.txt index 51773de..f635a612 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_inline-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_inline-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x48 - LayoutText {#text} at (0,0) size 256x32 + LayoutText {#text} at (0,0) size 256x48 text run at (0,0) width 256: ".one {border: 10px teal outset;}" text run at (256,0) width 0: " " text run at (0,16) width 256: ".two {border: 10px olive inset;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_left_inline-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_left_inline-expected.txt index e0b34024..015af16 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_left_inline-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_left_inline-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x64 - LayoutText {#text} at (0,0) size 312x48 + LayoutText {#text} at (0,0) size 312x64 text run at (0,0) width 176: "P {margin-left: 20px;}" text run at (176,0) width 0: " " text run at (0,16) width 312: ".one {border-left: purple double 10px;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_right-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_right-expected.txt index 82371b3..4a0720ec 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_right-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_right-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x64 - LayoutText {#text} at (0,0) size 320x48 + LayoutText {#text} at (0,0) size 320x64 text run at (0,0) width 184: "P {margin-right: 20px;}" text run at (184,0) width 0: " " text run at (0,16) width 320: ".one {border-right: purple double 10px;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_top_inline-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_top_inline-expected.txt index 7132ab2..a7f23b8 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_top_inline-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_top_inline-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x48 - LayoutText {#text} at (0,0) size 304x32 + LayoutText {#text} at (0,0) size 304x48 text run at (0,0) width 304: ".one {border-top: purple double 10px;}" text run at (304,0) width 0: " " text run at (0,16) width 296: ".two {border-top: purple thin solid;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/clear-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/clear-expected.txt index 8871a79..afc7672f4 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/clear-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/clear-expected.txt
@@ -21,19 +21,19 @@ LayoutText {#text} at (18,0) size 594x19 text run at (18,0) width 594: "This text should be flowing past a tall orange rectangle on the left side of the browser window." LayoutNGBlockFlow (anonymous) at (0,167) size 769x20 - LayoutBR {BR} at (18,0) size 0x0 + LayoutBR {BR} at (18,0) size 0x19 LayoutImage (floating) {IMG} at (0,20) size 15x50 LayoutNGBlockFlow {P} at (0,237) size 769x20 LayoutText {#text} at (0,0) size 649x19 text run at (0,0) width 649: "This paragraph should appear below the tall orange rectangle above and to the left, and not flow past it." LayoutNGBlockFlow (anonymous) at (0,273) size 769x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutImage (floating) {IMG} at (754,20) size 15x50 LayoutNGBlockFlow {P} at (0,343) size 769x20 LayoutText {#text} at (0,0) size 658x19 text run at (0,0) width 658: "This paragraph should appear below the tall orange rectangle above and to the right, and not flow past it." LayoutNGBlockFlow (anonymous) at (0,379) size 769x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutImage (floating) {IMG} at (0,20) size 15x50 LayoutImage (floating) {IMG} at (754,20) size 15x50 LayoutNGBlockFlow {P} at (0,449) size 769x20 @@ -45,7 +45,7 @@ LayoutText {#text} at (18,0) size 390x19 text run at (18,0) width 390: "This paragraph should be between both tall orange rectangles." LayoutNGBlockFlow (anonymous) at (0,521) size 769x20 - LayoutBR {BR} at (18,0) size 0x0 + LayoutBR {BR} at (18,0) size 0x19 LayoutTable {TABLE} at (0,541) size 680x448 [border: (1px outset #808080)] LayoutTableSection {TBODY} at (1,1) size 678x446 LayoutTableRow {TR} at (0,0) size 678x28 @@ -63,19 +63,19 @@ LayoutText {#text} at (18,0) size 594x19 text run at (18,0) width 594: "This text should be flowing past a tall orange rectangle on the left side of the browser window." LayoutNGBlockFlow (anonymous) at (4,40) size 658x20 - LayoutBR {BR} at (18,0) size 0x0 + LayoutBR {BR} at (18,0) size 0x19 LayoutImage (floating) {IMG} at (0,20) size 15x50 LayoutNGBlockFlow {P} at (4,110) size 658x20 LayoutText {#text} at (0,0) size 649x19 text run at (0,0) width 649: "This paragraph should appear below the tall orange rectangle above and to the left, and not flow past it." LayoutNGBlockFlow (anonymous) at (4,146) size 658x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutImage (floating) {IMG} at (643,20) size 15x50 LayoutNGBlockFlow {P} at (4,216) size 658x20 LayoutText {#text} at (0,0) size 658x19 text run at (0,0) width 658: "This paragraph should appear below the tall orange rectangle above and to the right, and not flow past it." LayoutNGBlockFlow (anonymous) at (4,252) size 658x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutImage (floating) {IMG} at (0,20) size 15x50 LayoutImage (floating) {IMG} at (643,20) size 15x50 LayoutNGBlockFlow {P} at (4,322) size 658x20 @@ -87,6 +87,6 @@ LayoutText {#text} at (18,0) size 390x19 text run at (18,0) width 390: "This paragraph should be between both tall orange rectangles." LayoutNGBlockFlow (anonymous) at (4,394) size 658x20 - LayoutBR {BR} at (18,0) size 0x0 + LayoutBR {BR} at (18,0) size 0x19 layer at (8,121) size 769x2 clip at (0,0) size 0x0 LayoutNGBlockFlow {HR} at (0,113) size 769x2 [border: (1px inset #EEEEEE)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/clear_float-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/clear_float-expected.txt index 97e8a4a..e46d08e 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/clear_float-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/clear_float-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,33) size 784x144 - LayoutText {#text} at (0,0) size 616x128 + LayoutText {#text} at (0,0) size 616x144 text run at (0,0) width 392: "P { margin: 0; padding: 0; text-align: justify;}" text run at (392,0) width 0: " " text run at (0,16) width 0: " "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/float-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/float-expected.txt index 869cc71..24e365b 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/float-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/float-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x48 - LayoutText {#text} at (0,0) size 160x32 + LayoutText {#text} at (0,0) size 160x48 text run at (0,0) width 152: ".one {float: left;}" text run at (152,0) width 0: " " text run at (0,16) width 160: ".two {float: right;}" @@ -19,7 +19,7 @@ text run at (15,0) width 763: "This text should be flowing past a tall orange rectangle on the left side of the browser window. In this case, it is the image" text run at (15,20) width 212: "which has been floated to the left." LayoutNGBlockFlow (anonymous) at (0,171) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutImage (floating) {IMG} at (769,209) size 15x50 LayoutNGBlockFlow {P} at (0,217) size 784x40 LayoutText {#text} at (0,0) size 730x39 @@ -43,7 +43,7 @@ text run at (15,0) width 721: "This text should be flowing past a tall orange rectangle on the left side of the browser window. In this case, it is the" text run at (15,20) width 254: "image which has been floated to the left." LayoutNGBlockFlow (anonymous) at (4,60) size 762x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutImage (floating) {IMG} at (751,98) size 15x50 LayoutNGBlockFlow {P} at (4,106) size 762x40 LayoutText {#text} at (0,0) size 730x39
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/float_elements_in_series-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/float_elements_in_series-expected.txt index 2383a45..d9b698f 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/float_elements_in_series-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/float_elements_in_series-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,33) size 769x208 - LayoutText {#text} at (0,0) size 512x192 + LayoutText {#text} at (0,0) size 512x208 text run at (0,0) width 392: "P { margin: 0; padding: 0; text-align: justify;}" text run at (392,0) width 0: " " text run at (0,16) width 0: " "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/float_margin-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/float_margin-expected.txt index a275838cc..7ac5916 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/float_margin-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/float_margin-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x144 - LayoutText {#text} at (0,0) size 560x128 + LayoutText {#text} at (0,0) size 560x144 text run at (0,0) width 344: "P.test {background: white; font-size: 20px;" text run at (344,0) width 0: " " text run at (0,16) width 560: " margin-left: 30px; margin-right: 10px; padding: 0; border: 0;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/float_on_text_elements-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/float_on_text_elements-expected.txt index d854722..5c086903 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/float_on_text_elements-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/float_on_text_elements-expected.txt
@@ -15,7 +15,7 @@ text run at (0,60) width 769: "padding, border or margins on this and the previous element, so the text of the two elements should be very close to each" text run at (0,80) width 35: "other." LayoutNGBlockFlow (anonymous) at (0,100) size 769x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow (anonymous) at (0,138) size 769x100 LayoutNGBlockFlow (floating) {P} at (0,0) size 769x80 [bgcolor=#FFFF00] LayoutText {#text} at (0,0) size 769x79 @@ -25,7 +25,7 @@ text run at (0,60) width 217: "paragraph for diagnostic purposes." LayoutImage {IMG} at (0,80) size 15x15 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (15,80) size 0x0 + LayoutBR {BR} at (15,80) size 0x19 LayoutNGBlockFlow (anonymous) at (0,256) size 769x120 LayoutNGBlockFlow (floating) {P} at (0,0) size 384.50x120 [bgcolor=#FFFF00] LayoutText {#text} at (0,0) size 385x119 @@ -37,7 +37,7 @@ text run at (0,100) width 79: "undernearth." LayoutImage {IMG} at (384.50,0) size 15x15 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (399,0) size 0x0 + LayoutBR {BR} at (399,0) size 1x19 LayoutNGBlockFlow (anonymous) at (0,394) size 769x120 LayoutNGBlockFlow (floating) {P} at (384.50,0) size 384.50x120 [bgcolor=#FFFF00] LayoutText {#text} at (0,0) size 385x119 @@ -49,7 +49,7 @@ text run at (0,100) width 224: "right edge of the yellow box above." LayoutImage {IMG} at (0,0) size 15x15 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (15,0) size 0x0 + LayoutBR {BR} at (15,0) size 0x19 LayoutNGBlockFlow {P} at (0,532) size 769x60 LayoutNGBlockFlow (floating) {SPAN} at (0,0) size 48x37 [bgcolor=#C0C0C0] LayoutText {#text} at (0,0) size 21x36 @@ -59,7 +59,7 @@ text run at (48,20) width 721: "well as bold, with a content width of 1.5em and a background-color of silver. The top of the big letter \"T\" should" text run at (0,40) width 675: "be vertically aligned with the top of the first line of this paragraph. This is commonly known as \"drop-cap\"." LayoutNGBlockFlow (anonymous) at (0,592) size 769x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow (floating) {P} at (423,640) size 336x216 [bgcolor=#FFFF00] [border: (3px solid #FF0000)] LayoutText {#text} at (8,8) size 320x199 text run at (8,8) width 320: "This paragraph should be floated to the right, sort" @@ -86,7 +86,7 @@ text run at (0,180) width 413: "extend 10px above and to the right of the sidebar's red border," text run at (0,200) width 319: "due to the margin styles set for the floated element." LayoutNGBlockFlow (anonymous) at (0,850) size 769x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow {DIV} at (0,888) size 769x28 [bgcolor=#66CCFF] [border: (4px solid #FF0000)] LayoutNGBlockFlow (floating) {DIV} at (425,14) size 330x250 [bgcolor=#FFFF00] LayoutNGBlockFlow {P} at (5,5) size 320x240 @@ -107,7 +107,7 @@ LayoutText {#text} at (0,0) size 268x19 text run at (0,0) width 268: "See description in the box on the right side" LayoutNGBlockFlow (anonymous) at (0,916) size 769x246 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow (floating) {DIV} at (0,1180) size 192.25x80 [bgcolor=#66CCFF] LayoutNGBlockFlow {P} at (0,0) size 192.25x80 LayoutText {#text} at (0,0) size 193x79 @@ -127,7 +127,7 @@ text run at (192,0) width 385: "This paragraph should appear between a blue box (on the" text run at (192,20) width 229: "left) and a yellow box (on the right)." LayoutNGBlockFlow (anonymous) at (0,1220) size 769x40 - LayoutBR {BR} at (192,0) size 0x0 + LayoutBR {BR} at (192,0) size 1x19 LayoutNGBlockFlow (anonymous) at (0,1278) size 769x140 LayoutNGBlockFlow (floating) {DIV} at (0,0) size 576.75x140 [bgcolor=#66CCFF] LayoutNGBlockFlow (floating) {DIV} at (422.56,0) size 144.19x40 [bgcolor=#FFFF00] @@ -144,7 +144,7 @@ text run at (0,80) width 577: "the blue DIV, the yellow DIV should appear inside the blue rectangle. Due to it being" text run at (0,100) width 577: "floated to the right and having a 10px right margin, the yellow rectange should have a 10px" text run at (0,120) width 169: "blue stripe on its right side." - LayoutBR {BR} at (576,0) size 0x0 + LayoutBR {BR} at (576,0) size 1x19 LayoutTable {TABLE} at (0,1436) size 769x1494 [border: (1px outset #808080)] LayoutTableSection {TBODY} at (1,1) size 767x1492 LayoutTableRow {TR} at (0,0) size 767x28 @@ -169,7 +169,7 @@ text run at (0,60) width 747: "no padding, border or margins on this and the previous element, so the text of the two elements should be very close to" text run at (0,80) width 68: "each other." LayoutNGBlockFlow (anonymous) at (4,104) size 747x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow (anonymous) at (4,142) size 747x100 LayoutNGBlockFlow (floating) {P} at (0,0) size 747x80 [bgcolor=#FFFF00] LayoutText {#text} at (0,0) size 747x79 @@ -179,7 +179,7 @@ text run at (0,60) width 259: "to this paragraph for diagnostic purposes." LayoutImage {IMG} at (0,80) size 15x15 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (15,80) size 0x0 + LayoutBR {BR} at (15,80) size 0x19 LayoutNGBlockFlow (anonymous) at (4,260) size 747x120 LayoutNGBlockFlow (floating) {P} at (0,0) size 373.50x120 [bgcolor=#FFFF00] LayoutText {#text} at (0,0) size 374x119 @@ -191,7 +191,7 @@ text run at (0,100) width 79: "undernearth." LayoutImage {IMG} at (373.50,0) size 15x15 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (388,0) size 0x0 + LayoutBR {BR} at (388,0) size 1x19 LayoutNGBlockFlow (anonymous) at (4,398) size 747x120 LayoutNGBlockFlow (floating) {P} at (373.50,0) size 373.50x120 [bgcolor=#FFFF00] LayoutText {#text} at (0,0) size 374x119 @@ -203,7 +203,7 @@ text run at (0,100) width 247: "the right edge of the yellow box above." LayoutImage {IMG} at (0,0) size 15x15 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (15,0) size 0x0 + LayoutBR {BR} at (15,0) size 0x19 LayoutNGBlockFlow {P} at (4,536) size 747x60 LayoutNGBlockFlow (floating) {SPAN} at (0,0) size 48x37 [bgcolor=#C0C0C0] LayoutText {#text} at (0,0) size 21x36 @@ -213,7 +213,7 @@ text run at (48,20) width 699: "well as bold, with a content width of 1.5em and a background-color of silver. The top of the big letter \"T\"" text run at (0,40) width 721: "should be vertically aligned with the top of the first line of this paragraph. This is commonly known as \"drop-cap\"." LayoutNGBlockFlow (anonymous) at (4,596) size 747x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow (floating) {P} at (405,644) size 336x216 [bgcolor=#FFFF00] [border: (3px solid #FF0000)] LayoutText {#text} at (8,8) size 320x199 text run at (8,8) width 320: "This paragraph should be floated to the right, sort" @@ -241,7 +241,7 @@ text run at (0,200) width 391: "the right of the sidebar's red border, due to the margin styles" text run at (0,220) width 166: "set for the floated element." LayoutNGBlockFlow (anonymous) at (4,874) size 747x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow {DIV} at (4,912) size 747x28 [bgcolor=#66CCFF] [border: (4px solid #FF0000)] LayoutNGBlockFlow (floating) {DIV} at (403,14) size 330x250 [bgcolor=#FFFF00] LayoutNGBlockFlow {P} at (5,5) size 320x240 @@ -262,7 +262,7 @@ LayoutText {#text} at (0,0) size 268x19 text run at (0,0) width 268: "See description in the box on the right side" LayoutNGBlockFlow (anonymous) at (4,940) size 747x246 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow (floating) {DIV} at (4,1204) size 186.75x80 [bgcolor=#66CCFF] LayoutNGBlockFlow {P} at (0,0) size 186.75x80 LayoutText {#text} at (0,0) size 187x79 @@ -282,7 +282,7 @@ text run at (186,0) width 375: "This paragraph should appear between a blue box (on the" text run at (186,20) width 229: "left) and a yellow box (on the right)." LayoutNGBlockFlow (anonymous) at (4,1244) size 747x40 - LayoutBR {BR} at (186,0) size 0x0 + LayoutBR {BR} at (186,0) size 1x19 LayoutNGBlockFlow (anonymous) at (4,1302) size 747x140 LayoutNGBlockFlow (floating) {DIV} at (0,0) size 560.25x140 [bgcolor=#66CCFF] LayoutNGBlockFlow (floating) {DIV} at (410.19,0) size 140.06x40 [bgcolor=#FFFF00] @@ -299,7 +299,7 @@ text run at (0,80) width 561: "a child of the blue DIV, the yellow DIV should appear inside the blue rectangle. Due to" text run at (0,100) width 561: "it being floated to the right and having a 10px right margin, the yellow rectange should" text run at (0,120) width 250: "have a 10px blue stripe on its right side." - LayoutBR {BR} at (560,0) size 0x0 + LayoutBR {BR} at (560,0) size 1x19 layer at (8,136) size 769x2 clip at (0,0) size 0x0 LayoutNGBlockFlow {HR} at (0,128) size 769x2 [border: (1px inset #EEEEEE)] layer at (8,254) size 769x2 clip at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/height-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/height-expected.txt index eaeae8f..ce4f33af 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/height-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/height-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x48 - LayoutText {#text} at (0,0) size 168x32 + LayoutText {#text} at (0,0) size 168x48 text run at (0,0) width 160: ".one {height: 50px;}" text run at (160,0) width 0: " " text run at (0,16) width 168: ".two {height: 100px;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/margin_bottom-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/margin_bottom-expected.txt index 6e2d9592..e441e29 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/margin_bottom-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/margin_bottom-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x144 - LayoutText {#text} at (0,0) size 416x128 + LayoutText {#text} at (0,0) size 416x144 text run at (0,0) width 408: ".zero {background-color: silver; margin-bottom: 0;}" text run at (408,0) width 0: " " text run at (0,16) width 416: ".one {margin-bottom: 0.5in; background-color: aqua;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/margin_top_inline-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/margin_top_inline-expected.txt index a9e99fe2..b3a28a16 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/margin_top_inline-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/margin_top_inline-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x64 - LayoutText {#text} at (0,0) size 392x48 + LayoutText {#text} at (0,0) size 392x64 text run at (0,0) width 384: ".zero {background-color: silver; margin-top: 0;}" text run at (384,0) width 0: " " text run at (0,16) width 384: ".one {margin-top: 25px; background-color: aqua;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_bottom_inline-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_bottom_inline-expected.txt index 70414d87..76aee5a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_bottom_inline-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_bottom_inline-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x48 - LayoutText {#text} at (0,0) size 424x32 + LayoutText {#text} at (0,0) size 424x48 text run at (0,0) width 416: ".one {padding-bottom: 25px; background-color: aqua;}" text run at (416,0) width 0: " " text run at (0,16) width 424: ".two {padding-bottom: -10px; background-color: aqua;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_inline-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_inline-expected.txt index af54d5cc..ebff3a0 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_inline-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_inline-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x64 - LayoutText {#text} at (0,0) size 368x48 + LayoutText {#text} at (0,0) size 368x64 text run at (0,0) width 360: ".zero {background-color: silver; padding: 0;}" text run at (360,0) width 0: " " text run at (0,16) width 360: ".one {padding: 25px; background-color: aqua;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_left_inline-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_left_inline-expected.txt index d4cf0b1..4b9b9c7 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_left_inline-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_left_inline-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x48 - LayoutText {#text} at (0,0) size 408x32 + LayoutText {#text} at (0,0) size 408x48 text run at (0,0) width 400: ".one {padding-left: 25px; background-color: aqua;}" text run at (400,0) width 0: " " text run at (0,16) width 408: ".two {padding-left: -10px; background-color: aqua;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_right_inline-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_right_inline-expected.txt index 3f49e3e..2243214 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_right_inline-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_right_inline-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x48 - LayoutText {#text} at (0,0) size 568x32 + LayoutText {#text} at (0,0) size 568x48 text run at (0,0) width 560: ".one {padding-right: 25px; text-align: right; background-color: aqua;}" text run at (560,0) width 0: " " text run at (0,16) width 568: ".two {padding-right: -10px; text-align: right; background-color: aqua;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_top_inline-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_top_inline-expected.txt index 7f8f06d..db89c14 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_top_inline-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/padding_top_inline-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x48 - LayoutText {#text} at (0,0) size 400x32 + LayoutText {#text} at (0,0) size 400x48 text run at (0,0) width 392: ".one {padding-top: 25px; background-color: aqua;}" text run at (392,0) width 0: " " text run at (0,16) width 400: ".two {padding-top: -10px; background-color: aqua;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/cascade/cascade_order-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/cascade/cascade_order-expected.txt index 17832ccd..d597f24 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/cascade/cascade_order-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/cascade/cascade_order-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x176 - LayoutText {#text} at (0,0) size 576x160 + LayoutText {#text} at (0,0) size 576x176 text run at (0,0) width 576: "<LINK rel=\"stylesheet\" type=\"text/css\" HREF=\"../resources/linktest.css\">" text run at (576,0) width 0: " " text run at (0,16) width 152: "LI {color: purple;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/cascade/important-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/cascade/important-expected.txt index f930851..991531d 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/cascade/important-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/cascade/important-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x64 - LayoutText {#text} at (0,0) size 232x48 + LayoutText {#text} at (0,0) size 232x64 text run at (0,0) width 232: "P {color: green ! important;}" text run at (232,0) width 0: " " text run at (0,16) width 120: "P {color: red;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_image-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_image-expected.txt index faf70db..662ce35 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_image-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_image-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x48 - LayoutText {#text} at (0,0) size 440x32 + LayoutText {#text} at (0,0) size 440x48 text run at (0,0) width 440: ".one {list-style-image: url(../resources/oransqr.gif);}" text run at (440,0) width 0: " " text run at (0,16) width 240: ".two {list-style-image: none;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_position-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_position-expected.txt index 5b36d0f..2f39843 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_position-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_position-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x48 - LayoutText {#text} at (0,0) size 288x32 + LayoutText {#text} at (0,0) size 288x48 text run at (0,0) width 288: ".one {list-style-position: outside;}" text run at (288,0) width 0: " " text run at (0,16) width 280: ".two {list-style-position: inside;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_type-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_type-expected.txt index 18e8f96..e4809c6 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_type-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_type-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x160 - LayoutText {#text} at (0,0) size 304x144 + LayoutText {#text} at (0,0) size 304x160 text run at (0,0) width 232: ".one {list-style-type: disc;}" text run at (232,0) width 0: " " text run at (0,16) width 248: ".two {list-style-type: circle;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/white_space-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/white_space-expected.txt index fe09ea2..cbd6a946 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/white_space-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/white_space-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x64 - LayoutText {#text} at (0,0) size 232x48 + LayoutText {#text} at (0,0) size 232x64 text run at (0,0) width 192: ".one {white-space: pre;}" text run at (192,0) width 0: " " text run at (0,16) width 216: ".two {white-space: nowrap;}" @@ -16,7 +16,7 @@ text run at (232,32) width 0: " " text run at (0,48) width 0: " " LayoutNGBlockFlow {P} at (0,131) size 784x100 - LayoutText {#text} at (0,0) size 568x79 + LayoutText {#text} at (0,0) size 568x99 text run at (0,0) width 0: " " text run at (0,20) width 568: "This sentence should show extra space where there would ordinarily not be any." text run at (568,20) width 0: " " @@ -30,7 +30,7 @@ LayoutText {#text} at (0,0) size 891x19 text run at (0,0) width 891: "This sentence should not word-wrap, no matter how long the sentence is, as it has been set to nowrap and that should have the obvious effect." LayoutNGBlockFlow {P} at (0,283) size 784x40 - LayoutText {#text} at (0,0) size 296x19 + LayoutText {#text} at (0,0) size 296x39 text run at (0,0) width 0: " " text run at (0,20) width 296: "This sentence should show extra space, " LayoutInline {SPAN} at (0,0) size 156x19 @@ -52,7 +52,7 @@ text run at (4,90) width 4: " " LayoutNGTableCell {TD} at (12,28) size 899x200 [border: (1px inset #808080)] [r=1 c=1 rs=1 cs=1] LayoutNGBlockFlow {P} at (4,4) size 891x100 - LayoutText {#text} at (0,0) size 568x79 + LayoutText {#text} at (0,0) size 568x99 text run at (0,0) width 0: " " text run at (0,20) width 568: "This sentence should show extra space where there would ordinarily not be any." text run at (568,20) width 0: " " @@ -66,7 +66,7 @@ LayoutText {#text} at (0,0) size 891x19 text run at (0,0) width 891: "This sentence should not word-wrap, no matter how long the sentence is, as it has been set to nowrap and that should have the obvious effect." LayoutNGBlockFlow {P} at (4,156) size 891x40 - LayoutText {#text} at (0,0) size 296x19 + LayoutText {#text} at (0,0) size 296x39 text run at (0,0) width 0: " " text run at (0,20) width 296: "This sentence should show extra space, " LayoutInline {SPAN} at (0,0) size 156x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_attachment-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_attachment-expected.txt index a1ac7b3..8abf95a10 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_attachment-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_attachment-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x32 - LayoutText {#text} at (0,0) size 872x16 + LayoutText {#text} at (0,0) size 872x32 text run at (0,0) width 872: "BODY {background-image: url(../resources/bg.gif); background-repeat: repeat-x; background-attachment: fixed;}" text run at (872,0) width 0: " " text run at (0,16) width 0: " " @@ -32,31 +32,31 @@ text run at (0,0) width 40: "Value:" LayoutText {#text} at (40,0) size 81x19 text run at (40,0) width 81: " scroll | fixed" - LayoutBR {BR} at (121,0) size 0x0 + LayoutBR {BR} at (121,0) size 0x19 LayoutInline {EM} at (0,0) size 42x19 LayoutText {#text} at (0,20) size 42x19 text run at (0,20) width 42: "Initial:" LayoutText {#text} at (42,20) size 38x19 text run at (42,20) width 38: " scroll" - LayoutBR {BR} at (80,20) size 0x0 + LayoutBR {BR} at (80,20) size 0x19 LayoutInline {EM} at (0,0) size 68x19 LayoutText {#text} at (0,40) size 68x19 text run at (0,40) width 68: "Applies to:" LayoutText {#text} at (68,40) size 78x19 text run at (68,40) width 78: " all elements" - LayoutBR {BR} at (146,40) size 0x0 + LayoutBR {BR} at (146,40) size 0x19 LayoutInline {EM} at (0,0) size 62x19 LayoutText {#text} at (0,60) size 62x19 text run at (0,60) width 62: "Inherited:" LayoutText {#text} at (62,60) size 20x19 text run at (62,60) width 20: " no" - LayoutBR {BR} at (82,60) size 0x0 + LayoutBR {BR} at (82,60) size 0x19 LayoutInline {EM} at (0,0) size 120x19 LayoutText {#text} at (0,80) size 120x19 text run at (0,80) width 120: "Percentage values:" LayoutText {#text} at (120,80) size 32x19 text run at (120,80) width 32: " N/A" - LayoutBR {BR} at (152,80) size 0x0 + LayoutBR {BR} at (152,80) size 0x19 LayoutNGBlockFlow {P} at (0,441.53) size 784x40 LayoutText {#text} at (0,0) size 782x39 text run at (0,0) width 782: "If a background image is specified, the value of 'background-attachment' determines if it is fixed with regard to the canvas or" @@ -114,31 +114,31 @@ text run at (0,0) width 40: "Value:" LayoutText {#text} at (40,0) size 81x19 text run at (40,0) width 81: " scroll | fixed" - LayoutBR {BR} at (121,0) size 0x0 + LayoutBR {BR} at (121,0) size 0x19 LayoutInline {EM} at (0,0) size 42x19 LayoutText {#text} at (0,20) size 42x19 text run at (0,20) width 42: "Initial:" LayoutText {#text} at (42,20) size 38x19 text run at (42,20) width 38: " scroll" - LayoutBR {BR} at (80,20) size 0x0 + LayoutBR {BR} at (80,20) size 0x19 LayoutInline {EM} at (0,0) size 68x19 LayoutText {#text} at (0,40) size 68x19 text run at (0,40) width 68: "Applies to:" LayoutText {#text} at (68,40) size 78x19 text run at (68,40) width 78: " all elements" - LayoutBR {BR} at (146,40) size 0x0 + LayoutBR {BR} at (146,40) size 0x19 LayoutInline {EM} at (0,0) size 62x19 LayoutText {#text} at (0,60) size 62x19 text run at (0,60) width 62: "Inherited:" LayoutText {#text} at (62,60) size 20x19 text run at (62,60) width 20: " no" - LayoutBR {BR} at (82,60) size 0x0 + LayoutBR {BR} at (82,60) size 0x19 LayoutInline {EM} at (0,0) size 120x19 LayoutText {#text} at (0,80) size 120x19 text run at (0,80) width 120: "Percentage values:" LayoutText {#text} at (120,80) size 32x19 text run at (120,80) width 32: " N/A" - LayoutBR {BR} at (152,80) size 0x0 + LayoutBR {BR} at (152,80) size 0x19 LayoutNGBlockFlow {P} at (4,346.53) size 762x40 LayoutText {#text} at (0,0) size 718x39 text run at (0,0) width 718: "If a background image is specified, the value of 'background-attachment' determines if it is fixed with regard to the"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_color-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_color-expected.txt index 8ae252eb..b420dfbb 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_color-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_color-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x64 - LayoutText {#text} at (0,0) size 296x48 + LayoutText {#text} at (0,0) size 296x64 text run at (0,0) width 224: "P {background-color: green;}" text run at (224,0) width 0: " " text run at (0,16) width 240: ".one {background-color: lime;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_image-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_image-expected.txt index 7ff9390c..b29e41f 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_image-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_image-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x48 - LayoutText {#text} at (0,0) size 376x32 + LayoutText {#text} at (0,0) size 376x48 text run at (0,0) width 376: "P {background-image: url(../resources/bg.gif);}" text run at (376,0) width 0: " " text run at (0,16) width 240: ".one {background-image: none;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_position-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_position-expected.txt index 52ab5d9..0d0c7126 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_position-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_position-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x272 - LayoutText {#text} at (0,0) size 688x256 + LayoutText {#text} at (0,0) size 688x272 text run at (0,0) width 648: "BODY {background-image: url(../resources/bg.gif); background-position: right top;" text run at (648,0) width 0: " " text run at (0,16) width 288: " background-repeat: no-repeat;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_repeat-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_repeat-expected.txt index 63058e9..50546a6 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_repeat-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_repeat-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x240 - LayoutText {#text} at (0,0) size 880x224 + LayoutText {#text} at (0,0) size 880x240 text run at (0,0) width 672: ".one {background-image: url(../resources/oransqr.gif); background-repeat: repeat-y;}" text run at (672,0) width 0: " " text run at (0,16) width 672: ".two {background-image: url(../resources/oransqr.gif); background-repeat: repeat-x;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/color-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/color-expected.txt index 9204b1b6..9dbc97f 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/color-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/color-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x32 - LayoutText {#text} at (0,0) size 160x16 + LayoutText {#text} at (0,0) size 160x32 text run at (0,0) width 160: ".one {color: green;}" text run at (160,0) width 0: " " text run at (0,16) width 0: " "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/conformance/forward_compatible_parsing-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/conformance/forward_compatible_parsing-expected.txt index 3d35923a..7ca5c2cc 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/conformance/forward_compatible_parsing-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/conformance/forward_compatible_parsing-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x864 - LayoutText {#text} at (0,0) size 568x848 + LayoutText {#text} at (0,0) size 568x864 text run at (0,0) width 304: "P.one {color: green; rotation: 70deg;}" text run at (304,0) width 0: " " text run at (0,16) width 176: "P.oneb {color: green;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/floating_elements-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/floating_elements-expected.txt index 58c1dd8..7b9fa392 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/floating_elements-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/floating_elements-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x144 - LayoutText {#text} at (0,0) size 480x128 + LayoutText {#text} at (0,0) size 480x144 text run at (0,0) width 272: "HR.minor {clear: both; width: 5%;}" text run at (272,0) width 0: " " text run at (0,16) width 400: "HR.major {clear: both; width: 75%; margin: 1.5em;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/height_of_lines-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/height_of_lines-expected.txt index bbf5e5f3..332c323 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/height_of_lines-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/height_of_lines-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x288 - LayoutText {#text} at (0,0) size 536x272 + LayoutText {#text} at (0,0) size 536x288 text run at (0,0) width 344: "P.one {font-size: 14px; line-height: 20px;}" text run at (344,0) width 0: " " text run at (0,16) width 304: "IMG.onea {vertical-align: text-bottom;"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/inline_elements-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/inline_elements-expected.txt index c96a74b..9bb533db 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/inline_elements-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/inline_elements-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x112 - LayoutText {#text} at (0,0) size 560x96 + LayoutText {#text} at (0,0) size 560x112 text run at (0,0) width 208: "P.one {line-height: 200%;}" text run at (208,0) width 0: " " text run at (0,16) width 552: "SPAN.two {border-style: solid; border-width: 10px; border-color: red;"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/vertical_formatting-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/vertical_formatting-expected.txt index d4d4e4e..edd623a7 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/vertical_formatting-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/vertical_formatting-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x320 - LayoutText {#text} at (0,0) size 496x304 + LayoutText {#text} at (0,0) size 496x320 text run at (0,0) width 368: "P.one {margin-bottom: 2cm; padding-bottom: 0;}" text run at (368,0) width 0: " " text run at (0,16) width 320: "P.two {margin-top: 2cm; padding-top: 0;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/anchor-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/anchor-expected.txt index 2e3c1f32..096bcb4 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/anchor-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/anchor-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x96 - LayoutText {#text} at (0,0) size 200x80 + LayoutText {#text} at (0,0) size 200x96 text run at (0,0) width 136: "A {color: green;}" text run at (136,0) width 0: " " text run at (0,16) width 184: "A:link {color: purple;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/firstletter-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/firstletter-expected.txt index cc78226..a5152a3 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/firstletter-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/firstletter-expected.txt
@@ -10,7 +10,7 @@ LayoutTextFragment {#text} at (10,0) size 345x19 text run at (10,0) width 345: "he style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x64 - LayoutText {#text} at (0,0) size 312x48 + LayoutText {#text} at (0,0) size 312x64 text run at (0,0) width 248: "P:first-letter {color: maroon;}" text run at (248,0) width 0: " " text run at (0,16) width 288: ".two:first-letter {font-size: 200%;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/firstline-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/firstline-expected.txt index 0a88297..09094d52 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/firstline-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/firstline-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x64 - LayoutText {#text} at (0,0) size 360x48 + LayoutText {#text} at (0,0) size 360x64 text run at (0,0) width 224: "P:first-line {color: green;}" text run at (224,0) width 0: " " text run at (0,16) width 272: ".two:first-line {font-size: 200%;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/multiple_pseudo_elements-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/multiple_pseudo_elements-expected.txt index fdb0c177..855f61d0 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/multiple_pseudo_elements-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/multiple_pseudo_elements-expected.txt
@@ -10,7 +10,7 @@ LayoutTextFragment {#text} at (10,0) size 345x19 text run at (10,0) width 345: "he style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x112 - LayoutText {#text} at (0,0) size 368x96 + LayoutText {#text} at (0,0) size 368x112 text run at (0,0) width 224: "P:first-line {color: green;}" text run at (224,0) width 0: " " text run at (0,16) width 248: "P:first-letter {color: maroon;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/pseudo_elements_in_selectors-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/pseudo_elements_in_selectors-expected.txt index 4096a01..5553a3d 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/pseudo_elements_in_selectors-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/pseudo/pseudo_elements_in_selectors-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 380x19 text run at (0,0) width 380: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x64 - LayoutText {#text} at (0,0) size 264x48 + LayoutText {#text} at (0,0) size 264x64 text run at (0,0) width 264: "P:first-line {font-weight: bold;}" text run at (264,0) width 0: " " text run at (0,16) width 256: "P.two:first-line {color: green;}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/units/percentage_units-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/units/percentage_units-expected.txt index 08050d5..58d7000 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/units/percentage_units-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/units/percentage_units-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 769x80 - LayoutText {#text} at (0,0) size 504x64 + LayoutText {#text} at (0,0) size 504x80 text run at (0,0) width 224: ".zero { background: yellow }" text run at (224,0) width 0: " " text run at (0,16) width 504: ".one { margin-left: 25%; margin-right: 25%; background: white }"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/units/urls-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/units/urls-expected.txt index 4bd1311b..0cdf6fae 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/units/urls-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/units/urls-expected.txt
@@ -7,7 +7,7 @@ LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "The style declarations which apply to the text below are:" LayoutNGBlockFlow {PRE} at (0,36) size 784x64 - LayoutText {#text} at (0,0) size 648x48 + LayoutText {#text} at (0,0) size 648x64 text run at (0,0) width 648: "<LINK rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"../resources/bg.gif\">" text run at (648,0) width 0: " " text run at (0,16) width 296: "@import url(../resources/sec642.css);"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0803-c5505-mrgn-02-c-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0803-c5505-mrgn-02-c-expected.txt index 3d5fbbb1..978b0e5 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0803-c5505-mrgn-02-c-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0803-c5505-mrgn-02-c-expected.txt
@@ -4,6 +4,6 @@ LayoutNGBlockFlow {HTML} at (0,0) size 800x36 LayoutNGBlockFlow {BODY} at (8,-2) size 784x40 LayoutNGBlockFlow {P} at (-10,0) size 804x40 [color=#000080] - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutText {#text} at (0,20) size 293x19 text run at (0,20) width 293: " This page should have a horizontal scroll bar."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0905-c5525-fltblck-00-d-ag-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0905-c5525-fltblck-00-d-ag-expected.txt index f3bf7b57..bc21dc0 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0905-c5525-fltblck-00-d-ag-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0905-c5525-fltblck-00-d-ag-expected.txt
@@ -17,9 +17,9 @@ LayoutNGBlockFlow {P} at (0,0) size 784x45 [color=#FFFFFF] LayoutText {#text} at (433,0) size 15x15 text run at (433,0) width 15: "x" - LayoutBR {BR} at (448,0) size 0x0 + LayoutBR {BR} at (448,0) size 0x15 LayoutText {#text} at (433,15) size 15x15 text run at (433,15) width 15: "x" - LayoutBR {BR} at (448,15) size 0x0 + LayoutBR {BR} at (448,15) size 0x15 LayoutText {#text} at (433,30) size 15x15 text run at (433,30) width 15: "x"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1601-c547-indent-01-d-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1601-c547-indent-01-d-expected.txt index d23f9b8..bc43c92 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1601-c547-indent-01-d-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1601-c547-indent-01-d-expected.txt
@@ -10,13 +10,13 @@ LayoutNGBlockFlow {P} at (0,56) size 784x80 [bgcolor=#00FFFF] LayoutText {#text} at (80,0) size 211x19 text run at (80,0) width 211: "Only the first line of this sentence" - LayoutBR {BR} at (291,0) size 0x0 + LayoutBR {BR} at (291,0) size 0x19 LayoutText {#text} at (0,20) size 123x19 text run at (0,20) width 123: "should be indented," - LayoutBR {BR} at (123,20) size 0x0 + LayoutBR {BR} at (123,20) size 0x19 LayoutText {#text} at (0,40) size 145x19 text run at (0,40) width 145: "the others should all be" - LayoutBR {BR} at (145,40) size 0x0 + LayoutBR {BR} at (145,40) size 0x19 LayoutInline {EM} at (0,0) size 113x19 LayoutText {#text} at (0,60) size 113x19 text run at (0,60) width 113: "aligned on the left"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/background/background-large-position-and-size-remains-stable-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/background/background-large-position-and-size-remains-stable-expected.txt index 8960fbf9..4f844ec6 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/background/background-large-position-and-size-remains-stable-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/background/background-large-position-and-size-remains-stable-expected.txt
@@ -10,7 +10,7 @@ LayoutNGBlockFlow {DIV} at (181.75,0) size 177.75x177.75 [border: (5px solid #000000)] LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow (anonymous) at (0,200) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow {DIV} at (0,220) size 671x200 LayoutNGBlockFlow {DIV} at (0,0) size 177.75x177.75 [border: (5px solid #000000)] LayoutText {#text} at (177,162) size 5x20
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/masking/clip-path-inset-corners-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/masking/clip-path-inset-corners-expected.txt index 8aa9bcd..9f5f2e33 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/masking/clip-path-inset-corners-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/masking/clip-path-inset-corners-expected.txt
@@ -12,7 +12,7 @@ text run at (100,85) width 4: " " LayoutNGBlockFlow {DIV} at (104,0) size 100x100 [bgcolor=#FF0000] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (204,85) size 0x0 + LayoutBR {BR} at (204,85) size 0x19 LayoutNGBlockFlow {DIV} at (0,105) size 100x100 [bgcolor=#FF0000] LayoutText {#text} at (100,190) size 4x19 text run at (100,190) width 4: " "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-179a-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-179a-expected.txt index e835e22..103edf5 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-179a-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-179a-expected.txt
@@ -4,7 +4,7 @@ LayoutNGBlockFlow {HTML} at (0,0) size 800x128 LayoutNGBlockFlow {BODY} at (8,16) size 784x96 LayoutNGBlockFlow {P} at (0,0) size 784x96 [color=#008000] - LayoutInline (anonymous) at (0,0) size 163x19 - LayoutBR {BR} at (0,1) size 0x0 + LayoutInline (anonymous) at (0,0) size 163x94 + LayoutBR {BR} at (0,1) size 0x73 LayoutText {#text} at (0,76) size 163x19 text run at (0,76) width 163: "This line should be green."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-180a-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-180a-expected.txt index 7f52ee2..18c3190 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-180a-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-180a-expected.txt
@@ -4,6 +4,6 @@ LayoutNGBlockFlow {HTML} at (0,0) size 800x72 LayoutNGBlockFlow {BODY} at (8,16) size 784x40 LayoutNGBlockFlow {P} at (0,0) size 784x40 [color=#008000] - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutText {#text} at (0,20) size 163x19 text run at (0,20) width 163: "This line should be green."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-18b-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-18b-expected.txt index 4de59f9..705d0f11 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-18b-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-18b-expected.txt
@@ -7,7 +7,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 749x19 text run at (0,0) width 749: "The background color of this paragraph should turn to green when the mouse pointer hovers over any of the following:" - LayoutBR {BR} at (749,0) size 0x0 + LayoutBR {BR} at (749,0) size 0x19 LayoutInline {STRONG} at (0,0) size 63x19 LayoutText {#text} at (0,20) size 63x19 text run at (0,20) width 63: "This text."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-23-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-23-expected.txt index c758fe22..b38ef6e 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-23-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-23-expected.txt
@@ -5,11 +5,11 @@ LayoutNGBlockFlow {BODY} at (8,16) size 784x44 LayoutNGBlockFlow {P} at (0,0) size 784x44 LayoutButton {BUTTON} at (0,0) size 256x22 [bgcolor=#00FF00] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 240x16 + LayoutBlockFlow (anonymous) at (8,3) size 240x16 LayoutText {#text} at (0,0) size 240x16 text run at (0,0) width 240: "A button (enabled) with green background" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (256,1) size 0x0 + LayoutBR {BR} at (256,1) size 0x19 LayoutTextControl {INPUT} at (0,22) size 309x22 [bgcolor=#00FF00] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (10,41) size 305x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-24-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-24-expected.txt index 9d97f60..c83df35 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-24-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-24-expected.txt
@@ -5,11 +5,11 @@ LayoutNGBlockFlow {BODY} at (8,16) size 784x44 LayoutNGBlockFlow {P} at (0,0) size 784x44 LayoutButton {BUTTON} at (0,0) size 259x22 [color=#808080] [bgcolor=#00FF00] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 243x16 + LayoutBlockFlow (anonymous) at (8,3) size 243x16 LayoutText {#text} at (0,0) size 243x16 text run at (0,0) width 243: "A button (disabled) with green background" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (259,1) size 0x0 + LayoutBR {BR} at (259,1) size 0x19 LayoutTextControl {INPUT} at (0,22) size 309x22 [color=#545454] [bgcolor=#00FF00] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (10,41) size 305x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-68-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-68-expected.txt index 9d97f60..c83df35 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-68-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-68-expected.txt
@@ -5,11 +5,11 @@ LayoutNGBlockFlow {BODY} at (8,16) size 784x44 LayoutNGBlockFlow {P} at (0,0) size 784x44 LayoutButton {BUTTON} at (0,0) size 259x22 [color=#808080] [bgcolor=#00FF00] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 243x16 + LayoutBlockFlow (anonymous) at (8,3) size 243x16 LayoutText {#text} at (0,0) size 243x16 text run at (0,0) width 243: "A button (disabled) with green background" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (259,1) size 0x0 + LayoutBR {BR} at (259,1) size 0x19 LayoutTextControl {INPUT} at (0,22) size 309x22 [color=#545454] [bgcolor=#00FF00] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (10,41) size 305x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-69-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-69-expected.txt index c758fe22..b38ef6e 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-69-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-69-expected.txt
@@ -5,11 +5,11 @@ LayoutNGBlockFlow {BODY} at (8,16) size 784x44 LayoutNGBlockFlow {P} at (0,0) size 784x44 LayoutButton {BUTTON} at (0,0) size 256x22 [bgcolor=#00FF00] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 240x16 + LayoutBlockFlow (anonymous) at (8,3) size 240x16 LayoutText {#text} at (0,0) size 240x16 text run at (0,0) width 240: "A button (enabled) with green background" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (256,1) size 0x0 + LayoutBR {BR} at (256,1) size 0x19 LayoutTextControl {INPUT} at (0,22) size 309x22 [bgcolor=#00FF00] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (10,41) size 305x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-9-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-9-expected.txt index 605b1a7..c164909d 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-9-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-9-expected.txt
@@ -6,6 +6,6 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 [bgcolor=#00FF00] LayoutText {#text} at (0,0) size 304x19 text run at (0,0) width 304: "This paragraph should have a green background" - LayoutBR {BR} at (304,0) size 0x0 + LayoutBR {BR} at (304,0) size 0x19 LayoutText {#text} at (0,20) size 266x19 text run at (0,20) width 266: "because its title attribute begins with \"foo\""
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-179a-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-179a-expected.txt index 355c0ae..24a2d22 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-179a-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-179a-expected.txt
@@ -4,7 +4,7 @@ LayoutNGBlockFlow {html} at (0,0) size 800x128 LayoutNGBlockFlow {body} at (8,16) size 784x96 LayoutNGBlockFlow {p} at (0,0) size 784x96 [color=#008000] - LayoutInline (anonymous) at (0,0) size 163x19 - LayoutBR {br} at (0,1) size 0x0 + LayoutInline (anonymous) at (0,0) size 163x94 + LayoutBR {br} at (0,1) size 0x73 LayoutText {#text} at (0,76) size 163x19 text run at (0,76) width 163: "This line should be green."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-180a-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-180a-expected.txt index 8ba0fe5a..63c5599 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-180a-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-180a-expected.txt
@@ -4,6 +4,6 @@ LayoutNGBlockFlow {html} at (0,0) size 800x72 LayoutNGBlockFlow {body} at (8,16) size 784x40 LayoutNGBlockFlow {p} at (0,0) size 784x40 [color=#008000] - LayoutBR {br} at (0,0) size 0x0 + LayoutBR {br} at (0,0) size 0x19 LayoutText {#text} at (0,20) size 163x19 text run at (0,20) width 163: "This line should be green."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-18b-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-18b-expected.txt index c12655d..18f7303 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-18b-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-18b-expected.txt
@@ -7,7 +7,7 @@ LayoutNGBlockFlow {p} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 749x19 text run at (0,0) width 749: "The background color of this paragraph should turn to green when the mouse pointer hovers over any of the following:" - LayoutBR {br} at (749,0) size 0x0 + LayoutBR {br} at (749,0) size 0x19 LayoutInline {strong} at (0,0) size 63x19 LayoutText {#text} at (0,20) size 63x19 text run at (0,20) width 63: "This text."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-23-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-23-expected.txt index 275bf79..dd6ecc5b 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-23-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-23-expected.txt
@@ -5,11 +5,11 @@ LayoutNGBlockFlow {body} at (8,16) size 784x44 LayoutNGBlockFlow {p} at (0,0) size 784x44 LayoutButton {button} at (0,0) size 256x22 [bgcolor=#00FF00] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 240x16 + LayoutBlockFlow (anonymous) at (8,3) size 240x16 LayoutText {#text} at (0,0) size 240x16 text run at (0,0) width 240: "A button (enabled) with green background" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {br} at (256,1) size 0x0 + LayoutBR {br} at (256,1) size 0x19 LayoutTextControl {input} at (0,22) size 309x22 [bgcolor=#00FF00] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (10,41) size 305x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-24-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-24-expected.txt index 3be80099..1c81dc3 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-24-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-24-expected.txt
@@ -5,11 +5,11 @@ LayoutNGBlockFlow {body} at (8,16) size 784x44 LayoutNGBlockFlow {p} at (0,0) size 784x44 LayoutButton {button} at (0,0) size 259x22 [color=#808080] [bgcolor=#00FF00] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 243x16 + LayoutBlockFlow (anonymous) at (8,3) size 243x16 LayoutText {#text} at (0,0) size 243x16 text run at (0,0) width 243: "A button (disabled) with green background" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {br} at (259,1) size 0x0 + LayoutBR {br} at (259,1) size 0x19 LayoutTextControl {input} at (0,22) size 309x22 [color=#545454] [bgcolor=#00FF00] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (10,41) size 305x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-68-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-68-expected.txt index 3be80099..1c81dc3 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-68-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-68-expected.txt
@@ -5,11 +5,11 @@ LayoutNGBlockFlow {body} at (8,16) size 784x44 LayoutNGBlockFlow {p} at (0,0) size 784x44 LayoutButton {button} at (0,0) size 259x22 [color=#808080] [bgcolor=#00FF00] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 243x16 + LayoutBlockFlow (anonymous) at (8,3) size 243x16 LayoutText {#text} at (0,0) size 243x16 text run at (0,0) width 243: "A button (disabled) with green background" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {br} at (259,1) size 0x0 + LayoutBR {br} at (259,1) size 0x19 LayoutTextControl {input} at (0,22) size 309x22 [color=#545454] [bgcolor=#00FF00] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (10,41) size 305x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-69-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-69-expected.txt index 275bf79..dd6ecc5b 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-69-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-69-expected.txt
@@ -5,11 +5,11 @@ LayoutNGBlockFlow {body} at (8,16) size 784x44 LayoutNGBlockFlow {p} at (0,0) size 784x44 LayoutButton {button} at (0,0) size 256x22 [bgcolor=#00FF00] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 240x16 + LayoutBlockFlow (anonymous) at (8,3) size 240x16 LayoutText {#text} at (0,0) size 240x16 text run at (0,0) width 240: "A button (enabled) with green background" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {br} at (256,1) size 0x0 + LayoutBR {br} at (256,1) size 0x19 LayoutTextControl {input} at (0,22) size 309x22 [bgcolor=#00FF00] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (10,41) size 305x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-9-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-9-expected.txt index 934b722c..4594061 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-9-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-9-expected.txt
@@ -6,6 +6,6 @@ LayoutNGBlockFlow {p} at (0,0) size 784x40 [bgcolor=#00FF00] LayoutText {#text} at (0,0) size 304x19 text run at (0,0) width 304: "This paragraph should have a green background" - LayoutBR {br} at (304,0) size 0x0 + LayoutBR {br} at (304,0) size 0x19 LayoutText {#text} at (0,20) size 266x19 text run at (0,20) width 266: "because its title attribute begins with \"foo\""
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-179a-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-179a-expected.txt index e2bbd7c64..2d53d35 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-179a-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-179a-expected.txt
@@ -3,7 +3,7 @@ layer at (0,0) size 800x128 LayoutNGBlockFlow {test} at (0,0) size 800x128 LayoutNGBlockFlow {p} at (0,16) size 800x96 [color=#008000] - LayoutInline (anonymous) at (0,0) size 163x19 - LayoutBR {br} at (0,1) size 0x0 + LayoutInline (anonymous) at (0,0) size 163x94 + LayoutBR {br} at (0,1) size 0x73 LayoutText {#text} at (0,76) size 163x19 text run at (0,76) width 163: "This line should be green."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-180a-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-180a-expected.txt index 9e60246..3868ad2 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-180a-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-180a-expected.txt
@@ -3,6 +3,6 @@ layer at (0,0) size 800x72 LayoutNGBlockFlow {test} at (0,0) size 800x72 LayoutNGBlockFlow {p} at (0,16) size 800x40 [color=#008000] - LayoutBR {br} at (0,0) size 0x0 + LayoutBR {br} at (0,0) size 0x19 LayoutText {#text} at (0,20) size 163x19 text run at (0,20) width 163: "This line should be green."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-18b-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-18b-expected.txt index 522e0fe..eea6657 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-18b-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-18b-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {p} at (0,0) size 800x40 LayoutText {#text} at (0,0) size 749x19 text run at (0,0) width 749: "The background color of this paragraph should turn to green when the mouse pointer hovers over any of the following:" - LayoutBR {br} at (749,0) size 0x0 + LayoutBR {br} at (749,0) size 0x19 LayoutInline {strong} at (0,0) size 63x19 LayoutText {#text} at (0,20) size 63x19 text run at (0,20) width 63: "This text."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-23-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-23-expected.txt index 5159b8b..28d98c6 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-23-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-23-expected.txt
@@ -4,11 +4,11 @@ LayoutNGBlockFlow {test} at (0,0) size 800x76 LayoutNGBlockFlow {p} at (0,16) size 800x44 LayoutButton {button} at (0,0) size 256x22 [bgcolor=#00FF00] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 240x16 + LayoutBlockFlow (anonymous) at (8,3) size 240x16 LayoutText {#text} at (0,0) size 240x16 text run at (0,0) width 240: "A button (enabled) with green background" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {br} at (256,1) size 0x0 + LayoutBR {br} at (256,1) size 0x19 LayoutTextControl {input} at (0,22) size 309x22 [bgcolor=#00FF00] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (2,41) size 305x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-24-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-24-expected.txt index 65a9e36..e4f4962 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-24-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-24-expected.txt
@@ -4,11 +4,11 @@ LayoutNGBlockFlow {test} at (0,0) size 800x76 LayoutNGBlockFlow {p} at (0,16) size 800x44 LayoutButton {button} at (0,0) size 259x22 [color=#808080] [bgcolor=#00FF00] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 243x16 + LayoutBlockFlow (anonymous) at (8,3) size 243x16 LayoutText {#text} at (0,0) size 243x16 text run at (0,0) width 243: "A button (disabled) with green background" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {br} at (259,1) size 0x0 + LayoutBR {br} at (259,1) size 0x19 LayoutTextControl {input} at (0,22) size 309x22 [color=#545454] [bgcolor=#00FF00] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (2,41) size 305x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-68-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-68-expected.txt index 65a9e36..e4f4962 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-68-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-68-expected.txt
@@ -4,11 +4,11 @@ LayoutNGBlockFlow {test} at (0,0) size 800x76 LayoutNGBlockFlow {p} at (0,16) size 800x44 LayoutButton {button} at (0,0) size 259x22 [color=#808080] [bgcolor=#00FF00] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 243x16 + LayoutBlockFlow (anonymous) at (8,3) size 243x16 LayoutText {#text} at (0,0) size 243x16 text run at (0,0) width 243: "A button (disabled) with green background" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {br} at (259,1) size 0x0 + LayoutBR {br} at (259,1) size 0x19 LayoutTextControl {input} at (0,22) size 309x22 [color=#545454] [bgcolor=#00FF00] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (2,41) size 305x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-69-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-69-expected.txt index 5159b8b..28d98c6 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-69-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-69-expected.txt
@@ -4,11 +4,11 @@ LayoutNGBlockFlow {test} at (0,0) size 800x76 LayoutNGBlockFlow {p} at (0,16) size 800x44 LayoutButton {button} at (0,0) size 256x22 [bgcolor=#00FF00] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 240x16 + LayoutBlockFlow (anonymous) at (8,3) size 240x16 LayoutText {#text} at (0,0) size 240x16 text run at (0,0) width 240: "A button (enabled) with green background" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {br} at (256,1) size 0x0 + LayoutBR {br} at (256,1) size 0x19 LayoutTextControl {input} at (0,22) size 309x22 [bgcolor=#00FF00] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (2,41) size 305x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-9-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-9-expected.txt index ed869ae..b77ed1ad 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-9-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-9-expected.txt
@@ -5,6 +5,6 @@ LayoutNGBlockFlow {p} at (0,16) size 800x40 [bgcolor=#00FF00] LayoutText {#text} at (0,0) size 304x19 text run at (0,0) width 304: "This paragraph should have a green background" - LayoutBR {br} at (304,0) size 0x0 + LayoutBR {br} at (304,0) size 0x19 LayoutText {#text} at (0,20) size 266x19 text run at (0,20) width 266: "because its title attribute begins with \"foo\""
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/selectNode-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/selectNode-expected.txt index 5aa06706..8261150 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/selectNode-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/selectNode-expected.txt
@@ -12,7 +12,7 @@ LayoutNGBlockFlow {DIV} at (0,56) size 784x40 LayoutText {#text} at (0,0) size 24x19 text run at (0,0) width 24: "two" - LayoutBR {BR} at (24,0) size 0x0 + LayoutBR {BR} at (24,0) size 0x19 LayoutText {#text} at (0,20) size 31x19 text run at (0,20) width 31: "three" LayoutNGBlockFlow {DIV} at (0,96) size 784x20
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/selectNodeContents-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/selectNodeContents-expected.txt index b8aa5e1..f7ab80c 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/selectNodeContents-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/selectNodeContents-expected.txt
@@ -12,7 +12,7 @@ LayoutNGBlockFlow {DIV} at (0,56) size 784x40 LayoutText {#text} at (0,0) size 24x19 text run at (0,0) width 24: "two" - LayoutBR {BR} at (24,0) size 0x0 + LayoutBR {BR} at (24,0) size 0x19 LayoutText {#text} at (0,20) size 31x19 text run at (0,20) width 31: "three" LayoutNGBlockFlow {DIV} at (0,96) size 784x20
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/selection-button-text-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/selection-button-text-expected.txt index ace7cb46..4dd2c81 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/selection-button-text-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/selection-button-text-expected.txt
@@ -10,11 +10,11 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 784x42 LayoutText {#text} at (0,0) size 49x19 text run at (0,0) width 49: "Buttons" - LayoutBR {BR} at (49,0) size 0x0 + LayoutBR {BR} at (49,0) size 0x19 LayoutText {#text} at (0,21) size 59x19 text run at (0,21) width 59: "with text " LayoutButton {INPUT} at (59,20) size 62x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 46x16 + LayoutBlockFlow (anonymous) at (8,3) size 46x16 LayoutText {#text} at (0,0) size 46x16 text run at (0,0) width 46: "too little" LayoutText {#text} at (121,21) size 55x19 @@ -23,7 +23,7 @@ LayoutText {#text} at (0,1) size 54x19 text run at (0,1) width 54: "and text " LayoutButton {INPUT} at (54,0) size 70x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 54x16 + LayoutBlockFlow (anonymous) at (8,3) size 54x16 LayoutText {#text} at (0,0) size 54x16 text run at (0,0) width 54: "too much" LayoutText {#text} at (124,1) size 63x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt new file mode 100644 index 0000000..3a100a48 --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +PASS .grid 1 +FAIL .grid 2 assert_equals: +<div class="grid RTL"> + <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div> + <div data-offset-x="80" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div> + <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div> + <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div> +</div> +offsetLeft expected 35 but got 5 +PASS .grid 3 +FAIL .grid 4 assert_equals: +<div class="grid verticalRL"> + <div data-offset-x="105" data-offset-y="70" data-expected-width="90" data-expected-height="30" class="firstRowFirstColumn horizontal">X XX X</div> + <div data-offset-x="140" data-offset-y="150" data-expected-width="100" data-expected-height="50" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div> + <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div> + <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div> +</div> +offsetTop expected 115 but got 110 +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt new file mode 100644 index 0000000..3a100a48 --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +PASS .grid 1 +FAIL .grid 2 assert_equals: +<div class="grid RTL"> + <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div> + <div data-offset-x="80" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div> + <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div> + <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div> +</div> +offsetLeft expected 35 but got 5 +PASS .grid 3 +FAIL .grid 4 assert_equals: +<div class="grid verticalRL"> + <div data-offset-x="105" data-offset-y="70" data-expected-width="90" data-expected-height="30" class="firstRowFirstColumn horizontal">X XX X</div> + <div data-offset-x="140" data-offset-y="150" data-expected-width="100" data-expected-height="50" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div> + <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div> + <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div> +</div> +offsetTop expected 115 but got 110 +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-011-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-011-expected.txt new file mode 100644 index 0000000..e1b6f15 --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-011-expected.txt
@@ -0,0 +1,35 @@ +This is a testharness.js-based test. +FAIL .grid 1 assert_equals: +<div class="grid"> + <div data-offset-x="13" data-offset-y="2" data-expected-width="26" data-expected-height="70" class="firstRowFirstColumn verticalLR">X XX X</div> + <div data-offset-x="180" data-offset-y="60" data-expected-width="46" data-expected-height="80" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div> + <div data-offset-x="0" data-offset-y="160" data-expected-width="76" data-expected-height="20" class="secondRowFirstColumn RTL">X XX X</div> + <div data-offset-x="105" data-offset-y="160" data-expected-width="56" data-expected-height="70" class="secondRowSecondColumn verticalLR RTL">XX X<br>X XXX<br>X<br>XX XXX</div> +</div> +offsetLeft expected 180 but got 194 +FAIL .grid 2 assert_equals: +<div class="grid RTL"> + <div data-offset-x="155" data-offset-y="0" data-expected-width="26" data-expected-height="70" class="firstRowFirstColumn verticalLR">X XX X</div> + <div data-offset-x="80" data-offset-y="60" data-expected-width="46" data-expected-height="80" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div> + <div data-offset-x="160" data-offset-y="160" data-expected-width="76" data-expected-height="20" class="secondRowFirstColumn LTR">X XX X</div> + <div data-offset-x="35" data-offset-y="160" data-expected-width="56" data-expected-height="70" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div> +</div> +offsetLeft expected 155 but got 163 +FAIL .grid 3 assert_equals: +<div class="grid verticalLR"> + <div data-offset-x="5" data-offset-y="70" data-expected-width="76" data-expected-height="20" class="firstRowFirstColumn horizontal">X XX X</div> + <div data-offset-x="40" data-offset-y="150" data-expected-width="86" data-expected-height="40" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div> + <div data-offset-x="180" data-offset-y="10" data-expected-width="26" data-expected-height="20" class="secondRowFirstColumn verticalRL">X XX X</div> + <div data-offset-x="155" data-offset-y="110" data-expected-width="76" data-expected-height="50" class="secondRowSecondColumn horizontal RTL">XX X<br>X XXX<br>X<br>XX XXX</div> +</div> +offsetLeft expected 5 but got 13 +FAIL .grid 4 assert_equals: +<div class="grid verticalRL"> + <div data-offset-x="105" data-offset-y="70" data-expected-width="76" data-expected-height="20" class="firstRowFirstColumn horizontal">X XX X</div> + <div data-offset-x="140" data-offset-y="150" data-expected-width="86" data-expected-height="40" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div> + <div data-offset-x="5" data-offset-y="10" data-expected-width="76" data-expected-height="20" class="secondRowFirstColumn horizontal RTL">X XX X</div> + <div data-offset-x="5" data-offset-y="115" data-expected-width="56" data-expected-height="70" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div> +</div> +offsetLeft expected 105 but got 117 +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-inherit-color-bug-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-inherit-color-bug-expected.txt index 067ac40..70d86d1 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-inherit-color-bug-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-inherit-color-bug-expected.txt
@@ -18,10 +18,10 @@ text run at (0,0) width 600: "Example: With the following code, the background color of H1" text run at (0,18) width 560: "elements stays pink, no matter what background color the" text run at (0,36) width 130: "parents have:" - LayoutBR {BR} at (130,36) size 0x0 + LayoutBR {BR} at (130,36) size 0x18 LayoutText {#text} at (0,54) size 320x18 text run at (0,54) width 320: " H1 { background-color: pink; }" - LayoutBR {BR} at (320,54) size 0x0 + LayoutBR {BR} at (320,54) size 0x18 LayoutText {#text} at (0,72) size 290x18 text run at (0,72) width 290: " H1 { background: inherit; }" LayoutNGBlockFlow {P} at (4,302) size 615.19x54
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-repeat-with-background-color-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-repeat-with-background-color-expected.txt index c32deb1..3b6a2cc7 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-repeat-with-background-color-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-repeat-with-background-color-expected.txt
@@ -11,7 +11,7 @@ text run at (304,115) width 4: " " LayoutNGBlockFlow {DIV} at (318,10) size 130x110 [bgcolor=#008000] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (458,115) size 0x0 + LayoutBR {BR} at (458,115) size 0x19 LayoutNGBlockFlow {DIV} at (10,145) size 130x110 [bgcolor=#008000] LayoutText {#text} at (150,250) size 4x19 text run at (150,250) width 4: " " @@ -20,7 +20,7 @@ text run at (304,250) width 4: " " LayoutNGBlockFlow {DIV} at (318,145) size 130x110 [bgcolor=#008000] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (458,250) size 0x0 + LayoutBR {BR} at (458,250) size 0x19 LayoutNGBlockFlow {DIV} at (10,280) size 130x110 [bgcolor=#008000] LayoutText {#text} at (150,385) size 4x19 text run at (150,385) width 4: " " @@ -29,4 +29,4 @@ text run at (304,385) width 4: " " LayoutNGBlockFlow {DIV} at (318,280) size 130x110 [bgcolor=#008000] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (458,385) size 0x0 + LayoutBR {BR} at (458,385) size 0x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-svg-scaling-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-svg-scaling-expected.txt index 798679e..f7dd4e0b 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-svg-scaling-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-svg-scaling-expected.txt
@@ -11,7 +11,7 @@ text run at (104,35) width 4: " " LayoutNGBlockFlow {DIV} at (108,0) size 50x50 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (158,35) size 0x0 + LayoutBR {BR} at (158,35) size 0x19 LayoutNGBlockFlow {DIV} at (0,55) size 100x100 LayoutText {#text} at (100,140) size 4x19 text run at (100,140) width 4: " " @@ -20,7 +20,7 @@ text run at (204,140) width 4: " " LayoutNGBlockFlow {DIV} at (208,55) size 100x100 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (308,140) size 0x0 + LayoutBR {BR} at (308,140) size 0x19 LayoutNGBlockFlow {DIV} at (0,160) size 200x200 LayoutText {#text} at (200,345) size 4x19 text run at (200,345) width 4: " " @@ -29,4 +29,4 @@ text run at (404,345) width 4: " " LayoutNGBlockFlow {DIV} at (408,160) size 200x200 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (608,345) size 0x0 + LayoutBR {BR} at (608,345) size 0x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-svg-scaling-zoom-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-svg-scaling-zoom-expected.txt index 286b932..1e65354 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-svg-scaling-zoom-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/background-svg-scaling-zoom-expected.txt
@@ -11,7 +11,7 @@ text run at (52,15) width 2: " " LayoutNGBlockFlow {DIV} at (54,0) size 25x25 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (79,15) size 0x0 + LayoutBR {BR} at (79,15) size 0x12 LayoutNGBlockFlow {DIV} at (0,27) size 50x50 LayoutText {#text} at (50,67) size 2x12 text run at (50,67) width 2: " " @@ -20,7 +20,7 @@ text run at (102,67) width 2: " " LayoutNGBlockFlow {DIV} at (104,27) size 50x50 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (154,67) size 0x0 + LayoutBR {BR} at (154,67) size 0x12 LayoutNGBlockFlow {DIV} at (0,79) size 100x100 LayoutText {#text} at (100,169) size 2x12 text run at (100,169) width 2: " " @@ -29,4 +29,4 @@ text run at (202,169) width 2: " " LayoutNGBlockFlow {DIV} at (204,79) size 100x100 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (304,169) size 0x0 + LayoutBR {BR} at (304,169) size 0x12
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/border-radius-split-background-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/border-radius-split-background-expected.txt index b8a8da4..8df91ef 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/border-radius-split-background-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/border-radius-split-background-expected.txt
@@ -7,10 +7,10 @@ LayoutInline {SPAN} at (0,0) size 177x418 [bgcolor=#808080] [border: (2px solid #000000)] LayoutText {#text} at (3,19) size 50x114 text run at (3,19) width 50: " " - LayoutBR {BR} at (53,19) size 0x0 + LayoutBR {BR} at (53,19) size 0x114 LayoutText {#text} at (1,169) size 125x114 text run at (1,169) width 125: " " - LayoutBR {BR} at (126,169) size 0x0 + LayoutBR {BR} at (126,169) size 0x114 LayoutText {#text} at (1,319) size 175x114 text run at (1,319) width 175: " " LayoutText {#text} at (0,0) size 0x0 @@ -20,10 +20,10 @@ LayoutInline {SPAN} at (0,0) size 418x177 [bgcolor=#808080] [border: (2px solid #000000)] LayoutText {#text} at (319,3) size 114x50 text run at (319,3) width 50: " " - LayoutBR {BR} at (319,53) size 0x0 + LayoutBR {BR} at (319,53) size 114x0 LayoutText {#text} at (169,1) size 114x125 text run at (169,1) width 125: " " - LayoutBR {BR} at (169,126) size 0x0 + LayoutBR {BR} at (169,126) size 114x0 LayoutText {#text} at (19,1) size 114x175 text run at (19,1) width 175: " " LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/border-radius-split-background-image-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/border-radius-split-background-image-expected.txt index ba9281f..dd55d62 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/border-radius-split-background-image-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/border-radius-split-background-image-expected.txt
@@ -7,10 +7,10 @@ LayoutInline {SPAN} at (0,0) size 177x418 [bgcolor=#C0C0C0] [border: (2px solid #000000)] LayoutText {#text} at (3,19) size 50x114 text run at (3,19) width 50: " " - LayoutBR {BR} at (53,19) size 0x0 + LayoutBR {BR} at (53,19) size 0x114 LayoutText {#text} at (1,169) size 125x114 text run at (1,169) width 125: " " - LayoutBR {BR} at (126,169) size 0x0 + LayoutBR {BR} at (126,169) size 0x114 LayoutText {#text} at (1,319) size 175x114 text run at (1,319) width 175: " " LayoutText {#text} at (0,0) size 0x0 @@ -20,10 +20,10 @@ LayoutInline {SPAN} at (0,0) size 418x177 [bgcolor=#C0C0C0] [border: (2px solid #000000)] LayoutText {#text} at (319,3) size 114x50 text run at (319,3) width 50: " " - LayoutBR {BR} at (319,53) size 0x0 + LayoutBR {BR} at (319,53) size 114x0 LayoutText {#text} at (169,1) size 114x125 text run at (169,1) width 125: " " - LayoutBR {BR} at (169,126) size 0x0 + LayoutBR {BR} at (169,126) size 114x0 LayoutText {#text} at (19,1) size 114x175 text run at (19,1) width 175: " " LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/size/backgroundSize15-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/size/backgroundSize15-expected.txt index 771a2134..ac645c7b 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/size/backgroundSize15-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/size/backgroundSize15-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x960 LayoutNGBlockFlow {DIV} at (0,0) size 100x100 LayoutNGBlockFlow (anonymous) at (0,100) size 784x60 - LayoutBR {BR} at (0,0) size 0x0 - LayoutBR {BR} at (0,20) size 0x0 - LayoutBR {BR} at (0,40) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 + LayoutBR {BR} at (0,20) size 0x19 + LayoutBR {BR} at (0,40) size 0x19 LayoutNGBlockFlow {DIV} at (0,160) size 800x800
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/size/backgroundSize16-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/size/backgroundSize16-expected.txt new file mode 100644 index 0000000..8cad775 --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/size/backgroundSize16-expected.txt
@@ -0,0 +1,23 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutInline {SPAN} at (0,0) size 782x299 + LayoutText {#text} at (0,0) size 782x299 + text run at (0,0) width 752: "I am typing a lot of text so that this goes onto many lines. I am still typing. I am typing a lot of text so that this goes onto" + text run at (0,20) width 771: "many lines. I am still typing. I am typing a lot of text so that this goes onto many lines. I am still typing. I am typing a lot of" + text run at (0,40) width 762: "text so that this goes onto many lines. I am still typing. I am typing a lot of text so that this goes onto many lines. I am still" + text run at (0,60) width 768: "typing. I am typing a lot of text so that this goes onto many lines. I am still typing. I am typing a lot of text so that this goes" + text run at (0,80) width 766: "onto many lines. I am still typing. I am typing a lot of text so that this goes onto many lines. I am still typing. I am typing a" + text run at (0,100) width 773: "lot of text so that this goes onto many lines. I am still typing. I am typing a lot of text so that this goes onto many lines. I am" + text run at (0,120) width 761: "still typing. I am typing a lot of text so that this goes onto many lines. I am still typing. I am typing a lot of text so that this" + text run at (0,140) width 744: "goes onto many lines. I am still typing. I am typing a lot of text so that this goes onto many lines. I am still typing. I am" + text run at (0,160) width 759: "typing a lot of text so that this goes onto many lines. I am still typing. I am typing a lot of text so that this goes onto many" + text run at (0,180) width 777: "lines. I am still typing. I am typing a lot of text so that this goes onto many lines. I am still typing. I am typing a lot of text so" + text run at (0,200) width 774: "that this goes onto many lines. I am still typing. I am typing a lot of text so that this goes onto many lines. I am still typing. I" + text run at (0,220) width 782: "am typing a lot of text so that this goes onto many lines. I am still typing. I am typing a lot of text so that this goes onto many" + text run at (0,240) width 777: "lines. I am still typing. I am typing a lot of text so that this goes onto many lines. I am still typing. I am typing a lot of text so" + text run at (0,260) width 774: "that this goes onto many lines. I am still typing. I am typing a lot of text so that this goes onto many lines. I am still typing. I" + text run at (0,280) width 456: "am typing a lot of text so that this goes onto many lines. I am still typing." + LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/basic-shadows-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/basic-shadows-expected.txt index 980bd42..61b6dc94 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/basic-shadows-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/basic-shadows-expected.txt
@@ -7,10 +7,10 @@ LayoutInline {SPAN} at (0,0) size 264x129 [border: (5px solid #000000)] LayoutText {#text} at (5,15) size 55x19 text run at (5,15) width 55: "This text" - LayoutBR {BR} at (60,15) size 0x0 + LayoutBR {BR} at (60,15) size 0x19 LayoutText {#text} at (0,65) size 76x19 text run at (0,65) width 76: "should have" - LayoutBR {BR} at (76,65) size 0x0 + LayoutBR {BR} at (76,65) size 0x19 LayoutText {#text} at (0,115) size 259x19 text run at (0,115) width 259: "a multi-line shadow with a border-radius." LayoutText {#text} at (0,0) size 0x0 @@ -75,7 +75,7 @@ LayoutInline (anonymous) at (0,0) size 356x39 LayoutText {#text} at (0,0) size 356x19 text run at (0,0) width 356: "The first line of this div should have a box-shadow on it." - LayoutBR {BR} at (356,0) size 0x0 + LayoutBR {BR} at (356,0) size 0x19 LayoutText {#text} at (0,20) size 177x19 text run at (0,20) width 177: "This second line should not." LayoutNGBlockFlow {P} at (0,612) size 769x40 @@ -84,6 +84,6 @@ text run at (5,6) width 29: "T" LayoutTextFragment {#text} at (43,0) size 488x19 text run at (43,0) width 488: "he first letter of this paragraph should have a border and a nice shadow effect." - LayoutBR {BR} at (531,0) size 0x0 + LayoutBR {BR} at (531,0) size 0x19 LayoutText {#text} at (43,20) size 162x19 text run at (43,20) width 162: "It should look pretty cool."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/box-shadow-radius-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/box-shadow-radius-expected.txt index 607703eb..18099689 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/box-shadow-radius-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/box-shadow-radius-expected.txt
@@ -10,7 +10,7 @@ LayoutNGBlockFlow {DIV} at (296,4) size 280x280 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (580,179) size 0x0 + LayoutBR {BR} at (580,179) size 0x19 LayoutNGBlockFlow {DIV} at (4,292) size 280x280 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (288,467) size 4x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/inset-box-shadow-radius-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/inset-box-shadow-radius-expected.txt index 12fc6c6..2ca6c71 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/inset-box-shadow-radius-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/inset-box-shadow-radius-expected.txt
@@ -10,7 +10,7 @@ LayoutNGBlockFlow {DIV} at (296,4) size 280x280 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (580,269) size 0x0 + LayoutBR {BR} at (580,269) size 0x19 LayoutNGBlockFlow {DIV} at (4,293) size 280x280 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (288,558) size 4x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/inset-box-shadows-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/inset-box-shadows-expected.txt index 78b7d2f..e7fc428 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/inset-box-shadows-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/inset-box-shadows-expected.txt
@@ -8,13 +8,13 @@ LayoutText {#text} at (448,167) size 4x19 text run at (448,167) width 4: " " LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (674,167) size 0x0 + LayoutBR {BR} at (674,167) size 0x19 LayoutText {#text} at (222,354) size 4x19 text run at (222,354) width 4: " " LayoutText {#text} at (448,354) size 4x19 text run at (448,354) width 4: " " LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (674,354) size 0x0 + LayoutBR {BR} at (674,354) size 0x19 LayoutText {#text} at (222,541) size 4x19 text run at (222,541) width 4: " " LayoutText {#text} at (448,541) size 4x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/scaled-box-shadow-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/scaled-box-shadow-expected.txt index 325759c..6f4f3f7 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/scaled-box-shadow-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/box-shadow/scaled-box-shadow-expected.txt
@@ -10,7 +10,7 @@ LayoutNGBlockFlow {DIV} at (296,4) size 280x280 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (580,129) size 0x0 + LayoutBR {BR} at (580,129) size 0x19 LayoutNGBlockFlow {DIV} at (4,292) size 280x280 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (288,417) size 4x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css-generated-content/015-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css-generated-content/015-expected.txt new file mode 100644 index 0000000..a6275e9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css-generated-content/015-expected.txt
@@ -0,0 +1,21 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutTable {DIV} at (0,0) size 308x62 + LayoutTableSection (anonymous) at (0,0) size 308x62 + LayoutTableRow (anonymous) at (0,0) size 308x62 + LayoutNGTableCell (anonymous) at (0,0) size 308x61.72 [r=0 c=0 rs=1 cs=1] + LayoutNGBlockFlow (anonymous) at (0,0) size 308x0 + LayoutInline {FORM} at (0,0) size 0x0 + LayoutText {#text} at (0,0) size 0x0 + LayoutNGBlockFlow (anonymous) at (0,0) size 308x23 + LayoutNGBlockFlow {H3} at (0,0) size 308x23 + LayoutText {#text} at (0,0) size 308x22 + text run at (0,0) width 308: "There should be a fourth dot bellow..." + LayoutNGBlockFlow (anonymous) at (0,41.72) size 308x20 + LayoutInline {FORM} at (0,0) size 0x19 + LayoutInline {<pseudo:after>} at (0,0) size 4x19 + LayoutTextFragment (anonymous) at (0,0) size 4x19 + text run at (0,0) width 4: "."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css-generated-content/wbr-with-before-content-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css-generated-content/wbr-with-before-content-expected.txt index 4fce6ef..fe6ea8e 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css-generated-content/wbr-with-before-content-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css-generated-content/wbr-with-before-content-expected.txt
@@ -10,7 +10,7 @@ LayoutNGBlockFlow {A} at (1,1) size 200x25 [color=#0000EE] [bgcolor=#FFFFFF] LayoutText {#text} at (0,3) size 21x19 text run at (0,3) width 21: "foo" - LayoutWordBreak {WBR} at (21,3) size 0x0 + LayoutWordBreak {WBR} at (21,3) size 0x19 text run at (21,3) width 0: "\x{200B}" LayoutText {#text} at (21,3) size 20x19 text run at (21,3) width 20: "bar"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css-grid-layout/grid-align-baseline-vertical-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css-grid-layout/grid-align-baseline-vertical-expected.txt new file mode 100644 index 0000000..c5e069c --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css-grid-layout/grid-align-baseline-vertical-expected.txt
@@ -0,0 +1,16 @@ +This is a testharness.js-based test. +PASS .grid 1 +PASS .grid 2 +PASS .grid 3 +FAIL .grid 4 assert_equals: +<div class="grid" style="-webkit-writing-mode: vertical-lr"> + <div id="baseline6" data-offset-x="18" class="firstRowFirstColumn alignSelfBaseline">ahem</div> + <div id="baseline7" data-offset-x="18" class="firstRowSecondColumn alignSelfBaseline"><img src="../../fast/replaced/resources/1x1-blue.png" style="width: 50px;"></div> + <div data-expected-width="50" data-offset-x="25" class="firstRowThirdColumn alignSelfCenter"><img src="../../fast/replaced/resources/1x1-blue.png" style="width: 50px; vertical-align: middle"></div> + <div data-expected-width="50" data-offset-x="0" class="firstRowFourthColumn alignSelfBaseline"><img src="../../fast/replaced/resources/1x1-blue.png" style="width: 50px; vertical-align: middle"></div> + <div data-expected-width="100" data-offset-x="0" class="firstRowFifthColumn" style="width: 100px;"></div> +</div> +offsetLeft expected 18 but got 16 +PASS .grid 5 +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/001-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/001-expected.txt index 63534d2..aff4afb 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/001-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/001-expected.txt
@@ -10,6 +10,6 @@ text run at (-1,0) width 7: "\x{2022} " LayoutText {#text} at (22,0) size 264x19 text run at (22,0) width 264: "This list item should have an inside bullet." - LayoutBR {BR} at (286,0) size 0x0 + LayoutBR {BR} at (286,0) size 0x19 LayoutText {#text} at (0,20) size 246x19 text run at (0,20) width 246: "This line should begin under the bullet."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/color-correction-on-backgrounds-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/color-correction-on-backgrounds-expected.txt index 25122f8..9b6fe40 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/color-correction-on-backgrounds-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/color-correction-on-backgrounds-expected.txt
@@ -10,7 +10,7 @@ LayoutNGBlockFlow (floating) {DIV} at (0,0) size 100x100 [bgcolor=#560063] LayoutImage {IMG} at (100,0) size 100x100 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (200,85) size 0x0 + LayoutBR {BR} at (200,85) size 0x19 LayoutNGBlockFlow {P} at (0,157) size 784x20 LayoutText {#text} at (0,0) size 236x19 text run at (0,0) width 236: "These should not match (at this time):"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/color-correction-on-box-shadow-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/color-correction-on-box-shadow-expected.txt index f0a32481..6cf9088 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/color-correction-on-box-shadow-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/color-correction-on-box-shadow-expected.txt
@@ -9,5 +9,5 @@ text run at (0,20) width 232: "are both color-corrected from sRGB." LayoutNGBlockFlow {DIV} at (0,56) size 100x100 [bgcolor=#560063] LayoutNGBlockFlow (anonymous) at (0,156) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow {DIV} at (0,176) size 100x100 [bgcolor=#560063]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/empty-generated-content-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/empty-generated-content-expected.txt new file mode 100644 index 0000000..be1eeadd --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/empty-generated-content-expected.txt
@@ -0,0 +1,12 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x36 + LayoutNGBlockFlow {HTML} at (0,0) size 800x36 + LayoutNGBlockFlow {BODY} at (8,8) size 784x20 + LayoutText {#text} at (0,0) size 211x19 + text run at (0,0) width 211: "This page intentionally left blank." + LayoutInline {<pseudo:after>} at (0,0) size 0x19 + LayoutTextFragment (anonymous) at (0,0) size 0x0 + LayoutNGBlockFlow (anonymous) at (0,36) size 800x0 + LayoutInline {<pseudo:after>} at (0,0) size 0x0 + LayoutTextFragment (anonymous) at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/empty-inline-line-height-first-line-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/empty-inline-line-height-first-line-expected.txt index 6c1b60f..aa4ea3c 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/empty-inline-line-height-first-line-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/empty-inline-line-height-first-line-expected.txt
@@ -12,7 +12,7 @@ LayoutNGBlockFlow (relative positioned) {DIV} at (0,0) size 784x240 LayoutNGBlockFlow {DIV} at (0,0) size 784x240 [bgcolor=#00FF00] LayoutInline {SPAN} at (0,0) size 0x0 - LayoutBR {BR} at (0,32) size 0x0 + LayoutBR {BR} at (0,32) size 0x16 LayoutInline {SPAN} at (0,0) size 0x0 LayoutText {#text} at (0,152) size 16x16 text run at (0,152) width 16: "X"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/empty-inline-line-height-first-line-quirksmode-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/empty-inline-line-height-first-line-quirksmode-expected.txt index d93fe3f4..276aa4f 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/empty-inline-line-height-first-line-quirksmode-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/empty-inline-line-height-first-line-quirksmode-expected.txt
@@ -12,7 +12,7 @@ LayoutNGBlockFlow (relative positioned) {DIV} at (0,0) size 784x96 LayoutNGBlockFlow {DIV} at (0,0) size 784x96 [bgcolor=#00FF00] LayoutInline {SPAN} at (0,0) size 0x0 - LayoutBR {BR} at (0,32) size 0x0 + LayoutBR {BR} at (0,32) size 0x16 LayoutInline {SPAN} at (0,0) size 0x0 LayoutText {#text} at (0,80) size 16x16 text run at (0,80) width 16: "X"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/first-line-text-decoration-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/first-line-text-decoration-expected.txt index 801ba90..e398342 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/first-line-text-decoration-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/first-line-text-decoration-expected.txt
@@ -12,14 +12,14 @@ LayoutNGBlockFlow {DIV} at (0,82.91) size 784x88 [color=#008000] LayoutText {#text} at (0,10) size 616x27 text run at (0,10) width 616: "Underline Underline Underline Underline" - LayoutBR {BR} at (616,10) size 0x0 + LayoutBR {BR} at (616,10) size 0x27 LayoutText {#text} at (0,48) size 264x19 text run at (0,48) width 264: "Underline Underline Underline Underline" - LayoutBR {BR} at (264,48) size 0x0 + LayoutBR {BR} at (264,48) size 0x19 LayoutText {#text} at (0,68) size 264x19 text run at (0,68) width 264: "Underline Underline Underline Underline" LayoutNGBlockFlow (anonymous) at (0,170.91) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow {P} at (0,206.91) size 784x0 LayoutNGBlockFlow {P} at (0,206.91) size 784x20 LayoutText {#text} at (0,0) size 484x19 @@ -27,14 +27,14 @@ LayoutNGBlockFlow {DIV} at (0,242.91) size 784x88 [color=#008000] LayoutText {#text} at (0,10) size 548x27 text run at (0,10) width 548: "Overline Overline Overline Overline" - LayoutBR {BR} at (548,10) size 0x0 + LayoutBR {BR} at (548,10) size 0x27 LayoutText {#text} at (0,48) size 232x19 text run at (0,48) width 232: "Overline Overline Overline Overline" - LayoutBR {BR} at (232,48) size 0x0 + LayoutBR {BR} at (232,48) size 0x19 LayoutText {#text} at (0,68) size 232x19 text run at (0,68) width 232: "Overline Overline Overline Overline" LayoutNGBlockFlow (anonymous) at (0,330.91) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow {P} at (0,366.91) size 784x0 LayoutNGBlockFlow {P} at (0,366.91) size 784x20 LayoutText {#text} at (0,0) size 558x19 @@ -42,12 +42,12 @@ LayoutNGBlockFlow {DIV} at (0,402.91) size 784x88 [color=#008000] LayoutText {#text} at (0,10) size 700x27 text run at (0,10) width 700: "Line-Through Line-Through Line-Through Line" - LayoutBR {BR} at (700,10) size 0x0 + LayoutBR {BR} at (700,10) size 0x27 LayoutText {#text} at (0,48) size 368x19 text run at (0,48) width 368: "Line-Through Line-Through Line-Through Line-Through" - LayoutBR {BR} at (368,48) size 0x0 + LayoutBR {BR} at (368,48) size 0x19 LayoutText {#text} at (0,68) size 368x19 text run at (0,68) width 368: "Line-Through Line-Through Line-Through Line-Through" LayoutNGBlockFlow (anonymous) at (0,490.91) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow {P} at (0,526.91) size 784x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/first-line-text-decoration-inherited-from-parent-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/first-line-text-decoration-inherited-from-parent-expected.txt index 03019a8..80043fc 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/first-line-text-decoration-inherited-from-parent-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/first-line-text-decoration-inherited-from-parent-expected.txt
@@ -13,38 +13,38 @@ LayoutNGBlockFlow {P} at (0,0) size 784x68 [color=#008000] LayoutText {#text} at (0,10) size 616x27 text run at (0,10) width 616: "Underline Underline Underline Underline" - LayoutBR {BR} at (616,10) size 0x0 + LayoutBR {BR} at (616,10) size 0x27 LayoutText {#text} at (0,48) size 284x19 text run at (0,48) width 284: "Underline Underline Underline Underline" - LayoutBR {BR} at (284,48) size 0x0 + LayoutBR {BR} at (284,48) size 0x19 LayoutNGBlockFlow (anonymous) at (0,84) size 784x20 LayoutText {#text} at (0,0) size 264x19 text run at (0,0) width 264: "Underline Underline Underline Underline" LayoutNGBlockFlow (anonymous) at (0,181.72) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow {DIV} at (0,217.72) size 784x104 [color=#FF0000] LayoutNGBlockFlow {P} at (0,0) size 784x68 [color=#008000] LayoutText {#text} at (0,10) size 548x27 text run at (0,10) width 548: "Overline Overline Overline Overline" - LayoutBR {BR} at (548,10) size 0x0 + LayoutBR {BR} at (548,10) size 0x27 LayoutText {#text} at (0,48) size 244x19 text run at (0,48) width 244: "Overline Overline Overline Overline" - LayoutBR {BR} at (244,48) size 0x0 + LayoutBR {BR} at (244,48) size 0x19 LayoutNGBlockFlow (anonymous) at (0,84) size 784x20 LayoutText {#text} at (0,0) size 232x19 text run at (0,0) width 232: "Overline Overline Overline Overline" LayoutNGBlockFlow (anonymous) at (0,321.72) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow {DIV} at (0,357.72) size 784x104 [color=#FF0000] LayoutNGBlockFlow {P} at (0,0) size 784x68 [color=#008000] LayoutText {#text} at (0,10) size 700x27 text run at (0,10) width 700: "Line-Through Line-Through Line-Through Line" - LayoutBR {BR} at (700,10) size 0x0 + LayoutBR {BR} at (700,10) size 0x27 LayoutText {#text} at (0,48) size 400x19 text run at (0,48) width 400: "Line-Through Line-Through Line-Through Line-Through" - LayoutBR {BR} at (400,48) size 0x0 + LayoutBR {BR} at (400,48) size 0x19 LayoutNGBlockFlow (anonymous) at (0,84) size 784x20 LayoutText {#text} at (0,0) size 368x19 text run at (0,0) width 368: "Line-Through Line-Through Line-Through Line-Through" LayoutNGBlockFlow (anonymous) at (0,461.72) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/focus-ring-detached-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/focus-ring-detached-expected.txt index d14ea26c..1dbd8b1 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/focus-ring-detached-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/focus-ring-detached-expected.txt
@@ -19,7 +19,7 @@ LayoutInline {A} at (0,0) size 240x39 [color=#0000EE] LayoutText {#text} at (199,21) size 42x19 text run at (199,21) width 42: "should" - LayoutBR {BR} at (241,21) size 0x0 + LayoutBR {BR} at (241,21) size 0x19 LayoutText {#text} at (1,41) size 46x19 text run at (1,41) width 46: "contain" LayoutText {#text} at (47,41) size 349x39
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/layerZOrderCrash-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/layerZOrderCrash-expected.txt index 65b53ea..cbcf048 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/layerZOrderCrash-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/layerZOrderCrash-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 784x20 LayoutText {#text} at (0,0) size 615x19 text run at (0,0) width 615: "To reproduce this bug outside of DumpRenderTree, click the link below. If broken, we will crash." - LayoutBR {BR} at (615,0) size 0x0 + LayoutBR {BR} at (615,0) size 0x19 layer at (8,28) size 58x96 LayoutTable (relative positioned) {TABLE} at (0,20) size 58x96 LayoutTableSection {TBODY} at (0,0) size 58x96 @@ -24,11 +24,11 @@ LayoutNGTableCell {TD} at (2,2) size 48x62 [r=0 c=0 rs=1 cs=1] LayoutText {#text} at (1,1) size 46x19 text run at (1,1) width 46: "content" - LayoutBR {BR} at (47,1) size 0x0 + LayoutBR {BR} at (47,1) size 0x19 LayoutText {#text} at (1,21) size 46x19 text run at (1,21) width 46: "content" - LayoutBR {BR} at (47,21) size 0x0 + LayoutBR {BR} at (47,21) size 0x19 LayoutText {#text} at (1,41) size 46x19 text run at (1,41) width 46: "content" - LayoutBR {BR} at (47,41) size 0x0 + LayoutBR {BR} at (47,41) size 0x19 caret: position 5 of child 0 {#text} of body
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/line-height-overflow-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/line-height-overflow-expected.txt index 745b3fd..8ebf9ec 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/line-height-overflow-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/line-height-overflow-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 769x20 LayoutText {#text} at (0,0) size 557x19 text run at (0,0) width 557: "You should see a large green block below that is 32,768px tall. No red should be visible." - LayoutBR {BR} at (557,0) size 0x0 + LayoutBR {BR} at (557,0) size 0x19 LayoutNGBlockFlow {DIV} at (0,20) size 769x32768 [bgcolor=#FF0000] LayoutText {#text} at (0,0) size 0x0 layer at (8,28) size 769x32768 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/margin-top-bottom-dynamic-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/margin-top-bottom-dynamic-expected.txt index 03a09ba..7864ba44 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/margin-top-bottom-dynamic-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/margin-top-bottom-dynamic-expected.txt
@@ -34,7 +34,7 @@ LayoutText {#text} at (1,1) size 84x19 text run at (1,1) width 84: "Lorem ipsum" LayoutNGBlockFlow (anonymous) at (0,288) size 784x42 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutButton {INPUT} at (0,20) size 110x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] LayoutBlockFlow (anonymous) at (8,3) size 94x16 LayoutText {#text} at (0,0) size 94x16 @@ -57,7 +57,7 @@ LayoutText {#text} at (1,1) size 84x19 text run at (1,1) width 84: "Lorem ipsum" LayoutNGBlockFlow (anonymous) at (0,458) size 784x42 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutButton {INPUT} at (0,20) size 110x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] LayoutBlockFlow (anonymous) at (8,3) size 94x16 LayoutText {#text} at (0,0) size 94x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/negative-leading-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/negative-leading-expected.txt index a04fd96e..c4c9a3f9 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/negative-leading-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/negative-leading-expected.txt
@@ -13,7 +13,7 @@ text run at (0,-18) width 400: "Lorem ipsum dolor" text run at (0,1) width 168: "sit amet" LayoutNGBlockFlow (anonymous) at (0,108) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow {DIV} at (0,128) size 424x52 [border: (2px solid #FF0000)] LayoutNGBlockFlow {DIV} at (12,12) size 400x38 LayoutText {#text} at (0,-18) size 400x74
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/nested-floating-relative-position-percentages-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/nested-floating-relative-position-percentages-expected.txt index b4371ee..403c16aa 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/nested-floating-relative-position-percentages-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/nested-floating-relative-position-percentages-expected.txt
@@ -8,7 +8,7 @@ text run at (0,0) width 388: "The six boxes below should be centered in two rows of three." layer at (400,28) size 630x420 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600 LayoutNGBlockFlow (relative positioned) (floating) {DIV} at (0,20) size 630x420 - LayoutBR {BR} at (630,0) size 0x0 + LayoutBR {BR} at (630,0) size 0x19 layer at (90,33) size 200x200 LayoutNGBlockFlow (relative positioned) (floating) {DIV} at (5,5) size 200x200 [bgcolor=#000000] LayoutImage {IMG} at (0,0) size 200x200
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/nth-child-dynamic-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/nth-child-dynamic-expected.txt index 912ee27..a5b7f052 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/nth-child-dynamic-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/nth-child-dynamic-expected.txt
@@ -47,37 +47,37 @@ LayoutNGBlockFlow {DIV} at (10,314) size 764x252 [border: (1px solid #000000)] LayoutText {#text} at (6,6) size 261x19 text run at (6,6) width 261: "child 0: PASS: found color rgb(255, 0, 0)" - LayoutBR {BR} at (267,6) size 0x0 + LayoutBR {BR} at (267,6) size 0x19 LayoutText {#text} at (6,26) size 245x19 text run at (6,26) width 245: "child 1: PASS: found color rgb(0, 0, 0)" - LayoutBR {BR} at (251,26) size 0x0 + LayoutBR {BR} at (251,26) size 0x19 LayoutText {#text} at (6,46) size 245x19 text run at (6,46) width 245: "child 2: PASS: found color rgb(0, 0, 0)" - LayoutBR {BR} at (251,46) size 0x0 + LayoutBR {BR} at (251,46) size 0x19 LayoutText {#text} at (6,66) size 261x19 text run at (6,66) width 261: "child 3: PASS: found color rgb(255, 0, 0)" - LayoutBR {BR} at (267,66) size 0x0 + LayoutBR {BR} at (267,66) size 0x19 LayoutText {#text} at (6,86) size 245x19 text run at (6,86) width 245: "child 4: PASS: found color rgb(0, 0, 0)" - LayoutBR {BR} at (251,86) size 0x0 + LayoutBR {BR} at (251,86) size 0x19 LayoutText {#text} at (6,106) size 245x19 text run at (6,106) width 245: "child 5: PASS: found color rgb(0, 0, 0)" - LayoutBR {BR} at (251,106) size 0x0 + LayoutBR {BR} at (251,106) size 0x19 LayoutText {#text} at (6,126) size 261x19 text run at (6,126) width 261: "child 6: PASS: found color rgb(255, 0, 0)" - LayoutBR {BR} at (267,126) size 0x0 + LayoutBR {BR} at (267,126) size 0x19 LayoutText {#text} at (6,146) size 245x19 text run at (6,146) width 245: "child 7: PASS: found color rgb(0, 0, 0)" - LayoutBR {BR} at (251,146) size 0x0 + LayoutBR {BR} at (251,146) size 0x19 LayoutText {#text} at (6,166) size 245x19 text run at (6,166) width 245: "child 8: PASS: found color rgb(0, 0, 0)" - LayoutBR {BR} at (251,166) size 0x0 + LayoutBR {BR} at (251,166) size 0x19 LayoutText {#text} at (6,186) size 261x19 text run at (6,186) width 261: "child 9: PASS: found color rgb(255, 0, 0)" - LayoutBR {BR} at (267,186) size 0x0 + LayoutBR {BR} at (267,186) size 0x19 LayoutText {#text} at (6,206) size 253x19 text run at (6,206) width 253: "child 10: PASS: found color rgb(0, 0, 0)" - LayoutBR {BR} at (259,206) size 0x0 + LayoutBR {BR} at (259,206) size 0x19 LayoutText {#text} at (6,226) size 282x19 text run at (6,226) width 282: "div 1: PASS: found color rgb(153, 153, 255)" - LayoutBR {BR} at (288,226) size 0x0 + LayoutBR {BR} at (288,226) size 0x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/percentage-non-integer-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/percentage-non-integer-expected.txt index 8fba4836..08a2d443 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/percentage-non-integer-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/percentage-non-integer-expected.txt
@@ -55,7 +55,7 @@ LayoutNGBlockFlow {DIV} at (0,96) size 815x4 LayoutNGBlockFlow {DIV} at (0,0) size 100.23x4 [bgcolor=#00000080] LayoutNGBlockFlow (anonymous) at (0,100) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 layer at (8,128) size 784x0 LayoutNGBlockFlow (relative positioned) {DIV} at (0,120) size 784x0 layer at (8,128) size 292x20
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/pseudo-first-line-border-width-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/pseudo-first-line-border-width-expected.txt index 97de6379..80db839 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/pseudo-first-line-border-width-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/pseudo-first-line-border-width-expected.txt
@@ -16,7 +16,7 @@ LayoutInline {SPAN} at (0,0) size 500x210 [border: none (100px solid #008000)] LayoutText {#text} at (360,0) size 50x10 text run at (360,0) width 50: "this," - LayoutBR {BR} at (410,0) size 0x0 + LayoutBR {BR} at (410,0) size 0x10 LayoutText {#text} at (0,10) size 500x200 text run at (0,10) width 400: "is a" text run at (0,110) width 500: "pass."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/resize-corner-tracking-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/resize-corner-tracking-expected.txt index 79e1d50..39fe5cb 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/resize-corner-tracking-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/resize-corner-tracking-expected.txt
@@ -16,9 +16,9 @@ text run at (720,0) width 4: "." LayoutNGBlockFlow (anonymous) at (0,189) size 784x378 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (177,114) size 0x0 + LayoutBR {BR} at (177,114) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (200,178) size 0x0 + LayoutBR {BR} at (200,178) size 0x19 LayoutText {#text} at (0,0) size 0x0 layer at (8,8) size 784x2 clip at (0,0) size 0x0 LayoutNGBlockFlow {HR} at (0,0) size 784x2 [border: (1px inset #EEEEEE)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-bidi-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-bidi-expected.txt index 1726967f..ba147583 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-bidi-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-bidi-expected.txt
@@ -6,15 +6,15 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 784x80 LayoutText {#text} at (0,0) size 565x19 text run at (0,0) width 565: "Each consecutive pair of lines should look exactly the same apart from the trailing ellipsis." - LayoutBR {BR} at (565,0) size 0x0 + LayoutBR {BR} at (565,0) size 0x19 LayoutText {#text} at (0,20) size 534x19 text run at (0,20) width 534: "The ellipsis should appear on the left for the RTL case and on the right for LTR case." - LayoutBR {BR} at (534,20) size 0x0 - LayoutBR {BR} at (0,40) size 0x0 + LayoutBR {BR} at (534,20) size 0x19 + LayoutBR {BR} at (0,40) size 0x19 LayoutText {#text} at (0,60) size 60x19 text run at (0,60) width 60: "RTL text:" LayoutNGBlockFlow (anonymous) at (0,120) size 784x40 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutText {#text} at (0,20) size 62x19 text run at (0,20) width 62: "LTR Text" layer at (8,88) size 207x20 scrollX 125.00 scrollWidth 332
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-expected.txt index c75602f6..c5d371d 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-expected.txt
@@ -6,12 +6,12 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 784x100 LayoutText {#text} at (0,0) size 557x19 text run at (0,0) width 557: "This tests checks that the text-overflow:ellipsis property is handled correctly for bidi text." - LayoutBR {BR} at (557,0) size 0x0 - LayoutBR {BR} at (0,20) size 0x0 + LayoutBR {BR} at (557,0) size 0x19 + LayoutBR {BR} at (0,20) size 0x19 LayoutText {#text} at (0,40) size 737x19 text run at (0,40) width 737: "Pass if the ellipsis do not overlap the text and the underlines for the links are placed under the text and not the ellipsis." - LayoutBR {BR} at (737,40) size 0x0 - LayoutBR {BR} at (0,60) size 0x0 + LayoutBR {BR} at (737,40) size 0x19 + LayoutBR {BR} at (0,60) size 0x19 LayoutText {#text} at (0,80) size 34x19 text run at (0,80) width 34: "RTL:" LayoutNGBlockFlow (anonymous) at (0,142) size 784x20
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-strict-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-strict-expected.txt index ade83a22..950ba13 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-strict-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-strict-expected.txt
@@ -6,12 +6,12 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 784x100 LayoutText {#text} at (0,0) size 557x19 text run at (0,0) width 557: "This tests checks that the text-overflow:ellipsis property is handled correctly for bidi text." - LayoutBR {BR} at (557,0) size 0x0 - LayoutBR {BR} at (0,20) size 0x0 + LayoutBR {BR} at (557,0) size 0x19 + LayoutBR {BR} at (0,20) size 0x19 LayoutText {#text} at (0,40) size 737x19 text run at (0,40) width 737: "Pass if the ellipsis do not overlap the text and the underlines for the links are placed under the text and not the ellipsis." - LayoutBR {BR} at (737,40) size 0x0 - LayoutBR {BR} at (0,60) size 0x0 + LayoutBR {BR} at (737,40) size 0x19 + LayoutBR {BR} at (0,60) size 0x19 LayoutText {#text} at (0,80) size 34x19 text run at (0,80) width 34: "RTL:" LayoutNGBlockFlow (anonymous) at (0,142) size 784x20
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-center-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-center-expected.txt index bdbbe02..43ed862 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-center-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-center-expected.txt
@@ -43,19 +43,19 @@ LayoutText {#text} at (1,1) size 303x19 text run at (1,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi" text run at (288,1) width 16: "\x{2026}" - LayoutBR {BR} at (719,1) size 0x0 + LayoutBR {BR} at (719,1) size 0x19 LayoutText {#text} at (1,21) size 306x19 text run at (1,21) width 290: "orem ipsum dolor sit amet, consectetur adipisc" text run at (291,21) width 16: "\x{2026}" - LayoutBR {BR} at (709,21) size 0x0 + LayoutBR {BR} at (709,21) size 0x19 LayoutText {#text} at (1,41) size 302x19 text run at (1,41) width 286: "rem ipsum dolor sit amet, consectetur adipisci" text run at (287,41) width 16: "\x{2026}" - LayoutBR {BR} at (701,41) size 0x0 + LayoutBR {BR} at (701,41) size 0x19 LayoutText {#text} at (1,61) size 305x19 text run at (1,61) width 289: "em ipsum dolor sit amet, consectetur adipiscin" text run at (290,61) width 16: "\x{2026}" - LayoutBR {BR} at (696,61) size 0x0 + LayoutBR {BR} at (696,61) size 0x19 layer at (8,352) size 310x32 clip at (9,353) size 308x30 scrollWidth 747 LayoutNGBlockFlow {DIV} at (0,343.88) size 310x32 [border: (1px solid #000000)] LayoutText {#text} at (1,11) size 181x19 @@ -82,19 +82,19 @@ LayoutText {#text} at (22,1) size 303x19 text run at (22,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi" text run at (6,1) width 16: "\x{2026}" - LayoutBR {BR} at (-410,1) size 0x0 + LayoutBR {BR} at (-410,1) size 0x19 LayoutText {#text} at (19,21) size 306x19 text run at (19,21) width 290: "orem ipsum dolor sit amet, consectetur adipisc" text run at (3,21) width 16: "\x{2026}" - LayoutBR {BR} at (-400,21) size 0x0 + LayoutBR {BR} at (-400,21) size 0x19 LayoutText {#text} at (23,41) size 302x19 text run at (23,41) width 286: "rem ipsum dolor sit amet, consectetur adipisci" text run at (7,41) width 16: "\x{2026}" - LayoutBR {BR} at (-392,41) size 0x0 + LayoutBR {BR} at (-392,41) size 0x19 LayoutText {#text} at (20,61) size 305x19 text run at (20,61) width 289: "em ipsum dolor sit amet, consectetur adipiscin" text run at (4,61) width 16: "\x{2026}" - LayoutBR {BR} at (-387,61) size 0x0 + LayoutBR {BR} at (-387,61) size 0x19 layer at (8,767) size 310x32 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollX 440.00 scrollWidth 748 LayoutNGBlockFlow {DIV} at (0,758.75) size 310x32 [border: (1px solid #000000)] LayoutText {#text} at (128,11) size 181x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-justify-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-justify-expected.txt index 47e1231..db8a3b2 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-justify-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-justify-expected.txt
@@ -44,19 +44,19 @@ LayoutText {#text} at (1,1) size 303x19 text run at (1,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi" text run at (288,1) width 16: "\x{2026}" - LayoutBR {BR} at (719,1) size 0x0 + LayoutBR {BR} at (719,1) size 0x19 LayoutText {#text} at (1,21) size 306x19 text run at (1,21) width 290: "orem ipsum dolor sit amet, consectetur adipisc" text run at (291,21) width 16: "\x{2026}" - LayoutBR {BR} at (709,21) size 0x0 + LayoutBR {BR} at (709,21) size 0x19 LayoutText {#text} at (1,41) size 302x19 text run at (1,41) width 286: "rem ipsum dolor sit amet, consectetur adipisci" text run at (287,41) width 16: "\x{2026}" - LayoutBR {BR} at (701,41) size 0x0 + LayoutBR {BR} at (701,41) size 0x19 LayoutText {#text} at (1,61) size 305x19 text run at (1,61) width 289: "em ipsum dolor sit amet, consectetur adipiscin" text run at (290,61) width 16: "\x{2026}" - LayoutBR {BR} at (696,61) size 0x0 + LayoutBR {BR} at (696,61) size 0x19 layer at (8,372) size 310x32 clip at (9,373) size 308x30 scrollWidth 747 LayoutNGBlockFlow {DIV} at (0,363.88) size 310x32 [border: (1px solid #000000)] LayoutText {#text} at (1,11) size 181x19 @@ -83,19 +83,19 @@ LayoutText {#text} at (22,1) size 303x19 text run at (22,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi" text run at (6,1) width 16: "\x{2026}" - LayoutBR {BR} at (-410,1) size 0x0 + LayoutBR {BR} at (-410,1) size 0x19 LayoutText {#text} at (19,21) size 306x19 text run at (19,21) width 290: "orem ipsum dolor sit amet, consectetur adipisc" text run at (3,21) width 16: "\x{2026}" - LayoutBR {BR} at (-400,21) size 0x0 + LayoutBR {BR} at (-400,21) size 0x19 LayoutText {#text} at (23,41) size 302x19 text run at (23,41) width 286: "rem ipsum dolor sit amet, consectetur adipisci" text run at (7,41) width 16: "\x{2026}" - LayoutBR {BR} at (-392,41) size 0x0 + LayoutBR {BR} at (-392,41) size 0x19 LayoutText {#text} at (20,61) size 305x19 text run at (20,61) width 289: "em ipsum dolor sit amet, consectetur adipiscin" text run at (4,61) width 16: "\x{2026}" - LayoutBR {BR} at (-387,61) size 0x0 + LayoutBR {BR} at (-387,61) size 0x19 layer at (8,787) size 310x32 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollX 440.00 scrollWidth 748 LayoutNGBlockFlow {DIV} at (0,778.75) size 310x32 [border: (1px solid #000000)] LayoutText {#text} at (128,11) size 181x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-left-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-left-expected.txt index d27088b..85e03e2 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-left-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-left-expected.txt
@@ -43,19 +43,19 @@ LayoutText {#text} at (1,1) size 303x19 text run at (1,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi" text run at (288,1) width 16: "\x{2026}" - LayoutBR {BR} at (719,1) size 0x0 + LayoutBR {BR} at (719,1) size 0x19 LayoutText {#text} at (1,21) size 306x19 text run at (1,21) width 290: "orem ipsum dolor sit amet, consectetur adipisc" text run at (291,21) width 16: "\x{2026}" - LayoutBR {BR} at (709,21) size 0x0 + LayoutBR {BR} at (709,21) size 0x19 LayoutText {#text} at (1,41) size 302x19 text run at (1,41) width 286: "rem ipsum dolor sit amet, consectetur adipisci" text run at (287,41) width 16: "\x{2026}" - LayoutBR {BR} at (701,41) size 0x0 + LayoutBR {BR} at (701,41) size 0x19 LayoutText {#text} at (1,61) size 305x19 text run at (1,61) width 289: "em ipsum dolor sit amet, consectetur adipiscin" text run at (290,61) width 16: "\x{2026}" - LayoutBR {BR} at (696,61) size 0x0 + LayoutBR {BR} at (696,61) size 0x19 layer at (8,352) size 310x32 clip at (9,353) size 308x30 scrollWidth 747 LayoutNGBlockFlow {DIV} at (0,343.88) size 310x32 [border: (1px solid #000000)] LayoutText {#text} at (1,11) size 181x19 @@ -82,19 +82,19 @@ LayoutText {#text} at (22,1) size 303x19 text run at (22,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi" text run at (6,1) width 16: "\x{2026}" - LayoutBR {BR} at (-410,1) size 0x0 + LayoutBR {BR} at (-410,1) size 0x19 LayoutText {#text} at (19,21) size 306x19 text run at (19,21) width 290: "orem ipsum dolor sit amet, consectetur adipisc" text run at (3,21) width 16: "\x{2026}" - LayoutBR {BR} at (-400,21) size 0x0 + LayoutBR {BR} at (-400,21) size 0x19 LayoutText {#text} at (23,41) size 302x19 text run at (23,41) width 286: "rem ipsum dolor sit amet, consectetur adipisci" text run at (7,41) width 16: "\x{2026}" - LayoutBR {BR} at (-392,41) size 0x0 + LayoutBR {BR} at (-392,41) size 0x19 LayoutText {#text} at (20,61) size 305x19 text run at (20,61) width 289: "em ipsum dolor sit amet, consectetur adipiscin" text run at (4,61) width 16: "\x{2026}" - LayoutBR {BR} at (-387,61) size 0x0 + LayoutBR {BR} at (-387,61) size 0x19 layer at (8,767) size 310x32 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollX 440.00 scrollWidth 748 LayoutNGBlockFlow {DIV} at (0,758.75) size 310x32 [border: (1px solid #000000)] LayoutText {#text} at (128,11) size 181x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-right-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-right-expected.txt index 836c2a9..7c5f817 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-right-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-right-expected.txt
@@ -43,19 +43,19 @@ LayoutText {#text} at (1,1) size 303x19 text run at (1,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi" text run at (288,1) width 16: "\x{2026}" - LayoutBR {BR} at (719,1) size 0x0 + LayoutBR {BR} at (719,1) size 0x19 LayoutText {#text} at (1,21) size 306x19 text run at (1,21) width 290: "orem ipsum dolor sit amet, consectetur adipisc" text run at (291,21) width 16: "\x{2026}" - LayoutBR {BR} at (709,21) size 0x0 + LayoutBR {BR} at (709,21) size 0x19 LayoutText {#text} at (1,41) size 302x19 text run at (1,41) width 286: "rem ipsum dolor sit amet, consectetur adipisci" text run at (287,41) width 16: "\x{2026}" - LayoutBR {BR} at (701,41) size 0x0 + LayoutBR {BR} at (701,41) size 0x19 LayoutText {#text} at (1,61) size 305x19 text run at (1,61) width 289: "em ipsum dolor sit amet, consectetur adipiscin" text run at (290,61) width 16: "\x{2026}" - LayoutBR {BR} at (696,61) size 0x0 + LayoutBR {BR} at (696,61) size 0x19 layer at (8,352) size 310x32 clip at (9,353) size 308x30 scrollWidth 747 LayoutNGBlockFlow {DIV} at (0,343.88) size 310x32 [border: (1px solid #000000)] LayoutText {#text} at (1,11) size 181x19 @@ -82,19 +82,19 @@ LayoutText {#text} at (22,1) size 303x19 text run at (22,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi" text run at (6,1) width 16: "\x{2026}" - LayoutBR {BR} at (-410,1) size 0x0 + LayoutBR {BR} at (-410,1) size 0x19 LayoutText {#text} at (19,21) size 306x19 text run at (19,21) width 290: "orem ipsum dolor sit amet, consectetur adipisc" text run at (3,21) width 16: "\x{2026}" - LayoutBR {BR} at (-400,21) size 0x0 + LayoutBR {BR} at (-400,21) size 0x19 LayoutText {#text} at (23,41) size 302x19 text run at (23,41) width 286: "rem ipsum dolor sit amet, consectetur adipisci" text run at (7,41) width 16: "\x{2026}" - LayoutBR {BR} at (-392,41) size 0x0 + LayoutBR {BR} at (-392,41) size 0x19 LayoutText {#text} at (20,61) size 305x19 text run at (20,61) width 289: "em ipsum dolor sit amet, consectetur adipiscin" text run at (4,61) width 16: "\x{2026}" - LayoutBR {BR} at (-387,61) size 0x0 + LayoutBR {BR} at (-387,61) size 0x19 layer at (8,767) size 310x32 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollX 440.00 scrollWidth 748 LayoutNGBlockFlow {DIV} at (0,758.75) size 310x32 [border: (1px solid #000000)] LayoutText {#text} at (128,11) size 181x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-input-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-input-expected.txt index 7b33e99..2ab70f2f 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-input-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-input-expected.txt
@@ -9,7 +9,7 @@ LayoutNGBlockFlow {P} at (0,36) size 784x108 LayoutText {#text} at (0,0) size 481x19 text run at (0,0) width 481: "Apply \"text-overflow:clip\" to inputs. The following input should be clipped:" - LayoutBR {BR} at (481,0) size 0x0 + LayoutBR {BR} at (481,0) size 0x19 LayoutTextControl {INPUT} at (0,20) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,21) size 4x19 text run at (181,21) width 4: " " @@ -26,7 +26,7 @@ LayoutBlockFlow {DIV} at (0,0) size 164x16 LayoutText {#text} at (0,0) size 0x0 LayoutTextControl {INPUT} at (0,42) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (181,43) size 0x0 + LayoutBR {BR} at (181,43) size 0x19 LayoutTextControl {INPUT} at (0,64) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,65) size 4x19 text run at (181,65) width 4: " " @@ -47,7 +47,7 @@ LayoutNGBlockFlow {P} at (0,160) size 784x108 LayoutText {#text} at (0,0) size 536x19 text run at (0,0) width 536: "Apply \"text-overflow:ellipsis\" to inputs. The following input should show an ellipsis:" - LayoutBR {BR} at (536,0) size 0x0 + LayoutBR {BR} at (536,0) size 0x19 LayoutTextControl {INPUT} at (0,20) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,21) size 4x19 text run at (181,21) width 4: " " @@ -64,7 +64,7 @@ LayoutBlockFlow {DIV} at (0,0) size 164x16 LayoutText {#text} at (0,0) size 0x0 LayoutTextControl {INPUT} at (0,42) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (181,43) size 0x0 + LayoutBR {BR} at (181,43) size 0x19 LayoutTextControl {INPUT} at (0,64) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,65) size 4x19 text run at (181,65) width 4: " " @@ -85,7 +85,7 @@ LayoutNGBlockFlow {P} at (0,284) size 784x64 LayoutText {#text} at (0,0) size 233x19 text run at (0,0) width 233: "Dynamic style change text-overflow:" - LayoutBR {BR} at (233,0) size 0x0 + LayoutBR {BR} at (233,0) size 0x19 LayoutText {#text} at (0,21) size 239x19 text run at (0,21) width 239: "Clip to ellipsis (should show ellipsis): " LayoutTextControl {INPUT} at (239,20) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] @@ -93,7 +93,7 @@ text run at (420,21) width 4: " " LayoutTextControl {INPUT} at (424,20) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (605,21) size 0x0 + LayoutBR {BR} at (605,21) size 0x19 LayoutText {#text} at (0,43) size 262x19 text run at (0,43) width 262: "Ellipsis to clip (should not show ellipsis): " LayoutTextControl {INPUT} at (262,42) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] @@ -101,7 +101,7 @@ text run at (443,43) width 4: " " LayoutTextControl {INPUT} at (447,42) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (628,43) size 0x0 + LayoutBR {BR} at (628,43) size 0x19 layer at (10,75) size 177x16 scrollWidth 317 LayoutBlockFlow {DIV} at (2,3) size 177x16 [color=#757575] LayoutText {#text} at (0,0) size 317x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.txt index 64f749ef..625a1ba 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.txt
@@ -37,19 +37,19 @@ LayoutText {#text} at (62,1) size 19x303 text run at (62,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi" text run at (62,288) width 16: "\x{2026}" - LayoutBR {BR} at (62,719) size 0x0 + LayoutBR {BR} at (62,719) size 19x0 LayoutText {#text} at (42,1) size 19x306 text run at (42,1) width 290: "orem ipsum dolor sit amet, consectetur adipisc" text run at (42,291) width 16: "\x{2026}" - LayoutBR {BR} at (42,709) size 0x0 + LayoutBR {BR} at (42,709) size 19x0 LayoutText {#text} at (22,1) size 19x302 text run at (22,1) width 286: "rem ipsum dolor sit amet, consectetur adipisci" text run at (22,287) width 16: "\x{2026}" - LayoutBR {BR} at (22,701) size 0x0 + LayoutBR {BR} at (22,701) size 19x0 LayoutText {#text} at (2,1) size 19x305 text run at (2,1) width 289: "em ipsum dolor sit amet, consectetur adipiscin" text run at (2,290) width 16: "\x{2026}" - LayoutBR {BR} at (2,696) size 0x0 + LayoutBR {BR} at (2,696) size 19x0 layer at (8,793) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 747 LayoutNGBlockFlow {DIV} at (0,785.16) size 32x310 [border: (1px solid #000000)] LayoutText {#text} at (2,1) size 19x181 @@ -76,19 +76,19 @@ LayoutText {#text} at (62,22) size 19x303 text run at (62,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi" text run at (62,6) width 16: "\x{2026}" - LayoutBR {BR} at (62,-410) size 0x0 + LayoutBR {BR} at (62,-410) size 19x0 LayoutText {#text} at (42,19) size 19x306 text run at (42,19) width 290: "orem ipsum dolor sit amet, consectetur adipisc" text run at (42,3) width 16: "\x{2026}" - LayoutBR {BR} at (42,-400) size 0x0 + LayoutBR {BR} at (42,-400) size 19x0 LayoutText {#text} at (22,23) size 19x302 text run at (22,23) width 286: "rem ipsum dolor sit amet, consectetur adipisci" text run at (22,7) width 16: "\x{2026}" - LayoutBR {BR} at (22,-392) size 0x0 + LayoutBR {BR} at (22,-392) size 19x0 LayoutText {#text} at (2,20) size 19x305 text run at (2,20) width 289: "em ipsum dolor sit amet, consectetur adipiscin" text run at (2,4) width 16: "\x{2026}" - LayoutBR {BR} at (2,-387) size 0x0 + LayoutBR {BR} at (2,-387) size 19x0 layer at (8,2280) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 440.00 scrollHeight 748 LayoutNGBlockFlow {DIV} at (0,2272.03) size 32x310 [border: (1px solid #000000)] LayoutText {#text} at (2,128) size 19x181
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.txt index 64f749ef..625a1ba 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.txt
@@ -37,19 +37,19 @@ LayoutText {#text} at (62,1) size 19x303 text run at (62,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi" text run at (62,288) width 16: "\x{2026}" - LayoutBR {BR} at (62,719) size 0x0 + LayoutBR {BR} at (62,719) size 19x0 LayoutText {#text} at (42,1) size 19x306 text run at (42,1) width 290: "orem ipsum dolor sit amet, consectetur adipisc" text run at (42,291) width 16: "\x{2026}" - LayoutBR {BR} at (42,709) size 0x0 + LayoutBR {BR} at (42,709) size 19x0 LayoutText {#text} at (22,1) size 19x302 text run at (22,1) width 286: "rem ipsum dolor sit amet, consectetur adipisci" text run at (22,287) width 16: "\x{2026}" - LayoutBR {BR} at (22,701) size 0x0 + LayoutBR {BR} at (22,701) size 19x0 LayoutText {#text} at (2,1) size 19x305 text run at (2,1) width 289: "em ipsum dolor sit amet, consectetur adipiscin" text run at (2,290) width 16: "\x{2026}" - LayoutBR {BR} at (2,696) size 0x0 + LayoutBR {BR} at (2,696) size 19x0 layer at (8,793) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 747 LayoutNGBlockFlow {DIV} at (0,785.16) size 32x310 [border: (1px solid #000000)] LayoutText {#text} at (2,1) size 19x181 @@ -76,19 +76,19 @@ LayoutText {#text} at (62,22) size 19x303 text run at (62,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi" text run at (62,6) width 16: "\x{2026}" - LayoutBR {BR} at (62,-410) size 0x0 + LayoutBR {BR} at (62,-410) size 19x0 LayoutText {#text} at (42,19) size 19x306 text run at (42,19) width 290: "orem ipsum dolor sit amet, consectetur adipisc" text run at (42,3) width 16: "\x{2026}" - LayoutBR {BR} at (42,-400) size 0x0 + LayoutBR {BR} at (42,-400) size 19x0 LayoutText {#text} at (22,23) size 19x302 text run at (22,23) width 286: "rem ipsum dolor sit amet, consectetur adipisci" text run at (22,7) width 16: "\x{2026}" - LayoutBR {BR} at (22,-392) size 0x0 + LayoutBR {BR} at (22,-392) size 19x0 LayoutText {#text} at (2,20) size 19x305 text run at (2,20) width 289: "em ipsum dolor sit amet, consectetur adipiscin" text run at (2,4) width 16: "\x{2026}" - LayoutBR {BR} at (2,-387) size 0x0 + LayoutBR {BR} at (2,-387) size 19x0 layer at (8,2280) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 440.00 scrollHeight 748 LayoutNGBlockFlow {DIV} at (0,2272.03) size 32x310 [border: (1px solid #000000)] LayoutText {#text} at (2,128) size 19x181
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.txt index 64f749ef..625a1ba 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.txt
@@ -37,19 +37,19 @@ LayoutText {#text} at (62,1) size 19x303 text run at (62,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi" text run at (62,288) width 16: "\x{2026}" - LayoutBR {BR} at (62,719) size 0x0 + LayoutBR {BR} at (62,719) size 19x0 LayoutText {#text} at (42,1) size 19x306 text run at (42,1) width 290: "orem ipsum dolor sit amet, consectetur adipisc" text run at (42,291) width 16: "\x{2026}" - LayoutBR {BR} at (42,709) size 0x0 + LayoutBR {BR} at (42,709) size 19x0 LayoutText {#text} at (22,1) size 19x302 text run at (22,1) width 286: "rem ipsum dolor sit amet, consectetur adipisci" text run at (22,287) width 16: "\x{2026}" - LayoutBR {BR} at (22,701) size 0x0 + LayoutBR {BR} at (22,701) size 19x0 LayoutText {#text} at (2,1) size 19x305 text run at (2,1) width 289: "em ipsum dolor sit amet, consectetur adipiscin" text run at (2,290) width 16: "\x{2026}" - LayoutBR {BR} at (2,696) size 0x0 + LayoutBR {BR} at (2,696) size 19x0 layer at (8,793) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 747 LayoutNGBlockFlow {DIV} at (0,785.16) size 32x310 [border: (1px solid #000000)] LayoutText {#text} at (2,1) size 19x181 @@ -76,19 +76,19 @@ LayoutText {#text} at (62,22) size 19x303 text run at (62,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi" text run at (62,6) width 16: "\x{2026}" - LayoutBR {BR} at (62,-410) size 0x0 + LayoutBR {BR} at (62,-410) size 19x0 LayoutText {#text} at (42,19) size 19x306 text run at (42,19) width 290: "orem ipsum dolor sit amet, consectetur adipisc" text run at (42,3) width 16: "\x{2026}" - LayoutBR {BR} at (42,-400) size 0x0 + LayoutBR {BR} at (42,-400) size 19x0 LayoutText {#text} at (22,23) size 19x302 text run at (22,23) width 286: "rem ipsum dolor sit amet, consectetur adipisci" text run at (22,7) width 16: "\x{2026}" - LayoutBR {BR} at (22,-392) size 0x0 + LayoutBR {BR} at (22,-392) size 19x0 LayoutText {#text} at (2,20) size 19x305 text run at (2,20) width 289: "em ipsum dolor sit amet, consectetur adipiscin" text run at (2,4) width 16: "\x{2026}" - LayoutBR {BR} at (2,-387) size 0x0 + LayoutBR {BR} at (2,-387) size 19x0 layer at (8,2280) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 440.00 scrollHeight 748 LayoutNGBlockFlow {DIV} at (0,2272.03) size 32x310 [border: (1px solid #000000)] LayoutText {#text} at (2,128) size 19x181
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.txt index 64f749ef..625a1ba 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.txt
@@ -37,19 +37,19 @@ LayoutText {#text} at (62,1) size 19x303 text run at (62,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi" text run at (62,288) width 16: "\x{2026}" - LayoutBR {BR} at (62,719) size 0x0 + LayoutBR {BR} at (62,719) size 19x0 LayoutText {#text} at (42,1) size 19x306 text run at (42,1) width 290: "orem ipsum dolor sit amet, consectetur adipisc" text run at (42,291) width 16: "\x{2026}" - LayoutBR {BR} at (42,709) size 0x0 + LayoutBR {BR} at (42,709) size 19x0 LayoutText {#text} at (22,1) size 19x302 text run at (22,1) width 286: "rem ipsum dolor sit amet, consectetur adipisci" text run at (22,287) width 16: "\x{2026}" - LayoutBR {BR} at (22,701) size 0x0 + LayoutBR {BR} at (22,701) size 19x0 LayoutText {#text} at (2,1) size 19x305 text run at (2,1) width 289: "em ipsum dolor sit amet, consectetur adipiscin" text run at (2,290) width 16: "\x{2026}" - LayoutBR {BR} at (2,696) size 0x0 + LayoutBR {BR} at (2,696) size 19x0 layer at (8,793) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 747 LayoutNGBlockFlow {DIV} at (0,785.16) size 32x310 [border: (1px solid #000000)] LayoutText {#text} at (2,1) size 19x181 @@ -76,19 +76,19 @@ LayoutText {#text} at (62,22) size 19x303 text run at (62,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi" text run at (62,6) width 16: "\x{2026}" - LayoutBR {BR} at (62,-410) size 0x0 + LayoutBR {BR} at (62,-410) size 19x0 LayoutText {#text} at (42,19) size 19x306 text run at (42,19) width 290: "orem ipsum dolor sit amet, consectetur adipisc" text run at (42,3) width 16: "\x{2026}" - LayoutBR {BR} at (42,-400) size 0x0 + LayoutBR {BR} at (42,-400) size 19x0 LayoutText {#text} at (22,23) size 19x302 text run at (22,23) width 286: "rem ipsum dolor sit amet, consectetur adipisci" text run at (22,7) width 16: "\x{2026}" - LayoutBR {BR} at (22,-392) size 0x0 + LayoutBR {BR} at (22,-392) size 19x0 LayoutText {#text} at (2,20) size 19x305 text run at (2,20) width 289: "em ipsum dolor sit amet, consectetur adipiscin" text run at (2,4) width 16: "\x{2026}" - LayoutBR {BR} at (2,-387) size 0x0 + LayoutBR {BR} at (2,-387) size 19x0 layer at (8,2280) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 440.00 scrollHeight 748 LayoutNGBlockFlow {DIV} at (0,2272.03) size 32x310 [border: (1px solid #000000)] LayoutText {#text} at (2,128) size 19x181
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/word-space-extra-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/word-space-extra-expected.txt index 27309f7..40c1debd 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/word-space-extra-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/word-space-extra-expected.txt
@@ -12,7 +12,7 @@ LayoutText {#text} at (0,0) size 204x17 text run at (0,0) width 204: "In a floated pre" LayoutNGBlockFlow (anonymous) at (0,47.41) size 1272x135 - LayoutText {#text} at (0,0) size 260x16 + LayoutText {#text} at (0,0) size 260x33 text run at (0,0) width 0: " " text run at (0,17) width 260: "Word spacing test " LayoutInline {EM} at (0,0) size 24x17 @@ -145,13 +145,13 @@ LayoutText {#text} at (596,119) size 492x16 text run at (596,119) width 492: ". (with monospace font from elements to too)" text run at (1088,119) width 0: " " - LayoutBR {BR} at (1272,0) size 0x0 + LayoutBR {BR} at (1272,0) size 0x19 LayoutNGBlockFlow {PRE} at (0,270.52) size 784x167.20 LayoutNGBlockFlow {H3} at (0,0) size 784x17 LayoutText {#text} at (0,0) size 240x17 text run at (0,0) width 240: "In an un-floated pre" LayoutNGBlockFlow (anonymous) at (0,32.20) size 784x135 - LayoutText {#text} at (0,0) size 260x16 + LayoutText {#text} at (0,0) size 260x33 text run at (0,0) width 0: " " text run at (0,17) width 260: "Word spacing test " LayoutInline {EM} at (0,0) size 24x17 @@ -310,7 +310,7 @@ text run at (300,3) width 48: "within" LayoutText {#text} at (348,0) size 127x19 text run at (348,0) width 127: " elements too." - LayoutBR {BR} at (475,0) size 0x0 + LayoutBR {BR} at (475,0) size 0x19 LayoutText {#text} at (0,20) size 176x19 text run at (0,20) width 176: "Word spacing test " LayoutInline {EM} at (0,0) size 18x19 @@ -331,7 +331,7 @@ LayoutText {#text} at (451,20) size 770x39 text run at (451,20) width 319: "too. (with comment between elements" text run at (0,40) width 72: "and too)" - LayoutBR {BR} at (72,40) size 0x0 + LayoutBR {BR} at (72,40) size 0x19 LayoutText {#text} at (0,60) size 176x19 text run at (0,60) width 176: "Word spacing test " LayoutInline {EM} at (0,0) size 18x19 @@ -352,7 +352,7 @@ LayoutText {#text} at (427,60) size 745x39 text run at (427,60) width 318: " too. (with comment (no preceding" text run at (0,80) width 292: "space) between elements and too)" - LayoutBR {BR} at (292,80) size 0x0 + LayoutBR {BR} at (292,80) size 0x19 LayoutText {#text} at (0,100) size 176x19 text run at (0,100) width 176: "Word spacing test " LayoutInline {EM} at (0,0) size 18x19 @@ -373,7 +373,7 @@ LayoutText {#text} at (451,100) size 727x39 text run at (451,100) width 276: "too. (with comment (no trailing" text run at (0,120) width 292: "space) between elements and too)" - LayoutBR {BR} at (292,120) size 0x0 + LayoutBR {BR} at (292,120) size 0x19 LayoutInline {SPAN} at (0,0) size 320x16 LayoutText {#text} at (0,143) size 204x16 text run at (0,143) width 204: "Word spacing test " @@ -393,7 +393,7 @@ LayoutText {#text} at (392,140) size 774x39 text run at (392,140) width 382: " elements too. (with monospace font from" text run at (0,160) width 155: "Word to elements)" - LayoutBR {BR} at (155,160) size 0x0 + LayoutBR {BR} at (155,160) size 0x19 LayoutText {#text} at (0,180) size 176x19 text run at (0,180) width 176: "Word spacing test " LayoutInline {SPAN} at (0,0) size 192x16 @@ -413,7 +413,7 @@ LayoutText {#text} at (368,180) size 750x39 text run at (368,180) width 382: " elements too. (with monospace font from" text run at (0,200) width 123: "for to within)" - LayoutBR {BR} at (123,200) size 0x0 + LayoutBR {BR} at (123,200) size 0x19 LayoutText {#text} at (0,220) size 176x19 text run at (0,220) width 176: "Word spacing test " LayoutInline {EM} at (0,0) size 18x19 @@ -437,8 +437,8 @@ text run at (0,240) width 140: "elements to too)" LayoutText {#text} at (0,0) size 0x0 LayoutBR {BR} at (140,255) size 0x0 - LayoutBR {BR} at (0,260) size 0x0 - LayoutBR {BR} at (0,280) size 0x0 + LayoutBR {BR} at (0,260) size 0x19 + LayoutBR {BR} at (0,280) size 0x19 LayoutNGBlockFlow {H2} at (0,818.06) size 784x27 LayoutText {#text} at (0,0) size 140x26 text run at (0,0) width 140: "letter-spacing" @@ -448,7 +448,7 @@ LayoutText {#text} at (0,0) size 224x17 text run at (0,0) width 224: "In a floated pre" LayoutNGBlockFlow (anonymous) at (0,47.41) size 1508x135 - LayoutText {#text} at (0,0) size 286x16 + LayoutText {#text} at (0,0) size 286x33 text run at (0,0) width 0: " " text run at (0,17) width 286: "Letter spacing test " LayoutInline {EM} at (0,0) size 39x17 @@ -581,13 +581,13 @@ LayoutText {#text} at (702,119) size 572x16 text run at (702,119) width 572: ". (with monospace font from elements to too)" text run at (1274,119) width 0: " " - LayoutBR {BR} at (1508,0) size 0x0 + LayoutBR {BR} at (1508,0) size 0x19 LayoutNGBlockFlow {PRE} at (0,1088.58) size 784x167.20 LayoutNGBlockFlow {H3} at (0,0) size 784x17 LayoutText {#text} at (0,0) size 280x17 text run at (0,0) width 280: "In an un-floated pre" LayoutNGBlockFlow (anonymous) at (0,32.20) size 784x135 - LayoutText {#text} at (0,0) size 286x16 + LayoutText {#text} at (0,0) size 286x33 text run at (0,0) width 0: " " text run at (0,17) width 286: "Letter spacing test " LayoutInline {EM} at (0,0) size 39x17 @@ -721,7 +721,7 @@ text run at (702,119) width 572: ". (with monospace font from elements to too)" text run at (1274,119) width 0: " " LayoutNGBlockFlow (anonymous) at (0,1268.78) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutInline {SPAN} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow (anonymous) at (0,1307.50) size 784x23 @@ -747,7 +747,7 @@ text run at (367,3) width 78: "within" LayoutText {#text} at (445,0) size 157x19 text run at (445,0) width 157: " elements too." - LayoutBR {BR} at (602,0) size 0x0 + LayoutBR {BR} at (602,0) size 0x19 LayoutText {#text} at (0,20) size 218x19 text run at (0,20) width 218: "Letter spacing test " LayoutInline {EM} at (0,0) size 33x19 @@ -768,7 +768,7 @@ LayoutText {#text} at (558,20) size 771x39 text run at (558,20) width 213: "too. (with comment" text run at (0,40) width 293: "between elements and too)" - LayoutBR {BR} at (293,40) size 0x0 + LayoutBR {BR} at (293,40) size 0x19 LayoutText {#text} at (0,60) size 218x19 text run at (0,60) width 218: "Letter spacing test " LayoutInline {EM} at (0,0) size 33x19 @@ -789,7 +789,7 @@ LayoutText {#text} at (549,60) size 771x39 text run at (549,60) width 222: " too. (with comment" text run at (0,80) width 533: "(no preceding space) between elements and too)" - LayoutBR {BR} at (533,80) size 0x0 + LayoutBR {BR} at (533,80) size 0x19 LayoutText {#text} at (0,100) size 218x19 text run at (0,100) width 218: "Letter spacing test " LayoutInline {EM} at (0,0) size 33x19 @@ -810,7 +810,7 @@ LayoutText {#text} at (558,100) size 771x39 text run at (558,100) width 213: "too. (with comment" text run at (0,120) width 510: "(no trailing space) between elements and too)" - LayoutBR {BR} at (510,120) size 0x0 + LayoutBR {BR} at (510,120) size 0x19 LayoutInline {SPAN} at (0,0) size 416x16 LayoutText {#text} at (0,143) size 260x16 text run at (0,143) width 260: "Letter spacing test " @@ -830,7 +830,7 @@ LayoutText {#text} at (503,140) size 727x39 text run at (503,140) width 224: " elements too. (with" text run at (0,160) width 450: "monospace font from Letter to elements)" - LayoutBR {BR} at (450,160) size 0x0 + LayoutBR {BR} at (450,160) size 0x19 LayoutText {#text} at (0,180) size 218x19 text run at (0,180) width 218: "Letter spacing test " LayoutInline {SPAN} at (0,0) size 247x16 @@ -850,7 +850,7 @@ LayoutText {#text} at (465,180) size 689x39 text run at (465,180) width 224: " elements too. (with" text run at (0,200) width 391: "monospace font from for to within)" - LayoutBR {BR} at (391,200) size 0x0 + LayoutBR {BR} at (391,200) size 0x19 LayoutText {#text} at (0,220) size 218x19 text run at (0,220) width 218: "Letter spacing test " LayoutInline {EM} at (0,0) size 33x19 @@ -874,8 +874,8 @@ text run at (0,240) width 418: "monospace font from elements to too)" LayoutText {#text} at (0,0) size 0x0 LayoutBR {BR} at (418,255) size 0x0 - LayoutBR {BR} at (0,260) size 0x0 - LayoutBR {BR} at (0,280) size 0x0 + LayoutBR {BR} at (0,260) size 0x19 + LayoutBR {BR} at (0,280) size 0x19 LayoutNGBlockFlow {H2} at (0,1669.13) size 784x27 LayoutText {#text} at (0,0) size 131x26 text run at (0,0) width 131: "both-spacing" @@ -885,7 +885,7 @@ LayoutText {#text} at (0,0) size 284x17 text run at (0,0) width 284: "In a floated pre" LayoutNGBlockFlow (anonymous) at (0,47.41) size 2025x135 - LayoutText {#text} at (0,0) size 543x16 + LayoutText {#text} at (0,0) size 543x33 text run at (0,0) width 0: " " text run at (0,17) width 543: "Word and letter spacing test " LayoutInline {EM} at (0,0) size 39x17 @@ -1018,13 +1018,13 @@ LayoutText {#text} at (1039,119) size 712x16 text run at (1039,119) width 712: ". (with monospace font from elements to too)" text run at (1751,119) width 0: " " - LayoutBR {BR} at (2025,0) size 0x0 + LayoutBR {BR} at (2025,0) size 0x19 LayoutNGBlockFlow {PRE} at (0,1939.64) size 784x167.20 LayoutNGBlockFlow {H3} at (0,0) size 784x17 LayoutText {#text} at (0,0) size 340x17 text run at (0,0) width 340: "In an un-floated pre" LayoutNGBlockFlow (anonymous) at (0,32.20) size 784x135 - LayoutText {#text} at (0,0) size 543x16 + LayoutText {#text} at (0,0) size 543x33 text run at (0,0) width 0: " " text run at (0,17) width 543: "Word and letter spacing test " LayoutInline {EM} at (0,0) size 39x17 @@ -1158,7 +1158,7 @@ text run at (1039,119) width 712: ". (with monospace font from elements to too)" text run at (1751,119) width 0: " " LayoutNGBlockFlow (anonymous) at (0,2119.84) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutInline {SPAN} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow (anonymous) at (0,2158.56) size 784x23 @@ -1184,7 +1184,7 @@ text run at (612,3) width 78: "within" LayoutText {#text} at (0,20) size 168x19 text run at (0,20) width 168: "elements too." - LayoutBR {BR} at (168,20) size 0x0 + LayoutBR {BR} at (168,20) size 0x19 LayoutText {#text} at (0,40) size 423x19 text run at (0,40) width 423: "Word and letter spacing test " LayoutInline {EM} at (0,0) size 33x19 @@ -1204,7 +1204,7 @@ text run at (0,60) width 124: "elements " LayoutText {#text} at (124,60) size 635x19 text run at (124,60) width 635: "too. (with comment between elements and too)" - LayoutBR {BR} at (759,60) size 0x0 + LayoutBR {BR} at (759,60) size 0x19 LayoutText {#text} at (0,80) size 423x19 text run at (0,80) width 423: "Word and letter spacing test " LayoutInline {EM} at (0,0) size 33x19 @@ -1225,7 +1225,7 @@ LayoutText {#text} at (95,100) size 677x39 text run at (95,100) width 582: " too. (with comment (no preceding space)" text run at (0,120) width 353: "between elements and too)" - LayoutBR {BR} at (353,120) size 0x0 + LayoutBR {BR} at (353,120) size 0x19 LayoutText {#text} at (0,140) size 423x19 text run at (0,140) width 423: "Word and letter spacing test " LayoutInline {EM} at (0,0) size 33x19 @@ -1246,7 +1246,7 @@ LayoutText {#text} at (124,160) size 771x39 text run at (124,160) width 647: "too. (with comment (no trailing space) between" text run at (0,180) width 236: "elements and too)" - LayoutBR {BR} at (236,180) size 0x0 + LayoutBR {BR} at (236,180) size 0x19 LayoutInline {SPAN} at (0,0) size 653x16 LayoutText {#text} at (0,203) size 477x16 text run at (0,203) width 477: "Word and letter spacing test " @@ -1266,7 +1266,7 @@ LayoutText {#text} at (0,220) size 688x39 text run at (0,220) width 688: "elements too. (with monospace font from Word to" text run at (0,240) width 105: "elements)" - LayoutBR {BR} at (105,240) size 0x0 + LayoutBR {BR} at (105,240) size 0x19 LayoutText {#text} at (0,260) size 423x19 text run at (0,260) width 423: "Word and letter spacing test " LayoutInline {SPAN} at (0,0) size 287x16 @@ -1285,7 +1285,7 @@ text run at (632,263) width 78: "within" LayoutText {#text} at (0,280) size 775x19 text run at (0,280) width 775: "elements too. (with monospace font from for to within)" - LayoutBR {BR} at (775,280) size 0x0 + LayoutBR {BR} at (775,280) size 0x19 LayoutText {#text} at (0,300) size 423x19 text run at (0,300) width 423: "Word and letter spacing test " LayoutInline {EM} at (0,0) size 33x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-auto-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-auto-expected.png new file mode 100644 index 0000000..a128757 --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-auto-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLElement/bdo-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLElement/bdo-expected.txt index 4f9cfed4..ef11507c 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLElement/bdo-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLElement/bdo-expected.txt
@@ -14,25 +14,25 @@ text run at (0,0) width 761: "If successful, the first sentence would be backward, and the second sentence regular. There should then be an extra blank" text run at (0,20) width 697: "line, followed by a line reading only \"A,\" and finally, a sentence where only the word \"umbrella\" is backward." LayoutNGBlockFlow (anonymous) at (0,138) size 784x120 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutInline {BDO} at (0,0) size 221x19 LayoutText {#text} at (0,20) size 221x19 text run at (0,20) width 221: "This sentence should be backward." LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (221,20) size 0x0 + LayoutBR {BR} at (221,20) size 0x19 LayoutInline {BDO} at (0,0) size 209x19 LayoutText {#text} at (0,40) size 209x19 text run at (0,40) width 209: "This sentence should be forward." LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (209,40) size 0x0 + LayoutBR {BR} at (209,40) size 0x19 LayoutInline {BDO} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (0,60) size 0x0 + LayoutBR {BR} at (0,60) size 0x19 LayoutInline {BDO} at (0,0) size 12x19 LayoutText {#text} at (0,80) size 12x19 text run at (0,80) width 12: "A" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (12,80) size 0x0 + LayoutBR {BR} at (12,80) size 0x19 LayoutInline {BDO} at (0,0) size 290x19 LayoutText {#text} at (0,100) size 26x19 text run at (0,100) width 26: "My "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLProgressElement/indeterminate-progress-001-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLProgressElement/indeterminate-progress-001-expected.txt index 4840a7d..34e42d72 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLProgressElement/indeterminate-progress-001-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLProgressElement/indeterminate-progress-001-expected.txt
@@ -8,13 +8,13 @@ LayoutBlockFlow {DIV} at (0,0) size 156x12 [bgcolor=#808080] LayoutBlockFlow {DIV} at (0,0) size 0x12 [bgcolor=#008000] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (160,0) size 0x0 + LayoutBR {BR} at (160,0) size 0x19 LayoutBlockFlow {PROGRESS} at (0,22.19) size 160x16 [border: (2px solid #0000FF)] LayoutBlockFlow {DIV} at (2,2) size 156x12 LayoutBlockFlow {DIV} at (0,0) size 156x12 [bgcolor=#808080] LayoutBlockFlow {DIV} at (0,0) size 0x12 [bgcolor=#008000] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (160,20) size 0x0 + LayoutBR {BR} at (160,20) size 0x19 LayoutBlockFlow {PROGRESS} at (0,42.19) size 160x16 [border: (2px solid #FF0000)] LayoutBlockFlow {DIV} at (2,2) size 156x12 LayoutBlockFlow {DIV} at (0,0) size 156x12 [bgcolor=#808080]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/children-nodes-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/children-nodes-expected.txt index 2d06f5b..2f21990 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/children-nodes-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/children-nodes-expected.txt
@@ -42,59 +42,59 @@ LayoutText {#text} at (30,0) size 24x19 text run at (30,0) width 24: "line" LayoutNGBlockFlow {DIV} at (0,174) size 784x400 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutText {#text} at (0,20) size 377x19 text run at (0,20) width 377: "Results: children.length = 5 (should be 5 DIV nodes below)" - LayoutBR {BR} at (377,20) size 0x0 + LayoutBR {BR} at (377,20) size 0x19 LayoutText {#text} at (0,40) size 113x19 text run at (0,40) width 113: " node: DIV (one)" - LayoutBR {BR} at (113,40) size 0x0 + LayoutBR {BR} at (113,40) size 0x19 LayoutText {#text} at (0,60) size 114x19 text run at (0,60) width 114: " node: DIV (two)" - LayoutBR {BR} at (114,60) size 0x0 + LayoutBR {BR} at (114,60) size 0x19 LayoutText {#text} at (0,80) size 121x19 text run at (0,80) width 121: " node: DIV (three)" - LayoutBR {BR} at (121,80) size 0x0 + LayoutBR {BR} at (121,80) size 0x19 LayoutText {#text} at (0,100) size 116x19 text run at (0,100) width 116: " node: DIV (four)" - LayoutBR {BR} at (116,100) size 0x0 + LayoutBR {BR} at (116,100) size 0x19 LayoutText {#text} at (0,120) size 114x19 text run at (0,120) width 114: " node: DIV (five)" - LayoutBR {BR} at (114,120) size 0x0 - LayoutBR {BR} at (0,140) size 0x0 + LayoutBR {BR} at (114,120) size 0x19 + LayoutBR {BR} at (0,140) size 0x19 LayoutText {#text} at (0,160) size 325x19 text run at (0,160) width 325: "childNodes.length = 11 (should be 11 nodes below)" - LayoutBR {BR} at (325,160) size 0x0 + LayoutBR {BR} at (325,160) size 0x19 LayoutText {#text} at (0,180) size 155x19 text run at (0,180) width 155: " node: #text (undefined)" - LayoutBR {BR} at (155,180) size 0x0 + LayoutBR {BR} at (155,180) size 0x19 LayoutText {#text} at (0,200) size 113x19 text run at (0,200) width 113: " node: DIV (one)" - LayoutBR {BR} at (113,200) size 0x0 + LayoutBR {BR} at (113,200) size 0x19 LayoutText {#text} at (0,220) size 155x19 text run at (0,220) width 155: " node: #text (undefined)" - LayoutBR {BR} at (155,220) size 0x0 + LayoutBR {BR} at (155,220) size 0x19 LayoutText {#text} at (0,240) size 114x19 text run at (0,240) width 114: " node: DIV (two)" - LayoutBR {BR} at (114,240) size 0x0 + LayoutBR {BR} at (114,240) size 0x19 LayoutText {#text} at (0,260) size 155x19 text run at (0,260) width 155: " node: #text (undefined)" - LayoutBR {BR} at (155,260) size 0x0 + LayoutBR {BR} at (155,260) size 0x19 LayoutText {#text} at (0,280) size 121x19 text run at (0,280) width 121: " node: DIV (three)" - LayoutBR {BR} at (121,280) size 0x0 + LayoutBR {BR} at (121,280) size 0x19 LayoutText {#text} at (0,300) size 155x19 text run at (0,300) width 155: " node: #text (undefined)" - LayoutBR {BR} at (155,300) size 0x0 + LayoutBR {BR} at (155,300) size 0x19 LayoutText {#text} at (0,320) size 116x19 text run at (0,320) width 116: " node: DIV (four)" - LayoutBR {BR} at (116,320) size 0x0 + LayoutBR {BR} at (116,320) size 0x19 LayoutText {#text} at (0,340) size 155x19 text run at (0,340) width 155: " node: #text (undefined)" - LayoutBR {BR} at (155,340) size 0x0 + LayoutBR {BR} at (155,340) size 0x19 LayoutText {#text} at (0,360) size 114x19 text run at (0,360) width 114: " node: DIV (five)" - LayoutBR {BR} at (114,360) size 0x0 + LayoutBR {BR} at (114,360) size 0x19 LayoutText {#text} at (0,380) size 155x19 text run at (0,380) width 155: " node: #text (undefined)" - LayoutBR {BR} at (155,380) size 0x0 + LayoutBR {BR} at (155,380) size 0x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/clone-node-dynamic-style-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/clone-node-dynamic-style-expected.txt index a2da0592f1..f5b2d291 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/clone-node-dynamic-style-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/clone-node-dynamic-style-expected.txt
@@ -25,7 +25,7 @@ LayoutText {#text} at (0,0) size 189x19 text run at (0,0) width 189: "Cloned Node with deep=false" LayoutNGBlockFlow {DIV} at (0,118.44) size 784x39 [bgcolor=#FFFF00] [border: (2px ridge #EEEEEE)] - LayoutBR {BR} at (2,2) size 0x0 + LayoutBR {BR} at (2,2) size 0x34 LayoutNGBlockFlow (anonymous) at (0,157.44) size 784x20 LayoutText {#text} at (0,0) size 184x19 text run at (0,0) width 184: "Cloned Node with deep=true"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/float-in-trailing-whitespace-after-last-line-break-2-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/float-in-trailing-whitespace-after-last-line-break-2-expected.txt index ef23740e1..dfbe1f1 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/float-in-trailing-whitespace-after-last-line-break-2-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/float-in-trailing-whitespace-after-last-line-break-2-expected.txt
@@ -5,6 +5,6 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutImage (floating) {IMG} at (0,0) size 100x100 LayoutNGBlockFlow {DIV} at (0,0) size 784x100 - LayoutBR {BR} at (100,0) size 0x0 + LayoutBR {BR} at (100,0) size 0x19 LayoutImage (floating) {IMG} at (0,100) size 100x100 LayoutImage (floating) {IMG} at (100,100) size 100x100 [bgcolor=#0000FF]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/float-in-trailing-whitespace-after-last-line-break-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/float-in-trailing-whitespace-after-last-line-break-expected.txt index 1f398e8..c7a0e61 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/float-in-trailing-whitespace-after-last-line-break-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/float-in-trailing-whitespace-after-last-line-break-expected.txt
@@ -19,8 +19,8 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 784x40 LayoutText {#text} at (0,0) size 259x19 text run at (0,0) width 259: "Somewhere on this page, there should be" - LayoutBR {BR} at (259,0) size 0x0 - LayoutBR {BR} at (0,20) size 0x0 + LayoutBR {BR} at (259,0) size 0x19 + LayoutBR {BR} at (0,20) size 0x19 LayoutNGBlockFlow (floating) {DIV} at (0,40) size 100x100 [bgcolor=#008000] LayoutNGBlockFlow {DIV} at (0,40) size 150x40 LayoutText {#text} at (100,0) size 46x39
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/selection-highlight-adjust-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/selection-highlight-adjust-expected.txt index 70b88cb2..d8ca079 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/selection-highlight-adjust-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/selection-highlight-adjust-expected.txt
@@ -17,13 +17,13 @@ text run at (138,20) width 4: "." LayoutNGBlockFlow {DIV} at (0,66) size 784x75 LayoutImage {IMG} at (0,0) size 0x30 - LayoutBR {BR} at (0,15) size 0x0 - LayoutBR {BR} at (0,35) size 0x0 + LayoutBR {BR} at (0,15) size 0x19 + LayoutBR {BR} at (0,35) size 0x19 LayoutInline {SPAN} at (0,0) size 309x19 LayoutText {#text} at (0,55) size 309x19 text run at (0,55) width 309: "The highlight should be on this line, not above it." LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (309,55) size 0x0 + LayoutBR {BR} at (309,55) size 0x19 layer at (8,72) size 784x2 clip at (0,0) size 0x0 LayoutNGBlockFlow {HR} at (0,56) size 784x2 [border: (1px inset #EEEEEE)] selection start: position 0 of child 0 {#text} of child 6 {SPAN} of child 5 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/encoding/xmacroman-encoding-test-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/encoding/xmacroman-encoding-test-expected.txt index 17873bba..b137be7 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/encoding/xmacroman-encoding-test-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/encoding/xmacroman-encoding-test-expected.txt
@@ -9,9 +9,9 @@ LayoutNGBlockFlow (anonymous) at (0,36) size 784x60 LayoutText {#text} at (0,0) size 82x19 text run at (0,0) width 82: "apostrophe: \x{2019}" - LayoutBR {BR} at (82,0) size 0x0 + LayoutBR {BR} at (82,0) size 0x19 LayoutText {#text} at (0,20) size 67x19 text run at (0,20) width 67: "ellipsis: \x{2026}" - LayoutBR {BR} at (67,20) size 0x0 + LayoutBR {BR} at (67,20) size 0x19 LayoutText {#text} at (0,40) size 77x19 text run at (0,40) width 77: "em-dash: \x{2014}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/basic-buttons-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/basic-buttons-expected.txt index 96c2874..4beb249 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/basic-buttons-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/basic-buttons-expected.txt
@@ -6,14 +6,14 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 784x80 LayoutText {#text} at (0,0) size 533x19 text run at (0,0) width 533: "Tests for basic button rendering. Creates a table with seven columns and seven rows." - LayoutBR {BR} at (533,0) size 0x0 + LayoutBR {BR} at (533,0) size 0x19 LayoutText {#text} at (0,20) size 507x19 text run at (0,20) width 507: "Creates two different types of buttons, one with an image (a red dot) and another" - LayoutBR {BR} at (507,20) size 0x0 + LayoutBR {BR} at (507,20) size 0x19 LayoutText {#text} at (0,40) size 644x19 text run at (0,40) width 644: "with text (\"foo\") and then uses six different paddings to make sure each of the buttons render properly." - LayoutBR {BR} at (644,40) size 0x0 - LayoutBR {BR} at (0,60) size 0x0 + LayoutBR {BR} at (644,40) size 0x19 + LayoutBR {BR} at (0,60) size 0x19 LayoutTable {TABLE} at (0,80) size 684x259 LayoutTableSection {TBODY} at (0,0) size 684x259 LayoutTableRow {TR} at (0,0) size 684x22 @@ -38,14 +38,14 @@ text run at (1,2) width 53: "(default)" LayoutNGTableCell {TD} at (169,22) size 60x24 [r=1 c=1 rs=1 cs=1] LayoutButton {BUTTON} at (1,1) size 26x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 10x16 + LayoutBlockFlow (anonymous) at (8,3) size 10x16 LayoutImage {IMG} at (0,3) size 10x10 LayoutNGTableCell {TD} at (229,23) size 157x22 [r=1 c=2 rs=1 cs=1] LayoutText {#text} at (1,2) size 104x19 text run at (1,2) width 104: "(22, 26) (18, 22)" LayoutNGTableCell {TD} at (386,22) size 132x24 [r=1 c=3 rs=1 cs=1] LayoutButton {INPUT} at (1,1) size 34x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 18x16 + LayoutBlockFlow (anonymous) at (8,3) size 18x16 LayoutText {#text} at (0,0) size 18x16 text run at (0,0) width 18: "foo" LayoutNGTableCell {TD} at (518,23) size 166x22 [r=1 c=4 rs=1 cs=1] @@ -57,14 +57,14 @@ text run at (1,1) width 67: "padding: 0" LayoutNGTableCell {TD} at (169,46) size 60x22 [r=2 c=1 rs=1 cs=1] LayoutButton {BUTTON} at (1,1) size 14x20 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (2,2) size 10x16 + LayoutBlockFlow (anonymous) at (2,2) size 10x16 LayoutImage {IMG} at (0,3) size 10x10 LayoutNGTableCell {TD} at (229,46) size 157x22 [r=2 c=2 rs=1 cs=1] LayoutText {#text} at (1,1) size 104x19 text run at (1,1) width 104: "(20, 14) (16, 10)" LayoutNGTableCell {TD} at (386,46) size 132x22 [r=2 c=3 rs=1 cs=1] LayoutButton {INPUT} at (1,1) size 22x20 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (2,2) size 18x16 + LayoutBlockFlow (anonymous) at (2,2) size 18x16 LayoutText {#text} at (0,0) size 18x16 text run at (0,0) width 18: "foo" LayoutNGTableCell {TD} at (518,46) size 166x22 [r=2 c=4 rs=1 cs=1] @@ -76,14 +76,14 @@ text run at (1,14) width 88: "padding: 10%" LayoutNGTableCell {TD} at (169,75) size 60x33.59 [r=3 c=1 rs=1 cs=1] LayoutButton {BUTTON} at (1,1) size 25.59x31.59 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (7.80,7.80) size 10x16 + LayoutBlockFlow (anonymous) at (7.80,7.80) size 10x16 LayoutImage {IMG} at (0,3) size 10x10 LayoutNGTableCell {TD} at (229,81) size 157x22 [r=3 c=2 rs=1 cs=1] LayoutText {#text} at (1,14) size 104x19 text run at (1,14) width 104: "(32, 26) (28, 22)" LayoutNGTableCell {TD} at (386,68) size 132x48 [r=3 c=3 rs=1 cs=1] LayoutButton {INPUT} at (1,1) size 48x46 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (15,15) size 18x16 + LayoutBlockFlow (anonymous) at (15,15) size 18x16 LayoutText {#text} at (0,0) size 18x16 text run at (0,0) width 18: "foo" LayoutNGTableCell {TD} at (518,81) size 166x22 [r=3 c=4 rs=1 cs=1] @@ -95,14 +95,14 @@ text run at (1,3) width 83: "padding: 2px" LayoutNGTableCell {TD} at (169,116) size 60x26 [r=4 c=1 rs=1 cs=1] LayoutButton {BUTTON} at (1,1) size 18x24 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (4,4) size 10x16 + LayoutBlockFlow (anonymous) at (4,4) size 10x16 LayoutImage {IMG} at (0,3) size 10x10 LayoutNGTableCell {TD} at (229,118) size 157x22 [r=4 c=2 rs=1 cs=1] LayoutText {#text} at (1,3) size 104x19 text run at (1,3) width 104: "(24, 18) (20, 14)" LayoutNGTableCell {TD} at (386,116) size 132x26 [r=4 c=3 rs=1 cs=1] LayoutButton {INPUT} at (1,1) size 26x24 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (4,4) size 18x16 + LayoutBlockFlow (anonymous) at (4,4) size 18x16 LayoutText {#text} at (0,0) size 18x16 text run at (0,0) width 18: "foo" LayoutNGTableCell {TD} at (518,118) size 166x22 [r=4 c=4 rs=1 cs=1] @@ -114,14 +114,14 @@ text run at (1,3) width 167: "padding: 2px 6px 3px 6px" LayoutNGTableCell {TD} at (169,142) size 60x27 [r=5 c=1 rs=1 cs=1] LayoutButton {BUTTON} at (1,1) size 26x25 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,4) size 10x16 + LayoutBlockFlow (anonymous) at (8,4) size 10x16 LayoutImage {IMG} at (0,3) size 10x10 LayoutNGTableCell {TD} at (229,144) size 157x22 [r=5 c=2 rs=1 cs=1] LayoutText {#text} at (1,3) size 104x19 text run at (1,3) width 104: "(25, 26) (21, 22)" LayoutNGTableCell {TD} at (386,142) size 132x27 [r=5 c=3 rs=1 cs=1] LayoutButton {INPUT} at (1,1) size 34x25 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,4) size 18x16 + LayoutBlockFlow (anonymous) at (8,4) size 18x16 LayoutText {#text} at (0,0) size 18x16 text run at (0,0) width 18: "foo" LayoutNGTableCell {TD} at (518,144) size 166x22 [r=5 c=4 rs=1 cs=1] @@ -133,14 +133,14 @@ text run at (1,4) width 111: "padding: 3px 7px" LayoutNGTableCell {TD} at (169,169) size 60x28 [r=6 c=1 rs=1 cs=1] LayoutButton {BUTTON} at (1,1) size 28x26 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (9,5) size 10x16 + LayoutBlockFlow (anonymous) at (9,5) size 10x16 LayoutImage {IMG} at (0,3) size 10x10 LayoutNGTableCell {TD} at (229,172) size 157x22 [r=6 c=2 rs=1 cs=1] LayoutText {#text} at (1,4) size 104x19 text run at (1,4) width 104: "(26, 28) (22, 24)" LayoutNGTableCell {TD} at (386,169) size 132x28 [r=6 c=3 rs=1 cs=1] LayoutButton {INPUT} at (1,1) size 36x26 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (9,5) size 18x16 + LayoutBlockFlow (anonymous) at (9,5) size 18x16 LayoutText {#text} at (0,0) size 18x16 text run at (0,0) width 18: "foo" LayoutNGTableCell {TD} at (518,172) size 166x22 [r=6 c=4 rs=1 cs=1] @@ -152,14 +152,14 @@ text run at (1,21) width 91: "padding: 20px" LayoutNGTableCell {TD} at (169,197) size 60x62 [r=7 c=1 rs=1 cs=1] LayoutButton {BUTTON} at (1,1) size 54x60 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (22,22) size 10x16 + LayoutBlockFlow (anonymous) at (22,22) size 10x16 LayoutImage {IMG} at (0,3) size 10x10 LayoutNGTableCell {TD} at (229,217) size 157x22 [r=7 c=2 rs=1 cs=1] LayoutText {#text} at (1,21) size 104x19 text run at (1,21) width 104: "(60, 54) (56, 50)" LayoutNGTableCell {TD} at (386,197) size 132x62 [r=7 c=3 rs=1 cs=1] LayoutButton {INPUT} at (1,1) size 62x60 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (22,22) size 18x16 + LayoutBlockFlow (anonymous) at (22,22) size 18x16 LayoutText {#text} at (0,0) size 18x16 text run at (0,0) width 18: "foo" LayoutNGTableCell {TD} at (518,217) size 166x22 [r=7 c=4 rs=1 cs=1]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/basic-inputs-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/basic-inputs-expected.txt index e5dd0d1..f0cd976 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/basic-inputs-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/basic-inputs-expected.txt
@@ -6,31 +6,31 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 470x340 LayoutText {#text} at (0,0) size 322x19 text run at (0,0) width 322: "This tests basic inputs. Here's what you should see:" - LayoutBR {BR} at (322,0) size 0x0 - LayoutBR {BR} at (0,20) size 0x0 + LayoutBR {BR} at (322,0) size 0x19 + LayoutBR {BR} at (0,20) size 0x19 LayoutText {#text} at (0,40) size 455x59 text run at (0,40) width 432: "first line: the letter \"a\" and then a text input field filled with repeating" text run at (0,60) width 455: "\"foobarbaz\", then the word \"text\" followed by a disabled text input field" text run at (0,80) width 328: "filled with \"foo\" and then the letter \"b\" and then \"a\"" - LayoutBR {BR} at (328,80) size 0x0 - LayoutBR {BR} at (0,100) size 0x0 + LayoutBR {BR} at (328,80) size 0x19 + LayoutBR {BR} at (0,100) size 0x19 LayoutText {#text} at (0,120) size 466x59 text run at (0,120) width 466: "second line: and then a password input field that's filled and then the word" text run at (0,140) width 448: "\"password\" and then a disabled password field that's filled and then the" text run at (0,160) width 57: "letter \"b\"" - LayoutBR {BR} at (57,160) size 0x0 - LayoutBR {BR} at (0,180) size 0x0 + LayoutBR {BR} at (57,160) size 0x19 + LayoutBR {BR} at (0,180) size 0x19 LayoutText {#text} at (0,200) size 451x39 text run at (0,200) width 451: "third line: the letter \"a\" and then a checkbox (unchecked) with the word" text run at (0,220) width 353: "\"checkbox\" and then a disabled checkbox and letter \"b\"" - LayoutBR {BR} at (353,220) size 0x0 - LayoutBR {BR} at (0,240) size 0x0 + LayoutBR {BR} at (353,220) size 0x19 + LayoutBR {BR} at (0,240) size 0x19 LayoutText {#text} at (0,260) size 449x59 text run at (0,260) width 401: "fourth line: the last line has the letter \"a\" and then a redio button" text run at (0,280) width 449: "(unselected) and then the word \"radio\" and then a disabled radio button" text run at (0,300) width 107: "and the letter \"b\"" - LayoutBR {BR} at (107,300) size 0x0 - LayoutBR {BR} at (0,320) size 0x0 + LayoutBR {BR} at (107,300) size 0x19 + LayoutBR {BR} at (0,320) size 0x19 LayoutNGBlockFlow {DIV} at (10,350) size 450x46 [border: (1px solid #FF0000)] LayoutText {#text} at (1,2) size 7x19 text run at (1,2) width 7: "a"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/button-table-styles-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/button-table-styles-expected.txt index e1a33e5..6db5cf1 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/button-table-styles-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/button-table-styles-expected.txt
@@ -6,130 +6,130 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 784x20 LayoutText {#text} at (0,0) size 338x19 text run at (0,0) width 338: "This tests that buttons don't honor table display styles." - LayoutBR {BR} at (338,0) size 0x0 + LayoutBR {BR} at (338,0) size 0x19 LayoutButton {INPUT} at (0,20) size 93x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 77x16 + LayoutBlockFlow (anonymous) at (8,3) size 77x16 LayoutText {#text} at (0,0) size 77x16 text run at (0,0) width 77: "display: table" LayoutButton {INPUT} at (0,42) size 93x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 77x16 + LayoutBlockFlow (anonymous) at (8,3) size 77x16 LayoutText {#text} at (0,0) size 77x16 text run at (0,0) width 77: "display: table" LayoutNGBlockFlow (anonymous) at (0,64) size 784x398 - LayoutBR {BR} at (0,0) size 0x0 - LayoutBR {BR} at (0,20) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 + LayoutBR {BR} at (0,20) size 0x19 LayoutButton {INPUT} at (0,40) size 127x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 111x16 + LayoutBlockFlow (anonymous) at (8,3) size 111x16 LayoutText {#text} at (0,0) size 111x16 text run at (0,0) width 111: "display: inline-table" LayoutText {#text} at (127,41) size 4x19 text run at (127,41) width 4: " " LayoutButton {INPUT} at (131,40) size 127x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 111x16 + LayoutBlockFlow (anonymous) at (8,3) size 111x16 LayoutText {#text} at (0,0) size 111x16 text run at (0,0) width 111: "display: inline-table" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (258,41) size 0x0 - LayoutBR {BR} at (0,62) size 0x0 + LayoutBR {BR} at (258,41) size 0x19 + LayoutBR {BR} at (0,62) size 0x19 LayoutButton {INPUT} at (0,82) size 153x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 137x16 + LayoutBlockFlow (anonymous) at (8,3) size 137x16 LayoutText {#text} at (0,0) size 137x16 text run at (0,0) width 137: "display: table-row-group" LayoutText {#text} at (153,83) size 4x19 text run at (153,83) width 4: " " LayoutButton {INPUT} at (157,82) size 153x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 137x16 + LayoutBlockFlow (anonymous) at (8,3) size 137x16 LayoutText {#text} at (0,0) size 137x16 text run at (0,0) width 137: "display: table-row-group" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (310,83) size 0x0 - LayoutBR {BR} at (0,104) size 0x0 + LayoutBR {BR} at (310,83) size 0x19 + LayoutBR {BR} at (0,104) size 0x19 LayoutButton {INPUT} at (0,124) size 172x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 156x16 + LayoutBlockFlow (anonymous) at (8,3) size 156x16 LayoutText {#text} at (0,0) size 156x16 text run at (0,0) width 156: "display: table-header-group" LayoutText {#text} at (172,125) size 4x19 text run at (172,125) width 4: " " LayoutButton {INPUT} at (176,124) size 172x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 156x16 + LayoutBlockFlow (anonymous) at (8,3) size 156x16 LayoutText {#text} at (0,0) size 156x16 text run at (0,0) width 156: "display: table-header-group" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (348,125) size 0x0 - LayoutBR {BR} at (0,146) size 0x0 + LayoutBR {BR} at (348,125) size 0x19 + LayoutBR {BR} at (0,146) size 0x19 LayoutButton {INPUT} at (0,166) size 166x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 150x16 + LayoutBlockFlow (anonymous) at (8,3) size 150x16 LayoutText {#text} at (0,0) size 150x16 text run at (0,0) width 150: "display: table-footer-group" LayoutText {#text} at (166,167) size 4x19 text run at (166,167) width 4: " " LayoutButton {INPUT} at (170,166) size 166x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 150x16 + LayoutBlockFlow (anonymous) at (8,3) size 150x16 LayoutText {#text} at (0,0) size 150x16 text run at (0,0) width 150: "display: table-footer-group" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (336,167) size 0x0 - LayoutBR {BR} at (0,188) size 0x0 + LayoutBR {BR} at (336,167) size 0x19 + LayoutBR {BR} at (0,188) size 0x19 LayoutButton {INPUT} at (0,208) size 117x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 101x16 + LayoutBlockFlow (anonymous) at (8,3) size 101x16 LayoutText {#text} at (0,0) size 101x16 text run at (0,0) width 101: "display: table-row" LayoutText {#text} at (117,209) size 4x19 text run at (117,209) width 4: " " LayoutButton {INPUT} at (121,208) size 117x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 101x16 + LayoutBlockFlow (anonymous) at (8,3) size 101x16 LayoutText {#text} at (0,0) size 101x16 text run at (0,0) width 101: "display: table-row" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (238,209) size 0x0 - LayoutBR {BR} at (0,230) size 0x0 + LayoutBR {BR} at (238,209) size 0x19 + LayoutBR {BR} at (0,230) size 0x19 LayoutButton {INPUT} at (0,250) size 175x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 159x16 + LayoutBlockFlow (anonymous) at (8,3) size 159x16 LayoutText {#text} at (0,0) size 159x16 text run at (0,0) width 159: "display: table-column-group" LayoutText {#text} at (175,251) size 4x19 text run at (175,251) width 4: " " LayoutButton {INPUT} at (179,250) size 175x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 159x16 + LayoutBlockFlow (anonymous) at (8,3) size 159x16 LayoutText {#text} at (0,0) size 159x16 text run at (0,0) width 159: "display: table-column-group" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (354,251) size 0x0 - LayoutBR {BR} at (0,272) size 0x0 + LayoutBR {BR} at (354,251) size 0x19 + LayoutBR {BR} at (0,272) size 0x19 LayoutButton {INPUT} at (0,292) size 139x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 123x16 + LayoutBlockFlow (anonymous) at (8,3) size 123x16 LayoutText {#text} at (0,0) size 123x16 text run at (0,0) width 123: "display: table-column" LayoutText {#text} at (139,293) size 4x19 text run at (139,293) width 4: " " LayoutButton {INPUT} at (143,292) size 139x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 123x16 + LayoutBlockFlow (anonymous) at (8,3) size 123x16 LayoutText {#text} at (0,0) size 123x16 text run at (0,0) width 123: "display: table-column" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (282,293) size 0x0 - LayoutBR {BR} at (0,314) size 0x0 + LayoutBR {BR} at (282,293) size 0x19 + LayoutBR {BR} at (0,314) size 0x19 LayoutButton {INPUT} at (0,334) size 117x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 101x16 + LayoutBlockFlow (anonymous) at (8,3) size 101x16 LayoutText {#text} at (0,0) size 101x16 text run at (0,0) width 101: "display: table-cell" LayoutText {#text} at (117,335) size 4x19 text run at (117,335) width 4: " " LayoutButton {INPUT} at (121,334) size 117x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 101x16 + LayoutBlockFlow (anonymous) at (8,3) size 101x16 LayoutText {#text} at (0,0) size 101x16 text run at (0,0) width 101: "display: table-cell" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (238,335) size 0x0 - LayoutBR {BR} at (0,356) size 0x0 + LayoutBR {BR} at (238,335) size 0x19 + LayoutBR {BR} at (0,356) size 0x19 LayoutButton {INPUT} at (0,376) size 139x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 123x16 + LayoutBlockFlow (anonymous) at (8,3) size 123x16 LayoutText {#text} at (0,0) size 123x16 text run at (0,0) width 123: "display: table-caption" LayoutText {#text} at (139,377) size 4x19 text run at (139,377) width 4: " " LayoutButton {INPUT} at (143,376) size 139x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 123x16 + LayoutBlockFlow (anonymous) at (8,3) size 123x16 LayoutText {#text} at (0,0) size 123x16 text run at (0,0) width 123: "display: table-caption" LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/checkbox/checkbox-appearance-basic-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/checkbox/checkbox-appearance-basic-expected.txt index 463c5cd0..5c0ca1fc 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/checkbox/checkbox-appearance-basic-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/checkbox/checkbox-appearance-basic-expected.txt
@@ -8,19 +8,19 @@ text run at (21,2) width 4: " " LayoutBlockFlow {INPUT} at (29,4) size 13x13 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (46,2) size 0x0 + LayoutBR {BR} at (46,2) size 0x19 LayoutBlockFlow {INPUT} at (4,26) size 13x13 LayoutText {#text} at (21,24) size 4x19 text run at (21,24) width 4: " " LayoutBlockFlow {INPUT} at (29,26) size 13x13 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (46,24) size 0x0 + LayoutBR {BR} at (46,24) size 0x19 LayoutBlockFlow {INPUT} at (4,48) size 13x13 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (21,46) size 0x0 + LayoutBR {BR} at (21,46) size 0x19 LayoutBlockFlow {INPUT} at (4,70) size 13x13 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (21,68) size 0x0 + LayoutBR {BR} at (21,68) size 0x19 LayoutBlockFlow {INPUT} at (4,92) size 8x13 LayoutText {#text} at (16,90) size 4x19 text run at (16,90) width 4: " " @@ -29,10 +29,10 @@ text run at (44,90) width 4: " " LayoutBlockFlow {INPUT} at (52,92) size 24x13 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (80,90) size 0x0 + LayoutBR {BR} at (80,90) size 0x19 LayoutBlockFlow {INPUT} at (6,125) size 19x19 LayoutText {#text} at (31,129) size 4x19 text run at (31,129) width 4: " " LayoutBlockFlow {INPUT} at (43,118) size 26x26 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (77,129) size 0x0 + LayoutBR {BR} at (77,129) size 0x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/color/input-appearance-color-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/color/input-appearance-color-expected.txt index 22fc8b4..6460a7a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/color/input-appearance-color-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/color/input-appearance-color-expected.txt
@@ -9,7 +9,7 @@ LayoutNGBlockFlow (anonymous) at (0,41.72) size 784x43 LayoutText {#text} at (0,0) size 284x19 text run at (0,0) width 284: "List color controls have different appearance." - LayoutBR {BR} at (284,0) size 0x0 + LayoutBR {BR} at (284,0) size 0x19 LayoutBlockFlow {INPUT} at (0,20) size 44x23 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] LayoutFlexibleBox {DIV} at (3,2) size 38x19 LayoutBlockFlow {DIV} at (2,4) size 34x11 [bgcolor=#000000] [border: (1px solid #777777)] @@ -23,7 +23,7 @@ LayoutNGBlockFlow (anonymous) at (0,145.16) size 784x43 LayoutText {#text} at (0,0) size 577x19 text run at (0,0) width 577: "List color controls have different sizes depending on font sizes. Normal color controls don't." - LayoutBR {BR} at (577,0) size 0x0 + LayoutBR {BR} at (577,0) size 0x19 LayoutBlockFlow {INPUT} at (0,20) size 44x23 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] LayoutFlexibleBox {DIV} at (3,2) size 38x19 LayoutBlockFlow {DIV} at (2,4) size 34x11 [bgcolor=#00FF00] [border: (1px solid #777777)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/control-restrict-line-height-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/control-restrict-line-height-expected.txt index 49f6a17..e7a2c1d 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/control-restrict-line-height-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/control-restrict-line-height-expected.txt
@@ -5,19 +5,19 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 515x19 text run at (0,0) width 515: "This tests that we don't honor line-height for controls that have restricted font size." - LayoutBR {BR} at (515,0) size 0x0 + LayoutBR {BR} at (515,0) size 0x19 LayoutMenuList {SELECT} at (0,20) size 319x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 317x18 + LayoutBlockFlow (anonymous) at (1,1) size 317x18 LayoutText (anonymous) at (4,1) size 297x16 text run at (4,1) width 297: "This text should be centered vertically in the button" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (319,20) size 0x0 + LayoutBR {BR} at (319,20) size 0x19 LayoutButton {INPUT} at (0,40) size 313x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 297x16 + LayoutBlockFlow (anonymous) at (8,3) size 297x16 LayoutText {#text} at (0,0) size 297x16 text run at (0,0) width 297: "This text should be centered vertically in the button" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (313,41) size 0x0 + LayoutBR {BR} at (313,41) size 0x19 LayoutTextControl {INPUT} at (0,62) size 183x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (3,3) size 177x16 LayoutBlockFlow {DIV} at (0,0) size 164x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/file/file-input-disabled-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/file/file-input-disabled-expected.txt index 4d0e2fd3..265bb44 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/file/file-input-disabled-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/file/file-input-disabled-expected.txt
@@ -10,13 +10,13 @@ LayoutText {#text} at (20,1) size 75x19 text run at (20,1) width 75: "Attach File" LayoutBR {BR} at (95,16) size 0x0 - LayoutBR {BR} at (0,21) size 0x0 + LayoutBR {BR} at (0,21) size 0x19 LayoutText {#text} at (0,42) size 86x19 text run at (0,42) width 86: " Select File: " LayoutFileUploadControl {INPUT} at (86,41) size 238x22 "No file chosen" [color=#545454] LayoutButton {INPUT} at (0,0) size 85x22 [color=#808080] [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 69x16 + LayoutBlockFlow (anonymous) at (8,3) size 69x16 LayoutText {#text} at (0,0) size 69x16 text run at (0,0) width 69: "Choose File" - LayoutBR {BR} at (324,42) size 0x0 + LayoutBR {BR} at (324,42) size 0x19 LayoutTable {TABLE} at (0,63) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/input-first-letter-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/input-first-letter-expected.txt index 1b031ba..d4fb268 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/input-first-letter-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/input-first-letter-expected.txt
@@ -5,9 +5,9 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 585x19 text run at (0,0) width 585: "This test passes if it doesn't crash and if the Submit button does not honor the first-letter style." - LayoutBR {BR} at (585,0) size 0x0 + LayoutBR {BR} at (585,0) size 0x19 LayoutButton {INPUT} at (0,20) size 57x22 [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 41x16 + LayoutBlockFlow (anonymous) at (8,3) size 41x16 LayoutText {#text} at (0,0) size 41x16 text run at (0,0) width 41: "Submit" LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/input-type-text-min-width-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/input-type-text-min-width-expected.txt index 00cbd882..2ab68a4 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/input-type-text-min-width-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/input-type-text-min-width-expected.txt
@@ -6,7 +6,7 @@ LayoutText {#text} at (0,0) size 768x39 text run at (0,0) width 768: "This test checks if correct min width is applied to \"input type=text\". To match IE and Firefox, the input field below should" text run at (0,20) width 615: "show \"1987\", with the 7 slightly truncated. See https://bugs.webkit.org/show_bug.cgi?id=15312 ." - LayoutBR {BR} at (615,20) size 0x0 + LayoutBR {BR} at (615,20) size 0x19 LayoutTextControl {INPUT} at (0,40) size 29x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (10,51) size 25x16 scrollWidth 43
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/negativeLineHeight-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/negativeLineHeight-expected.txt index 8471a86..92cd083 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/negativeLineHeight-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/negativeLineHeight-expected.txt
@@ -6,14 +6,14 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 784x20 LayoutText {#text} at (0,0) size 666x19 text run at (0,0) width 666: "The textarea below should have standard line-height because textareas should ignore negative line-heights" - LayoutBR {BR} at (666,0) size 0x0 + LayoutBR {BR} at (666,0) size 0x19 LayoutNGBlockFlow {P} at (0,36) size 784x240 LayoutText {#text} at (0,0) size 86x19 text run at (0,0) width 86: "TEXTAREA" - LayoutBR {BR} at (86,0) size 0x0 + LayoutBR {BR} at (86,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (400,205) size 0x0 - LayoutBR {BR} at (0,220) size 0x0 + LayoutBR {BR} at (400,205) size 0x19 + LayoutBR {BR} at (0,220) size 0x19 layer at (8,64) size 400x200 clip at (9,65) size 398x198 LayoutTextControl {TEXTAREA} at (0,20) size 400x200 [bgcolor=#FFFFFF] [border: (1px dotted #C0C0C0)] LayoutBlockFlow {DIV} at (3,3) size 396x32
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/number/number-appearance-datalist-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/number/number-appearance-datalist-expected.txt index 8f199b8..5330a8b 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/number/number-appearance-datalist-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/number/number-appearance-datalist-expected.txt
@@ -16,7 +16,7 @@ LayoutDetailsMarker {DIV} at (144.14,1.33) size 17.86x13.33: down LayoutBlockFlow {DIV} at (162,0) size 15x16 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (366,1) size 0x0 + LayoutBR {BR} at (366,1) size 0x19 LayoutTextControl {INPUT} at (0,22) size 181x22 [color=#545454] [bgcolor=#EBEBE4] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (2,3) size 177x16 LayoutBlockFlow {DIV} at (0,0) size 144.14x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/number/number-appearance-spinbutton-layer-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/number/number-appearance-spinbutton-layer-expected.txt index 4d50a30..d76900a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/number/number-appearance-spinbutton-layer-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/number/number-appearance-spinbutton-layer-expected.txt
@@ -3,7 +3,7 @@ layer at (0,0) size 800x60 LayoutNGBlockFlow {HTML} at (0,0) size 800x60 LayoutNGBlockFlow {BODY} at (8,8) size 784x44 - LayoutBR {BR} at (181,1) size 0x0 + LayoutBR {BR} at (181,1) size 0x19 LayoutTextControl {INPUT} at (0,22) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (2,3) size 177x16 LayoutBlockFlow {DIV} at (0,0) size 162x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/placeholder-position-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/placeholder-position-expected.txt index 54219e2f..f160fe4 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/placeholder-position-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/placeholder-position-expected.txt
@@ -16,21 +16,21 @@ text run at (206,23) width 4: " " LayoutTextControl {INPUT} at (210,22) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (391,23) size 0x0 + LayoutBR {BR} at (391,23) size 0x19 LayoutTextControl {INPUT} at (0,44) size 183x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (3,3) size 177x16 LayoutBlockFlow {DIV} at (12,0) size 165x16 - LayoutBR {BR} at (183,45) size 0x0 + LayoutBR {BR} at (183,45) size 0x19 LayoutTextControl {INPUT} at (0,66) size 183x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (3,3) size 177x16 LayoutBlockFlow {DIV} at (0,0) size 164x16 - LayoutBR {BR} at (183,67) size 0x0 - LayoutBR {BR} at (179,109) size 0x0 + LayoutBR {BR} at (183,67) size 0x19 + LayoutBR {BR} at (179,109) size 0x19 LayoutTextControl {INPUT} at (0,124) size 181x36 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (181,125) size 0x0 - LayoutBR {BR} at (179,194) size 0x0 + LayoutBR {BR} at (181,125) size 0x19 + LayoutBR {BR} at (179,194) size 0x19 LayoutTextControl {INPUT} at (5,214) size 209x29 [bgcolor=#FFFFFF] [border: (5px solid #000000)] - LayoutBR {BR} at (219,219) size 0x0 + LayoutBR {BR} at (219,219) size 0x19 LayoutTextControl {INPUT} at (0,248) size 181x31 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,253) size 4x19 text run at (181,253) width 4: " " @@ -44,7 +44,7 @@ LayoutText {#text} at (0,0) size 0x0 LayoutTextControl {INPUT} at (0,279) size 181x25 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (181,281) size 0x0 + LayoutBR {BR} at (181,281) size 0x20 LayoutTextControl {INPUT} at (0,304) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,305) size 4x19 text run at (181,305) width 4: " " @@ -53,8 +53,8 @@ text run at (366,305) width 4: " " LayoutTextControl {INPUT} at (370,304) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (551,305) size 0x0 - LayoutBR {BR} at (181,341) size 0x0 + LayoutBR {BR} at (551,305) size 0x19 + LayoutBR {BR} at (181,341) size 0x19 layer at (11,11) size 164x16 LayoutBlockFlow {DIV} at (3,3) size 164x16 [color=#757575] LayoutText {#text} at (0,0) size 66x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/radio/radio-appearance-basic-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/radio/radio-appearance-basic-expected.txt index 3db7b0b..af99220 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/radio/radio-appearance-basic-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/radio/radio-appearance-basic-expected.txt
@@ -11,19 +11,19 @@ text run at (46,2) width 4: " " LayoutBlockFlow {INPUT} at (54,4) size 13x13 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (71,2) size 0x0 + LayoutBR {BR} at (71,2) size 0x19 LayoutBlockFlow {INPUT} at (4,26) size 13x13 LayoutText {#text} at (21,24) size 4x19 text run at (21,24) width 4: " " LayoutBlockFlow {INPUT} at (29,26) size 13x13 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (46,24) size 0x0 + LayoutBR {BR} at (46,24) size 0x19 LayoutBlockFlow {INPUT} at (4,48) size 13x13 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (21,46) size 0x0 + LayoutBR {BR} at (21,46) size 0x19 LayoutBlockFlow {INPUT} at (4,70) size 13x13 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (21,68) size 0x0 + LayoutBR {BR} at (21,68) size 0x19 LayoutBlockFlow {INPUT} at (4,92) size 8x13 LayoutText {#text} at (16,90) size 4x19 text run at (16,90) width 4: " " @@ -32,10 +32,10 @@ text run at (44,90) width 4: " " LayoutBlockFlow {INPUT} at (52,92) size 24x13 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (80,90) size 0x0 + LayoutBR {BR} at (80,90) size 0x19 LayoutBlockFlow {INPUT} at (6,125) size 19x19 LayoutText {#text} at (31,129) size 4x19 text run at (31,129) width 4: " " LayoutBlockFlow {INPUT} at (43,118) size 26x26 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (77,129) size 0x0 + LayoutBR {BR} at (77,129) size 0x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/range/range-appearance-basic-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/range/range-appearance-basic-expected.txt index 1096be26..ec27b8b 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/range/range-appearance-basic-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/range/range-appearance-basic-expected.txt
@@ -8,7 +8,7 @@ LayoutBlockFlow {DIV} at (0,0) size 129x21 LayoutBlockFlow {DIV} at (59,0) size 11x21 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (137,10) size 0x0 + LayoutBR {BR} at (137,10) size 0x19 LayoutSlider {INPUT} at (4,34) size 135x27 [color=#9D968E] [bgcolor=#FFFFFF] [border: (3px solid #00FF00)] LayoutFlexibleBox {DIV} at (3,3) size 129x21 LayoutBlockFlow {DIV} at (0,0) size 129x21 @@ -20,19 +20,19 @@ LayoutBlockFlow {DIV} at (0,0) size 129x21 LayoutBlockFlow {DIV} at (59,0) size 11x21 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (284,46) size 0x0 + LayoutBR {BR} at (284,46) size 0x19 LayoutSlider {INPUT} at (4,70) size 129x21 [color=#9D968E] LayoutFlexibleBox {DIV} at (0,0) size 129x21 LayoutBlockFlow {DIV} at (0,0) size 129x21 LayoutBlockFlow {DIV} at (59,0) size 11x21 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (137,76) size 0x0 + LayoutBR {BR} at (137,76) size 0x19 LayoutSlider {INPUT} at (4,100) size 129x21 [color=#9D968E] [bgcolor=#FFFFFF] LayoutFlexibleBox {DIV} at (0,0) size 129x21 LayoutBlockFlow {DIV} at (0,0) size 129x21 LayoutBlockFlow {DIV} at (59,0) size 11x21 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (137,106) size 0x0 + LayoutBR {BR} at (137,106) size 0x19 LayoutSlider {INPUT} at (4,130) size 40x21 [color=#9D968E] [bgcolor=#FFFFFF] LayoutFlexibleBox {DIV} at (0,0) size 40x21 LayoutBlockFlow {DIV} at (0,0) size 40x21 @@ -50,7 +50,7 @@ LayoutBlockFlow {DIV} at (0,0) size 40x21 LayoutBlockFlow {DIV} at (14.50,0) size 11x21 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (152,136) size 0x0 + LayoutBR {BR} at (152,136) size 0x19 LayoutSlider {INPUT} at (6,164) size 193.50x21 [color=#9D968E] [bgcolor=#FFFFFF] LayoutFlexibleBox {DIV} at (0,0) size 193.50x21 LayoutBlockFlow {DIV} at (0,0) size 193.50x21 @@ -62,4 +62,4 @@ LayoutBlockFlow {DIV} at (0,0) size 258x21 LayoutBlockFlow {DIV} at (123.50,0) size 11x21 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (483,170) size 0x0 + LayoutBR {BR} at (483,170) size 1x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/range/slider-padding-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/range/slider-padding-expected.txt index 9a96c24..64b81c4 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/range/slider-padding-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/range/slider-padding-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 784x20 LayoutText {#text} at (0,0) size 317x19 text run at (0,0) width 317: "This tests that the slider control considers padding." - LayoutBR {BR} at (317,0) size 0x0 + LayoutBR {BR} at (317,0) size 0x19 LayoutNGBlockFlow {DIV} at (0,20) size 784x45 [bgcolor=#ADD8E6] LayoutSlider {INPUT} at (2,2) size 100x41 [color=#9D968E] [bgcolor=#FFFFFF] LayoutFlexibleBox {DIV} at (10,10) size 80x21
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/search/search-appearance-basic-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/search/search-appearance-basic-expected.txt index cf9f44ff..3b2acfd8e 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/search/search-appearance-basic-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/search/search-appearance-basic-expected.txt
@@ -13,7 +13,7 @@ LayoutFlexibleBox {DIV} at (3,3) size 177x16 LayoutBlockFlow {DIV} at (0,0) size 164x16 LayoutBlockFlow {DIV} at (165,3.50) size 9x9 - LayoutBR {BR} at (386,5) size 0x0 + LayoutBR {BR} at (386,5) size 0x19 LayoutTextControl {INPUT} at (4,34) size 183x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (3,3) size 177x16 LayoutBlockFlow {DIV} at (0,0) size 164x16 @@ -23,7 +23,7 @@ LayoutFlexibleBox {DIV} at (3,3) size 177x16 LayoutBlockFlow {DIV} at (0,0) size 164x16 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (386,35) size 0x0 + LayoutBR {BR} at (386,35) size 0x19 LayoutTextControl {INPUT} at (4,64) size 185x24 [bgcolor=#FFFFFF] [border: (3px solid #00FF00)] LayoutFlexibleBox {DIV} at (4,4) size 177x16 LayoutBlockFlow {DIV} at (0,0) size 164x16 @@ -33,7 +33,7 @@ LayoutFlexibleBox {DIV} at (3,3) size 177x16 LayoutBlockFlow {DIV} at (0,0) size 164x16 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (388,66) size 0x0 + LayoutBR {BR} at (388,66) size 0x19 LayoutNGBlockFlow {DIV} at (0,92) size 163x45 [bgcolor=#888888] LayoutTextControl {INPUT} at (11,9) size 133x22 [bgcolor=#00FF00] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (3,3) size 127x16 @@ -44,12 +44,12 @@ LayoutFlexibleBox {DIV} at (3,3) size 177x16 LayoutBlockFlow {DIV} at (0,0) size 164x16 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (191,5) size 0x0 + LayoutBR {BR} at (191,5) size 0x19 LayoutTextControl {INPUT} at (4,34) size 183x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (3,3) size 177x16 LayoutBlockFlow {DIV} at (0,0) size 164x16 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (191,35) size 0x0 + LayoutBR {BR} at (191,35) size 0x19 LayoutTextControl {INPUT} at (4,68) size 207x25 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (3,3) size 201x19 LayoutBlockFlow {DIV} at (0,0) size 186x19 @@ -63,7 +63,7 @@ LayoutFlexibleBox {DIV} at (3,3) size 310x28 LayoutBlockFlow {DIV} at (0,0) size 289x28 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (324,111) size 0x0 + LayoutBR {BR} at (324,111) size 0x19 LayoutTextControl {INPUT} at (6,156.50) size 255x33 [bgcolor=#FFFFFF] [border: (3px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (4.50,4.50) size 246x24 LayoutBlockFlow {DIV} at (0,0) size 226x24 @@ -73,7 +73,7 @@ LayoutFlexibleBox {DIV} at (6,6) size 334x33 LayoutBlockFlow {DIV} at (0,0) size 307x33 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (633,165) size 0x0 + LayoutBR {BR} at (633,165) size 0x19 LayoutTextControl {INPUT} at (6,217.50) size 255x33 [bgcolor=#FFFFFF] [border: (3px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (4.50,4.50) size 246x24 LayoutBlockFlow {DIV} at (0,0) size 226x24 @@ -83,7 +83,7 @@ LayoutFlexibleBox {DIV} at (6,6) size 334x33 LayoutBlockFlow {DIV} at (0,0) size 307x33 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (633,226) size 0x0 + LayoutBR {BR} at (633,226) size 0x19 LayoutTextControl {INPUT} at (4,266) size 156x22 [bgcolor=#FFFFFF] [border: (1px solid #BDC7D8)] LayoutFlexibleBox {DIV} at (18,4) size 134x14 LayoutBlockFlow {DIV} at (0,0) size 122x14
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/search/search-display-none-cancel-button-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/search/search-display-none-cancel-button-expected.txt index 9448c150..fdf2a6f 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/search/search-display-none-cancel-button-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/search/search-display-none-cancel-button-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 499x19 text run at (0,0) width 499: "This tests that the display:none style will work on a search field's cancel button." - LayoutBR {BR} at (499,0) size 0x0 + LayoutBR {BR} at (499,0) size 0x19 LayoutTextControl {INPUT} at (0,20) size 183x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (3,3) size 177x16 LayoutBlockFlow {DIV} at (0,0) size 177x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/search/searchfield-heights-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/search/searchfield-heights-expected.txt index 2e37d47..dc58fc5e 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/search/searchfield-heights-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/search/searchfield-heights-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 368x19 text run at (0,0) width 368: "This tests that aqua-style search fields do not honor height." - LayoutBR {BR} at (368,0) size 0x0 + LayoutBR {BR} at (368,0) size 0x19 LayoutTextControl {INPUT} at (0,124.50) size 74x6 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (3,0) size 68x6 LayoutBlockFlow {DIV} at (0,0) size 59x6
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label01-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label01-expected.txt index 4465129a..1fcc269 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label01-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label01-expected.txt
@@ -5,9 +5,9 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 671x19 text run at (0,0) width 671: "In the selection list below, the text 'The label for this element is \"1\"' should appear, and not the character '1'" - LayoutBR {BR} at (671,0) size 0x0 + LayoutBR {BR} at (671,0) size 0x19 LayoutMenuList {SELECT} at (0,20) size 200x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 198x18 + LayoutBlockFlow (anonymous) at (1,1) size 198x18 LayoutText (anonymous) at (4,1) size 178x16 text run at (4,1) width 178: "the label for this element is \"1\"" LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label02-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label02-expected.txt index abd8fcf..b540861 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label02-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label02-expected.txt
@@ -5,9 +5,9 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 298x19 text run at (0,0) width 298: "With the label empty, the enclosing text is used." - LayoutBR {BR} at (298,0) size 0x0 + LayoutBR {BR} at (298,0) size 0x19 LayoutMenuList {SELECT} at (0,20) size 324x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 322x18 + LayoutBlockFlow (anonymous) at (1,1) size 322x18 LayoutText (anonymous) at (4,1) size 302x16 text run at (4,1) width 302: "empty label should display empty string to match IE" LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label03-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label03-expected.txt index 596a8c8..7898317 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label03-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label03-expected.txt
@@ -5,9 +5,9 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 436x19 text run at (0,0) width 436: "When the label contains only white space, the containing text is used." - LayoutBR {BR} at (436,0) size 0x0 + LayoutBR {BR} at (436,0) size 0x19 LayoutMenuList {SELECT} at (0,20) size 357x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 355x18 + LayoutBlockFlow (anonymous) at (1,1) size 355x18 LayoutText (anonymous) at (4,1) size 335x16 text run at (4,1) width 335: "white space label should display empty string to match IE" LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label04-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label04-expected.txt index 1bbcef6..5dadba2 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label04-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label04-expected.txt
@@ -5,9 +5,9 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 595x19 text run at (0,0) width 595: "The label attribute appears, but is missing the equals value piece, so the containing text is used." - LayoutBR {BR} at (595,0) size 0x0 + LayoutBR {BR} at (595,0) size 0x19 LayoutMenuList {SELECT} at (0,20) size 485x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 483x18 + LayoutBlockFlow (anonymous) at (1,1) size 483x18 LayoutText (anonymous) at (4,1) size 463x16 text run at (4,1) width 463: "the label attribute is mentioned but no value is specified; this text should appear" LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label05-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label05-expected.txt index 1c0fa5d..8e7a211 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label05-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label05-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 667x19 text run at (0,0) width 667: "In the list box below, the text \"This text should appear\" should be shown as the first entry into the list box." - LayoutBR {BR} at (667,0) size 0x0 + LayoutBR {BR} at (667,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 layer at (8,28) size 157x87 clip at (9,29) size 140x85 LayoutListBox {SELECT} at (0,20) size 157x87 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label06-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label06-expected.txt index 0024183..5f0b50f 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label06-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label06-expected.txt
@@ -5,9 +5,9 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 718x19 text run at (0,0) width 718: "The select item below has a label specified, and no enclosed text. There should be no text shown in the select box." - LayoutBR {BR} at (718,0) size 0x0 + LayoutBR {BR} at (718,0) size 0x19 LayoutMenuList {SELECT} at (0,20) size 22x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 20x18 + LayoutBlockFlow (anonymous) at (1,1) size 20x18 LayoutText (anonymous) at (4,1) size 4x16 text run at (4,1) width 4: " " LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label07-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label07-expected.txt index 92d9a16..36b5d16 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label07-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/HTMLOptionElement_label07-expected.txt
@@ -6,9 +6,9 @@ LayoutText {#text} at (0,0) size 781x39 text run at (0,0) width 781: "The select item below has a label specified, and enclosed text that is whitespace. There should be no text shown in the select" text run at (0,20) width 28: "box." - LayoutBR {BR} at (28,20) size 0x0 + LayoutBR {BR} at (28,20) size 0x19 LayoutMenuList {SELECT} at (0,40) size 22x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 20x18 + LayoutBlockFlow (anonymous) at (1,1) size 20x18 LayoutText (anonymous) at (4,1) size 4x16 text run at (4,1) width 4: " " LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/basic-selects-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/basic-selects-expected.txt index 6e4a47c4..c0d0da9 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/basic-selects-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/basic-selects-expected.txt
@@ -7,164 +7,164 @@ LayoutText {#text} at (1,1) size 164x19 text run at (1,1) width 164: "Whitespace in option text:" LayoutMenuList {SELECT} at (165,1) size 48x20 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 46x18 + LayoutBlockFlow (anonymous) at (1,1) size 46x18 LayoutText (anonymous) at (4,1) size 26x16 text run at (4,1) width 26: "f o o" LayoutText {#text} at (213,1) size 7x19 text run at (213,1) width 7: "a" LayoutMenuList {SELECT} at (220,1) size 48x20 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 46x18 + LayoutBlockFlow (anonymous) at (1,1) size 46x18 LayoutText (anonymous) at (4,1) size 4x16 text run at (4,1) width 4: " " LayoutText {#text} at (268,1) size 8x19 text run at (268,1) width 8: "b" - LayoutBR {BR} at (276,1) size 0x0 - LayoutBR {BR} at (1,19) size 0x0 + LayoutBR {BR} at (276,1) size 0x19 + LayoutBR {BR} at (1,19) size 0x19 LayoutText {#text} at (1,37) size 135x19 text run at (1,37) width 135: "Simple select control:" LayoutMenuList {SELECT} at (136,37) size 40x20 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 38x18 + LayoutBlockFlow (anonymous) at (1,1) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (176,37) size 7x19 text run at (176,37) width 7: "a" LayoutMenuList {SELECT} at (183,37) size 40x20 [color=#808080] [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 38x18 + LayoutBlockFlow (anonymous) at (1,1) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (223,37) size 8x19 text run at (223,37) width 8: "b" - LayoutBR {BR} at (231,37) size 0x0 - LayoutBR {BR} at (1,55) size 0x0 + LayoutBR {BR} at (231,37) size 0x19 + LayoutBR {BR} at (1,55) size 0x19 LayoutText {#text} at (1,73) size 194x19 text run at (1,73) width 194: "Line-height should be ignored:" LayoutMenuList {SELECT} at (195,73) size 40x20 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 38x18 + LayoutBlockFlow (anonymous) at (1,1) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (235,73) size 7x19 text run at (235,73) width 7: "a" LayoutMenuList {SELECT} at (242,73) size 40x20 [color=#808080] [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 38x18 + LayoutBlockFlow (anonymous) at (1,1) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "bar" LayoutText {#text} at (282,73) size 8x19 text run at (282,73) width 8: "b" - LayoutBR {BR} at (290,73) size 0x0 - LayoutBR {BR} at (1,91) size 0x0 + LayoutBR {BR} at (290,73) size 0x19 + LayoutBR {BR} at (1,91) size 0x19 LayoutText {#text} at (1,113) size 434x19 text run at (1,113) width 434: "Padding should be respected, the arrow button shouldn't change size:" LayoutMenuList {SELECT} at (435,109) size 48x28 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (5,5) size 38x18 + LayoutBlockFlow (anonymous) at (5,5) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (483,113) size 7x19 text run at (483,113) width 7: "a" LayoutMenuList {SELECT} at (490,109) size 48x28 [color=#808080] [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (5,5) size 38x18 + LayoutBlockFlow (anonymous) at (5,5) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (538,113) size 8x19 text run at (538,113) width 8: "b" - LayoutBR {BR} at (546,113) size 0x0 - LayoutBR {BR} at (1,135) size 0x0 + LayoutBR {BR} at (546,113) size 0x19 + LayoutBR {BR} at (1,135) size 0x19 LayoutText {#text} at (1,160) size 176x19 text run at (1,160) width 176: "Border should be respected:" LayoutMenuList {SELECT} at (177,153) size 54x34 [bgcolor=#DDDDDD] [border: (8px solid #33CCFF)] - LayoutNGBlockFlow (anonymous) at (8,8) size 38x18 + LayoutBlockFlow (anonymous) at (8,8) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (231,160) size 7x19 text run at (231,160) width 7: "a" LayoutMenuList {SELECT} at (238,153) size 54x34 [color=#808080] [bgcolor=#DDDDDD] [border: (8px solid #33CCFF)] - LayoutNGBlockFlow (anonymous) at (8,8) size 38x18 + LayoutBlockFlow (anonymous) at (8,8) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (292,160) size 8x19 text run at (292,160) width 8: "b" - LayoutBR {BR} at (300,160) size 0x0 - LayoutBR {BR} at (1,185) size 0x0 + LayoutBR {BR} at (300,160) size 0x19 + LayoutBR {BR} at (1,185) size 0x19 LayoutText {#text} at (1,211) size 116x19 text run at (1,211) width 116: "Border + padding:" LayoutMenuList {SELECT} at (117,203) size 56x36 [bgcolor=#DDDDDD] [border: (4px solid #33CCFF)] - LayoutNGBlockFlow (anonymous) at (9,9) size 38x18 + LayoutBlockFlow (anonymous) at (9,9) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (173,211) size 7x19 text run at (173,211) width 7: "a" LayoutMenuList {SELECT} at (180,203) size 56x36 [color=#808080] [bgcolor=#DDDDDD] [border: (4px solid #33CCFF)] - LayoutNGBlockFlow (anonymous) at (9,9) size 38x18 + LayoutBlockFlow (anonymous) at (9,9) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (236,211) size 8x19 text run at (236,211) width 8: "b" - LayoutBR {BR} at (244,211) size 0x0 - LayoutBR {BR} at (1,237) size 0x0 + LayoutBR {BR} at (244,211) size 0x19 + LayoutBR {BR} at (1,237) size 0x19 LayoutText {#text} at (1,260) size 480x19 text run at (1,260) width 480: "Height larger than font-size, button should grow, text baseline should center:" LayoutMenuList {SELECT} at (481,255) size 40x30 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,6) size 38x18 + LayoutBlockFlow (anonymous) at (1,6) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (521,260) size 7x19 text run at (521,260) width 7: "a" LayoutMenuList {SELECT} at (528,255) size 40x30 [color=#808080] [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,6) size 38x18 + LayoutBlockFlow (anonymous) at (1,6) size 38x18 LayoutText (anonymous) at (4,1) size 4x16 text run at (4,1) width 4: " " LayoutText {#text} at (568,260) size 8x19 text run at (568,260) width 8: "b" - LayoutBR {BR} at (576,260) size 0x0 - LayoutBR {BR} at (1,283) size 0x0 + LayoutBR {BR} at (576,260) size 0x19 + LayoutBR {BR} at (1,283) size 0x19 LayoutText {#text} at (1,301) size 486x19 text run at (1,301) width 486: "Height smaller than font-size, whole select shrinks but baseline is unchanged:" LayoutMenuList {SELECT} at (487,301) size 40x3 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 38x18 + LayoutBlockFlow (anonymous) at (1,1) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (527,301) size 7x19 text run at (527,301) width 7: "a" LayoutMenuList {SELECT} at (534,301) size 40x3 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 38x18 + LayoutBlockFlow (anonymous) at (1,1) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "bar" LayoutText {#text} at (574,301) size 8x19 text run at (574,301) width 8: "b" - LayoutBR {BR} at (582,301) size 0x0 - LayoutBR {BR} at (1,317) size 0x0 + LayoutBR {BR} at (582,301) size 0x19 + LayoutBR {BR} at (1,317) size 0x19 LayoutText {#text} at (1,333) size 164x19 text run at (1,333) width 164: "select control with size=0:" - LayoutBR {BR} at (165,333) size 0x0 + LayoutBR {BR} at (165,333) size 0x19 LayoutMenuList {SELECT} at (1,351) size 200x20 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 198x18 + LayoutBlockFlow (anonymous) at (1,1) size 198x18 LayoutText (anonymous) at (4,1) size 78x16 text run at (4,1) width 78: "Future Series" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (201,351) size 0x0 + LayoutBR {BR} at (201,351) size 0x19 LayoutText {#text} at (1,369) size 164x19 text run at (1,369) width 164: "select control with size=1:" - LayoutBR {BR} at (165,369) size 0x0 + LayoutBR {BR} at (165,369) size 0x19 LayoutMenuList {SELECT} at (1,387) size 200x20 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 198x18 + LayoutBlockFlow (anonymous) at (1,1) size 198x18 LayoutText (anonymous) at (4,1) size 78x16 text run at (4,1) width 78: "Future Series" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (201,387) size 0x0 + LayoutBR {BR} at (201,387) size 0x19 LayoutText {#text} at (1,405) size 161x19 text run at (1,405) width 161: "Non-styled select control:" - LayoutBR {BR} at (162,405) size 0x0 + LayoutBR {BR} at (162,405) size 0x19 LayoutMenuList {SELECT} at (1,423) size 220x40 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (11,11) size 198x18 + LayoutBlockFlow (anonymous) at (11,11) size 198x18 LayoutText (anonymous) at (4,1) size 78x16 text run at (4,1) width 78: "Future Series" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (221,433) size 0x0 + LayoutBR {BR} at (221,433) size 0x19 LayoutText {#text} at (1,461) size 286x19 text run at (1,461) width 286: "Styled select control with large border-radius:" - LayoutBR {BR} at (287,461) size 0x0 + LayoutBR {BR} at (287,461) size 0x19 LayoutMenuList {SELECT} at (1,479) size 220x40 [bgcolor=#33CCFF] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (11,11) size 198x18 + LayoutBlockFlow (anonymous) at (11,11) size 198x18 LayoutText (anonymous) at (4,1) size 78x16 text run at (4,1) width 78: "Future Series" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (221,489) size 0x0 + LayoutBR {BR} at (221,489) size 0x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/disabled-select-change-index-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/disabled-select-change-index-expected.txt index bec1f10..bde9a92 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/disabled-select-change-index-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/disabled-select-change-index-expected.txt
@@ -4,22 +4,22 @@ LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutMenuList {SELECT} at (0,0) size 57x20 [color=#808080] [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 55x18 + LayoutBlockFlow (anonymous) at (1,1) size 55x18 LayoutText (anonymous) at (4,1) size 35x16 text run at (4,1) width 35: "PASS" LayoutBR {BR} at (57,15) size 0x0 LayoutMenuList {SELECT} at (0,20) size 57x20 [color=#808080] [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 55x18 + LayoutBlockFlow (anonymous) at (1,1) size 55x18 LayoutText (anonymous) at (4,1) size 35x16 text run at (4,1) width 35: "PASS" LayoutBR {BR} at (57,35) size 0x0 LayoutMenuList {SELECT} at (0,40) size 57x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 55x18 + LayoutBlockFlow (anonymous) at (1,1) size 55x18 LayoutText (anonymous) at (4,1) size 35x16 text run at (4,1) width 35: "PASS" LayoutBR {BR} at (57,55) size 0x0 LayoutMenuList {SELECT} at (0,60) size 57x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 55x18 + LayoutBlockFlow (anonymous) at (1,1) size 55x18 LayoutText (anonymous) at (4,1) size 35x16 text run at (4,1) width 35: "PASS" LayoutBR {BR} at (57,75) size 0x0 @@ -29,28 +29,28 @@ LayoutBR {BR} at (56,220) size 0x0 LayoutText {#text} at (0,224) size 485x19 text run at (0,224) width 485: "PASS: sel1 correctly set to selectedIndex 1 by sel1.options[1].selected = true." - LayoutBR {BR} at (485,224) size 0x0 + LayoutBR {BR} at (485,224) size 0x19 LayoutText {#text} at (0,244) size 437x19 text run at (0,244) width 437: "PASS: sel2 correctly set to selectedIndex 1 by sel2.selectedIndex = 1." - LayoutBR {BR} at (437,244) size 0x0 + LayoutBR {BR} at (437,244) size 0x19 LayoutText {#text} at (0,264) size 485x19 text run at (0,264) width 485: "PASS: sel3 correctly set to selectedIndex 1 by sel3.options[1].selected = true." - LayoutBR {BR} at (485,264) size 0x0 + LayoutBR {BR} at (485,264) size 0x19 LayoutText {#text} at (0,284) size 437x19 text run at (0,284) width 437: "PASS: sel4 correctly set to selectedIndex 1 by sel4.selectedIndex = 1." - LayoutBR {BR} at (437,284) size 0x0 + LayoutBR {BR} at (437,284) size 0x19 LayoutText {#text} at (0,304) size 485x19 text run at (0,304) width 485: "PASS: sel5 correctly set to selectedIndex 1 by sel5.options[1].selected = true." - LayoutBR {BR} at (485,304) size 0x0 + LayoutBR {BR} at (485,304) size 0x19 LayoutText {#text} at (0,324) size 437x19 text run at (0,324) width 437: "PASS: sel6 correctly set to selectedIndex 1 by sel6.selectedIndex = 1." - LayoutBR {BR} at (437,324) size 0x0 + LayoutBR {BR} at (437,324) size 0x19 LayoutText {#text} at (0,344) size 485x19 text run at (0,344) width 485: "PASS: sel7 correctly set to selectedIndex 1 by sel7.options[1].selected = true." - LayoutBR {BR} at (485,344) size 0x0 + LayoutBR {BR} at (485,344) size 0x19 LayoutText {#text} at (0,364) size 437x19 text run at (0,364) width 437: "PASS: sel8 correctly set to selectedIndex 1 by sel8.selectedIndex = 1." - LayoutBR {BR} at (437,364) size 0x0 + LayoutBR {BR} at (437,364) size 0x19 layer at (8,88) size 56x36 clip at (9,89) size 39x34 LayoutListBox {SELECT} at (0,80) size 56x36 [color=#808080] [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] LayoutBlockFlow {OPTION} at (1,1) size 39x17
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/hidden-listbox-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/hidden-listbox-expected.txt index f082f4b0..bd73749 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/hidden-listbox-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/hidden-listbox-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 506x19 text run at (0,0) width 506: "This tests that the whole listbox control is hidden when visibility is set to hidden." - LayoutBR {BR} at (506,0) size 0x0 + LayoutBR {BR} at (506,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 hidden layer at (8,28) size 195x70 clip at (9,29) size 178x68 LayoutListBox {SELECT} at (0,20) size 195x70 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/listbox-appearance-basic-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/listbox-appearance-basic-expected.txt index 309a045..21765958 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/listbox-appearance-basic-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/listbox-appearance-basic-expected.txt
@@ -16,15 +16,15 @@ LayoutText {#text} at (367,59) size 4x19 text run at (367,59) width 4: " " LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (425,59) size 0x0 + LayoutBR {BR} at (425,59) size 0x19 LayoutText {#text} at (51,142) size 4x19 text run at (51,142) width 4: " " LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (102,142) size 0x0 + LayoutBR {BR} at (102,142) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (47,221) size 0x0 + LayoutBR {BR} at (47,221) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (47,300) size 0x0 + LayoutBR {BR} at (47,300) size 0x19 LayoutText {#text} at (51,430) size 4x20 text run at (51,430) width 4: " " LayoutText {#text} at (112,430) size 4x20 @@ -32,11 +32,11 @@ LayoutText {#text} at (178,430) size 4x20 text run at (178,430) width 4: " " LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (245,430) size 0x0 + LayoutBR {BR} at (245,430) size 0x20 LayoutText {#text} at (64,591) size 4x20 text run at (64,591) width 4: " " LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (149,591) size 0x0 + LayoutBR {BR} at (149,591) size 0x20 layer at (12,12) size 39x70 clip at (13,13) size 22x68 LayoutListBox {SELECT} at (4,4) size 39x70 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] LayoutBlockFlow {OPTION} at (1,1) size 22x17
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/listbox-bidi-align-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/listbox-bidi-align-expected.txt index a206691..423bdda 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/listbox-bidi-align-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/listbox-bidi-align-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 784x40 LayoutText {#text} at (0,0) size 597x19 text run at (0,0) width 597: "This test verifies the visual alignment of items in a select element while changing text direction." - LayoutBR {BR} at (597,0) size 0x0 + LayoutBR {BR} at (597,0) size 0x19 LayoutText {#text} at (0,20) size 426x19 text run at (0,20) width 426: "All the items in the following select elements should be left-aligned." LayoutTable {TABLE} at (0,40) size 716x118
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/listbox-width-change-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/listbox-width-change-expected.txt index e6217de..02abaf1 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/listbox-width-change-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/listbox-width-change-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 646x19 text run at (0,0) width 646: "This tests that when a list box's options get updated, the list box will recalculate its width, and relayout." - LayoutBR {BR} at (646,0) size 0x0 + LayoutBR {BR} at (646,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 layer at (8,28) size 211x70 clip at (9,29) size 194x68 LayoutListBox {SELECT} at (0,20) size 211x70 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-appearance-basic-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-appearance-basic-expected.txt index 13a970ba..b4d0c54 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-appearance-basic-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-appearance-basic-expected.txt
@@ -4,148 +4,148 @@ LayoutNGBlockFlow {HTML} at (0,0) size 800x525 LayoutNGBlockFlow {BODY} at (8,8) size 784x509 LayoutMenuList {SELECT} at (4,4) size 40x20 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 38x18 + LayoutBlockFlow (anonymous) at (1,1) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (48,4) size 0x0 + LayoutBR {BR} at (48,4) size 0x19 LayoutMenuList {SELECT} at (4,32) size 40x28 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,9) size 38x18 + LayoutBlockFlow (anonymous) at (1,9) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (48,40) size 4x19 text run at (48,40) width 4: " " LayoutMenuList {SELECT} at (56,40) size 46x20 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 38x18 + LayoutBlockFlow (anonymous) at (1,1) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (106,40) size 4x19 text run at (106,40) width 4: " " LayoutMenuList {SELECT} at (114,40) size 40x28 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 38x18 + LayoutBlockFlow (anonymous) at (1,1) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (158,40) size 4x19 text run at (158,40) width 4: " " LayoutMenuList {SELECT} at (166,40) size 46x20 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (7,1) size 38x18 + LayoutBlockFlow (anonymous) at (7,1) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (216,40) size 0x0 + LayoutBR {BR} at (216,40) size 0x19 LayoutMenuList {SELECT} at (4,76) size 44x24 [bgcolor=#DDDDDD] [border: (3px solid #00FF00)] - LayoutNGBlockFlow (anonymous) at (3,3) size 38x18 + LayoutBlockFlow (anonymous) at (3,3) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (52,78) size 4x19 text run at (52,78) width 4: " " LayoutMenuList {SELECT} at (60,78) size 40x20 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 38x18 + LayoutBlockFlow (anonymous) at (1,1) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (104,78) size 0x0 + LayoutBR {BR} at (104,78) size 0x19 LayoutMenuList {SELECT} at (4,115) size 40x20 [color=#FFFFFF] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 38x18 + LayoutBlockFlow (anonymous) at (1,1) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (48,115) size 4x19 text run at (48,115) width 4: " " LayoutNGBlockFlow {DIV} at (52,104) size 62x42 [bgcolor=#DBB102] LayoutMenuList {SELECT} at (12,12) size 38x18 - LayoutNGBlockFlow (anonymous) at (0,0) size 38x18 + LayoutBlockFlow (anonymous) at (0,0) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "bar" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (114,115) size 0x0 + LayoutBR {BR} at (114,115) size 0x19 LayoutMenuList {SELECT} at (4,150) size 40x20 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 38x18 + LayoutBlockFlow (anonymous) at (1,1) size 38x18 LayoutText (anonymous) at (4,1) size 18x16 text run at (4,1) width 18: "foo" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (48,150) size 0x0 + LayoutBR {BR} at (48,150) size 0x19 LayoutMenuList {SELECT} at (4,184) size 44x22 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 42x21 + LayoutBlockFlow (anonymous) at (1,1) size 42x21 LayoutText (anonymous) at (4,1) size 22x18 text run at (4,1) width 22: "foo" LayoutText {#text} at (52,186) size 4x19 text run at (52,186) width 4: " " LayoutMenuList {SELECT} at (60,180) size 50x27 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 48x26 + LayoutBlockFlow (anonymous) at (1,1) size 48x26 LayoutText (anonymous) at (4,1) size 28x23 text run at (4,1) width 28: "foo" LayoutText {#text} at (114,186) size 4x19 text run at (114,186) width 4: " " LayoutMenuList {SELECT} at (122,178) size 55x31 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 53x30 + LayoutBlockFlow (anonymous) at (1,1) size 53x30 LayoutText (anonymous) at (4,1) size 33x27 text run at (4,1) width 33: "foo" LayoutText {#text} at (181,186) size 4x19 text run at (181,186) width 4: " " LayoutMenuList {SELECT} at (189,186) size 121x20 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 119x18 + LayoutBlockFlow (anonymous) at (1,1) size 119x18 LayoutText (anonymous) at (4,1) size 99x16 text run at (4,1) width 99: "September 2016" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (314,186) size 0x0 + LayoutBR {BR} at (314,186) size 0x19 LayoutMenuList {SELECT} at (6,229.50) size 61x28 [bgcolor=#DDDDDD] [border: (1.50px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1.50,1.50) size 58x26 + LayoutBlockFlow (anonymous) at (1.50,1.50) size 58x26 LayoutText (anonymous) at (6,1) size 28x23 text run at (6,1) width 28: "foo" LayoutText {#text} at (73,236) size 4x19 text run at (73,236) width 4: " " LayoutMenuList {SELECT} at (85,221) size 82x40 [bgcolor=#DDDDDD] [border: (2px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (2,2) size 78x37 + LayoutBlockFlow (anonymous) at (2,2) size 78x37 LayoutText (anonymous) at (8,2) size 38x32 text run at (8,2) width 38: "foo" LayoutText {#text} at (175,236) size 4x19 text run at (175,236) width 4: " " LayoutMenuList {SELECT} at (181,241.50) size 31x13 [bgcolor=#DDDDDD] [border: (0.50px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (0.50,0.50) size 30x12 + LayoutBlockFlow (anonymous) at (0.50,0.50) size 30x12 LayoutText (anonymous) at (2,0) size 13x12 text run at (2,0) width 13: "foo" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (214,236) size 0x0 + LayoutBR {BR} at (214,236) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (208,283) size 0x0 + LayoutBR {BR} at (208,283) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (208,317) size 0x0 + LayoutBR {BR} at (208,317) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (208,351) size 0x0 + LayoutBR {BR} at (208,351) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (208,385) size 0x0 + LayoutBR {BR} at (208,385) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (208,419) size 0x0 + LayoutBR {BR} at (208,419) size 0x19 LayoutMenuList {SELECT} at (4,443) size 60x20 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 58x18 + LayoutBlockFlow (anonymous) at (1,1) size 58x18 LayoutText (anonymous) at (4,1) size 36x16 text run at (4,1) width 36: "Month" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (68,443) size 0x0 + LayoutBR {BR} at (68,443) size 0x19 LayoutMenuList {SELECT} at (4,478) size 40x20 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 38x18 + LayoutBlockFlow (anonymous) at (1,1) size 38x18 LayoutText (anonymous) at (16,1) size 18x16 text run at (16,1) width 18: "foo" LayoutText {#text} at (48,478) size 4x19 text run at (48,478) width 4: " " LayoutMenuList {SELECT} at (56,476) size 44x24 [bgcolor=#DDDDDD] [border: (3px solid #00FF00)] - LayoutNGBlockFlow (anonymous) at (3,3) size 38x18 + LayoutBlockFlow (anonymous) at (3,3) size 38x18 LayoutText (anonymous) at (16,1) size 18x16 text run at (16,1) width 18: "foo" LayoutText {#text} at (104,478) size 4x19 text run at (104,478) width 4: " " LayoutMenuList {SELECT} at (112,471) size 54x34 [bgcolor=#DDDDDD] [border: (8px solid #00FF00)] - LayoutNGBlockFlow (anonymous) at (8,8) size 38x18 + LayoutBlockFlow (anonymous) at (8,8) size 38x18 LayoutText (anonymous) at (16,1) size 18x16 text run at (16,1) width 18: "foo" LayoutText {#text} at (170,478) size 4x19 text run at (170,478) width 4: " " LayoutMenuList {SELECT} at (178,478) size 40x20 [bgcolor=#DDDDDD] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 38x18 + LayoutBlockFlow (anonymous) at (1,1) size 38x18 LayoutText (anonymous) at (16,1) size 18x16 text run at (16,1) width 18: "foo" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (222,478) size 0x0 + LayoutBR {BR} at (222,478) size 0x19 layer at (12,281) size 200x25 clip at (13,282) size 183x23 scrollHeight 51 LayoutListBox {SELECT} at (4,273) size 200x25 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] LayoutBlockFlow {OPTION} at (1,1) size 183x17
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-narrow-width-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-narrow-width-expected.txt index cabc018a..dbc9558 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-narrow-width-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-narrow-width-expected.txt
@@ -5,14 +5,14 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 498x19 text run at (0,0) width 498: "This tests that select elements with a narrow width (1px) are rendered correctly." - LayoutBR {BR} at (498,0) size 0x0 + LayoutBR {BR} at (498,0) size 0x19 LayoutMenuList {SELECT} at (0,20) size 2x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 20x18 + LayoutBlockFlow (anonymous) at (1,1) size 20x18 LayoutText (anonymous) at (4,1) size 22x16 text run at (4,1) width 22: "test" - LayoutBR {BR} at (2,20) size 0x0 + LayoutBR {BR} at (2,20) size 0x19 LayoutMenuList {SELECT} at (0,40) size 2x20 [bgcolor=#0000FF] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 20x18 + LayoutBlockFlow (anonymous) at (1,1) size 20x18 LayoutText (anonymous) at (4,1) size 22x16 text run at (4,1) width 22: "test" LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-restrict-line-height-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-restrict-line-height-expected.txt index 751daf1..5003b1a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-restrict-line-height-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-restrict-line-height-expected.txt
@@ -5,8 +5,8 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 417x19 text run at (0,0) width 417: "This tests that we don't honor line-height for styled popup buttons." - LayoutBR {BR} at (417,0) size 0x0 + LayoutBR {BR} at (417,0) size 0x19 LayoutMenuList {SELECT} at (0,20) size 204x20 [bgcolor=#ADD8E6] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 202x18 + LayoutBlockFlow (anonymous) at (1,1) size 202x18 LayoutText (anonymous) at (4,1) size 182x16 text run at (4,1) width 182: "This text should not be clipped."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-width-change-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-width-change-expected.txt index f248a26..11e854b9 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-width-change-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-width-change-expected.txt
@@ -6,12 +6,12 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 784x60 LayoutText {#text} at (0,0) size 663x19 text run at (0,0) width 663: "This tests that when an option is dynamically added to a menu list, and it is too long for the current width," - LayoutBR {BR} at (663,0) size 0x0 + LayoutBR {BR} at (663,0) size 0x19 LayoutText {#text} at (0,20) size 364x19 text run at (0,20) width 364: "that the select automatically recalculates the correct width." - LayoutBR {BR} at (364,20) size 0x0 + LayoutBR {BR} at (364,20) size 0x19 LayoutMenuList {SELECT} at (0,40) size 135x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 133x18 + LayoutBlockFlow (anonymous) at (1,1) size 133x18 LayoutText (anonymous) at (4,1) size 31x16 text run at (4,1) width 31: "Short" LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/optgroup-rendering-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/optgroup-rendering-expected.txt index 19b259d6..fa04a4f6 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/optgroup-rendering-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/optgroup-rendering-expected.txt
@@ -5,9 +5,9 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x363 LayoutNGBlockFlow {FORM} at (0,0) size 784x363 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (79,323) size 0x0 + LayoutBR {BR} at (79,323) size 0x19 LayoutMenuList {SELECT} at (0,343) size 71x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 69x18 + LayoutBlockFlow (anonymous) at (1,1) size 69x18 LayoutText (anonymous) at (4,1) size 33x16 text run at (4,1) width 33: "Three" LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/option-index-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/option-index-expected.txt index 0a8647e..09511bc 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/option-index-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/option-index-expected.txt
@@ -10,6 +10,6 @@ LayoutNGBlockFlow {DIV} at (0,40) size 784x40 LayoutText {#text} at (0,0) size 77x19 text run at (0,0) width 77: "Test Passed." - LayoutBR {BR} at (77,0) size 0x0 + LayoutBR {BR} at (77,0) size 0x19 LayoutText {#text} at (0,20) size 370x19 text run at (0,20) width 370: "Index for option element with no corresponding select is: 0"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/option-script-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/option-script-expected.txt index 87add36..94cde10 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/option-script-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/option-script-expected.txt
@@ -5,12 +5,12 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 340x19 text run at (0,0) width 340: "TEST PASSED: If the popup menu only says \"Text\"." - LayoutBR {BR} at (340,0) size 0x0 + LayoutBR {BR} at (340,0) size 0x19 LayoutText {#text} at (0,20) size 419x19 text run at (0,20) width 419: "TEST FAILED: If the popup menu says \"document.write('Text')\"." - LayoutBR {BR} at (419,20) size 0x0 + LayoutBR {BR} at (419,20) size 0x19 LayoutMenuList {SELECT} at (0,40) size 47x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 45x18 + LayoutBlockFlow (anonymous) at (1,1) size 45x18 LayoutText (anonymous) at (4,1) size 25x16 text run at (4,1) width 25: "Text" LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/option-strip-whitespace-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/option-strip-whitespace-expected.txt index 5a793a9..f5913b0 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/option-strip-whitespace-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/option-strip-whitespace-expected.txt
@@ -9,32 +9,32 @@ LayoutNGBlockFlow (anonymous) at (0,36) size 784x282 LayoutText {#text} at (0,51) size 70x19 text run at (0,51) width 70: "Five Tabs: " - LayoutBR {BR} at (148,51) size 0x0 - LayoutBR {BR} at (0,71) size 0x0 + LayoutBR {BR} at (148,51) size 0x19 + LayoutBR {BR} at (0,71) size 0x19 LayoutText {#text} at (0,142) size 84x19 text run at (0,142) width 84: "Five Spaces: " - LayoutBR {BR} at (162,142) size 0x0 - LayoutBR {BR} at (0,162) size 0x0 + LayoutBR {BR} at (162,142) size 0x19 + LayoutBR {BR} at (0,162) size 0x19 LayoutText {#text} at (0,182) size 298x19 text run at (0,182) width 298: "Five Spaces (with leading/trailing whitespace): " LayoutMenuList {SELECT} at (298,182) size 95x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 93x18 + LayoutBlockFlow (anonymous) at (1,1) size 93x18 LayoutText (anonymous) at (4,1) size 73x16 text run at (4,1) width 73: "Five Spaces" - LayoutBR {BR} at (393,182) size 0x0 - LayoutBR {BR} at (0,202) size 0x0 + LayoutBR {BR} at (393,182) size 0x19 + LayoutBR {BR} at (0,202) size 0x19 LayoutText {#text} at (0,222) size 284x19 text run at (0,222) width 284: "Five Tabs (with leading/trailing whitespace): " LayoutMenuList {SELECT} at (284,222) size 79x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 77x18 + LayoutBlockFlow (anonymous) at (1,1) size 77x18 LayoutText (anonymous) at (4,1) size 57x16 text run at (4,1) width 57: "Five Tabs" - LayoutBR {BR} at (363,222) size 0x0 - LayoutBR {BR} at (0,242) size 0x0 + LayoutBR {BR} at (363,222) size 0x19 + LayoutBR {BR} at (0,242) size 0x19 LayoutText {#text} at (0,262) size 126x19 text run at (0,262) width 126: "Mixed Whitespace: " LayoutMenuList {SELECT} at (126,262) size 79x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 77x18 + LayoutBlockFlow (anonymous) at (1,1) size 77x18 LayoutText (anonymous) at (4,1) size 57x16 text run at (4,1) width 57: "Five Tabs" LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/option-text-clip-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/option-text-clip-expected.txt index c139b737..be07da7 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/option-text-clip-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/option-text-clip-expected.txt
@@ -5,9 +5,9 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 697x19 text run at (0,0) width 697: "This tests that the option text is clipped properly, and doesn't spill over into the arrow part of the popup control." - LayoutBR {BR} at (697,0) size 0x0 + LayoutBR {BR} at (697,0) size 0x19 LayoutMenuList {SELECT} at (0,20) size 150x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 148x18 + LayoutBlockFlow (anonymous) at (1,1) size 148x18 LayoutText (anonymous) at (4,1) size 147x16 text run at (4,1) width 147: "12345 6789 ABCD EFGH" LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-baseline-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-baseline-expected.txt index 04fc14c..401ba74 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-baseline-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-baseline-expected.txt
@@ -5,27 +5,27 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 462x19 text run at (0,0) width 462: "This tests that empty select controls and buttons have the correct baseline." - LayoutBR {BR} at (462,0) size 0x0 + LayoutBR {BR} at (462,0) size 0x19 LayoutMenuList {SELECT} at (0,21) size 22x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 20x18 + LayoutBlockFlow (anonymous) at (1,1) size 20x18 LayoutText (anonymous) at (4,1) size 4x16 text run at (4,1) width 4: " " LayoutText {#text} at (22,21) size 29x19 text run at (22,21) width 29: " test " LayoutMenuList {SELECT} at (51,21) size 44x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 42x18 + LayoutBlockFlow (anonymous) at (1,1) size 42x18 LayoutText (anonymous) at (4,1) size 22x16 text run at (4,1) width 22: "test" LayoutText {#text} at (95,21) size 4x19 text run at (95,21) width 4: " " LayoutMenuList {SELECT} at (99,21) size 22x20 [color=#00008B] [bgcolor=#ADD8E6] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 20x18 + LayoutBlockFlow (anonymous) at (1,1) size 20x18 LayoutText (anonymous) at (4,1) size 4x16 text run at (4,1) width 4: " " LayoutText {#text} at (121,21) size 29x19 text run at (121,21) width 29: " test " LayoutMenuList {SELECT} at (150,21) size 44x20 [color=#00008B] [bgcolor=#ADD8E6] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 42x18 + LayoutBlockFlow (anonymous) at (1,1) size 42x18 LayoutText (anonymous) at (4,1) size 22x16 text run at (4,1) width 22: "test" LayoutText {#text} at (194,21) size 4x19 @@ -34,7 +34,7 @@ LayoutText {#text} at (214,21) size 4x19 text run at (214,21) width 4: " " LayoutButton {BUTTON} at (218,20) size 38x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 22x16 + LayoutBlockFlow (anonymous) at (8,3) size 22x16 LayoutText {#text} at (0,0) size 22x16 text run at (0,0) width 22: "test" LayoutText {#text} at (256,21) size 4x19 @@ -43,7 +43,7 @@ LayoutText {#text} at (276,21) size 4x19 text run at (276,21) width 4: " " LayoutButton {BUTTON} at (280,20) size 38x22 [color=#00008B] [bgcolor=#ADD8E6] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 22x16 + LayoutBlockFlow (anonymous) at (8,3) size 22x16 LayoutText {#text} at (0,0) size 22x16 text run at (0,0) width 22: "test" LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-block-background-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-block-background-expected.txt index 7fb3065e..79da9eb 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-block-background-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-block-background-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 784x20 LayoutText {#text} at (0,0) size 539x19 text run at (0,0) width 539: "This tests that backgrounds for list box items draw correctly when a list box is a block" - LayoutBR {BR} at (539,0) size 0x0 + LayoutBR {BR} at (539,0) size 0x19 layer at (8,28) size 54x70 clip at (9,29) size 37x68 LayoutListBox {SELECT} at (0,20) size 54x70 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] LayoutBlockFlow {OPTION} at (1,1) size 37x17 [color=#FFFFFF] [bgcolor=#999999]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-change-listbox-to-popup-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-change-listbox-to-popup-expected.txt index d43e567..5b9fb7b3 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-change-listbox-to-popup-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-change-listbox-to-popup-expected.txt
@@ -5,9 +5,9 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 441x19 text run at (0,0) width 441: "This tests that you can dynamically change a list box to a popup menu" - LayoutBR {BR} at (441,0) size 0x0 + LayoutBR {BR} at (441,0) size 0x19 LayoutMenuList {SELECT} at (0,20) size 226x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 224x18 + LayoutBlockFlow (anonymous) at (1,1) size 224x18 LayoutText (anonymous) at (4,1) size 204x16 text run at (4,1) width 204: "This should turn into a popup menu" LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-change-popup-to-listbox-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-change-popup-to-listbox-expected.txt index a869658..b6c196350 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-change-popup-to-listbox-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-change-popup-to-listbox-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 445x19 text run at (0,0) width 445: "This tests that you can dynamically change a popup menu to a list box." - LayoutBR {BR} at (445,0) size 0x0 + LayoutBR {BR} at (445,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 layer at (8,28) size 196x87 clip at (9,29) size 179x85 LayoutListBox {SELECT} at (0,20) size 196x87 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-initial-position-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-initial-position-expected.txt index b392c3a..6bba28c 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-initial-position-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-initial-position-expected.txt
@@ -5,40 +5,40 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x393 LayoutText {#text} at (0,0) size 93x19 text run at (0,0) width 93: "initial selected:" - LayoutBR {BR} at (93,0) size 0x0 + LayoutBR {BR} at (93,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (155,71) size 0x0 + LayoutBR {BR} at (155,71) size 0x19 LayoutText {#text} at (0,91) size 161x19 text run at (0,91) width 161: "dynamic selected change:" - LayoutBR {BR} at (161,91) size 0x0 + LayoutBR {BR} at (161,91) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (155,162) size 0x0 + LayoutBR {BR} at (155,162) size 0x19 LayoutText {#text} at (0,182) size 211x19 text run at (0,182) width 211: "dynamic insert of selected option:" - LayoutBR {BR} at (211,182) size 0x0 + LayoutBR {BR} at (211,182) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (155,253) size 0x0 + LayoutBR {BR} at (155,253) size 0x19 LayoutText {#text} at (0,273) size 93x19 text run at (0,273) width 93: "initial selected:" - LayoutBR {BR} at (93,273) size 0x0 + LayoutBR {BR} at (93,273) size 0x19 LayoutMenuList {SELECT} at (0,293) size 156x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] LayoutBlockFlow (anonymous) at (1,1) size 154x18 LayoutText (anonymous) at (4,1) size 134x16 text run at (4,1) width 134: "this should be selected" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (156,293) size 0x0 + LayoutBR {BR} at (156,293) size 0x19 LayoutText {#text} at (0,313) size 161x19 text run at (0,313) width 161: "dynamic selected change:" - LayoutBR {BR} at (161,313) size 0x0 + LayoutBR {BR} at (161,313) size 0x19 LayoutMenuList {SELECT} at (0,333) size 156x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] LayoutBlockFlow (anonymous) at (1,1) size 154x18 LayoutText (anonymous) at (4,1) size 134x16 text run at (4,1) width 134: "this should be selected" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (156,333) size 0x0 + LayoutBR {BR} at (156,333) size 0x19 LayoutText {#text} at (0,353) size 211x19 text run at (0,353) width 211: "dynamic insert of selected option:" - LayoutBR {BR} at (211,353) size 0x0 + LayoutBR {BR} at (211,353) size 0x19 LayoutMenuList {SELECT} at (0,373) size 156x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] LayoutBlockFlow (anonymous) at (1,1) size 154x18 LayoutText (anonymous) at (4,1) size 134x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-size-invalid-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-size-invalid-expected.txt index ea1a0f93..f09a502 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-size-invalid-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-size-invalid-expected.txt
@@ -6,9 +6,9 @@ LayoutText {#text} at (0,0) size 783x39 text run at (0,0) width 783: "This tests that a malformed size attribute will be parsed and corrected so that the right size attribute value is used to match the" text run at (0,20) width 406: "style rule that determines whether to use a menu list or a list box." - LayoutBR {BR} at (406,20) size 0x0 + LayoutBR {BR} at (406,20) size 0x19 LayoutMenuList {SELECT} at (0,40) size 44x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutNGBlockFlow (anonymous) at (1,1) size 42x18 + LayoutBlockFlow (anonymous) at (1,1) size 42x18 LayoutText (anonymous) at (4,1) size 22x16 text run at (4,1) width 22: "test" LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-style-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-style-expected.txt index a50cacc..77fdf12 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-style-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-style-expected.txt
@@ -5,16 +5,16 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 553x19 text run at (0,0) width 553: "This tests that styled popups look right. (Aqua for now- later, we will honor the styling)." - LayoutBR {BR} at (553,0) size 0x0 + LayoutBR {BR} at (553,0) size 0x19 LayoutMenuList {SELECT} at (0,20) size 44x20 [bgcolor=#FF0000] [border: (1px solid #A9A9A9)] LayoutBlockFlow (anonymous) at (1,1) size 42x18 LayoutText (anonymous) at (4,1) size 22x16 text run at (4,1) width 22: "test" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (44,20) size 0x0 + LayoutBR {BR} at (44,20) size 0x19 LayoutText {#text} at (0,40) size 528x19 text run at (0,40) width 528: "This tests that background color is white by default regardless of the parent element." - LayoutBR {BR} at (528,40) size 0x0 + LayoutBR {BR} at (528,40) size 0x19 LayoutInline {SPAN} at (0,0) size 54x29 [bgcolor=#FF0000] LayoutText {#text} at (0,0) size 0x0 LayoutMenuList {SELECT} at (5,60) size 44x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] @@ -23,10 +23,10 @@ text run at (4,1) width 22: "test" LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (54,60) size 0x0 + LayoutBR {BR} at (54,60) size 0x19 LayoutText {#text} at (0,80) size 625x19 text run at (0,80) width 625: "This tests that background color is inherited from the parent if background-color:inherit is specified." - LayoutBR {BR} at (625,80) size 0x0 + LayoutBR {BR} at (625,80) size 0x19 LayoutInline {SPAN} at (0,0) size 54x29 [bgcolor=#FF0000] LayoutText {#text} at (0,0) size 0x0 LayoutMenuList {SELECT} at (5,100) size 44x20 [border: (1px solid #A9A9A9)] @@ -35,10 +35,10 @@ text run at (4,1) width 22: "test" LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (54,100) size 0x0 + LayoutBR {BR} at (54,100) size 0x19 LayoutText {#text} at (0,120) size 637x19 text run at (0,120) width 637: "This tests that background color is the same as the parent if background-color:transparent is specified." - LayoutBR {BR} at (637,120) size 0x0 + LayoutBR {BR} at (637,120) size 0x19 LayoutInline {SPAN} at (0,0) size 54x29 [bgcolor=#FF0000] LayoutText {#text} at (0,0) size 0x0 LayoutMenuList {SELECT} at (5,140) size 44x20 [border: (1px solid #A9A9A9)] @@ -47,19 +47,19 @@ text run at (4,1) width 22: "test" LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (54,140) size 0x0 + LayoutBR {BR} at (54,140) size 0x19 LayoutText {#text} at (0,160) size 498x19 text run at (0,160) width 498: "This tests that background is white if only background-image:none is specified." - LayoutBR {BR} at (498,160) size 0x0 + LayoutBR {BR} at (498,160) size 0x19 LayoutMenuList {SELECT} at (0,180) size 44x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] LayoutBlockFlow (anonymous) at (1,1) size 42x18 LayoutText (anonymous) at (4,1) size 22x16 text run at (4,1) width 22: "test" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (44,180) size 0x0 + LayoutBR {BR} at (44,180) size 0x19 LayoutText {#text} at (0,200) size 418x19 text run at (0,200) width 418: "This tests that the image specified for background-image is visible." - LayoutBR {BR} at (418,200) size 0x0 + LayoutBR {BR} at (418,200) size 0x19 LayoutMenuList {SELECT} at (0,220) size 44x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] LayoutBlockFlow (anonymous) at (1,1) size 42x18 LayoutText (anonymous) at (4,1) size 22x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/submit/submit-appearance-basic-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/submit/submit-appearance-basic-expected.txt index ff21110..e7ed535 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/submit/submit-appearance-basic-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/submit/submit-appearance-basic-expected.txt
@@ -4,62 +4,62 @@ LayoutNGBlockFlow {HTML} at (0,0) size 800x241 LayoutNGBlockFlow {BODY} at (8,8) size 784x225 LayoutButton {INPUT} at (4,4) size 34x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 18x16 + LayoutBlockFlow (anonymous) at (8,3) size 18x16 LayoutText {#text} at (0,0) size 18x16 text run at (0,0) width 18: "foo" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (42,5) size 0x0 + LayoutBR {BR} at (42,5) size 0x19 LayoutButton {INPUT} at (4,34) size 36x24 [bgcolor=#C0C0C0] [border: (3px solid #00FF00)] - LayoutNGBlockFlow (anonymous) at (9,4) size 18x16 + LayoutBlockFlow (anonymous) at (9,4) size 18x16 LayoutText {#text} at (0,0) size 18x16 text run at (0,0) width 18: "foo" LayoutText {#text} at (44,36) size 4x19 text run at (44,36) width 4: " " LayoutButton {INPUT} at (52,35) size 34x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 18x16 + LayoutBlockFlow (anonymous) at (8,3) size 18x16 LayoutText {#text} at (0,0) size 18x16 text run at (0,0) width 18: "foo" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (90,36) size 0x0 + LayoutBR {BR} at (90,36) size 0x19 LayoutButton {INPUT} at (4,66) size 34x22 [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 18x16 + LayoutBlockFlow (anonymous) at (8,3) size 18x16 LayoutText {#text} at (0,0) size 18x16 text run at (0,0) width 18: "foo" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (42,67) size 0x0 + LayoutBR {BR} at (42,67) size 0x19 LayoutButton {INPUT} at (4,96) size 34x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 18x16 + LayoutBlockFlow (anonymous) at (8,3) size 18x16 LayoutText {#text} at (0,0) size 18x16 text run at (0,0) width 18: "foo" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (42,97) size 0x0 + LayoutBR {BR} at (42,97) size 0x19 LayoutButton {INPUT} at (4,132) size 38x25 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 22x19 + LayoutBlockFlow (anonymous) at (8,3) size 22x19 LayoutText {#text} at (0,0) size 22x18 text run at (0,0) width 22: "foo" LayoutText {#text} at (46,135) size 4x19 text run at (46,135) width 4: " " LayoutButton {INPUT} at (54,128) size 44x30 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 28x24 + LayoutBlockFlow (anonymous) at (8,3) size 28x24 LayoutText {#text} at (0,0) size 28x23 text run at (0,0) width 28: "foo" LayoutText {#text} at (102,135) size 4x19 text run at (102,135) width 4: " " LayoutButton {INPUT} at (110,126) size 49x34 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 33x28 + LayoutBlockFlow (anonymous) at (8,3) size 33x28 LayoutText {#text} at (0,0) size 33x27 text run at (0,0) width 33: "foo" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (163,135) size 0x0 + LayoutBR {BR} at (163,135) size 0x19 LayoutButton {INPUT} at (6,180.50) size 52x33 [bgcolor=#C0C0C0] [border: (3px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (12,4.50) size 28x24 + LayoutBlockFlow (anonymous) at (12,4.50) size 28x24 LayoutText {#text} at (0,0) size 28x23 text run at (0,0) width 28: "foo" LayoutText {#text} at (64,189) size 4x19 text run at (64,189) width 4: " " LayoutButton {INPUT} at (76,172) size 70x45 [bgcolor=#C0C0C0] [border: (4px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (16,6) size 38x33 + LayoutBlockFlow (anonymous) at (16,6) size 38x33 LayoutText {#text} at (0,0) size 38x32 text run at (0,0) width 38: "foo" LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (154,189) size 0x0 + LayoutBR {BR} at (154,189) size 0x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/tabbing-input-iframe-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/tabbing-input-iframe-expected.txt index 4ed7fde..ecaca6a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/tabbing-input-iframe-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/tabbing-input-iframe-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 442x19 text run at (0,0) width 442: "This tests that you can tab out of a text field if an iframe comes after it." - LayoutBR {BR} at (442,0) size 0x0 + LayoutBR {BR} at (442,0) size 0x19 LayoutTextControl {INPUT} at (0,156) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,157) size 4x19 text run at (181,157) width 4: " "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-bkcolor-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-bkcolor-expected.txt index 3aabd6ed..b3e0caa5 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-bkcolor-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-bkcolor-expected.txt
@@ -5,10 +5,10 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 564x19 text run at (0,0) width 564: "This tests that background color and background images can be set on the new text fields." - LayoutBR {BR} at (564,0) size 0x0 + LayoutBR {BR} at (564,0) size 0x19 LayoutTextControl {INPUT} at (0,20) size 181x22 [bgcolor=#FFC0CB] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (181,21) size 0x0 + LayoutBR {BR} at (181,21) size 0x19 LayoutTextControl {INPUT} at (0,42) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (10,31) size 177x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-default-bkcolor-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-default-bkcolor-expected.txt index 56ba440..d2541e47 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-default-bkcolor-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-default-bkcolor-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 [bgcolor=#800080] LayoutText {#text} at (0,0) size 469x19 text run at (0,0) width 469: "This tests that the default background color for the new text fields is white." - LayoutBR {BR} at (469,0) size 0x0 + LayoutBR {BR} at (469,0) size 0x19 LayoutTextControl {INPUT} at (0,20) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (10,31) size 177x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-disabled-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-disabled-expected.txt index 99afeac7..ce4ca96 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-disabled-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-disabled-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 393x19 text run at (0,0) width 393: "This tests that text can not be inserted into a disabled text field." - LayoutBR {BR} at (393,0) size 0x0 + LayoutBR {BR} at (393,0) size 0x19 LayoutTextControl {INPUT} at (0,20) size 181x22 [color=#545454] [bgcolor=#EBEBE4] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (10,31) size 177x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-focus-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-focus-expected.txt index 1647cde..124922d 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-focus-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-focus-expected.txt
@@ -13,13 +13,13 @@ LayoutTextControl {INPUT} at (185,0) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow {DIV} at (0,74) size 784x80 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutText {#text} at (0,20) size 320x19 text run at (0,20) width 320: "Test Passed. Text field 1's onFocus event has fired." - LayoutBR {BR} at (320,20) size 0x0 + LayoutBR {BR} at (320,20) size 0x19 LayoutText {#text} at (0,40) size 310x19 text run at (0,40) width 310: "Test Passed. Text field 1's onBlur event has fired." - LayoutBR {BR} at (310,40) size 0x0 + LayoutBR {BR} at (310,40) size 0x19 LayoutText {#text} at (0,60) size 320x19 text run at (0,60) width 320: "Test Passed. Text field 2's onFocus event has fired." LayoutNGBlockFlow {P} at (0,170) size 784x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-preventDefault-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-preventDefault-expected.txt index 66324af..350ee79b 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-preventDefault-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-preventDefault-expected.txt
@@ -3,7 +3,7 @@ layer at (0,0) size 800x600 LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutText {#text} at (0,20) size 666x19 text run at (0,20) width 666: "This tests that preventDefault called onmousedown will prevent a caret from being placed in the text field." layer at (10,50) size 181x22 clip at (12,52) size 177x18 @@ -14,6 +14,6 @@ text run at (0,0) width 138: "No caret should be here" layer at (10,70) size 323x40 LayoutNGBlockFlow (positioned) {DIV} at (10,70) size 323x40 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutText {#text} at (0,20) size 323x19 text run at (0,20) width 323: "mousedown on target [object HTMLInputElement]"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-readonly-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-readonly-expected.txt index ef2bca6..e12440c6 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-readonly-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-readonly-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 396x19 text run at (0,0) width 396: "This tests that text can not be inserted into a readonly text field." - LayoutBR {BR} at (396,0) size 0x0 + LayoutBR {BR} at (396,0) size 0x19 LayoutTextControl {INPUT} at (0,20) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (10,31) size 177x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-selection-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-selection-expected.txt index 05b0e685..067a2fb 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-selection-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-selection-expected.txt
@@ -10,69 +10,69 @@ LayoutTextControl {INPUT} at (0,0) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow {DIV} at (0,74) size 769x540 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutText {#text} at (0,20) size 196x19 text run at (0,20) width 196: "Test 1: setSelectionRange(0, 0)" - LayoutBR {BR} at (196,20) size 0x0 + LayoutBR {BR} at (196,20) size 0x19 LayoutText {#text} at (0,40) size 47x19 text run at (0,40) width 47: "Passed." - LayoutBR {BR} at (47,40) size 0x0 - LayoutBR {BR} at (0,60) size 0x0 + LayoutBR {BR} at (47,40) size 0x19 + LayoutBR {BR} at (0,60) size 0x19 LayoutText {#text} at (0,80) size 160x19 text run at (0,80) width 160: "Test 2: selectionEnd = 17" - LayoutBR {BR} at (160,80) size 0x0 + LayoutBR {BR} at (160,80) size 0x19 LayoutText {#text} at (0,100) size 47x19 text run at (0,100) width 47: "Passed." - LayoutBR {BR} at (47,100) size 0x0 - LayoutBR {BR} at (0,120) size 0x0 + LayoutBR {BR} at (47,100) size 0x19 + LayoutBR {BR} at (0,120) size 0x19 LayoutText {#text} at (0,140) size 155x19 text run at (0,140) width 155: "Test 3: selectionStart = 1" - LayoutBR {BR} at (155,140) size 0x0 + LayoutBR {BR} at (155,140) size 0x19 LayoutText {#text} at (0,160) size 47x19 text run at (0,160) width 47: "Passed." - LayoutBR {BR} at (47,160) size 0x0 - LayoutBR {BR} at (0,180) size 0x0 + LayoutBR {BR} at (47,160) size 0x19 + LayoutBR {BR} at (0,180) size 0x19 LayoutText {#text} at (0,200) size 204x19 text run at (0,200) width 204: "Test 4: setSelectionRange(10, 3)" - LayoutBR {BR} at (204,200) size 0x0 + LayoutBR {BR} at (204,200) size 0x19 LayoutText {#text} at (0,220) size 47x19 text run at (0,220) width 47: "Passed." - LayoutBR {BR} at (47,220) size 0x0 - LayoutBR {BR} at (0,240) size 0x0 + LayoutBR {BR} at (47,220) size 0x19 + LayoutBR {BR} at (0,240) size 0x19 LayoutText {#text} at (0,260) size 152x19 text run at (0,260) width 152: "Test 5: selectionEnd = 2" - LayoutBR {BR} at (152,260) size 0x0 + LayoutBR {BR} at (152,260) size 0x19 LayoutText {#text} at (0,280) size 47x19 text run at (0,280) width 47: "Passed." - LayoutBR {BR} at (47,280) size 0x0 - LayoutBR {BR} at (0,300) size 0x0 + LayoutBR {BR} at (47,280) size 0x19 + LayoutBR {BR} at (0,300) size 0x19 LayoutText {#text} at (0,320) size 196x19 text run at (0,320) width 196: "Test 6: setSelectionRange(5, 4)" - LayoutBR {BR} at (196,320) size 0x0 + LayoutBR {BR} at (196,320) size 0x19 LayoutText {#text} at (0,340) size 47x19 text run at (0,340) width 47: "Passed." - LayoutBR {BR} at (47,340) size 0x0 - LayoutBR {BR} at (0,360) size 0x0 + LayoutBR {BR} at (47,340) size 0x19 + LayoutBR {BR} at (0,360) size 0x19 LayoutText {#text} at (0,380) size 206x19 text run at (0,380) width 206: "Test 7: setSelectionRange(-5, -4)" - LayoutBR {BR} at (206,380) size 0x0 + LayoutBR {BR} at (206,380) size 0x19 LayoutText {#text} at (0,400) size 47x19 text run at (0,400) width 47: "Passed." - LayoutBR {BR} at (47,400) size 0x0 - LayoutBR {BR} at (0,420) size 0x0 + LayoutBR {BR} at (47,400) size 0x19 + LayoutBR {BR} at (0,420) size 0x19 LayoutText {#text} at (0,440) size 209x19 text run at (0,440) width 209: "Test 8: setSelectionRange(-5, 80)" - LayoutBR {BR} at (209,440) size 0x0 + LayoutBR {BR} at (209,440) size 0x19 LayoutText {#text} at (0,460) size 47x19 text run at (0,460) width 47: "Passed." - LayoutBR {BR} at (47,460) size 0x0 - LayoutBR {BR} at (0,480) size 0x0 + LayoutBR {BR} at (47,460) size 0x19 + LayoutBR {BR} at (0,480) size 0x19 LayoutText {#text} at (0,500) size 204x19 text run at (0,500) width 204: "Test 9: setSelectionRange(3, 12)" - LayoutBR {BR} at (204,500) size 0x0 + LayoutBR {BR} at (204,500) size 0x19 LayoutText {#text} at (0,520) size 47x19 text run at (0,520) width 47: "Passed." - LayoutBR {BR} at (47,520) size 0x0 + LayoutBR {BR} at (47,520) size 0x19 LayoutNGBlockFlow {P} at (0,630) size 769x0 layer at (10,47) size 177x16 LayoutBlockFlow {DIV} at (2,3) size 177x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-width-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-width-expected.txt index 56de774..82d27bb 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-width-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-appearance-width-expected.txt
@@ -5,17 +5,17 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 344x19 text run at (0,0) width 344: "This tests that the new text fields use the correct width." - LayoutBR {BR} at (344,0) size 0x0 + LayoutBR {BR} at (344,0) size 0x19 LayoutTextControl {INPUT} at (0,20) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (181,21) size 0x0 + LayoutBR {BR} at (181,21) size 0x19 LayoutTextControl {INPUT} at (0,42) size 200x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (200,43) size 0x0 + LayoutBR {BR} at (200,43) size 0x19 LayoutTextControl {INPUT} at (0,64) size 421x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (421,65) size 0x0 + LayoutBR {BR} at (421,65) size 0x19 LayoutTextControl {INPUT} at (0,86) size 200x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (200,87) size 0x0 + LayoutBR {BR} at (200,87) size 0x19 LayoutTextControl {INPUT} at (0,108) size 101x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (101,109) size 0x0 + LayoutBR {BR} at (101,109) size 0x19 layer at (10,31) size 177x16 LayoutBlockFlow {DIV} at (2,3) size 177x16 layer at (10,53) size 196x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-baseline-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-baseline-expected.txt index 39ba02dc..db957ce3 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-baseline-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-baseline-expected.txt
@@ -5,13 +5,13 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 289x19 text run at (0,0) width 289: "This tests that text fields get the right baseline." - LayoutBR {BR} at (289,0) size 0x0 - LayoutBR {BR} at (0,20) size 0x0 + LayoutBR {BR} at (289,0) size 0x19 + LayoutBR {BR} at (0,20) size 0x19 LayoutTextControl {INPUT} at (0,40) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,41) size 420x19 text run at (181,41) width 420: "This text should line up with the bottom of the text in the text field." - LayoutBR {BR} at (601,41) size 0x0 - LayoutBR {BR} at (0,62) size 0x0 + LayoutBR {BR} at (601,41) size 0x19 + LayoutBR {BR} at (0,62) size 0x19 LayoutTextControl {INPUT} at (0,82) size 181x128 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,167) size 420x19 text run at (181,167) width 420: "This text should line up with the bottom of the text in the text field."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-disabled-color-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-disabled-color-expected.txt index 6c390a1b..ed4569b 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-disabled-color-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-disabled-color-expected.txt
@@ -5,72 +5,72 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 509x19 text run at (0,0) width 509: "This tests that the text color changes appropriately when the text field is disabled." - LayoutBR {BR} at (509,0) size 0x0 + LayoutBR {BR} at (509,0) size 0x19 LayoutTextControl {INPUT} at (0,20) size 181x22 [color=#545454] [bgcolor=#EBEBE4] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,21) size 4x19 text run at (181,21) width 4: " " LayoutTextControl {INPUT} at (185,20) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (366,21) size 0x0 + LayoutBR {BR} at (366,21) size 0x19 LayoutTextControl {INPUT} at (0,42) size 181x22 [color=#FF0000] [bgcolor=#EBEBE4] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,43) size 4x19 text run at (181,43) width 4: " " LayoutTextControl {INPUT} at (185,42) size 181x22 [color=#FF0000] [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (366,43) size 0x0 + LayoutBR {BR} at (366,43) size 0x19 LayoutTextControl {INPUT} at (0,64) size 181x22 [color=#545454] [bgcolor=#0000FF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,65) size 4x19 text run at (181,65) width 4: " " LayoutTextControl {INPUT} at (185,64) size 181x22 [bgcolor=#0000FF] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (366,65) size 0x0 + LayoutBR {BR} at (366,65) size 0x19 LayoutTextControl {INPUT} at (0,86) size 181x22 [color=#FF0000] [bgcolor=#0000FF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,87) size 4x19 text run at (181,87) width 4: " " LayoutTextControl {INPUT} at (185,86) size 181x22 [color=#FF0000] [bgcolor=#0000FF] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (366,87) size 0x0 + LayoutBR {BR} at (366,87) size 0x19 LayoutTextControl {INPUT} at (0,108) size 181x22 [color=#545454] [bgcolor=#000000] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,109) size 4x19 text run at (181,109) width 4: " " LayoutTextControl {INPUT} at (185,108) size 181x22 [bgcolor=#000000] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (366,109) size 0x0 + LayoutBR {BR} at (366,109) size 0x19 LayoutTextControl {INPUT} at (0,130) size 181x22 [color=#FFFFFF] [bgcolor=#000000] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,131) size 4x19 text run at (181,131) width 4: " " LayoutTextControl {INPUT} at (185,130) size 181x22 [color=#FFFFFF] [bgcolor=#000000] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (366,131) size 0x0 + LayoutBR {BR} at (366,131) size 0x19 LayoutTextControl {INPUT} at (0,152) size 181x22 [color=#545454] [bgcolor=#808080] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,153) size 4x19 text run at (181,153) width 4: " " LayoutTextControl {INPUT} at (185,152) size 181x22 [bgcolor=#808080] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (366,153) size 0x0 + LayoutBR {BR} at (366,153) size 0x19 LayoutTextControl {INPUT} at (0,174) size 181x22 [color=#FFFFFF] [bgcolor=#A9A9A9] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,175) size 4x19 text run at (181,175) width 4: " " LayoutTextControl {INPUT} at (185,174) size 181x22 [color=#FFFFFF] [bgcolor=#A9A9A9] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (366,175) size 0x0 + LayoutBR {BR} at (366,175) size 0x19 LayoutTextControl {INPUT} at (0,196) size 181x22 [color=#808080] [bgcolor=#000000] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,197) size 4x19 text run at (181,197) width 4: " " LayoutTextControl {INPUT} at (185,196) size 181x22 [color=#808080] [bgcolor=#000000] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (366,197) size 0x0 + LayoutBR {BR} at (366,197) size 0x19 LayoutTextControl {INPUT} at (0,218) size 181x22 [color=#FF0000] [bgcolor=#808080] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,219) size 4x19 text run at (181,219) width 4: " " LayoutTextControl {INPUT} at (185,218) size 181x22 [color=#FF0000] [bgcolor=#808080] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (366,219) size 0x0 + LayoutBR {BR} at (366,219) size 0x19 LayoutTextControl {INPUT} at (0,240) size 181x22 [color=#808080] [bgcolor=#FF0000] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,241) size 4x19 text run at (181,241) width 4: " " LayoutTextControl {INPUT} at (185,240) size 181x22 [color=#808080] [bgcolor=#FF0000] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (366,241) size 0x0 + LayoutBR {BR} at (366,241) size 0x19 LayoutTextControl {INPUT} at (0,262) size 181x22 [color=#FF0000] [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,263) size 4x19 text run at (181,263) width 4: " " LayoutTextControl {INPUT} at (185,262) size 181x22 [color=#FF0000] [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (366,263) size 0x0 + LayoutBR {BR} at (366,263) size 0x19 LayoutTextControl {INPUT} at (0,284) size 181x22 [color=#FF0000] [border: (2px inset #EEEEEE)] LayoutText {#text} at (181,285) size 4x19 text run at (181,285) width 4: " " LayoutTextControl {INPUT} at (185,284) size 181x22 [color=#FF0000] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (366,285) size 0x0 + LayoutBR {BR} at (366,285) size 0x19 layer at (10,31) size 177x16 scrollWidth 380 LayoutBlockFlow {DIV} at (2,3) size 177x16 LayoutText {#text} at (0,0) size 380x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-readonly-autoscroll-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-readonly-autoscroll-expected.txt index c8d945f..e4060527 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-readonly-autoscroll-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-readonly-autoscroll-expected.txt
@@ -20,7 +20,7 @@ LayoutNGBlockFlow {DIV} at (0,94) size 784x20 LayoutText {#text} at (0,0) size 79x19 text run at (0,0) width 79: "ScrollLeft: 0" - LayoutBR {BR} at (79,0) size 0x0 + LayoutBR {BR} at (79,0) size 0x19 layer at (10,83) size 177x16 LayoutBlockFlow {DIV} at (2,3) size 177x16 LayoutText {#text} at (0,0) size 167x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-readonly-dimmed-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-readonly-dimmed-expected.txt index 1b37d67..b2618b7 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-readonly-dimmed-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-readonly-dimmed-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 451x19 text run at (0,0) width 451: "This tests that the border of a readonly text field should appear dimmed." - LayoutBR {BR} at (451,0) size 0x0 + LayoutBR {BR} at (451,0) size 0x19 LayoutTextControl {INPUT} at (0,20) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (10,31) size 177x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-spaces-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-spaces-expected.txt index d5f7e52..84e87f3 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-spaces-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/input-spaces-expected.txt
@@ -6,7 +6,7 @@ LayoutText {#text} at (0,0) size 776x39 text run at (0,0) width 776: "This tests that leading and trailing spaces in a text field don't get lost. There should be 3 spaces before and 3 spaces after the" text run at (0,20) width 98: "text in the field." - LayoutBR {BR} at (98,20) size 0x0 + LayoutBR {BR} at (98,20) size 0x19 LayoutTextControl {INPUT} at (0,40) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (10,51) size 177x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/text-appearance-basic-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/text-appearance-basic-expected.txt index 979db81..5341dcb 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/text-appearance-basic-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/text-appearance-basic-expected.txt
@@ -5,19 +5,19 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x263 LayoutTextControl {INPUT} at (4,4) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (189,5) size 0x0 + LayoutBR {BR} at (189,5) size 0x19 LayoutTextControl {INPUT} at (4,34) size 183x24 [bgcolor=#FFFFFF] [border: (3px solid #00FF00)] LayoutText {#text} at (191,36) size 4x19 text run at (191,36) width 4: " " LayoutTextControl {INPUT} at (199,35) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (384,36) size 0x0 + LayoutBR {BR} at (384,36) size 0x19 LayoutTextControl {INPUT} at (4,66) size 181x22 [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (189,67) size 0x0 + LayoutBR {BR} at (189,67) size 0x19 LayoutTextControl {INPUT} at (4,96) size 181x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (189,97) size 0x0 + LayoutBR {BR} at (189,97) size 0x19 LayoutTextControl {INPUT} at (4,130) size 205x25 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (213,133) size 4x19 text run at (213,133) width 4: " " @@ -25,13 +25,13 @@ LayoutText {#text} at (0,0) size 0x0 LayoutTextControl {INPUT} at (4,164) size 314x34 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (322,173) size 0x0 + LayoutBR {BR} at (322,173) size 0x19 LayoutTextControl {INPUT} at (6,218.50) size 252x33 [bgcolor=#FFFFFF] [border: (3px inset #EEEEEE)] LayoutText {#text} at (264,227) size 4x19 text run at (264,227) width 4: " " LayoutTextControl {INPUT} at (276,210) size 342x45 [bgcolor=#FFFFFF] [border: (4px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (626,227) size 0x0 + LayoutBR {BR} at (626,227) size 0x19 layer at (14,15) size 177x16 LayoutBlockFlow {DIV} at (2,3) size 177x16 LayoutText {#text} at (0,0) size 18x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/text-appearance-datalist-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/text-appearance-datalist-expected.txt index 87ed362..31c0828 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/text-appearance-datalist-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/text-appearance-datalist-expected.txt
@@ -14,7 +14,7 @@ LayoutBlockFlow {DIV} at (0,0) size 159.14x16 LayoutDetailsMarker {DIV} at (159.14,1.33) size 17.86x13.33: down LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (366,1) size 0x0 + LayoutBR {BR} at (366,1) size 0x19 LayoutTextControl {INPUT} at (0,22) size 181x22 [color=#545454] [bgcolor=#EBEBE4] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (2,3) size 177x16 LayoutBlockFlow {DIV} at (0,0) size 159.14x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/textfield-outline-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/textfield-outline-expected.txt index 430af4d..847a851 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/textfield-outline-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/text/textfield-outline-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 550x19 text run at (0,0) width 550: "This tests that a negative outline-offset won't get in the way of a cursor in a text control." - LayoutBR {BR} at (550,0) size 0x0 + LayoutBR {BR} at (550,0) size 0x19 LayoutTextControl {INPUT} at (0,20) size 248x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutText {#text} at (0,0) size 0x0 layer at (9,30) size 246x24 scrollWidth 547
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/basic-textareas-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/basic-textareas-expected.txt index 6110b06..9904a487 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/basic-textareas-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/basic-textareas-expected.txt
@@ -17,81 +17,81 @@ LayoutNGBlockFlow (anonymous) at (0,25) size 785x815 LayoutNGBlockFlow {DIV} at (0,32) size 183x60 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,13) size 80x0 - LayoutBR {BR} at (81,1) size 0x0 + LayoutBR {BR} at (81,1) size 0x15 LayoutNGBlockFlow {DIV} at (183,32) size 183x60 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x16 LayoutText {#text} at (0,0) size 76x15 text run at (0,0) width 76: "disabled: \"true\"," - LayoutBR {BR} at (81,1) size 0x0 + LayoutBR {BR} at (81,1) size 0x15 LayoutNGBlockFlow {DIV} at (366,0) size 199x92 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x32 LayoutText {#text} at (0,0) size 78x31 text run at (0,0) width 25: "style:" text run at (0,16) width 78: "\"padding:10px\"," - LayoutBR {BR} at (81,17) size 0x0 + LayoutBR {BR} at (81,17) size 0x15 LayoutNGBlockFlow {DIV} at (565,20) size 179x72 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x32 LayoutText {#text} at (0,0) size 72x31 text run at (0,0) width 25: "style:" text run at (0,16) width 72: "\"padding:0px\"," - LayoutBR {BR} at (81,17) size 0x0 + LayoutBR {BR} at (81,17) size 0x15 LayoutNGBlockFlow {DIV} at (0,124) size 203x96 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x32 LayoutText {#text} at (0,0) size 73x31 text run at (0,0) width 25: "style:" text run at (0,16) width 73: "\"margin:10px\"," - LayoutBR {BR} at (81,17) size 0x0 + LayoutBR {BR} at (81,17) size 0x15 LayoutNGBlockFlow {DIV} at (203,144) size 183x76 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x32 LayoutText {#text} at (0,0) size 67x31 text run at (0,0) width 25: "style:" text run at (0,16) width 67: "\"margin:0px\"," - LayoutBR {BR} at (81,17) size 0x0 + LayoutBR {BR} at (81,17) size 0x15 LayoutNGBlockFlow {DIV} at (386,144) size 82x76 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x32 LayoutText {#text} at (0,0) size 67x31 text run at (0,0) width 25: "style:" text run at (0,16) width 67: "\"width:60px\"," - LayoutBR {BR} at (81,17) size 0x0 + LayoutBR {BR} at (81,17) size 0x15 LayoutNGBlockFlow {DIV} at (468,92) size 104x128 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x48 LayoutText {#text} at (0,0) size 73x47 text run at (0,0) width 25: "style:" text run at (0,16) width 62: "\"width:60px;" text run at (0,32) width 73: "padding:20px\"," - LayoutBR {BR} at (81,33) size 0x0 + LayoutBR {BR} at (81,33) size 0x15 LayoutNGBlockFlow {DIV} at (572,132) size 82x88 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x48 LayoutText {#text} at (0,0) size 62x47 text run at (0,0) width 25: "style:" text run at (0,16) width 62: "\"width:60px;" text run at (0,32) width 55: "padding:0\"," - LayoutBR {BR} at (81,33) size 0x0 + LayoutBR {BR} at (81,33) size 0x15 LayoutNGBlockFlow {DIV} at (0,252) size 183x104 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x32 LayoutText {#text} at (0,0) size 69x31 text run at (0,0) width 25: "style:" text run at (0,16) width 69: "\"height:60px\"," - LayoutBR {BR} at (81,17) size 0x0 + LayoutBR {BR} at (81,17) size 0x15 LayoutNGBlockFlow {DIV} at (183,236) size 82x120 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x48 LayoutText {#text} at (0,0) size 64x47 text run at (0,0) width 25: "style:" text run at (0,16) width 62: "\"width:60px;" text run at (0,32) width 64: "height:60px\"," - LayoutBR {BR} at (81,33) size 0x0 + LayoutBR {BR} at (81,33) size 0x15 LayoutNGBlockFlow {DIV} at (265,280) size 183x76 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x32 LayoutText {#text} at (0,0) size 91x31 text run at (0,0) width 25: "style:" text run at (0,16) width 91: "\"overflow:hidden\"," - LayoutBR {BR} at (81,17) size 0x0 + LayoutBR {BR} at (81,17) size 0x15 LayoutNGBlockFlow {DIV} at (448,265) size 183x91 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x32 LayoutText {#text} at (0,0) size 85x31 text run at (0,0) width 25: "style:" text run at (0,16) width 85: "\"overflow:scroll\"," - LayoutBR {BR} at (81,17) size 0x0 + LayoutBR {BR} at (81,17) size 0x15 LayoutNGBlockFlow {DIV} at (631,220) size 82x136 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x64 LayoutText {#text} at (0,0) size 86x63 @@ -99,7 +99,7 @@ text run at (0,16) width 86: "\"overflow:hidden;" text run at (0,32) width 57: "width:60px;" text run at (0,48) width 64: "height:60px\"," - LayoutBR {BR} at (81,49) size 0x0 + LayoutBR {BR} at (81,49) size 0x15 LayoutNGBlockFlow {DIV} at (0,356) size 82x136 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x64 LayoutText {#text} at (0,0) size 80x63 @@ -107,21 +107,21 @@ text run at (0,16) width 80: "\"overflow:scroll;" text run at (0,32) width 57: "width:60px;" text run at (0,48) width 64: "height:60px\"," - LayoutBR {BR} at (81,49) size 0x0 + LayoutBR {BR} at (81,49) size 0x15 LayoutNGBlockFlow {DIV} at (82,372) size 82x120 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x48 LayoutText {#text} at (0,0) size 72x47 text run at (0,0) width 72: "cols: \"5\", style:" text run at (0,16) width 62: "\"width:60px;" text run at (0,32) width 64: "height:60px\"," - LayoutBR {BR} at (81,33) size 0x0 + LayoutBR {BR} at (81,33) size 0x15 LayoutNGBlockFlow {DIV} at (164,372) size 82x120 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x48 LayoutText {#text} at (0,0) size 77x47 text run at (0,0) width 77: "rows: \"4\", style:" text run at (0,16) width 62: "\"width:60px;" text run at (0,32) width 64: "height:60px\"," - LayoutBR {BR} at (81,33) size 0x0 + LayoutBR {BR} at (81,33) size 0x15 LayoutNGBlockFlow {DIV} at (246,356) size 82x136 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x64 LayoutText {#text} at (0,0) size 74x63 @@ -129,91 +129,91 @@ text run at (0,16) width 47: "\"4\", style:" text run at (0,32) width 62: "\"width:60px;" text run at (0,48) width 64: "height:60px\"," - LayoutBR {BR} at (81,49) size 0x0 + LayoutBR {BR} at (81,49) size 0x15 LayoutNGBlockFlow {DIV} at (328,432) size 82x60 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x16 LayoutText {#text} at (0,0) size 44x15 text run at (0,0) width 44: "cols: \"3\"," - LayoutBR {BR} at (81,1) size 0x0 + LayoutBR {BR} at (81,1) size 0x15 LayoutNGBlockFlow {DIV} at (410,416) size 183x76 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x16 LayoutText {#text} at (0,0) size 49x15 text run at (0,0) width 49: "rows: \"3\"," - LayoutBR {BR} at (81,1) size 0x0 + LayoutBR {BR} at (81,1) size 0x15 LayoutNGBlockFlow {DIV} at (593,432) size 82x60 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x16 LayoutText {#text} at (0,0) size 44x15 text run at (0,0) width 44: "cols: \"7\"," - LayoutBR {BR} at (81,1) size 0x0 + LayoutBR {BR} at (81,1) size 0x15 LayoutNGBlockFlow {DIV} at (0,492) size 183x140 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x16 LayoutText {#text} at (0,0) size 49x15 text run at (0,0) width 49: "rows: \"7\"," - LayoutBR {BR} at (81,1) size 0x0 + LayoutBR {BR} at (81,1) size 0x15 LayoutNGBlockFlow {DIV} at (183,524) size 82x108 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x32 LayoutText {#text} at (0,0) size 74x31 text run at (0,0) width 74: "cols: \"5\", rows:" text run at (0,16) width 19: "\"4\"," - LayoutBR {BR} at (81,17) size 0x0 + LayoutBR {BR} at (81,17) size 0x15 LayoutNGBlockFlow {DIV} at (265,557) size 183x75 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x16 LayoutText {#text} at (0,0) size 57x15 text run at (0,0) width 57: "wrap: \"off\"," - LayoutBR {BR} at (81,1) size 0x0 + LayoutBR {BR} at (81,1) size 0x15 LayoutNGBlockFlow {DIV} at (448,572) size 183x60 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x16 LayoutText {#text} at (0,0) size 64x15 text run at (0,0) width 64: "wrap: \"hard\"," - LayoutBR {BR} at (81,1) size 0x0 + LayoutBR {BR} at (81,1) size 0x15 LayoutNGBlockFlow {DIV} at (0,648) size 183x60 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x16 LayoutText {#text} at (0,0) size 61x15 text run at (0,0) width 61: "wrap: \"soft\"," - LayoutBR {BR} at (81,1) size 0x0 + LayoutBR {BR} at (81,1) size 0x15 LayoutNGBlockFlow {DIV} at (183,632) size 183x76 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x32 LayoutText {#text} at (0,0) size 70x31 text run at (0,0) width 63: "style: \"white-" text run at (0,16) width 70: "space:normal\"," - LayoutBR {BR} at (81,17) size 0x0 + LayoutBR {BR} at (81,17) size 0x15 LayoutNGBlockFlow {DIV} at (366,632) size 183x76 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x32 LayoutText {#text} at (0,0) size 63x31 text run at (0,0) width 63: "style: \"white-" text run at (0,16) width 52: "space:pre\"," - LayoutBR {BR} at (81,17) size 0x0 + LayoutBR {BR} at (81,17) size 0x15 LayoutNGBlockFlow {DIV} at (549,632) size 183x76 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x32 LayoutText {#text} at (0,0) size 76x31 text run at (0,0) width 63: "style: \"white-" text run at (0,16) width 76: "space:prewrap\"," - LayoutBR {BR} at (81,17) size 0x0 + LayoutBR {BR} at (81,17) size 0x15 LayoutNGBlockFlow {DIV} at (0,739) size 183x76 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x32 LayoutText {#text} at (0,0) size 73x31 text run at (0,0) width 63: "style: \"white-" text run at (0,16) width 73: "space:nowrap\"," - LayoutBR {BR} at (81,17) size 0x0 + LayoutBR {BR} at (81,17) size 0x15 LayoutNGBlockFlow {DIV} at (183,739) size 183x76 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x32 LayoutText {#text} at (0,0) size 73x31 text run at (0,0) width 63: "style: \"white-" text run at (0,16) width 73: "space:pre-line\"," - LayoutBR {BR} at (81,17) size 0x0 + LayoutBR {BR} at (81,17) size 0x15 LayoutNGBlockFlow {DIV} at (366,724) size 183x91 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x32 LayoutText {#text} at (0,0) size 68x31 text run at (0,0) width 62: "style: \"word-" text run at (0,16) width 68: "wrap:normal\"," - LayoutBR {BR} at (81,17) size 0x0 + LayoutBR {BR} at (81,17) size 0x15 LayoutNGBlockFlow {DIV} at (549,708) size 183x107 [border: (1px solid #0000FF)] LayoutNGBlockFlow {SPAN} at (1,1) size 80x48 LayoutText {#text} at (0,0) size 80x47 text run at (0,0) width 57: "wrap: \"off\"," text run at (0,16) width 63: "style: \"white-" text run at (0,32) width 80: "space:pre-wrap\"," - LayoutBR {BR} at (81,33) size 0x0 + LayoutBR {BR} at (81,33) size 0x15 layer at (1,79) size 181x38 clip at (2,80) size 179x36 LayoutTextControl {TEXTAREA} at (1,17) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] LayoutBlockFlow {DIV} at (3,3) size 175x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/reset-textarea-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/reset-textarea-expected.txt index 7512dba..a5b3b62 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/reset-textarea-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/reset-textarea-expected.txt
@@ -9,20 +9,20 @@ LayoutText {#text} at (362,21) size 4x19 text run at (362,21) width 4: " " LayoutButton {INPUT} at (366,20) size 50x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] - LayoutNGBlockFlow (anonymous) at (8,3) size 34x16 + LayoutBlockFlow (anonymous) at (8,3) size 34x16 LayoutText {#text} at (0,0) size 34x16 text run at (0,0) width 34: "Reset" LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow {P} at (0,58) size 784x80 LayoutText {#text} at (0,0) size 354x19 text run at (0,0) width 354: "This test verifies that textarea controls are properly reset." - LayoutBR {BR} at (354,0) size 0x0 + LayoutBR {BR} at (354,0) size 0x19 LayoutText {#text} at (0,20) size 468x19 text run at (0,20) width 468: "You should see two element IDs below, and the word \"SUCCESS\" twice:" - LayoutBR {BR} at (468,20) size 0x0 + LayoutBR {BR} at (468,20) size 0x19 LayoutText {#text} at (0,40) size 170x19 text run at (0,40) width 170: "noDefaultText: SUCCESS" - LayoutBR {BR} at (170,40) size 0x0 + LayoutBR {BR} at (170,40) size 0x19 LayoutText {#text} at (0,60) size 175x19 text run at (0,60) width 175: "hasDefaultText: SUCCESS" layer at (8,8) size 179x36 clip at (9,9) size 177x34
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textAreaLineHeight-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textAreaLineHeight-expected.txt index 17466b8f..17f489924 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textAreaLineHeight-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textAreaLineHeight-expected.txt
@@ -6,14 +6,14 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 769x20 LayoutText {#text} at (0,0) size 269x19 text run at (0,0) width 269: "line-height settings not reflected in textarea" - LayoutBR {BR} at (269,0) size 0x0 + LayoutBR {BR} at (269,0) size 0x19 LayoutNGBlockFlow {P} at (0,36) size 769x271 LayoutText {#text} at (0,0) size 86x19 text run at (0,0) width 86: "TEXTAREA" - LayoutBR {BR} at (86,0) size 0x0 + LayoutBR {BR} at (86,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (406,211) size 0x0 - LayoutBR {BR} at (0,231) size 0x0 + LayoutBR {BR} at (406,211) size 0x19 + LayoutBR {BR} at (0,231) size 0x19 LayoutText {#text} at (0,251) size 151x19 text run at (0,251) width 151: "PARAGRAPH - works" LayoutNGBlockFlow {P} at (0,323) size 402x202 [border: (1px dotted #C0C0C0)] @@ -21,32 +21,32 @@ text run at (1,19) width 347: "Demo text here that wraps a bit and should demonstrate the" text run at (1,72) width 134: "goodness of line-height" LayoutNGBlockFlow (anonymous) at (0,538.33) size 769x40 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutText {#text} at (0,20) size 81x19 text run at (0,20) width 81: "DIV - works" - LayoutBR {BR} at (81,20) size 0x0 + LayoutBR {BR} at (81,20) size 0x19 LayoutNGBlockFlow {DIV} at (0,578.33) size 402x202 [border: (1px dotted #C0C0C0)] LayoutText {#text} at (1,19) size 347x69 text run at (1,19) width 347: "Demo text here that wraps a bit and should demonstrate the" text run at (1,72) width 134: "goodness of line-height" LayoutNGBlockFlow (anonymous) at (0,780.33) size 769x437 - LayoutBR {BR} at (0,0) size 0x0 - LayoutBR {BR} at (0,20) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 + LayoutBR {BR} at (0,20) size 0x19 LayoutText {#text} at (0,40) size 123x19 text run at (0,40) width 123: "Un-Styled Textarea" - LayoutBR {BR} at (123,40) size 0x0 + LayoutBR {BR} at (123,40) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (181,83) size 0x0 - LayoutBR {BR} at (0,103) size 0x0 + LayoutBR {BR} at (181,83) size 0x19 + LayoutBR {BR} at (0,103) size 0x19 LayoutText {#text} at (0,123) size 213x19 text run at (0,123) width 213: "Totally Blank Un-Styled Textarea" - LayoutBR {BR} at (213,123) size 0x0 + LayoutBR {BR} at (213,123) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (181,166) size 0x0 - LayoutBR {BR} at (0,186) size 0x0 + LayoutBR {BR} at (181,166) size 0x19 + LayoutBR {BR} at (0,186) size 0x19 LayoutText {#text} at (0,206) size 211x19 text run at (0,206) width 211: "Totally Blank STYLED Textarea" - LayoutBR {BR} at (211,206) size 0x0 + LayoutBR {BR} at (211,206) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow {P} at (0,1233.33) size 769x0 layer at (8,64) size 406x206 clip at (9,65) size 404x204
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-align-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-align-expected.txt index 7016b82..8b45b13 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-align-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-align-expected.txt
@@ -8,11 +8,11 @@ text run at (0,0) width 624: "The following textarea elements should all be rendered on the left, with their text aligned to the left." LayoutNGBlockFlow (anonymous) at (0,36) size 784x172 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (421,23) size 0x0 + LayoutBR {BR} at (421,23) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (421,66) size 0x0 + LayoutBR {BR} at (421,66) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (421,109) size 0x0 + LayoutBR {BR} at (421,109) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow {DIV} at (0,208) size 784x43 layer at (8,52) size 421x38 clip at (9,53) size 419x36
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-appearance-basic-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-appearance-basic-expected.txt index d24ff56..993587e 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-appearance-basic-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-appearance-basic-expected.txt
@@ -4,24 +4,24 @@ LayoutNGBlockFlow {HTML} at (0,0) size 800x453 LayoutNGBlockFlow {BODY} at (8,8) size 784x437 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (189,31) size 0x0 + LayoutBR {BR} at (189,31) size 0x19 LayoutText {#text} at (193,86) size 4x19 text run at (193,86) width 4: " " LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (386,86) size 0x0 + LayoutBR {BR} at (386,86) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (189,137) size 0x0 + LayoutBR {BR} at (189,137) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (189,188) size 0x0 + LayoutBR {BR} at (189,188) size 0x19 LayoutText {#text} at (229,251) size 4x19 text run at (229,251) width 4: " " LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (309,324) size 0x0 + LayoutBR {BR} at (309,324) size 0x19 LayoutText {#text} at (276,417) size 4x19 text run at (276,417) width 4: " " LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (643,417) size 0x0 + LayoutBR {BR} at (643,417) size 0x19 layer at (12,12) size 181x38 clip at (13,13) size 179x36 LayoutTextControl {TEXTAREA} at (4,4) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] LayoutBlockFlow {DIV} at (3,3) size 175x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-scrollbar-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-scrollbar-expected.txt index 11014b6..7dc6d52 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-scrollbar-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-scrollbar-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 438x19 text run at (0,0) width 438: "This tests that a scrollbar will appear when text overflows the textarea" - LayoutBR {BR} at (438,0) size 0x0 + LayoutBR {BR} at (438,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 layer at (8,28) size 179x100 clip at (9,29) size 162x98 scrollHeight 146 LayoutTextControl {TEXTAREA} at (0,20) size 179x100 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-scrolled-focus-ring-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-scrolled-focus-ring-expected.txt index 65ebcbd..eb45e28f 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-scrolled-focus-ring-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-scrolled-focus-ring-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x63 LayoutText {#text} at (0,0) size 565x19 text run at (0,0) width 565: "Test passes if a focus ring is visible around text area when focused and scrolled to bottom." - LayoutBR {BR} at (565,0) size 0x0 + LayoutBR {BR} at (565,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 layer at (8,28) size 181x38 clip at (9,29) size 164x36 scrollY 48.00 scrollHeight 84 LayoutTextControl {TEXTAREA} at (0,20) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-scrolled-mask-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-scrolled-mask-expected.txt index eda06cd..f2cf93c4 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-scrolled-mask-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-scrolled-mask-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x63 LayoutText {#text} at (0,0) size 532x19 text run at (0,0) width 532: "Test passes if the textarea's gray background and text are masked off to a 10x10 rect." - LayoutBR {BR} at (532,0) size 0x0 + LayoutBR {BR} at (532,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 layer at (8,28) size 181x38 clip at (9,29) size 164x36 transparent scrollY 48.00 scrollHeight 84 LayoutTextControl {TEXTAREA} at (0,20) size 181x38 [bgcolor=#D3D3D3] [border: (1px solid #A9A9A9)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-scrolled-type-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-scrolled-type-expected.txt index 74c6b31b..dc63b02 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-scrolled-type-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-scrolled-type-expected.txt
@@ -6,9 +6,9 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 784x136 LayoutText {#text} at (0,0) size 502x19 text run at (0,0) width 502: "This tests that typing in a scrolled textarea does not cause unnecessary scrolling." - LayoutBR {BR} at (502,0) size 0x0 + LayoutBR {BR} at (502,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (179,121) size 0x0 + LayoutBR {BR} at (179,121) size 0x19 LayoutNGBlockFlow {DIV} at (0,136) size 784x0 layer at (8,28) size 179x116 clip at (9,29) size 162x114 scrollY 224.00 scrollHeight 338 LayoutTextControl {TEXTAREA} at (0,20) size 179x116 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-width-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-width-expected.txt index bc67215..bd51e9975 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-width-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/textarea/textarea-width-expected.txt
@@ -8,7 +8,7 @@ text run at (0,0) width 777: "This text area should be drawn with a reasonable width. To match IE, using GDI fonts it should wrap at 66 characters (after" text run at (0,20) width 532: "the X in the third set of digits). See https://bugs.webkit.org/show_bug.cgi?id=15312." LayoutNGBlockFlow (anonymous) at (0,40) size 784x284 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 layer at (8,68) size 547x264 clip at (9,69) size 545x262 LayoutTextControl {TEXTAREA} at (0,20) size 547x264 [color=#333333] [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/frames/001-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/frames/001-expected.txt index 21ac4258..95ca6a64 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/frames/001-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/frames/001-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 [color=#FFFFFF] [bgcolor=#000000] LayoutText {#text} at (0,0) size 522x19 text run at (0,0) width 522: "The three red squares below should all look the same and be filled only with black." - LayoutBR {BR} at (522,0) size 0x0 + LayoutBR {BR} at (522,0) size 0x19 LayoutText {#text} at (170,175) size 4x19 text run at (170,175) width 4: " " LayoutText {#text} at (344,175) size 4x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/frames/iframe-with-frameborder-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/frames/iframe-with-frameborder-expected.txt index c5216a39..d2b63e6 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/frames/iframe-with-frameborder-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/frames/iframe-with-frameborder-expected.txt
@@ -5,17 +5,17 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x533 LayoutText {#text} at (0,0) size 211x19 text run at (0,0) width 211: "This iframe should have a border." - LayoutBR {BR} at (211,0) size 0x0 + LayoutBR {BR} at (211,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (304,159) size 0x0 + LayoutBR {BR} at (304,159) size 0x19 LayoutText {#text} at (0,179) size 146x19 text run at (0,179) width 146: "This iframe should not." - LayoutBR {BR} at (146,179) size 0x0 + LayoutBR {BR} at (146,179) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (300,334) size 0x0 + LayoutBR {BR} at (300,334) size 0x19 LayoutText {#text} at (0,354) size 211x19 text run at (0,354) width 211: "This iframe should have a border." - LayoutBR {BR} at (211,354) size 0x0 + LayoutBR {BR} at (211,354) size 0x19 LayoutText {#text} at (0,0) size 0x0 layer at (8,28) size 304x154 LayoutIFrame {IFRAME} at (0,20) size 304x154 [border: (2px inset #EEEEEE)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/frames/onlyCommentInIFrame-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/frames/onlyCommentInIFrame-expected.txt index 684781f..a8ed652 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/frames/onlyCommentInIFrame-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/frames/onlyCommentInIFrame-expected.txt
@@ -7,10 +7,10 @@ text run at (0,0) width 780: "The documents in the src attributes of the iframes below only contain comments. This test is for a bug where we would only" text run at (0,20) width 768: "construct LayoutViews for such iframes. We need to propery construct an empty frame instead, so the LayoutView should" text run at (0,40) width 564: "have a LayoutBlockFlow and LayoutBlockFlow below it in the dump of the RenderTree." - LayoutBR {BR} at (564,40) size 0x0 + LayoutBR {BR} at (564,40) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (788,59) size 0x0 - LayoutBR {BR} at (0,74) size 0x0 + LayoutBR {BR} at (788,59) size 0x19 + LayoutBR {BR} at (0,74) size 0x19 LayoutText {#text} at (0,0) size 0x0 layer at (8,68) size 788x14 LayoutIFrame {IFRAME} at (0,60) size 788x14 [border: (2px inset #EEEEEE)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/conic-gradient-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/conic-gradient-expected.txt index f74cc93..b29ac1e6 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/conic-gradient-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/conic-gradient-expected.txt
@@ -11,7 +11,7 @@ text run at (488,227) width 4: " " LayoutNGBlockFlow {DIV} at (512,20) size 202x202 [border: (1px solid #808080)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (734,227) size 0x0 + LayoutBR {BR} at (734,227) size 0x19 LayoutNGBlockFlow {DIV} at (20,267) size 202x202 [border: (1px solid #808080)] LayoutText {#text} at (242,474) size 4x19 text run at (242,474) width 4: " "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/conic-gradient-out-of-range-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/conic-gradient-out-of-range-expected.txt index 54c65da..8b2384d 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/conic-gradient-out-of-range-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/conic-gradient-out-of-range-expected.txt
@@ -30,7 +30,7 @@ text run at (668,77) width 4: " " LayoutNGBlockFlow {DIV} at (677,5) size 82x82 [border: (1px solid #808080)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (764,77) size 0x0 + LayoutBR {BR} at (764,77) size 0x19 LayoutNGBlockFlow {DIV} at (5,102) size 82x82 [border: (1px solid #808080)] LayoutText {#text} at (92,174) size 4x19 text run at (92,174) width 4: " "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/conic-gradient-positioning-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/conic-gradient-positioning-expected.txt index f151b44..8868c9e 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/conic-gradient-positioning-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/conic-gradient-positioning-expected.txt
@@ -12,7 +12,7 @@ LayoutNGBlockFlow {DIV} at (506,2) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (590,2) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (674,2) size 80x80 [border: (1px solid #808080)] - LayoutBR {BR} at (756,69) size 0x0 + LayoutBR {BR} at (756,69) size 0x19 LayoutNGBlockFlow {DIV} at (2,91) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (86,91) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (170,91) size 80x80 [border: (1px solid #808080)] @@ -22,7 +22,7 @@ LayoutNGBlockFlow {DIV} at (506,91) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (590,91) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (674,91) size 80x80 [border: (1px solid #808080)] - LayoutBR {BR} at (756,158) size 0x0 + LayoutBR {BR} at (756,158) size 0x19 LayoutNGBlockFlow {DIV} at (2,180) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (86,180) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (170,180) size 80x80 [border: (1px solid #808080)] @@ -32,7 +32,7 @@ LayoutNGBlockFlow {DIV} at (506,180) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (590,180) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (674,180) size 80x80 [border: (1px solid #808080)] - LayoutBR {BR} at (756,247) size 0x0 + LayoutBR {BR} at (756,247) size 0x19 LayoutNGBlockFlow {DIV} at (2,269) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (86,269) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (170,269) size 80x80 [border: (1px solid #808080)] @@ -42,7 +42,7 @@ LayoutNGBlockFlow {DIV} at (506,269) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (590,269) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (674,269) size 80x80 [border: (1px solid #808080)] - LayoutBR {BR} at (756,336) size 0x0 + LayoutBR {BR} at (756,336) size 0x19 LayoutNGBlockFlow {DIV} at (2,358) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (86,358) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (170,358) size 80x80 [border: (1px solid #808080)] @@ -52,4 +52,4 @@ LayoutNGBlockFlow {DIV} at (506,358) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (590,358) size 80x80 [border: (1px solid #808080)] LayoutNGBlockFlow {DIV} at (674,358) size 80x80 [border: (1px solid #808080)] - LayoutBR {BR} at (756,425) size 0x0 + LayoutBR {BR} at (756,425) size 0x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/css3-radial-gradients4-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/css3-radial-gradients4-expected.txt index 1c278c7..fd9ec52 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/css3-radial-gradients4-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/css3-radial-gradients4-expected.txt
@@ -26,7 +26,7 @@ text run at (626,41) width 4: " " LayoutNGBlockFlow {DIV} at (632,2) size 82x52 [border: (1px solid #000000)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (716,41) size 0x0 + LayoutBR {BR} at (716,41) size 0x19 LayoutNGBlockFlow {DIV} at (2,63) size 82x52 [border: (1px solid #000000)] LayoutText {#text} at (86,102) size 4x19 text run at (86,102) width 4: " " @@ -50,7 +50,7 @@ text run at (626,102) width 4: " " LayoutNGBlockFlow {DIV} at (632,63) size 82x52 [border: (1px solid #000000)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (716,102) size 0x0 + LayoutBR {BR} at (716,102) size 0x19 LayoutNGBlockFlow {DIV} at (2,124) size 82x52 [border: (1px solid #000000)] LayoutText {#text} at (86,163) size 4x19 text run at (86,163) width 4: " " @@ -74,7 +74,7 @@ text run at (626,163) width 4: " " LayoutNGBlockFlow {DIV} at (632,124) size 82x52 [border: (1px solid #000000)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (716,163) size 0x0 + LayoutBR {BR} at (716,163) size 0x19 LayoutNGBlockFlow {DIV} at (2,185) size 82x52 [border: (1px solid #000000)] LayoutText {#text} at (86,224) size 4x19 text run at (86,224) width 4: " " @@ -98,7 +98,7 @@ text run at (626,224) width 4: " " LayoutNGBlockFlow {DIV} at (632,185) size 82x52 [border: (1px solid #000000)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (716,224) size 0x0 + LayoutBR {BR} at (716,224) size 0x19 LayoutNGBlockFlow {DIV} at (2,246) size 82x52 [border: (1px solid #000000)] LayoutText {#text} at (86,285) size 4x19 text run at (86,285) width 4: " " @@ -122,7 +122,7 @@ text run at (626,285) width 4: " " LayoutNGBlockFlow {DIV} at (632,246) size 82x52 [border: (1px solid #000000)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (716,285) size 0x0 + LayoutBR {BR} at (716,285) size 0x19 LayoutNGBlockFlow {DIV} at (2,307) size 82x52 [border: (1px solid #000000)] LayoutText {#text} at (86,346) size 4x19 text run at (86,346) width 4: " " @@ -146,7 +146,7 @@ text run at (626,346) width 4: " " LayoutNGBlockFlow {DIV} at (632,307) size 82x52 [border: (1px solid #000000)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (716,346) size 0x0 + LayoutBR {BR} at (716,346) size 0x19 LayoutNGBlockFlow {DIV} at (2,368) size 82x52 [border: (1px solid #000000)] LayoutText {#text} at (86,407) size 4x19 text run at (86,407) width 4: " " @@ -170,7 +170,7 @@ text run at (626,407) width 4: " " LayoutNGBlockFlow {DIV} at (632,368) size 82x52 [border: (1px solid #000000)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (716,407) size 0x0 + LayoutBR {BR} at (716,407) size 0x19 LayoutNGBlockFlow {DIV} at (2,429) size 82x52 [border: (1px solid #000000)] LayoutText {#text} at (86,468) size 4x19 text run at (86,468) width 4: " " @@ -194,4 +194,4 @@ text run at (626,468) width 4: " " LayoutNGBlockFlow {DIV} at (632,429) size 82x52 [border: (1px solid #000000)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (716,468) size 0x0 + LayoutBR {BR} at (716,468) size 0x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/repeating-conic-gradient-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/repeating-conic-gradient-expected.txt index 4652d18..fb4e7c8 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/repeating-conic-gradient-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/gradients/repeating-conic-gradient-expected.txt
@@ -11,7 +11,7 @@ text run at (488,227) width 4: " " LayoutNGBlockFlow {DIV} at (512,20) size 202x202 [border: (1px solid #808080)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (734,227) size 0x0 + LayoutBR {BR} at (734,227) size 0x19 LayoutNGBlockFlow {DIV} at (20,267) size 202x202 [border: (1px solid #808080)] LayoutText {#text} at (242,474) size 4x19 text run at (242,474) width 4: " "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/inline/inline-box-background-repeat-y-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/inline/inline-box-background-repeat-y-expected.png index 5b20447..845c9b2 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/inline/inline-box-background-repeat-y-expected.png +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/inline/inline-box-background-repeat-y-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/inline/inline-with-empty-inline-children-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/inline/inline-with-empty-inline-children-expected.txt new file mode 100644 index 0000000..68ca8a2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/inline/inline-with-empty-inline-children-expected.txt
@@ -0,0 +1,8 @@ +https://bugs.webkit.org/show_bug.cgi?id=95772: There should be six green bars below with a PASS in each. + +PASS +PASS +PASS +PASS +PASS +PASS
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/invalid/021-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/invalid/021-expected.txt index 6819fde..9404e9c 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/invalid/021-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/invalid/021-expected.txt
@@ -15,9 +15,9 @@ LayoutText {#text} at (26,0) size 61x19 text run at (26,0) width 61: " more test" LayoutBR {BR} at (87,15) size 0x0 - LayoutWordBreak {WBR} at (0,20) size 0x0 + LayoutWordBreak {WBR} at (0,20) size 0x19 text run at (0,20) width 0: "\x{200B}" LayoutInline {A} at (0,0) size 87x19 [color=#0000EE] LayoutText {#text} at (0,20) size 87x19 text run at (0,20) width 87: "Test more test" - LayoutBR {BR} at (87,20) size 0x0 + LayoutBR {BR} at (87,20) size 0x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/layer-visibility-sublayer-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/layer-visibility-sublayer-expected.txt index 6bd9ff3bd..3bf27bb 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/layer-visibility-sublayer-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/layer-visibility-sublayer-expected.txt
@@ -3,28 +3,28 @@ layer at (0,0) size 800x600 LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 - LayoutBR {BR} at (0,0) size 0x0 - LayoutBR {BR} at (0,20) size 0x0 - LayoutBR {BR} at (0,40) size 0x0 - LayoutBR {BR} at (0,60) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 + LayoutBR {BR} at (0,20) size 0x19 + LayoutBR {BR} at (0,40) size 0x19 + LayoutBR {BR} at (0,60) size 0x19 LayoutText {#text} at (0,80) size 176x19 text run at (0,80) width 176: "24 green box with word ok:" - LayoutBR {BR} at (176,80) size 0x0 - LayoutBR {BR} at (0,100) size 0x0 - LayoutBR {BR} at (0,120) size 0x0 - LayoutBR {BR} at (0,140) size 0x0 + LayoutBR {BR} at (176,80) size 0x19 + LayoutBR {BR} at (0,100) size 0x19 + LayoutBR {BR} at (0,120) size 0x19 + LayoutBR {BR} at (0,140) size 0x19 LayoutText {#text} at (0,160) size 176x19 text run at (0,160) width 176: "25 green box with word ok:" - LayoutBR {BR} at (176,160) size 0x0 - LayoutBR {BR} at (0,180) size 0x0 - LayoutBR {BR} at (0,200) size 0x0 - LayoutBR {BR} at (0,220) size 0x0 + LayoutBR {BR} at (176,160) size 0x19 + LayoutBR {BR} at (0,180) size 0x19 + LayoutBR {BR} at (0,200) size 0x19 + LayoutBR {BR} at (0,220) size 0x19 LayoutText {#text} at (0,240) size 176x19 text run at (0,240) width 176: "26 green box with word ok:" - LayoutBR {BR} at (176,240) size 0x0 - LayoutBR {BR} at (0,260) size 0x0 - LayoutBR {BR} at (0,280) size 0x0 - LayoutBR {BR} at (0,300) size 0x0 + LayoutBR {BR} at (176,240) size 0x19 + LayoutBR {BR} at (0,260) size 0x19 + LayoutBR {BR} at (0,280) size 0x19 + LayoutBR {BR} at (0,300) size 0x19 hidden layer at (0,108) size 800x34 LayoutNGBlockFlow (positioned) {DIV} at (0,108) size 800x34 [border: (2px solid #FF0000)] LayoutNGBlockFlow {DIV} at (2,2) size 796x4 [border: (2px solid #FF0000)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/overflow-hidden-rounded-corners-occlusion-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/overflow-hidden-rounded-corners-occlusion-expected.txt index 3944c8f..5f6bd081 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/overflow-hidden-rounded-corners-occlusion-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/overflow-hidden-rounded-corners-occlusion-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow (anonymous) at (0,0) size 784x40 LayoutText {#text} at (0,0) size 506x19 text run at (0,0) width 506: "Test that verifies that rounded corners with overflow:hidden composite correctly." - LayoutBR {BR} at (506,0) size 0x0 + LayoutBR {BR} at (506,0) size 0x19 LayoutText {#text} at (0,20) size 640x19 text run at (0,20) width 640: "This page should show a green box with rounded corners on top of a yellow box with square corners." LayoutNGBlockFlow {DIV} at (0,40) size 100x100 [bgcolor=#FFFF00]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/overflow-scroll-auto-switch-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/overflow-scroll-auto-switch-expected.txt index c62bf35c..c7b8288e14 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/overflow-scroll-auto-switch-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/overflow-scroll-auto-switch-expected.txt
@@ -10,31 +10,31 @@ LayoutNGBlockFlow (relative positioned) {DIV} at (0,20) size 100x100 LayoutText {#text} at (0,0) size 238x19 text run at (0,0) width 238: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - LayoutBR {BR} at (238,0) size 0x0 + LayoutBR {BR} at (238,0) size 0x19 LayoutText {#text} at (0,20) size 7x19 text run at (0,20) width 7: "a" - LayoutBR {BR} at (7,20) size 0x0 + LayoutBR {BR} at (7,20) size 0x19 LayoutText {#text} at (0,40) size 7x19 text run at (0,40) width 7: "a" - LayoutBR {BR} at (7,40) size 0x0 + LayoutBR {BR} at (7,40) size 0x19 LayoutText {#text} at (0,60) size 7x19 text run at (0,60) width 7: "a" - LayoutBR {BR} at (7,60) size 0x0 + LayoutBR {BR} at (7,60) size 0x19 LayoutText {#text} at (0,80) size 7x19 text run at (0,80) width 7: "a" - LayoutBR {BR} at (7,80) size 0x0 + LayoutBR {BR} at (7,80) size 0x19 LayoutText {#text} at (0,100) size 7x19 text run at (0,100) width 7: "a" - LayoutBR {BR} at (7,100) size 0x0 + LayoutBR {BR} at (7,100) size 0x19 LayoutText {#text} at (0,120) size 7x19 text run at (0,120) width 7: "a" - LayoutBR {BR} at (7,120) size 0x0 + LayoutBR {BR} at (7,120) size 0x19 LayoutText {#text} at (0,140) size 7x19 text run at (0,140) width 7: "a" - LayoutBR {BR} at (7,140) size 0x0 + LayoutBR {BR} at (7,140) size 0x19 LayoutText {#text} at (0,160) size 7x19 text run at (0,160) width 7: "a" - LayoutBR {BR} at (7,160) size 0x0 + LayoutBR {BR} at (7,160) size 0x19 LayoutText {#text} at (0,180) size 7x19 text run at (0,180) width 7: "a" - LayoutBR {BR} at (7,180) size 0x0 + LayoutBR {BR} at (7,180) size 0x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/parser/001-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/parser/001-expected.txt index f23ae24..44d3dfd 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/parser/001-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/parser/001-expected.txt
@@ -22,7 +22,7 @@ LayoutText {#text} at (0,0) size 64x16 text run at (0,0) width 64: "Pre text" text run at (64,0) width 0: " " - LayoutText {#text} at (300,304) size 104x16 + LayoutText {#text} at (300,304) size 300x32 text run at (300,304) width 0: " " text run at (0,320) width 104: "Also pre text" text run at (104,320) width 0: " "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/parser/entities-in-html-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/parser/entities-in-html-expected.txt new file mode 100644 index 0000000..4769eb3e --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/parser/entities-in-html-expected.txt
@@ -0,0 +1,264 @@ +HTML Entities Test +Latin-1 Characters (xhtml-lat1.ent) +Special Characters (xhtml-special.ent) +Symbols (xhtml-symbol.ent) +Latin-1 Characters (xhtml-lat1.ent) +𝌌 +decimal hexadecimal entity name &#nnn; &#xhhh; &entity; +160 A0 nbsp +161 A1 iexcl ¡ ¡ ¡ +162 A2 cent ¢ ¢ ¢ +163 A3 pound £ £ £ +164 A4 curren ¤ ¤ ¤ +165 A5 yen ¥ ¥ ¥ +166 A6 brvbar ¦ ¦ ¦ +167 A7 sect § § § +168 A8 uml ¨ ¨ ¨ +169 A9 copy © © © +170 AA ordf ª ª ª +171 AB laquo « « « +172 AC not ¬ ¬ ¬ +173 AD shy +174 AE reg ® ® ® +175 AF macr ¯ ¯ ¯ +176 B0 deg ° ° ° +177 B1 plusmn ± ± ± +178 B2 sup2 ² ² ² +179 B3 sup3 ³ ³ ³ +180 B4 acute ´ ´ ´ +181 B5 micro µ µ µ +182 B6 para ¶ ¶ ¶ +183 B7 middot · · · +184 B8 cedil ¸ ¸ ¸ +185 B9 sup1 ¹ ¹ ¹ +186 BA ordm º º º +187 BB raquo » » » +188 BC frac14 ¼ ¼ ¼ +189 BD frac12 ½ ½ ½ +190 BE frac34 ¾ ¾ ¾ +191 BF iquest ¿ ¿ ¿ +192 C0 Agrave À À À +193 C1 Aacute Á Á Á +194 C2 Acirc    +195 C3 Atilde à à à +196 C4 Auml Ä Ä Ä +197 C5 Aring Å Å Å +198 C6 AElig Æ Æ Æ +199 C7 Ccedil Ç Ç Ç +200 C8 Egrave È È È +201 C9 Eacute É É É +202 CA Ecirc Ê Ê Ê +203 CB Euml Ë Ë Ë +204 CC Igrave Ì Ì Ì +205 CD Iacute Í Í Í +206 CE Icirc Î Î Î +207 CF Iuml Ï Ï Ï +208 D0 ETH Ð Ð Ð +209 D1 Ntilde Ñ Ñ Ñ +210 D2 Ograve Ò Ò Ò +211 D3 Oacute Ó Ó Ó +212 D4 Ocirc Ô Ô Ô +213 D5 Otilde Õ Õ Õ +214 D6 Ouml Ö Ö Ö +215 D7 times × × × +216 D8 Oslash Ø Ø Ø +217 D9 Ugrave Ù Ù Ù +218 DA Uacute Ú Ú Ú +219 DB Ucirc Û Û Û +220 DC Uuml Ü Ü Ü +221 DD Yacute Ý Ý Ý +222 DE THORN Þ Þ Þ +223 DF szlig ß ß ß +224 E0 agrave à à à +225 E1 aacute á á á +226 E2 acirc â â â +227 E3 atilde ã ã ã +228 E4 auml ä ä ä +229 E5 aring å å å +230 E6 aelig æ æ æ +231 E7 ccedil ç ç ç +232 E8 egrave è è è +233 E9 eacute é é é +234 EA ecirc ê ê ê +235 EB euml ë ë ë +236 EC igrave ì ì ì +237 ED iacute í í í +238 EE icirc î î î +239 EF iuml ï ï ï +240 F0 eth ð ð ð +241 F1 ntilde ñ ñ ñ +242 F2 ograve ò ò ò +243 F3 oacute ó ó ó +244 F4 ocirc ô ô ô +245 F5 otilde õ õ õ +246 F6 ouml ö ö ö +247 F7 divide ÷ ÷ ÷ +248 F8 oslash ø ø ø +249 F9 ugrave ù ù ù +250 FA uacute ú ú ú +251 FB ucirc û û û +252 FC uuml ü ü ü +253 FD yacute ý ý ý +254 FE thorn þ þ þ +255 FF yuml ÿ ÿ ÿ +Special Characters (xhtml-special.ent) +decimal hexadecimal entity name &#nnn; &#xhhh; &entity; +34 22 quot " " " +38 26 amp & & & +60 3C lt < < < +62 3E gt > > > +39 27 apos ' ' ' +338 152 OElig Œ Œ Œ +339 153 oelig œ œ œ +352 160 Scaron Š Š Š +353 161 scaron š š š +376 178 Yuml Ÿ Ÿ Ÿ +710 2C6 circ ˆ ˆ ˆ +732 2DC tilde ˜ ˜ ˜ +8194 2002 ensp +8195 2003 emsp +8201 2009 thinsp +8204 200C zwnj +8205 200D zwj +8206 200E lrm +8207 200F rlm +8211 2013 ndash – – – +8212 2014 mdash — — — +8216 2018 lsquo ‘ ‘ ‘ +8217 2019 rsquo ’ ’ ’ +8218 201A sbquo ‚ ‚ ‚ +8220 201C ldquo “ “ “ +8221 201D rdquo ” ” ” +8222 201E bdquo „ „ „ +8224 2020 dagger † † † +8225 2021 Dagger ‡ ‡ ‡ +8240 2030 permil ‰ ‰ ‰ +8249 2039 lsaquo ‹ ‹ ‹ +8250 203A rsaquo › › › +8364 20AC euro € € € +Symbols (xhtml-symbol.ent) +decimal hexadecimal entity name &#nnn; &#xhhh; &entity; +402 192 fnof ƒ ƒ ƒ +913 391 Alpha Α Α Α +914 392 Beta Β Β Β +915 393 Gamma Γ Γ Γ +916 394 Delta Δ Δ Δ +917 395 Epsilon Ε Ε Ε +918 396 Zeta Ζ Ζ Ζ +919 397 Eta Η Η Η +920 398 Theta Θ Θ Θ +921 399 Iota Ι Ι Ι +922 39A Kappa Κ Κ Κ +923 39B Lambda Λ Λ Λ +924 39C Mu Μ Μ Μ +925 39D Nu Ν Ν Ν +926 39E Xi Ξ Ξ Ξ +927 39F Omicron Ο Ο Ο +928 3A0 Pi Π Π Π +929 3A1 Rho Ρ Ρ Ρ +931 3A3 Sigma Σ Σ Σ +932 3A4 Tau Τ Τ Τ +933 3A5 Upsilon Υ Υ Υ +934 3A6 Phi Φ Φ Φ +935 3A7 Chi Χ Χ Χ +936 3A8 Psi Ψ Ψ Ψ +937 3A9 Omega Ω Ω Ω +945 3B1 alpha α α α +946 3B2 beta β β β +947 3B3 gamma γ γ γ +948 3B4 delta δ δ δ +949 3B5 epsilon ε ε ε +950 3B6 zeta ζ ζ ζ +951 3B7 eta η η η +952 3B8 theta θ θ θ +953 3B9 iota ι ι ι +954 3BA kappa κ κ κ +955 3BB lambda λ λ λ +956 3BC mu μ μ μ +957 3BD nu ν ν ν +958 3BE xi ξ ξ ξ +959 3BF omicron ο ο ο +960 3C0 pi π π π +961 3C1 rho ρ ρ ρ +962 3C2 sigmaf ς ς ς +963 3C3 sigma σ σ σ +964 3C4 tau τ τ τ +965 3C5 upsilon υ υ υ +966 3C6 phi φ φ φ +967 3C7 chi χ χ χ +968 3C8 psi ψ ψ ψ +969 3C9 omega ω ω ω +977 3D1 thetasym ϑ ϑ ϑ +978 3D2 upsih ϒ ϒ ϒ +982 3D6 piv ϖ ϖ ϖ +8226 2022 bull • • • +8230 2026 hellip … … … +8242 2032 prime ′ ′ ′ +8243 2033 Prime ″ ″ ″ +8254 203E oline ‾ ‾ ‾ +8260 2044 frasl ⁄ ⁄ ⁄ +8472 2118 weierp ℘ ℘ ℘ +8465 2111 image ℑ ℑ ℑ +8476 211C real ℜ ℜ ℜ +8482 2122 trade ™ ™ ™ +8501 2135 alefsym ℵ ℵ ℵ +8592 2190 larr ← ← ← +8593 2191 uarr ↑ ↑ ↑ +8594 2192 rarr → → → +8595 2193 darr ↓ ↓ ↓ +8596 2194 harr ↔ ↔ ↔ +8629 21B5 crarr ↵ ↵ ↵ +8656 21D0 lArr ⇐ ⇐ ⇐ +8657 21D1 uArr ⇑ ⇑ ⇑ +8658 21D2 rArr ⇒ ⇒ ⇒ +8659 21D3 dArr ⇓ ⇓ ⇓ +8660 21D4 hArr ⇔ ⇔ ⇔ +8704 2200 forall ∀ ∀ ∀ +8706 2202 part ∂ ∂ ∂ +8707 2203 exist ∃ ∃ ∃ +8709 2205 empty ∅ ∅ ∅ +8711 2207 nabla ∇ ∇ ∇ +8712 2208 isin ∈ ∈ ∈ +8713 2209 notin ∉ ∉ ∉ +8715 220B ni ∋ ∋ ∋ +8719 220F prod ∏ ∏ ∏ +8721 2211 sum ∑ ∑ ∑ +8722 2212 minus − − − +8727 2217 lowast ∗ ∗ ∗ +8730 221A radic √ √ √ +8733 221D prop ∝ ∝ ∝ +8734 221E infin ∞ ∞ ∞ +8736 2220 ang ∠ ∠ ∠ +8743 2227 and ∧ ∧ ∧ +8744 2228 or ∨ ∨ ∨ +8745 2229 cap ∩ ∩ ∩ +8746 222A cup ∪ ∪ ∪ +8747 222B int ∫ ∫ ∫ +8756 2234 there4 ∴ ∴ ∴ +8764 223C sim ∼ ∼ ∼ +8773 2245 cong ≅ ≅ ≅ +8776 2248 asymp ≈ ≈ ≈ +8800 2260 ne ≠ ≠ ≠ +8801 2261 equiv ≡ ≡ ≡ +8804 2264 le ≤ ≤ ≤ +8805 2265 ge ≥ ≥ ≥ +8834 2282 sub ⊂ ⊂ ⊂ +8835 2283 sup ⊃ ⊃ ⊃ +8836 2284 nsub ⊄ ⊄ ⊄ +8838 2286 sube ⊆ ⊆ ⊆ +8839 2287 supe ⊇ ⊇ ⊇ +8853 2295 oplus ⊕ ⊕ ⊕ +8855 2297 otimes ⊗ ⊗ ⊗ +8869 22A5 perp ⊥ ⊥ ⊥ +8901 22C5 sdot ⋅ ⋅ ⋅ +8968 2308 lceil ⌈ ⌈ ⌈ +8969 2309 rceil ⌉ ⌉ ⌉ +8970 230A lfloor ⌊ ⌊ ⌊ +8971 230B rfloor ⌋ ⌋ ⌋ +12296 3008 lang 〈 〈 ⟨ +12297 3009 rang 〉 〉 ⟩ +9674 25CA loz ◊ ◊ ◊ +9824 2660 spades ♠ ♠ ♠ +9827 2663 clubs ♣ ♣ ♣ +9829 2665 hearts ♥ ♥ ♥ +9830 2666 diams ♦ ♦ ♦
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/parser/entities-in-xhtml-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/parser/entities-in-xhtml-expected.txt new file mode 100644 index 0000000..5ba0241 --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/parser/entities-in-xhtml-expected.txt
@@ -0,0 +1,269 @@ +XHTML Entities Test +Latin-1 Characters (xhtml-lat1.ent) +Special Characters (xhtml-special.ent) +Symbols (xhtml-symbol.ent) +Latin-1 Characters (xhtml-lat1.ent) +𝌌 +decimal hexadecimal entity name &#nnn; &#xhhh; &entity; +160 A0 nbsp +161 A1 iexcl ¡ ¡ ¡ +162 A2 cent ¢ ¢ ¢ +163 A3 pound £ £ £ +164 A4 curren ¤ ¤ ¤ +165 A5 yen ¥ ¥ ¥ +166 A6 brvbar ¦ ¦ ¦ +167 A7 sect § § § +168 A8 uml ¨ ¨ ¨ +169 A9 copy © © © +170 AA ordf ª ª ª +171 AB laquo « « « +172 AC not ¬ ¬ ¬ +173 AD shy +174 AE reg ® ® ® +175 AF macr ¯ ¯ ¯ +176 B0 deg ° ° ° +177 B1 plusmn ± ± ± +178 B2 sup2 ² ² ² +179 B3 sup3 ³ ³ ³ +180 B4 acute ´ ´ ´ +181 B5 micro µ µ µ +182 B6 para ¶ ¶ ¶ +183 B7 middot · · · +184 B8 cedil ¸ ¸ ¸ +185 B9 sup1 ¹ ¹ ¹ +186 BA ordm º º º +187 BB raquo » » » +188 BC frac14 ¼ ¼ ¼ +189 BD frac12 ½ ½ ½ +190 BE frac34 ¾ ¾ ¾ +191 BF iquest ¿ ¿ ¿ +192 C0 Agrave À À À +193 C1 Aacute Á Á Á +194 C2 Acirc    +195 C3 Atilde à à à +196 C4 Auml Ä Ä Ä +197 C5 Aring Å Å Å +198 C6 AElig Æ Æ Æ +199 C7 Ccedil Ç Ç Ç +200 C8 Egrave È È È +201 C9 Eacute É É É +202 CA Ecirc Ê Ê Ê +203 CB Euml Ë Ë Ë +204 CC Igrave Ì Ì Ì +205 CD Iacute Í Í Í +206 CE Icirc Î Î Î +207 CF Iuml Ï Ï Ï +208 D0 ETH Ð Ð Ð +209 D1 Ntilde Ñ Ñ Ñ +210 D2 Ograve Ò Ò Ò +211 D3 Oacute Ó Ó Ó +212 D4 Ocirc Ô Ô Ô +213 D5 Otilde Õ Õ Õ +214 D6 Ouml Ö Ö Ö +215 D7 times × × × +216 D8 Oslash Ø Ø Ø +217 D9 Ugrave Ù Ù Ù +218 DA Uacute Ú Ú Ú +219 DB Ucirc Û Û Û +220 DC Uuml Ü Ü Ü +221 DD Yacute Ý Ý Ý +222 DE THORN Þ Þ Þ +223 DF szlig ß ß ß +224 E0 agrave à à à +225 E1 aacute á á á +226 E2 acirc â â â +227 E3 atilde ã ã ã +228 E4 auml ä ä ä +229 E5 aring å å å +230 E6 aelig æ æ æ +231 E7 ccedil ç ç ç +232 E8 egrave è è è +233 E9 eacute é é é +234 EA ecirc ê ê ê +235 EB euml ë ë ë +236 EC igrave ì ì ì +237 ED iacute í í í +238 EE icirc î î î +239 EF iuml ï ï ï +240 F0 eth ð ð ð +241 F1 ntilde ñ ñ ñ +242 F2 ograve ò ò ò +243 F3 oacute ó ó ó +244 F4 ocirc ô ô ô +245 F5 otilde õ õ õ +246 F6 ouml ö ö ö +247 F7 divide ÷ ÷ ÷ +248 F8 oslash ø ø ø +249 F9 ugrave ù ù ù +250 FA uacute ú ú ú +251 FB ucirc û û û +252 FC uuml ü ü ü +253 FD yacute ý ý ý +254 FE thorn þ þ þ +255 FF yuml ÿ ÿ ÿ +Special Characters (xhtml-special.ent) +decimal hexadecimal entity name &#nnn; &#xhhh; &entity; +34 22 quot " " " +38 26 amp & & & +60 3C lt < < < +62 3E gt > > > +39 27 apos ' ' ' +338 152 OElig Œ Œ Œ +339 153 oelig œ œ œ +352 160 Scaron Š Š Š +353 161 scaron š š š +376 178 Yuml Ÿ Ÿ Ÿ +710 2C6 circ ˆ ˆ ˆ +732 2DC tilde ˜ ˜ ˜ +8194 2002 ensp +8195 2003 emsp +8201 2009 thinsp +8204 200C zwnj +8205 200D zwj +8206 200E lrm +8207 200F rlm +8211 2013 ndash – – – +8212 2014 mdash — — — +8216 2018 lsquo ‘ ‘ ‘ +8217 2019 rsquo ’ ’ ’ +8218 201A sbquo ‚ ‚ ‚ +8220 201C ldquo “ “ “ +8221 201D rdquo ” ” ” +8222 201E bdquo „ „ „ +8224 2020 dagger † † † +8225 2021 Dagger ‡ ‡ ‡ +8240 2030 permil ‰ ‰ ‰ +8249 2039 lsaquo ‹ ‹ ‹ +8250 203A rsaquo › › › +8364 20AC euro € € € +Symbols (xhtml-symbol.ent) +decimal hexadecimal entity name &#nnn; &#xhhh; &entity; +402 192 fnof ƒ ƒ ƒ +913 391 Alpha Α Α Α +914 392 Beta Β Β Β +915 393 Gamma Γ Γ Γ +916 394 Delta Δ Δ Δ +917 395 Epsilon Ε Ε Ε +918 396 Zeta Ζ Ζ Ζ +919 397 Eta Η Η Η +920 398 Theta Θ Θ Θ +921 399 Iota Ι Ι Ι +922 39A Kappa Κ Κ Κ +923 39B Lambda Λ Λ Λ +924 39C Mu Μ Μ Μ +925 39D Nu Ν Ν Ν +926 39E Xi Ξ Ξ Ξ +927 39F Omicron Ο Ο Ο +928 3A0 Pi Π Π Π +929 3A1 Rho Ρ Ρ Ρ +931 3A3 Sigma Σ Σ Σ +932 3A4 Tau Τ Τ Τ +933 3A5 Upsilon Υ Υ Υ +934 3A6 Phi Φ Φ Φ +935 3A7 Chi Χ Χ Χ +936 3A8 Psi Ψ Ψ Ψ +937 3A9 Omega Ω Ω Ω +945 3B1 alpha α α α +946 3B2 beta β β β +947 3B3 gamma γ γ γ +948 3B4 delta δ δ δ +949 3B5 epsilon ε ε ε +950 3B6 zeta ζ ζ ζ +951 3B7 eta η η η +952 3B8 theta θ θ θ +953 3B9 iota ι ι ι +954 3BA kappa κ κ κ +955 3BB lambda λ λ λ +956 3BC mu μ μ μ +957 3BD nu ν ν ν +958 3BE xi ξ ξ ξ +959 3BF omicron ο ο ο +960 3C0 pi π π π +961 3C1 rho ρ ρ ρ +962 3C2 sigmaf ς ς ς +963 3C3 sigma σ σ σ +964 3C4 tau τ τ τ +965 3C5 upsilon υ υ υ +966 3C6 phi φ φ φ +967 3C7 chi χ χ χ +968 3C8 psi ψ ψ ψ +969 3C9 omega ω ω ω +977 3D1 thetasym ϑ ϑ ϑ +978 3D2 upsih ϒ ϒ ϒ +982 3D6 piv ϖ ϖ ϖ +8226 2022 bull • • • +8230 2026 hellip … … … +8242 2032 prime ′ ′ ′ +8243 2033 Prime ″ ″ ″ +8254 203E oline ‾ ‾ ‾ +8260 2044 frasl ⁄ ⁄ ⁄ +8472 2118 weierp ℘ ℘ ℘ +8465 2111 image ℑ ℑ ℑ +8476 211C real ℜ ℜ ℜ +8482 2122 trade ™ ™ ™ +8501 2135 alefsym ℵ ℵ ℵ +8592 2190 larr ← ← ← +8593 2191 uarr ↑ ↑ ↑ +8594 2192 rarr → → → +8595 2193 darr ↓ ↓ ↓ +8596 2194 harr ↔ ↔ ↔ +8629 21B5 crarr ↵ ↵ ↵ +8656 21D0 lArr ⇐ ⇐ ⇐ +8657 21D1 uArr ⇑ ⇑ ⇑ +8658 21D2 rArr ⇒ ⇒ ⇒ +8659 21D3 dArr ⇓ ⇓ ⇓ +8660 21D4 hArr ⇔ ⇔ ⇔ +8704 2200 forall ∀ ∀ ∀ +8706 2202 part ∂ ∂ ∂ +8707 2203 exist ∃ ∃ ∃ +8709 2205 empty ∅ ∅ ∅ +8711 2207 nabla ∇ ∇ ∇ +8712 2208 isin ∈ ∈ ∈ +8713 2209 notin ∉ ∉ ∉ +8715 220B ni ∋ ∋ ∋ +8719 220F prod ∏ ∏ ∏ +8721 2211 sum ∑ ∑ ∑ +8722 2212 minus − − − +8727 2217 lowast ∗ ∗ ∗ +8730 221A radic √ √ √ +8733 221D prop ∝ ∝ ∝ +8734 221E infin ∞ ∞ ∞ +8736 2220 ang ∠ ∠ ∠ +8743 2227 and ∧ ∧ ∧ +8744 2228 or ∨ ∨ ∨ +8745 2229 cap ∩ ∩ ∩ +8746 222A cup ∪ ∪ ∪ +8747 222B int ∫ ∫ ∫ +8756 2234 there4 ∴ ∴ ∴ +8764 223C sim ∼ ∼ ∼ +8773 2245 cong ≅ ≅ ≅ +8776 2248 asymp ≈ ≈ ≈ +8800 2260 ne ≠ ≠ ≠ +8801 2261 equiv ≡ ≡ ≡ +8804 2264 le ≤ ≤ ≤ +8805 2265 ge ≥ ≥ ≥ +8834 2282 sub ⊂ ⊂ ⊂ +8835 2283 sup ⊃ ⊃ ⊃ +8836 2284 nsub ⊄ ⊄ ⊄ +8838 2286 sube ⊆ ⊆ ⊆ +8839 2287 supe ⊇ ⊇ ⊇ +8853 2295 oplus ⊕ ⊕ ⊕ +8855 2297 otimes ⊗ ⊗ ⊗ +8869 22A5 perp ⊥ ⊥ ⊥ +8901 22C5 sdot ⋅ ⋅ ⋅ +8968 2308 lceil ⌈ ⌈ ⌈ +8969 2309 rceil ⌉ ⌉ ⌉ +8970 230A lfloor ⌊ ⌊ ⌊ +8971 230B rfloor ⌋ ⌋ ⌋ +12296 3008 lang 〈 〈 ⟨ +12297 3009 rang 〉 〉 ⟩ +9674 25CA loz ◊ ◊ ◊ +9824 2660 spades ♠ ♠ ♠ +9827 2663 clubs ♣ ♣ ♣ +9829 2665 hearts ♥ ♥ ♥ +9830 2666 diams ♦ ♦ ♦ +Multi-byte entities from HTML5 +decimal hexadecimal entity name &#nnn; &#xhhh; &entity; +8882 22B2 vltri ⊲ ⊲ ⊲ +8834 + 8402 2282 + 20D2 sub ⊂⃒ ⊂⃒ ⊂⃒ +8804 + 8402 2264 + 20D2 sub ≤⃒ ≤⃒ ≤⃒
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/ruby/ruby-inline-table-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/ruby/ruby-inline-table-expected.txt index d01334c..4473b9d 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/ruby/ruby-inline-table-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/ruby/ruby-inline-table-expected.txt
@@ -7,26 +7,26 @@ LayoutText {#text} at (0,0) size 781x39 text run at (0,0) width 781: "Test that <ruby> rendered as inline-table (or somesuch) is not affected by ruby rendering. Both <div> below should look the" text run at (0,20) width 36: "same." - LayoutBR {BR} at (36,20) size 0x0 - LayoutBR {BR} at (0,40) size 0x0 + LayoutBR {BR} at (36,20) size 0x19 + LayoutBR {BR} at (0,40) size 0x19 LayoutNGBlockFlow {DIV} at (3.19,63.19) size 777.63x50 [bgcolor=#FFFFDD] [border: (1px solid #000000)] LayoutText {#text} at (9,21) size 224x19 text run at (9,21) width 224: "This is some XHTML1.1 text with " LayoutTable {SPAN} at (233,9) size 40x32 LayoutTableSection {SPAN} at (0,12) size 40x20 LayoutTableRow (anonymous) at (0,0) size 40x20 - LayoutTableCell (anonymous) at (0,0) size 40x20 [r=0 c=0 rs=1 cs=1] + LayoutNGTableCell (anonymous) at (0,0) size 40x20 [r=0 c=0 rs=1 cs=1] LayoutText {#text} at (2,0) size 36x19 text run at (2,0) width 36: "Ruby" LayoutTableSection {SPAN} at (0,0) size 40x12 LayoutTableRow (anonymous) at (0,0) size 40x12 - LayoutTableCell (anonymous) at (0,0) size 40x12 [r=0 c=0 rs=1 cs=1] + LayoutNGTableCell (anonymous) at (0,0) size 40x12 [r=0 c=0 rs=1 cs=1] LayoutText {#text} at (0,0) size 40x12 text run at (0,0) width 40: "guide text" LayoutText {#text} at (273,21) size 56x19 text run at (273,21) width 56: " markup." LayoutNGBlockFlow (anonymous) at (0,116.38) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow {DIV} at (3.19,139.56) size 777.63x50 [bgcolor=#FFFFDD] [border: (1px solid #000000)] LayoutText {#text} at (9,21) size 224x19 text run at (9,21) width 224: "This is some XHTML1.1 text with "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/selectors/018b-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/selectors/018b-expected.txt index 4de59f9..705d0f11 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/selectors/018b-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/selectors/018b-expected.txt
@@ -7,7 +7,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 749x19 text run at (0,0) width 749: "The background color of this paragraph should turn to green when the mouse pointer hovers over any of the following:" - LayoutBR {BR} at (749,0) size 0x0 + LayoutBR {BR} at (749,0) size 0x19 LayoutInline {STRONG} at (0,0) size 63x19 LayoutText {#text} at (0,20) size 63x19 text run at (0,20) width 63: "This text."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/sub-pixel/inline-block-with-padding-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/sub-pixel/inline-block-with-padding-expected.txt new file mode 100644 index 0000000..24d0fc6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/sub-pixel/inline-block-with-padding-expected.txt
@@ -0,0 +1,8 @@ +PASS links[0].offsetWidth is within 5 of 176 +PASS successfullyParsed is true + +TEST COMPLETE +Both links should render the same and not wrap. + +This shouldn't wrap +This shouldn't wrap
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/sub-pixel/repaint-subpixel-layer-in-subpixel-composited-layer-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/sub-pixel/repaint-subpixel-layer-in-subpixel-composited-layer-expected.txt new file mode 100644 index 0000000..cb8e9d8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/sub-pixel/repaint-subpixel-layer-in-subpixel-composited-layer-expected.txt
@@ -0,0 +1,301 @@ +10.5px,12.5px,10.5px: +{ + "layers": [ + { + "name": "LayoutView #document", + "bounds": [800, 600], + "drawsContent": false, + "backgroundColor": "#FFFFFF" + }, + { + "name": "Scrolling Layer", + "bounds": [800, 600], + "drawsContent": false + }, + { + "name": "Scrolling Contents Layer", + "bounds": [800, 600], + "contentsOpaque": true, + "backgroundColor": "#FFFFFF" + }, + { + "name": "LayoutNGBlockFlow (relative positioned) DIV id='container'", + "bounds": [100, 50], + "paintInvalidations": [ + { + "object": "LayoutNGBlockFlow (positioned) DIV id='test'", + "rect": [11, 0, 14, 12], + "reason": "subtree" + }, + { + "object": "LayoutNGBlockFlow (positioned) DIV id='test'", + "rect": [9, 0, 14, 12], + "reason": "subtree" + } + ], + "transform": 1 + } + ], + "transforms": [ + { + "id": 1, + "transform": [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, 1, 0], + [11, 0, 0, 1] + ] + } + ], + "objectPaintInvalidations": [ + { + "object": "NGPhysicalBoxFragment LayoutNGBlockFlow (relative positioned) DIV id='container'", + "reason": "subtree" + }, + { + "object": "LayoutNGBlockFlow (positioned) DIV id='test'", + "reason": "subtree" + } + ] +} +10.6px,12.4px,10.4px: +{ + "layers": [ + { + "name": "LayoutView #document", + "bounds": [800, 600], + "drawsContent": false, + "backgroundColor": "#FFFFFF" + }, + { + "name": "Scrolling Layer", + "bounds": [800, 600], + "drawsContent": false + }, + { + "name": "Scrolling Contents Layer", + "bounds": [800, 600], + "contentsOpaque": true, + "backgroundColor": "#FFFFFF" + }, + { + "name": "LayoutNGBlockFlow (relative positioned) DIV id='container'", + "bounds": [100, 50], + "paintInvalidations": [ + { + "object": "LayoutNGBlockFlow (positioned) DIV id='test'", + "rect": [11, 0, 14, 12], + "reason": "subtree" + }, + { + "object": "LayoutNGBlockFlow (positioned) DIV id='test'", + "rect": [9, 0, 14, 12], + "reason": "subtree" + } + ], + "transform": 1 + } + ], + "transforms": [ + { + "id": 1, + "transform": [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, 1, 0], + [11, 0, 0, 1] + ] + } + ], + "objectPaintInvalidations": [ + { + "object": "NGPhysicalBoxFragment LayoutNGBlockFlow (relative positioned) DIV id='container'", + "reason": "subtree" + }, + { + "object": "LayoutNGBlockFlow (positioned) DIV id='test'", + "reason": "subtree" + } + ] +} +10.4px,12.6px,10.6px: +{ + "layers": [ + { + "name": "LayoutView #document", + "bounds": [800, 600], + "drawsContent": false, + "backgroundColor": "#FFFFFF" + }, + { + "name": "Scrolling Layer", + "bounds": [800, 600], + "drawsContent": false + }, + { + "name": "Scrolling Contents Layer", + "bounds": [800, 600], + "contentsOpaque": true, + "backgroundColor": "#FFFFFF" + }, + { + "name": "LayoutNGBlockFlow (relative positioned) DIV id='container'", + "bounds": [100, 50], + "paintInvalidations": [ + { + "object": "LayoutNGBlockFlow (positioned) DIV id='test'", + "rect": [12, 0, 14, 12], + "reason": "subtree" + }, + { + "object": "LayoutNGBlockFlow (positioned) DIV id='test'", + "rect": [10, 0, 14, 12], + "reason": "subtree" + } + ], + "transform": 1 + } + ], + "transforms": [ + { + "id": 1, + "transform": [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, 1, 0], + [10, 0, 0, 1] + ] + } + ], + "objectPaintInvalidations": [ + { + "object": "NGPhysicalBoxFragment LayoutNGBlockFlow (relative positioned) DIV id='container'", + "reason": "subtree" + }, + { + "object": "LayoutNGBlockFlow (positioned) DIV id='test'", + "reason": "subtree" + } + ] +} +10.6px,12.6px,10.6px: +{ + "layers": [ + { + "name": "LayoutView #document", + "bounds": [800, 600], + "drawsContent": false, + "backgroundColor": "#FFFFFF" + }, + { + "name": "Scrolling Layer", + "bounds": [800, 600], + "drawsContent": false + }, + { + "name": "Scrolling Contents Layer", + "bounds": [800, 600], + "contentsOpaque": true, + "backgroundColor": "#FFFFFF" + }, + { + "name": "LayoutNGBlockFlow (relative positioned) DIV id='container'", + "bounds": [100, 50], + "paintInvalidations": [ + { + "object": "LayoutNGBlockFlow (positioned) DIV id='test'", + "rect": [11, 0, 14, 12], + "reason": "subtree" + }, + { + "object": "LayoutNGBlockFlow (positioned) DIV id='test'", + "rect": [9, 0, 14, 12], + "reason": "subtree" + } + ], + "transform": 1 + } + ], + "transforms": [ + { + "id": 1, + "transform": [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, 1, 0], + [11, 0, 0, 1] + ] + } + ], + "objectPaintInvalidations": [ + { + "object": "NGPhysicalBoxFragment LayoutNGBlockFlow (relative positioned) DIV id='container'", + "reason": "subtree" + }, + { + "object": "LayoutNGBlockFlow (positioned) DIV id='test'", + "reason": "subtree" + } + ] +} +10.4px,12.4px,10.4px: +{ + "layers": [ + { + "name": "LayoutView #document", + "bounds": [800, 600], + "drawsContent": false, + "backgroundColor": "#FFFFFF" + }, + { + "name": "Scrolling Layer", + "bounds": [800, 600], + "drawsContent": false + }, + { + "name": "Scrolling Contents Layer", + "bounds": [800, 600], + "contentsOpaque": true, + "backgroundColor": "#FFFFFF" + }, + { + "name": "LayoutNGBlockFlow (relative positioned) DIV id='container'", + "bounds": [100, 50], + "paintInvalidations": [ + { + "object": "LayoutNGBlockFlow (positioned) DIV id='test'", + "rect": [12, 0, 14, 12], + "reason": "subtree" + }, + { + "object": "LayoutNGBlockFlow (positioned) DIV id='test'", + "rect": [10, 0, 14, 12], + "reason": "subtree" + } + ], + "transform": 1 + } + ], + "transforms": [ + { + "id": 1, + "transform": [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, 1, 0], + [10, 0, 0, 1] + ] + } + ], + "objectPaintInvalidations": [ + { + "object": "NGPhysicalBoxFragment LayoutNGBlockFlow (relative positioned) DIV id='container'", + "reason": "subtree" + }, + { + "object": "LayoutNGBlockFlow (positioned) DIV id='test'", + "reason": "subtree" + } + ] +} +
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/xsl/xslt-enc-cyr-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/xsl/xslt-enc-cyr-expected.txt index 62ba0a79..cd3bd6f5 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/xsl/xslt-enc-cyr-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/xsl/xslt-enc-cyr-expected.txt
@@ -6,8 +6,8 @@ LayoutText {#text} at (0,0) size 316x19 text run at (0,0) width 181: "CHARACTERS IN XSLT: " text run at (181,0) width 135: "\x{414}\x{43E}\x{431}\x{430}\x{432}\x{43B}\x{435}\x{43D}\x{43D}\x{44B}\x{439} \x{442}\x{435}\x{43A}\x{441}\x{442}" - LayoutBR {BR} at (316,0) size 0x0 - LayoutBR {BR} at (0,20) size 0x0 + LayoutBR {BR} at (316,0) size 0x19 + LayoutBR {BR} at (0,20) size 0x19 LayoutText {#text} at (0,40) size 224x19 text run at (0,40) width 113: "SOURCE XML: " text run at (113,40) width 111: "\x{418}\x{441}\x{445}\x{43E}\x{434}\x{43D}\x{44B}\x{439} \x{442}\x{435}\x{43A}\x{441}\x{442}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/xsl/xslt-enc-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/xsl/xslt-enc-expected.txt index cf1b326e..86cb73e 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/xsl/xslt-enc-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/xsl/xslt-enc-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 258x19 text run at (0,0) width 258: "CHARACTERS IN XSLT: \x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}" - LayoutBR {BR} at (258,0) size 0x0 - LayoutBR {BR} at (0,20) size 0x0 + LayoutBR {BR} at (258,0) size 0x19 + LayoutBR {BR} at (0,20) size 0x19 LayoutText {#text} at (0,40) size 316x19 text run at (0,40) width 316: "SOURCE XML: \x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/xsl/xslt-enc16-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/xsl/xslt-enc16-expected.txt index cf1b326e..86cb73e 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/xsl/xslt-enc16-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/xsl/xslt-enc16-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 258x19 text run at (0,0) width 258: "CHARACTERS IN XSLT: \x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}" - LayoutBR {BR} at (258,0) size 0x0 - LayoutBR {BR} at (0,20) size 0x0 + LayoutBR {BR} at (258,0) size 0x19 + LayoutBR {BR} at (0,20) size 0x19 LayoutText {#text} at (0,40) size 316x19 text run at (0,40) width 316: "SOURCE XML: \x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/xsl/xslt-enc16to16-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/xsl/xslt-enc16to16-expected.txt index cf1b326e..86cb73e 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/xsl/xslt-enc16to16-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/xsl/xslt-enc16to16-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 258x19 text run at (0,0) width 258: "CHARACTERS IN XSLT: \x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}" - LayoutBR {BR} at (258,0) size 0x0 - LayoutBR {BR} at (0,20) size 0x0 + LayoutBR {BR} at (258,0) size 0x19 + LayoutBR {BR} at (0,20) size 0x19 LayoutText {#text} at (0,40) size 316x19 text run at (0,40) width 316: "SOURCE XML: \x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}\x{E9}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fullscreen/full-screen-with-flex-item-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fullscreen/full-screen-with-flex-item-expected.txt new file mode 100644 index 0000000..942dc5a --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fullscreen/full-screen-with-flex-item-expected.txt
@@ -0,0 +1,6 @@ +Enter Fullscreen +EVENT(webkitfullscreenchange) +EVENT(webkitfullscreenchange) +EXPECTED (600 == '600') OK +END OF TEST +
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/html/tabular_data/table_createcaption-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/html/tabular_data/table_createcaption-expected.txt index 98584ce2..30f4d52 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/html/tabular_data/table_createcaption-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/html/tabular_data/table_createcaption-expected.txt
@@ -6,11 +6,11 @@ LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 267x19 text run at (0,0) width 267: "Tests: the TABLE.createCaption() method" - LayoutBR {BR} at (267,0) size 0x0 + LayoutBR {BR} at (267,0) size 0x19 LayoutNGBlockFlow {P} at (0,36) size 784x60 LayoutText {#text} at (0,0) size 73x19 text run at (0,0) width 73: "Conditions:" - LayoutBR {BR} at (73,0) size 0x0 + LayoutBR {BR} at (73,0) size 0x19 LayoutText {#text} at (0,20) size 783x39 text run at (0,20) width 783: "If no caption exists, the method should create an empty caption, add it to the table, and return a pointer to it. If a caption does" text run at (0,40) width 285: "exist, the method should return a pointer to it." @@ -29,7 +29,7 @@ text run at (734,0) width 44: ". Upon" text run at (0,20) width 584: "failure, the first table will have no caption, and the second table will have the caption Things." LayoutTable {TABLE} at (0,178) size 109x102 [border: (1px outset #808080)] - LayoutBlockFlow {CAPTION} at (0,0) size 109x20 + LayoutNGTableCaption {CAPTION} at (0,0) size 109x20 LayoutInline {B} at (0,0) size 43x19 LayoutText {#text} at (33,0) size 43x19 text run at (33,0) width 43: "Fruity" @@ -56,9 +56,9 @@ LayoutText {#text} at (2,2) size 41x19 text run at (2,2) width 41: "Purple" LayoutNGBlockFlow (anonymous) at (0,280) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutTable {TABLE} at (0,300) size 129x102 [border: (1px outset #808080)] - LayoutBlockFlow {CAPTION} at (0,0) size 129x20 + LayoutNGTableCaption {CAPTION} at (0,0) size 129x20 LayoutInline {B} at (0,0) size 75x19 LayoutText {#text} at (27,0) size 75x19 text run at (27,0) width 75: "Vegetabley"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/html/tabular_data/td_colspan_rendering-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/html/tabular_data/td_colspan_rendering-expected.txt index 3a59909..11c9e2b 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/html/tabular_data/td_colspan_rendering-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/html/tabular_data/td_colspan_rendering-expected.txt
@@ -6,11 +6,11 @@ LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 166x19 text run at (0,0) width 166: "Tests: the colspan attribute" - LayoutBR {BR} at (166,0) size 0x0 + LayoutBR {BR} at (166,0) size 0x19 LayoutNGBlockFlow {P} at (0,36) size 784x80 LayoutText {#text} at (0,0) size 73x19 text run at (0,0) width 73: "Conditions:" - LayoutBR {BR} at (73,0) size 0x0 + LayoutBR {BR} at (73,0) size 0x19 LayoutText {#text} at (0,20) size 772x59 text run at (0,20) width 772: "The colSpan attribute specifies the number of columns spanned by the current cell. The default value of this attribute is one" text run at (0,40) width 767: "(\"1\"). The value zero (\"0\") means that the cell spans all columns from the current column to the last column of the column" @@ -21,9 +21,9 @@ text run at (0,20) width 782: "column in the first row should span only column \"one\" and the second cell should span all of the other columns. The second" text run at (0,40) width 519: "table tests the zero value. \"Just A\" should span \"A\" and \"Just B\" should span \"B.\"" LayoutNGBlockFlow (anonymous) at (0,218) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutTable {TABLE} at (0,238) size 270x76 [border: (1px outset #808080)] - LayoutBlockFlow {CAPTION} at (0,0) size 270x20 + LayoutNGTableCaption {CAPTION} at (0,0) size 270x20 LayoutText {#text} at (27,0) size 216x19 text run at (27,0) width 216: "Testing Default and Regular Input" LayoutTableSection {TBODY} at (1,21) size 268x54 @@ -60,9 +60,9 @@ LayoutText {#text} at (2,2) size 31x19 text run at (2,2) width 31: "eight" LayoutNGBlockFlow (anonymous) at (0,314) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutTable {TABLE} at (0,334) size 197x76 [border: (1px outset #808080)] - LayoutBlockFlow {CAPTION} at (0,0) size 197x20 + LayoutNGTableCaption {CAPTION} at (0,0) size 197x20 LayoutText {#text} at (16,0) size 165x19 text run at (16,0) width 165: "Testing Zero Special Case" LayoutTableSection {TBODY} at (1,21) size 195x54
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/loading/simple-subframe-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/loading/simple-subframe-expected.txt index 80108c2e7d..59df2ea15 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/loading/simple-subframe-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/loading/simple-subframe-expected.txt
@@ -18,7 +18,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 482x19 text run at (0,0) width 482: "This is a test of load callbacks. It is only useful inside the regression test tool." - LayoutBR {BR} at (482,0) size 0x0 + LayoutBR {BR} at (482,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 layer at (8,28) size 304x154 LayoutIFrame {IFRAME} at (0,20) size 304x154 [border: (2px inset #EEEEEE)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/local/file-url-sent-as-referer-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/local/file-url-sent-as-referer-expected.txt index 9151d18..1877a52 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/local/file-url-sent-as-referer-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/local/file-url-sent-as-referer-expected.txt
@@ -3,15 +3,15 @@ layer at (0,0) size 800x235 LayoutNGBlockFlow {HTML} at (0,0) size 800x235 LayoutNGBlockFlow {BODY} at (8,8) size 784x219 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutText {#text} at (0,20) size 499x19 text run at (0,20) width 499: "This is a test to see if a file:// url is sent out as the referrer for a subresource load" - LayoutBR {BR} at (499,20) size 0x0 + LayoutBR {BR} at (499,20) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (304,179) size 0x0 + LayoutBR {BR} at (304,179) size 0x19 LayoutText {#text} at (0,199) size 389x19 text run at (0,199) width 389: "The above image will tell you success or failure - green or red" - LayoutBR {BR} at (389,199) size 0x0 + LayoutBR {BR} at (389,199) size 0x19 layer at (8,48) size 304x154 LayoutIFrame {IFRAME} at (0,40) size 304x154 [border: (2px inset #EEEEEE)] layer at (0,0) size 300x150
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/misc/acid3-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/misc/acid3-expected.txt new file mode 100644 index 0000000..06105573 --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/misc/acid3-expected.txt
@@ -0,0 +1,243 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (20,20) size 644x433 + LayoutNGBlockFlow {HTML} at (20,20) size 644x433 [border: none (4px solid #808080) none] + LayoutNGBlockFlow {BODY} at (-4,-4) size 644x433 [bgcolor=#FFFFFF] [border: (1px solid #000000)] + LayoutNGBlockFlow {H1} at (41,41) size 562x120 + LayoutText {#text} at (0,2) size 273x115 + text run at (0,2) width 273: "Acid3" + LayoutNGBlockFlow {DIV} at (41,121) size 562x312 + LayoutNGBlockFlow {P} at (7,80) size 54x42 [bgcolor=#FF0000] [border: (1px solid #000000)] + LayoutNGBlockFlow {P} at (70,64) size 64x50 [bgcolor=#FFA500] [border: (1px solid #000000)] + LayoutNGBlockFlow {P} at (144.98,48) size 74x58 [bgcolor=#FFFF00] [border: (1px solid #000000)] + LayoutNGBlockFlow {P} at (230.98,32) size 86x66 [bgcolor=#00FF00] [border: (1px solid #000000)] + LayoutNGBlockFlow {P} at (329.98,16) size 96x74 [bgcolor=#0000FF] [border: (1px solid #000000)] + LayoutNGBlockFlow {P} at (440.98,0) size 106x82 [bgcolor=#800080] [border: (1px solid #000000)] + LayoutText {#text} at (0,0) size 0x0 + LayoutNGBlockFlow {P} at (41,214) size 568x120 + LayoutInline {SPAN} at (0,0) size 168x115 + LayoutText {#text} at (204,2) size 168x115 + text run at (204,2) width 168: "100" + LayoutInline {SPAN} at (0,0) size 28x115 + LayoutText {#text} at (372,2) size 28x115 + text run at (372,2) width 28: "/" + LayoutInline {SPAN} at (0,0) size 168x115 + LayoutText {#text} at (400,2) size 168x115 + text run at (400,2) width 168: "100" + LayoutNGBlockFlow (anonymous) at (41,334) size 562x0 + LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x0 [color=#0000FF] + LayoutNGBlockFlow (anonymous) at (41,334) size 562x0 + LayoutNGBlockFlow {FORM} at (0,0) size 562x0 + LayoutTable {TABLE} at (0,0) size 0x0 + LayoutTableSection {TBODY} at (0,0) size 0x0 + LayoutTableRow {TR} at (0,0) size 0x0 + LayoutNGTableCell {TD} at (0,0) size 0x0 [r=0 c=0 rs=1 cs=1] + LayoutNGBlockFlow {P} at (0,0) size 0x0 + LayoutNGBlockFlow (anonymous) at (41,334) size 562x0 + LayoutInline {MAP} at (0,0) size 0x0 + LayoutText {#text} at (0,0) size 0x0 + LayoutNGBlockFlow {P} at (41,334) size 582x98 [color=#808080] + LayoutText {#text} at (0,0) size 114x18 + text run at (0,0) width 114: "To pass the test," + LayoutNGBlockFlow (floating) {SPAN} at (562,0) size 20x20 [bgcolor=#FFFFFF] + LayoutText {#text} at (114,0) size 560x56 + text run at (114,0) width 446: " a browser must use its default settings, the animation has to be" + text run at (0,19) width 560: "smooth, the score has to end on 100/100, and the final page has to look exactly," + text run at (0,38) width 131: "pixel for pixel, like " + LayoutInline {A} at (0,0) size 168x18 [color=#0000FF] + LayoutText {#text} at (131,38) size 168x18 + text run at (131,38) width 168: "this reference rendering" + LayoutText {#text} at (299,38) size 4x18 + text run at (299,38) width 4: "." +layer at (57,350) size 0x0 + LayoutIFrame (floating) {IFRAME} at (0,0) size 0x0 + layer at (0,0) size 0x0 scrollWidth 1 scrollHeight 1 + LayoutView at (0,0) size 0x0 + layer at (0,0) size 0x1 + LayoutNGBlockFlow {HTML} at (0,0) size 0x1 + LayoutNGBlockFlow {BODY} at (0,0) size 0x1 + LayoutImage {IMG} at (0,0) size 1x1 +layer at (57,350) size 0x0 + LayoutIFrame (floating) {IFRAME} at (0,0) size 0x0 + layer at (0,0) size 0x0 scrollWidth 24 scrollHeight 2293 + LayoutView at (0,0) size 0x0 + layer at (0,0) size 0x2293 + LayoutNGBlockFlow {HTML} at (0,0) size 0x2293 + LayoutNGBlockFlow {BODY} at (8,8) size 0x2272 + LayoutNGBlockFlow {PRE} at (0,0) size 0x2272 + LayoutText {#text} at (0,0) size 16x2272 + text run at (0,0) width 8: "<" + text run at (0,16) width 8: "!" + text run at (0,32) width 8: "D" + text run at (0,48) width 8: "O" + text run at (0,64) width 8: "C" + text run at (0,80) width 8: "T" + text run at (0,96) width 8: "Y" + text run at (0,112) width 8: "P" + text run at (0,128) width 8: "E" + text run at (8,128) width 8: " " + text run at (0,144) width 8: "h" + text run at (0,160) width 8: "t" + text run at (0,176) width 8: "m" + text run at (0,192) width 8: "l" + text run at (0,208) width 8: ">" + text run at (0,224) width 8: "<" + text run at (0,240) width 8: "h" + text run at (0,256) width 8: "t" + text run at (0,272) width 8: "m" + text run at (0,288) width 8: "l" + text run at (0,304) width 8: ">" + text run at (0,320) width 8: "<" + text run at (0,336) width 8: "h" + text run at (0,352) width 8: "e" + text run at (0,368) width 8: "a" + text run at (0,384) width 8: "d" + text run at (0,400) width 8: ">" + text run at (0,416) width 8: "<" + text run at (0,432) width 8: "t" + text run at (0,448) width 8: "i" + text run at (0,464) width 8: "t" + text run at (0,480) width 8: "l" + text run at (0,496) width 8: "e" + text run at (0,512) width 8: ">" + text run at (0,528) width 8: "F" + text run at (0,544) width 8: "A" + text run at (0,560) width 8: "I" + text run at (0,576) width 8: "L" + text run at (0,592) width 8: "<" + text run at (0,608) width 8: "/" + text run at (0,624) width 8: "t" + text run at (0,640) width 8: "i" + text run at (0,656) width 8: "t" + text run at (0,672) width 8: "l" + text run at (0,688) width 8: "e" + text run at (0,704) width 8: ">" + text run at (0,720) width 8: "<" + text run at (0,736) width 8: "/" + text run at (0,752) width 8: "h" + text run at (0,768) width 8: "e" + text run at (0,784) width 8: "a" + text run at (0,800) width 8: "d" + text run at (0,816) width 8: ">" + text run at (0,832) width 8: "<" + text run at (0,848) width 8: "b" + text run at (0,864) width 8: "o" + text run at (0,880) width 8: "d" + text run at (0,896) width 8: "y" + text run at (0,912) width 8: ">" + text run at (0,928) width 8: "<" + text run at (0,944) width 8: "p" + text run at (0,960) width 8: ">" + text run at (0,976) width 8: "F" + text run at (0,992) width 8: "A" + text run at (0,1008) width 8: "I" + text run at (0,1024) width 8: "L" + text run at (0,1040) width 8: "<" + text run at (0,1056) width 8: "/" + text run at (0,1072) width 8: "p" + text run at (0,1088) width 8: ">" + text run at (0,1104) width 8: "<" + text run at (0,1120) width 8: "s" + text run at (0,1136) width 8: "c" + text run at (0,1152) width 8: "r" + text run at (0,1168) width 8: "i" + text run at (0,1184) width 8: "p" + text run at (0,1200) width 8: "t" + text run at (0,1216) width 8: ">" + text run at (0,1232) width 8: "p" + text run at (0,1248) width 8: "a" + text run at (0,1264) width 8: "r" + text run at (0,1280) width 8: "e" + text run at (0,1296) width 8: "n" + text run at (0,1312) width 8: "t" + text run at (0,1328) width 8: "." + text run at (0,1344) width 8: "n" + text run at (0,1360) width 8: "o" + text run at (0,1376) width 8: "t" + text run at (0,1392) width 8: "i" + text run at (0,1408) width 8: "f" + text run at (0,1424) width 8: "y" + text run at (0,1440) width 8: "(" + text run at (0,1456) width 8: "\"" + text run at (0,1472) width 8: "r" + text run at (0,1488) width 8: "e" + text run at (0,1504) width 8: "s" + text run at (0,1520) width 8: "o" + text run at (0,1536) width 8: "u" + text run at (0,1552) width 8: "r" + text run at (0,1568) width 8: "c" + text run at (0,1584) width 8: "e" + text run at (0,1600) width 8: "s" + text run at (0,1616) width 8: "/" + text run at (0,1632) width 8: "a" + text run at (0,1648) width 8: "c" + text run at (0,1664) width 8: "i" + text run at (0,1680) width 8: "d" + text run at (0,1696) width 8: "3" + text run at (0,1712) width 8: "/" + text run at (0,1728) width 8: "e" + text run at (0,1744) width 8: "m" + text run at (0,1760) width 8: "p" + text run at (0,1776) width 8: "t" + text run at (0,1792) width 8: "y" + text run at (0,1808) width 8: "." + text run at (0,1824) width 8: "t" + text run at (0,1840) width 8: "x" + text run at (0,1856) width 8: "t" + text run at (0,1872) width 8: "\"" + text run at (0,1888) width 8: ")" + text run at (0,1904) width 8: "<" + text run at (0,1920) width 8: "/" + text run at (0,1936) width 8: "s" + text run at (0,1952) width 8: "c" + text run at (0,1968) width 8: "r" + text run at (0,1984) width 8: "i" + text run at (0,2000) width 8: "p" + text run at (0,2016) width 8: "t" + text run at (0,2032) width 8: ">" + text run at (0,2048) width 8: "<" + text run at (0,2064) width 8: "/" + text run at (0,2080) width 8: "b" + text run at (0,2096) width 8: "o" + text run at (0,2112) width 8: "d" + text run at (0,2128) width 8: "y" + text run at (0,2144) width 8: ">" + text run at (0,2160) width 8: "<" + text run at (0,2176) width 8: "/" + text run at (0,2192) width 8: "h" + text run at (0,2208) width 8: "t" + text run at (0,2224) width 8: "m" + text run at (0,2240) width 8: "l" + text run at (0,2256) width 8: ">" +layer at (57,350) size 0x0 + LayoutIFrame (floating) {IFRAME} at (0,0) size 0x0 + layer at (0,0) size 0x0 scrollWidth 1 scrollHeight 8 + LayoutView at (0,0) size 0x0 + layer at (0,0) size 0x8 + LayoutNGBlockFlow {HTML} at (0,0) size 0x8 + LayoutNGBlockFlow {BODY} at (8,8) size 0x0 +layer at (131,84) size 0x0 + LayoutNGBlockFlow (positioned) {OBJECT} at (130.50,84.30) size 0x0 +layer at (131,84) size 300x150 + LayoutEmbeddedObject (positioned) {OBJECT} at (130.50,84.30) size 300x150 + layer at (0,0) size 300x150 + LayoutView at (0,0) size 300x150 + layer at (0,0) size 300x16 + LayoutNGBlockFlow {HTML} at (0,0) size 300x16 + LayoutNGBlockFlow {BODY} at (8,16) size 284x0 + LayoutNGBlockFlow {P} at (0,0) size 284x0 +layer at (17,18) size 80x36 + LayoutNGBlockFlow (positioned) {A} at (17,18) size 80x36 [color=#FF0000] + LayoutText {#text} at (0,0) size 71x36 + text run at (0,0) width 67: "YOU SHOULD" + text run at (0,12) width 71: "NOT SEE THIS" + text run at (0,24) width 34: "AT ALL" +layer at (638,18) size 20x20 + LayoutNGBlockFlow (positioned) {<pseudo:after>} at (638,18) size 20x20 [color=#FFFFFF] [bgcolor=#FF00FF] + LayoutTextFragment (anonymous) at (0,0) size 20x20 + text run at (0,0) width 20: "X" +layer at (10,10) size 82x46 + LayoutNGBlockFlow (positioned) {DIV} at (10,10) size 82x46 [color=#00000000] + LayoutText {#text} at (0,0) size 82x45 + text run at (0,0) width 82: "FAIL"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/misc/frame-access-during-load-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/misc/frame-access-during-load-expected.txt index 25eb497..cada4b6 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/misc/frame-access-during-load-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/misc/frame-access-during-load-expected.txt
@@ -12,7 +12,7 @@ LayoutBR {BR} at (300,80) size 0x0 LayoutText {#text} at (0,80) size 164x19 text run at (0,80) width 164: "[object HTMLDocument]" - LayoutBR {BR} at (164,80) size 0x0 + LayoutBR {BR} at (164,80) size 0x19 LayoutText {#text} at (0,100) size 164x19 text run at (0,100) width 164: "[object HTMLDocument]" LayoutNGBlockFlow {P} at (0,192) size 784x20
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/misc/slow-loading-image-in-pattern-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/misc/slow-loading-image-in-pattern-expected.txt index 01b64ac..0a18107 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/misc/slow-loading-image-in-pattern-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/http/tests/misc/slow-loading-image-in-pattern-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x40 LayoutText {#text} at (0,0) size 627x19 text run at (0,0) width 627: "This tests slow loading png images referenced from a image element inside a SVG pattern resource." - LayoutBR {BR} at (627,0) size 0x0 + LayoutBR {BR} at (627,0) size 0x19 LayoutText {#text} at (0,20) size 560x19 text run at (0,20) width 560: "You should see a 400x300 rect containing a tiled rendering of the Acid3 reference image." layer at (10,50) size 406x306 clip at (13,53) size 400x300
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/cross-fade-background-size-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/cross-fade-background-size-expected.txt index a4d9fba..aac7336 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/cross-fade-background-size-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/cross-fade-background-size-expected.txt
@@ -4,13 +4,13 @@ LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow (anonymous) at (0,50) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow (anonymous) at (0,120) size 784x40 - LayoutBR {BR} at (0,0) size 0x0 - LayoutBR {BR} at (0,20) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 + LayoutBR {BR} at (0,20) size 0x19 LayoutNGBlockFlow {DIV} at (0,160) size 200x50 LayoutNGBlockFlow (anonymous) at (0,210) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow {DIV} at (0,230) size 200x50 layer at (8,8) size 200x50 LayoutNGBlockFlow {DIV} at (0,0) size 200x50
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/feature-policy-max-downscaling-image-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/feature-policy-max-downscaling-image-expected.txt index eaa86b5..3c9632e 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/feature-policy-max-downscaling-image-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/feature-policy-max-downscaling-image-expected.txt
@@ -29,4 +29,7 @@ LayoutText {#text} at (496,374) size 4x19 text run at (496,374) width 4: " " LayoutImage {IMG} at (500,351.22) size 37.78x37.78 + LayoutText {#text} at (537,374) size 5x19 + text run at (537,374) width 5: " " + LayoutImage {IMG} at (541.78,349.22) size 39.78x39.78 [border: (1px solid #0000FF)] LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/image-map-anchor-children-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/image-map-anchor-children-expected.txt index 7e79045..7769a61 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/image-map-anchor-children-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/image-map-anchor-children-expected.txt
@@ -5,9 +5,9 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutImage {IMG} at (0,0) size 479x150 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {MAP} at (0,0) size 224x19 + LayoutInline {MAP} at (0,0) size 479x39 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (479,135) size 0x0 + LayoutBR {BR} at (479,135) size 0x19 LayoutInline {A} at (0,0) size 91x19 [color=#0000EE] LayoutText {#text} at (0,155) size 91x19 text run at (0,155) width 91: "John Hancock"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-circle-focus-ring-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-circle-focus-ring-expected.txt index 319558ef..573df41 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-circle-focus-ring-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-circle-focus-ring-expected.txt
@@ -8,9 +8,9 @@ text run at (0,0) width 763: "Assuming the port-specific theme draws focus rings, this test can be used to ensure that a focus ring is drawn for an <area" text run at (0,20) width 760: "shape=\"circle\">. This test PASSED if a circular-shaped focus ring is drawn around the <area> in the imagemap (below)." LayoutNGBlockFlow (anonymous) at (0,56) size 784x133 - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (0,0) size 128x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-expected.txt index d4eb00d..d3993e4 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-expected.txt
@@ -8,9 +8,9 @@ text run at (0,0) width 724: "Assuming the port-specific theme draws focus rings, this test can be used to ensure that a focus ring is drawn for an" text run at (0,20) width 623: "imagemap. This test PASSED if a focus ring is drawn around the <area> in the imagemap (below)." LayoutNGBlockFlow (anonymous) at (0,56) size 784x133 - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (0,0) size 128x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-outline-color-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-outline-color-expected.txt index 31c4984f..9d01d11 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-outline-color-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-outline-color-expected.txt
@@ -8,9 +8,9 @@ text run at (0,0) width 776: "Assuming the port-specific theme draws focus rings, this test can be used to ensure that a focus ring is drawn for an <area>." text run at (0,20) width 641: "This test PASSED if a green-colored focus ring is drawn around the <area> in the imagemap (below)." LayoutNGBlockFlow (anonymous) at (0,56) size 784x133 - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (0,0) size 128x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.txt index cc52415..f813dd1a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.txt
@@ -9,9 +9,9 @@ text run at (0,20) width 768: "can be explicitly inherited from <map>. This test PASSED if a green-colored focus ring is drawn around the <area> in the" text run at (0,40) width 122: "imagemap (below)." LayoutNGBlockFlow (anonymous) at (0,76) size 784x133 - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (0,0) size 128x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.txt index b12b951..38ba9d4 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.txt
@@ -14,9 +14,9 @@ text run at (674,20) width 61: ". This test" text run at (0,40) width 566: "FAILED if a red-colored focus ring is drawn around the <area> in the imagemap (below)." LayoutNGBlockFlow (anonymous) at (0,76) size 784x133 - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (0,0) size 128x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-with-scale-transform-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-with-scale-transform-expected.txt new file mode 100644 index 0000000..b3b6438 --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-with-scale-transform-expected.txt
@@ -0,0 +1,14 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x36 + LayoutNGBlockFlow {HTML} at (0,0) size 800x36 + LayoutNGBlockFlow {BODY} at (8,8) size 784x20 + LayoutText {#text} at (0,0) size 487x19 + text run at (0,0) width 487: "Tests that we paint area outline properly when the image's container is scaled." +layer at (100,100) size 100x100 + LayoutNGBlockFlow (positioned) {DIV} at (100,100) size 100x100 + LayoutImage {IMG} at (0,0) size 50x50 + LayoutText {#text} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 + LayoutInline {AREA} at (0,0) size 0x19 + LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-zoom-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-zoom-expected.txt index 6dc588b..4eb0ffb 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-zoom-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-zoom-expected.txt
@@ -7,9 +7,9 @@ text run at (0,0) width 677: "This test can be used to ensure that a focus ring is drawn correctly for an" text run at (0,27) width 727: "imagemap even when the page is zoomed. This test PASSED if a focus ring is" text run at (0,218) width 515: "drawn around the <area> in the imagemap to the right. " - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x27 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x27 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (515,54) size 184.31x184.31
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-overflowing-circle-focus-ring-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-overflowing-circle-focus-ring-expected.txt index 8c3ecb2..c7be818 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-overflowing-circle-focus-ring-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-overflowing-circle-focus-ring-expected.txt
@@ -9,9 +9,9 @@ text run at (0,20) width 743: "shape=\"circle\"> that overflows the img element. This test PASSED if a half-circule-shaped focus ring is drawn for the" text run at (0,40) width 209: "<area> in the imagemap (below)." LayoutNGBlockFlow (anonymous) at (0,76) size 784x133 - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (0,0) size 128x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-overflowing-polygon-focus-ring-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-overflowing-polygon-focus-ring-expected.txt index abc9bd9b..215d54287 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-overflowing-polygon-focus-ring-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-overflowing-polygon-focus-ring-expected.txt
@@ -9,9 +9,9 @@ text run at (0,20) width 782: "shape=\"polygon\"> that is overflowing the bounds for the img element. This test PASSED if a clipped star-shaped focus ring" text run at (0,40) width 338: "is drawn around the <area> in the imagemap (below)." LayoutNGBlockFlow (anonymous) at (0,76) size 784x133 - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (0,0) size 128x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-polygon-focus-ring-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-polygon-focus-ring-expected.txt index 9d16e0f9..b6efd46 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-polygon-focus-ring-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-polygon-focus-ring-expected.txt
@@ -8,9 +8,9 @@ text run at (0,0) width 763: "Assuming the port-specific theme draws focus rings, this test can be used to ensure that a focus ring is drawn for an <area" text run at (0,20) width 763: "shape=\"polygon\">. This test PASSED if a cross-shaped focus ring is drawn around the <area> in the imagemap (below)." LayoutNGBlockFlow (anonymous) at (0,56) size 784x133 - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (0,0) size 128x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/audio-controls-rendering-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/audio-controls-rendering-expected.txt index e5068e8c..610087a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/audio-controls-rendering-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/audio-controls-rendering-expected.txt
@@ -8,10 +8,10 @@ text run at (0,0) width 152: "Test controls placement." LayoutNGBlockFlow (anonymous) at (0,36) size 784x168 LayoutBR {BR} at (300,54) size 0x0 - LayoutBR {BR} at (0,54) size 0x0 - LayoutBR {BR} at (320,113) size 0x0 - LayoutBR {BR} at (0,128) size 0x0 - LayoutBR {BR} at (0,148) size 0x0 + LayoutBR {BR} at (0,54) size 0x19 + LayoutBR {BR} at (320,113) size 0x19 + LayoutBR {BR} at (0,128) size 0x19 + LayoutBR {BR} at (0,148) size 0x19 layer at (8,44) size 300x54 LayoutMedia {AUDIO} at (0,0) size 300x54 [bgcolor=#0000FF] layer at (8,118) size 320x54
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-display-toggle-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-display-toggle-expected.txt index d4a96c2..a0e0e37 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-display-toggle-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-display-toggle-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 492x19 text run at (0,0) width 492: "This tests that toggling the display property won't make the controls disappear." - LayoutBR {BR} at (492,0) size 0x0 + LayoutBR {BR} at (492,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 layer at (8,28) size 320x240 LayoutVideo {VIDEO} at (0,20) size 320x240
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-layer-crash-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-layer-crash-expected.txt index 71c4aeeb..c8e1f04a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-layer-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-layer-crash-expected.txt
@@ -9,13 +9,13 @@ LayoutNGBlockFlow (anonymous) at (0,36) size 784x342 LayoutText {#text} at (0,0) size 4x19 text run at (0,0) width 4: " " - LayoutBR {BR} at (4,0) size 0x0 + LayoutBR {BR} at (4,0) size 0x19 LayoutText {#text} at (0,161) size 4x19 text run at (0,161) width 4: " " - LayoutBR {BR} at (210,161) size 0x0 + LayoutBR {BR} at (210,161) size 0x19 LayoutText {#text} at (0,322) size 4x19 text run at (0,322) width 4: " " - LayoutBR {BR} at (210,322) size 0x0 + LayoutBR {BR} at (210,322) size 0x19 layer at (12,64) size 206x156 LayoutVideo {VIDEO} at (4,20) size 206x156 [border: (3px solid #FF0000)] layer at (15,67) size 200x150 backgroundClip at (65,105) size 100x75 clip at (65,105) size 100x75
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-poster-scale-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-poster-scale-expected.txt index 49cad62d..d3233b70 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-poster-scale-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-poster-scale-expected.txt
@@ -4,17 +4,17 @@ LayoutNGBlockFlow {HTML} at (0,0) size 785x622 LayoutNGBlockFlow {BODY} at (8,8) size 769x606 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (326,141) size 0x0 + LayoutBR {BR} at (326,141) size 0x19 LayoutText {#text} at (82,255) size 4x19 text run at (82,255) width 4: " " LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (168,255) size 0x0 + LayoutBR {BR} at (168,255) size 0x19 LayoutText {#text} at (56,586) size 4x19 text run at (56,586) width 4: " " LayoutText {#text} at (386,586) size 4x19 text run at (386,586) width 4: " " LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (716,586) size 0x0 + LayoutBR {BR} at (716,586) size 0x19 layer at (8,8) size 326x156 LayoutVideo {VIDEO} at (0,0) size 326x156 [bgcolor=#EE00EE] [border: (3px solid #FF0000)] layer at (8,169) size 82x109
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-replaces-poster-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-replaces-poster-expected.txt index 2a117fb4..9c12c83c 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-replaces-poster-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-replaces-poster-expected.txt
@@ -11,7 +11,7 @@ text run at (52,0) width 305: "https://bugs.webkit.org/show_bug.cgi?id=34966" LayoutText {#text} at (357,0) size 4x19 text run at (357,0) width 4: "." - LayoutBR {BR} at (361,0) size 0x0 + LayoutBR {BR} at (361,0) size 0x19 LayoutText {#text} at (0,20) size 204x19 text run at (0,20) width 204: "You should see the video below." LayoutNGBlockFlow (anonymous) at (0,56) size 784x275
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-zoom-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-zoom-expected.txt index 01b2802..d3fb4119 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-zoom-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/media/video-zoom-expected.txt
@@ -9,14 +9,14 @@ LayoutNGBlockFlow (anonymous) at (0,36) size 769x374 LayoutText {#text} at (0,354) size 4x19 text run at (0,354) width 4: " " - LayoutBR {BR} at (493,354) size 0x0 + LayoutBR {BR} at (493,354) size 0x19 LayoutNGBlockFlow {P} at (0,426) size 769x20 LayoutText {#text} at (0,0) size 303x19 text run at (0,0) width 303: "150% zoom, without width and height attributes" LayoutNGBlockFlow (anonymous) at (0,462) size 769x374 LayoutText {#text} at (0,354) size 4x19 text run at (0,354) width 4: " " - LayoutBR {BR} at (493,354) size 0x0 + LayoutBR {BR} at (493,354) size 0x19 layer at (12,44) size 489x369 LayoutVideo {VIDEO} at (4,0) size 489x369 [border: (4.50px solid #FF0000)] layer at (12,470) size 489x369 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/mhtml/data-uri-font-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/mhtml/data-uri-font-expected.txt index fef907f..66b97625 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/mhtml/data-uri-font-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/mhtml/data-uri-font-expected.txt
@@ -6,4 +6,4 @@ LayoutInline {SPAN} at (0,0) size 386x18 [border: (1px solid #000000)] LayoutText {#text} at (1,2) size 384x16 text run at (1,2) width 384: "Should not be monospace." - LayoutBR {BR} at (386,0) size 0x0 + LayoutBR {BR} at (386,0) size 0x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/filters/clip-filter-overflow-clip-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/filters/clip-filter-overflow-clip-expected.txt index f534e84f..40925c0 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/filters/clip-filter-overflow-clip-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/filters/clip-filter-overflow-clip-expected.txt
@@ -5,10 +5,10 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x80 LayoutText {#text} at (0,0) size 488x19 text run at (0,0) width 488: "This test verifies CSS clip, filter, and overflow clip are applied in the order of:" - LayoutBR {BR} at (488,0) size 0x0 + LayoutBR {BR} at (488,0) size 0x19 LayoutText {#text} at (0,20) size 418x19 text run at (0,20) width 418: "output <-- clip <-- filter <-- overflow clip <-- normal-flow contents" - LayoutBR {BR} at (418,20) size 0x0 + LayoutBR {BR} at (418,20) size 0x19 LayoutText {#text} at (0,40) size 776x39 text run at (0,40) width 776: "The test succeeds if the green box below has a crisp left edge, blurred top/bottom dashed border, and a crisp right edge with" text run at (0,60) width 346: "blurred partial dashed border. No red should be visible."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/text-emphasis-h-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/text-emphasis-h-expected.txt index 935b006..02b82e0 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/text-emphasis-h-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/text-emphasis-h-expected.txt
@@ -7,16 +7,16 @@ LayoutNGBlockFlow {DIV} at (0,0) size 784x120 [color=#FF0000] LayoutText {#text} at (0,8) size 192x16 text run at (0,8) width 192: "222222222222" - LayoutBR {BR} at (192,8) size 0x0 - LayoutBR {BR} at (0,24) size 0x0 + LayoutBR {BR} at (192,8) size 0x16 + LayoutBR {BR} at (0,24) size 0x16 LayoutText {#text} at (0,40) size 192x16 text run at (0,40) width 192: "222222222222" - LayoutBR {BR} at (192,40) size 0x0 - LayoutBR {BR} at (0,56) size 0x0 + LayoutBR {BR} at (192,40) size 0x16 + LayoutBR {BR} at (0,56) size 0x16 LayoutText {#text} at (0,72) size 192x16 text run at (0,72) width 192: "222222222222" - LayoutBR {BR} at (192,72) size 0x0 - LayoutBR {BR} at (0,88) size 0x0 + LayoutBR {BR} at (192,72) size 0x16 + LayoutBR {BR} at (0,88) size 0x16 LayoutText {#text} at (0,104) size 192x16 text run at (0,104) width 192: "222222222222" layer at (8,8) size 192x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/text-emphasis-v-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/text-emphasis-v-expected.txt index ca80205..f694382 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/text-emphasis-v-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/text-emphasis-v-expected.txt
@@ -7,37 +7,37 @@ LayoutNGBlockFlow {DIV} at (0,0) size 784x192 [color=#FF0000] LayoutText {#text} at (8,0) size 112x16 text run at (8,0) width 112: "2 2 2 2" - LayoutBR {BR} at (120,0) size 0x0 + LayoutBR {BR} at (120,0) size 0x16 LayoutText {#text} at (8,16) size 112x16 text run at (8,16) width 112: "2 2 2 2" - LayoutBR {BR} at (120,16) size 0x0 + LayoutBR {BR} at (120,16) size 0x16 LayoutText {#text} at (8,32) size 112x16 text run at (8,32) width 112: "2 2 2 2" - LayoutBR {BR} at (120,32) size 0x0 + LayoutBR {BR} at (120,32) size 0x16 LayoutText {#text} at (8,48) size 112x16 text run at (8,48) width 112: "2 2 2 2" - LayoutBR {BR} at (120,48) size 0x0 + LayoutBR {BR} at (120,48) size 0x16 LayoutText {#text} at (8,64) size 112x16 text run at (8,64) width 112: "2 2 2 2" - LayoutBR {BR} at (120,64) size 0x0 + LayoutBR {BR} at (120,64) size 0x16 LayoutText {#text} at (8,80) size 112x16 text run at (8,80) width 112: "2 2 2 2" - LayoutBR {BR} at (120,80) size 0x0 + LayoutBR {BR} at (120,80) size 0x16 LayoutText {#text} at (8,96) size 112x16 text run at (8,96) width 112: "2 2 2 2" - LayoutBR {BR} at (120,96) size 0x0 + LayoutBR {BR} at (120,96) size 0x16 LayoutText {#text} at (8,112) size 112x16 text run at (8,112) width 112: "2 2 2 2" - LayoutBR {BR} at (120,112) size 0x0 + LayoutBR {BR} at (120,112) size 0x16 LayoutText {#text} at (8,128) size 112x16 text run at (8,128) width 112: "2 2 2 2" - LayoutBR {BR} at (120,128) size 0x0 + LayoutBR {BR} at (120,128) size 0x16 LayoutText {#text} at (8,144) size 112x16 text run at (8,144) width 112: "2 2 2 2" - LayoutBR {BR} at (120,144) size 0x0 + LayoutBR {BR} at (120,144) size 0x16 LayoutText {#text} at (8,160) size 112x16 text run at (8,160) width 112: "2 2 2 2" - LayoutBR {BR} at (120,160) size 0x0 + LayoutBR {BR} at (120,160) size 0x16 LayoutText {#text} at (8,176) size 112x16 text run at (8,176) width 112: "2 2 2 2" layer at (8,8) size 128x192
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/vertical-lr-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/vertical-lr-expected.txt index 2037036..efb6320 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/vertical-lr-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/vertical-lr-expected.txt
@@ -4,9 +4,9 @@ LayoutNGBlockFlow {HTML} at (0,0) size 326x166 LayoutNGBlockFlow {BODY} at (8,8) size 310x150 LayoutNGBlockFlow (anonymous) at (90,0) size 20x150 - LayoutBR {BR} at (1,0) size 0x0 + LayoutBR {BR} at (1,0) size 19x0 LayoutNGBlockFlow (anonymous) at (200,0) size 20x150 - LayoutBR {BR} at (1,0) size 0x0 + LayoutBR {BR} at (1,0) size 19x0 layer at (8,8) size 30x150 scrollHeight 216 LayoutNGBlockFlow {DIV} at (0,0) size 30x150 LayoutText {#text} at (0,0) size 27x147
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/vertical-rl-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/vertical-rl-expected.txt index 5aab8fe..aee8396 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/vertical-rl-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/vertical-rl-expected.txt
@@ -4,9 +4,9 @@ LayoutNGBlockFlow {HTML} at (0,0) size 326x166 LayoutNGBlockFlow {BODY} at (8,8) size 310x150 LayoutNGBlockFlow (anonymous) at (90,0) size 20x150 - LayoutBR {BR} at (1,0) size 0x0 + LayoutBR {BR} at (1,0) size 19x0 LayoutNGBlockFlow (anonymous) at (200,0) size 20x150 - LayoutBR {BR} at (1,0) size 0x0 + LayoutBR {BR} at (1,0) size 19x0 layer at (762,8) size 30x150 scrollHeight 216 LayoutNGBlockFlow {DIV} at (0,0) size 30x150 LayoutText {#text} at (3,0) size 27x147
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/image-writing-modes-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/image-writing-modes-expected.txt index ff5575a2..faa3a99 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/image-writing-modes-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/image-writing-modes-expected.txt
@@ -8,27 +8,27 @@ text run at (0,40) width 60: "foo" LayoutImage {IMG} at (60,26) size 40x30 LayoutImage {IMG} at (100,26) size 40x30 - LayoutBR {BR} at (140,40) size 0x0 + LayoutBR {BR} at (140,40) size 0x20 LayoutImage {IMG} at (0,126) size 40x30 LayoutNGBlockFlow (anonymous) at (0,200) size 769x100 - LayoutBR {BR} at (0,40) size 0x0 + LayoutBR {BR} at (0,40) size 0x20 LayoutNGBlockFlow {DIV} at (0,300) size 200x120 LayoutText {#text} at (40,0) size 20x60 text run at (40,0) width 60: "foo" LayoutImage {IMG} at (30,60) size 40x30 LayoutImage {IMG} at (30,90) size 40x30 - LayoutBR {BR} at (40,120) size 0x0 + LayoutBR {BR} at (40,120) size 20x0 LayoutImage {IMG} at (130,0) size 40x30 LayoutNGBlockFlow (anonymous) at (0,420) size 769x100 - LayoutBR {BR} at (0,40) size 0x0 + LayoutBR {BR} at (0,40) size 0x20 LayoutNGBlockFlow {DIV} at (0,520) size 200x120 LayoutText {#text} at (140,0) size 20x60 text run at (140,0) width 60: "foo" LayoutImage {IMG} at (30,60) size 40x30 LayoutImage {IMG} at (30,90) size 40x30 - LayoutBR {BR} at (140,120) size 0x0 + LayoutBR {BR} at (140,120) size 20x0 LayoutImage {IMG} at (130,0) size 40x30 LayoutNGBlockFlow (anonymous) at (0,640) size 769x100 - LayoutBR {BR} at (0,40) size 0x0 + LayoutBR {BR} at (0,40) size 0x20 selection start: position 0 of child 0 {#text} of child 0 {DIV} of body selection end: position 0 of child 7 {BR} of body
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/text-selection-newline-br-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/text-selection-newline-br-expected.txt index 43a2642..78cb6d793 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/text-selection-newline-br-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/text-selection-newline-br-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {DIV} at (0,0) size 784x32 LayoutText {#text} at (0,0) size 16x16 text run at (0,0) width 16: "a" - LayoutBR {BR} at (16,0) size 0x0 + LayoutBR {BR} at (16,0) size 0x16 LayoutText {#text} at (0,16) size 16x16 text run at (0,16) width 16: "b" selection start: position 5 of child 0 {#text} of child 0 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/text-selection-newline-rtl-double-linebreak-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/text-selection-newline-rtl-double-linebreak-expected.txt index 8a8b3fa..6e887a0 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/text-selection-newline-rtl-double-linebreak-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/text-selection-newline-rtl-double-linebreak-expected.txt
@@ -9,7 +9,7 @@ LayoutNGBlockFlow {DIV} at (0,36) size 784x152 LayoutText {#text} at (756,1) size 28x73 text run at (756,1) width 28: "a" - LayoutBR {BR} at (756,1) size 0x0 - LayoutBR {BR} at (784,77) size 0x0 + LayoutBR {BR} at (756,1) size 0x73 + LayoutBR {BR} at (784,77) size 0x73 selection start: position 0 of child 0 {#text} of child 2 {DIV} of body selection end: position 1 of child 1 {BR} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/text/selection-no-clip-text-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/text/selection-no-clip-text-expected.txt index 2a32043..978b9b40 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/text/selection-no-clip-text-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/text/selection-no-clip-text-expected.txt
@@ -9,7 +9,7 @@ LayoutNGBlockFlow {DIV} at (0,20) size 784x22 LayoutText {#text} at (0,-4) size 12x19 text run at (0,-4) width 12: "X" - LayoutBR {BR} at (12,-4) size 0x0 + LayoutBR {BR} at (12,-4) size 0x19 LayoutText {#text} at (0,7) size 48x19 text run at (0,7) width 48: "YYYY" selection start: position 0 of child 0 {#text} of body
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/plugins/plugin-scroll-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/plugins/plugin-scroll-expected.txt index 8b6a87c5..26bf386e 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/plugins/plugin-scroll-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/plugins/plugin-scroll-expected.txt
@@ -7,9 +7,9 @@ LayoutNGBlockFlow {HTML} at (0,0) size 785x3016 LayoutNGBlockFlow {BODY} at (8,8) size 769x3000 LayoutNGBlockFlow {DIV} at (0,0) size 769x3000 - LayoutBR {BR} at (284,149) size 0x0 - LayoutBR {BR} at (284,318) size 0x0 - LayoutBR {BR} at (284,487) size 0x0 + LayoutBR {BR} at (284,149) size 0x19 + LayoutBR {BR} at (284,318) size 0x19 + LayoutBR {BR} at (284,487) size 0x19 layer at (28,-72) size 244x124 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 LayoutEmbeddedObject {EMBED} at (20,20) size 244x124 [border: (2px solid #000000)] layer at (28,97) size 244x124
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/plugins/webview-plugin-scroll-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/plugins/webview-plugin-scroll-expected.txt index 68a91cc5..4d73d14f 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/plugins/webview-plugin-scroll-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/plugins/webview-plugin-scroll-expected.txt
@@ -4,9 +4,9 @@ LayoutNGBlockFlow {HTML} at (0,0) size 785x3523 LayoutNGBlockFlow {BODY} at (8,8) size 769x3507 LayoutNGBlockFlow (anonymous) at (0,0) size 769x507 - LayoutBR {BR} at (284,149) size 0x0 - LayoutBR {BR} at (284,318) size 0x0 - LayoutBR {BR} at (284,487) size 0x0 + LayoutBR {BR} at (284,149) size 0x19 + LayoutBR {BR} at (284,318) size 0x19 + LayoutBR {BR} at (284,487) size 0x19 LayoutNGBlockFlow {DIV} at (0,507) size 769x3000 layer at (28,-72) size 244x124 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 LayoutEmbeddedObject {EMBED} at (20,20) size 244x124 [border: (2px solid #000000)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/printing/single-line-must-not-be-split-into-two-pages-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/printing/single-line-must-not-be-split-into-two-pages-expected.txt index a9a97da..61b971d 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/printing/single-line-must-not-be-split-into-two-pages-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/printing/single-line-must-not-be-split-into-two-pages-expected.txt
@@ -6,2406 +6,2406 @@ LayoutNGBlockFlow (relative positioned) {DIV} at (0,76) size 769x8000 LayoutText {#text} at (0,0) size 90x19 text run at (0,0) width 90: "WWWWWW" - LayoutBR {BR} at (90,0) size 0x0 + LayoutBR {BR} at (90,0) size 0x19 LayoutText {#text} at (0,20) size 90x19 text run at (0,20) width 90: "WWWWWW" - LayoutBR {BR} at (90,20) size 0x0 + LayoutBR {BR} at (90,20) size 0x19 LayoutText {#text} at (0,40) size 90x19 text run at (0,40) width 90: "WWWWWW" - LayoutBR {BR} at (90,40) size 0x0 + LayoutBR {BR} at (90,40) size 0x19 LayoutText {#text} at (0,60) size 90x19 text run at (0,60) width 90: "WWWWWW" - LayoutBR {BR} at (90,60) size 0x0 + LayoutBR {BR} at (90,60) size 0x19 LayoutText {#text} at (0,80) size 90x19 text run at (0,80) width 90: "WWWWWW" - LayoutBR {BR} at (90,80) size 0x0 + LayoutBR {BR} at (90,80) size 0x19 LayoutText {#text} at (0,100) size 90x19 text run at (0,100) width 90: "WWWWWW" - LayoutBR {BR} at (90,100) size 0x0 + LayoutBR {BR} at (90,100) size 0x19 LayoutText {#text} at (0,120) size 90x19 text run at (0,120) width 90: "WWWWWW" - LayoutBR {BR} at (90,120) size 0x0 + LayoutBR {BR} at (90,120) size 0x19 LayoutText {#text} at (0,140) size 90x19 text run at (0,140) width 90: "WWWWWW" - LayoutBR {BR} at (90,140) size 0x0 + LayoutBR {BR} at (90,140) size 0x19 LayoutText {#text} at (0,160) size 90x19 text run at (0,160) width 90: "WWWWWW" - LayoutBR {BR} at (90,160) size 0x0 + LayoutBR {BR} at (90,160) size 0x19 LayoutText {#text} at (0,180) size 90x19 text run at (0,180) width 90: "WWWWWW" - LayoutBR {BR} at (90,180) size 0x0 + LayoutBR {BR} at (90,180) size 0x19 LayoutText {#text} at (0,200) size 90x19 text run at (0,200) width 90: "WWWWWW" - LayoutBR {BR} at (90,200) size 0x0 + LayoutBR {BR} at (90,200) size 0x19 LayoutText {#text} at (0,220) size 90x19 text run at (0,220) width 90: "WWWWWW" - LayoutBR {BR} at (90,220) size 0x0 + LayoutBR {BR} at (90,220) size 0x19 LayoutText {#text} at (0,240) size 90x19 text run at (0,240) width 90: "WWWWWW" - LayoutBR {BR} at (90,240) size 0x0 + LayoutBR {BR} at (90,240) size 0x19 LayoutText {#text} at (0,260) size 90x19 text run at (0,260) width 90: "WWWWWW" - LayoutBR {BR} at (90,260) size 0x0 + LayoutBR {BR} at (90,260) size 0x19 LayoutText {#text} at (0,280) size 90x19 text run at (0,280) width 90: "WWWWWW" - LayoutBR {BR} at (90,280) size 0x0 + LayoutBR {BR} at (90,280) size 0x19 LayoutText {#text} at (0,300) size 90x19 text run at (0,300) width 90: "WWWWWW" - LayoutBR {BR} at (90,300) size 0x0 + LayoutBR {BR} at (90,300) size 0x19 LayoutText {#text} at (0,320) size 90x19 text run at (0,320) width 90: "WWWWWW" - LayoutBR {BR} at (90,320) size 0x0 + LayoutBR {BR} at (90,320) size 0x19 LayoutText {#text} at (0,340) size 90x19 text run at (0,340) width 90: "WWWWWW" - LayoutBR {BR} at (90,340) size 0x0 + LayoutBR {BR} at (90,340) size 0x19 LayoutText {#text} at (0,360) size 90x19 text run at (0,360) width 90: "WWWWWW" - LayoutBR {BR} at (90,360) size 0x0 + LayoutBR {BR} at (90,360) size 0x19 LayoutText {#text} at (0,380) size 90x19 text run at (0,380) width 90: "WWWWWW" - LayoutBR {BR} at (90,380) size 0x0 + LayoutBR {BR} at (90,380) size 0x19 LayoutText {#text} at (0,400) size 90x19 text run at (0,400) width 90: "WWWWWW" - LayoutBR {BR} at (90,400) size 0x0 + LayoutBR {BR} at (90,400) size 0x19 LayoutText {#text} at (0,420) size 90x19 text run at (0,420) width 90: "WWWWWW" - LayoutBR {BR} at (90,420) size 0x0 + LayoutBR {BR} at (90,420) size 0x19 LayoutText {#text} at (0,440) size 90x19 text run at (0,440) width 90: "WWWWWW" - LayoutBR {BR} at (90,440) size 0x0 + LayoutBR {BR} at (90,440) size 0x19 LayoutText {#text} at (0,460) size 90x19 text run at (0,460) width 90: "WWWWWW" - LayoutBR {BR} at (90,460) size 0x0 + LayoutBR {BR} at (90,460) size 0x19 LayoutText {#text} at (0,480) size 90x19 text run at (0,480) width 90: "WWWWWW" - LayoutBR {BR} at (90,480) size 0x0 + LayoutBR {BR} at (90,480) size 0x19 LayoutText {#text} at (0,500) size 90x19 text run at (0,500) width 90: "WWWWWW" - LayoutBR {BR} at (90,500) size 0x0 + LayoutBR {BR} at (90,500) size 0x19 LayoutText {#text} at (0,520) size 90x19 text run at (0,520) width 90: "WWWWWW" - LayoutBR {BR} at (90,520) size 0x0 + LayoutBR {BR} at (90,520) size 0x19 LayoutText {#text} at (0,540) size 90x19 text run at (0,540) width 90: "WWWWWW" - LayoutBR {BR} at (90,540) size 0x0 + LayoutBR {BR} at (90,540) size 0x19 LayoutText {#text} at (0,560) size 90x19 text run at (0,560) width 90: "WWWWWW" - LayoutBR {BR} at (90,560) size 0x0 + LayoutBR {BR} at (90,560) size 0x19 LayoutText {#text} at (0,580) size 90x19 text run at (0,580) width 90: "WWWWWW" - LayoutBR {BR} at (90,580) size 0x0 + LayoutBR {BR} at (90,580) size 0x19 LayoutText {#text} at (0,600) size 90x19 text run at (0,600) width 90: "WWWWWW" - LayoutBR {BR} at (90,600) size 0x0 + LayoutBR {BR} at (90,600) size 0x19 LayoutText {#text} at (0,620) size 90x19 text run at (0,620) width 90: "WWWWWW" - LayoutBR {BR} at (90,620) size 0x0 + LayoutBR {BR} at (90,620) size 0x19 LayoutText {#text} at (0,640) size 90x19 text run at (0,640) width 90: "WWWWWW" - LayoutBR {BR} at (90,640) size 0x0 + LayoutBR {BR} at (90,640) size 0x19 LayoutText {#text} at (0,660) size 90x19 text run at (0,660) width 90: "WWWWWW" - LayoutBR {BR} at (90,660) size 0x0 + LayoutBR {BR} at (90,660) size 0x19 LayoutText {#text} at (0,680) size 90x19 text run at (0,680) width 90: "WWWWWW" - LayoutBR {BR} at (90,680) size 0x0 + LayoutBR {BR} at (90,680) size 0x19 LayoutText {#text} at (0,700) size 90x19 text run at (0,700) width 90: "WWWWWW" - LayoutBR {BR} at (90,700) size 0x0 + LayoutBR {BR} at (90,700) size 0x19 LayoutText {#text} at (0,720) size 90x19 text run at (0,720) width 90: "WWWWWW" - LayoutBR {BR} at (90,720) size 0x0 + LayoutBR {BR} at (90,720) size 0x19 LayoutText {#text} at (0,740) size 90x19 text run at (0,740) width 90: "WWWWWW" - LayoutBR {BR} at (90,740) size 0x0 + LayoutBR {BR} at (90,740) size 0x19 LayoutText {#text} at (0,760) size 90x19 text run at (0,760) width 90: "WWWWWW" - LayoutBR {BR} at (90,760) size 0x0 + LayoutBR {BR} at (90,760) size 0x19 LayoutText {#text} at (0,780) size 90x19 text run at (0,780) width 90: "WWWWWW" - LayoutBR {BR} at (90,780) size 0x0 + LayoutBR {BR} at (90,780) size 0x19 LayoutText {#text} at (0,800) size 90x19 text run at (0,800) width 90: "WWWWWW" - LayoutBR {BR} at (90,800) size 0x0 + LayoutBR {BR} at (90,800) size 0x19 LayoutText {#text} at (0,820) size 90x19 text run at (0,820) width 90: "WWWWWW" - LayoutBR {BR} at (90,820) size 0x0 + LayoutBR {BR} at (90,820) size 0x19 LayoutText {#text} at (0,840) size 90x19 text run at (0,840) width 90: "WWWWWW" - LayoutBR {BR} at (90,840) size 0x0 + LayoutBR {BR} at (90,840) size 0x19 LayoutText {#text} at (0,860) size 90x19 text run at (0,860) width 90: "WWWWWW" - LayoutBR {BR} at (90,860) size 0x0 + LayoutBR {BR} at (90,860) size 0x19 LayoutText {#text} at (0,880) size 90x19 text run at (0,880) width 90: "WWWWWW" - LayoutBR {BR} at (90,880) size 0x0 + LayoutBR {BR} at (90,880) size 0x19 LayoutText {#text} at (0,900) size 90x19 text run at (0,900) width 90: "WWWWWW" - LayoutBR {BR} at (90,900) size 0x0 + LayoutBR {BR} at (90,900) size 0x19 LayoutText {#text} at (0,920) size 90x19 text run at (0,920) width 90: "WWWWWW" - LayoutBR {BR} at (90,920) size 0x0 + LayoutBR {BR} at (90,920) size 0x19 LayoutText {#text} at (0,940) size 90x19 text run at (0,940) width 90: "WWWWWW" - LayoutBR {BR} at (90,940) size 0x0 + LayoutBR {BR} at (90,940) size 0x19 LayoutText {#text} at (0,960) size 90x19 text run at (0,960) width 90: "WWWWWW" - LayoutBR {BR} at (90,960) size 0x0 + LayoutBR {BR} at (90,960) size 0x19 LayoutText {#text} at (0,980) size 90x19 text run at (0,980) width 90: "WWWWWW" - LayoutBR {BR} at (90,980) size 0x0 + LayoutBR {BR} at (90,980) size 0x19 LayoutText {#text} at (0,1000) size 90x19 text run at (0,1000) width 90: "WWWWWW" - LayoutBR {BR} at (90,1000) size 0x0 + LayoutBR {BR} at (90,1000) size 0x19 LayoutText {#text} at (0,1020) size 90x19 text run at (0,1020) width 90: "WWWWWW" - LayoutBR {BR} at (90,1020) size 0x0 + LayoutBR {BR} at (90,1020) size 0x19 LayoutText {#text} at (0,1040) size 90x19 text run at (0,1040) width 90: "WWWWWW" - LayoutBR {BR} at (90,1040) size 0x0 + LayoutBR {BR} at (90,1040) size 0x19 LayoutText {#text} at (0,1060) size 90x19 text run at (0,1060) width 90: "WWWWWW" - LayoutBR {BR} at (90,1060) size 0x0 + LayoutBR {BR} at (90,1060) size 0x19 LayoutText {#text} at (0,1080) size 90x19 text run at (0,1080) width 90: "WWWWWW" - LayoutBR {BR} at (90,1080) size 0x0 + LayoutBR {BR} at (90,1080) size 0x19 LayoutText {#text} at (0,1100) size 90x19 text run at (0,1100) width 90: "WWWWWW" - LayoutBR {BR} at (90,1100) size 0x0 + LayoutBR {BR} at (90,1100) size 0x19 LayoutText {#text} at (0,1120) size 90x19 text run at (0,1120) width 90: "WWWWWW" - LayoutBR {BR} at (90,1120) size 0x0 + LayoutBR {BR} at (90,1120) size 0x19 LayoutText {#text} at (0,1140) size 90x19 text run at (0,1140) width 90: "WWWWWW" - LayoutBR {BR} at (90,1140) size 0x0 + LayoutBR {BR} at (90,1140) size 0x19 LayoutText {#text} at (0,1160) size 90x19 text run at (0,1160) width 90: "WWWWWW" - LayoutBR {BR} at (90,1160) size 0x0 + LayoutBR {BR} at (90,1160) size 0x19 LayoutText {#text} at (0,1180) size 90x19 text run at (0,1180) width 90: "WWWWWW" - LayoutBR {BR} at (90,1180) size 0x0 + LayoutBR {BR} at (90,1180) size 0x19 LayoutText {#text} at (0,1200) size 90x19 text run at (0,1200) width 90: "WWWWWW" - LayoutBR {BR} at (90,1200) size 0x0 + LayoutBR {BR} at (90,1200) size 0x19 LayoutText {#text} at (0,1220) size 90x19 text run at (0,1220) width 90: "WWWWWW" - LayoutBR {BR} at (90,1220) size 0x0 + LayoutBR {BR} at (90,1220) size 0x19 LayoutText {#text} at (0,1240) size 90x19 text run at (0,1240) width 90: "WWWWWW" - LayoutBR {BR} at (90,1240) size 0x0 + LayoutBR {BR} at (90,1240) size 0x19 LayoutText {#text} at (0,1260) size 90x19 text run at (0,1260) width 90: "WWWWWW" - LayoutBR {BR} at (90,1260) size 0x0 + LayoutBR {BR} at (90,1260) size 0x19 LayoutText {#text} at (0,1280) size 90x19 text run at (0,1280) width 90: "WWWWWW" - LayoutBR {BR} at (90,1280) size 0x0 + LayoutBR {BR} at (90,1280) size 0x19 LayoutText {#text} at (0,1300) size 90x19 text run at (0,1300) width 90: "WWWWWW" - LayoutBR {BR} at (90,1300) size 0x0 + LayoutBR {BR} at (90,1300) size 0x19 LayoutText {#text} at (0,1320) size 90x19 text run at (0,1320) width 90: "WWWWWW" - LayoutBR {BR} at (90,1320) size 0x0 + LayoutBR {BR} at (90,1320) size 0x19 LayoutText {#text} at (0,1340) size 90x19 text run at (0,1340) width 90: "WWWWWW" - LayoutBR {BR} at (90,1340) size 0x0 + LayoutBR {BR} at (90,1340) size 0x19 LayoutText {#text} at (0,1360) size 90x19 text run at (0,1360) width 90: "WWWWWW" - LayoutBR {BR} at (90,1360) size 0x0 + LayoutBR {BR} at (90,1360) size 0x19 LayoutText {#text} at (0,1380) size 90x19 text run at (0,1380) width 90: "WWWWWW" - LayoutBR {BR} at (90,1380) size 0x0 + LayoutBR {BR} at (90,1380) size 0x19 LayoutText {#text} at (0,1400) size 90x19 text run at (0,1400) width 90: "WWWWWW" - LayoutBR {BR} at (90,1400) size 0x0 + LayoutBR {BR} at (90,1400) size 0x19 LayoutText {#text} at (0,1420) size 90x19 text run at (0,1420) width 90: "WWWWWW" - LayoutBR {BR} at (90,1420) size 0x0 + LayoutBR {BR} at (90,1420) size 0x19 LayoutText {#text} at (0,1440) size 90x19 text run at (0,1440) width 90: "WWWWWW" - LayoutBR {BR} at (90,1440) size 0x0 + LayoutBR {BR} at (90,1440) size 0x19 LayoutText {#text} at (0,1460) size 90x19 text run at (0,1460) width 90: "WWWWWW" - LayoutBR {BR} at (90,1460) size 0x0 + LayoutBR {BR} at (90,1460) size 0x19 LayoutText {#text} at (0,1480) size 90x19 text run at (0,1480) width 90: "WWWWWW" - LayoutBR {BR} at (90,1480) size 0x0 + LayoutBR {BR} at (90,1480) size 0x19 LayoutText {#text} at (0,1500) size 90x19 text run at (0,1500) width 90: "WWWWWW" - LayoutBR {BR} at (90,1500) size 0x0 + LayoutBR {BR} at (90,1500) size 0x19 LayoutText {#text} at (0,1520) size 90x19 text run at (0,1520) width 90: "WWWWWW" - LayoutBR {BR} at (90,1520) size 0x0 + LayoutBR {BR} at (90,1520) size 0x19 LayoutText {#text} at (0,1540) size 90x19 text run at (0,1540) width 90: "WWWWWW" - LayoutBR {BR} at (90,1540) size 0x0 + LayoutBR {BR} at (90,1540) size 0x19 LayoutText {#text} at (0,1560) size 90x19 text run at (0,1560) width 90: "WWWWWW" - LayoutBR {BR} at (90,1560) size 0x0 + LayoutBR {BR} at (90,1560) size 0x19 LayoutText {#text} at (0,1580) size 90x19 text run at (0,1580) width 90: "WWWWWW" - LayoutBR {BR} at (90,1580) size 0x0 + LayoutBR {BR} at (90,1580) size 0x19 LayoutText {#text} at (0,1600) size 90x19 text run at (0,1600) width 90: "WWWWWW" - LayoutBR {BR} at (90,1600) size 0x0 + LayoutBR {BR} at (90,1600) size 0x19 LayoutText {#text} at (0,1620) size 90x19 text run at (0,1620) width 90: "WWWWWW" - LayoutBR {BR} at (90,1620) size 0x0 + LayoutBR {BR} at (90,1620) size 0x19 LayoutText {#text} at (0,1640) size 90x19 text run at (0,1640) width 90: "WWWWWW" - LayoutBR {BR} at (90,1640) size 0x0 + LayoutBR {BR} at (90,1640) size 0x19 LayoutText {#text} at (0,1660) size 90x19 text run at (0,1660) width 90: "WWWWWW" - LayoutBR {BR} at (90,1660) size 0x0 + LayoutBR {BR} at (90,1660) size 0x19 LayoutText {#text} at (0,1680) size 90x19 text run at (0,1680) width 90: "WWWWWW" - LayoutBR {BR} at (90,1680) size 0x0 + LayoutBR {BR} at (90,1680) size 0x19 LayoutText {#text} at (0,1700) size 90x19 text run at (0,1700) width 90: "WWWWWW" - LayoutBR {BR} at (90,1700) size 0x0 + LayoutBR {BR} at (90,1700) size 0x19 LayoutText {#text} at (0,1720) size 90x19 text run at (0,1720) width 90: "WWWWWW" - LayoutBR {BR} at (90,1720) size 0x0 + LayoutBR {BR} at (90,1720) size 0x19 LayoutText {#text} at (0,1740) size 90x19 text run at (0,1740) width 90: "WWWWWW" - LayoutBR {BR} at (90,1740) size 0x0 + LayoutBR {BR} at (90,1740) size 0x19 LayoutText {#text} at (0,1760) size 90x19 text run at (0,1760) width 90: "WWWWWW" - LayoutBR {BR} at (90,1760) size 0x0 + LayoutBR {BR} at (90,1760) size 0x19 LayoutText {#text} at (0,1780) size 90x19 text run at (0,1780) width 90: "WWWWWW" - LayoutBR {BR} at (90,1780) size 0x0 + LayoutBR {BR} at (90,1780) size 0x19 LayoutText {#text} at (0,1800) size 90x19 text run at (0,1800) width 90: "WWWWWW" - LayoutBR {BR} at (90,1800) size 0x0 + LayoutBR {BR} at (90,1800) size 0x19 LayoutText {#text} at (0,1820) size 90x19 text run at (0,1820) width 90: "WWWWWW" - LayoutBR {BR} at (90,1820) size 0x0 + LayoutBR {BR} at (90,1820) size 0x19 LayoutText {#text} at (0,1840) size 90x19 text run at (0,1840) width 90: "WWWWWW" - LayoutBR {BR} at (90,1840) size 0x0 + LayoutBR {BR} at (90,1840) size 0x19 LayoutText {#text} at (0,1860) size 90x19 text run at (0,1860) width 90: "WWWWWW" - LayoutBR {BR} at (90,1860) size 0x0 + LayoutBR {BR} at (90,1860) size 0x19 LayoutText {#text} at (0,1880) size 90x19 text run at (0,1880) width 90: "WWWWWW" - LayoutBR {BR} at (90,1880) size 0x0 + LayoutBR {BR} at (90,1880) size 0x19 LayoutText {#text} at (0,1900) size 90x19 text run at (0,1900) width 90: "WWWWWW" - LayoutBR {BR} at (90,1900) size 0x0 + LayoutBR {BR} at (90,1900) size 0x19 LayoutText {#text} at (0,1920) size 90x19 text run at (0,1920) width 90: "WWWWWW" - LayoutBR {BR} at (90,1920) size 0x0 + LayoutBR {BR} at (90,1920) size 0x19 LayoutText {#text} at (0,1940) size 90x19 text run at (0,1940) width 90: "WWWWWW" - LayoutBR {BR} at (90,1940) size 0x0 + LayoutBR {BR} at (90,1940) size 0x19 LayoutText {#text} at (0,1960) size 90x19 text run at (0,1960) width 90: "WWWWWW" - LayoutBR {BR} at (90,1960) size 0x0 + LayoutBR {BR} at (90,1960) size 0x19 LayoutText {#text} at (0,1980) size 90x19 text run at (0,1980) width 90: "WWWWWW" - LayoutBR {BR} at (90,1980) size 0x0 + LayoutBR {BR} at (90,1980) size 0x19 LayoutText {#text} at (0,2000) size 90x19 text run at (0,2000) width 90: "WWWWWW" - LayoutBR {BR} at (90,2000) size 0x0 + LayoutBR {BR} at (90,2000) size 0x19 LayoutText {#text} at (0,2020) size 90x19 text run at (0,2020) width 90: "WWWWWW" - LayoutBR {BR} at (90,2020) size 0x0 + LayoutBR {BR} at (90,2020) size 0x19 LayoutText {#text} at (0,2040) size 90x19 text run at (0,2040) width 90: "WWWWWW" - LayoutBR {BR} at (90,2040) size 0x0 + LayoutBR {BR} at (90,2040) size 0x19 LayoutText {#text} at (0,2060) size 90x19 text run at (0,2060) width 90: "WWWWWW" - LayoutBR {BR} at (90,2060) size 0x0 + LayoutBR {BR} at (90,2060) size 0x19 LayoutText {#text} at (0,2080) size 90x19 text run at (0,2080) width 90: "WWWWWW" - LayoutBR {BR} at (90,2080) size 0x0 + LayoutBR {BR} at (90,2080) size 0x19 LayoutText {#text} at (0,2100) size 90x19 text run at (0,2100) width 90: "WWWWWW" - LayoutBR {BR} at (90,2100) size 0x0 + LayoutBR {BR} at (90,2100) size 0x19 LayoutText {#text} at (0,2120) size 90x19 text run at (0,2120) width 90: "WWWWWW" - LayoutBR {BR} at (90,2120) size 0x0 + LayoutBR {BR} at (90,2120) size 0x19 LayoutText {#text} at (0,2140) size 90x19 text run at (0,2140) width 90: "WWWWWW" - LayoutBR {BR} at (90,2140) size 0x0 + LayoutBR {BR} at (90,2140) size 0x19 LayoutText {#text} at (0,2160) size 90x19 text run at (0,2160) width 90: "WWWWWW" - LayoutBR {BR} at (90,2160) size 0x0 + LayoutBR {BR} at (90,2160) size 0x19 LayoutText {#text} at (0,2180) size 90x19 text run at (0,2180) width 90: "WWWWWW" - LayoutBR {BR} at (90,2180) size 0x0 + LayoutBR {BR} at (90,2180) size 0x19 LayoutText {#text} at (0,2200) size 90x19 text run at (0,2200) width 90: "WWWWWW" - LayoutBR {BR} at (90,2200) size 0x0 + LayoutBR {BR} at (90,2200) size 0x19 LayoutText {#text} at (0,2220) size 90x19 text run at (0,2220) width 90: "WWWWWW" - LayoutBR {BR} at (90,2220) size 0x0 + LayoutBR {BR} at (90,2220) size 0x19 LayoutText {#text} at (0,2240) size 90x19 text run at (0,2240) width 90: "WWWWWW" - LayoutBR {BR} at (90,2240) size 0x0 + LayoutBR {BR} at (90,2240) size 0x19 LayoutText {#text} at (0,2260) size 90x19 text run at (0,2260) width 90: "WWWWWW" - LayoutBR {BR} at (90,2260) size 0x0 + LayoutBR {BR} at (90,2260) size 0x19 LayoutText {#text} at (0,2280) size 90x19 text run at (0,2280) width 90: "WWWWWW" - LayoutBR {BR} at (90,2280) size 0x0 + LayoutBR {BR} at (90,2280) size 0x19 LayoutText {#text} at (0,2300) size 90x19 text run at (0,2300) width 90: "WWWWWW" - LayoutBR {BR} at (90,2300) size 0x0 + LayoutBR {BR} at (90,2300) size 0x19 LayoutText {#text} at (0,2320) size 90x19 text run at (0,2320) width 90: "WWWWWW" - LayoutBR {BR} at (90,2320) size 0x0 + LayoutBR {BR} at (90,2320) size 0x19 LayoutText {#text} at (0,2340) size 90x19 text run at (0,2340) width 90: "WWWWWW" - LayoutBR {BR} at (90,2340) size 0x0 + LayoutBR {BR} at (90,2340) size 0x19 LayoutText {#text} at (0,2360) size 90x19 text run at (0,2360) width 90: "WWWWWW" - LayoutBR {BR} at (90,2360) size 0x0 + LayoutBR {BR} at (90,2360) size 0x19 LayoutText {#text} at (0,2380) size 90x19 text run at (0,2380) width 90: "WWWWWW" - LayoutBR {BR} at (90,2380) size 0x0 + LayoutBR {BR} at (90,2380) size 0x19 LayoutText {#text} at (0,2400) size 90x19 text run at (0,2400) width 90: "WWWWWW" - LayoutBR {BR} at (90,2400) size 0x0 + LayoutBR {BR} at (90,2400) size 0x19 LayoutText {#text} at (0,2420) size 90x19 text run at (0,2420) width 90: "WWWWWW" - LayoutBR {BR} at (90,2420) size 0x0 + LayoutBR {BR} at (90,2420) size 0x19 LayoutText {#text} at (0,2440) size 90x19 text run at (0,2440) width 90: "WWWWWW" - LayoutBR {BR} at (90,2440) size 0x0 + LayoutBR {BR} at (90,2440) size 0x19 LayoutText {#text} at (0,2460) size 90x19 text run at (0,2460) width 90: "WWWWWW" - LayoutBR {BR} at (90,2460) size 0x0 + LayoutBR {BR} at (90,2460) size 0x19 LayoutText {#text} at (0,2480) size 90x19 text run at (0,2480) width 90: "WWWWWW" - LayoutBR {BR} at (90,2480) size 0x0 + LayoutBR {BR} at (90,2480) size 0x19 LayoutText {#text} at (0,2500) size 90x19 text run at (0,2500) width 90: "WWWWWW" - LayoutBR {BR} at (90,2500) size 0x0 + LayoutBR {BR} at (90,2500) size 0x19 LayoutText {#text} at (0,2520) size 90x19 text run at (0,2520) width 90: "WWWWWW" - LayoutBR {BR} at (90,2520) size 0x0 + LayoutBR {BR} at (90,2520) size 0x19 LayoutText {#text} at (0,2540) size 90x19 text run at (0,2540) width 90: "WWWWWW" - LayoutBR {BR} at (90,2540) size 0x0 + LayoutBR {BR} at (90,2540) size 0x19 LayoutText {#text} at (0,2560) size 90x19 text run at (0,2560) width 90: "WWWWWW" - LayoutBR {BR} at (90,2560) size 0x0 + LayoutBR {BR} at (90,2560) size 0x19 LayoutText {#text} at (0,2580) size 90x19 text run at (0,2580) width 90: "WWWWWW" - LayoutBR {BR} at (90,2580) size 0x0 + LayoutBR {BR} at (90,2580) size 0x19 LayoutText {#text} at (0,2600) size 90x19 text run at (0,2600) width 90: "WWWWWW" - LayoutBR {BR} at (90,2600) size 0x0 + LayoutBR {BR} at (90,2600) size 0x19 LayoutText {#text} at (0,2620) size 90x19 text run at (0,2620) width 90: "WWWWWW" - LayoutBR {BR} at (90,2620) size 0x0 + LayoutBR {BR} at (90,2620) size 0x19 LayoutText {#text} at (0,2640) size 90x19 text run at (0,2640) width 90: "WWWWWW" - LayoutBR {BR} at (90,2640) size 0x0 + LayoutBR {BR} at (90,2640) size 0x19 LayoutText {#text} at (0,2660) size 90x19 text run at (0,2660) width 90: "WWWWWW" - LayoutBR {BR} at (90,2660) size 0x0 + LayoutBR {BR} at (90,2660) size 0x19 LayoutText {#text} at (0,2680) size 90x19 text run at (0,2680) width 90: "WWWWWW" - LayoutBR {BR} at (90,2680) size 0x0 + LayoutBR {BR} at (90,2680) size 0x19 LayoutText {#text} at (0,2700) size 90x19 text run at (0,2700) width 90: "WWWWWW" - LayoutBR {BR} at (90,2700) size 0x0 + LayoutBR {BR} at (90,2700) size 0x19 LayoutText {#text} at (0,2720) size 90x19 text run at (0,2720) width 90: "WWWWWW" - LayoutBR {BR} at (90,2720) size 0x0 + LayoutBR {BR} at (90,2720) size 0x19 LayoutText {#text} at (0,2740) size 90x19 text run at (0,2740) width 90: "WWWWWW" - LayoutBR {BR} at (90,2740) size 0x0 + LayoutBR {BR} at (90,2740) size 0x19 LayoutText {#text} at (0,2760) size 90x19 text run at (0,2760) width 90: "WWWWWW" - LayoutBR {BR} at (90,2760) size 0x0 + LayoutBR {BR} at (90,2760) size 0x19 LayoutText {#text} at (0,2780) size 90x19 text run at (0,2780) width 90: "WWWWWW" - LayoutBR {BR} at (90,2780) size 0x0 + LayoutBR {BR} at (90,2780) size 0x19 LayoutText {#text} at (0,2800) size 90x19 text run at (0,2800) width 90: "WWWWWW" - LayoutBR {BR} at (90,2800) size 0x0 + LayoutBR {BR} at (90,2800) size 0x19 LayoutText {#text} at (0,2820) size 90x19 text run at (0,2820) width 90: "WWWWWW" - LayoutBR {BR} at (90,2820) size 0x0 + LayoutBR {BR} at (90,2820) size 0x19 LayoutText {#text} at (0,2840) size 90x19 text run at (0,2840) width 90: "WWWWWW" - LayoutBR {BR} at (90,2840) size 0x0 + LayoutBR {BR} at (90,2840) size 0x19 LayoutText {#text} at (0,2860) size 90x19 text run at (0,2860) width 90: "WWWWWW" - LayoutBR {BR} at (90,2860) size 0x0 + LayoutBR {BR} at (90,2860) size 0x19 LayoutText {#text} at (0,2880) size 90x19 text run at (0,2880) width 90: "WWWWWW" - LayoutBR {BR} at (90,2880) size 0x0 + LayoutBR {BR} at (90,2880) size 0x19 LayoutText {#text} at (0,2900) size 90x19 text run at (0,2900) width 90: "WWWWWW" - LayoutBR {BR} at (90,2900) size 0x0 + LayoutBR {BR} at (90,2900) size 0x19 LayoutText {#text} at (0,2920) size 90x19 text run at (0,2920) width 90: "WWWWWW" - LayoutBR {BR} at (90,2920) size 0x0 + LayoutBR {BR} at (90,2920) size 0x19 LayoutText {#text} at (0,2940) size 90x19 text run at (0,2940) width 90: "WWWWWW" - LayoutBR {BR} at (90,2940) size 0x0 + LayoutBR {BR} at (90,2940) size 0x19 LayoutText {#text} at (0,2960) size 90x19 text run at (0,2960) width 90: "WWWWWW" - LayoutBR {BR} at (90,2960) size 0x0 + LayoutBR {BR} at (90,2960) size 0x19 LayoutText {#text} at (0,2980) size 90x19 text run at (0,2980) width 90: "WWWWWW" - LayoutBR {BR} at (90,2980) size 0x0 + LayoutBR {BR} at (90,2980) size 0x19 LayoutText {#text} at (0,3000) size 90x19 text run at (0,3000) width 90: "WWWWWW" - LayoutBR {BR} at (90,3000) size 0x0 + LayoutBR {BR} at (90,3000) size 0x19 LayoutText {#text} at (0,3020) size 90x19 text run at (0,3020) width 90: "WWWWWW" - LayoutBR {BR} at (90,3020) size 0x0 + LayoutBR {BR} at (90,3020) size 0x19 LayoutText {#text} at (0,3040) size 90x19 text run at (0,3040) width 90: "WWWWWW" - LayoutBR {BR} at (90,3040) size 0x0 + LayoutBR {BR} at (90,3040) size 0x19 LayoutText {#text} at (0,3060) size 90x19 text run at (0,3060) width 90: "WWWWWW" - LayoutBR {BR} at (90,3060) size 0x0 + LayoutBR {BR} at (90,3060) size 0x19 LayoutText {#text} at (0,3080) size 90x19 text run at (0,3080) width 90: "WWWWWW" - LayoutBR {BR} at (90,3080) size 0x0 + LayoutBR {BR} at (90,3080) size 0x19 LayoutText {#text} at (0,3100) size 90x19 text run at (0,3100) width 90: "WWWWWW" - LayoutBR {BR} at (90,3100) size 0x0 + LayoutBR {BR} at (90,3100) size 0x19 LayoutText {#text} at (0,3120) size 90x19 text run at (0,3120) width 90: "WWWWWW" - LayoutBR {BR} at (90,3120) size 0x0 + LayoutBR {BR} at (90,3120) size 0x19 LayoutText {#text} at (0,3140) size 90x19 text run at (0,3140) width 90: "WWWWWW" - LayoutBR {BR} at (90,3140) size 0x0 + LayoutBR {BR} at (90,3140) size 0x19 LayoutText {#text} at (0,3160) size 90x19 text run at (0,3160) width 90: "WWWWWW" - LayoutBR {BR} at (90,3160) size 0x0 + LayoutBR {BR} at (90,3160) size 0x19 LayoutText {#text} at (0,3180) size 90x19 text run at (0,3180) width 90: "WWWWWW" - LayoutBR {BR} at (90,3180) size 0x0 + LayoutBR {BR} at (90,3180) size 0x19 LayoutText {#text} at (0,3200) size 90x19 text run at (0,3200) width 90: "WWWWWW" - LayoutBR {BR} at (90,3200) size 0x0 + LayoutBR {BR} at (90,3200) size 0x19 LayoutText {#text} at (0,3220) size 90x19 text run at (0,3220) width 90: "WWWWWW" - LayoutBR {BR} at (90,3220) size 0x0 + LayoutBR {BR} at (90,3220) size 0x19 LayoutText {#text} at (0,3240) size 90x19 text run at (0,3240) width 90: "WWWWWW" - LayoutBR {BR} at (90,3240) size 0x0 + LayoutBR {BR} at (90,3240) size 0x19 LayoutText {#text} at (0,3260) size 90x19 text run at (0,3260) width 90: "WWWWWW" - LayoutBR {BR} at (90,3260) size 0x0 + LayoutBR {BR} at (90,3260) size 0x19 LayoutText {#text} at (0,3280) size 90x19 text run at (0,3280) width 90: "WWWWWW" - LayoutBR {BR} at (90,3280) size 0x0 + LayoutBR {BR} at (90,3280) size 0x19 LayoutText {#text} at (0,3300) size 90x19 text run at (0,3300) width 90: "WWWWWW" - LayoutBR {BR} at (90,3300) size 0x0 + LayoutBR {BR} at (90,3300) size 0x19 LayoutText {#text} at (0,3320) size 90x19 text run at (0,3320) width 90: "WWWWWW" - LayoutBR {BR} at (90,3320) size 0x0 + LayoutBR {BR} at (90,3320) size 0x19 LayoutText {#text} at (0,3340) size 90x19 text run at (0,3340) width 90: "WWWWWW" - LayoutBR {BR} at (90,3340) size 0x0 + LayoutBR {BR} at (90,3340) size 0x19 LayoutText {#text} at (0,3360) size 90x19 text run at (0,3360) width 90: "WWWWWW" - LayoutBR {BR} at (90,3360) size 0x0 + LayoutBR {BR} at (90,3360) size 0x19 LayoutText {#text} at (0,3380) size 90x19 text run at (0,3380) width 90: "WWWWWW" - LayoutBR {BR} at (90,3380) size 0x0 + LayoutBR {BR} at (90,3380) size 0x19 LayoutText {#text} at (0,3400) size 90x19 text run at (0,3400) width 90: "WWWWWW" - LayoutBR {BR} at (90,3400) size 0x0 + LayoutBR {BR} at (90,3400) size 0x19 LayoutText {#text} at (0,3420) size 90x19 text run at (0,3420) width 90: "WWWWWW" - LayoutBR {BR} at (90,3420) size 0x0 + LayoutBR {BR} at (90,3420) size 0x19 LayoutText {#text} at (0,3440) size 90x19 text run at (0,3440) width 90: "WWWWWW" - LayoutBR {BR} at (90,3440) size 0x0 + LayoutBR {BR} at (90,3440) size 0x19 LayoutText {#text} at (0,3460) size 90x19 text run at (0,3460) width 90: "WWWWWW" - LayoutBR {BR} at (90,3460) size 0x0 + LayoutBR {BR} at (90,3460) size 0x19 LayoutText {#text} at (0,3480) size 90x19 text run at (0,3480) width 90: "WWWWWW" - LayoutBR {BR} at (90,3480) size 0x0 + LayoutBR {BR} at (90,3480) size 0x19 LayoutText {#text} at (0,3500) size 90x19 text run at (0,3500) width 90: "WWWWWW" - LayoutBR {BR} at (90,3500) size 0x0 + LayoutBR {BR} at (90,3500) size 0x19 LayoutText {#text} at (0,3520) size 90x19 text run at (0,3520) width 90: "WWWWWW" - LayoutBR {BR} at (90,3520) size 0x0 + LayoutBR {BR} at (90,3520) size 0x19 LayoutText {#text} at (0,3540) size 90x19 text run at (0,3540) width 90: "WWWWWW" - LayoutBR {BR} at (90,3540) size 0x0 + LayoutBR {BR} at (90,3540) size 0x19 LayoutText {#text} at (0,3560) size 90x19 text run at (0,3560) width 90: "WWWWWW" - LayoutBR {BR} at (90,3560) size 0x0 + LayoutBR {BR} at (90,3560) size 0x19 LayoutText {#text} at (0,3580) size 90x19 text run at (0,3580) width 90: "WWWWWW" - LayoutBR {BR} at (90,3580) size 0x0 + LayoutBR {BR} at (90,3580) size 0x19 LayoutText {#text} at (0,3600) size 90x19 text run at (0,3600) width 90: "WWWWWW" - LayoutBR {BR} at (90,3600) size 0x0 + LayoutBR {BR} at (90,3600) size 0x19 LayoutText {#text} at (0,3620) size 90x19 text run at (0,3620) width 90: "WWWWWW" - LayoutBR {BR} at (90,3620) size 0x0 + LayoutBR {BR} at (90,3620) size 0x19 LayoutText {#text} at (0,3640) size 90x19 text run at (0,3640) width 90: "WWWWWW" - LayoutBR {BR} at (90,3640) size 0x0 + LayoutBR {BR} at (90,3640) size 0x19 LayoutText {#text} at (0,3660) size 90x19 text run at (0,3660) width 90: "WWWWWW" - LayoutBR {BR} at (90,3660) size 0x0 + LayoutBR {BR} at (90,3660) size 0x19 LayoutText {#text} at (0,3680) size 90x19 text run at (0,3680) width 90: "WWWWWW" - LayoutBR {BR} at (90,3680) size 0x0 + LayoutBR {BR} at (90,3680) size 0x19 LayoutText {#text} at (0,3700) size 90x19 text run at (0,3700) width 90: "WWWWWW" - LayoutBR {BR} at (90,3700) size 0x0 + LayoutBR {BR} at (90,3700) size 0x19 LayoutText {#text} at (0,3720) size 90x19 text run at (0,3720) width 90: "WWWWWW" - LayoutBR {BR} at (90,3720) size 0x0 + LayoutBR {BR} at (90,3720) size 0x19 LayoutText {#text} at (0,3740) size 90x19 text run at (0,3740) width 90: "WWWWWW" - LayoutBR {BR} at (90,3740) size 0x0 + LayoutBR {BR} at (90,3740) size 0x19 LayoutText {#text} at (0,3760) size 90x19 text run at (0,3760) width 90: "WWWWWW" - LayoutBR {BR} at (90,3760) size 0x0 + LayoutBR {BR} at (90,3760) size 0x19 LayoutText {#text} at (0,3780) size 90x19 text run at (0,3780) width 90: "WWWWWW" - LayoutBR {BR} at (90,3780) size 0x0 + LayoutBR {BR} at (90,3780) size 0x19 LayoutText {#text} at (0,3800) size 90x19 text run at (0,3800) width 90: "WWWWWW" - LayoutBR {BR} at (90,3800) size 0x0 + LayoutBR {BR} at (90,3800) size 0x19 LayoutText {#text} at (0,3820) size 90x19 text run at (0,3820) width 90: "WWWWWW" - LayoutBR {BR} at (90,3820) size 0x0 + LayoutBR {BR} at (90,3820) size 0x19 LayoutText {#text} at (0,3840) size 90x19 text run at (0,3840) width 90: "WWWWWW" - LayoutBR {BR} at (90,3840) size 0x0 + LayoutBR {BR} at (90,3840) size 0x19 LayoutText {#text} at (0,3860) size 90x19 text run at (0,3860) width 90: "WWWWWW" - LayoutBR {BR} at (90,3860) size 0x0 + LayoutBR {BR} at (90,3860) size 0x19 LayoutText {#text} at (0,3880) size 90x19 text run at (0,3880) width 90: "WWWWWW" - LayoutBR {BR} at (90,3880) size 0x0 + LayoutBR {BR} at (90,3880) size 0x19 LayoutText {#text} at (0,3900) size 90x19 text run at (0,3900) width 90: "WWWWWW" - LayoutBR {BR} at (90,3900) size 0x0 + LayoutBR {BR} at (90,3900) size 0x19 LayoutText {#text} at (0,3920) size 90x19 text run at (0,3920) width 90: "WWWWWW" - LayoutBR {BR} at (90,3920) size 0x0 + LayoutBR {BR} at (90,3920) size 0x19 LayoutText {#text} at (0,3940) size 90x19 text run at (0,3940) width 90: "WWWWWW" - LayoutBR {BR} at (90,3940) size 0x0 + LayoutBR {BR} at (90,3940) size 0x19 LayoutText {#text} at (0,3960) size 90x19 text run at (0,3960) width 90: "WWWWWW" - LayoutBR {BR} at (90,3960) size 0x0 + LayoutBR {BR} at (90,3960) size 0x19 LayoutText {#text} at (0,3980) size 90x19 text run at (0,3980) width 90: "WWWWWW" - LayoutBR {BR} at (90,3980) size 0x0 + LayoutBR {BR} at (90,3980) size 0x19 LayoutText {#text} at (0,4000) size 90x19 text run at (0,4000) width 90: "WWWWWW" - LayoutBR {BR} at (90,4000) size 0x0 + LayoutBR {BR} at (90,4000) size 0x19 LayoutText {#text} at (0,4020) size 90x19 text run at (0,4020) width 90: "WWWWWW" - LayoutBR {BR} at (90,4020) size 0x0 + LayoutBR {BR} at (90,4020) size 0x19 LayoutText {#text} at (0,4040) size 90x19 text run at (0,4040) width 90: "WWWWWW" - LayoutBR {BR} at (90,4040) size 0x0 + LayoutBR {BR} at (90,4040) size 0x19 LayoutText {#text} at (0,4060) size 90x19 text run at (0,4060) width 90: "WWWWWW" - LayoutBR {BR} at (90,4060) size 0x0 + LayoutBR {BR} at (90,4060) size 0x19 LayoutText {#text} at (0,4080) size 90x19 text run at (0,4080) width 90: "WWWWWW" - LayoutBR {BR} at (90,4080) size 0x0 + LayoutBR {BR} at (90,4080) size 0x19 LayoutText {#text} at (0,4100) size 90x19 text run at (0,4100) width 90: "WWWWWW" - LayoutBR {BR} at (90,4100) size 0x0 + LayoutBR {BR} at (90,4100) size 0x19 LayoutText {#text} at (0,4120) size 90x19 text run at (0,4120) width 90: "WWWWWW" - LayoutBR {BR} at (90,4120) size 0x0 + LayoutBR {BR} at (90,4120) size 0x19 LayoutText {#text} at (0,4140) size 90x19 text run at (0,4140) width 90: "WWWWWW" - LayoutBR {BR} at (90,4140) size 0x0 + LayoutBR {BR} at (90,4140) size 0x19 LayoutText {#text} at (0,4160) size 90x19 text run at (0,4160) width 90: "WWWWWW" - LayoutBR {BR} at (90,4160) size 0x0 + LayoutBR {BR} at (90,4160) size 0x19 LayoutText {#text} at (0,4180) size 90x19 text run at (0,4180) width 90: "WWWWWW" - LayoutBR {BR} at (90,4180) size 0x0 + LayoutBR {BR} at (90,4180) size 0x19 LayoutText {#text} at (0,4200) size 90x19 text run at (0,4200) width 90: "WWWWWW" - LayoutBR {BR} at (90,4200) size 0x0 + LayoutBR {BR} at (90,4200) size 0x19 LayoutText {#text} at (0,4220) size 90x19 text run at (0,4220) width 90: "WWWWWW" - LayoutBR {BR} at (90,4220) size 0x0 + LayoutBR {BR} at (90,4220) size 0x19 LayoutText {#text} at (0,4240) size 90x19 text run at (0,4240) width 90: "WWWWWW" - LayoutBR {BR} at (90,4240) size 0x0 + LayoutBR {BR} at (90,4240) size 0x19 LayoutText {#text} at (0,4260) size 90x19 text run at (0,4260) width 90: "WWWWWW" - LayoutBR {BR} at (90,4260) size 0x0 + LayoutBR {BR} at (90,4260) size 0x19 LayoutText {#text} at (0,4280) size 90x19 text run at (0,4280) width 90: "WWWWWW" - LayoutBR {BR} at (90,4280) size 0x0 + LayoutBR {BR} at (90,4280) size 0x19 LayoutText {#text} at (0,4300) size 90x19 text run at (0,4300) width 90: "WWWWWW" - LayoutBR {BR} at (90,4300) size 0x0 + LayoutBR {BR} at (90,4300) size 0x19 LayoutText {#text} at (0,4320) size 90x19 text run at (0,4320) width 90: "WWWWWW" - LayoutBR {BR} at (90,4320) size 0x0 + LayoutBR {BR} at (90,4320) size 0x19 LayoutText {#text} at (0,4340) size 90x19 text run at (0,4340) width 90: "WWWWWW" - LayoutBR {BR} at (90,4340) size 0x0 + LayoutBR {BR} at (90,4340) size 0x19 LayoutText {#text} at (0,4360) size 90x19 text run at (0,4360) width 90: "WWWWWW" - LayoutBR {BR} at (90,4360) size 0x0 + LayoutBR {BR} at (90,4360) size 0x19 LayoutText {#text} at (0,4380) size 90x19 text run at (0,4380) width 90: "WWWWWW" - LayoutBR {BR} at (90,4380) size 0x0 + LayoutBR {BR} at (90,4380) size 0x19 LayoutText {#text} at (0,4400) size 90x19 text run at (0,4400) width 90: "WWWWWW" - LayoutBR {BR} at (90,4400) size 0x0 + LayoutBR {BR} at (90,4400) size 0x19 LayoutText {#text} at (0,4420) size 90x19 text run at (0,4420) width 90: "WWWWWW" - LayoutBR {BR} at (90,4420) size 0x0 + LayoutBR {BR} at (90,4420) size 0x19 LayoutText {#text} at (0,4440) size 90x19 text run at (0,4440) width 90: "WWWWWW" - LayoutBR {BR} at (90,4440) size 0x0 + LayoutBR {BR} at (90,4440) size 0x19 LayoutText {#text} at (0,4460) size 90x19 text run at (0,4460) width 90: "WWWWWW" - LayoutBR {BR} at (90,4460) size 0x0 + LayoutBR {BR} at (90,4460) size 0x19 LayoutText {#text} at (0,4480) size 90x19 text run at (0,4480) width 90: "WWWWWW" - LayoutBR {BR} at (90,4480) size 0x0 + LayoutBR {BR} at (90,4480) size 0x19 LayoutText {#text} at (0,4500) size 90x19 text run at (0,4500) width 90: "WWWWWW" - LayoutBR {BR} at (90,4500) size 0x0 + LayoutBR {BR} at (90,4500) size 0x19 LayoutText {#text} at (0,4520) size 90x19 text run at (0,4520) width 90: "WWWWWW" - LayoutBR {BR} at (90,4520) size 0x0 + LayoutBR {BR} at (90,4520) size 0x19 LayoutText {#text} at (0,4540) size 90x19 text run at (0,4540) width 90: "WWWWWW" - LayoutBR {BR} at (90,4540) size 0x0 + LayoutBR {BR} at (90,4540) size 0x19 LayoutText {#text} at (0,4560) size 90x19 text run at (0,4560) width 90: "WWWWWW" - LayoutBR {BR} at (90,4560) size 0x0 + LayoutBR {BR} at (90,4560) size 0x19 LayoutText {#text} at (0,4580) size 90x19 text run at (0,4580) width 90: "WWWWWW" - LayoutBR {BR} at (90,4580) size 0x0 + LayoutBR {BR} at (90,4580) size 0x19 LayoutText {#text} at (0,4600) size 90x19 text run at (0,4600) width 90: "WWWWWW" - LayoutBR {BR} at (90,4600) size 0x0 + LayoutBR {BR} at (90,4600) size 0x19 LayoutText {#text} at (0,4620) size 90x19 text run at (0,4620) width 90: "WWWWWW" - LayoutBR {BR} at (90,4620) size 0x0 + LayoutBR {BR} at (90,4620) size 0x19 LayoutText {#text} at (0,4640) size 90x19 text run at (0,4640) width 90: "WWWWWW" - LayoutBR {BR} at (90,4640) size 0x0 + LayoutBR {BR} at (90,4640) size 0x19 LayoutText {#text} at (0,4660) size 90x19 text run at (0,4660) width 90: "WWWWWW" - LayoutBR {BR} at (90,4660) size 0x0 + LayoutBR {BR} at (90,4660) size 0x19 LayoutText {#text} at (0,4680) size 90x19 text run at (0,4680) width 90: "WWWWWW" - LayoutBR {BR} at (90,4680) size 0x0 + LayoutBR {BR} at (90,4680) size 0x19 LayoutText {#text} at (0,4700) size 90x19 text run at (0,4700) width 90: "WWWWWW" - LayoutBR {BR} at (90,4700) size 0x0 + LayoutBR {BR} at (90,4700) size 0x19 LayoutText {#text} at (0,4720) size 90x19 text run at (0,4720) width 90: "WWWWWW" - LayoutBR {BR} at (90,4720) size 0x0 + LayoutBR {BR} at (90,4720) size 0x19 LayoutText {#text} at (0,4740) size 90x19 text run at (0,4740) width 90: "WWWWWW" - LayoutBR {BR} at (90,4740) size 0x0 + LayoutBR {BR} at (90,4740) size 0x19 LayoutText {#text} at (0,4760) size 90x19 text run at (0,4760) width 90: "WWWWWW" - LayoutBR {BR} at (90,4760) size 0x0 + LayoutBR {BR} at (90,4760) size 0x19 LayoutText {#text} at (0,4780) size 90x19 text run at (0,4780) width 90: "WWWWWW" - LayoutBR {BR} at (90,4780) size 0x0 + LayoutBR {BR} at (90,4780) size 0x19 LayoutText {#text} at (0,4800) size 90x19 text run at (0,4800) width 90: "WWWWWW" - LayoutBR {BR} at (90,4800) size 0x0 + LayoutBR {BR} at (90,4800) size 0x19 LayoutText {#text} at (0,4820) size 90x19 text run at (0,4820) width 90: "WWWWWW" - LayoutBR {BR} at (90,4820) size 0x0 + LayoutBR {BR} at (90,4820) size 0x19 LayoutText {#text} at (0,4840) size 90x19 text run at (0,4840) width 90: "WWWWWW" - LayoutBR {BR} at (90,4840) size 0x0 + LayoutBR {BR} at (90,4840) size 0x19 LayoutText {#text} at (0,4860) size 90x19 text run at (0,4860) width 90: "WWWWWW" - LayoutBR {BR} at (90,4860) size 0x0 + LayoutBR {BR} at (90,4860) size 0x19 LayoutText {#text} at (0,4880) size 90x19 text run at (0,4880) width 90: "WWWWWW" - LayoutBR {BR} at (90,4880) size 0x0 + LayoutBR {BR} at (90,4880) size 0x19 LayoutText {#text} at (0,4900) size 90x19 text run at (0,4900) width 90: "WWWWWW" - LayoutBR {BR} at (90,4900) size 0x0 + LayoutBR {BR} at (90,4900) size 0x19 LayoutText {#text} at (0,4920) size 90x19 text run at (0,4920) width 90: "WWWWWW" - LayoutBR {BR} at (90,4920) size 0x0 + LayoutBR {BR} at (90,4920) size 0x19 LayoutText {#text} at (0,4940) size 90x19 text run at (0,4940) width 90: "WWWWWW" - LayoutBR {BR} at (90,4940) size 0x0 + LayoutBR {BR} at (90,4940) size 0x19 LayoutText {#text} at (0,4960) size 90x19 text run at (0,4960) width 90: "WWWWWW" - LayoutBR {BR} at (90,4960) size 0x0 + LayoutBR {BR} at (90,4960) size 0x19 LayoutText {#text} at (0,4980) size 90x19 text run at (0,4980) width 90: "WWWWWW" - LayoutBR {BR} at (90,4980) size 0x0 + LayoutBR {BR} at (90,4980) size 0x19 LayoutText {#text} at (0,5000) size 90x19 text run at (0,5000) width 90: "WWWWWW" - LayoutBR {BR} at (90,5000) size 0x0 + LayoutBR {BR} at (90,5000) size 0x19 LayoutText {#text} at (0,5020) size 90x19 text run at (0,5020) width 90: "WWWWWW" - LayoutBR {BR} at (90,5020) size 0x0 + LayoutBR {BR} at (90,5020) size 0x19 LayoutText {#text} at (0,5040) size 90x19 text run at (0,5040) width 90: "WWWWWW" - LayoutBR {BR} at (90,5040) size 0x0 + LayoutBR {BR} at (90,5040) size 0x19 LayoutText {#text} at (0,5060) size 90x19 text run at (0,5060) width 90: "WWWWWW" - LayoutBR {BR} at (90,5060) size 0x0 + LayoutBR {BR} at (90,5060) size 0x19 LayoutText {#text} at (0,5080) size 90x19 text run at (0,5080) width 90: "WWWWWW" - LayoutBR {BR} at (90,5080) size 0x0 + LayoutBR {BR} at (90,5080) size 0x19 LayoutText {#text} at (0,5100) size 90x19 text run at (0,5100) width 90: "WWWWWW" - LayoutBR {BR} at (90,5100) size 0x0 + LayoutBR {BR} at (90,5100) size 0x19 LayoutText {#text} at (0,5120) size 90x19 text run at (0,5120) width 90: "WWWWWW" - LayoutBR {BR} at (90,5120) size 0x0 + LayoutBR {BR} at (90,5120) size 0x19 LayoutText {#text} at (0,5140) size 90x19 text run at (0,5140) width 90: "WWWWWW" - LayoutBR {BR} at (90,5140) size 0x0 + LayoutBR {BR} at (90,5140) size 0x19 LayoutText {#text} at (0,5160) size 90x19 text run at (0,5160) width 90: "WWWWWW" - LayoutBR {BR} at (90,5160) size 0x0 + LayoutBR {BR} at (90,5160) size 0x19 LayoutText {#text} at (0,5180) size 90x19 text run at (0,5180) width 90: "WWWWWW" - LayoutBR {BR} at (90,5180) size 0x0 + LayoutBR {BR} at (90,5180) size 0x19 LayoutText {#text} at (0,5200) size 90x19 text run at (0,5200) width 90: "WWWWWW" - LayoutBR {BR} at (90,5200) size 0x0 + LayoutBR {BR} at (90,5200) size 0x19 LayoutText {#text} at (0,5220) size 90x19 text run at (0,5220) width 90: "WWWWWW" - LayoutBR {BR} at (90,5220) size 0x0 + LayoutBR {BR} at (90,5220) size 0x19 LayoutText {#text} at (0,5240) size 90x19 text run at (0,5240) width 90: "WWWWWW" - LayoutBR {BR} at (90,5240) size 0x0 + LayoutBR {BR} at (90,5240) size 0x19 LayoutText {#text} at (0,5260) size 90x19 text run at (0,5260) width 90: "WWWWWW" - LayoutBR {BR} at (90,5260) size 0x0 + LayoutBR {BR} at (90,5260) size 0x19 LayoutText {#text} at (0,5280) size 90x19 text run at (0,5280) width 90: "WWWWWW" - LayoutBR {BR} at (90,5280) size 0x0 + LayoutBR {BR} at (90,5280) size 0x19 LayoutText {#text} at (0,5300) size 90x19 text run at (0,5300) width 90: "WWWWWW" - LayoutBR {BR} at (90,5300) size 0x0 + LayoutBR {BR} at (90,5300) size 0x19 LayoutText {#text} at (0,5320) size 90x19 text run at (0,5320) width 90: "WWWWWW" - LayoutBR {BR} at (90,5320) size 0x0 + LayoutBR {BR} at (90,5320) size 0x19 LayoutText {#text} at (0,5340) size 90x19 text run at (0,5340) width 90: "WWWWWW" - LayoutBR {BR} at (90,5340) size 0x0 + LayoutBR {BR} at (90,5340) size 0x19 LayoutText {#text} at (0,5360) size 90x19 text run at (0,5360) width 90: "WWWWWW" - LayoutBR {BR} at (90,5360) size 0x0 + LayoutBR {BR} at (90,5360) size 0x19 LayoutText {#text} at (0,5380) size 90x19 text run at (0,5380) width 90: "WWWWWW" - LayoutBR {BR} at (90,5380) size 0x0 + LayoutBR {BR} at (90,5380) size 0x19 LayoutText {#text} at (0,5400) size 90x19 text run at (0,5400) width 90: "WWWWWW" - LayoutBR {BR} at (90,5400) size 0x0 + LayoutBR {BR} at (90,5400) size 0x19 LayoutText {#text} at (0,5420) size 90x19 text run at (0,5420) width 90: "WWWWWW" - LayoutBR {BR} at (90,5420) size 0x0 + LayoutBR {BR} at (90,5420) size 0x19 LayoutText {#text} at (0,5440) size 90x19 text run at (0,5440) width 90: "WWWWWW" - LayoutBR {BR} at (90,5440) size 0x0 + LayoutBR {BR} at (90,5440) size 0x19 LayoutText {#text} at (0,5460) size 90x19 text run at (0,5460) width 90: "WWWWWW" - LayoutBR {BR} at (90,5460) size 0x0 + LayoutBR {BR} at (90,5460) size 0x19 LayoutText {#text} at (0,5480) size 90x19 text run at (0,5480) width 90: "WWWWWW" - LayoutBR {BR} at (90,5480) size 0x0 + LayoutBR {BR} at (90,5480) size 0x19 LayoutText {#text} at (0,5500) size 90x19 text run at (0,5500) width 90: "WWWWWW" - LayoutBR {BR} at (90,5500) size 0x0 + LayoutBR {BR} at (90,5500) size 0x19 LayoutText {#text} at (0,5520) size 90x19 text run at (0,5520) width 90: "WWWWWW" - LayoutBR {BR} at (90,5520) size 0x0 + LayoutBR {BR} at (90,5520) size 0x19 LayoutText {#text} at (0,5540) size 90x19 text run at (0,5540) width 90: "WWWWWW" - LayoutBR {BR} at (90,5540) size 0x0 + LayoutBR {BR} at (90,5540) size 0x19 LayoutText {#text} at (0,5560) size 90x19 text run at (0,5560) width 90: "WWWWWW" - LayoutBR {BR} at (90,5560) size 0x0 + LayoutBR {BR} at (90,5560) size 0x19 LayoutText {#text} at (0,5580) size 90x19 text run at (0,5580) width 90: "WWWWWW" - LayoutBR {BR} at (90,5580) size 0x0 + LayoutBR {BR} at (90,5580) size 0x19 LayoutText {#text} at (0,5600) size 90x19 text run at (0,5600) width 90: "WWWWWW" - LayoutBR {BR} at (90,5600) size 0x0 + LayoutBR {BR} at (90,5600) size 0x19 LayoutText {#text} at (0,5620) size 90x19 text run at (0,5620) width 90: "WWWWWW" - LayoutBR {BR} at (90,5620) size 0x0 + LayoutBR {BR} at (90,5620) size 0x19 LayoutText {#text} at (0,5640) size 90x19 text run at (0,5640) width 90: "WWWWWW" - LayoutBR {BR} at (90,5640) size 0x0 + LayoutBR {BR} at (90,5640) size 0x19 LayoutText {#text} at (0,5660) size 90x19 text run at (0,5660) width 90: "WWWWWW" - LayoutBR {BR} at (90,5660) size 0x0 + LayoutBR {BR} at (90,5660) size 0x19 LayoutText {#text} at (0,5680) size 90x19 text run at (0,5680) width 90: "WWWWWW" - LayoutBR {BR} at (90,5680) size 0x0 + LayoutBR {BR} at (90,5680) size 0x19 LayoutText {#text} at (0,5700) size 90x19 text run at (0,5700) width 90: "WWWWWW" - LayoutBR {BR} at (90,5700) size 0x0 + LayoutBR {BR} at (90,5700) size 0x19 LayoutText {#text} at (0,5720) size 90x19 text run at (0,5720) width 90: "WWWWWW" - LayoutBR {BR} at (90,5720) size 0x0 + LayoutBR {BR} at (90,5720) size 0x19 LayoutText {#text} at (0,5740) size 90x19 text run at (0,5740) width 90: "WWWWWW" - LayoutBR {BR} at (90,5740) size 0x0 + LayoutBR {BR} at (90,5740) size 0x19 LayoutText {#text} at (0,5760) size 90x19 text run at (0,5760) width 90: "WWWWWW" - LayoutBR {BR} at (90,5760) size 0x0 + LayoutBR {BR} at (90,5760) size 0x19 LayoutText {#text} at (0,5780) size 90x19 text run at (0,5780) width 90: "WWWWWW" - LayoutBR {BR} at (90,5780) size 0x0 + LayoutBR {BR} at (90,5780) size 0x19 LayoutText {#text} at (0,5800) size 90x19 text run at (0,5800) width 90: "WWWWWW" - LayoutBR {BR} at (90,5800) size 0x0 + LayoutBR {BR} at (90,5800) size 0x19 LayoutText {#text} at (0,5820) size 90x19 text run at (0,5820) width 90: "WWWWWW" - LayoutBR {BR} at (90,5820) size 0x0 + LayoutBR {BR} at (90,5820) size 0x19 LayoutText {#text} at (0,5840) size 90x19 text run at (0,5840) width 90: "WWWWWW" - LayoutBR {BR} at (90,5840) size 0x0 + LayoutBR {BR} at (90,5840) size 0x19 LayoutText {#text} at (0,5860) size 90x19 text run at (0,5860) width 90: "WWWWWW" - LayoutBR {BR} at (90,5860) size 0x0 + LayoutBR {BR} at (90,5860) size 0x19 LayoutText {#text} at (0,5880) size 90x19 text run at (0,5880) width 90: "WWWWWW" - LayoutBR {BR} at (90,5880) size 0x0 + LayoutBR {BR} at (90,5880) size 0x19 LayoutText {#text} at (0,5900) size 90x19 text run at (0,5900) width 90: "WWWWWW" - LayoutBR {BR} at (90,5900) size 0x0 + LayoutBR {BR} at (90,5900) size 0x19 LayoutText {#text} at (0,5920) size 90x19 text run at (0,5920) width 90: "WWWWWW" - LayoutBR {BR} at (90,5920) size 0x0 + LayoutBR {BR} at (90,5920) size 0x19 LayoutText {#text} at (0,5940) size 90x19 text run at (0,5940) width 90: "WWWWWW" - LayoutBR {BR} at (90,5940) size 0x0 + LayoutBR {BR} at (90,5940) size 0x19 LayoutText {#text} at (0,5960) size 90x19 text run at (0,5960) width 90: "WWWWWW" - LayoutBR {BR} at (90,5960) size 0x0 + LayoutBR {BR} at (90,5960) size 0x19 LayoutText {#text} at (0,5980) size 90x19 text run at (0,5980) width 90: "WWWWWW" - LayoutBR {BR} at (90,5980) size 0x0 + LayoutBR {BR} at (90,5980) size 0x19 LayoutText {#text} at (0,6000) size 90x19 text run at (0,6000) width 90: "WWWWWW" - LayoutBR {BR} at (90,6000) size 0x0 + LayoutBR {BR} at (90,6000) size 0x19 LayoutText {#text} at (0,6020) size 90x19 text run at (0,6020) width 90: "WWWWWW" - LayoutBR {BR} at (90,6020) size 0x0 + LayoutBR {BR} at (90,6020) size 0x19 LayoutText {#text} at (0,6040) size 90x19 text run at (0,6040) width 90: "WWWWWW" - LayoutBR {BR} at (90,6040) size 0x0 + LayoutBR {BR} at (90,6040) size 0x19 LayoutText {#text} at (0,6060) size 90x19 text run at (0,6060) width 90: "WWWWWW" - LayoutBR {BR} at (90,6060) size 0x0 + LayoutBR {BR} at (90,6060) size 0x19 LayoutText {#text} at (0,6080) size 90x19 text run at (0,6080) width 90: "WWWWWW" - LayoutBR {BR} at (90,6080) size 0x0 + LayoutBR {BR} at (90,6080) size 0x19 LayoutText {#text} at (0,6100) size 90x19 text run at (0,6100) width 90: "WWWWWW" - LayoutBR {BR} at (90,6100) size 0x0 + LayoutBR {BR} at (90,6100) size 0x19 LayoutText {#text} at (0,6120) size 90x19 text run at (0,6120) width 90: "WWWWWW" - LayoutBR {BR} at (90,6120) size 0x0 + LayoutBR {BR} at (90,6120) size 0x19 LayoutText {#text} at (0,6140) size 90x19 text run at (0,6140) width 90: "WWWWWW" - LayoutBR {BR} at (90,6140) size 0x0 + LayoutBR {BR} at (90,6140) size 0x19 LayoutText {#text} at (0,6160) size 90x19 text run at (0,6160) width 90: "WWWWWW" - LayoutBR {BR} at (90,6160) size 0x0 + LayoutBR {BR} at (90,6160) size 0x19 LayoutText {#text} at (0,6180) size 90x19 text run at (0,6180) width 90: "WWWWWW" - LayoutBR {BR} at (90,6180) size 0x0 + LayoutBR {BR} at (90,6180) size 0x19 LayoutText {#text} at (0,6200) size 90x19 text run at (0,6200) width 90: "WWWWWW" - LayoutBR {BR} at (90,6200) size 0x0 + LayoutBR {BR} at (90,6200) size 0x19 LayoutText {#text} at (0,6220) size 90x19 text run at (0,6220) width 90: "WWWWWW" - LayoutBR {BR} at (90,6220) size 0x0 + LayoutBR {BR} at (90,6220) size 0x19 LayoutText {#text} at (0,6240) size 90x19 text run at (0,6240) width 90: "WWWWWW" - LayoutBR {BR} at (90,6240) size 0x0 + LayoutBR {BR} at (90,6240) size 0x19 LayoutText {#text} at (0,6260) size 90x19 text run at (0,6260) width 90: "WWWWWW" - LayoutBR {BR} at (90,6260) size 0x0 + LayoutBR {BR} at (90,6260) size 0x19 LayoutText {#text} at (0,6280) size 90x19 text run at (0,6280) width 90: "WWWWWW" - LayoutBR {BR} at (90,6280) size 0x0 + LayoutBR {BR} at (90,6280) size 0x19 LayoutText {#text} at (0,6300) size 90x19 text run at (0,6300) width 90: "WWWWWW" - LayoutBR {BR} at (90,6300) size 0x0 + LayoutBR {BR} at (90,6300) size 0x19 LayoutText {#text} at (0,6320) size 90x19 text run at (0,6320) width 90: "WWWWWW" - LayoutBR {BR} at (90,6320) size 0x0 + LayoutBR {BR} at (90,6320) size 0x19 LayoutText {#text} at (0,6340) size 90x19 text run at (0,6340) width 90: "WWWWWW" - LayoutBR {BR} at (90,6340) size 0x0 + LayoutBR {BR} at (90,6340) size 0x19 LayoutText {#text} at (0,6360) size 90x19 text run at (0,6360) width 90: "WWWWWW" - LayoutBR {BR} at (90,6360) size 0x0 + LayoutBR {BR} at (90,6360) size 0x19 LayoutText {#text} at (0,6380) size 90x19 text run at (0,6380) width 90: "WWWWWW" - LayoutBR {BR} at (90,6380) size 0x0 + LayoutBR {BR} at (90,6380) size 0x19 LayoutText {#text} at (0,6400) size 90x19 text run at (0,6400) width 90: "WWWWWW" - LayoutBR {BR} at (90,6400) size 0x0 + LayoutBR {BR} at (90,6400) size 0x19 LayoutText {#text} at (0,6420) size 90x19 text run at (0,6420) width 90: "WWWWWW" - LayoutBR {BR} at (90,6420) size 0x0 + LayoutBR {BR} at (90,6420) size 0x19 LayoutText {#text} at (0,6440) size 90x19 text run at (0,6440) width 90: "WWWWWW" - LayoutBR {BR} at (90,6440) size 0x0 + LayoutBR {BR} at (90,6440) size 0x19 LayoutText {#text} at (0,6460) size 90x19 text run at (0,6460) width 90: "WWWWWW" - LayoutBR {BR} at (90,6460) size 0x0 + LayoutBR {BR} at (90,6460) size 0x19 LayoutText {#text} at (0,6480) size 90x19 text run at (0,6480) width 90: "WWWWWW" - LayoutBR {BR} at (90,6480) size 0x0 + LayoutBR {BR} at (90,6480) size 0x19 LayoutText {#text} at (0,6500) size 90x19 text run at (0,6500) width 90: "WWWWWW" - LayoutBR {BR} at (90,6500) size 0x0 + LayoutBR {BR} at (90,6500) size 0x19 LayoutText {#text} at (0,6520) size 90x19 text run at (0,6520) width 90: "WWWWWW" - LayoutBR {BR} at (90,6520) size 0x0 + LayoutBR {BR} at (90,6520) size 0x19 LayoutText {#text} at (0,6540) size 90x19 text run at (0,6540) width 90: "WWWWWW" - LayoutBR {BR} at (90,6540) size 0x0 + LayoutBR {BR} at (90,6540) size 0x19 LayoutText {#text} at (0,6560) size 90x19 text run at (0,6560) width 90: "WWWWWW" - LayoutBR {BR} at (90,6560) size 0x0 + LayoutBR {BR} at (90,6560) size 0x19 LayoutText {#text} at (0,6580) size 90x19 text run at (0,6580) width 90: "WWWWWW" - LayoutBR {BR} at (90,6580) size 0x0 + LayoutBR {BR} at (90,6580) size 0x19 LayoutText {#text} at (0,6600) size 90x19 text run at (0,6600) width 90: "WWWWWW" - LayoutBR {BR} at (90,6600) size 0x0 + LayoutBR {BR} at (90,6600) size 0x19 LayoutText {#text} at (0,6620) size 90x19 text run at (0,6620) width 90: "WWWWWW" - LayoutBR {BR} at (90,6620) size 0x0 + LayoutBR {BR} at (90,6620) size 0x19 LayoutText {#text} at (0,6640) size 90x19 text run at (0,6640) width 90: "WWWWWW" - LayoutBR {BR} at (90,6640) size 0x0 + LayoutBR {BR} at (90,6640) size 0x19 LayoutText {#text} at (0,6660) size 90x19 text run at (0,6660) width 90: "WWWWWW" - LayoutBR {BR} at (90,6660) size 0x0 + LayoutBR {BR} at (90,6660) size 0x19 LayoutText {#text} at (0,6680) size 90x19 text run at (0,6680) width 90: "WWWWWW" - LayoutBR {BR} at (90,6680) size 0x0 + LayoutBR {BR} at (90,6680) size 0x19 LayoutText {#text} at (0,6700) size 90x19 text run at (0,6700) width 90: "WWWWWW" - LayoutBR {BR} at (90,6700) size 0x0 + LayoutBR {BR} at (90,6700) size 0x19 LayoutText {#text} at (0,6720) size 90x19 text run at (0,6720) width 90: "WWWWWW" - LayoutBR {BR} at (90,6720) size 0x0 + LayoutBR {BR} at (90,6720) size 0x19 LayoutText {#text} at (0,6740) size 90x19 text run at (0,6740) width 90: "WWWWWW" - LayoutBR {BR} at (90,6740) size 0x0 + LayoutBR {BR} at (90,6740) size 0x19 LayoutText {#text} at (0,6760) size 90x19 text run at (0,6760) width 90: "WWWWWW" - LayoutBR {BR} at (90,6760) size 0x0 + LayoutBR {BR} at (90,6760) size 0x19 LayoutText {#text} at (0,6780) size 90x19 text run at (0,6780) width 90: "WWWWWW" - LayoutBR {BR} at (90,6780) size 0x0 + LayoutBR {BR} at (90,6780) size 0x19 LayoutText {#text} at (0,6800) size 90x19 text run at (0,6800) width 90: "WWWWWW" - LayoutBR {BR} at (90,6800) size 0x0 + LayoutBR {BR} at (90,6800) size 0x19 LayoutText {#text} at (0,6820) size 90x19 text run at (0,6820) width 90: "WWWWWW" - LayoutBR {BR} at (90,6820) size 0x0 + LayoutBR {BR} at (90,6820) size 0x19 LayoutText {#text} at (0,6840) size 90x19 text run at (0,6840) width 90: "WWWWWW" - LayoutBR {BR} at (90,6840) size 0x0 + LayoutBR {BR} at (90,6840) size 0x19 LayoutText {#text} at (0,6860) size 90x19 text run at (0,6860) width 90: "WWWWWW" - LayoutBR {BR} at (90,6860) size 0x0 + LayoutBR {BR} at (90,6860) size 0x19 LayoutText {#text} at (0,6880) size 90x19 text run at (0,6880) width 90: "WWWWWW" - LayoutBR {BR} at (90,6880) size 0x0 + LayoutBR {BR} at (90,6880) size 0x19 LayoutText {#text} at (0,6900) size 90x19 text run at (0,6900) width 90: "WWWWWW" - LayoutBR {BR} at (90,6900) size 0x0 + LayoutBR {BR} at (90,6900) size 0x19 LayoutText {#text} at (0,6920) size 90x19 text run at (0,6920) width 90: "WWWWWW" - LayoutBR {BR} at (90,6920) size 0x0 + LayoutBR {BR} at (90,6920) size 0x19 LayoutText {#text} at (0,6940) size 90x19 text run at (0,6940) width 90: "WWWWWW" - LayoutBR {BR} at (90,6940) size 0x0 + LayoutBR {BR} at (90,6940) size 0x19 LayoutText {#text} at (0,6960) size 90x19 text run at (0,6960) width 90: "WWWWWW" - LayoutBR {BR} at (90,6960) size 0x0 + LayoutBR {BR} at (90,6960) size 0x19 LayoutText {#text} at (0,6980) size 90x19 text run at (0,6980) width 90: "WWWWWW" - LayoutBR {BR} at (90,6980) size 0x0 + LayoutBR {BR} at (90,6980) size 0x19 LayoutText {#text} at (0,7000) size 90x19 text run at (0,7000) width 90: "WWWWWW" - LayoutBR {BR} at (90,7000) size 0x0 + LayoutBR {BR} at (90,7000) size 0x19 LayoutText {#text} at (0,7020) size 90x19 text run at (0,7020) width 90: "WWWWWW" - LayoutBR {BR} at (90,7020) size 0x0 + LayoutBR {BR} at (90,7020) size 0x19 LayoutText {#text} at (0,7040) size 90x19 text run at (0,7040) width 90: "WWWWWW" - LayoutBR {BR} at (90,7040) size 0x0 + LayoutBR {BR} at (90,7040) size 0x19 LayoutText {#text} at (0,7060) size 90x19 text run at (0,7060) width 90: "WWWWWW" - LayoutBR {BR} at (90,7060) size 0x0 + LayoutBR {BR} at (90,7060) size 0x19 LayoutText {#text} at (0,7080) size 90x19 text run at (0,7080) width 90: "WWWWWW" - LayoutBR {BR} at (90,7080) size 0x0 + LayoutBR {BR} at (90,7080) size 0x19 LayoutText {#text} at (0,7100) size 90x19 text run at (0,7100) width 90: "WWWWWW" - LayoutBR {BR} at (90,7100) size 0x0 + LayoutBR {BR} at (90,7100) size 0x19 LayoutText {#text} at (0,7120) size 90x19 text run at (0,7120) width 90: "WWWWWW" - LayoutBR {BR} at (90,7120) size 0x0 + LayoutBR {BR} at (90,7120) size 0x19 LayoutText {#text} at (0,7140) size 90x19 text run at (0,7140) width 90: "WWWWWW" - LayoutBR {BR} at (90,7140) size 0x0 + LayoutBR {BR} at (90,7140) size 0x19 LayoutText {#text} at (0,7160) size 90x19 text run at (0,7160) width 90: "WWWWWW" - LayoutBR {BR} at (90,7160) size 0x0 + LayoutBR {BR} at (90,7160) size 0x19 LayoutText {#text} at (0,7180) size 90x19 text run at (0,7180) width 90: "WWWWWW" - LayoutBR {BR} at (90,7180) size 0x0 + LayoutBR {BR} at (90,7180) size 0x19 LayoutText {#text} at (0,7200) size 90x19 text run at (0,7200) width 90: "WWWWWW" - LayoutBR {BR} at (90,7200) size 0x0 + LayoutBR {BR} at (90,7200) size 0x19 LayoutText {#text} at (0,7220) size 90x19 text run at (0,7220) width 90: "WWWWWW" - LayoutBR {BR} at (90,7220) size 0x0 + LayoutBR {BR} at (90,7220) size 0x19 LayoutText {#text} at (0,7240) size 90x19 text run at (0,7240) width 90: "WWWWWW" - LayoutBR {BR} at (90,7240) size 0x0 + LayoutBR {BR} at (90,7240) size 0x19 LayoutText {#text} at (0,7260) size 90x19 text run at (0,7260) width 90: "WWWWWW" - LayoutBR {BR} at (90,7260) size 0x0 + LayoutBR {BR} at (90,7260) size 0x19 LayoutText {#text} at (0,7280) size 90x19 text run at (0,7280) width 90: "WWWWWW" - LayoutBR {BR} at (90,7280) size 0x0 + LayoutBR {BR} at (90,7280) size 0x19 LayoutText {#text} at (0,7300) size 90x19 text run at (0,7300) width 90: "WWWWWW" - LayoutBR {BR} at (90,7300) size 0x0 + LayoutBR {BR} at (90,7300) size 0x19 LayoutText {#text} at (0,7320) size 90x19 text run at (0,7320) width 90: "WWWWWW" - LayoutBR {BR} at (90,7320) size 0x0 + LayoutBR {BR} at (90,7320) size 0x19 LayoutText {#text} at (0,7340) size 90x19 text run at (0,7340) width 90: "WWWWWW" - LayoutBR {BR} at (90,7340) size 0x0 + LayoutBR {BR} at (90,7340) size 0x19 LayoutText {#text} at (0,7360) size 90x19 text run at (0,7360) width 90: "WWWWWW" - LayoutBR {BR} at (90,7360) size 0x0 + LayoutBR {BR} at (90,7360) size 0x19 LayoutText {#text} at (0,7380) size 90x19 text run at (0,7380) width 90: "WWWWWW" - LayoutBR {BR} at (90,7380) size 0x0 + LayoutBR {BR} at (90,7380) size 0x19 LayoutText {#text} at (0,7400) size 90x19 text run at (0,7400) width 90: "WWWWWW" - LayoutBR {BR} at (90,7400) size 0x0 + LayoutBR {BR} at (90,7400) size 0x19 LayoutText {#text} at (0,7420) size 90x19 text run at (0,7420) width 90: "WWWWWW" - LayoutBR {BR} at (90,7420) size 0x0 + LayoutBR {BR} at (90,7420) size 0x19 LayoutText {#text} at (0,7440) size 90x19 text run at (0,7440) width 90: "WWWWWW" - LayoutBR {BR} at (90,7440) size 0x0 + LayoutBR {BR} at (90,7440) size 0x19 LayoutText {#text} at (0,7460) size 90x19 text run at (0,7460) width 90: "WWWWWW" - LayoutBR {BR} at (90,7460) size 0x0 + LayoutBR {BR} at (90,7460) size 0x19 LayoutText {#text} at (0,7480) size 90x19 text run at (0,7480) width 90: "WWWWWW" - LayoutBR {BR} at (90,7480) size 0x0 + LayoutBR {BR} at (90,7480) size 0x19 LayoutText {#text} at (0,7500) size 90x19 text run at (0,7500) width 90: "WWWWWW" - LayoutBR {BR} at (90,7500) size 0x0 + LayoutBR {BR} at (90,7500) size 0x19 LayoutText {#text} at (0,7520) size 90x19 text run at (0,7520) width 90: "WWWWWW" - LayoutBR {BR} at (90,7520) size 0x0 + LayoutBR {BR} at (90,7520) size 0x19 LayoutText {#text} at (0,7540) size 90x19 text run at (0,7540) width 90: "WWWWWW" - LayoutBR {BR} at (90,7540) size 0x0 + LayoutBR {BR} at (90,7540) size 0x19 LayoutText {#text} at (0,7560) size 90x19 text run at (0,7560) width 90: "WWWWWW" - LayoutBR {BR} at (90,7560) size 0x0 + LayoutBR {BR} at (90,7560) size 0x19 LayoutText {#text} at (0,7580) size 90x19 text run at (0,7580) width 90: "WWWWWW" - LayoutBR {BR} at (90,7580) size 0x0 + LayoutBR {BR} at (90,7580) size 0x19 LayoutText {#text} at (0,7600) size 90x19 text run at (0,7600) width 90: "WWWWWW" - LayoutBR {BR} at (90,7600) size 0x0 + LayoutBR {BR} at (90,7600) size 0x19 LayoutText {#text} at (0,7620) size 90x19 text run at (0,7620) width 90: "WWWWWW" - LayoutBR {BR} at (90,7620) size 0x0 + LayoutBR {BR} at (90,7620) size 0x19 LayoutText {#text} at (0,7640) size 90x19 text run at (0,7640) width 90: "WWWWWW" - LayoutBR {BR} at (90,7640) size 0x0 + LayoutBR {BR} at (90,7640) size 0x19 LayoutText {#text} at (0,7660) size 90x19 text run at (0,7660) width 90: "WWWWWW" - LayoutBR {BR} at (90,7660) size 0x0 + LayoutBR {BR} at (90,7660) size 0x19 LayoutText {#text} at (0,7680) size 90x19 text run at (0,7680) width 90: "WWWWWW" - LayoutBR {BR} at (90,7680) size 0x0 + LayoutBR {BR} at (90,7680) size 0x19 LayoutText {#text} at (0,7700) size 90x19 text run at (0,7700) width 90: "WWWWWW" - LayoutBR {BR} at (90,7700) size 0x0 + LayoutBR {BR} at (90,7700) size 0x19 LayoutText {#text} at (0,7720) size 90x19 text run at (0,7720) width 90: "WWWWWW" - LayoutBR {BR} at (90,7720) size 0x0 + LayoutBR {BR} at (90,7720) size 0x19 LayoutText {#text} at (0,7740) size 90x19 text run at (0,7740) width 90: "WWWWWW" - LayoutBR {BR} at (90,7740) size 0x0 + LayoutBR {BR} at (90,7740) size 0x19 LayoutText {#text} at (0,7760) size 90x19 text run at (0,7760) width 90: "WWWWWW" - LayoutBR {BR} at (90,7760) size 0x0 + LayoutBR {BR} at (90,7760) size 0x19 LayoutText {#text} at (0,7780) size 90x19 text run at (0,7780) width 90: "WWWWWW" - LayoutBR {BR} at (90,7780) size 0x0 + LayoutBR {BR} at (90,7780) size 0x19 LayoutText {#text} at (0,7800) size 90x19 text run at (0,7800) width 90: "WWWWWW" - LayoutBR {BR} at (90,7800) size 0x0 + LayoutBR {BR} at (90,7800) size 0x19 LayoutText {#text} at (0,7820) size 90x19 text run at (0,7820) width 90: "WWWWWW" - LayoutBR {BR} at (90,7820) size 0x0 + LayoutBR {BR} at (90,7820) size 0x19 LayoutText {#text} at (0,7840) size 90x19 text run at (0,7840) width 90: "WWWWWW" - LayoutBR {BR} at (90,7840) size 0x0 + LayoutBR {BR} at (90,7840) size 0x19 LayoutText {#text} at (0,7860) size 90x19 text run at (0,7860) width 90: "WWWWWW" - LayoutBR {BR} at (90,7860) size 0x0 + LayoutBR {BR} at (90,7860) size 0x19 LayoutText {#text} at (0,7880) size 90x19 text run at (0,7880) width 90: "WWWWWW" - LayoutBR {BR} at (90,7880) size 0x0 + LayoutBR {BR} at (90,7880) size 0x19 LayoutText {#text} at (0,7900) size 90x19 text run at (0,7900) width 90: "WWWWWW" - LayoutBR {BR} at (90,7900) size 0x0 + LayoutBR {BR} at (90,7900) size 0x19 LayoutText {#text} at (0,7920) size 90x19 text run at (0,7920) width 90: "WWWWWW" - LayoutBR {BR} at (90,7920) size 0x0 + LayoutBR {BR} at (90,7920) size 0x19 LayoutText {#text} at (0,7940) size 90x19 text run at (0,7940) width 90: "WWWWWW" - LayoutBR {BR} at (90,7940) size 0x0 + LayoutBR {BR} at (90,7940) size 0x19 LayoutText {#text} at (0,7960) size 90x19 text run at (0,7960) width 90: "WWWWWW" - LayoutBR {BR} at (90,7960) size 0x0 + LayoutBR {BR} at (90,7960) size 0x19 LayoutText {#text} at (0,7980) size 90x19 text run at (0,7980) width 90: "WWWWWW" - LayoutBR {BR} at (90,7980) size 0x0 + LayoutBR {BR} at (90,7980) size 0x19 Overflowed lines: layer at (0,0) size 769x8000 backgroundClip at (8,8084) size 769x8000 clip at (8,8084) size 769x8000 LayoutNGBlockFlow (relative positioned) {DIV} at (0,8076) size 769x8000 LayoutText {#text} at (0,0) size 4710x19 text run at (0,0) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,0) size 0x0 + LayoutBR {BR} at (4710,0) size 0x19 LayoutText {#text} at (0,20) size 4710x19 text run at (0,20) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,20) size 0x0 + LayoutBR {BR} at (4710,20) size 0x19 LayoutText {#text} at (0,40) size 4710x19 text run at (0,40) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,40) size 0x0 + LayoutBR {BR} at (4710,40) size 0x19 LayoutText {#text} at (0,60) size 4710x19 text run at (0,60) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,60) size 0x0 + LayoutBR {BR} at (4710,60) size 0x19 LayoutText {#text} at (0,80) size 4710x19 text run at (0,80) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,80) size 0x0 + LayoutBR {BR} at (4710,80) size 0x19 LayoutText {#text} at (0,100) size 4710x19 text run at (0,100) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,100) size 0x0 + LayoutBR {BR} at (4710,100) size 0x19 LayoutText {#text} at (0,120) size 4710x19 text run at (0,120) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,120) size 0x0 + LayoutBR {BR} at (4710,120) size 0x19 LayoutText {#text} at (0,140) size 4710x19 text run at (0,140) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,140) size 0x0 + LayoutBR {BR} at (4710,140) size 0x19 LayoutText {#text} at (0,160) size 4710x19 text run at (0,160) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,160) size 0x0 + LayoutBR {BR} at (4710,160) size 0x19 LayoutText {#text} at (0,180) size 4710x19 text run at (0,180) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,180) size 0x0 + LayoutBR {BR} at (4710,180) size 0x19 LayoutText {#text} at (0,200) size 4710x19 text run at (0,200) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,200) size 0x0 + LayoutBR {BR} at (4710,200) size 0x19 LayoutText {#text} at (0,220) size 4710x19 text run at (0,220) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,220) size 0x0 + LayoutBR {BR} at (4710,220) size 0x19 LayoutText {#text} at (0,240) size 4710x19 text run at (0,240) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,240) size 0x0 + LayoutBR {BR} at (4710,240) size 0x19 LayoutText {#text} at (0,260) size 4710x19 text run at (0,260) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,260) size 0x0 + LayoutBR {BR} at (4710,260) size 0x19 LayoutText {#text} at (0,280) size 4710x19 text run at (0,280) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,280) size 0x0 + LayoutBR {BR} at (4710,280) size 0x19 LayoutText {#text} at (0,300) size 4710x19 text run at (0,300) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,300) size 0x0 + LayoutBR {BR} at (4710,300) size 0x19 LayoutText {#text} at (0,320) size 4710x19 text run at (0,320) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,320) size 0x0 + LayoutBR {BR} at (4710,320) size 0x19 LayoutText {#text} at (0,340) size 4710x19 text run at (0,340) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,340) size 0x0 + LayoutBR {BR} at (4710,340) size 0x19 LayoutText {#text} at (0,360) size 4710x19 text run at (0,360) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,360) size 0x0 + LayoutBR {BR} at (4710,360) size 0x19 LayoutText {#text} at (0,380) size 4710x19 text run at (0,380) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,380) size 0x0 + LayoutBR {BR} at (4710,380) size 0x19 LayoutText {#text} at (0,400) size 4710x19 text run at (0,400) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,400) size 0x0 + LayoutBR {BR} at (4710,400) size 0x19 LayoutText {#text} at (0,420) size 4710x19 text run at (0,420) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,420) size 0x0 + LayoutBR {BR} at (4710,420) size 0x19 LayoutText {#text} at (0,440) size 4710x19 text run at (0,440) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,440) size 0x0 + LayoutBR {BR} at (4710,440) size 0x19 LayoutText {#text} at (0,460) size 4710x19 text run at (0,460) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,460) size 0x0 + LayoutBR {BR} at (4710,460) size 0x19 LayoutText {#text} at (0,480) size 4710x19 text run at (0,480) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,480) size 0x0 + LayoutBR {BR} at (4710,480) size 0x19 LayoutText {#text} at (0,500) size 4710x19 text run at (0,500) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,500) size 0x0 + LayoutBR {BR} at (4710,500) size 0x19 LayoutText {#text} at (0,520) size 4710x19 text run at (0,520) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,520) size 0x0 + LayoutBR {BR} at (4710,520) size 0x19 LayoutText {#text} at (0,540) size 4710x19 text run at (0,540) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,540) size 0x0 + LayoutBR {BR} at (4710,540) size 0x19 LayoutText {#text} at (0,560) size 4710x19 text run at (0,560) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,560) size 0x0 + LayoutBR {BR} at (4710,560) size 0x19 LayoutText {#text} at (0,580) size 4710x19 text run at (0,580) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,580) size 0x0 + LayoutBR {BR} at (4710,580) size 0x19 LayoutText {#text} at (0,600) size 4710x19 text run at (0,600) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,600) size 0x0 + LayoutBR {BR} at (4710,600) size 0x19 LayoutText {#text} at (0,620) size 4710x19 text run at (0,620) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,620) size 0x0 + LayoutBR {BR} at (4710,620) size 0x19 LayoutText {#text} at (0,640) size 4710x19 text run at (0,640) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,640) size 0x0 + LayoutBR {BR} at (4710,640) size 0x19 LayoutText {#text} at (0,660) size 4710x19 text run at (0,660) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,660) size 0x0 + LayoutBR {BR} at (4710,660) size 0x19 LayoutText {#text} at (0,680) size 4710x19 text run at (0,680) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,680) size 0x0 + LayoutBR {BR} at (4710,680) size 0x19 LayoutText {#text} at (0,700) size 4710x19 text run at (0,700) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,700) size 0x0 + LayoutBR {BR} at (4710,700) size 0x19 LayoutText {#text} at (0,720) size 4710x19 text run at (0,720) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,720) size 0x0 + LayoutBR {BR} at (4710,720) size 0x19 LayoutText {#text} at (0,740) size 4710x19 text run at (0,740) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,740) size 0x0 + LayoutBR {BR} at (4710,740) size 0x19 LayoutText {#text} at (0,760) size 4710x19 text run at (0,760) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,760) size 0x0 + LayoutBR {BR} at (4710,760) size 0x19 LayoutText {#text} at (0,780) size 4710x19 text run at (0,780) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,780) size 0x0 + LayoutBR {BR} at (4710,780) size 0x19 LayoutText {#text} at (0,800) size 4710x19 text run at (0,800) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,800) size 0x0 + LayoutBR {BR} at (4710,800) size 0x19 LayoutText {#text} at (0,820) size 4710x19 text run at (0,820) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,820) size 0x0 + LayoutBR {BR} at (4710,820) size 0x19 LayoutText {#text} at (0,840) size 4710x19 text run at (0,840) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,840) size 0x0 + LayoutBR {BR} at (4710,840) size 0x19 LayoutText {#text} at (0,860) size 4710x19 text run at (0,860) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,860) size 0x0 + LayoutBR {BR} at (4710,860) size 0x19 LayoutText {#text} at (0,880) size 4710x19 text run at (0,880) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,880) size 0x0 + LayoutBR {BR} at (4710,880) size 0x19 LayoutText {#text} at (0,900) size 4710x19 text run at (0,900) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,900) size 0x0 + LayoutBR {BR} at (4710,900) size 0x19 LayoutText {#text} at (0,920) size 4710x19 text run at (0,920) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,920) size 0x0 + LayoutBR {BR} at (4710,920) size 0x19 LayoutText {#text} at (0,940) size 4710x19 text run at (0,940) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,940) size 0x0 + LayoutBR {BR} at (4710,940) size 0x19 LayoutText {#text} at (0,960) size 4710x19 text run at (0,960) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,960) size 0x0 + LayoutBR {BR} at (4710,960) size 0x19 LayoutText {#text} at (0,980) size 4710x19 text run at (0,980) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,980) size 0x0 + LayoutBR {BR} at (4710,980) size 0x19 LayoutText {#text} at (0,1000) size 4710x19 text run at (0,1000) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1000) size 0x0 + LayoutBR {BR} at (4710,1000) size 0x19 LayoutText {#text} at (0,1020) size 4710x19 text run at (0,1020) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1020) size 0x0 + LayoutBR {BR} at (4710,1020) size 0x19 LayoutText {#text} at (0,1040) size 4710x19 text run at (0,1040) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1040) size 0x0 + LayoutBR {BR} at (4710,1040) size 0x19 LayoutText {#text} at (0,1060) size 4710x19 text run at (0,1060) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1060) size 0x0 + LayoutBR {BR} at (4710,1060) size 0x19 LayoutText {#text} at (0,1080) size 4710x19 text run at (0,1080) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1080) size 0x0 + LayoutBR {BR} at (4710,1080) size 0x19 LayoutText {#text} at (0,1100) size 4710x19 text run at (0,1100) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1100) size 0x0 + LayoutBR {BR} at (4710,1100) size 0x19 LayoutText {#text} at (0,1120) size 4710x19 text run at (0,1120) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1120) size 0x0 + LayoutBR {BR} at (4710,1120) size 0x19 LayoutText {#text} at (0,1140) size 4710x19 text run at (0,1140) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1140) size 0x0 + LayoutBR {BR} at (4710,1140) size 0x19 LayoutText {#text} at (0,1160) size 4710x19 text run at (0,1160) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1160) size 0x0 + LayoutBR {BR} at (4710,1160) size 0x19 LayoutText {#text} at (0,1180) size 4710x19 text run at (0,1180) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1180) size 0x0 + LayoutBR {BR} at (4710,1180) size 0x19 LayoutText {#text} at (0,1200) size 4710x19 text run at (0,1200) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1200) size 0x0 + LayoutBR {BR} at (4710,1200) size 0x19 LayoutText {#text} at (0,1220) size 4710x19 text run at (0,1220) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1220) size 0x0 + LayoutBR {BR} at (4710,1220) size 0x19 LayoutText {#text} at (0,1240) size 4710x19 text run at (0,1240) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1240) size 0x0 + LayoutBR {BR} at (4710,1240) size 0x19 LayoutText {#text} at (0,1260) size 4710x19 text run at (0,1260) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1260) size 0x0 + LayoutBR {BR} at (4710,1260) size 0x19 LayoutText {#text} at (0,1280) size 4710x19 text run at (0,1280) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1280) size 0x0 + LayoutBR {BR} at (4710,1280) size 0x19 LayoutText {#text} at (0,1300) size 4710x19 text run at (0,1300) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1300) size 0x0 + LayoutBR {BR} at (4710,1300) size 0x19 LayoutText {#text} at (0,1320) size 4710x19 text run at (0,1320) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1320) size 0x0 + LayoutBR {BR} at (4710,1320) size 0x19 LayoutText {#text} at (0,1340) size 4710x19 text run at (0,1340) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1340) size 0x0 + LayoutBR {BR} at (4710,1340) size 0x19 LayoutText {#text} at (0,1360) size 4710x19 text run at (0,1360) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1360) size 0x0 + LayoutBR {BR} at (4710,1360) size 0x19 LayoutText {#text} at (0,1380) size 4710x19 text run at (0,1380) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1380) size 0x0 + LayoutBR {BR} at (4710,1380) size 0x19 LayoutText {#text} at (0,1400) size 4710x19 text run at (0,1400) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1400) size 0x0 + LayoutBR {BR} at (4710,1400) size 0x19 LayoutText {#text} at (0,1420) size 4710x19 text run at (0,1420) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1420) size 0x0 + LayoutBR {BR} at (4710,1420) size 0x19 LayoutText {#text} at (0,1440) size 4710x19 text run at (0,1440) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1440) size 0x0 + LayoutBR {BR} at (4710,1440) size 0x19 LayoutText {#text} at (0,1460) size 4710x19 text run at (0,1460) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1460) size 0x0 + LayoutBR {BR} at (4710,1460) size 0x19 LayoutText {#text} at (0,1480) size 4710x19 text run at (0,1480) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1480) size 0x0 + LayoutBR {BR} at (4710,1480) size 0x19 LayoutText {#text} at (0,1500) size 4710x19 text run at (0,1500) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1500) size 0x0 + LayoutBR {BR} at (4710,1500) size 0x19 LayoutText {#text} at (0,1520) size 4710x19 text run at (0,1520) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1520) size 0x0 + LayoutBR {BR} at (4710,1520) size 0x19 LayoutText {#text} at (0,1540) size 4710x19 text run at (0,1540) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1540) size 0x0 + LayoutBR {BR} at (4710,1540) size 0x19 LayoutText {#text} at (0,1560) size 4710x19 text run at (0,1560) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1560) size 0x0 + LayoutBR {BR} at (4710,1560) size 0x19 LayoutText {#text} at (0,1580) size 4710x19 text run at (0,1580) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1580) size 0x0 + LayoutBR {BR} at (4710,1580) size 0x19 LayoutText {#text} at (0,1600) size 4710x19 text run at (0,1600) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1600) size 0x0 + LayoutBR {BR} at (4710,1600) size 0x19 LayoutText {#text} at (0,1620) size 4710x19 text run at (0,1620) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1620) size 0x0 + LayoutBR {BR} at (4710,1620) size 0x19 LayoutText {#text} at (0,1640) size 4710x19 text run at (0,1640) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1640) size 0x0 + LayoutBR {BR} at (4710,1640) size 0x19 LayoutText {#text} at (0,1660) size 4710x19 text run at (0,1660) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1660) size 0x0 + LayoutBR {BR} at (4710,1660) size 0x19 LayoutText {#text} at (0,1680) size 4710x19 text run at (0,1680) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1680) size 0x0 + LayoutBR {BR} at (4710,1680) size 0x19 LayoutText {#text} at (0,1700) size 4710x19 text run at (0,1700) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1700) size 0x0 + LayoutBR {BR} at (4710,1700) size 0x19 LayoutText {#text} at (0,1720) size 4710x19 text run at (0,1720) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1720) size 0x0 + LayoutBR {BR} at (4710,1720) size 0x19 LayoutText {#text} at (0,1740) size 4710x19 text run at (0,1740) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1740) size 0x0 + LayoutBR {BR} at (4710,1740) size 0x19 LayoutText {#text} at (0,1760) size 4710x19 text run at (0,1760) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1760) size 0x0 + LayoutBR {BR} at (4710,1760) size 0x19 LayoutText {#text} at (0,1780) size 4710x19 text run at (0,1780) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1780) size 0x0 + LayoutBR {BR} at (4710,1780) size 0x19 LayoutText {#text} at (0,1800) size 4710x19 text run at (0,1800) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1800) size 0x0 + LayoutBR {BR} at (4710,1800) size 0x19 LayoutText {#text} at (0,1820) size 4710x19 text run at (0,1820) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1820) size 0x0 + LayoutBR {BR} at (4710,1820) size 0x19 LayoutText {#text} at (0,1840) size 4710x19 text run at (0,1840) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1840) size 0x0 + LayoutBR {BR} at (4710,1840) size 0x19 LayoutText {#text} at (0,1860) size 4710x19 text run at (0,1860) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1860) size 0x0 + LayoutBR {BR} at (4710,1860) size 0x19 LayoutText {#text} at (0,1880) size 4710x19 text run at (0,1880) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1880) size 0x0 + LayoutBR {BR} at (4710,1880) size 0x19 LayoutText {#text} at (0,1900) size 4710x19 text run at (0,1900) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1900) size 0x0 + LayoutBR {BR} at (4710,1900) size 0x19 LayoutText {#text} at (0,1920) size 4710x19 text run at (0,1920) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1920) size 0x0 + LayoutBR {BR} at (4710,1920) size 0x19 LayoutText {#text} at (0,1940) size 4710x19 text run at (0,1940) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1940) size 0x0 + LayoutBR {BR} at (4710,1940) size 0x19 LayoutText {#text} at (0,1960) size 4710x19 text run at (0,1960) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1960) size 0x0 + LayoutBR {BR} at (4710,1960) size 0x19 LayoutText {#text} at (0,1980) size 4710x19 text run at (0,1980) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,1980) size 0x0 + LayoutBR {BR} at (4710,1980) size 0x19 LayoutText {#text} at (0,2000) size 4710x19 text run at (0,2000) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2000) size 0x0 + LayoutBR {BR} at (4710,2000) size 0x19 LayoutText {#text} at (0,2020) size 4710x19 text run at (0,2020) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2020) size 0x0 + LayoutBR {BR} at (4710,2020) size 0x19 LayoutText {#text} at (0,2040) size 4710x19 text run at (0,2040) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2040) size 0x0 + LayoutBR {BR} at (4710,2040) size 0x19 LayoutText {#text} at (0,2060) size 4710x19 text run at (0,2060) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2060) size 0x0 + LayoutBR {BR} at (4710,2060) size 0x19 LayoutText {#text} at (0,2080) size 4710x19 text run at (0,2080) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2080) size 0x0 + LayoutBR {BR} at (4710,2080) size 0x19 LayoutText {#text} at (0,2100) size 4710x19 text run at (0,2100) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2100) size 0x0 + LayoutBR {BR} at (4710,2100) size 0x19 LayoutText {#text} at (0,2120) size 4710x19 text run at (0,2120) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2120) size 0x0 + LayoutBR {BR} at (4710,2120) size 0x19 LayoutText {#text} at (0,2140) size 4710x19 text run at (0,2140) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2140) size 0x0 + LayoutBR {BR} at (4710,2140) size 0x19 LayoutText {#text} at (0,2160) size 4710x19 text run at (0,2160) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2160) size 0x0 + LayoutBR {BR} at (4710,2160) size 0x19 LayoutText {#text} at (0,2180) size 4710x19 text run at (0,2180) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2180) size 0x0 + LayoutBR {BR} at (4710,2180) size 0x19 LayoutText {#text} at (0,2200) size 4710x19 text run at (0,2200) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2200) size 0x0 + LayoutBR {BR} at (4710,2200) size 0x19 LayoutText {#text} at (0,2220) size 4710x19 text run at (0,2220) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2220) size 0x0 + LayoutBR {BR} at (4710,2220) size 0x19 LayoutText {#text} at (0,2240) size 4710x19 text run at (0,2240) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2240) size 0x0 + LayoutBR {BR} at (4710,2240) size 0x19 LayoutText {#text} at (0,2260) size 4710x19 text run at (0,2260) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2260) size 0x0 + LayoutBR {BR} at (4710,2260) size 0x19 LayoutText {#text} at (0,2280) size 4710x19 text run at (0,2280) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2280) size 0x0 + LayoutBR {BR} at (4710,2280) size 0x19 LayoutText {#text} at (0,2300) size 4710x19 text run at (0,2300) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2300) size 0x0 + LayoutBR {BR} at (4710,2300) size 0x19 LayoutText {#text} at (0,2320) size 4710x19 text run at (0,2320) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2320) size 0x0 + LayoutBR {BR} at (4710,2320) size 0x19 LayoutText {#text} at (0,2340) size 4710x19 text run at (0,2340) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2340) size 0x0 + LayoutBR {BR} at (4710,2340) size 0x19 LayoutText {#text} at (0,2360) size 4710x19 text run at (0,2360) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2360) size 0x0 + LayoutBR {BR} at (4710,2360) size 0x19 LayoutText {#text} at (0,2380) size 4710x19 text run at (0,2380) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2380) size 0x0 + LayoutBR {BR} at (4710,2380) size 0x19 LayoutText {#text} at (0,2400) size 4710x19 text run at (0,2400) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2400) size 0x0 + LayoutBR {BR} at (4710,2400) size 0x19 LayoutText {#text} at (0,2420) size 4710x19 text run at (0,2420) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2420) size 0x0 + LayoutBR {BR} at (4710,2420) size 0x19 LayoutText {#text} at (0,2440) size 4710x19 text run at (0,2440) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2440) size 0x0 + LayoutBR {BR} at (4710,2440) size 0x19 LayoutText {#text} at (0,2460) size 4710x19 text run at (0,2460) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2460) size 0x0 + LayoutBR {BR} at (4710,2460) size 0x19 LayoutText {#text} at (0,2480) size 4710x19 text run at (0,2480) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2480) size 0x0 + LayoutBR {BR} at (4710,2480) size 0x19 LayoutText {#text} at (0,2500) size 4710x19 text run at (0,2500) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2500) size 0x0 + LayoutBR {BR} at (4710,2500) size 0x19 LayoutText {#text} at (0,2520) size 4710x19 text run at (0,2520) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2520) size 0x0 + LayoutBR {BR} at (4710,2520) size 0x19 LayoutText {#text} at (0,2540) size 4710x19 text run at (0,2540) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2540) size 0x0 + LayoutBR {BR} at (4710,2540) size 0x19 LayoutText {#text} at (0,2560) size 4710x19 text run at (0,2560) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2560) size 0x0 + LayoutBR {BR} at (4710,2560) size 0x19 LayoutText {#text} at (0,2580) size 4710x19 text run at (0,2580) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2580) size 0x0 + LayoutBR {BR} at (4710,2580) size 0x19 LayoutText {#text} at (0,2600) size 4710x19 text run at (0,2600) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2600) size 0x0 + LayoutBR {BR} at (4710,2600) size 0x19 LayoutText {#text} at (0,2620) size 4710x19 text run at (0,2620) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2620) size 0x0 + LayoutBR {BR} at (4710,2620) size 0x19 LayoutText {#text} at (0,2640) size 4710x19 text run at (0,2640) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2640) size 0x0 + LayoutBR {BR} at (4710,2640) size 0x19 LayoutText {#text} at (0,2660) size 4710x19 text run at (0,2660) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2660) size 0x0 + LayoutBR {BR} at (4710,2660) size 0x19 LayoutText {#text} at (0,2680) size 4710x19 text run at (0,2680) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2680) size 0x0 + LayoutBR {BR} at (4710,2680) size 0x19 LayoutText {#text} at (0,2700) size 4710x19 text run at (0,2700) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2700) size 0x0 + LayoutBR {BR} at (4710,2700) size 0x19 LayoutText {#text} at (0,2720) size 4710x19 text run at (0,2720) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2720) size 0x0 + LayoutBR {BR} at (4710,2720) size 0x19 LayoutText {#text} at (0,2740) size 4710x19 text run at (0,2740) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2740) size 0x0 + LayoutBR {BR} at (4710,2740) size 0x19 LayoutText {#text} at (0,2760) size 4710x19 text run at (0,2760) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2760) size 0x0 + LayoutBR {BR} at (4710,2760) size 0x19 LayoutText {#text} at (0,2780) size 4710x19 text run at (0,2780) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2780) size 0x0 + LayoutBR {BR} at (4710,2780) size 0x19 LayoutText {#text} at (0,2800) size 4710x19 text run at (0,2800) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2800) size 0x0 + LayoutBR {BR} at (4710,2800) size 0x19 LayoutText {#text} at (0,2820) size 4710x19 text run at (0,2820) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2820) size 0x0 + LayoutBR {BR} at (4710,2820) size 0x19 LayoutText {#text} at (0,2840) size 4710x19 text run at (0,2840) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2840) size 0x0 + LayoutBR {BR} at (4710,2840) size 0x19 LayoutText {#text} at (0,2860) size 4710x19 text run at (0,2860) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2860) size 0x0 + LayoutBR {BR} at (4710,2860) size 0x19 LayoutText {#text} at (0,2880) size 4710x19 text run at (0,2880) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2880) size 0x0 + LayoutBR {BR} at (4710,2880) size 0x19 LayoutText {#text} at (0,2900) size 4710x19 text run at (0,2900) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2900) size 0x0 + LayoutBR {BR} at (4710,2900) size 0x19 LayoutText {#text} at (0,2920) size 4710x19 text run at (0,2920) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2920) size 0x0 + LayoutBR {BR} at (4710,2920) size 0x19 LayoutText {#text} at (0,2940) size 4710x19 text run at (0,2940) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2940) size 0x0 + LayoutBR {BR} at (4710,2940) size 0x19 LayoutText {#text} at (0,2960) size 4710x19 text run at (0,2960) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2960) size 0x0 + LayoutBR {BR} at (4710,2960) size 0x19 LayoutText {#text} at (0,2980) size 4710x19 text run at (0,2980) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,2980) size 0x0 + LayoutBR {BR} at (4710,2980) size 0x19 LayoutText {#text} at (0,3000) size 4710x19 text run at (0,3000) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3000) size 0x0 + LayoutBR {BR} at (4710,3000) size 0x19 LayoutText {#text} at (0,3020) size 4710x19 text run at (0,3020) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3020) size 0x0 + LayoutBR {BR} at (4710,3020) size 0x19 LayoutText {#text} at (0,3040) size 4710x19 text run at (0,3040) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3040) size 0x0 + LayoutBR {BR} at (4710,3040) size 0x19 LayoutText {#text} at (0,3060) size 4710x19 text run at (0,3060) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3060) size 0x0 + LayoutBR {BR} at (4710,3060) size 0x19 LayoutText {#text} at (0,3080) size 4710x19 text run at (0,3080) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3080) size 0x0 + LayoutBR {BR} at (4710,3080) size 0x19 LayoutText {#text} at (0,3100) size 4710x19 text run at (0,3100) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3100) size 0x0 + LayoutBR {BR} at (4710,3100) size 0x19 LayoutText {#text} at (0,3120) size 4710x19 text run at (0,3120) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3120) size 0x0 + LayoutBR {BR} at (4710,3120) size 0x19 LayoutText {#text} at (0,3140) size 4710x19 text run at (0,3140) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3140) size 0x0 + LayoutBR {BR} at (4710,3140) size 0x19 LayoutText {#text} at (0,3160) size 4710x19 text run at (0,3160) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3160) size 0x0 + LayoutBR {BR} at (4710,3160) size 0x19 LayoutText {#text} at (0,3180) size 4710x19 text run at (0,3180) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3180) size 0x0 + LayoutBR {BR} at (4710,3180) size 0x19 LayoutText {#text} at (0,3200) size 4710x19 text run at (0,3200) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3200) size 0x0 + LayoutBR {BR} at (4710,3200) size 0x19 LayoutText {#text} at (0,3220) size 4710x19 text run at (0,3220) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3220) size 0x0 + LayoutBR {BR} at (4710,3220) size 0x19 LayoutText {#text} at (0,3240) size 4710x19 text run at (0,3240) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3240) size 0x0 + LayoutBR {BR} at (4710,3240) size 0x19 LayoutText {#text} at (0,3260) size 4710x19 text run at (0,3260) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3260) size 0x0 + LayoutBR {BR} at (4710,3260) size 0x19 LayoutText {#text} at (0,3280) size 4710x19 text run at (0,3280) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3280) size 0x0 + LayoutBR {BR} at (4710,3280) size 0x19 LayoutText {#text} at (0,3300) size 4710x19 text run at (0,3300) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3300) size 0x0 + LayoutBR {BR} at (4710,3300) size 0x19 LayoutText {#text} at (0,3320) size 4710x19 text run at (0,3320) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3320) size 0x0 + LayoutBR {BR} at (4710,3320) size 0x19 LayoutText {#text} at (0,3340) size 4710x19 text run at (0,3340) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3340) size 0x0 + LayoutBR {BR} at (4710,3340) size 0x19 LayoutText {#text} at (0,3360) size 4710x19 text run at (0,3360) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3360) size 0x0 + LayoutBR {BR} at (4710,3360) size 0x19 LayoutText {#text} at (0,3380) size 4710x19 text run at (0,3380) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3380) size 0x0 + LayoutBR {BR} at (4710,3380) size 0x19 LayoutText {#text} at (0,3400) size 4710x19 text run at (0,3400) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3400) size 0x0 + LayoutBR {BR} at (4710,3400) size 0x19 LayoutText {#text} at (0,3420) size 4710x19 text run at (0,3420) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3420) size 0x0 + LayoutBR {BR} at (4710,3420) size 0x19 LayoutText {#text} at (0,3440) size 4710x19 text run at (0,3440) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3440) size 0x0 + LayoutBR {BR} at (4710,3440) size 0x19 LayoutText {#text} at (0,3460) size 4710x19 text run at (0,3460) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3460) size 0x0 + LayoutBR {BR} at (4710,3460) size 0x19 LayoutText {#text} at (0,3480) size 4710x19 text run at (0,3480) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3480) size 0x0 + LayoutBR {BR} at (4710,3480) size 0x19 LayoutText {#text} at (0,3500) size 4710x19 text run at (0,3500) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3500) size 0x0 + LayoutBR {BR} at (4710,3500) size 0x19 LayoutText {#text} at (0,3520) size 4710x19 text run at (0,3520) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3520) size 0x0 + LayoutBR {BR} at (4710,3520) size 0x19 LayoutText {#text} at (0,3540) size 4710x19 text run at (0,3540) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3540) size 0x0 + LayoutBR {BR} at (4710,3540) size 0x19 LayoutText {#text} at (0,3560) size 4710x19 text run at (0,3560) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3560) size 0x0 + LayoutBR {BR} at (4710,3560) size 0x19 LayoutText {#text} at (0,3580) size 4710x19 text run at (0,3580) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3580) size 0x0 + LayoutBR {BR} at (4710,3580) size 0x19 LayoutText {#text} at (0,3600) size 4710x19 text run at (0,3600) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3600) size 0x0 + LayoutBR {BR} at (4710,3600) size 0x19 LayoutText {#text} at (0,3620) size 4710x19 text run at (0,3620) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3620) size 0x0 + LayoutBR {BR} at (4710,3620) size 0x19 LayoutText {#text} at (0,3640) size 4710x19 text run at (0,3640) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3640) size 0x0 + LayoutBR {BR} at (4710,3640) size 0x19 LayoutText {#text} at (0,3660) size 4710x19 text run at (0,3660) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3660) size 0x0 + LayoutBR {BR} at (4710,3660) size 0x19 LayoutText {#text} at (0,3680) size 4710x19 text run at (0,3680) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3680) size 0x0 + LayoutBR {BR} at (4710,3680) size 0x19 LayoutText {#text} at (0,3700) size 4710x19 text run at (0,3700) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3700) size 0x0 + LayoutBR {BR} at (4710,3700) size 0x19 LayoutText {#text} at (0,3720) size 4710x19 text run at (0,3720) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3720) size 0x0 + LayoutBR {BR} at (4710,3720) size 0x19 LayoutText {#text} at (0,3740) size 4710x19 text run at (0,3740) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3740) size 0x0 + LayoutBR {BR} at (4710,3740) size 0x19 LayoutText {#text} at (0,3760) size 4710x19 text run at (0,3760) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3760) size 0x0 + LayoutBR {BR} at (4710,3760) size 0x19 LayoutText {#text} at (0,3780) size 4710x19 text run at (0,3780) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3780) size 0x0 + LayoutBR {BR} at (4710,3780) size 0x19 LayoutText {#text} at (0,3800) size 4710x19 text run at (0,3800) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3800) size 0x0 + LayoutBR {BR} at (4710,3800) size 0x19 LayoutText {#text} at (0,3820) size 4710x19 text run at (0,3820) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3820) size 0x0 + LayoutBR {BR} at (4710,3820) size 0x19 LayoutText {#text} at (0,3840) size 4710x19 text run at (0,3840) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3840) size 0x0 + LayoutBR {BR} at (4710,3840) size 0x19 LayoutText {#text} at (0,3860) size 4710x19 text run at (0,3860) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3860) size 0x0 + LayoutBR {BR} at (4710,3860) size 0x19 LayoutText {#text} at (0,3880) size 4710x19 text run at (0,3880) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3880) size 0x0 + LayoutBR {BR} at (4710,3880) size 0x19 LayoutText {#text} at (0,3900) size 4710x19 text run at (0,3900) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3900) size 0x0 + LayoutBR {BR} at (4710,3900) size 0x19 LayoutText {#text} at (0,3920) size 4710x19 text run at (0,3920) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3920) size 0x0 + LayoutBR {BR} at (4710,3920) size 0x19 LayoutText {#text} at (0,3940) size 4710x19 text run at (0,3940) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3940) size 0x0 + LayoutBR {BR} at (4710,3940) size 0x19 LayoutText {#text} at (0,3960) size 4710x19 text run at (0,3960) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3960) size 0x0 + LayoutBR {BR} at (4710,3960) size 0x19 LayoutText {#text} at (0,3980) size 4710x19 text run at (0,3980) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,3980) size 0x0 + LayoutBR {BR} at (4710,3980) size 0x19 LayoutText {#text} at (0,4000) size 4710x19 text run at (0,4000) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4000) size 0x0 + LayoutBR {BR} at (4710,4000) size 0x19 LayoutText {#text} at (0,4020) size 4710x19 text run at (0,4020) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4020) size 0x0 + LayoutBR {BR} at (4710,4020) size 0x19 LayoutText {#text} at (0,4040) size 4710x19 text run at (0,4040) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4040) size 0x0 + LayoutBR {BR} at (4710,4040) size 0x19 LayoutText {#text} at (0,4060) size 4710x19 text run at (0,4060) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4060) size 0x0 + LayoutBR {BR} at (4710,4060) size 0x19 LayoutText {#text} at (0,4080) size 4710x19 text run at (0,4080) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4080) size 0x0 + LayoutBR {BR} at (4710,4080) size 0x19 LayoutText {#text} at (0,4100) size 4710x19 text run at (0,4100) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4100) size 0x0 + LayoutBR {BR} at (4710,4100) size 0x19 LayoutText {#text} at (0,4120) size 4710x19 text run at (0,4120) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4120) size 0x0 + LayoutBR {BR} at (4710,4120) size 0x19 LayoutText {#text} at (0,4140) size 4710x19 text run at (0,4140) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4140) size 0x0 + LayoutBR {BR} at (4710,4140) size 0x19 LayoutText {#text} at (0,4160) size 4710x19 text run at (0,4160) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4160) size 0x0 + LayoutBR {BR} at (4710,4160) size 0x19 LayoutText {#text} at (0,4180) size 4710x19 text run at (0,4180) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4180) size 0x0 + LayoutBR {BR} at (4710,4180) size 0x19 LayoutText {#text} at (0,4200) size 4710x19 text run at (0,4200) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4200) size 0x0 + LayoutBR {BR} at (4710,4200) size 0x19 LayoutText {#text} at (0,4220) size 4710x19 text run at (0,4220) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4220) size 0x0 + LayoutBR {BR} at (4710,4220) size 0x19 LayoutText {#text} at (0,4240) size 4710x19 text run at (0,4240) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4240) size 0x0 + LayoutBR {BR} at (4710,4240) size 0x19 LayoutText {#text} at (0,4260) size 4710x19 text run at (0,4260) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4260) size 0x0 + LayoutBR {BR} at (4710,4260) size 0x19 LayoutText {#text} at (0,4280) size 4710x19 text run at (0,4280) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4280) size 0x0 + LayoutBR {BR} at (4710,4280) size 0x19 LayoutText {#text} at (0,4300) size 4710x19 text run at (0,4300) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4300) size 0x0 + LayoutBR {BR} at (4710,4300) size 0x19 LayoutText {#text} at (0,4320) size 4710x19 text run at (0,4320) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4320) size 0x0 + LayoutBR {BR} at (4710,4320) size 0x19 LayoutText {#text} at (0,4340) size 4710x19 text run at (0,4340) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4340) size 0x0 + LayoutBR {BR} at (4710,4340) size 0x19 LayoutText {#text} at (0,4360) size 4710x19 text run at (0,4360) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4360) size 0x0 + LayoutBR {BR} at (4710,4360) size 0x19 LayoutText {#text} at (0,4380) size 4710x19 text run at (0,4380) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4380) size 0x0 + LayoutBR {BR} at (4710,4380) size 0x19 LayoutText {#text} at (0,4400) size 4710x19 text run at (0,4400) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4400) size 0x0 + LayoutBR {BR} at (4710,4400) size 0x19 LayoutText {#text} at (0,4420) size 4710x19 text run at (0,4420) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4420) size 0x0 + LayoutBR {BR} at (4710,4420) size 0x19 LayoutText {#text} at (0,4440) size 4710x19 text run at (0,4440) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4440) size 0x0 + LayoutBR {BR} at (4710,4440) size 0x19 LayoutText {#text} at (0,4460) size 4710x19 text run at (0,4460) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4460) size 0x0 + LayoutBR {BR} at (4710,4460) size 0x19 LayoutText {#text} at (0,4480) size 4710x19 text run at (0,4480) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4480) size 0x0 + LayoutBR {BR} at (4710,4480) size 0x19 LayoutText {#text} at (0,4500) size 4710x19 text run at (0,4500) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4500) size 0x0 + LayoutBR {BR} at (4710,4500) size 0x19 LayoutText {#text} at (0,4520) size 4710x19 text run at (0,4520) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4520) size 0x0 + LayoutBR {BR} at (4710,4520) size 0x19 LayoutText {#text} at (0,4540) size 4710x19 text run at (0,4540) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4540) size 0x0 + LayoutBR {BR} at (4710,4540) size 0x19 LayoutText {#text} at (0,4560) size 4710x19 text run at (0,4560) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4560) size 0x0 + LayoutBR {BR} at (4710,4560) size 0x19 LayoutText {#text} at (0,4580) size 4710x19 text run at (0,4580) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4580) size 0x0 + LayoutBR {BR} at (4710,4580) size 0x19 LayoutText {#text} at (0,4600) size 4710x19 text run at (0,4600) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4600) size 0x0 + LayoutBR {BR} at (4710,4600) size 0x19 LayoutText {#text} at (0,4620) size 4710x19 text run at (0,4620) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4620) size 0x0 + LayoutBR {BR} at (4710,4620) size 0x19 LayoutText {#text} at (0,4640) size 4710x19 text run at (0,4640) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4640) size 0x0 + LayoutBR {BR} at (4710,4640) size 0x19 LayoutText {#text} at (0,4660) size 4710x19 text run at (0,4660) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4660) size 0x0 + LayoutBR {BR} at (4710,4660) size 0x19 LayoutText {#text} at (0,4680) size 4710x19 text run at (0,4680) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4680) size 0x0 + LayoutBR {BR} at (4710,4680) size 0x19 LayoutText {#text} at (0,4700) size 4710x19 text run at (0,4700) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4700) size 0x0 + LayoutBR {BR} at (4710,4700) size 0x19 LayoutText {#text} at (0,4720) size 4710x19 text run at (0,4720) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4720) size 0x0 + LayoutBR {BR} at (4710,4720) size 0x19 LayoutText {#text} at (0,4740) size 4710x19 text run at (0,4740) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4740) size 0x0 + LayoutBR {BR} at (4710,4740) size 0x19 LayoutText {#text} at (0,4760) size 4710x19 text run at (0,4760) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4760) size 0x0 + LayoutBR {BR} at (4710,4760) size 0x19 LayoutText {#text} at (0,4780) size 4710x19 text run at (0,4780) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4780) size 0x0 + LayoutBR {BR} at (4710,4780) size 0x19 LayoutText {#text} at (0,4800) size 4710x19 text run at (0,4800) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4800) size 0x0 + LayoutBR {BR} at (4710,4800) size 0x19 LayoutText {#text} at (0,4820) size 4710x19 text run at (0,4820) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4820) size 0x0 + LayoutBR {BR} at (4710,4820) size 0x19 LayoutText {#text} at (0,4840) size 4710x19 text run at (0,4840) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4840) size 0x0 + LayoutBR {BR} at (4710,4840) size 0x19 LayoutText {#text} at (0,4860) size 4710x19 text run at (0,4860) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4860) size 0x0 + LayoutBR {BR} at (4710,4860) size 0x19 LayoutText {#text} at (0,4880) size 4710x19 text run at (0,4880) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4880) size 0x0 + LayoutBR {BR} at (4710,4880) size 0x19 LayoutText {#text} at (0,4900) size 4710x19 text run at (0,4900) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4900) size 0x0 + LayoutBR {BR} at (4710,4900) size 0x19 LayoutText {#text} at (0,4920) size 4710x19 text run at (0,4920) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4920) size 0x0 + LayoutBR {BR} at (4710,4920) size 0x19 LayoutText {#text} at (0,4940) size 4710x19 text run at (0,4940) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4940) size 0x0 + LayoutBR {BR} at (4710,4940) size 0x19 LayoutText {#text} at (0,4960) size 4710x19 text run at (0,4960) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4960) size 0x0 + LayoutBR {BR} at (4710,4960) size 0x19 LayoutText {#text} at (0,4980) size 4710x19 text run at (0,4980) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,4980) size 0x0 + LayoutBR {BR} at (4710,4980) size 0x19 LayoutText {#text} at (0,5000) size 4710x19 text run at (0,5000) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5000) size 0x0 + LayoutBR {BR} at (4710,5000) size 0x19 LayoutText {#text} at (0,5020) size 4710x19 text run at (0,5020) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5020) size 0x0 + LayoutBR {BR} at (4710,5020) size 0x19 LayoutText {#text} at (0,5040) size 4710x19 text run at (0,5040) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5040) size 0x0 + LayoutBR {BR} at (4710,5040) size 0x19 LayoutText {#text} at (0,5060) size 4710x19 text run at (0,5060) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5060) size 0x0 + LayoutBR {BR} at (4710,5060) size 0x19 LayoutText {#text} at (0,5080) size 4710x19 text run at (0,5080) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5080) size 0x0 + LayoutBR {BR} at (4710,5080) size 0x19 LayoutText {#text} at (0,5100) size 4710x19 text run at (0,5100) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5100) size 0x0 + LayoutBR {BR} at (4710,5100) size 0x19 LayoutText {#text} at (0,5120) size 4710x19 text run at (0,5120) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5120) size 0x0 + LayoutBR {BR} at (4710,5120) size 0x19 LayoutText {#text} at (0,5140) size 4710x19 text run at (0,5140) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5140) size 0x0 + LayoutBR {BR} at (4710,5140) size 0x19 LayoutText {#text} at (0,5160) size 4710x19 text run at (0,5160) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5160) size 0x0 + LayoutBR {BR} at (4710,5160) size 0x19 LayoutText {#text} at (0,5180) size 4710x19 text run at (0,5180) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5180) size 0x0 + LayoutBR {BR} at (4710,5180) size 0x19 LayoutText {#text} at (0,5200) size 4710x19 text run at (0,5200) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5200) size 0x0 + LayoutBR {BR} at (4710,5200) size 0x19 LayoutText {#text} at (0,5220) size 4710x19 text run at (0,5220) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5220) size 0x0 + LayoutBR {BR} at (4710,5220) size 0x19 LayoutText {#text} at (0,5240) size 4710x19 text run at (0,5240) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5240) size 0x0 + LayoutBR {BR} at (4710,5240) size 0x19 LayoutText {#text} at (0,5260) size 4710x19 text run at (0,5260) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5260) size 0x0 + LayoutBR {BR} at (4710,5260) size 0x19 LayoutText {#text} at (0,5280) size 4710x19 text run at (0,5280) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5280) size 0x0 + LayoutBR {BR} at (4710,5280) size 0x19 LayoutText {#text} at (0,5300) size 4710x19 text run at (0,5300) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5300) size 0x0 + LayoutBR {BR} at (4710,5300) size 0x19 LayoutText {#text} at (0,5320) size 4710x19 text run at (0,5320) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5320) size 0x0 + LayoutBR {BR} at (4710,5320) size 0x19 LayoutText {#text} at (0,5340) size 4710x19 text run at (0,5340) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5340) size 0x0 + LayoutBR {BR} at (4710,5340) size 0x19 LayoutText {#text} at (0,5360) size 4710x19 text run at (0,5360) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5360) size 0x0 + LayoutBR {BR} at (4710,5360) size 0x19 LayoutText {#text} at (0,5380) size 4710x19 text run at (0,5380) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5380) size 0x0 + LayoutBR {BR} at (4710,5380) size 0x19 LayoutText {#text} at (0,5400) size 4710x19 text run at (0,5400) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5400) size 0x0 + LayoutBR {BR} at (4710,5400) size 0x19 LayoutText {#text} at (0,5420) size 4710x19 text run at (0,5420) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5420) size 0x0 + LayoutBR {BR} at (4710,5420) size 0x19 LayoutText {#text} at (0,5440) size 4710x19 text run at (0,5440) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5440) size 0x0 + LayoutBR {BR} at (4710,5440) size 0x19 LayoutText {#text} at (0,5460) size 4710x19 text run at (0,5460) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5460) size 0x0 + LayoutBR {BR} at (4710,5460) size 0x19 LayoutText {#text} at (0,5480) size 4710x19 text run at (0,5480) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5480) size 0x0 + LayoutBR {BR} at (4710,5480) size 0x19 LayoutText {#text} at (0,5500) size 4710x19 text run at (0,5500) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5500) size 0x0 + LayoutBR {BR} at (4710,5500) size 0x19 LayoutText {#text} at (0,5520) size 4710x19 text run at (0,5520) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5520) size 0x0 + LayoutBR {BR} at (4710,5520) size 0x19 LayoutText {#text} at (0,5540) size 4710x19 text run at (0,5540) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5540) size 0x0 + LayoutBR {BR} at (4710,5540) size 0x19 LayoutText {#text} at (0,5560) size 4710x19 text run at (0,5560) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5560) size 0x0 + LayoutBR {BR} at (4710,5560) size 0x19 LayoutText {#text} at (0,5580) size 4710x19 text run at (0,5580) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5580) size 0x0 + LayoutBR {BR} at (4710,5580) size 0x19 LayoutText {#text} at (0,5600) size 4710x19 text run at (0,5600) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5600) size 0x0 + LayoutBR {BR} at (4710,5600) size 0x19 LayoutText {#text} at (0,5620) size 4710x19 text run at (0,5620) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5620) size 0x0 + LayoutBR {BR} at (4710,5620) size 0x19 LayoutText {#text} at (0,5640) size 4710x19 text run at (0,5640) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5640) size 0x0 + LayoutBR {BR} at (4710,5640) size 0x19 LayoutText {#text} at (0,5660) size 4710x19 text run at (0,5660) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5660) size 0x0 + LayoutBR {BR} at (4710,5660) size 0x19 LayoutText {#text} at (0,5680) size 4710x19 text run at (0,5680) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5680) size 0x0 + LayoutBR {BR} at (4710,5680) size 0x19 LayoutText {#text} at (0,5700) size 4710x19 text run at (0,5700) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5700) size 0x0 + LayoutBR {BR} at (4710,5700) size 0x19 LayoutText {#text} at (0,5720) size 4710x19 text run at (0,5720) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5720) size 0x0 + LayoutBR {BR} at (4710,5720) size 0x19 LayoutText {#text} at (0,5740) size 4710x19 text run at (0,5740) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5740) size 0x0 + LayoutBR {BR} at (4710,5740) size 0x19 LayoutText {#text} at (0,5760) size 4710x19 text run at (0,5760) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5760) size 0x0 + LayoutBR {BR} at (4710,5760) size 0x19 LayoutText {#text} at (0,5780) size 4710x19 text run at (0,5780) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5780) size 0x0 + LayoutBR {BR} at (4710,5780) size 0x19 LayoutText {#text} at (0,5800) size 4710x19 text run at (0,5800) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5800) size 0x0 + LayoutBR {BR} at (4710,5800) size 0x19 LayoutText {#text} at (0,5820) size 4710x19 text run at (0,5820) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5820) size 0x0 + LayoutBR {BR} at (4710,5820) size 0x19 LayoutText {#text} at (0,5840) size 4710x19 text run at (0,5840) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5840) size 0x0 + LayoutBR {BR} at (4710,5840) size 0x19 LayoutText {#text} at (0,5860) size 4710x19 text run at (0,5860) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5860) size 0x0 + LayoutBR {BR} at (4710,5860) size 0x19 LayoutText {#text} at (0,5880) size 4710x19 text run at (0,5880) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5880) size 0x0 + LayoutBR {BR} at (4710,5880) size 0x19 LayoutText {#text} at (0,5900) size 4710x19 text run at (0,5900) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5900) size 0x0 + LayoutBR {BR} at (4710,5900) size 0x19 LayoutText {#text} at (0,5920) size 4710x19 text run at (0,5920) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5920) size 0x0 + LayoutBR {BR} at (4710,5920) size 0x19 LayoutText {#text} at (0,5940) size 4710x19 text run at (0,5940) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5940) size 0x0 + LayoutBR {BR} at (4710,5940) size 0x19 LayoutText {#text} at (0,5960) size 4710x19 text run at (0,5960) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5960) size 0x0 + LayoutBR {BR} at (4710,5960) size 0x19 LayoutText {#text} at (0,5980) size 4710x19 text run at (0,5980) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,5980) size 0x0 + LayoutBR {BR} at (4710,5980) size 0x19 LayoutText {#text} at (0,6000) size 4710x19 text run at (0,6000) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6000) size 0x0 + LayoutBR {BR} at (4710,6000) size 0x19 LayoutText {#text} at (0,6020) size 4710x19 text run at (0,6020) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6020) size 0x0 + LayoutBR {BR} at (4710,6020) size 0x19 LayoutText {#text} at (0,6040) size 4710x19 text run at (0,6040) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6040) size 0x0 + LayoutBR {BR} at (4710,6040) size 0x19 LayoutText {#text} at (0,6060) size 4710x19 text run at (0,6060) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6060) size 0x0 + LayoutBR {BR} at (4710,6060) size 0x19 LayoutText {#text} at (0,6080) size 4710x19 text run at (0,6080) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6080) size 0x0 + LayoutBR {BR} at (4710,6080) size 0x19 LayoutText {#text} at (0,6100) size 4710x19 text run at (0,6100) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6100) size 0x0 + LayoutBR {BR} at (4710,6100) size 0x19 LayoutText {#text} at (0,6120) size 4710x19 text run at (0,6120) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6120) size 0x0 + LayoutBR {BR} at (4710,6120) size 0x19 LayoutText {#text} at (0,6140) size 4710x19 text run at (0,6140) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6140) size 0x0 + LayoutBR {BR} at (4710,6140) size 0x19 LayoutText {#text} at (0,6160) size 4710x19 text run at (0,6160) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6160) size 0x0 + LayoutBR {BR} at (4710,6160) size 0x19 LayoutText {#text} at (0,6180) size 4710x19 text run at (0,6180) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6180) size 0x0 + LayoutBR {BR} at (4710,6180) size 0x19 LayoutText {#text} at (0,6200) size 4710x19 text run at (0,6200) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6200) size 0x0 + LayoutBR {BR} at (4710,6200) size 0x19 LayoutText {#text} at (0,6220) size 4710x19 text run at (0,6220) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6220) size 0x0 + LayoutBR {BR} at (4710,6220) size 0x19 LayoutText {#text} at (0,6240) size 4710x19 text run at (0,6240) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6240) size 0x0 + LayoutBR {BR} at (4710,6240) size 0x19 LayoutText {#text} at (0,6260) size 4710x19 text run at (0,6260) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6260) size 0x0 + LayoutBR {BR} at (4710,6260) size 0x19 LayoutText {#text} at (0,6280) size 4710x19 text run at (0,6280) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6280) size 0x0 + LayoutBR {BR} at (4710,6280) size 0x19 LayoutText {#text} at (0,6300) size 4710x19 text run at (0,6300) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6300) size 0x0 + LayoutBR {BR} at (4710,6300) size 0x19 LayoutText {#text} at (0,6320) size 4710x19 text run at (0,6320) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6320) size 0x0 + LayoutBR {BR} at (4710,6320) size 0x19 LayoutText {#text} at (0,6340) size 4710x19 text run at (0,6340) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6340) size 0x0 + LayoutBR {BR} at (4710,6340) size 0x19 LayoutText {#text} at (0,6360) size 4710x19 text run at (0,6360) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6360) size 0x0 + LayoutBR {BR} at (4710,6360) size 0x19 LayoutText {#text} at (0,6380) size 4710x19 text run at (0,6380) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6380) size 0x0 + LayoutBR {BR} at (4710,6380) size 0x19 LayoutText {#text} at (0,6400) size 4710x19 text run at (0,6400) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6400) size 0x0 + LayoutBR {BR} at (4710,6400) size 0x19 LayoutText {#text} at (0,6420) size 4710x19 text run at (0,6420) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6420) size 0x0 + LayoutBR {BR} at (4710,6420) size 0x19 LayoutText {#text} at (0,6440) size 4710x19 text run at (0,6440) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6440) size 0x0 + LayoutBR {BR} at (4710,6440) size 0x19 LayoutText {#text} at (0,6460) size 4710x19 text run at (0,6460) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6460) size 0x0 + LayoutBR {BR} at (4710,6460) size 0x19 LayoutText {#text} at (0,6480) size 4710x19 text run at (0,6480) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6480) size 0x0 + LayoutBR {BR} at (4710,6480) size 0x19 LayoutText {#text} at (0,6500) size 4710x19 text run at (0,6500) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6500) size 0x0 + LayoutBR {BR} at (4710,6500) size 0x19 LayoutText {#text} at (0,6520) size 4710x19 text run at (0,6520) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6520) size 0x0 + LayoutBR {BR} at (4710,6520) size 0x19 LayoutText {#text} at (0,6540) size 4710x19 text run at (0,6540) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6540) size 0x0 + LayoutBR {BR} at (4710,6540) size 0x19 LayoutText {#text} at (0,6560) size 4710x19 text run at (0,6560) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6560) size 0x0 + LayoutBR {BR} at (4710,6560) size 0x19 LayoutText {#text} at (0,6580) size 4710x19 text run at (0,6580) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6580) size 0x0 + LayoutBR {BR} at (4710,6580) size 0x19 LayoutText {#text} at (0,6600) size 4710x19 text run at (0,6600) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6600) size 0x0 + LayoutBR {BR} at (4710,6600) size 0x19 LayoutText {#text} at (0,6620) size 4710x19 text run at (0,6620) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6620) size 0x0 + LayoutBR {BR} at (4710,6620) size 0x19 LayoutText {#text} at (0,6640) size 4710x19 text run at (0,6640) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6640) size 0x0 + LayoutBR {BR} at (4710,6640) size 0x19 LayoutText {#text} at (0,6660) size 4710x19 text run at (0,6660) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6660) size 0x0 + LayoutBR {BR} at (4710,6660) size 0x19 LayoutText {#text} at (0,6680) size 4710x19 text run at (0,6680) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6680) size 0x0 + LayoutBR {BR} at (4710,6680) size 0x19 LayoutText {#text} at (0,6700) size 4710x19 text run at (0,6700) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6700) size 0x0 + LayoutBR {BR} at (4710,6700) size 0x19 LayoutText {#text} at (0,6720) size 4710x19 text run at (0,6720) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6720) size 0x0 + LayoutBR {BR} at (4710,6720) size 0x19 LayoutText {#text} at (0,6740) size 4710x19 text run at (0,6740) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6740) size 0x0 + LayoutBR {BR} at (4710,6740) size 0x19 LayoutText {#text} at (0,6760) size 4710x19 text run at (0,6760) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6760) size 0x0 + LayoutBR {BR} at (4710,6760) size 0x19 LayoutText {#text} at (0,6780) size 4710x19 text run at (0,6780) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6780) size 0x0 + LayoutBR {BR} at (4710,6780) size 0x19 LayoutText {#text} at (0,6800) size 4710x19 text run at (0,6800) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6800) size 0x0 + LayoutBR {BR} at (4710,6800) size 0x19 LayoutText {#text} at (0,6820) size 4710x19 text run at (0,6820) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6820) size 0x0 + LayoutBR {BR} at (4710,6820) size 0x19 LayoutText {#text} at (0,6840) size 4710x19 text run at (0,6840) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6840) size 0x0 + LayoutBR {BR} at (4710,6840) size 0x19 LayoutText {#text} at (0,6860) size 4710x19 text run at (0,6860) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6860) size 0x0 + LayoutBR {BR} at (4710,6860) size 0x19 LayoutText {#text} at (0,6880) size 4710x19 text run at (0,6880) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6880) size 0x0 + LayoutBR {BR} at (4710,6880) size 0x19 LayoutText {#text} at (0,6900) size 4710x19 text run at (0,6900) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6900) size 0x0 + LayoutBR {BR} at (4710,6900) size 0x19 LayoutText {#text} at (0,6920) size 4710x19 text run at (0,6920) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6920) size 0x0 + LayoutBR {BR} at (4710,6920) size 0x19 LayoutText {#text} at (0,6940) size 4710x19 text run at (0,6940) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6940) size 0x0 + LayoutBR {BR} at (4710,6940) size 0x19 LayoutText {#text} at (0,6960) size 4710x19 text run at (0,6960) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6960) size 0x0 + LayoutBR {BR} at (4710,6960) size 0x19 LayoutText {#text} at (0,6980) size 4710x19 text run at (0,6980) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,6980) size 0x0 + LayoutBR {BR} at (4710,6980) size 0x19 LayoutText {#text} at (0,7000) size 4710x19 text run at (0,7000) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7000) size 0x0 + LayoutBR {BR} at (4710,7000) size 0x19 LayoutText {#text} at (0,7020) size 4710x19 text run at (0,7020) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7020) size 0x0 + LayoutBR {BR} at (4710,7020) size 0x19 LayoutText {#text} at (0,7040) size 4710x19 text run at (0,7040) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7040) size 0x0 + LayoutBR {BR} at (4710,7040) size 0x19 LayoutText {#text} at (0,7060) size 4710x19 text run at (0,7060) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7060) size 0x0 + LayoutBR {BR} at (4710,7060) size 0x19 LayoutText {#text} at (0,7080) size 4710x19 text run at (0,7080) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7080) size 0x0 + LayoutBR {BR} at (4710,7080) size 0x19 LayoutText {#text} at (0,7100) size 4710x19 text run at (0,7100) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7100) size 0x0 + LayoutBR {BR} at (4710,7100) size 0x19 LayoutText {#text} at (0,7120) size 4710x19 text run at (0,7120) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7120) size 0x0 + LayoutBR {BR} at (4710,7120) size 0x19 LayoutText {#text} at (0,7140) size 4710x19 text run at (0,7140) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7140) size 0x0 + LayoutBR {BR} at (4710,7140) size 0x19 LayoutText {#text} at (0,7160) size 4710x19 text run at (0,7160) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7160) size 0x0 + LayoutBR {BR} at (4710,7160) size 0x19 LayoutText {#text} at (0,7180) size 4710x19 text run at (0,7180) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7180) size 0x0 + LayoutBR {BR} at (4710,7180) size 0x19 LayoutText {#text} at (0,7200) size 4710x19 text run at (0,7200) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7200) size 0x0 + LayoutBR {BR} at (4710,7200) size 0x19 LayoutText {#text} at (0,7220) size 4710x19 text run at (0,7220) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7220) size 0x0 + LayoutBR {BR} at (4710,7220) size 0x19 LayoutText {#text} at (0,7240) size 4710x19 text run at (0,7240) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7240) size 0x0 + LayoutBR {BR} at (4710,7240) size 0x19 LayoutText {#text} at (0,7260) size 4710x19 text run at (0,7260) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7260) size 0x0 + LayoutBR {BR} at (4710,7260) size 0x19 LayoutText {#text} at (0,7280) size 4710x19 text run at (0,7280) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7280) size 0x0 + LayoutBR {BR} at (4710,7280) size 0x19 LayoutText {#text} at (0,7300) size 4710x19 text run at (0,7300) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7300) size 0x0 + LayoutBR {BR} at (4710,7300) size 0x19 LayoutText {#text} at (0,7320) size 4710x19 text run at (0,7320) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7320) size 0x0 + LayoutBR {BR} at (4710,7320) size 0x19 LayoutText {#text} at (0,7340) size 4710x19 text run at (0,7340) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7340) size 0x0 + LayoutBR {BR} at (4710,7340) size 0x19 LayoutText {#text} at (0,7360) size 4710x19 text run at (0,7360) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7360) size 0x0 + LayoutBR {BR} at (4710,7360) size 0x19 LayoutText {#text} at (0,7380) size 4710x19 text run at (0,7380) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7380) size 0x0 + LayoutBR {BR} at (4710,7380) size 0x19 LayoutText {#text} at (0,7400) size 4710x19 text run at (0,7400) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7400) size 0x0 + LayoutBR {BR} at (4710,7400) size 0x19 LayoutText {#text} at (0,7420) size 4710x19 text run at (0,7420) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7420) size 0x0 + LayoutBR {BR} at (4710,7420) size 0x19 LayoutText {#text} at (0,7440) size 4710x19 text run at (0,7440) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7440) size 0x0 + LayoutBR {BR} at (4710,7440) size 0x19 LayoutText {#text} at (0,7460) size 4710x19 text run at (0,7460) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7460) size 0x0 + LayoutBR {BR} at (4710,7460) size 0x19 LayoutText {#text} at (0,7480) size 4710x19 text run at (0,7480) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7480) size 0x0 + LayoutBR {BR} at (4710,7480) size 0x19 LayoutText {#text} at (0,7500) size 4710x19 text run at (0,7500) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7500) size 0x0 + LayoutBR {BR} at (4710,7500) size 0x19 LayoutText {#text} at (0,7520) size 4710x19 text run at (0,7520) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7520) size 0x0 + LayoutBR {BR} at (4710,7520) size 0x19 LayoutText {#text} at (0,7540) size 4710x19 text run at (0,7540) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7540) size 0x0 + LayoutBR {BR} at (4710,7540) size 0x19 LayoutText {#text} at (0,7560) size 4710x19 text run at (0,7560) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7560) size 0x0 + LayoutBR {BR} at (4710,7560) size 0x19 LayoutText {#text} at (0,7580) size 4710x19 text run at (0,7580) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7580) size 0x0 + LayoutBR {BR} at (4710,7580) size 0x19 LayoutText {#text} at (0,7600) size 4710x19 text run at (0,7600) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7600) size 0x0 + LayoutBR {BR} at (4710,7600) size 0x19 LayoutText {#text} at (0,7620) size 4710x19 text run at (0,7620) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7620) size 0x0 + LayoutBR {BR} at (4710,7620) size 0x19 LayoutText {#text} at (0,7640) size 4710x19 text run at (0,7640) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7640) size 0x0 + LayoutBR {BR} at (4710,7640) size 0x19 LayoutText {#text} at (0,7660) size 4710x19 text run at (0,7660) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7660) size 0x0 + LayoutBR {BR} at (4710,7660) size 0x19 LayoutText {#text} at (0,7680) size 4710x19 text run at (0,7680) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7680) size 0x0 + LayoutBR {BR} at (4710,7680) size 0x19 LayoutText {#text} at (0,7700) size 4710x19 text run at (0,7700) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7700) size 0x0 + LayoutBR {BR} at (4710,7700) size 0x19 LayoutText {#text} at (0,7720) size 4710x19 text run at (0,7720) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7720) size 0x0 + LayoutBR {BR} at (4710,7720) size 0x19 LayoutText {#text} at (0,7740) size 4710x19 text run at (0,7740) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7740) size 0x0 + LayoutBR {BR} at (4710,7740) size 0x19 LayoutText {#text} at (0,7760) size 4710x19 text run at (0,7760) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7760) size 0x0 + LayoutBR {BR} at (4710,7760) size 0x19 LayoutText {#text} at (0,7780) size 4710x19 text run at (0,7780) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7780) size 0x0 + LayoutBR {BR} at (4710,7780) size 0x19 LayoutText {#text} at (0,7800) size 4710x19 text run at (0,7800) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7800) size 0x0 + LayoutBR {BR} at (4710,7800) size 0x19 LayoutText {#text} at (0,7820) size 4710x19 text run at (0,7820) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7820) size 0x0 + LayoutBR {BR} at (4710,7820) size 0x19 LayoutText {#text} at (0,7840) size 4710x19 text run at (0,7840) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7840) size 0x0 + LayoutBR {BR} at (4710,7840) size 0x19 LayoutText {#text} at (0,7860) size 4710x19 text run at (0,7860) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7860) size 0x0 + LayoutBR {BR} at (4710,7860) size 0x19 LayoutText {#text} at (0,7880) size 4710x19 text run at (0,7880) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7880) size 0x0 + LayoutBR {BR} at (4710,7880) size 0x19 LayoutText {#text} at (0,7900) size 4710x19 text run at (0,7900) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7900) size 0x0 + LayoutBR {BR} at (4710,7900) size 0x19 LayoutText {#text} at (0,7920) size 4710x19 text run at (0,7920) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7920) size 0x0 + LayoutBR {BR} at (4710,7920) size 0x19 LayoutText {#text} at (0,7940) size 4710x19 text run at (0,7940) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7940) size 0x0 + LayoutBR {BR} at (4710,7940) size 0x19 LayoutText {#text} at (0,7960) size 4710x19 text run at (0,7960) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7960) size 0x0 + LayoutBR {BR} at (4710,7960) size 0x19 LayoutText {#text} at (0,7980) size 4710x19 text run at (0,7980) width 4710: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" - LayoutBR {BR} at (4710,7980) size 0x0 + LayoutBR {BR} at (4710,7980) size 0x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/as-background-image/background-repeat-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/as-background-image/background-repeat-expected.txt index 7bb1140..5253ac20 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/as-background-image/background-repeat-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/as-background-image/background-repeat-expected.txt
@@ -11,7 +11,7 @@ text run at (448,157) width 4: " " LayoutNGBlockFlow {DIV} at (462,10) size 202x152 [border: (1px solid #008000)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (674,157) size 0x0 + LayoutBR {BR} at (674,157) size 0x19 LayoutNGBlockFlow {DIV} at (10,187) size 202x152 [border: (1px solid #008000)] LayoutText {#text} at (222,334) size 4x19 text run at (222,334) width 4: " " @@ -20,7 +20,7 @@ text run at (448,334) width 4: " " LayoutNGBlockFlow {DIV} at (462,187) size 202x152 [border: (1px solid #008000)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (674,334) size 0x0 + LayoutBR {BR} at (674,334) size 0x19 LayoutNGBlockFlow {DIV} at (10,364) size 202x152 [border: (1px solid #008000)] LayoutText {#text} at (222,511) size 4x19 text run at (222,511) width 4: " " @@ -29,4 +29,4 @@ text run at (448,511) width 4: " " LayoutNGBlockFlow {DIV} at (462,364) size 202x152 [border: (1px solid #008000)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (674,511) size 0x0 + LayoutBR {BR} at (674,511) size 0x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/as-border-image/svg-as-border-image-2-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/as-border-image/svg-as-border-image-2-expected.txt index afb01f6f..5c665e82 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/as-border-image/svg-as-border-image-2-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/as-border-image/svg-as-border-image-2-expected.txt
@@ -12,7 +12,7 @@ LayoutText {#text} at (180,165) size 4x19 text run at (180,165) width 4: " " LayoutNGBlockFlow {DIV} at (194,10) size 160x160 [border: (30px solid #000000)] - LayoutBR {BR} at (364,165) size 0x0 + LayoutBR {BR} at (364,165) size 0x19 LayoutNGBlockFlow {DIV} at (10,195) size 160x160 [border: (30px solid #000000)] LayoutText {#text} at (180,350) size 4x19 text run at (180,350) width 4: " " @@ -29,7 +29,7 @@ LayoutText {#text} at (180,165) size 4x19 text run at (180,165) width 4: " " LayoutNGBlockFlow {DIV} at (194,10) size 160x160 [border: (30px solid #000000)] - LayoutBR {BR} at (364,165) size 0x0 + LayoutBR {BR} at (364,165) size 0x19 LayoutNGBlockFlow {DIV} at (10,195) size 160x160 [border: (30px solid #000000)] LayoutText {#text} at (180,350) size 4x19 text run at (180,350) width 4: " "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/as-border-image/svg-as-border-image-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/as-border-image/svg-as-border-image-expected.txt index afb01f6f..5c665e82 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/as-border-image/svg-as-border-image-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/as-border-image/svg-as-border-image-expected.txt
@@ -12,7 +12,7 @@ LayoutText {#text} at (180,165) size 4x19 text run at (180,165) width 4: " " LayoutNGBlockFlow {DIV} at (194,10) size 160x160 [border: (30px solid #000000)] - LayoutBR {BR} at (364,165) size 0x0 + LayoutBR {BR} at (364,165) size 0x19 LayoutNGBlockFlow {DIV} at (10,195) size 160x160 [border: (30px solid #000000)] LayoutText {#text} at (180,350) size 4x19 text run at (180,350) width 4: " " @@ -29,7 +29,7 @@ LayoutText {#text} at (180,165) size 4x19 text run at (180,165) width 4: " " LayoutNGBlockFlow {DIV} at (194,10) size 160x160 [border: (30px solid #000000)] - LayoutBR {BR} at (364,165) size 0x0 + LayoutBR {BR} at (364,165) size 0x19 LayoutNGBlockFlow {DIV} at (10,195) size 160x160 [border: (30px solid #000000)] LayoutText {#text} at (180,350) size 4x19 text run at (180,350) width 4: " "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/as-object/object-box-sizing-no-width-height-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/as-object/object-box-sizing-no-width-height-expected.txt index de1aa31..7ae99de 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/as-object/object-box-sizing-no-width-height-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/as-object/object-box-sizing-no-width-height-expected.txt
@@ -8,7 +8,7 @@ LayoutText {#text} at (464,215) size 4x19 text run at (464,215) width 4: " " LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (698,215) size 0x0 + LayoutBR {BR} at (698,215) size 0x19 LayoutText {#text} at (0,0) size 0x0 layer at (8,8) size 230x230 LayoutEmbeddedObject {OBJECT} at (0,0) size 230x230 [border: (2px dashed #800000)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/getscreenctm-in-mixed-content-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/getscreenctm-in-mixed-content-expected.txt index ac10771..5871b29 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/getscreenctm-in-mixed-content-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/getscreenctm-in-mixed-content-expected.txt
@@ -10,7 +10,7 @@ text run at (170,3) width 224: "SVGLocatable::getScreenCTM()" LayoutText {#text} at (394,0) size 109x19 text run at (394,0) width 109: " in mixed content" - LayoutBR {br} at (503,0) size 0x0 + LayoutBR {br} at (503,0) size 0x19 LayoutText {#text} at (0,20) size 315x19 text run at (0,20) width 315: "If the test passes you should see a green rectangle." layer at (30,100) size 400x200
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/getsvgdocument-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/getsvgdocument-expected.txt index 18973d7..f3e11fd 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/getsvgdocument-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/getsvgdocument-expected.txt
@@ -9,7 +9,7 @@ text run at (0,20) width 300: "should see SUCCESS printed twice below this:" LayoutNGBlockFlow (anonymous) at (0,56) size 784x60 LayoutBR {BR} at (85,20) size 0x0 - LayoutBR {BR} at (0,20) size 0x0 + LayoutBR {BR} at (0,20) size 0x19 LayoutText {#text} at (0,0) size 0x0 layer at (8,64) size 85x20 LayoutEmbeddedObject {EMBED} at (0,0) size 85x20
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/image-rescale-clip-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/image-rescale-clip-expected.txt index 450b61d..05e40b5 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/image-rescale-clip-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/image-rescale-clip-expected.txt
@@ -4,7 +4,7 @@ LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x576 LayoutNGBlockFlow (anonymous) at (0,0) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow {DIV} at (0,36) size 784x20 LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 351x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/marker-orient-auto-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/marker-orient-auto-expected.txt index 7e295c2..a427627 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/marker-orient-auto-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/marker-orient-auto-expected.txt
@@ -6,7 +6,7 @@ LayoutText {#text} at (0,0) size 779x39 text run at (0,0) width 779: "Test for wkbug.com/112054. This test passes if the green star has orange markers pointing outside only and the blue star has" text run at (0,20) width 229: "orange markers pointing inside only." - LayoutBR {BR} at (229,20) size 0x0 + LayoutBR {BR} at (229,20) size 0x19 LayoutSVGRoot {svg} at (0,40) size 500x500 LayoutSVGResourceMarker {marker} [id="marker"] [markerUnits=strokeWidth] [ref at (0,0)] [angle=auto] LayoutSVGPath {path} at (0,0) size 4x5 [stroke={[type=SOLID] [color=#000000] [stroke width=0.50]}] [fill={[type=SOLID] [color=#FFA500]}] [data="M 0 0 L 4 0 L 2 5 L 0 0 Z"]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/no-inherited-dashed-stroke-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/no-inherited-dashed-stroke-expected.txt index 5a08201b..7f80870 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/no-inherited-dashed-stroke-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/no-inherited-dashed-stroke-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {div} at (0,0) size 784x48 [border: (4px dotted #000000)] LayoutText {#text} at (4,4) size 432x19 text run at (4,4) width 432: "The SVG rect below this should have a solid red stroke and blue fill." - LayoutBR {br} at (436,4) size 0x0 + LayoutBR {br} at (436,4) size 0x19 LayoutText {#text} at (4,24) size 305x19 text run at (4,24) width 305: "https://bugs.webkit.org/show_bug.cgi?id=25738" LayoutNGBlockFlow (anonymous) at (0,48) size 784x105
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/pattern-userSpaceOnUse-userToBaseTransform-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/pattern-userSpaceOnUse-userToBaseTransform-expected.txt index 1daa8c5..ee699af 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/pattern-userSpaceOnUse-userToBaseTransform-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/pattern-userSpaceOnUse-userToBaseTransform-expected.txt
@@ -5,8 +5,8 @@ LayoutNGBlockFlow {body} at (8,8) size 784x347 LayoutText {#text} at (0,0) size 762x19 text run at (0,0) width 762: "There should be no red displayed on the screen, and the patterns should not change when the browser window is resized." - LayoutBR {br} at (762,0) size 0x0 - LayoutBR {br} at (0,20) size 0x0 + LayoutBR {br} at (762,0) size 0x19 + LayoutBR {br} at (0,20) size 0x19 LayoutSVGRoot {svg} at (0,40) size 202x302 LayoutSVGContainer {g} at (0,0) size 200x200 LayoutSVGRect {rect} at (0,100) size 100x50 [fill={[type=SOLID] [color=#FF0000]}] [x=0.00] [y=100.00] [width=100.00] [height=50.00]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/text-match-highlight-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/text-match-highlight-expected.txt index 6e777401..bad9d43 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/text-match-highlight-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/text-match-highlight-expected.txt
@@ -11,8 +11,8 @@ LayoutText {#text} at (493,0) size 744x39 text run at (493,0) width 251: "\". The 6th higlighted instance should be" text run at (0,20) width 41: "active." - LayoutBR {BR} at (41,20) size 0x0 - LayoutBR {BR} at (0,40) size 0x0 + LayoutBR {BR} at (41,20) size 0x19 + LayoutBR {BR} at (0,40) size 0x19 LayoutText {#text} at (0,60) size 89x19 text run at (0,60) width 89: "Lorum ipsum " LayoutInline {SPAN} at (0,0) size 44x19 @@ -28,7 +28,7 @@ text run at (264,60) width 44: "findme" LayoutText {#text} at (308,60) size 45x19 text run at (308,60) width 45: " lorum." - LayoutBR {BR} at (353,60) size 0x0 + LayoutBR {BR} at (353,60) size 0x19 LayoutText {#text} at (0,80) size 51x19 text run at (0,80) width 51: "longtext" LayoutInline {SPAN} at (0,0) size 44x19 @@ -36,7 +36,7 @@ text run at (51,80) width 44: "findme" LayoutText {#text} at (95,80) size 44x19 text run at (95,80) width 44: "noyou." - LayoutBR {BR} at (139,80) size 0x0 + LayoutBR {BR} at (139,80) size 0x19 LayoutSVGRoot {svg} at (0,100) size 450x300 LayoutSVGHiddenContainer {defs} at (100,58.58) size 800x182.84 LayoutSVGPath {path} at (100,58.58) size 800x182.84 [fill={[type=SOLID] [color=#000000]}] [data="M 100 200 C 200 100 300 0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100"]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/transformed-text-pattern-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/transformed-text-pattern-expected.txt index 6686b63e..1ccc6d05 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/transformed-text-pattern-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/custom/transformed-text-pattern-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x225 LayoutText {#text} at (0,0) size 318x19 text run at (0,0) width 318: "This test passes if there is an A and a green square." - LayoutBR {BR} at (318,0) size 0x0 + LayoutBR {BR} at (318,0) size 0x19 LayoutSVGRoot {svg} at (0,20) size 200x200 LayoutSVGHiddenContainer {defs} at (0,0) size 0x0 LayoutSVGResourcePattern {pattern} [id="pattern"] [patternUnits=userSpaceOnUse] [patternContentUnits=userSpaceOnUse] [patternTransform={m=((10.00,0.00)(0.00,10.00)) t=(0.00,0.00)}]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/text/bbox-with-glyph-overflow-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/text/bbox-with-glyph-overflow-expected.txt index 3ad63d3..1b05a13 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/text/bbox-with-glyph-overflow-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/text/bbox-with-glyph-overflow-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x525 LayoutText {#text} at (0,0) size 267x19 text run at (0,0) width 267: "No glyphs should extend outside the rects." - LayoutBR {BR} at (267,0) size 0x0 + LayoutBR {BR} at (267,0) size 0x19 LayoutSVGRoot {svg} at (0,20) size 700x500 LayoutSVGText {text} at (50,5) size 118x57 contains 1 chunk(s) LayoutSVGInlineText {#text} at (50,5) size 118x57
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/text/bbox-with-glyph-overflow-on-path-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/text/bbox-with-glyph-overflow-on-path-expected.txt index 126b3460..5fddd21 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/text/bbox-with-glyph-overflow-on-path-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/text/bbox-with-glyph-overflow-on-path-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x525 LayoutText {#text} at (0,0) size 267x19 text run at (0,0) width 267: "No glyphs should extend outside the rects." - LayoutBR {BR} at (267,0) size 0x0 + LayoutBR {BR} at (267,0) size 0x19 LayoutSVGRoot {svg} at (0,20) size 700x500 LayoutSVGHiddenContainer {defs} at (50,100) size 350x350 LayoutSVGPath {path} at (50,100) size 350x0 [fill={[type=SOLID] [color=#000000]}] [data="M 50 100 L 400 100"]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/text/bbox-with-glyph-overflow-zoomed-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/text/bbox-with-glyph-overflow-zoomed-expected.txt index a62aa27d..3bcdf5f 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/text/bbox-with-glyph-overflow-zoomed-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/text/bbox-with-glyph-overflow-zoomed-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (14.39,14.39) size 771.22x222 LayoutText {#text} at (0,0) size 498x33 text run at (0,0) width 498: "No glyphs should extend outside the rects." - LayoutBR {BR} at (498,0) size 0x0 + LayoutBR {BR} at (498,0) size 0x33 LayoutSVGRoot {svg} at (0,34) size 360x180 LayoutSVGHiddenContainer {defs} at (20,20) size 180x0 LayoutSVGPath {path} at (20,20) size 180x0 [fill={[type=SOLID] [color=#000000]}] [data="M 20 20 L 200 20"]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/wicd/test-rightsizing-a-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/wicd/test-rightsizing-a-expected.txt index fb97141..c703310 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/wicd/test-rightsizing-a-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/wicd/test-rightsizing-a-expected.txt
@@ -14,7 +14,7 @@ LayoutImage {object} at (0,0) size 176x62 LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow (anonymous) at (0,128.14) size 752x19 - LayoutBR {br} at (0,0) size 0x0 + LayoutBR {br} at (0,0) size 0x18 LayoutNGBlockFlow {div} at (0,147.14) size 176x62 [bgcolor=#FF0000] LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow {p} at (0,212.02) size 691.83x36 @@ -25,7 +25,7 @@ LayoutImage {object} at (0,0) size 176x62 LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow (anonymous) at (0,315.77) size 752x19 - LayoutBR {br} at (0,0) size 0x0 + LayoutBR {br} at (0,0) size 0x18 LayoutNGBlockFlow {div} at (0,334.77) size 176x62 [bgcolor=#FF0000] LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow {p} at (0,399.64) size 691.83x36 @@ -37,7 +37,7 @@ text run at (0,0) width 668: "This tests have succeeded, if in both cases, the look (dimensions) of the SVG and the GIF are exactly the same" text run at (0,18) width 411: "(except the text apparently) and no red background color is visible." LayoutNGBlockFlow {p} at (0,483.14) size 691.83x36 - LayoutBR {br} at (0,0) size 0x0 + LayoutBR {br} at (0,0) size 0x18 LayoutInline {a} at (0,0) size 30x18 [color=#000066] LayoutText {#text} at (0,18) size 30x18 text run at (0,18) width 30: "Back"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/zoom/page/zoom-svg-through-object-with-override-size-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/zoom/page/zoom-svg-through-object-with-override-size-expected.txt index 37b8a83..06a6a858 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/zoom/page/zoom-svg-through-object-with-override-size-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/svg/zoom/page/zoom-svg-through-object-with-override-size-expected.txt
@@ -4,7 +4,7 @@ LayoutNGBlockFlow {HTML} at (0,0) size 800x376.69 LayoutNGBlockFlow {BODY} at (5.55,5.55) size 788.91x365.59 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (348,337) size 0x0 + LayoutBR {BR} at (348,337) size 1x15 LayoutText {#text} at (0,351) size 234x15 text run at (0,351) width 234: "The image of Tux should fill the entire red square." layer at (6,6) size 349x349
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/3d/general/perspective-units-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/3d/general/perspective-units-expected.txt index e36a25c..e1aaf681 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/3d/general/perspective-units-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/3d/general/perspective-units-expected.txt
@@ -12,7 +12,7 @@ LayoutText {#text} at (488,157) size 4x19 text run at (488,157) width 4: " " LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (734,157) size 0x0 + LayoutBR {BR} at (734,157) size 0x19 LayoutText {#text} at (0,0) size 0x0 layer at (28,62) size 202x152 LayoutNGBlockFlow {DIV} at (20,10) size 202x152 [border: (1px solid #000000)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/3d/hit-testing/backface-hit-test-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/3d/hit-testing/backface-hit-test-expected.txt index 21b088c..28cfaab 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/3d/hit-testing/backface-hit-test-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/3d/hit-testing/backface-hit-test-expected.txt
@@ -13,10 +13,10 @@ LayoutNGBlockFlow {DIV} at (0,238) size 784x40 LayoutText {#text} at (0,0) size 167x19 text run at (0,0) width 167: "Found box1 on left: PASS" - LayoutBR {BR} at (167,0) size 0x0 + LayoutBR {BR} at (167,0) size 0x19 LayoutText {#text} at (0,20) size 202x19 text run at (0,20) width 202: "Found container on right: PASS" - LayoutBR {BR} at (202,20) size 0x0 + LayoutBR {BR} at (202,20) size 0x19 layer at (27,63) size 160x160 LayoutNGBlockFlow {DIV} at (19,19) size 160x160 [bgcolor=#808080] layer at (227,63) size 160x160
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/3d/hit-testing/backface-no-transform-hit-test-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/3d/hit-testing/backface-no-transform-hit-test-expected.txt index a7f0961..8178bf2 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/3d/hit-testing/backface-no-transform-hit-test-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/3d/hit-testing/backface-no-transform-hit-test-expected.txt
@@ -9,10 +9,10 @@ LayoutNGBlockFlow {DIV} at (0,238) size 784x40 LayoutText {#text} at (0,0) size 193x19 text run at (0,0) width 193: "Found container on left: PASS" - LayoutBR {BR} at (193,0) size 0x0 + LayoutBR {BR} at (193,0) size 0x19 LayoutText {#text} at (0,20) size 176x19 text run at (0,20) width 176: "Found box1 on right: PASS" - LayoutBR {BR} at (176,20) size 0x0 + LayoutBR {BR} at (176,20) size 0x19 layer at (8,44) size 402x202 LayoutNGBlockFlow {DIV} at (0,36) size 402x202 [bgcolor=#EEEEEE] [border: (1px solid #000000)] LayoutText {#text} at (197,32) size 4x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/3d/point-mapping/3d-point-mapping-origins-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/3d/point-mapping/3d-point-mapping-origins-expected.txt index 8abaf4d5..ede809ef 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/3d/point-mapping/3d-point-mapping-origins-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/3d/point-mapping/3d-point-mapping-origins-expected.txt
@@ -8,7 +8,7 @@ text run at (243,228) width 4: " " LayoutNGBlockFlow {DIV} at (267,21) size 202x202 [border: (1px solid #000000)] LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (489,228) size 0x0 + LayoutBR {BR} at (489,228) size 0x19 LayoutNGBlockFlow {DIV} at (21,268) size 202x202 [border: (1px solid #000000)] LayoutText {#text} at (243,475) size 4x19 text run at (243,475) width 4: " "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/bounding-rect-zoom-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/bounding-rect-zoom-expected.txt index bc485c94..6c315977 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/bounding-rect-zoom-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/bounding-rect-zoom-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 785.63x34 LayoutText {#text} at (0,0) size 302x16 text run at (0,0) width 302: "Tests that these functions account for full page zoom." - LayoutBR {BR} at (302,0) size 0x0 + LayoutBR {BR} at (302,0) size 0x16 LayoutText {#text} at (0,17) size 176x16 text run at (0,17) width 176: "There should be no red visible." LayoutTable {TABLE} at (0,48.39) size 785x21
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/identity-matrix-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/identity-matrix-expected.txt index b5305e0..63662b66 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/identity-matrix-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/transforms/identity-matrix-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 246x19 text run at (0,0) width 246: "The following divs should be identical:" - LayoutBR {BR} at (246,0) size 0x0 + LayoutBR {BR} at (246,0) size 0x19 LayoutNGBlockFlow (floating) {DIV} at (5,25) size 110x110 [bgcolor=#87CEEB] [border: (5px solid #000000)] layer at (133,33) size 110x110 LayoutNGBlockFlow (floating) {DIV} at (125,25) size 110x110 [bgcolor=#87CEEB] [border: (5px solid #000000)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/cross-fade-background-size-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/cross-fade-background-size-expected.txt index a4d9fba..aac7336 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/cross-fade-background-size-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/cross-fade-background-size-expected.txt
@@ -4,13 +4,13 @@ LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow (anonymous) at (0,50) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow (anonymous) at (0,120) size 784x40 - LayoutBR {BR} at (0,0) size 0x0 - LayoutBR {BR} at (0,20) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 + LayoutBR {BR} at (0,20) size 0x19 LayoutNGBlockFlow {DIV} at (0,160) size 200x50 LayoutNGBlockFlow (anonymous) at (0,210) size 784x20 - LayoutBR {BR} at (0,0) size 0x0 + LayoutBR {BR} at (0,0) size 0x19 LayoutNGBlockFlow {DIV} at (0,230) size 200x50 layer at (8,8) size 200x50 LayoutNGBlockFlow {DIV} at (0,0) size 200x50
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/feature-policy-max-downscaling-image-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/feature-policy-max-downscaling-image-expected.txt new file mode 100644 index 0000000..3c9632e --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/feature-policy-max-downscaling-image-expected.txt
@@ -0,0 +1,35 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x525 + LayoutNGBlockFlow {HTML} at (0,0) size 800x525 + LayoutNGBlockFlow {BODY} at (8,8) size 784x509 + LayoutText {#text} at (0,0) size 0x0 +layer at (8,8) size 604x504 + LayoutIFrame {IFRAME} at (0,0) size 604x504 [border: (2px inset #EEEEEE)] + layer at (0,0) size 600x500 + LayoutView at (0,0) size 600x500 + layer at (0,0) size 600x410 + LayoutNGBlockFlow {HTML} at (0,0) size 600x410 + LayoutNGBlockFlow {BODY} at (8,8) size 584x394 + LayoutImage {IMG} at (0,0) size 256x256 + LayoutText {#text} at (256,241) size 4x19 + text run at (256,241) width 4: " " + LayoutImage {IMG} at (260,0) size 100x256 + LayoutText {#text} at (0,0) size 0x0 + LayoutImage {IMG} at (0,289) size 256x100 + LayoutText {#text} at (256,374) size 4x19 + text run at (256,374) width 4: " " + LayoutImage {IMG} at (260,261) size 128x128 + LayoutText {#text} at (388,374) size 4x19 + text run at (388,374) width 4: " " + LayoutImage {IMG} at (392,339) size 50x50 + LayoutText {#text} at (442,374) size 4x19 + text run at (442,374) width 4: " " + LayoutImage {IMG} at (446,339) size 50x50 + LayoutText {#text} at (496,374) size 4x19 + text run at (496,374) width 4: " " + LayoutImage {IMG} at (500,351.22) size 37.78x37.78 + LayoutText {#text} at (537,374) size 5x19 + text run at (537,374) width 5: " " + LayoutImage {IMG} at (541.78,349.22) size 39.78x39.78 [border: (1px solid #0000FF)] + LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/image-map-anchor-children-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/image-map-anchor-children-expected.txt index 7e79045..7769a61 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/image-map-anchor-children-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/image-map-anchor-children-expected.txt
@@ -5,9 +5,9 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutImage {IMG} at (0,0) size 479x150 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {MAP} at (0,0) size 224x19 + LayoutInline {MAP} at (0,0) size 479x39 LayoutText {#text} at (0,0) size 0x0 - LayoutBR {BR} at (479,135) size 0x0 + LayoutBR {BR} at (479,135) size 0x19 LayoutInline {A} at (0,0) size 91x19 [color=#0000EE] LayoutText {#text} at (0,155) size 91x19 text run at (0,155) width 91: "John Hancock"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-circle-focus-ring-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-circle-focus-ring-expected.txt index 319558ef..573df41 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-circle-focus-ring-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-circle-focus-ring-expected.txt
@@ -8,9 +8,9 @@ text run at (0,0) width 763: "Assuming the port-specific theme draws focus rings, this test can be used to ensure that a focus ring is drawn for an <area" text run at (0,20) width 760: "shape=\"circle\">. This test PASSED if a circular-shaped focus ring is drawn around the <area> in the imagemap (below)." LayoutNGBlockFlow (anonymous) at (0,56) size 784x133 - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (0,0) size 128x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-expected.txt index d4eb00d..d3993e4 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-expected.txt
@@ -8,9 +8,9 @@ text run at (0,0) width 724: "Assuming the port-specific theme draws focus rings, this test can be used to ensure that a focus ring is drawn for an" text run at (0,20) width 623: "imagemap. This test PASSED if a focus ring is drawn around the <area> in the imagemap (below)." LayoutNGBlockFlow (anonymous) at (0,56) size 784x133 - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (0,0) size 128x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-expected.txt index 31c4984f..9d01d11 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-expected.txt
@@ -8,9 +8,9 @@ text run at (0,0) width 776: "Assuming the port-specific theme draws focus rings, this test can be used to ensure that a focus ring is drawn for an <area>." text run at (0,20) width 641: "This test PASSED if a green-colored focus ring is drawn around the <area> in the imagemap (below)." LayoutNGBlockFlow (anonymous) at (0,56) size 784x133 - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (0,0) size 128x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.txt index cc52415..f813dd1a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.txt
@@ -9,9 +9,9 @@ text run at (0,20) width 768: "can be explicitly inherited from <map>. This test PASSED if a green-colored focus ring is drawn around the <area> in the" text run at (0,40) width 122: "imagemap (below)." LayoutNGBlockFlow (anonymous) at (0,76) size 784x133 - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (0,0) size 128x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.txt index b12b951..38ba9d4 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.txt
@@ -14,9 +14,9 @@ text run at (674,20) width 61: ". This test" text run at (0,40) width 566: "FAILED if a red-colored focus ring is drawn around the <area> in the imagemap (below)." LayoutNGBlockFlow (anonymous) at (0,76) size 784x133 - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (0,0) size 128x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-with-scale-transform-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-with-scale-transform-expected.txt new file mode 100644 index 0000000..b3b6438 --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-with-scale-transform-expected.txt
@@ -0,0 +1,14 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x36 + LayoutNGBlockFlow {HTML} at (0,0) size 800x36 + LayoutNGBlockFlow {BODY} at (8,8) size 784x20 + LayoutText {#text} at (0,0) size 487x19 + text run at (0,0) width 487: "Tests that we paint area outline properly when the image's container is scaled." +layer at (100,100) size 100x100 + LayoutNGBlockFlow (positioned) {DIV} at (100,100) size 100x100 + LayoutImage {IMG} at (0,0) size 50x50 + LayoutText {#text} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 + LayoutInline {AREA} at (0,0) size 0x19 + LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-zoom-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-zoom-expected.txt index 6dc588b..4eb0ffb 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-zoom-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-zoom-expected.txt
@@ -7,9 +7,9 @@ text run at (0,0) width 677: "This test can be used to ensure that a focus ring is drawn correctly for an" text run at (0,27) width 727: "imagemap even when the page is zoomed. This test PASSED if a focus ring is" text run at (0,218) width 515: "drawn around the <area> in the imagemap to the right. " - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x27 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x27 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (515,54) size 184.31x184.31
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-overflowing-circle-focus-ring-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-overflowing-circle-focus-ring-expected.txt index 8c3ecb2..c7be818 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-overflowing-circle-focus-ring-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-overflowing-circle-focus-ring-expected.txt
@@ -9,9 +9,9 @@ text run at (0,20) width 743: "shape=\"circle\"> that overflows the img element. This test PASSED if a half-circule-shaped focus ring is drawn for the" text run at (0,40) width 209: "<area> in the imagemap (below)." LayoutNGBlockFlow (anonymous) at (0,76) size 784x133 - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (0,0) size 128x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.txt index abc9bd9b..215d54287 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.txt
@@ -9,9 +9,9 @@ text run at (0,20) width 782: "shape=\"polygon\"> that is overflowing the bounds for the img element. This test PASSED if a clipped star-shaped focus ring" text run at (0,40) width 338: "is drawn around the <area> in the imagemap (below)." LayoutNGBlockFlow (anonymous) at (0,76) size 784x133 - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (0,0) size 128x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.txt index 9d16e0f9..b6efd46 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.txt
@@ -8,9 +8,9 @@ text run at (0,0) width 763: "Assuming the port-specific theme draws focus rings, this test can be used to ensure that a focus ring is drawn for an <area" text run at (0,20) width 763: "shape=\"polygon\">. This test PASSED if a cross-shaped focus ring is drawn around the <area> in the imagemap (below)." LayoutNGBlockFlow (anonymous) at (0,56) size 784x133 - LayoutInline {MAP} at (0,0) size 0x0 + LayoutInline {MAP} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 - LayoutInline {AREA} at (0,0) size 0x0 + LayoutInline {AREA} at (0,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 LayoutImage {IMG} at (0,0) size 128x128
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/user-activation-v2/fullscreen/full-screen-with-flex-item-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/user-activation-v2/fullscreen/full-screen-with-flex-item-expected.txt new file mode 100644 index 0000000..942dc5a --- /dev/null +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/user-activation-v2/fullscreen/full-screen-with-flex-item-expected.txt
@@ -0,0 +1,6 @@ +Enter Fullscreen +EVENT(webkitfullscreenchange) +EVENT(webkitfullscreenchange) +EXPECTED (600 == '600') OK +END OF TEST +
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/video-surface-layer/media/audio-controls-rendering-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/video-surface-layer/media/audio-controls-rendering-expected.txt index e5068e8c..610087a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/video-surface-layer/media/audio-controls-rendering-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/video-surface-layer/media/audio-controls-rendering-expected.txt
@@ -8,10 +8,10 @@ text run at (0,0) width 152: "Test controls placement." LayoutNGBlockFlow (anonymous) at (0,36) size 784x168 LayoutBR {BR} at (300,54) size 0x0 - LayoutBR {BR} at (0,54) size 0x0 - LayoutBR {BR} at (320,113) size 0x0 - LayoutBR {BR} at (0,128) size 0x0 - LayoutBR {BR} at (0,148) size 0x0 + LayoutBR {BR} at (0,54) size 0x19 + LayoutBR {BR} at (320,113) size 0x19 + LayoutBR {BR} at (0,128) size 0x19 + LayoutBR {BR} at (0,148) size 0x19 layer at (8,44) size 300x54 LayoutMedia {AUDIO} at (0,0) size 300x54 [bgcolor=#0000FF] layer at (8,118) size 320x54
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/video-surface-layer/media/video-display-toggle-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/video-surface-layer/media/video-display-toggle-expected.txt index d4a96c2..d2234a46 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/video-surface-layer/media/video-display-toggle-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/video-surface-layer/media/video-display-toggle-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 492x19 text run at (0,0) width 492: "This tests that toggling the display property won't make the controls disappear." - LayoutBR {BR} at (492,0) size 0x0 + LayoutBR {BR} at (492,0) size 0x19 LayoutText {#text} at (0,0) size 0x0 layer at (8,28) size 320x240 LayoutVideo {VIDEO} at (0,20) size 320x240 @@ -28,7 +28,8 @@ LayoutNGBlockFlow {DIV} at (51,0) size 39x48 [color=#FFFFFF] LayoutText {#text} at (0,15) size 39x18 text run at (0,15) width 39: "/ 0:06" - LayoutNGBlockFlow {DIV} at (90,48) size 134x0 + LayoutNGBlockFlow {DIV} at (90,48) size 86x0 + LayoutButton {INPUT} at (176,0) size 48x48 LayoutButton {INPUT} at (224,0) size 48x48 LayoutButton {INPUT} at (272,0) size 48x48 layer at (8,252) size 320x16
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/video-surface-layer/media/video-layer-crash-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/video-surface-layer/media/video-layer-crash-expected.txt index 71c4aeeb..c8e1f04a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/video-surface-layer/media/video-layer-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/video-surface-layer/media/video-layer-crash-expected.txt
@@ -9,13 +9,13 @@ LayoutNGBlockFlow (anonymous) at (0,36) size 784x342 LayoutText {#text} at (0,0) size 4x19 text run at (0,0) width 4: " " - LayoutBR {BR} at (4,0) size 0x0 + LayoutBR {BR} at (4,0) size 0x19 LayoutText {#text} at (0,161) size 4x19 text run at (0,161) width 4: " " - LayoutBR {BR} at (210,161) size 0x0 + LayoutBR {BR} at (210,161) size 0x19 LayoutText {#text} at (0,322) size 4x19 text run at (0,322) width 4: " " - LayoutBR {BR} at (210,322) size 0x0 + LayoutBR {BR} at (210,322) size 0x19 layer at (12,64) size 206x156 LayoutVideo {VIDEO} at (4,20) size 206x156 [border: (3px solid #FF0000)] layer at (15,67) size 200x150 backgroundClip at (65,105) size 100x75 clip at (65,105) size 100x75
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/video-surface-layer/media/video-replaces-poster-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/video-surface-layer/media/video-replaces-poster-expected.txt index 2a117fb4..9c12c83c 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/video-surface-layer/media/video-replaces-poster-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/video-surface-layer/media/video-replaces-poster-expected.txt
@@ -11,7 +11,7 @@ text run at (52,0) width 305: "https://bugs.webkit.org/show_bug.cgi?id=34966" LayoutText {#text} at (357,0) size 4x19 text run at (357,0) width 4: "." - LayoutBR {BR} at (361,0) size 0x0 + LayoutBR {BR} at (361,0) size 0x19 LayoutText {#text} at (0,20) size 204x19 text run at (0,20) width 204: "You should see the video below." LayoutNGBlockFlow (anonymous) at (0,56) size 784x275
diff --git a/third_party/WebKit/LayoutTests/http/tests/misc/resource-timing-iframe-restored-from-history.html b/third_party/WebKit/LayoutTests/http/tests/misc/resource-timing-iframe-restored-from-history.html index 6c294a5c..4ab9492 100644 --- a/third_party/WebKit/LayoutTests/http/tests/misc/resource-timing-iframe-restored-from-history.html +++ b/third_party/WebKit/LayoutTests/http/tests/misc/resource-timing-iframe-restored-from-history.html
@@ -1,6 +1,5 @@ <!DOCTYPE html> <script src="/js-test-resources/js-test.js"></script> -<iframe id="frame" src="resources/frame-initial-url.html"></iframe> <script> description('Tests that iframe restored from history does not report resource timing.'); window.jsTestIsAsync = true; @@ -21,4 +20,10 @@ finishJSTest(); } } + +window.onload = function() { + document.querySelector("iframe").src = "resources/frame-initial-url.html"; +} + </script> +<iframe></iframe>
diff --git a/third_party/WebKit/LayoutTests/http/tests/navigation/back-send-referrer.html b/third_party/WebKit/LayoutTests/http/tests/navigation/back-send-referrer.html index f5d7c809..78f1c95 100644 --- a/third_party/WebKit/LayoutTests/http/tests/navigation/back-send-referrer.html +++ b/third_party/WebKit/LayoutTests/http/tests/navigation/back-send-referrer.html
@@ -4,6 +4,10 @@ testRunner.dumpAsText(); } - window.name = "0"; - window.location = "resources/back-send-referrer-helper.php"; + window.onload = function() { + setTimeout(function() { + window.name = "0"; + window.location = "resources/back-send-referrer-helper.php" + }, 0); + } </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/object-src-inject.html b/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/object-src-inject.html index 3a44fcb..6efd860 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/object-src-inject.html +++ b/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/object-src-inject.html
@@ -7,6 +7,7 @@ testRunner.dumpAsText(); testRunner.setXSSAuditorEnabled(true); testRunner.waitUntilDone(); + testRunner.setDumpConsoleMessages(false); // See https://crbug.com/862959 notifyDoneAfterReceivingLoaded(); } </script>
diff --git a/third_party/blink/public/platform/modules/fetch/fetch_api_response.mojom b/third_party/blink/public/platform/modules/fetch/fetch_api_response.mojom index 21d7ec93..7c34373 100644 --- a/third_party/blink/public/platform/modules/fetch/fetch_api_response.mojom +++ b/third_party/blink/public/platform/modules/fetch/fetch_api_response.mojom
@@ -10,10 +10,13 @@ import "third_party/blink/public/mojom/service_worker/service_worker_error_type.mojom"; import "url/mojom/url.mojom"; -// Represents a response to a fetch operation. ServiceWorker uses this to -// respond to a FetchEvent dispatched by the browser. It is currently used by -// the Cache API, and the plan is for the fetch() API to also use it. It's -// currently typemapped to content::ServiceWorkerResponse. +// Describes a Response in terms of the concept from the Fetch spec. +// https://fetch.spec.whatwg.org/#response-class +// It is currently used by the Cache Storage API, and the plan is to use it also +// in Service Worker and Background Fetch implementations to replace +// content::ServiceWorkerResponse. +// Note: Be sure to update CacheStorageCache::EstimatedResponseSizeWithoutBlob() +// when adding or removing members. struct FetchAPIResponse { // List of URLs that originally generated this response, it includes all URLs // in case of HTTP redirect, first URL on redirect chain is on position 0.
diff --git a/third_party/blink/public/web/web_form_control_element.h b/third_party/blink/public/web/web_form_control_element.h index 5a249f5..7ff76101 100644 --- a/third_party/blink/public/web/web_form_control_element.h +++ b/third_party/blink/public/web/web_form_control_element.h
@@ -65,9 +65,9 @@ enum WebAutofillState GetAutofillState() const; bool IsAutofilled() const; void SetAutofillState(enum WebAutofillState); - bool IsEnteredByUser() const; + bool UserHasEditedTheField() const; // This is only used for simulating the user's action in tests. - void SetIsEnteredByUserForTest(); + void SetUserHasEditedTheFieldForTest(); // The autofill section to which this element belongs (e.g. billing address, // shipping address, .. .)
diff --git a/third_party/blink/renderer/bindings/bindings.gni b/third_party/blink/renderer/bindings/bindings.gni index f58f106..c49b31b2 100644 --- a/third_party/blink/renderer/bindings/bindings.gni +++ b/third_party/blink/renderer/bindings/bindings.gni
@@ -30,6 +30,8 @@ "core/v8/binding_security.cc", "core/v8/binding_security.h", "core/v8/callback_promise_adapter.h", + "core/v8/custom_wrappable_adapter.cc", + "core/v8/custom_wrappable_adapter.h", "core/v8/dictionary.cc", "core/v8/dictionary.h", "core/v8/dictionary_helper_for_core.cc",
diff --git a/third_party/blink/renderer/bindings/core/v8/custom_wrappable_adapter.cc b/third_party/blink/renderer/bindings/core/v8/custom_wrappable_adapter.cc new file mode 100644 index 0000000..c914e8b --- /dev/null +++ b/third_party/blink/renderer/bindings/core/v8/custom_wrappable_adapter.cc
@@ -0,0 +1,79 @@ +// 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. + +#include "third_party/blink/renderer/bindings/core/v8/custom_wrappable_adapter.h" + +#include "third_party/blink/renderer/bindings/core/v8/v8_dom_configuration.h" +#include "third_party/blink/renderer/platform/bindings/script_state.h" +#include "third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h" +#include "third_party/blink/renderer/platform/bindings/wrapper_type_info.h" + +namespace blink { + +namespace { + +v8::Local<v8::FunctionTemplate> CreateCustomWrappableTemplate( + v8::Isolate* isolate, + const DOMWrapperWorld& world); + +const WrapperTypeInfo custom_wrappable_info = { + gin::kEmbedderBlink, + CreateCustomWrappableTemplate, + nullptr, + "CustomWrappableAdapter", + nullptr, + WrapperTypeInfo::kWrapperTypeNoPrototype, + WrapperTypeInfo::kCustomWrappableId, + WrapperTypeInfo::kNotInheritFromActiveScriptWrappable, +}; + +void InstallCustomWrappableTemplate( + v8::Isolate* isolate, + const DOMWrapperWorld& world, + v8::Local<v8::FunctionTemplate> interfaceTemplate) { + V8DOMConfiguration::InitializeDOMInterfaceTemplate( + isolate, interfaceTemplate, custom_wrappable_info.interface_name, + v8::Local<v8::FunctionTemplate>(), kV8DefaultWrapperInternalFieldCount); +} + +v8::Local<v8::FunctionTemplate> CreateCustomWrappableTemplate( + v8::Isolate* isolate, + const DOMWrapperWorld& world) { + return V8DOMConfiguration::DomClassTemplate( + isolate, world, const_cast<WrapperTypeInfo*>(&custom_wrappable_info), + InstallCustomWrappableTemplate); +} + +} // namespace + +CustomWrappableAdapter* CustomWrappableAdapter::LookupInternal( + v8::Local<v8::Object> object, + const V8PrivateProperty::Symbol& property) { + v8::Local<v8::Value> custom_wrappable_adapter_value; + if (!property.GetOrUndefined(object).ToLocal(&custom_wrappable_adapter_value)) + return nullptr; + + if (!custom_wrappable_adapter_value->IsUndefined()) { + return static_cast<CustomWrappableAdapter*>( + ToCustomWrappable(custom_wrappable_adapter_value.As<v8::Object>())); + } + return nullptr; +} + +void CustomWrappableAdapter::Attach(ScriptState* script_state, + v8::Local<v8::Object> object, + const V8PrivateProperty::Symbol& property, + CustomWrappableAdapter* adapter) { + DCHECK(wrapper_.IsEmpty()); + v8::Isolate* isolate = script_state->GetIsolate(); + v8::Local<v8::Object> wrapper_object = V8DOMWrapper::CreateWrapper( + isolate, script_state->GetContext()->Global(), &custom_wrappable_info); + V8DOMWrapper::AssociateObjectWithWrapper( + isolate, adapter, &custom_wrappable_info, wrapper_object); + property.Set(object, wrapper_object); + wrapper_.Set(isolate, wrapper_object); + custom_wrappable_info.ConfigureWrapper(&wrapper_.Get()); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/custom_wrappable_adapter.h b/third_party/blink/renderer/bindings/core/v8/custom_wrappable_adapter.h new file mode 100644 index 0000000..2a5e406 --- /dev/null +++ b/third_party/blink/renderer/bindings/core/v8/custom_wrappable_adapter.h
@@ -0,0 +1,63 @@ +// 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. + +#ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_CUSTOM_WRAPPABLE_ADAPTER_H_ +#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_CUSTOM_WRAPPABLE_ADAPTER_H_ + +#include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/platform/bindings/custom_wrappable.h" +#include "third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h" +#include "third_party/blink/renderer/platform/bindings/v8_private_property.h" +#include "third_party/blink/renderer/platform/heap/handle.h" +#include "v8/include/v8.h" + +namespace blink { + +class ScriptState; + +// CustomWrappableAdapter establishes a link from a given JavaScript object to +// the Blink object inheriting from CustomWrappableAdapter. The link is known to +// garbage collectors and the lifetime of the V8 and Blink objects will be tied +// together. The adapter can be used to model liveness across V8 and Blink +// component boundaries. In contrast to ScriptWrappable, no IDL definitions are +// required. +// +// The intended use case is binding the lifetime of a Blink object to a +// user-provided JavaScript object. +class CORE_EXPORT CustomWrappableAdapter : public CustomWrappable { + public: + // Lookup the CustomWrappableAdapter implementation on a given |object|'s + // |property|. Returns nullptr if no adapter has been attached. See Attach. + template <typename T> + static T* Lookup(v8::Local<v8::Object> object, + const V8PrivateProperty::Symbol& property) { + return static_cast<T*>(LookupInternal(object, property)); + } + + // Attaches a given |adapter| to |object|'s |property|. + void Attach(ScriptState*, + v8::Local<v8::Object> object, + const V8PrivateProperty::Symbol& property, + CustomWrappableAdapter* adapter); + + ~CustomWrappableAdapter() override = default; + + void Trace(Visitor* visitor) override { + visitor->Trace(wrapper_); + CustomWrappable::Trace(visitor); + } + + private: + static CustomWrappableAdapter* LookupInternal( + v8::Local<v8::Object>, + const V8PrivateProperty::Symbol&); + + // Internal wrapper reference is needed as Oilpan looks up its roots from V8 + // by following all configured wrapper references. + TraceWrapperV8Reference<v8::Object> wrapper_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_CUSTOM_WRAPPABLE_ADAPTER_H_
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h b/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h index cbd188c..ee7f642 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h +++ b/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.h
@@ -34,7 +34,6 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/events/event_listener.h" #include "third_party/blink/renderer/platform/bindings/dom_wrapper_world.h" -#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h" #include "third_party/blink/renderer/platform/heap/self_keep_alive.h" #include "v8/include/v8.h"
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_event_listener_helper.cc b/third_party/blink/renderer/bindings/core/v8/v8_event_listener_helper.cc index 53983941..06f8c13 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_event_listener_helper.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_event_listener_helper.cc
@@ -30,6 +30,7 @@ #include "third_party/blink/renderer/bindings/core/v8/v8_event_listener_helper.h" +#include "third_party/blink/renderer/bindings/core/v8/custom_wrappable_adapter.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/bindings/core/v8/v8_error_handler.h" #include "third_party/blink/renderer/bindings/core/v8/v8_event_listener.h" @@ -42,27 +43,21 @@ template <typename ListenerType, typename ListenerFactory> ListenerType* GetEventListenerInternal( - v8::Isolate* isolate, + ScriptState* script_state, v8::Local<v8::Object> object, const V8PrivateProperty::Symbol& listener_property, ListenerLookupType lookup, const ListenerFactory& listener_factory) { - DCHECK(isolate->InContext()); - v8::Local<v8::Value> listener_value; - if (!listener_property.GetOrUndefined(object).ToLocal(&listener_value)) - return nullptr; + DCHECK(script_state->GetIsolate()->InContext()); ListenerType* listener = - listener_value->IsUndefined() - ? nullptr - : static_cast<ListenerType*>( - listener_value.As<v8::External>()->Value()); + CustomWrappableAdapter::Lookup<ListenerType>(object, listener_property); if (listener || lookup == kListenerFindOnly) return listener; listener = listener_factory(); - if (listener) - listener_property.Set(object, v8::External::New(isolate, listener)); - + if (listener) { + listener->Attach(script_state, object, listener_property, listener); + } return listener; } @@ -87,7 +82,7 @@ : V8PrivateProperty::GetV8EventListenerListener(isolate); return GetEventListenerInternal<V8EventListener>( - isolate, object, listener_property, lookup, + script_state, object, listener_property, lookup, [object, is_attribute, script_state]() { return script_state->World().IsWorkerWorld() ? V8WorkerOrWorkletEventListener::Create( @@ -109,7 +104,7 @@ V8PrivateProperty::GetV8ErrorHandlerErrorHandler(isolate); return GetEventListenerInternal<V8ErrorHandler>( - isolate, object, listener_property, kListenerFindOrCreate, + script_state, object, listener_property, kListenerFindOrCreate, [object, script_state]() { const bool is_attribute = true; return V8ErrorHandler::Create(object, is_attribute, script_state);
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc index ff242d19..af26646 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
@@ -75,6 +75,12 @@ return node; } +bool IsDOMWrapperClassId(uint16_t class_id) { + return class_id == WrapperTypeInfo::kNodeClassId || + class_id == WrapperTypeInfo::kObjectClassId || + class_id == WrapperTypeInfo::kCustomWrappableId; +} + class MinorGCUnmodifiedWrapperVisitor : public v8::PersistentHandleVisitor { public: explicit MinorGCUnmodifiedWrapperVisitor(v8::Isolate* isolate) @@ -82,8 +88,11 @@ void VisitPersistentHandle(v8::Persistent<v8::Value>* value, uint16_t class_id) override { - if (class_id != WrapperTypeInfo::kNodeClassId && - class_id != WrapperTypeInfo::kObjectClassId) { + if (!IsDOMWrapperClassId(class_id)) + return; + + if (class_id == WrapperTypeInfo::kCustomWrappableId) { + v8::Persistent<v8::Object>::Cast(*value).MarkActive(); return; } @@ -331,12 +340,19 @@ void VisitPersistentHandle(v8::Persistent<v8::Value>* value, uint16_t class_id) final { - if (class_id != WrapperTypeInfo::kNodeClassId && - class_id != WrapperTypeInfo::kObjectClassId) + if (!IsDOMWrapperClassId(class_id)) return; - visitor_->Trace( - ToScriptWrappable(v8::Persistent<v8::Object>::Cast(*value))); + WrapperTypeInfo* wrapper_type_info = const_cast<WrapperTypeInfo*>( + ToWrapperTypeInfo(v8::Persistent<v8::Object>::Cast(*value))); + + // WrapperTypeInfo pointer may have been cleared before termination GCs on + // worker threads. + if (!wrapper_type_info) + return; + + wrapper_type_info->Trace( + visitor_, ToUntypedWrappable(v8::Persistent<v8::Object>::Cast(*value))); } private: @@ -351,8 +367,7 @@ void VisitPersistentHandle(v8::Persistent<v8::Value>* value, uint16_t class_id) final { - if (class_id != WrapperTypeInfo::kNodeClassId && - class_id != WrapperTypeInfo::kObjectClassId) + if (!IsDOMWrapperClassId(class_id)) return; // Clear out wrapper type information, essentially disconnecting the Blink @@ -364,7 +379,6 @@ isolate_, v8::Persistent<v8::Object>::Cast(*value)); wrapper->SetAlignedPointerInInternalFields(base::size(indices), indices, values); - value->Reset(); } private:
diff --git a/third_party/blink/renderer/build/scripts/templates/InstrumentingProbesInl.h.tmpl b/third_party/blink/renderer/build/scripts/templates/InstrumentingProbesInl.h.tmpl index 1fa858b..d465ddb 100644 --- a/third_party/blink/renderer/build/scripts/templates/InstrumentingProbesInl.h.tmpl +++ b/third_party/blink/renderer/build/scripts/templates/InstrumentingProbesInl.h.tmpl
@@ -9,6 +9,7 @@ #define {{file.header_name}}_h #include "third_party/blink/renderer/platform/heap/heap_allocator.h" +#include "third_party/blink/renderer/bindings/core/v8/script_source_code.h" {% for include in config["settings"]["includes"] %} #include "{{include}}" {% endfor %}
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn index 64852d8b..e58caefb 100644 --- a/third_party/blink/renderer/core/BUILD.gn +++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1853,6 +1853,7 @@ "html/forms/type_ahead_test.cc", "html/html_content_element_test.cc", "html/html_dimension_test.cc", + "html/html_element_test.cc", "html/html_embed_element_test.cc", "html/html_frame_element_test.cc", "html/html_iframe_element_test.cc",
diff --git a/third_party/blink/renderer/core/dom/container_node.cc b/third_party/blink/renderer/core/dom/container_node.cc index 31c96bd..0cfaefc 100644 --- a/third_party/blink/renderer/core/dom/container_node.cc +++ b/third_party/blink/renderer/core/dom/container_node.cc
@@ -700,14 +700,15 @@ } { - SlotAssignmentRecalcForbiddenScope forbid_slot_recalc(GetDocument()); HTMLFrameOwnerElement::PluginDisposeSuspendScope suspend_plugin_dispose; TreeOrderedMap::RemoveScope tree_remove_scope; - Node* prev = child->previousSibling(); Node* next = child->nextSibling(); - RemoveBetween(prev, next, *child); - NotifyNodeRemoved(*child); + { + SlotAssignmentRecalcForbiddenScope forbid_slot_recalc(GetDocument()); + RemoveBetween(prev, next, *child); + NotifyNodeRemoved(*child); + } ChildrenChanged(ChildrenChange::ForRemoval(*child, prev, next, kChildrenChangeSourceAPI)); }
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 59187fe..e5dae0b0 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -49,6 +49,8 @@ #include "third_party/blink/public/platform/web_prerendering_support.h" #include "third_party/blink/renderer/bindings/core/v8/html_script_element_or_svg_script_element.h" #include "third_party/blink/renderer/bindings/core/v8/script_controller.h" +#include "third_party/blink/renderer/bindings/core/v8/script_promise.h" +#include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/bindings/core/v8/source_location.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_dictionary.h" #include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" @@ -64,6 +66,7 @@ #include "third_party/blink/renderer/core/css/css_property_value_set.h" #include "third_party/blink/renderer/core/css/css_style_declaration.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/css/cssom/computed_style_property_map.h" #include "third_party/blink/renderer/core/css/font_face_set_document.h" #include "third_party/blink/renderer/core/css/invalidation/style_invalidator.h"
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h index 9fdbca8..d9bb54c 100644 --- a/third_party/blink/renderer/core/dom/document.h +++ b/third_party/blink/renderer/core/dom/document.h
@@ -36,10 +36,7 @@ #include "base/memory/scoped_refptr.h" #include "third_party/blink/public/platform/web_focus_type.h" #include "third_party/blink/public/platform/web_insecure_request_policy.h" -#include "third_party/blink/renderer/bindings/core/v8/script_promise.h" -#include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/core/css/css_style_sheet_init.h" #include "third_party/blink/renderer/core/dom/container_node.h" #include "third_party/blink/renderer/core/dom/create_element_flags.h" #include "third_party/blink/renderer/core/dom/document_encoding_data.h" @@ -90,6 +87,7 @@ class Attr; class CDATASection; class CSSStyleSheet; +class CSSStyleSheetInit; class CanvasFontCache; class ChromeClient; class Comment; @@ -159,6 +157,8 @@ class ResizeObserverController; class ResourceFetcher; class RootScrollerController; +class ScriptPromise; +class ScriptValue; class SVGDocumentExtensions; class SVGUseElement; class Text;
diff --git a/third_party/blink/renderer/core/dom/events/event_listener.h b/third_party/blink/renderer/core/dom/events/event_listener.h index 018acd5..54beff1 100644 --- a/third_party/blink/renderer/core/dom/events/event_listener.h +++ b/third_party/blink/renderer/core/dom/events/event_listener.h
@@ -21,6 +21,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_DOM_EVENTS_EVENT_LISTENER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_DOM_EVENTS_EVENT_LISTENER_H_ +#include "third_party/blink/renderer/bindings/core/v8/custom_wrappable_adapter.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/bindings/name_client.h" #include "third_party/blink/renderer/platform/heap/handle.h" @@ -31,9 +32,7 @@ class Event; class ExecutionContext; -class CORE_EXPORT EventListener - : public GarbageCollectedFinalized<EventListener>, - public NameClient { +class CORE_EXPORT EventListener : public CustomWrappableAdapter { public: enum ListenerType { kJSEventListenerType, @@ -42,7 +41,7 @@ kConditionEventListenerType, }; - virtual ~EventListener() = default; + ~EventListener() override = default; virtual bool operator==(const EventListener&) const = 0; virtual void handleEvent(ExecutionContext*, Event*) = 0; virtual const String& Code() const { return g_empty_string; } @@ -54,7 +53,6 @@ ListenerType GetType() const { return type_; } - virtual void Trace(blink::Visitor* visitor) {} const char* NameInHeapSnapshot() const override { return "EventListener"; } protected:
diff --git a/third_party/blink/renderer/core/dom/first_letter_pseudo_element.cc b/third_party/blink/renderer/core/dom/first_letter_pseudo_element.cc index ca96e0d..64f00f0 100644 --- a/third_party/blink/renderer/core/dom/first_letter_pseudo_element.cc +++ b/third_party/blink/renderer/core/dom/first_letter_pseudo_element.cc
@@ -94,7 +94,7 @@ return (obj->IsBR() || (obj->IsText() && ToLayoutText(obj)->IsWordBreak())); } -LayoutObject* FirstLetterPseudoElement::FirstLetterTextLayoutObject( +LayoutText* FirstLetterPseudoElement::FirstLetterTextLayoutObject( const Element& element) { LayoutObject* parent_layout_object = nullptr; @@ -184,7 +184,7 @@ IsInvalidFirstLetterLayoutObject(first_letter_text_layout_object)) return nullptr; - return first_letter_text_layout_object; + return ToLayoutText(first_letter_text_layout_object); } FirstLetterPseudoElement::FirstLetterPseudoElement(Element* parent) @@ -241,8 +241,10 @@ } void FirstLetterPseudoElement::AttachLayoutTree(AttachContext& context) { + LayoutText* first_letter_text = + FirstLetterPseudoElement::FirstLetterTextLayoutObject(*this); PseudoElement::AttachLayoutTree(context); - AttachFirstLetterTextLayoutObjects(); + AttachFirstLetterTextLayoutObjects(first_letter_text); } void FirstLetterPseudoElement::DetachLayoutTree(const AttachContext& context) { @@ -283,26 +285,20 @@ return pseudo_style; } -void FirstLetterPseudoElement::AttachFirstLetterTextLayoutObjects() { - LayoutObject* next_layout_object = - FirstLetterPseudoElement::FirstLetterTextLayoutObject(*this); - DCHECK(next_layout_object); - DCHECK(next_layout_object->IsText()); +void FirstLetterPseudoElement::AttachFirstLetterTextLayoutObjects(LayoutText* first_letter_text) { + DCHECK(first_letter_text); // The original string is going to be either a generated content string or a // DOM node's string. We want the original string before it got transformed in // case first-letter has no text-transform or a different text-transform // applied to it. - String old_text = - ToLayoutText(next_layout_object)->IsTextFragment() - ? ToLayoutTextFragment(next_layout_object)->CompleteText() - : ToLayoutText(next_layout_object)->OriginalText(); + String old_text = first_letter_text->IsTextFragment() ? ToLayoutTextFragment(first_letter_text)->CompleteText() : first_letter_text->OriginalText(); DCHECK(old_text.Impl()); // :first-letter inherits from the parent of the text. It may not be // this->Parent() when e.g., <div><span>text</span></div>. ComputedStyle* pseudo_style = - StyleForFirstLetter(next_layout_object->Parent()); + StyleForFirstLetter(first_letter_text->Parent()); GetLayoutObject()->SetStyle(pseudo_style); // FIXME: This would already have been calculated in firstLetterLayoutObject. @@ -314,9 +310,9 @@ // This text fragment might be empty. LayoutTextFragment* remaining_text; - if (next_layout_object->GetNode()) { + if (first_letter_text->GetNode()) { remaining_text = - new LayoutTextFragment(next_layout_object->GetNode(), old_text.Impl(), + new LayoutTextFragment(first_letter_text->GetNode(), old_text.Impl(), length, remaining_length); } else { remaining_text = LayoutTextFragment::CreateAnonymous( @@ -325,7 +321,7 @@ remaining_text->SetFirstLetterPseudoElement(this); remaining_text->SetIsRemainingTextLayoutObject(true); - remaining_text->SetStyle(next_layout_object->MutableStyle()); + remaining_text->SetStyle(first_letter_text->MutableStyle()); if (remaining_text->GetNode()) remaining_text->GetNode()->SetLayoutObject(remaining_text); @@ -342,7 +338,7 @@ letter->SetStyle(pseudo_style); GetLayoutObject()->AddChild(letter); - next_layout_object->Destroy(); + first_letter_text->Destroy(); } void FirstLetterPseudoElement::DidRecalcStyle(StyleRecalcChange) {
diff --git a/third_party/blink/renderer/core/dom/first_letter_pseudo_element.h b/third_party/blink/renderer/core/dom/first_letter_pseudo_element.h index d2794b0..142b17d 100644 --- a/third_party/blink/renderer/core/dom/first_letter_pseudo_element.h +++ b/third_party/blink/renderer/core/dom/first_letter_pseudo_element.h
@@ -34,6 +34,7 @@ class Element; class LayoutObject; +class LayoutText; class LayoutTextFragment; class CORE_EXPORT FirstLetterPseudoElement final : public PseudoElement { @@ -44,7 +45,7 @@ ~FirstLetterPseudoElement() override; - static LayoutObject* FirstLetterTextLayoutObject(const Element&); + static LayoutText* FirstLetterTextLayoutObject(const Element&); static unsigned FirstLetterLength(const String&); void SetRemainingTextLayoutObject(LayoutTextFragment*); @@ -62,7 +63,7 @@ void DidRecalcStyle(StyleRecalcChange) override; - void AttachFirstLetterTextLayoutObjects(); + void AttachFirstLetterTextLayoutObjects(LayoutText* first_letter_text); ComputedStyle* StyleForFirstLetter(LayoutObject*); LayoutTextFragment* remaining_text_layout_object_;
diff --git a/third_party/blink/renderer/core/dom/range.cc b/third_party/blink/renderer/core/dom/range.cc index 982e6756..6ddf8c86 100644 --- a/third_party/blink/renderer/core/dom/range.cc +++ b/third_party/blink/renderer/core/dom/range.cc
@@ -823,7 +823,16 @@ return nullptr; EventQueueScope scope; - return ProcessContents(EXTRACT_CONTENTS, exception_state); + DocumentFragment* fragment = ProcessContents(EXTRACT_CONTENTS, + exception_state); + // |extractContents| has extended attributes [NewObject, DoNotTestNewObject], + // so it's better to have a test that exercises the following condition: + // + // !fragment || DOMDataStore::GetWrapper(fragment, isolate).IsEmpty() + // + // however, there is no access to |isolate| so far. So, we simply omit the + // test so far. + return fragment; } DocumentFragment* Range::cloneContents(ExceptionState& exception_state) {
diff --git a/third_party/blink/renderer/core/dom/range.idl b/third_party/blink/renderer/core/dom/range.idl index 86dc09b4..09fcdd4 100644 --- a/third_party/blink/renderer/core/dom/range.idl +++ b/third_party/blink/renderer/core/dom/range.idl
@@ -50,7 +50,7 @@ [RaisesException] short compareBoundaryPoints(unsigned short how, Range sourceRange); [RaisesException, CEReactions, CustomElementCallbacks] void deleteContents(); - [NewObject, RaisesException, CEReactions, CustomElementCallbacks] DocumentFragment extractContents(); + [NewObject, RaisesException, CEReactions, CustomElementCallbacks, DoNotTestNewObject] DocumentFragment extractContents(); [NewObject, RaisesException, CEReactions, CustomElementCallbacks] DocumentFragment cloneContents(); [RaisesException, CEReactions, CustomElementCallbacks] void insertNode(Node node); [RaisesException, CEReactions, CustomElementCallbacks] void surroundContents(Node newParent);
diff --git a/third_party/blink/renderer/core/exported/web_form_control_element.cc b/third_party/blink/renderer/core/exported/web_form_control_element.cc index 20900f82..192e291 100644 --- a/third_party/blink/renderer/core/exported/web_form_control_element.cc +++ b/third_party/blink/renderer/core/exported/web_form_control_element.cc
@@ -76,15 +76,15 @@ return ConstUnwrap<HTMLFormControlElement>()->IsAutofilled(); } -bool WebFormControlElement::IsEnteredByUser() const { +bool WebFormControlElement::UserHasEditedTheField() const { if (auto* input = ToHTMLInputElementOrNull(*private_)) - return input->LastChangeWasUserEdit(); + return input->UserHasEditedTheField(); return true; } -void WebFormControlElement::SetIsEnteredByUserForTest() { +void WebFormControlElement::SetUserHasEditedTheFieldForTest() { if (auto* input = ToHTMLInputElementOrNull(*private_)) - input->SetLastChangeWasUserEditForTest(); + input->SetUserHasEditedTheFieldForTest(); } void WebFormControlElement::SetAutofillState(WebAutofillState autofill_state) {
diff --git a/third_party/blink/renderer/core/frame/deprecation.cc b/third_party/blink/renderer/core/frame/deprecation.cc index 769d43bc..c162e6d4 100644 --- a/third_party/blink/renderer/core/frame/deprecation.cc +++ b/third_party/blink/renderer/core/frame/deprecation.cc
@@ -573,6 +573,17 @@ ReplacedWillBeRemoved("maxRetransmitTime", "maxPacketLifeTime", kM70, "5198350873788416")}; + case WebFeature::kGridRowTrackPercentIndefiniteHeight: + return {"GridRowTrackPercentIndefiniteHeight", kM70, + String::Format("Percentages row tracks and gutters for " + "indefinite height grid containers will be " + "resolved against the intrinsic height instead of " + "being treated as auto and zero respectively. " + "This change will happen in %s. See " + "https://www.chromestatus.com/feature/" + "6708326821789696 for more details.", + MilestoneString(kM70))}; + // Features that aren't deprecated don't have a deprecation message. default: return {"NotDeprecated", kUnknown, ""};
diff --git a/third_party/blink/renderer/core/html/forms/text_control_element.cc b/third_party/blink/renderer/core/html/forms/text_control_element.cc index 0d2474b..6526691 100644 --- a/third_party/blink/renderer/core/html/forms/text_control_element.cc +++ b/third_party/blink/renderer/core/html/forms/text_control_element.cc
@@ -68,6 +68,7 @@ Document& doc) : HTMLFormControlElementWithState(tag_name, doc), last_change_was_user_edit_(false), + user_has_edited_the_field_(false), cached_selection_start_(0), cached_selection_end_(0) { cached_selection_direction_ = @@ -107,6 +108,7 @@ if (event->type() == EventTypeNames::webkitEditableContentChanged && GetLayoutObject() && GetLayoutObject()->IsTextControl()) { last_change_was_user_edit_ = !GetDocument().IsRunningExecCommand(); + user_has_edited_the_field_ |= last_change_was_user_edit_; if (IsFocused()) { // Updating the cache in SelectionChanged() isn't enough because @@ -751,6 +753,12 @@ } } +bool TextControlElement::UserHasEditedTheField() const { + if (!IsTextControl()) + return false; + return user_has_edited_the_field_; +} + bool TextControlElement::LastChangeWasUserEdit() const { if (!IsTextControl()) return false; @@ -1005,6 +1013,7 @@ const TextControlElement& source_element = static_cast<const TextControlElement&>(source); last_change_was_user_edit_ = source_element.last_change_was_user_edit_; + user_has_edited_the_field_ = source_element.user_has_edited_the_field_; HTMLFormControlElement::CloneNonAttributePropertiesFrom(source, flag); }
diff --git a/third_party/blink/renderer/core/html/forms/text_control_element.h b/third_party/blink/renderer/core/html/forms/text_control_element.h index 2502d377..e479e52 100644 --- a/third_party/blink/renderer/core/html/forms/text_control_element.h +++ b/third_party/blink/renderer/core/html/forms/text_control_element.h
@@ -134,9 +134,10 @@ void DropInnerEditorElement() { inner_editor_ = nullptr; } void SelectionChanged(bool user_triggered); + bool UserHasEditedTheField() const; bool LastChangeWasUserEdit() const; // This is only used in tests, to fake the user's action - void SetLastChangeWasUserEditForTest() { last_change_was_user_edit_ = true; } + void SetUserHasEditedTheFieldForTest() { user_has_edited_the_field_ = true; } virtual void SetInnerEditorValue(const String&); String InnerEditorValue() const; Node* CreatePlaceholderBreakElement() const; @@ -220,6 +221,7 @@ // zero-length String is a valid data. String value_before_first_user_edit_; bool last_change_was_user_edit_; + bool user_has_edited_the_field_; unsigned cached_selection_start_; unsigned cached_selection_end_;
diff --git a/third_party/blink/renderer/core/html/html_element_test.cc b/third_party/blink/renderer/core/html/html_element_test.cc new file mode 100644 index 0000000..f0c8d33 --- /dev/null +++ b/third_party/blink/renderer/core/html/html_element_test.cc
@@ -0,0 +1,21 @@ +// 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. + +#include "third_party/blink/renderer/core/html/html_element.h" + +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/core/testing/page_test_base.h" + +namespace blink { + +class HTMLElementTest : public PageTestBase {}; + +TEST_F(HTMLElementTest, AdjustDirectionalityInFlatTree) { + SetBodyContent("<bdi><summary><i id=target></i></summary></bdi>"); + UpdateAllLifecyclePhases(); + GetDocument().getElementById("target")->remove(); + // Pass if not crashed. +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_page_agent.h b/third_party/blink/renderer/core/inspector/inspector_page_agent.h index b65dd1e..ccf9cac 100644 --- a/third_party/blink/renderer/core/inspector/inspector_page_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_page_agent.h
@@ -56,6 +56,7 @@ class InspectorResourceContentLoader; class LocalFrame; class ScheduledNavigation; +class ScriptSourceCode; class SharedBuffer; using blink::protocol::Maybe;
diff --git a/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.cc b/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.cc index 1c48f5ea..b92100e3 100644 --- a/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.cc +++ b/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.cc
@@ -4,7 +4,7 @@ #include "third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.h" -#include "third_party/blink/renderer/core/frame/use_counter.h" +#include "third_party/blink/renderer/core/frame/deprecation.h" #include "third_party/blink/renderer/core/layout/grid.h" #include "third_party/blink/renderer/core/layout/grid_layout_utils.h" #include "third_party/blink/renderer/core/layout/layout_grid.h" @@ -827,8 +827,9 @@ // values are treated as <auto>. if (IsRelativeSizedTrackAsAuto(track_size, direction)) { if (direction == kForRows) { - UseCounter::Count(layout_grid_->GetDocument(), - WebFeature::kGridRowTrackPercentIndefiniteHeight); + Deprecation::CountDeprecation( + layout_grid_->GetDocument(), + WebFeature::kGridRowTrackPercentIndefiniteHeight); } if (min_track_breadth.HasPercentage()) min_track_breadth = Length(kAuto);
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc index e287ac7..a49c9ae5 100644 --- a/third_party/blink/renderer/core/layout/layout_inline.cc +++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -1034,12 +1034,12 @@ LayoutRect LayoutInline::LinesBoundingBox() const { if (const NGPhysicalBoxFragment* box_fragment = EnclosingBlockFlowFragmentOf(*this)) { - LayoutRect result; + NGPhysicalOffsetRect bounding_box; auto children = NGInlineFragmentTraversal::SelfFragmentsOf(*box_fragment, this); for (const auto& child : children) - result.Unite(child.RectInContainerBox().ToLayoutRect()); - return result; + bounding_box.UniteIfNonZero(child.RectInContainerBox()); + return bounding_box.ToLayoutRect(); } if (!AlwaysCreateLineBoxes()) {
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc index e4f0984..adb6ebb 100644 --- a/third_party/blink/renderer/core/layout/layout_text.cc +++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -1871,7 +1871,7 @@ auto children = NGInlineFragmentTraversal::SelfFragmentsOf(*box_fragment, this); for (const auto& child : children) - bounding_box.Unite(child.RectInContainerBox()); + bounding_box.UniteIfNonZero(child.RectInContainerBox()); return bounding_box.ToLayoutRect(); }
diff --git a/third_party/blink/renderer/core/layout/ng/geometry/ng_physical_offset_rect.cc b/third_party/blink/renderer/core/layout/ng/geometry/ng_physical_offset_rect.cc index 37dc6f0..1c7546a 100644 --- a/third_party/blink/renderer/core/layout/ng/geometry/ng_physical_offset_rect.cc +++ b/third_party/blink/renderer/core/layout/ng/geometry/ng_physical_offset_rect.cc
@@ -28,6 +28,21 @@ return; } + UniteEvenIfEmpty(other); +} + +void NGPhysicalOffsetRect::UniteIfNonZero(const NGPhysicalOffsetRect& other) { + if (other.size.IsZero()) + return; + if (size.IsZero()) { + *this = other; + return; + } + + UniteEvenIfEmpty(other); +} + +void NGPhysicalOffsetRect::UniteEvenIfEmpty(const NGPhysicalOffsetRect& other) { LayoutUnit left = std::min(offset.left, other.offset.left); LayoutUnit top = std::min(offset.top, other.offset.top); LayoutUnit right = std::max(Right(), other.Right());
diff --git a/third_party/blink/renderer/core/layout/ng/geometry/ng_physical_offset_rect.h b/third_party/blink/renderer/core/layout/ng/geometry/ng_physical_offset_rect.h index 723c896..b894db5 100644 --- a/third_party/blink/renderer/core/layout/ng/geometry/ng_physical_offset_rect.h +++ b/third_party/blink/renderer/core/layout/ng/geometry/ng_physical_offset_rect.h
@@ -37,6 +37,8 @@ NGPhysicalOffsetRect operator+(const NGPhysicalOffset&) const; void Unite(const NGPhysicalOffsetRect&); + void UniteIfNonZero(const NGPhysicalOffsetRect&); + void UniteEvenIfEmpty(const NGPhysicalOffsetRect&); void Expand(const NGPhysicalBoxStrut&);
diff --git a/third_party/blink/renderer/core/layout/ng/geometry/ng_physical_size.h b/third_party/blink/renderer/core/layout/ng/geometry/ng_physical_size.h index def21e3..4ae9473a 100644 --- a/third_party/blink/renderer/core/layout/ng/geometry/ng_physical_size.h +++ b/third_party/blink/renderer/core/layout/ng/geometry/ng_physical_size.h
@@ -31,6 +31,9 @@ bool IsEmpty() const { return width == LayoutUnit() || height == LayoutUnit(); } + bool IsZero() const { + return width == LayoutUnit() && height == LayoutUnit(); + } // Conversions from/to existing code. New code prefers type safety for // logical/physical distinctions.
diff --git a/third_party/blink/renderer/core/page/drag_controller.cc b/third_party/blink/renderer/core/page/drag_controller.cc index 31d56851..7fec9ff 100644 --- a/third_party/blink/renderer/core/page/drag_controller.cc +++ b/third_party/blink/renderer/core/page/drag_controller.cc
@@ -470,10 +470,10 @@ // |range|, otherwise returns false. // TODO(yosin): We should return |VisibleSelection| rather than three values. static bool SetSelectionToDragCaret(LocalFrame* frame, - VisibleSelection& drag_caret, + const SelectionInDOMTree& drag_caret, Range*& range, const LayoutPoint& point) { - frame->Selection().SetSelectionAndEndTyping(drag_caret.AsSelection()); + frame->Selection().SetSelectionAndEndTyping(drag_caret); if (frame->Selection() .ComputeVisibleSelectionInDOMTreeDeprecated() .IsNone()) { @@ -488,7 +488,7 @@ frame->Selection().SetSelectionAndEndTyping( SelectionInDOMTree::Builder().Collapse(position).Build()); - drag_caret = + const VisibleSelection& drag_caret = frame->Selection().ComputeVisibleSelectionInDOMTreeDeprecated(); range = CreateRange(drag_caret.ToNormalizedEphemeralRange()); } @@ -652,7 +652,8 @@ return false; } } else { - if (SetSelectionToDragCaret(inner_frame, drag_caret, range, point)) { + if (SetSelectionToDragCaret(inner_frame, drag_caret.AsSelection(), range, + point)) { DCHECK(document_under_mouse_); if (!inner_frame->GetEditor().ReplaceSelectionAfterDraggingWithEvents( element, drag_data, fragment, range, @@ -667,7 +668,8 @@ if (text.IsEmpty()) return false; - if (SetSelectionToDragCaret(inner_frame, drag_caret, range, point)) { + if (SetSelectionToDragCaret(inner_frame, drag_caret.AsSelection(), range, + point)) { DCHECK(document_under_mouse_); if (!inner_frame->GetEditor().ReplaceSelectionAfterDraggingWithEvents( element, drag_data,
diff --git a/third_party/blink/renderer/core/workers/worker_animation_frame_provider.cc b/third_party/blink/renderer/core/workers/worker_animation_frame_provider.cc index bdbf04b..5bd5134 100644 --- a/third_party/blink/renderer/core/workers/worker_animation_frame_provider.cc +++ b/third_party/blink/renderer/core/workers/worker_animation_frame_provider.cc
@@ -22,6 +22,10 @@ int WorkerAnimationFrameProvider::RegisterCallback( FrameRequestCallbackCollection::FrameCallback* callback) { + if (!begin_frame_provider_->IsValidFrameProvider()) { + return WorkerAnimationFrameProvider::kInvalidCallbackId; + } + FrameRequestCallbackCollection::CallbackId id = callback_collection_.RegisterCallback(callback); begin_frame_provider_->RequestBeginFrame();
diff --git a/third_party/blink/renderer/core/workers/worker_animation_frame_provider.h b/third_party/blink/renderer/core/workers/worker_animation_frame_provider.h index d7759cb..386e133 100644 --- a/third_party/blink/renderer/core/workers/worker_animation_frame_provider.h +++ b/third_party/blink/renderer/core/workers/worker_animation_frame_provider.h
@@ -48,6 +48,8 @@ void RegisterOffscreenCanvas(OffscreenCanvas*); void DeregisterOffscreenCanvas(OffscreenCanvas*); + static const int kInvalidCallbackId = -1; + protected: WorkerAnimationFrameProvider( ExecutionContext* context,
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.cc b/third_party/blink/renderer/core/workers/worker_global_scope.cc index 615a282..a3afa17 100644 --- a/third_party/blink/renderer/core/workers/worker_global_scope.cc +++ b/third_party/blink/renderer/core/workers/worker_global_scope.cc
@@ -405,12 +405,21 @@ CrossThreadBind(&RemoveURLFromMemoryCacheInternal, url)); } -int WorkerGlobalScope::requestAnimationFrame(V8FrameRequestCallback* callback) { +int WorkerGlobalScope::requestAnimationFrame(V8FrameRequestCallback* callback, + ExceptionState& exception_state) { FrameRequestCallbackCollection::V8FrameCallback* frame_callback = FrameRequestCallbackCollection::V8FrameCallback::Create(callback); frame_callback->SetUseLegacyTimeBase(true); - return animation_frame_provider_->RegisterCallback(frame_callback); + int ret = animation_frame_provider_->RegisterCallback(frame_callback); + + if (ret == WorkerAnimationFrameProvider::kInvalidCallbackId) { + exception_state.ThrowDOMException( + DOMExceptionCode::kNotSupportedError, + "requestAnimationFrame not supported in this Worker."); + } + + return ret; } void WorkerGlobalScope::cancelAnimationFrame(int id) {
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.h b/third_party/blink/renderer/core/workers/worker_global_scope.h index 4143202..492cb63 100644 --- a/third_party/blink/renderer/core/workers/worker_global_scope.h +++ b/third_party/blink/renderer/core/workers/worker_global_scope.h
@@ -150,7 +150,7 @@ // FontFaceSource on the IDL. FontFaceSet* fonts(); - int requestAnimationFrame(V8FrameRequestCallback* callback); + int requestAnimationFrame(V8FrameRequestCallback* callback, ExceptionState&); void cancelAnimationFrame(int id); WorkerAnimationFrameProvider* GetAnimationFrameProvider() {
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.idl b/third_party/blink/renderer/core/workers/worker_global_scope.idl index b36e8c2..1e5fd34 100644 --- a/third_party/blink/renderer/core/workers/worker_global_scope.idl +++ b/third_party/blink/renderer/core/workers/worker_global_scope.idl
@@ -69,7 +69,7 @@ // TODO(fserb): temporarly until we can enable the interface below. [RuntimeEnabled=OffscreenCanvasText] readonly attribute FontFaceSet fonts; - [RuntimeEnabled=OffscreenCanvas] long requestAnimationFrame(FrameRequestCallback callback); + [RuntimeEnabled=OffscreenCanvas, RaisesException] long requestAnimationFrame(FrameRequestCallback callback); [RuntimeEnabled=OffscreenCanvas] void cancelAnimationFrame(long handle); };
diff --git a/third_party/blink/renderer/modules/animationworklet/css_animation_worklet.cc b/third_party/blink/renderer/modules/animationworklet/css_animation_worklet.cc index eb1beab..b3756c4 100644 --- a/third_party/blink/renderer/modules/animationworklet/css_animation_worklet.cc +++ b/third_party/blink/renderer/modules/animationworklet/css_animation_worklet.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/modules/animationworklet/css_animation_worklet.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/local_frame.h"
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index 916a81f..6700437 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -423,6 +423,7 @@ "bindings/callback_function_base.h", "bindings/callback_interface_base.cc", "bindings/callback_interface_base.h", + "bindings/custom_wrappable.h", "bindings/dom_data_store.h", "bindings/dom_wrapper_map.h", "bindings/dom_wrapper_world.cc",
diff --git a/third_party/blink/renderer/platform/bindings/custom_wrappable.h b/third_party/blink/renderer/platform/bindings/custom_wrappable.h new file mode 100644 index 0000000..6be47e62 --- /dev/null +++ b/third_party/blink/renderer/platform/bindings/custom_wrappable.h
@@ -0,0 +1,31 @@ +// 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. + +#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_CUSTOM_WRAPPABLE_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_CUSTOM_WRAPPABLE_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/noncopyable.h" + +namespace blink { + +// See the comment on CustomWrappableAdaptor. +class PLATFORM_EXPORT CustomWrappable + : public GarbageCollectedFinalized<CustomWrappable>, + public NameClient { + WTF_MAKE_NONCOPYABLE(CustomWrappable); + + public: + virtual ~CustomWrappable() = default; + virtual void Trace(Visitor*) {} + const char* NameInHeapSnapshot() const override { return "CustomWrappable"; } + + protected: + CustomWrappable() = default; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_CUSTOM_WRAPPABLE_H_
diff --git a/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.cc b/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.cc index 2f343483..ef9e142 100644 --- a/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.cc +++ b/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.cc
@@ -7,6 +7,7 @@ #include "base/auto_reset.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/platform/bindings/active_script_wrappable_base.h" +#include "third_party/blink/renderer/platform/bindings/custom_wrappable.h" #include "third_party/blink/renderer/platform/bindings/dom_wrapper_map.h" #include "third_party/blink/renderer/platform/bindings/dom_wrapper_world.h" #include "third_party/blink/renderer/platform/bindings/scoped_persistent.h" @@ -165,13 +166,8 @@ if (wrapper_type_info->gin_embedder != gin::GinEmbedder::kEmbedderBlink) { return; } - DCHECK(wrapper_type_info->wrapper_class_id == WrapperTypeInfo::kNodeClassId || - wrapper_type_info->wrapper_class_id == - WrapperTypeInfo::kObjectClassId); - ScriptWrappable* script_wrappable = - reinterpret_cast<ScriptWrappable*>(internal_fields.second); - TraceWithWrappers(script_wrappable); + wrapper_type_info->TraceWithWrappers(this, internal_fields.second); } void ScriptWrappableMarkingVisitor::RegisterV8References(
diff --git a/third_party/blink/renderer/platform/bindings/v8_dom_wrapper.cc b/third_party/blink/renderer/platform/bindings/v8_dom_wrapper.cc index 12104ab2..7c7b8b8 100644 --- a/third_party/blink/renderer/platform/bindings/v8_dom_wrapper.cc +++ b/third_party/blink/renderer/platform/bindings/v8_dom_wrapper.cc
@@ -94,10 +94,11 @@ if (object->InternalFieldCount() < kV8DefaultWrapperInternalFieldCount) return false; - const ScriptWrappable* untrusted_script_wrappable = ToScriptWrappable(object); + // The untrusted wrappable can either be ScriptWrappable or CustomWrappable. + const void* untrused_wrappable = ToUntypedWrappable(object); const WrapperTypeInfo* untrusted_wrapper_type_info = ToWrapperTypeInfo(object); - return untrusted_script_wrappable && untrusted_wrapper_type_info && + return untrused_wrappable && untrusted_wrapper_type_info && untrusted_wrapper_type_info->gin_embedder == gin::kEmbedderBlink; }
diff --git a/third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h b/third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h index dbcdd80a..831498f 100644 --- a/third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h +++ b/third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h
@@ -32,6 +32,7 @@ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_V8_DOM_WRAPPER_H_ #include "base/stl_util.h" +#include "third_party/blink/renderer/platform/bindings/custom_wrappable.h" #include "third_party/blink/renderer/platform/bindings/dom_data_store.h" #include "third_party/blink/renderer/platform/bindings/runtime_call_stats.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" @@ -67,10 +68,24 @@ ScriptWrappable*, const WrapperTypeInfo*, v8::Local<v8::Object> wrapper); - static void SetNativeInfo(v8::Isolate*, - v8::Local<v8::Object>, - const WrapperTypeInfo*, - ScriptWrappable*); + static void AssociateObjectWithWrapper(v8::Isolate*, + CustomWrappable*, + const WrapperTypeInfo*, + v8::Local<v8::Object> wrapper); + static void SetNativeInfo(v8::Isolate* isolate, + v8::Local<v8::Object> wrapper, + const WrapperTypeInfo* wrapper_type_info, + ScriptWrappable* script_wrappable) { + SetNativeInfoInternal(isolate, wrapper, wrapper_type_info, + script_wrappable); + } + static void SetNativeInfo(v8::Isolate* isolate, + v8::Local<v8::Object> wrapper, + const WrapperTypeInfo* wrapper_type_info, + CustomWrappable* custom_wrappable) { + SetNativeInfoInternal(isolate, wrapper, wrapper_type_info, + custom_wrappable); + } static void ClearNativeInfo(v8::Isolate*, v8::Local<v8::Object>); // hasInternalFieldsSet only checks if the value has the internal fields for @@ -78,19 +93,24 @@ // value may not be a Blink's wrapper object. In order to make sure of it, // Use isWrapper function instead. PLATFORM_EXPORT static bool HasInternalFieldsSet(v8::Local<v8::Value>); + + private: + static void SetNativeInfoInternal(v8::Isolate*, + v8::Local<v8::Object>, + const WrapperTypeInfo*, + void*); }; -inline void V8DOMWrapper::SetNativeInfo( +inline void V8DOMWrapper::SetNativeInfoInternal( v8::Isolate* isolate, v8::Local<v8::Object> wrapper, const WrapperTypeInfo* wrapper_type_info, - ScriptWrappable* script_wrappable) { + void* wrappable) { DCHECK_GE(wrapper->InternalFieldCount(), 2); - DCHECK(script_wrappable); + DCHECK(wrappable); DCHECK(wrapper_type_info); int indices[] = {kV8DOMWrapperObjectIndex, kV8DOMWrapperTypeIndex}; - void* values[] = {script_wrappable, - const_cast<WrapperTypeInfo*>(wrapper_type_info)}; + void* values[] = {wrappable, const_cast<WrapperTypeInfo*>(wrapper_type_info)}; wrapper->SetAlignedPointerInInternalFields(base::size(indices), indices, values); auto* per_isolate_data = V8PerIsolateData::From(isolate); @@ -100,7 +120,7 @@ // necessarily detect wrappers created during its incremental marking. per_isolate_data->GetScriptWrappableMarkingVisitor()->RegisterV8Reference( std::make_pair(const_cast<WrapperTypeInfo*>(wrapper_type_info), - script_wrappable)); + wrappable)); } inline void V8DOMWrapper::ClearNativeInfo(v8::Isolate* isolate, @@ -127,6 +147,19 @@ return wrapper; } +inline void V8DOMWrapper::AssociateObjectWithWrapper( + v8::Isolate* isolate, + CustomWrappable* impl, + const WrapperTypeInfo* wrapper_type_info, + v8::Local<v8::Object> wrapper) { + RUNTIME_CALL_TIMER_SCOPE( + isolate, RuntimeCallStats::CounterId::kAssociateObjectWithWrapper); + WrapperTypeInfo::WrapperCreated(); + SetNativeInfo(isolate, wrapper, wrapper_type_info, impl); + DCHECK(HasInternalFieldsSet(wrapper)); + SECURITY_CHECK(ToCustomWrappable(wrapper) == impl); +} + class V8WrapperInstantiationScope { STACK_ALLOCATED();
diff --git a/third_party/blink/renderer/platform/bindings/wrapper_type_info.cc b/third_party/blink/renderer/platform/bindings/wrapper_type_info.cc index 1788bf2a..0b55dda 100644 --- a/third_party/blink/renderer/platform/bindings/wrapper_type_info.cc +++ b/third_party/blink/renderer/platform/bindings/wrapper_type_info.cc
@@ -4,6 +4,8 @@ #include "third_party/blink/renderer/platform/bindings/wrapper_type_info.h" +#include "third_party/blink/renderer/platform/bindings/custom_wrappable.h" +#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/heap/heap_stats_collector.h" @@ -25,4 +27,32 @@ stats_collector->IncreaseCollectedWrapperCount(1); } +void WrapperTypeInfo::Trace(Visitor* visitor, void* impl) { + switch (wrapper_class_id) { + case WrapperTypeInfo::kNodeClassId: + case WrapperTypeInfo::kObjectClassId: + visitor->Trace(reinterpret_cast<ScriptWrappable*>(impl)); + break; + case WrapperTypeInfo::kCustomWrappableId: + visitor->Trace(reinterpret_cast<CustomWrappable*>(impl)); + break; + default: + NOTREACHED(); + } +} + +void WrapperTypeInfo::TraceWithWrappers(Visitor* visitor, void* impl) { + switch (wrapper_class_id) { + case WrapperTypeInfo::kNodeClassId: + case WrapperTypeInfo::kObjectClassId: + visitor->TraceWithWrappers(reinterpret_cast<ScriptWrappable*>(impl)); + break; + case WrapperTypeInfo::kCustomWrappableId: + visitor->TraceWithWrappers(reinterpret_cast<CustomWrappable*>(impl)); + break; + default: + NOTREACHED(); + } +} + } // namespace blink
diff --git a/third_party/blink/renderer/platform/bindings/wrapper_type_info.h b/third_party/blink/renderer/platform/bindings/wrapper_type_info.h index 2e6899d..6df6dfff 100644 --- a/third_party/blink/renderer/platform/bindings/wrapper_type_info.h +++ b/third_party/blink/renderer/platform/bindings/wrapper_type_info.h
@@ -40,8 +40,10 @@ namespace blink { class ActiveScriptWrappableBase; +class CustomWrappable; class DOMWrapperWorld; class ScriptWrappable; +class Visitor; ScriptWrappable* ToScriptWrappable( const v8::PersistentBase<v8::Object>& wrapper); @@ -87,6 +89,7 @@ enum WrapperClassId { kNodeClassId = 1, // NodeClassId must be smaller than ObjectClassId. kObjectClassId, + kCustomWrappableId, }; enum ActiveScriptWrappableInheritance { @@ -143,6 +146,11 @@ kInheritFromActiveScriptWrappable; } + // Garbage collection support for when the type depends the WrapperTypeInfo + // object. + PLATFORM_EXPORT void Trace(Visitor*, void*); + PLATFORM_EXPORT void TraceWithWrappers(Visitor*, void*); + // This field must be the first member of the struct WrapperTypeInfo. // See also static_assert() in .cpp file. const gin::GinEmbedder gin_embedder; @@ -182,6 +190,23 @@ return GetInternalField<ScriptWrappable, kV8DOMWrapperObjectIndex>(wrapper); } +inline CustomWrappable* ToCustomWrappable( + const v8::PersistentBase<v8::Object>& wrapper) { + return GetInternalField<CustomWrappable, kV8DOMWrapperObjectIndex>(wrapper); +} + +inline CustomWrappable* ToCustomWrappable(v8::Local<v8::Object> wrapper) { + return GetInternalField<CustomWrappable, kV8DOMWrapperObjectIndex>(wrapper); +} + +inline void* ToUntypedWrappable(const v8::PersistentBase<v8::Object>& wrapper) { + return GetInternalField<void, kV8DOMWrapperObjectIndex>(wrapper); +} + +inline void* ToUntypedWrappable(v8::Local<v8::Object> wrapper) { + return GetInternalField<void, kV8DOMWrapperObjectIndex>(wrapper); +} + inline const WrapperTypeInfo* ToWrapperTypeInfo( const v8::PersistentBase<v8::Object>& wrapper) { return GetInternalField<WrapperTypeInfo, kV8DOMWrapperTypeIndex>(wrapper);
diff --git a/third_party/blink/renderer/platform/graphics/begin_frame_provider.cc b/third_party/blink/renderer/platform/graphics/begin_frame_provider.cc index f6a0cca..b5a53cc 100644 --- a/third_party/blink/renderer/platform/graphics/begin_frame_provider.cc +++ b/third_party/blink/renderer/platform/graphics/begin_frame_provider.cc
@@ -42,6 +42,14 @@ ResetCompositorFrameSink(); } +bool BeginFrameProvider::IsValidFrameProvider() { + if (!parent_frame_sink_id_.is_valid() || !frame_sink_id_.is_valid()) { + return false; + } + + return true; +} + void BeginFrameProvider::CreateCompositorFrameSinkIfNeeded() { if (!parent_frame_sink_id_.is_valid() || !frame_sink_id_.is_valid()) { return;
diff --git a/third_party/blink/renderer/platform/graphics/begin_frame_provider.h b/third_party/blink/renderer/platform/graphics/begin_frame_provider.h index f1f211ed..409ea51 100644 --- a/third_party/blink/renderer/platform/graphics/begin_frame_provider.h +++ b/third_party/blink/renderer/platform/graphics/begin_frame_provider.h
@@ -60,6 +60,8 @@ void ResetCompositorFrameSink(); + bool IsValidFrameProvider(); + ~BeginFrameProvider() override = default; private:
diff --git a/third_party/blink/renderer/platform/heap/heap.cc b/third_party/blink/renderer/platform/heap/heap.cc index cd4d676..11c75a40 100644 --- a/third_party/blink/renderer/platform/heap/heap.cc +++ b/third_party/blink/renderer/platform/heap/heap.cc
@@ -200,7 +200,6 @@ void ThreadHeap::RegisterMovingObjectReference(MovableReference* slot) { DCHECK(slot); - DCHECK(*slot); Compaction()->RegisterMovingObjectReference(slot); }
diff --git a/third_party/blink/renderer/platform/heap/heap_compact.cc b/third_party/blink/renderer/platform/heap/heap_compact.cc index 4594fbfd..3c9ab97 100644 --- a/third_party/blink/renderer/platform/heap/heap_compact.cc +++ b/third_party/blink/renderer/platform/heap/heap_compact.cc
@@ -13,7 +13,6 @@ #include "third_party/blink/renderer/platform/histogram.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/wtf/hash_map.h" -#include "third_party/blink/renderer/platform/wtf/hash_set.h" #include "third_party/blink/renderer/platform/wtf/time.h" namespace blink { @@ -61,6 +60,7 @@ } void Add(MovableReference* slot) { + DCHECK(*slot); MovableReference reference = *slot; BasePage* ref_page = PageFromObject(reference); // Nothing to compact on a large object's page. @@ -357,7 +357,7 @@ if (!do_compact_) return; - Fixups().Add(slot); + traced_slots_.insert(slot); } void HeapCompact::RegisterMovingObjectCallback(MovableReference reference, @@ -422,6 +422,14 @@ void HeapCompact::StartThreadCompaction() { if (!do_compact_) return; + + DCHECK(fixups_); + // The mapping between the slots and the backing stores are created + for (auto** slot : traced_slots_) { + if (*slot) + fixups_->Add(slot); + } + traced_slots_.clear(); } void HeapCompact::FinishThreadCompaction() {
diff --git a/third_party/blink/renderer/platform/heap/heap_compact.h b/third_party/blink/renderer/platform/heap/heap_compact.h index dc32e77b..b11f12e0 100644 --- a/third_party/blink/renderer/platform/heap/heap_compact.h +++ b/third_party/blink/renderer/platform/heap/heap_compact.h
@@ -10,6 +10,7 @@ #include "base/memory/ptr_util.h" #include "third_party/blink/renderer/platform/heap/blink_gc.h" #include "third_party/blink/renderer/platform/platform_export.h" +#include "third_party/blink/renderer/platform/wtf/hash_set.h" #include "third_party/blink/renderer/platform/wtf/threading_primitives.h" #include <bitset> @@ -164,6 +165,11 @@ // the range of BlinkGC::ArenaIndices. unsigned compactable_arenas_; + // The set is to remember slots traced during the incremental and atomic + // marking phases. The mapping between the slots and the backing stores are + // created at the atomic pause phase. + HashSet<MovableReference*> traced_slots_; + static bool force_compaction_gc_; };
diff --git a/third_party/blink/renderer/platform/heap/marking_visitor.h b/third_party/blink/renderer/platform/heap/marking_visitor.h index 24ae2ce..e62a9640 100644 --- a/third_party/blink/renderer/platform/heap/marking_visitor.h +++ b/third_party/blink/renderer/platform/heap/marking_visitor.h
@@ -124,6 +124,8 @@ void** object_slot, TraceDescriptor desc) final { RegisterBackingStoreReference(object_slot); + if (!object) + return; Visit(object, desc); }
diff --git a/third_party/blink/renderer/platform/heap/visitor.h b/third_party/blink/renderer/platform/heap/visitor.h index 9b9ba50..b998bfd 100644 --- a/third_party/blink/renderer/platform/heap/visitor.h +++ b/third_party/blink/renderer/platform/heap/visitor.h
@@ -120,8 +120,6 @@ static_assert(IsGarbageCollectedType<T>::value, "T needs to be a garbage collected object"); - if (!backing_store) - return; VisitBackingStoreStrongly(reinterpret_cast<void*>(backing_store), reinterpret_cast<void**>(backing_store_slot), TraceDescriptorFor(backing_store));
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 6a70406..015d6e29 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -516,6 +516,10 @@ name: "FontCacheScaling", status: "test", }, + { + name: "FontSrcLocalMatching", + status: "test", + }, // For simulating Android's overlay fullscreen video in layout tests on Linux. { name: "ForceOverlayFullscreenVideo",
diff --git a/third_party/blink/tools/blinkpy/web_tests/controllers/layout_test_finder.py b/third_party/blink/tools/blinkpy/web_tests/controllers/layout_test_finder.py index 165d2595..df0a9bba 100644 --- a/third_party/blink/tools/blinkpy/web_tests/controllers/layout_test_finder.py +++ b/third_party/blink/tools/blinkpy/web_tests/controllers/layout_test_finder.py
@@ -196,14 +196,20 @@ @staticmethod def _split_into_chunks(test_names, index, count): - chunk_size = int(math.ceil(len(test_names) * 1.0 / count)) + tests_and_indices = [ + (test_name, hash(test_name) % count) + for test_name in test_names] - chunk_start = index * chunk_size - chunk_end = (index + 1) * chunk_size + tests_to_run = [ + test_name + for test_name, test_index in tests_and_indices + if test_index == index] + other_tests = [ + test_name + for test_name, test_index in tests_and_indices + if test_index != index] - tests_to_run = test_names[chunk_start:chunk_end] - other_tests = test_names[:chunk_start] + test_names[chunk_end:] - - _log.debug('chunk slice [%d:%d] of %d is %d tests', chunk_start, chunk_end, len(test_names), len(tests_to_run)) + _log.debug('chunk %d of %d contains %d tests of %d', + index, count, len(tests_to_run), len(test_names)) return tests_to_run, other_tests
diff --git a/third_party/blink/tools/blinkpy/web_tests/controllers/layout_test_finder_unittest.py b/third_party/blink/tools/blinkpy/web_tests/controllers/layout_test_finder_unittest.py index a9a19ac5..a3474ac48 100644 --- a/third_party/blink/tools/blinkpy/web_tests/controllers/layout_test_finder_unittest.py +++ b/third_party/blink/tools/blinkpy/web_tests/controllers/layout_test_finder_unittest.py
@@ -2,11 +2,19 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import os +import sys import unittest +from blinkpy.common import path_finder from blinkpy.common.host_mock import MockHost from blinkpy.web_tests.controllers import layout_test_finder +_MOCK_ROOT = os.path.join( + path_finder.get_chromium_src_dir(), 'third_party', 'pymock') +sys.path.append(_MOCK_ROOT) +import mock + class LayoutTestFinderTests(unittest.TestCase): @@ -89,32 +97,34 @@ def test_split_chunks(self): split = layout_test_finder.LayoutTestFinder._split_into_chunks # pylint: disable=protected-access - tests = [1, 2, 3, 4] - self.assertEqual(([1, 2, 3, 4], []), split(tests, 0, 1)) + with mock.patch('__builtin__.hash', int): - self.assertEqual(([1, 2], [3, 4]), split(tests, 0, 2)) - self.assertEqual(([3, 4], [1, 2]), split(tests, 1, 2)) + tests = [1, 2, 3, 4] + self.assertEqual(([1, 2, 3, 4], []), split(tests, 0, 1)) - self.assertEqual(([1, 2], [3, 4]), split(tests, 0, 3)) - self.assertEqual(([3, 4], [1, 2]), split(tests, 1, 3)) - self.assertEqual(([], [1, 2, 3, 4]), split(tests, 2, 3)) + self.assertEqual(([2, 4], [1, 3]), split(tests, 0, 2)) + self.assertEqual(([1, 3], [2, 4]), split(tests, 1, 2)) - tests = [1, 2, 3, 4, 5] - self.assertEqual(([1, 2, 3, 4, 5], []), split(tests, 0, 1)) + self.assertEqual(([3], [1, 2, 4]), split(tests, 0, 3)) + self.assertEqual(([1, 4], [2, 3]), split(tests, 1, 3)) + self.assertEqual(([2], [1, 3, 4]), split(tests, 2, 3)) - self.assertEqual(([1, 2, 3], [4, 5]), split(tests, 0, 2)) - self.assertEqual(([4, 5], [1, 2, 3]), split(tests, 1, 2)) + tests = [1, 2, 3, 4, 5] + self.assertEqual(([1, 2, 3, 4, 5], []), split(tests, 0, 1)) - self.assertEqual(([1, 2], [3, 4, 5]), split(tests, 0, 3)) - self.assertEqual(([3, 4], [1, 2, 5]), split(tests, 1, 3)) - self.assertEqual(([5], [1, 2, 3, 4]), split(tests, 2, 3)) + self.assertEqual(([2, 4], [1, 3, 5]), split(tests, 0, 2)) + self.assertEqual(([1, 3, 5], [2, 4]), split(tests, 1, 2)) - tests = [1, 2, 3, 4, 5, 6] - self.assertEqual(([1, 2, 3, 4, 5, 6], []), split(tests, 0, 1)) + self.assertEqual(([3], [1, 2, 4, 5]), split(tests, 0, 3)) + self.assertEqual(([1, 4], [2, 3, 5]), split(tests, 1, 3)) + self.assertEqual(([2, 5], [1, 3, 4]), split(tests, 2, 3)) - self.assertEqual(([1, 2, 3], [4, 5, 6]), split(tests, 0, 2)) - self.assertEqual(([4, 5, 6], [1, 2, 3]), split(tests, 1, 2)) + tests = [1, 2, 3, 4, 5, 6] + self.assertEqual(([1, 2, 3, 4, 5, 6], []), split(tests, 0, 1)) - self.assertEqual(([1, 2], [3, 4, 5, 6]), split(tests, 0, 3)) - self.assertEqual(([3, 4], [1, 2, 5, 6]), split(tests, 1, 3)) - self.assertEqual(([5, 6], [1, 2, 3, 4]), split(tests, 2, 3)) + self.assertEqual(([2, 4, 6], [1, 3, 5]), split(tests, 0, 2)) + self.assertEqual(([1, 3, 5], [2, 4, 6]), split(tests, 1, 2)) + + self.assertEqual(([3, 6], [1, 2, 4, 5]), split(tests, 0, 3)) + self.assertEqual(([1, 4], [2, 3, 5, 6]), split(tests, 1, 3)) + self.assertEqual(([2, 5], [1, 3, 4, 6]), split(tests, 2, 3))
diff --git a/third_party/blink/tools/blinkpy/web_tests/controllers/layout_test_runner.py b/third_party/blink/tools/blinkpy/web_tests/controllers/layout_test_runner.py index c924d263..1fdd62f 100644 --- a/third_party/blink/tools/blinkpy/web_tests/controllers/layout_test_runner.py +++ b/third_party/blink/tools/blinkpy/web_tests/controllers/layout_test_runner.py
@@ -26,6 +26,8 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import collections +import itertools import logging import math import time @@ -96,6 +98,9 @@ self._options.fully_parallel, self._options.batch_size == 1) + self._reorder_tests_by_args(locked_shards) + self._reorder_tests_by_args(unlocked_shards) + # We don't have a good way to coordinate the workers so that they don't # try to run the shards that need a lock. The easiest solution is to # run all of the locked shards first. @@ -135,6 +140,17 @@ return test_run_results + def _reorder_tests_by_args(self, shards): + reordered_shards = [] + for shard in shards: + tests_by_args = collections.OrderedDict() + for test_input in shard.test_inputs: + args = tuple(self._port.args_for_test(test_input.test_name)) + if args not in tests_by_args: + tests_by_args[args] = [] + tests_by_args[args].append(test_input) + shard.test_inputs = list(itertools.chain(*tests_by_args.values())) + def _worker_factory(self, worker_connection): results_directory = self._results_directory if self._retry_attempt > 0:
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 16e184f7..9c72d6a 100644 --- a/third_party/blink/tools/blinkpy/web_tests/controllers/manager.py +++ b/third_party/blink/tools/blinkpy/web_tests/controllers/manager.py
@@ -111,16 +111,14 @@ # This is raised if --test-list doesn't exist return test_run_results.RunDetails(exit_code=exit_codes.NO_TESTS_EXIT_STATUS) - # Create a sorted list of test files so the subset chunk, - # if used, contains alphabetically consecutive tests. - if self._options.order == 'natural': - all_test_names.sort(key=self._port.test_key) - elif self._options.order == 'random': - all_test_names.sort() - random.Random(self._options.seed).shuffle(all_test_names) - test_names, tests_in_other_chunks = self._finder.split_into_chunks(all_test_names) + if self._options.order == 'natural': + test_names.sort(key=self._port.test_key) + elif self._options.order == 'random': + test_names.sort() + random.Random(self._options.seed).shuffle(test_names) + self._printer.write_update('Parsing expectations ...') self._expectations = test_expectations.TestExpectations(self._port, test_names)
diff --git a/third_party/blink/tools/blinkpy/web_tests/controllers/single_test_runner.py b/third_party/blink/tools/blinkpy/web_tests/controllers/single_test_runner.py index aa2b3d32..e5ea025 100644 --- a/third_party/blink/tools/blinkpy/web_tests/controllers/single_test_runner.py +++ b/third_party/blink/tools/blinkpy/web_tests/controllers/single_test_runner.py
@@ -113,18 +113,8 @@ if self._should_fetch_expected_checksum(): image_hash = self._port.expected_checksum(self._test_name) - test_base = self._port.lookup_virtual_test_base(self._test_name) - if test_base: - # If the file actually exists under the virtual dir, we want to use it (largely for virtual references), - # but we want to use the extra command line args either way. - if self._filesystem.exists(self._port.abspath_for_test(self._test_name)): - test_name = self._test_name - else: - test_name = test_base - args = self._port.lookup_virtual_test_args(self._test_name) - else: - test_name = self._test_name - args = self._port.lookup_physical_test_args(self._test_name) + args = self._port.args_for_test(self._test_name) + test_name = self._port.name_for_test(self._test_name) return DriverInput(test_name, self._timeout_ms, image_hash, self._should_run_pixel_test, args) def run(self):
diff --git a/third_party/blink/tools/blinkpy/web_tests/models/test_expectations.py b/third_party/blink/tools/blinkpy/web_tests/models/test_expectations.py index ee549c3..587d59a 100644 --- a/third_party/blink/tools/blinkpy/web_tests/models/test_expectations.py +++ b/third_party/blink/tools/blinkpy/web_tests/models/test_expectations.py
@@ -714,7 +714,7 @@ return ' '.join(retval) def remove_expectation_line(self, test): - if not self.has_test(test.name): + if not self.has_test(test): return self._clear_expectations_for_test(test) del self._test_to_expectation_line[test]
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 a94f8e1..b388554 100644 --- a/third_party/blink/tools/blinkpy/web_tests/port/android.py +++ b/third_party/blink/tools/blinkpy/web_tests/port/android.py
@@ -432,7 +432,7 @@ device_errors.CommandTimeoutError, device_errors.DeviceUnreachableError) as error: with lock: - _log.warning('[%s] failed to prepare_device: %s', serial, error) + _log.warning('[%s] failed to prepare_device: %s', device.serial, error) devices = self._devices.usable_devices(self.host.executive) device_utils.DeviceUtils.parallel(devices).pMap(setup_device)
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 09312ae5..1e16870e80 100644 --- a/third_party/blink/tools/blinkpy/web_tests/port/base.py +++ b/third_party/blink/tools/blinkpy/web_tests/port/base.py
@@ -1067,6 +1067,20 @@ """ return self._filesystem.join(self.layout_tests_dir(), test_name) + @memoized + def args_for_test(self, test_name): + test_base = self.lookup_virtual_test_base(test_name) + if test_base: + return self.lookup_virtual_test_args(test_name) + return self.lookup_physical_test_args(test_name) + + @memoized + def name_for_test(self, test_name): + test_base = self.lookup_virtual_test_base(test_name) + if test_base and not self._filesystem.exists(self.abspath_for_test(test_name)): + return test_base + return test_name + def results_directory(self): """Returns the absolute path to the place to store the test results.""" if not self._results_directory:
diff --git a/third_party/blink/tools/blinkpy/web_tests/run_webkit_tests_unittest.py b/third_party/blink/tools/blinkpy/web_tests/run_webkit_tests_unittest.py index 78f6c76e..dfa77e5 100644 --- a/third_party/blink/tools/blinkpy/web_tests/run_webkit_tests_unittest.py +++ b/third_party/blink/tools/blinkpy/web_tests/run_webkit_tests_unittest.py
@@ -29,11 +29,14 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import json +import os import re import StringIO +import sys import unittest from blinkpy.common import exit_codes +from blinkpy.common import path_finder from blinkpy.common.host import Host from blinkpy.common.host_mock import MockHost from blinkpy.common.system.path import abspath_to_uri @@ -44,6 +47,11 @@ from blinkpy.web_tests.models import test_failures from blinkpy.web_tests.port import test +_MOCK_ROOT = os.path.join( + path_finder.get_chromium_src_dir(), 'third_party', 'pymock') +sys.path.append(_MOCK_ROOT) +import mock + def parse_args(extra_args=None, tests_included=False): extra_args = extra_args or [] @@ -521,25 +529,31 @@ def test_sharding_even(self): # Test that we actually select the right part tests_to_run = ['passes/error.html', 'passes/image.html', 'passes/platform_image.html', 'passes/text.html'] - # Shard 0 of 2 - tests_run = get_tests_run(['--shard-index', '0', '--total-shards', '2', '--order', 'natural'] + tests_to_run) - self.assertEqual(tests_run, ['passes/error.html', 'passes/image.html']) - # Shard 1 of 2 - tests_run = get_tests_run(['--shard-index', '1', '--total-shards', '2', '--order', 'natural'] + tests_to_run) - self.assertEqual(tests_run, ['passes/platform_image.html', 'passes/text.html']) + + with mock.patch('__builtin__.hash', len): + + # Shard 0 of 2 + tests_run = get_tests_run(['--shard-index', '0', '--total-shards', '2', '--order', 'natural'] + tests_to_run) + self.assertEqual(tests_run, ['passes/platform_image.html', 'passes/text.html']) + # Shard 1 of 2 + tests_run = get_tests_run(['--shard-index', '1', '--total-shards', '2', '--order', 'natural'] + tests_to_run) + self.assertEqual(tests_run, ['passes/error.html', 'passes/image.html']) def test_sharding_uneven(self): tests_to_run = ['passes/error.html', 'passes/image.html', 'passes/platform_image.html', 'passes/text.html', 'perf/foo/test.html'] - # Shard 0 of 3 - tests_run = get_tests_run(['--shard-index', '0', '--total-shards', '3', '--order', 'natural'] + tests_to_run) - self.assertEqual(tests_run, ['passes/error.html', 'passes/image.html']) - # Shard 1 of 3 - tests_run = get_tests_run(['--shard-index', '1', '--total-shards', '3', '--order', 'natural'] + tests_to_run) - self.assertEqual(tests_run, ['passes/platform_image.html', 'passes/text.html']) - # Shard 2 of 3 - tests_run = get_tests_run(['--shard-index', '2', '--total-shards', '3', '--order', 'natural'] + tests_to_run) - self.assertEqual(tests_run, ['perf/foo/test.html']) + + with mock.patch('__builtin__.hash', len): + + # Shard 0 of 3 + tests_run = get_tests_run(['--shard-index', '0', '--total-shards', '3', '--order', 'natural'] + tests_to_run) + self.assertEqual(tests_run, ['perf/foo/test.html']) + # Shard 1 of 3 + tests_run = get_tests_run(['--shard-index', '1', '--total-shards', '3', '--order', 'natural'] + tests_to_run) + self.assertEqual(tests_run, ['passes/text.html']) + # Shard 2 of 3 + tests_run = get_tests_run(['--shard-index', '2', '--total-shards', '3', '--order', 'natural'] + tests_to_run) + self.assertEqual(tests_run, ['passes/error.html', 'passes/image.html', 'passes/platform_image.html']) def test_sharding_incorrect_arguments(self): with self.assertRaises(ValueError): @@ -553,15 +567,17 @@ tests_to_run = ['passes/error.html', 'passes/image.html', 'passes/platform_image.html', 'passes/text.html'] host = MockHost() - host.environ['GTEST_SHARD_INDEX'] = '0' - host.environ['GTEST_TOTAL_SHARDS'] = '2' - shard_0_tests_run = get_tests_run(['--order', 'natural'] + tests_to_run, host=host) - self.assertEqual(shard_0_tests_run, ['passes/error.html', 'passes/image.html']) + with mock.patch('__builtin__.hash', len): - host.environ['GTEST_SHARD_INDEX'] = '1' - host.environ['GTEST_TOTAL_SHARDS'] = '2' - shard_1_tests_run = get_tests_run(['--order', 'natural'] + tests_to_run, host=host) - self.assertEqual(shard_1_tests_run, ['passes/platform_image.html', 'passes/text.html']) + host.environ['GTEST_SHARD_INDEX'] = '0' + host.environ['GTEST_TOTAL_SHARDS'] = '2' + shard_0_tests_run = get_tests_run(['--order', 'natural'] + tests_to_run, host=host) + self.assertEqual(shard_0_tests_run, ['passes/platform_image.html', 'passes/text.html']) + + host.environ['GTEST_SHARD_INDEX'] = '1' + host.environ['GTEST_TOTAL_SHARDS'] = '2' + shard_1_tests_run = get_tests_run(['--order', 'natural'] + tests_to_run, host=host) + self.assertEqual(shard_1_tests_run, ['passes/error.html', 'passes/image.html']) def test_smoke_test(self): host = MockHost()
diff --git a/third_party/blink/tools/blinkpy/web_tests/servers/apache_http.py b/third_party/blink/tools/blinkpy/web_tests/servers/apache_http.py index 9f96f04..991ae4a 100644 --- a/third_party/blink/tools/blinkpy/web_tests/servers/apache_http.py +++ b/third_party/blink/tools/blinkpy/web_tests/servers/apache_http.py
@@ -179,12 +179,11 @@ proc = self._executive.popen([self._port_obj.path_to_apache(), '-f', self._port_obj.path_to_apache_config_file(), '-c', 'PidFile "%s"' % self._pid_file, - '-k', 'stop'], stderr=self._executive.PIPE) - proc.wait() + '-k', 'stop']) + _, err = proc.communicate() retval = proc.returncode - err = proc.stderr.read() - if retval or len(err): - raise server_base.ServerError('Failed to stop %s: %s' % (self._name, err)) + if retval or (err and len(err)): + raise server_base.ServerError('Failed to stop %s: %s %s' % (self._name, err)) # For some reason apache isn't guaranteed to have actually stopped after # the stop command returns, so we wait a little while longer for the
diff --git a/third_party/feed/README.chromium b/third_party/feed/README.chromium index 17b992eb..9a496447 100644 --- a/third_party/feed/README.chromium +++ b/third_party/feed/README.chromium
@@ -2,7 +2,7 @@ Short name: feed URL: https://chromium.googlesource.com/feed Version: 0 -Revision: 3da352fb7e6e3de358373f017dc6e23dfba60132 +Revision: f7661592882a7ea507576dab4b70237fdfbffa96 License: Apache 2.0 License File: LICENSE Security Critical: yes
diff --git a/third_party/feed/java_sources.gni b/third_party/feed/java_sources.gni index f2dd8ff..262c371 100644 --- a/third_party/feed/java_sources.gni +++ b/third_party/feed/java_sources.gni
@@ -60,7 +60,6 @@ "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/drivers/ZeroStateDriver.java", "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/logging/LoggingListener.java", "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/logging/OneShotVisibilityLoggingListener.java", - "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/logging/StreamBasicLoggingApi.java", "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/logging/StreamContentLoggingData.java", "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/logging/VisibilityListener.java", "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/logging/VisibilityMonitor.java", @@ -80,6 +79,7 @@ "src/src/main/java/com/google/android/libraries/feed/common/concurrent/TaskQueue.java", "src/src/main/java/com/google/android/libraries/feed/common/functional/Committer.java", "src/src/main/java/com/google/android/libraries/feed/common/functional/Consumer.java", + "src/src/main/java/com/google/android/libraries/feed/common/functional/Predicate.java", "src/src/main/java/com/google/android/libraries/feed/common/functional/SettableSupplier.java", "src/src/main/java/com/google/android/libraries/feed/common/functional/Supplier.java", "src/src/main/java/com/google/android/libraries/feed/common/logging/Dumpable.java", @@ -90,6 +90,7 @@ "src/src/main/java/com/google/android/libraries/feed/common/time/Clock.java", "src/src/main/java/com/google/android/libraries/feed/common/time/SystemClockImpl.java", "src/src/main/java/com/google/android/libraries/feed/common/time/TimingUtils.java", + "src/src/main/java/com/google/android/libraries/feed/common/ui/LayoutUtils.java", "src/src/main/java/com/google/android/libraries/feed/feedactionmanager/FeedActionManagerImpl.java", "src/src/main/java/com/google/android/libraries/feed/feedactionparser/FeedActionParser.java", "src/src/main/java/com/google/android/libraries/feed/feedactionparser/internal/PietFeedActionPaylaodRetriever.java", @@ -137,6 +138,7 @@ "src/src/main/java/com/google/android/libraries/feed/host/config/DebugBehavior.java", "src/src/main/java/com/google/android/libraries/feed/host/imageloader/ImageLoaderApi.java", "src/src/main/java/com/google/android/libraries/feed/host/logging/BasicLoggingApi.java", + "src/src/main/java/com/google/android/libraries/feed/host/logging/ContentLoggingData.java", "src/src/main/java/com/google/android/libraries/feed/host/logging/LoggingApi.java", "src/src/main/java/com/google/android/libraries/feed/host/network/HttpHeader.java", "src/src/main/java/com/google/android/libraries/feed/host/network/HttpRequest.java",
diff --git a/third_party/sqlite/BUILD.gn b/third_party/sqlite/BUILD.gn index 6de49a44..33fadc8 100644 --- a/third_party/sqlite/BUILD.gn +++ b/third_party/sqlite/BUILD.gn
@@ -84,6 +84,9 @@ # still exists, but does not work as promised. "SQLITE_DEFAULT_MEMSTATUS=1", + # Must match sql::Connection::kDefaultPageSize. + "SQLITE_DEFAULT_PAGE_SIZE=4096", + # By default SQLite pre-allocates 100 pages of pcache data, which will not # be released until the handle is closed. This is contrary to Chrome's # memory-usage goals.
diff --git a/tools/clang/OWNERS b/tools/clang/OWNERS index 0dfd9ae..0da75e8 100644 --- a/tools/clang/OWNERS +++ b/tools/clang/OWNERS
@@ -1,6 +1,7 @@ hans@chromium.org pcc@chromium.org thakis@chromium.org +rnk@chromium.org # Only for clang tooling. dcheng@chromium.org
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 4644c0b..15f5b83 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -29887,6 +29887,9 @@ </enum> <enum name="MalformedResponseResult"> + <obsolete> + Deprecated July 2018. + </obsolete> <int value="0" label="Success"/> <int value="1" label="Malformed"/> <int value="2" label="Other failure"/> @@ -47377,6 +47380,13 @@ <int value="7" label="kNoStore"/> </enum> +<enum name="UnifiedConsentBumpAction"> + <int value="0" label="Opt into Unified Consent was clicked"/> + <int value="1" label="More options: Opt into Unified Consent was selected"/> + <int value="2" label="More options: Review settings was selected"/> + <int value="3" label="More options: Make no changes was selected"/> +</enum> + <enum name="UniformityTrialGroupNotActive"> <int value="0" label="Invalid"/> <int value="1" label="Group not reported"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 2683d84..687ab65 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -50467,6 +50467,9 @@ <histogram name="Net.DNS.ResultAfterMalformedResponse" enum="MalformedResponseResult"> + <obsolete> + Deprecated July 2018. + </obsolete> <owner>mgersh@chromium.org</owner> <summary> When DnsUDPAttempt gets a malformed response, it returns an error but @@ -106119,6 +106122,15 @@ </summary> </histogram> +<histogram name="UnifiedConsent.ConsentBump.Action" + enum="UnifiedConsentBumpAction"> + <owner>tangltom@chromium.org</owner> + <owner>msarda@chromium.org</owner> + <summary> + The action the user takes when the unified consent bump is shown. + </summary> +</histogram> + <histogram name="UpdateClient.BackgroundDownloaderJobs" units="jobs"> <owner>sorin@chromium.org</owner> <summary>
diff --git a/ui/file_manager/OWNERS b/ui/file_manager/OWNERS index a92dbd3d..9feaadf4 100644 --- a/ui/file_manager/OWNERS +++ b/ui/file_manager/OWNERS
@@ -1,5 +1,6 @@ fukino@chromium.org joelhockey@chromium.org +lucmult@chromium.org mtomasz@chromium.org noel@chromium.org sashab@chromium.org
diff --git a/ui/file_manager/file_manager/foreground/js/file_tasks_unittest.js b/ui/file_manager/file_manager/foreground/js/file_tasks_unittest.js index ad867774d..9286c58 100644 --- a/ui/file_manager/file_manager/foreground/js/file_tasks_unittest.js +++ b/ui/file_manager/file_manager/foreground/js/file_tasks_unittest.js
@@ -9,7 +9,8 @@ var mockTaskHistory = { getLastExecutedTime: function(id) { return 0; - } + }, + recordTaskExecuted: function(id) {} }; loadTimeData.data = { @@ -20,6 +21,7 @@ NO_TASK_FOR_CRX: 'NO_TASK_FOR_CRX', NO_TASK_FOR_CRX_TITLE: 'NO_TASK_FOR_CRX_TITLE', OPEN_WITH_BUTTON_LABEL: 'OPEN_WITH_BUTTON_LABEL', + TASK_INSTALL_LINUX_PACKAGE: 'TASK_INSTALL_LINUX_PACKAGE', TASK_OPEN: 'TASK_OPEN', MORE_ACTIONS_BUTTON_LABEL: 'MORE_ACTIONS_BUTTON_LABEL' }; @@ -57,7 +59,7 @@ return { volumeManager: { getLocationInfo: function(entry) { - return VolumeManagerCommon.RootType.DRIVE; + return {rootType: VolumeManagerCommon.RootType.DRIVE}; }, getDriveConnectionState: function() { return VolumeManagerCommon.DriveConnectionType.ONLINE; @@ -69,8 +71,7 @@ } }, ui: { - alertDialog: - {showHtml: function(title, text, onOk, onCancel, onShow) {}} + alertDialog: {showHtml: function(title, text, onOk, onCancel, onShow) {}} }, metadataModel: {}, directoryModel: { @@ -431,3 +432,45 @@ }); reportPromise(promise, callback); } + +function testOpenInstallLinuxPackageDialog(callback) { + window.chrome.fileManagerPrivate.getFileTasks = function(entries, callback) { + setTimeout( + callback.bind( + null, + [ + { + taskId: 'test-extension-id|file|install-linux-package', + isDefault: false, + isGenericFileHandler: false, + title: '__MSG_INSTALL_LINUX_PACKAGE__', + }, + ]), + 0); + }; + + var mockFileSystem = new MockFileSystem('volumeId'); + var mockEntry = new MockFileEntry(mockFileSystem, '/test.deb'); + var promise = new Promise(function(resolve, reject) { + var fileManager = getMockFileManager(); + fileManager.ui.installLinuxPackageDialog = { + showInstallLinuxPackageDialog: function(entry) { + resolve(); + } + }; + + fileManager.volumeManager.getLocationInfo = function(entry) { + return {rootType: VolumeManagerCommon.RootType.CROSTINI}; + }; + + FileTasks + .create( + fileManager.volumeManager, fileManager.metadataModel, + fileManager.directoryModel, fileManager.ui, [mockEntry], [null], + mockTaskHistory) + .then(function(tasks) { + tasks.executeDefault(); + }); + }); + reportPromise(promise, callback); +}
diff --git a/ui/file_manager/integration_tests/file_manager/install_linux_package_dialog.js b/ui/file_manager/integration_tests/file_manager/install_linux_package_dialog.js new file mode 100644 index 0000000..01194f8 --- /dev/null +++ b/ui/file_manager/integration_tests/file_manager/install_linux_package_dialog.js
@@ -0,0 +1,79 @@ +// 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. + +'use strict'; + +testcase.installLinuxPackageDialog = function() { + const fake = '#directory-tree .tree-item [root-type-icon="crostini"]'; + const real = '#directory-tree .tree-item [volume-type-icon="crostini"]'; + // The dialog has an INSTALL and OK button, both as .cr-dialog-ok, but only + // one is visible at a time. + const dialog = '#install-linux-package-dialog'; + const okButton = dialog + ' .cr-dialog-ok:not([hidden])'; + + let appId; + + StepsRunner.run([ + function() { + setupAndWaitUntilReady(null, RootPath.DOWNLOADS, this.next); + }, + // Add entries to crostini volume, but do not mount. + function(results) { + appId = results.windowId; + addEntries(['crostini'], [ENTRIES.debPackage], this.next); + }, + // Linux Files fake root is shown. + function() { + remoteCall.waitForElement(appId, fake).then(this.next); + }, + // Mount crostini, and ensure real root and files are shown. + function() { + remoteCall.callRemoteTestUtil('fakeMouseClick', appId, [fake]); + remoteCall.waitForElement(appId, real).then(this.next); + }, + function() { + const files = TestEntryInfo.getExpectedRows([ENTRIES.debPackage]); + remoteCall.waitForFiles(appId, files).then(this.next); + }, + // Open the deb package. + function() { + remoteCall.callRemoteTestUtil( + 'openFile', appId, [ENTRIES.debPackage.targetPath], this.next); + }, + // Ensure package install dialog is shown. + function() { + remoteCall.waitForElement(appId, dialog).then(this.next); + }, + // Begin installation. + function() { + remoteCall.callRemoteTestUtil( + 'fakeMouseClick', appId, [okButton], this.next); + }, + // Wait for the installation to start (under test, we use a fake D-Bus + // client, so it doesn't actually install anything). + function() { + repeatUntil(function() { + return remoteCall + .callRemoteTestUtil('queryAllElements', appId, ['.cr-dialog-text']) + .then(function(elements) { + return elements[0] && + elements[0].text == 'Installation successfully started.' || + pending('Waiting for installation to start.'); + }); + }).then(this.next); + }, + // Dismiss dialog + function() { + remoteCall.callRemoteTestUtil( + 'fakeMouseClick', appId, [okButton], this.next); + }, + // Ensure dialog closes + function() { + remoteCall.waitForElementLost(appId, dialog).then(this.next); + }, + function() { + checkIfNoErrorsOccured(this.next); + }, + ]); +};
diff --git a/ui/file_manager/integration_tests/file_manager_test_manifest.json b/ui/file_manager/integration_tests/file_manager_test_manifest.json index 55a1c17d..eef0baf8 100644 --- a/ui/file_manager/integration_tests/file_manager_test_manifest.json +++ b/ui/file_manager/integration_tests/file_manager_test_manifest.json
@@ -26,6 +26,7 @@ "file_manager/folder_shortcuts.js", "file_manager/gear_menu.js", "file_manager/grid_view.js", + "file_manager/install_linux_package_dialog.js", "file_manager/keyboard_operations.js", "file_manager/my_files.js", "file_manager/open_audio_files.js",
diff --git a/ui/file_manager/integration_tests/test_util.js b/ui/file_manager/integration_tests/test_util.js index a5d6a0e..3093fee 100644 --- a/ui/file_manager/integration_tests/test_util.js +++ b/ui/file_manager/integration_tests/test_util.js
@@ -545,6 +545,17 @@ typeText: 'Zip archive' }), + debPackage: new TestEntryInfo({ + type: EntryType.FILE, + sourceFileName: 'package.deb', + targetPath: 'package.deb', + mimeType: 'application/vnd.debian.binary-package', + lastModifiedTime: 'Jan 1, 2014, 1:00 AM', + nameText: 'package.deb', + sizeText: '724 bytes', + typeText: 'DEB file' + }), + hiddenFile: new TestEntryInfo({ type: EntryType.FILE, sourceFileName: 'text.txt',
diff --git a/ui/views/controls/menu/menu_host.cc b/ui/views/controls/menu/menu_host.cc index f14a1c06..992f116 100644 --- a/ui/views/controls/menu/menu_host.cc +++ b/ui/views/controls/menu/menu_host.cc
@@ -126,6 +126,11 @@ Widget::InitParams::OPAQUE_WINDOW; params.parent = parent ? parent->GetNativeView() : NULL; params.bounds = bounds; + // If MenuHost has no parent widget, it needs to be marked + // Activatable, so that calling Show in ShowMenuHost will + // get keyboard focus. + if (parent == nullptr) + params.activatable = Widget::InitParams::ACTIVATABLE_YES; #if defined(OS_WIN) // On Windows use the software compositor to ensure that we don't block // the UI thread blocking issue during command buffer creation. We can @@ -173,6 +178,10 @@ // events due to the menu taking capture. ui::GestureRecognizer::Get()->CancelActiveTouchesExcept(nullptr); #endif // defined (OS_MACOSX) + // If MenuHost has no parent widget, it needs to call Show to get focus, + // so that it will get keyboard events. + if (owner_ == nullptr) + Show(); native_widget_private()->SetCapture(); } }
diff --git a/ui/views/vector_icons/ic_close.icon b/ui/views/vector_icons/ic_close.icon index 686da72b..f298b77 100644 --- a/ui/views/vector_icons/ic_close.icon +++ b/ui/views/vector_icons/ic_close.icon
@@ -31,3 +31,18 @@ LINE_TO, 19, 17.59f, LINE_TO, 13.41f, 12, CLOSE + +CANVAS_DIMENSIONS, 20, +MOVE_TO, 16, 5.41f, +LINE_TO, 14.59f, 4, +LINE_TO, 10, 8.59f, +LINE_TO, 5.41f, 4, +LINE_TO, 4, 5.41f, +LINE_TO, 8.59f, 10, +LINE_TO, 4, 14.59f, +LINE_TO, 5.41f, 16, +LINE_TO, 10, 11.41f, +LINE_TO, 14.59f, 16, +LINE_TO, 16, 14.59f, +LINE_TO, 11.41f, 10, +CLOSE
diff --git a/webrunner/browser/webrunner_browser_context.cc b/webrunner/browser/webrunner_browser_context.cc index 6be2563..cadd0e1 100644 --- a/webrunner/browser/webrunner_browser_context.cc +++ b/webrunner/browser/webrunner_browser_context.cc
@@ -12,6 +12,7 @@ #include "services/network/public/cpp/network_switches.h" #include "webrunner/browser/webrunner_net_log.h" #include "webrunner/browser/webrunner_url_request_context_getter.h" +#include "webrunner/service/common.h" namespace webrunner { @@ -52,10 +53,11 @@ return result; } -WebRunnerBrowserContext::WebRunnerBrowserContext() - : net_log_(CreateNetLog()), resource_context_(new ResourceContext()) { - // TODO(sergeyu): Pass a valid path. - BrowserContext::Initialize(this, base::FilePath()); +WebRunnerBrowserContext::WebRunnerBrowserContext(base::FilePath data_dir_path) + : data_dir_path_(std::move(data_dir_path)), + net_log_(CreateNetLog()), + resource_context_(new ResourceContext()) { + BrowserContext::Initialize(this, GetPath()); } WebRunnerBrowserContext::~WebRunnerBrowserContext() { @@ -72,8 +74,7 @@ } base::FilePath WebRunnerBrowserContext::GetPath() const { - NOTIMPLEMENTED(); - return base::FilePath(); + return data_dir_path_; } base::FilePath WebRunnerBrowserContext::GetCachePath() const { @@ -82,7 +83,7 @@ } bool WebRunnerBrowserContext::IsOffTheRecord() const { - return false; + return data_dir_path_.empty(); } content::ResourceContext* WebRunnerBrowserContext::GetResourceContext() {
diff --git a/webrunner/browser/webrunner_browser_context.h b/webrunner/browser/webrunner_browser_context.h index b247dc09..dada25d6 100644 --- a/webrunner/browser/webrunner_browser_context.h +++ b/webrunner/browser/webrunner_browser_context.h
@@ -5,6 +5,7 @@ #ifndef WEBRUNNER_BROWSER_WEBRUNNER_BROWSER_CONTEXT_H_ #define WEBRUNNER_BROWSER_WEBRUNNER_BROWSER_CONTEXT_H_ +#include "base/files/file_path.h" #include "base/macros.h" #include "content/public/browser/browser_context.h" @@ -15,7 +16,7 @@ class WebRunnerBrowserContext : public content::BrowserContext { public: - WebRunnerBrowserContext(); + explicit WebRunnerBrowserContext(base::FilePath data_dir_path); ~WebRunnerBrowserContext() override; // BrowserContext implementation. @@ -53,6 +54,8 @@ // Contains URLRequestContextGetter required for resource loading. class ResourceContext; + const base::FilePath data_dir_path_; + std::unique_ptr<WebRunnerNetLog> net_log_; scoped_refptr<WebRunnerURLRequestContextGetter> url_request_getter_; std::unique_ptr<ResourceContext> resource_context_;
diff --git a/webrunner/browser/webrunner_browser_main_parts.cc b/webrunner/browser/webrunner_browser_main_parts.cc index 709ae08..b431578 100644 --- a/webrunner/browser/webrunner_browser_main_parts.cc +++ b/webrunner/browser/webrunner_browser_main_parts.cc
@@ -4,9 +4,12 @@ #include "webrunner/browser/webrunner_browser_main_parts.h" +#include "base/command_line.h" +#include "base/files/file_util.h" #include "webrunner/browser/context_impl.h" #include "webrunner/browser/webrunner_browser_context.h" #include "webrunner/browser/webrunner_screen.h" +#include "webrunner/service/common.h" namespace webrunner { @@ -22,7 +25,8 @@ display::Screen::SetScreenInstance(screen_.get()); DCHECK(!browser_context_); - browser_context_ = std::make_unique<WebRunnerBrowserContext>(); + browser_context_ = + std::make_unique<WebRunnerBrowserContext>(GetWebContextDataDir()); fidl::InterfaceRequest<chromium::web::Context> context_request( std::move(context_channel_));
diff --git a/webrunner/service/common.cc b/webrunner/service/common.cc index 4e1a024..7c8991e 100644 --- a/webrunner/service/common.cc +++ b/webrunner/service/common.cc
@@ -4,8 +4,26 @@ #include "webrunner/service/common.h" +#include "base/command_line.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/logging.h" + namespace webrunner { -constexpr const char kProcessTypeWebContext[] = "web-context"; +constexpr char kIncognitoSwitch[] = "incognito"; + +constexpr char kWebContextDataPath[] = "/web_context_data"; + +base::FilePath GetWebContextDataDir() { + base::FilePath data_dir{kWebContextDataPath}; + bool is_incognito = + base::CommandLine::ForCurrentProcess()->HasSwitch(kIncognitoSwitch); + CHECK_EQ(is_incognito, !base::DirectoryExists(data_dir)); + + if (is_incognito) + return base::FilePath(); + return data_dir; +} } // namespace webrunner
diff --git a/webrunner/service/common.h b/webrunner/service/common.h index 868786a07..351fbf2 100644 --- a/webrunner/service/common.h +++ b/webrunner/service/common.h
@@ -7,13 +7,29 @@ #include <zircon/processargs.h> -namespace webrunner { +namespace base { +class FilePath; +} +namespace webrunner { +// This file contains constants and functions shared between Context and +// ContextProvider processes. + +// Handle ID for the Context interface request passed from ContextProvider to +// Context process. constexpr uint32_t kContextRequestHandleId = PA_HND(PA_USER0, 0); -// Process type value used for the web::Context process. It is equivalent to -// the main browser process in chrome. -extern const char kProcessTypeWebContext[]; +// Path to the direct used to store persistent data in context process. +extern const char kWebContextDataPath[]; + +// Switch passed to content process when running in incognito mode, i.e. when +// there is no kWebContextDataPath. +extern const char kIncognitoSwitch[]; + +// Returns data directory that should be used by this context process. Should +// not be called in ContextProvider. Empty path is returned if the context +// doesn't have storage dir. +base::FilePath GetWebContextDataDir(); } // namespace webrunner
diff --git a/webrunner/service/context_provider_impl.cc b/webrunner/service/context_provider_impl.cc index d02751b..dc14bf0 100644 --- a/webrunner/service/context_provider_impl.cc +++ b/webrunner/service/context_provider_impl.cc
@@ -24,8 +24,8 @@ namespace { // Relaunches the current executable as a Context process. -base::Process LaunchContextProcess(const base::LaunchOptions& launch_options) { - base::CommandLine launch_command = *base::CommandLine::ForCurrentProcess(); +base::Process LaunchContextProcess(base::CommandLine launch_command, + const base::LaunchOptions& launch_options) { // TODO(crbug.com/867052): Remove this flag when GPU process works on Fuchsia. launch_command.AppendSwitch(switches::kDisableGpu); return base::LaunchProcess(launch_command, launch_options); @@ -48,26 +48,33 @@ ::fidl::InterfaceRequest<chromium::web::Context> context_request) { DCHECK(context_request.is_valid()); - if (params.dataDirectory) { - // TODO(https://crbug.com/850743): Implement this. - NOTIMPLEMENTED() - << "Persistent data directory binding is not yet implemented."; - } + base::CommandLine launch_command = *base::CommandLine::ForCurrentProcess(); + + base::LaunchOptions launch_options; + launch_options.spawn_flags = FDIO_SPAWN_CLONE_STDIO; // Transfer the ContextRequest handle to a well-known location in the child // process' handle table. - base::LaunchOptions launch_options; zx::channel context_handle(context_request.TakeChannel()); launch_options.handles_to_transfer.push_back( {kContextRequestHandleId, context_handle.get()}); + // Pass the data directory. If there is no data dir then --incognito flag is + // added instead. + if (params.dataDirectory) { + launch_options.paths_to_transfer.push_back(base::PathToTransfer{ + base::FilePath(kWebContextDataPath), params.dataDirectory.release()}); + } else { + launch_command.AppendSwitch(kIncognitoSwitch); + } + // Isolate the child Context processes by containing them within their own // respective jobs. zx::job job; zx_status_t status = zx::job::create(*base::GetDefaultJob(), 0, &job); ZX_CHECK(status == ZX_OK, status) << "zx_job_create"; - ignore_result(launch_.Run(launch_options)); + ignore_result(launch_.Run(std::move(launch_command), launch_options)); ignore_result(context_handle.release()); ignore_result(job.release()); }
diff --git a/webrunner/service/context_provider_impl.h b/webrunner/service/context_provider_impl.h index 0305eea9..7629f78d 100644 --- a/webrunner/service/context_provider_impl.h +++ b/webrunner/service/context_provider_impl.h
@@ -13,6 +13,7 @@ #include "webrunner/common/webrunner_export.h" namespace base { +class CommandLine; struct LaunchOptions; class Process; } // namespace base @@ -36,8 +37,9 @@ override; private: - using LaunchContextProcessCallback = - base::RepeatingCallback<base::Process(const base::LaunchOptions&)>; + using LaunchContextProcessCallback = base::RepeatingCallback<base::Process( + base::CommandLine command, + const base::LaunchOptions& options)>; friend class ContextProviderImplTest;
diff --git a/webrunner/service/context_provider_impl_unittest.cc b/webrunner/service/context_provider_impl_unittest.cc index 9244d57..eabe426 100644 --- a/webrunner/service/context_provider_impl_unittest.cc +++ b/webrunner/service/context_provider_impl_unittest.cc
@@ -4,6 +4,7 @@ #include "webrunner/service/context_provider_impl.h" +#include <lib/fdio/util.h> #include <lib/fidl/cpp/binding.h> #include <zircon/processargs.h> @@ -15,6 +16,8 @@ #include "base/bind_helpers.h" #include "base/command_line.h" #include "base/files/file.h" +#include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" #include "base/fuchsia/file_utils.h" #include "base/message_loop/message_loop.h" #include "base/test/multiprocess_test.h" @@ -25,6 +28,9 @@ namespace webrunner { namespace { +constexpr char kTestDataFileIn[] = "DataFileIn"; +constexpr char kTestDataFileOut[] = "DataFileOut"; + class TestFrameObserver : public chromium::web::FrameObserver { public: void OnNavigationStateChanged( @@ -52,8 +58,8 @@ class FakeContext : public chromium::web::Context { public: void CreateFrame( - ::fidl::InterfaceHandle<chromium::web::FrameObserver> observer, - ::fidl::InterfaceRequest<chromium::web::Frame> frame) override { + fidl::InterfaceHandle<chromium::web::FrameObserver> observer, + fidl::InterfaceRequest<chromium::web::Frame> frame) override { chromium::web::NavigationStateChangeDetails details; details.url_changed = true; details.entry.url = ""; @@ -64,6 +70,15 @@ MULTIPROCESS_TEST_MAIN(SpawnContextServer) { base::MessageLoopForIO message_loop; + + base::FilePath data_dir = GetWebContextDataDir(); + if (!data_dir.empty()) { + EXPECT_TRUE(base::PathExists(data_dir.AppendASCII(kTestDataFileIn))); + + auto out_file = data_dir.AppendASCII(kTestDataFileOut); + EXPECT_EQ(base::WriteFile(out_file, nullptr, 0), 0); + } + FakeContext fake_context; zx::channel context_handle{zx_take_startup_handle(kContextRequestHandleId)}; CHECK(context_handle); @@ -96,15 +111,49 @@ // Start a new child process whose main function is defined in // MULTIPROCESSING_TEST_MAIN(SpawnContextServer). - base::Process LaunchProcess(const base::LaunchOptions& options) { - auto cmdline = base::GetMultiProcessTestChildBaseCommandLine(); - cmdline.AppendSwitchASCII(switches::kTestChildProcess, + base::Process LaunchProcess(base::CommandLine command, + const base::LaunchOptions& options) { + command.AppendSwitchASCII(switches::kTestChildProcess, "SpawnContextServer"); - base::Process context_process = base::LaunchProcess(cmdline, options); + base::Process context_process = base::LaunchProcess(command, options); EXPECT_TRUE(context_process.IsValid()); return context_process; } + void CheckContext(fidl::InterfacePtr<chromium::web::Context>* context) { + // Call a Context method and wait for it to invoke an observer call. + base::RunLoop run_loop; + + context->set_error_handler([&run_loop]() { + ADD_FAILURE(); + run_loop.Quit(); + }); + + TestFrameObserver frame_observer; + fidl::Binding<chromium::web::FrameObserver> frame_observer_binding( + &frame_observer); + frame_observer_binding.set_error_handler([&run_loop]() { + ADD_FAILURE(); + run_loop.Quit(); + }); + frame_observer.SetNextChangeCallback(run_loop.QuitClosure()); + + chromium::web::FramePtr frame_ptr; + frame_ptr.set_error_handler([&run_loop]() { + ADD_FAILURE(); + run_loop.Quit(); + }); + + (*context)->CreateFrame(frame_observer_binding.NewBinding(), + frame_ptr.NewRequest()); + + + run_loop.Run(); + + EXPECT_TRUE(frame_observer.last_change().url_changed || + frame_observer.last_change().title_changed); + } + protected: base::MessageLoopForIO message_loop_; @@ -121,19 +170,7 @@ chromium::web::CreateContextParams create_params; provider_ptr_->Create(std::move(create_params), context.NewRequest()); - // Call a Context method and wait for it to invoke an observer call. - TestFrameObserver frame_observer; - chromium::web::FramePtr frame_ptr; - fidl::Binding<chromium::web::FrameObserver> frame_observer_binding( - &frame_observer); - base::RunLoop run_loop; - frame_observer.SetNextChangeCallback(run_loop.QuitClosure()); - context->CreateFrame(frame_observer_binding.NewBinding(), - frame_ptr.NewRequest()); - run_loop.Run(); - - EXPECT_TRUE(frame_observer.last_change().url_changed || - frame_observer.last_change().title_changed); + CheckContext(&context); } // Verify that there can be more than one connection to the provider. @@ -149,14 +186,44 @@ provider_2_ptr->Create(std::move(create_params), context.NewRequest()); TestFrameObserver frame_observer; - chromium::web::FramePtr frame_ptr; fidl::Binding<chromium::web::FrameObserver> frame_observer_binding( &frame_observer); base::RunLoop run_loop; frame_observer.SetNextChangeCallback(run_loop.QuitClosure()); + chromium::web::FramePtr frame_ptr; context->CreateFrame(frame_observer_binding.NewBinding(), frame_ptr.NewRequest()); run_loop.Run(); } +TEST_F(ContextProviderImplTest, WithProfileDir) { + base::ScopedTempDir profile_temp_dir; + + // Connect to a new context process. + fidl::InterfacePtr<chromium::web::Context> context; + chromium::web::CreateContextParams create_params; + + // Setup data dir. + EXPECT_TRUE(profile_temp_dir.CreateUniqueTempDir()); + ASSERT_EQ( + base::WriteFile(profile_temp_dir.GetPath().AppendASCII(kTestDataFileIn), + nullptr, 0), + 0); + + // Pass a handle data dir to the context. + create_params.dataDirectory.reset( + base::fuchsia::GetHandleFromFile( + base::File(profile_temp_dir.GetPath(), + base::File::FLAG_OPEN | base::File::FLAG_READ)) + .release()); + + provider_ptr_->Create(std::move(create_params), context.NewRequest()); + + CheckContext(&context); + + // Verify that the context process can write data to the out dir. + EXPECT_TRUE(base::PathExists( + profile_temp_dir.GetPath().AppendASCII(kTestDataFileOut))); +} + } // namespace webrunner