diff --git a/BUILD.gn b/BUILD.gn index 843225c4..e85e060 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -148,6 +148,7 @@ "//third_party/cacheinvalidation:cacheinvalidation_unittests", "//third_party/codesighs", "//third_party/pdfium/samples:pdfium_test", + "//tools/battor_agent", "//tools/gn", "//tools/gn:gn_unittests", "//tools/perf/clear_system_cache", @@ -222,10 +223,6 @@ } } - if (is_mac || is_win || is_linux) { - deps += [ "//tools/battor_agent" ] - } - deps += root_extra_deps if (enable_extensions) { @@ -293,6 +290,7 @@ "//tools/android/kerberos/SpnegoAuthenticator:spnego_authenticator_apk", "//tools/cygprofile:cygprofile_unittests", "//tools/imagediff($host_toolchain)", + "//ui/android:ui_junit_tests", ] deps -= [ "//net:net_perftests", @@ -645,6 +643,14 @@ ] } + if (is_win && use_drfuzz) { + # build libfuzzer fuzzers on Windows to run with Dr. Fuzz + deps += [ + "//testing/libfuzzer/fuzzers", + "//testing/libfuzzer/tests:libfuzzer_tests", + ] + } + if (is_linux && !is_chromeos && !is_chromecast) { # TODO(GYP): Figure out if any of these should be in gn_all # and figure out how cross-platform they are
diff --git a/DEPS b/DEPS index 53ffa03..4bfd39b 100644 --- a/DEPS +++ b/DEPS
@@ -39,11 +39,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': 'a273c0f6676b261ef82bc43b0dcc53282f2bdf8c', + 'skia_revision': 'e9573317d35d08254412eb407211f3607f8f74fb', # 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': 'b3481b53194e5e9d9b458192d09a698072dcb516', + 'v8_revision': 'e78b4e2e8eef9db0bd74d2dc2d8b0927e1004cdf', # 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. @@ -51,7 +51,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': 'a8e3494e4d598a0fb7461776e966d9c9e292b1aa', + 'angle_revision': '5b74bd390334b1c988bb4b941e7765b992f611f7', # 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. @@ -59,7 +59,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '4a2aa1a90d89b88036b0bff432ffefa183ea80d0', + 'pdfium_revision': '05e67415684adc36af228ca2f1e0efc30a40d242', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other. @@ -220,7 +220,7 @@ Var('chromium_git') + '/external/github.com/open-source-parsers/jsoncpp.git' + '@' + 'f572e8e42e22cfcf5ab0aea26574f408943edfa4', # from svn 248 'src/third_party/libyuv': - Var('chromium_git') + '/libyuv/libyuv.git' + '@' + 'fc52d8ded269e9cd40c7a763e36758a08f177da0', # from version 1563 + Var('chromium_git') + '/libyuv/libyuv.git' + '@' + 'ad71738f6abff75827941bf08a7de00ce4a0d354', # from version 1569 'src/third_party/smhasher/src': Var('chromium_git') + '/external/smhasher.git' + '@' + 'e87738e57558e0ec472b2fc3a643b838e5b6e88f', @@ -271,7 +271,7 @@ 'src/third_party/catapult': Var('chromium_git') + '/external/github.com/catapult-project/catapult.git' + '@' + - '1da866b422054c7752a5c97a99428462ccbde54c', + 'f7563a0c32bf3a59ff49150461bafbfe0082f17b', 'src/third_party/openh264/src': Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + 'b37cda248234162033e3e11b0335f3131cdfe488', @@ -418,7 +418,7 @@ # Display server protocol for Linux. 'src/third_party/wayland/src': - Var('chromium_git') + '/external/anongit.freedesktop.org/git/wayland/wayland.git' + '@' + 'b05668f0ad64ad9ba82e124965163daed4172ead', + Var('chromium_git') + '/external/anongit.freedesktop.org/git/wayland/wayland.git' + '@' + '7ed00c1de77afbab23f4908fbd9d60ec070c209b', # Wayland protocols that add functionality not available in the core protocol. 'src/third_party/wayland-protocols/src':
diff --git a/android_webview/android_webview_test_apk_run.isolate b/android_webview/android_webview_test_apk_run.isolate index 331d405..448fe04 100644 --- a/android_webview/android_webview_test_apk_run.isolate +++ b/android_webview/android_webview_test_apk_run.isolate
@@ -11,6 +11,7 @@ '--enable-platform-mode', '-e', 'local', '--apk-under-test', '<(PRODUCT_DIR)/apks/AndroidWebView.apk', + '--logcat-output-dir', '${ISOLATED_OUTDIR}/logcats', ], 'files': [ '../third_party/proguard/lib/proguard.jar',
diff --git a/android_webview/android_webview_unittests_apk.isolate b/android_webview/android_webview_unittests_apk.isolate index ca71aab..dc12ec5 100644 --- a/android_webview/android_webview_unittests_apk.isolate +++ b/android_webview/android_webview_unittests_apk.isolate
@@ -8,6 +8,7 @@ 'variables': { 'command': [ '<(PRODUCT_DIR)/bin/run_android_webview_unittests', + '--logcat-output-dir', '${ISOLATED_OUTDIR}/logcats', ], 'files': [ '<(PRODUCT_DIR)/bin/run_android_webview_unittests',
diff --git a/android_webview/browser/renderer_host/aw_render_view_host_ext.cc b/android_webview/browser/renderer_host/aw_render_view_host_ext.cc index 6e22728..090541d 100644 --- a/android_webview/browser/renderer_host/aw_render_view_host_ext.cc +++ b/android_webview/browser/renderer_host/aw_render_view_host_ext.cc
@@ -120,8 +120,8 @@ void AwRenderViewHostExt::RenderViewCreated( content::RenderViewHost* render_view_host) { - Send(new AwViewMsg_SetBackgroundColor(web_contents()->GetRoutingID(), - background_color_)); + Send(new AwViewMsg_SetBackgroundColor( + web_contents()->GetMainFrame()->GetRoutingID(), background_color_)); } void AwRenderViewHostExt::RenderProcessGone(base::TerminationStatus status) {
diff --git a/android_webview/java/src/org/chromium/android_webview/AwTokenBindingManager.java b/android_webview/java/src/org/chromium/android_webview/AwTokenBindingManager.java index 3f2f6955..a622781 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwTokenBindingManager.java +++ b/android_webview/java/src/org/chromium/android_webview/AwTokenBindingManager.java
@@ -7,11 +7,27 @@ import android.net.Uri; import android.webkit.ValueCallback; +import org.chromium.base.Log; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; +import java.io.IOException; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.Key; +import java.security.KeyFactory; import java.security.KeyPair; -import java.security.spec.AlgorithmParameterSpec; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.X509EncodedKeySpec; + +import javax.crypto.Cipher; +import javax.crypto.EncryptedPrivateKeyInfo; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.PBEKeySpec; /** * AwTokenBindingManager manages the token binding protocol. @@ -25,11 +41,16 @@ */ @JNINamespace("android_webview") public final class AwTokenBindingManager { + private static final String TAG = "TokenBindingManager"; + private static final String PASSWORD = ""; + private static final String ALGORITHM = "PBEWITHSHAAND3-KEYTRIPLEDES-CBC"; + private static final String ELLIPTIC_CURVE = "EC"; + public void enableTokenBinding() { nativeEnableTokenBinding(); } - public void getKey(Uri origin, AlgorithmParameterSpec[] spec, ValueCallback<KeyPair> callback) { + public void getKey(Uri origin, String[] spec, ValueCallback<KeyPair> callback) { if (callback == null) { throw new IllegalArgumentException("callback can't be null"); } @@ -50,8 +71,30 @@ } @CalledByNative - private static void onKeyReady(ValueCallback<KeyPair> callback) { - callback.onReceiveValue(null); + private static void onKeyReady( + ValueCallback<KeyPair> callback, byte[] privateKeyBytes, byte[] publicKeyBytes) { + if (privateKeyBytes == null || publicKeyBytes == null) { + callback.onReceiveValue(null); + return; + } + KeyPair keyPair = null; + try { + EncryptedPrivateKeyInfo epkInfo = new EncryptedPrivateKeyInfo(privateKeyBytes); + SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(ALGORITHM); + Key key = secretKeyFactory.generateSecret(new PBEKeySpec(PASSWORD.toCharArray())); + Cipher cipher = Cipher.getInstance(ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, key, epkInfo.getAlgParameters()); + KeyFactory factory = KeyFactory.getInstance(ELLIPTIC_CURVE); + PrivateKey privateKey = factory.generatePrivate(epkInfo.getKeySpec(cipher)); + PublicKey publicKey = + factory.generatePublic(new X509EncodedKeySpec(publicKeyBytes)); + keyPair = new KeyPair(publicKey, privateKey); + } catch (NoSuchAlgorithmException | InvalidKeySpecException | IOException + | NoSuchPaddingException | InvalidKeyException + | InvalidAlgorithmParameterException ex) { + Log.e(TAG, "Failed converting key ", ex); + } + callback.onReceiveValue(keyPair); } @CalledByNative
diff --git a/android_webview/native/token_binding_manager_bridge.cc b/android_webview/native/token_binding_manager_bridge.cc index 07c690f..cf959f5 100644 --- a/android_webview/native/token_binding_manager_bridge.cc +++ b/android_webview/native/token_binding_manager_bridge.cc
@@ -6,15 +6,19 @@ #include "android_webview/browser/net/token_binding_manager.h" #include "base/android/jni_android.h" +#include "base/android/jni_array.h" #include "base/android/jni_string.h" #include "base/bind.h" #include "content/public/browser/browser_thread.h" #include "crypto/ec_private_key.h" #include "jni/AwTokenBindingManager_jni.h" +#include "net/base/net_errors.h" +#include "net/ssl/channel_id_service.h" using base::android::ConvertJavaStringToUTF8; using base::android::ScopedJavaGlobalRef; using content::BrowserThread; +using net::ChannelIDService; namespace android_webview { @@ -26,10 +30,27 @@ crypto::ECPrivateKey* key) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - // TODO(sgurun) implement conversion and plumbing the keypair to java. - JNIEnv* env = base::android::AttachCurrentThread(); - Java_AwTokenBindingManager_onKeyReady(env, callback.obj()); + + if (status != net::OK || !key) { + Java_AwTokenBindingManager_onKeyReady(env, callback.obj(), nullptr, + nullptr); + return; + } + + std::vector<uint8_t> private_key; + key->ExportEncryptedPrivateKey(ChannelIDService::kEPKIPassword, 1, + &private_key); + ScopedJavaLocalRef<jbyteArray> jprivate_key = base::android::ToJavaByteArray( + env, private_key.data(), private_key.size()); + + std::vector<uint8_t> public_key; + key->ExportPublicKey(&public_key); + ScopedJavaLocalRef<jbyteArray> jpublic_key = base::android::ToJavaByteArray( + env, public_key.data(), public_key.size()); + + Java_AwTokenBindingManager_onKeyReady(env, callback.obj(), jprivate_key.obj(), + jpublic_key.obj()); } // Indicates webview client that key deletion is complete.
diff --git a/android_webview/tools/apk_merger.py b/android_webview/tools/apk_merger.py index e9ea1fe..7851fe5c 100755 --- a/android_webview/tools/apk_merger.py +++ b/android_webview/tools/apk_merger.py
@@ -121,7 +121,8 @@ def SignAndAlignApk(tmp_apk, signed_tmp_apk, new_apk, zipalign_path, - keystore_path, key_name, key_password): + keystore_path, key_name, key_password, + page_align_shared_libraries): try: finalize_apk.JarSigner( keystore_path, @@ -133,7 +134,10 @@ raise ApkMergeFailure('Failed to sign APK: ' + e.output) try: - finalize_apk.AlignApk(zipalign_path, signed_tmp_apk, new_apk) + finalize_apk.AlignApk(zipalign_path, + page_align_shared_libraries, + signed_tmp_apk, + new_apk) except build_utils.CalledProcessError as e: raise ApkMergeFailure('Failed to align APK: ' + e.output) @@ -151,6 +155,8 @@ parser.add_argument('--key_name', required=True) parser.add_argument('--key_password', required=True) parser.add_argument('--shared_library', required=True) + parser.add_argument('--page-align-shared-libraries', action='store_true') + parser.add_argument('--uncompress-shared-libraries', action='store_true') args = parser.parse_args() tmp_dir = tempfile.mkdtemp() @@ -166,6 +172,9 @@ 'natives_blob_32.bin': ['-0'], args.shared_library: []} + if args.uncompress_shared_libraries: + expected_files[args.shared_library] += ['-0'] + try: shutil.copyfile(args.apk_64bit, tmp_apk) @@ -190,7 +199,8 @@ AddDiffFiles(diff_files, tmp_dir_32, tmp_apk, expected_files) SignAndAlignApk(tmp_apk, signed_tmp_apk, new_apk, args.zipalign_path, - args.keystore_path, args.key_name, args.key_password) + args.keystore_path, args.key_name, args.key_password, + args.page_align_shared_libraries) except ApkMergeFailure as e: print e
diff --git a/base/allocator/allocator_extension.cc b/base/allocator/allocator_extension.cc index 4f0b3a90..17682f8 100644 --- a/base/allocator/allocator_extension.cc +++ b/base/allocator/allocator_extension.cc
@@ -6,34 +6,32 @@ #include "base/logging.h" +#if defined(USE_TCMALLOC) +#include "third_party/tcmalloc/chromium/src/gperftools/heap-profiler.h" +#include "third_party/tcmalloc/chromium/src/gperftools/malloc_extension.h" +#endif + namespace base { namespace allocator { -namespace { -ReleaseFreeMemoryFunction g_release_free_memory_function = nullptr; -GetNumericPropertyFunction g_get_numeric_property_function = nullptr; -} - void ReleaseFreeMemory() { - if (g_release_free_memory_function) - g_release_free_memory_function(); +#if defined(USE_TCMALLOC) + ::MallocExtension::instance()->ReleaseFreeMemory(); +#endif } bool GetNumericProperty(const char* name, size_t* value) { - return g_get_numeric_property_function && - g_get_numeric_property_function(name, value); +#if defined(USE_TCMALLOC) + return ::MallocExtension::instance()->GetNumericProperty(name, value); +#endif + return false; } -void SetReleaseFreeMemoryFunction( - ReleaseFreeMemoryFunction release_free_memory_function) { - DCHECK(!g_release_free_memory_function); - g_release_free_memory_function = release_free_memory_function; -} - -void SetGetNumericPropertyFunction( - GetNumericPropertyFunction get_numeric_property_function) { - DCHECK(!g_get_numeric_property_function); - g_get_numeric_property_function = get_numeric_property_function; +bool IsHeapProfilerRunning() { +#if defined(USE_TCMALLOC) + return ::IsHeapProfilerRunning(); +#endif + return false; } } // namespace allocator
diff --git a/base/allocator/allocator_extension.h b/base/allocator/allocator_extension.h index 3be2cea0..64bfd1cc 100644 --- a/base/allocator/allocator_extension.h +++ b/base/allocator/allocator_extension.h
@@ -13,9 +13,6 @@ namespace base { namespace allocator { -typedef void (*ReleaseFreeMemoryFunction)(); -typedef bool (*GetNumericPropertyFunction)(const char* name, size_t* value); - // Request that the allocator release any free memory it knows about to the // system. BASE_EXPORT void ReleaseFreeMemory(); @@ -26,20 +23,7 @@ // |name| or |value| cannot be NULL BASE_EXPORT bool GetNumericProperty(const char* name, size_t* value); -// These settings allow specifying a callback used to implement the allocator -// extension functions. These are optional, but if set they must only be set -// once. These will typically called in an allocator-specific initialization -// routine. -// -// No threading promises are made. The caller is responsible for making sure -// these pointers are set before any other threads attempt to call the above -// functions. - -BASE_EXPORT void SetReleaseFreeMemoryFunction( - ReleaseFreeMemoryFunction release_free_memory_function); - -BASE_EXPORT void SetGetNumericPropertyFunction( - GetNumericPropertyFunction get_numeric_property_function); +BASE_EXPORT bool IsHeapProfilerRunning(); } // namespace allocator } // namespace base
diff --git a/base/base_unittests_apk.isolate b/base/base_unittests_apk.isolate index 425c7798..af43392 100644 --- a/base/base_unittests_apk.isolate +++ b/base/base_unittests_apk.isolate
@@ -9,6 +9,7 @@ 'variables': { 'command': [ '<(PRODUCT_DIR)/bin/run_base_unittests', + '--logcat-output-dir', '${ISOLATED_OUTDIR}/logcats', ], 'files': [ '../build/config/',
diff --git a/base/debug/OWNERS b/base/debug/OWNERS deleted file mode 100644 index 4976ab1..0000000 --- a/base/debug/OWNERS +++ /dev/null
@@ -1,3 +0,0 @@ -per-file trace_event*=nduca@chromium.org -per-file trace_event*=dsinclair@chromium.org -per-file trace_event_android.cc=wangxianzhu@chromium.org
diff --git a/base/debug/profiler.cc b/base/debug/profiler.cc index 75e9aac0..a205d1f8 100644 --- a/base/debug/profiler.cc +++ b/base/debug/profiler.cc
@@ -56,6 +56,10 @@ ProfilerRegisterThread(); } +bool IsProfilingSupported() { + return true; +} + #else void StartProfiling(const std::string& name) { @@ -74,6 +78,10 @@ void RestartProfilingAfterFork() { } +bool IsProfilingSupported() { + return false; +} + #endif #if !defined(OS_WIN)
diff --git a/base/debug/profiler.h b/base/debug/profiler.h index 7cce7b0..ea81b13 100644 --- a/base/debug/profiler.h +++ b/base/debug/profiler.h
@@ -38,6 +38,9 @@ // Returns true iff this executable is instrumented with the Syzygy profiler. BASE_EXPORT bool IsBinaryInstrumented(); +// Returns true iff this executable supports profiling. +BASE_EXPORT bool IsProfilingSupported(); + // There's a class of profilers that use "return address swizzling" to get a // hook on function exits. This class of profilers uses some form of entry hook, // like e.g. binary instrumentation, or a compiler flag, that calls a hook each
diff --git a/base/process/memory_linux.cc b/base/process/memory_linux.cc index 6cdc2ca4..b5c96408 100644 --- a/base/process/memory_linux.cc +++ b/base/process/memory_linux.cc
@@ -16,19 +16,7 @@ #include "build/build_config.h" #if defined(USE_TCMALLOC) -// Used by UncheckedMalloc. If tcmalloc is linked to the executable -// this will be replaced by a strong symbol that actually implement -// the semantics and don't call new handler in case the allocation fails. -extern "C" { - -__attribute__((weak, visibility("default"))) -void* tc_malloc_skip_new_handler_weak(size_t size); - -void* tc_malloc_skip_new_handler_weak(size_t size) { - return malloc(size); -} - -} +#include "third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h" #endif namespace base { @@ -162,6 +150,10 @@ // If we're using glibc's allocator, the above functions will override // malloc and friends and make them die on out of memory. #endif +#if defined(USE_TCMALLOC) + // For tcmalloc, we need to tell it to behave like new. + tc_set_new_mode(1); +#endif } // NOTE: This is not the only version of this function in the source: @@ -208,7 +200,7 @@ #elif defined(LIBC_GLIBC) && !defined(USE_TCMALLOC) *result = __libc_malloc(size); #elif defined(USE_TCMALLOC) - *result = tc_malloc_skip_new_handler_weak(size); + *result = tc_malloc_skip_new_handler(size); #endif return *result != NULL; }
diff --git a/base/test/test_suite.cc b/base/test/test_suite.cc index 34e8e11..82510a20 100644 --- a/base/test/test_suite.cc +++ b/base/test/test_suite.cc
@@ -40,10 +40,7 @@ #endif // OS_IOS #endif // OS_MACOSX -#if defined(OS_WIN) -#include "base/debug/close_handle_hook_win.h" -#include "base/win/windows_version.h" -#else +#if !defined(OS_WIN) #include "base/i18n/rtl.h" #if !defined(OS_IOS) #include "base/strings/string_util.h" @@ -320,14 +317,6 @@ CHECK(debug::EnableInProcessStackDumping()); #if defined(OS_WIN) -#if defined(_DEBUG) - // Handle hooks cause shutdown asserts in Debug on Windows 7. crbug.com/571304 - if (base::win::GetVersion() >= base::win::VERSION_WIN8) - base::debug::InstallHandleHooks(); -#else - base::debug::InstallHandleHooks(); -#endif - RouteStdioToConsole(true); // Make sure we run with high resolution timer to minimize differences // between production code and test code.
diff --git a/base/trace_event/trace_log.cc b/base/trace_event/trace_log.cc index c2d4b28..5dc38bfc 100644 --- a/base/trace_event/trace_log.cc +++ b/base/trace_event/trace_log.cc
@@ -1329,13 +1329,17 @@ } } - if (base::trace_event::AllocationContextTracker::capture_enabled()) { - if (phase == TRACE_EVENT_PHASE_BEGIN || phase == TRACE_EVENT_PHASE_COMPLETE) - base::trace_event::AllocationContextTracker::PushPseudoStackFrame(name); - else if (phase == TRACE_EVENT_PHASE_END) - // The pop for |TRACE_EVENT_PHASE_COMPLETE| events - // is in |TraceLog::UpdateTraceEventDuration|. - base::trace_event::AllocationContextTracker::PopPseudoStackFrame(name); + // TODO(primiano): Add support for events with copied name crbug.com/581078 + if (!(flags & TRACE_EVENT_FLAG_COPY)) { + if (AllocationContextTracker::capture_enabled()) { + if (phase == TRACE_EVENT_PHASE_BEGIN || + phase == TRACE_EVENT_PHASE_COMPLETE) + AllocationContextTracker::PushPseudoStackFrame(name); + else if (phase == TRACE_EVENT_PHASE_END) + // The pop for |TRACE_EVENT_PHASE_COMPLETE| events + // is in |TraceLog::UpdateTraceEventDuration|. + AllocationContextTracker::PopPseudoStackFrame(name); + } } return handle;
diff --git a/base/version.cc b/base/version.cc index 3677b731..19b9922 100644 --- a/base/version.cc +++ b/base/version.cc
@@ -33,8 +33,6 @@ if (StartsWith(*it, "+", CompareCase::SENSITIVE)) return false; - // TODO(brettw) when we have a StringPiece version of StringToUint, delete - // this string conversion. unsigned int num; if (!StringToUint(*it, &num)) return false; @@ -107,13 +105,6 @@ return version.IsValid(); } -bool Version::IsOlderThan(const std::string& version_str) const { - Version proposed_ver(version_str); - if (!proposed_ver.IsValid()) - return false; - return (CompareTo(proposed_ver) < 0); -} - int Version::CompareToWildcardString(const std::string& wildcard_string) const { DCHECK(IsValid()); DCHECK(Version::IsValidWildcardString(wildcard_string)); @@ -151,12 +142,6 @@ return 0; } -bool Version::Equals(const Version& that) const { - DCHECK(IsValid()); - DCHECK(that.IsValid()); - return (CompareTo(that) == 0); -} - int Version::CompareTo(const Version& other) const { DCHECK(IsValid()); DCHECK(other.IsValid()); @@ -175,4 +160,32 @@ return version_str; } +bool operator==(const Version& v1, const Version& v2) { + return v1.CompareTo(v2) == 0; +} + +bool operator!=(const Version& v1, const Version& v2) { + return !(v1 == v2); +} + +bool operator<(const Version& v1, const Version& v2) { + return v1.CompareTo(v2) < 0; +} + +bool operator<=(const Version& v1, const Version& v2) { + return v1.CompareTo(v2) <= 0; +} + +bool operator>(const Version& v1, const Version& v2) { + return v1.CompareTo(v2) > 0; +} + +bool operator>=(const Version& v1, const Version& v2) { + return v1.CompareTo(v2) >= 0; +} + +std::ostream& operator<<(std::ostream& stream, const Version& v) { + return stream << v.GetString(); +} + } // namespace base
diff --git a/base/version.h b/base/version.h index 85c99a35..30cb735 100644 --- a/base/version.h +++ b/base/version.h
@@ -6,6 +6,8 @@ #define BASE_VERSION_H_ #include <stdint.h> + +#include <iosfwd> #include <string> #include <vector> @@ -37,14 +39,6 @@ // Version behavior (IsValid) if no wildcard is present. static bool IsValidWildcardString(const std::string& wildcard_string); - // Commonly used pattern. Given a valid version object, compare if a - // |version_str| results in a newer version. Returns true if the - // string represents valid version and if the version is greater than - // than the version of this object. - bool IsOlderThan(const std::string& version_str) const; - - bool Equals(const Version& other) const; - // Returns -1, 0, 1 for <, ==, >. int CompareTo(const Version& other) const; @@ -63,6 +57,14 @@ std::vector<uint32_t> components_; }; +BASE_EXPORT bool operator==(const Version& v1, const Version& v2); +BASE_EXPORT bool operator!=(const Version& v1, const Version& v2); +BASE_EXPORT bool operator<(const Version& v1, const Version& v2); +BASE_EXPORT bool operator<=(const Version& v1, const Version& v2); +BASE_EXPORT bool operator>(const Version& v1, const Version& v2); +BASE_EXPORT bool operator>=(const Version& v1, const Version& v2); +BASE_EXPORT std::ostream& operator<<(std::ostream& stream, const Version& v); + } // namespace base // TODO(xhwang) remove this when all users are updated to explicitly use the
diff --git a/base/version_unittest.cc b/base/version_unittest.cc index bef96f4a..5d9ea997 100644 --- a/base/version_unittest.cc +++ b/base/version_unittest.cc
@@ -26,9 +26,9 @@ Version v2(v1); v3 = v2; EXPECT_TRUE(v2.IsValid()); - EXPECT_TRUE(v1.Equals(v2)); + EXPECT_EQ(v1, v2); } - EXPECT_TRUE(v3.Equals(v1)); + EXPECT_EQ(v3, v1); } TEST(VersionTest, GetVersionFromString) { @@ -101,7 +101,33 @@ EXPECT_EQ(lhs.CompareTo(rhs), cases[i].expected) << cases[i].lhs << " ? " << cases[i].rhs; - EXPECT_EQ(lhs.IsOlderThan(cases[i].rhs), (cases[i].expected == -1)); + // Test comparison operators + switch (cases[i].expected) { + case -1: + EXPECT_LT(lhs, rhs); + EXPECT_LE(lhs, rhs); + EXPECT_NE(lhs, rhs); + EXPECT_FALSE(lhs == rhs); + EXPECT_FALSE(lhs >= rhs); + EXPECT_FALSE(lhs > rhs); + break; + case 0: + EXPECT_FALSE(lhs < rhs); + EXPECT_LE(lhs, rhs); + EXPECT_FALSE(lhs != rhs); + EXPECT_EQ(lhs, rhs); + EXPECT_GE(lhs, rhs); + EXPECT_FALSE(lhs > rhs); + break; + case 1: + EXPECT_FALSE(lhs < rhs); + EXPECT_FALSE(lhs <= rhs); + EXPECT_NE(lhs, rhs); + EXPECT_FALSE(lhs == rhs); + EXPECT_GE(lhs, rhs); + EXPECT_GT(lhs, rhs); + break; + } } }
diff --git a/base/win/scoped_handle.cc b/base/win/scoped_handle.cc index debe2237..9c21603 100644 --- a/base/win/scoped_handle.cc +++ b/base/win/scoped_handle.cc
@@ -44,7 +44,7 @@ bool CloseHandleWrapper(HANDLE handle) { if (!::CloseHandle(handle)) - LOG(FATAL) << "CloseHandle failed."; + CHECK(false); return true; } @@ -166,7 +166,7 @@ if (!result.second) { Info other = result.first->second; base::debug::Alias(&other); - LOG(FATAL) << "Attempt to start tracking already tracked handle."; + CHECK(false); } } @@ -178,12 +178,12 @@ AutoNativeLock lock(*lock_); HandleMap::iterator i = map_.find(handle); if (i == map_.end()) - LOG(FATAL) << "Attempting to close an untracked handle."; + CHECK(false); Info other = i->second; if (other.owner != owner) { base::debug::Alias(&other); - LOG(FATAL) << "Attempting to close a handle not owned by opener."; + CHECK(false); } map_.erase(i); @@ -207,7 +207,7 @@ Info other = i->second; base::debug::Alias(&other); - LOG(FATAL) << "CloseHandle called on tracked handle."; + CHECK(false); } } // namespace
diff --git a/base/win/scoped_handle.h b/base/win/scoped_handle.h index ac01485..404ab669 100644 --- a/base/win/scoped_handle.h +++ b/base/win/scoped_handle.h
@@ -8,7 +8,6 @@ #include <windows.h> #include "base/base_export.h" -#include "base/gtest_prod_util.h" #include "base/location.h" #include "base/logging.h" #include "base/macros.h" @@ -109,8 +108,6 @@ } private: - FRIEND_TEST_ALL_PREFIXES(ScopedHandleTest, ActiveVerifierWrongOwner); - FRIEND_TEST_ALL_PREFIXES(ScopedHandleTest, ActiveVerifierUntrackedHandle); Handle handle_; };
diff --git a/base/win/scoped_handle_unittest.cc b/base/win/scoped_handle_unittest.cc index 0407351..b573b66 100644 --- a/base/win/scoped_handle_unittest.cc +++ b/base/win/scoped_handle_unittest.cc
@@ -2,17 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <windows.h> -#include <winternl.h> - #include "base/win/scoped_handle.h" -#include "base/win/windows_version.h" #include "testing/gtest/include/gtest/gtest.h" -namespace base { -namespace win { - TEST(ScopedHandleTest, ScopedHandle) { // Any illegal error code will do. We just need to test that it is preserved // by ScopedHandle to avoid bug 528394. @@ -37,72 +30,3 @@ handle_holder = handle_source.Pass(); EXPECT_EQ(magic_error, ::GetLastError()); } - -TEST(ScopedHandleTest, ActiveVerifierCloseTracked) { -#if defined(_DEBUG) - // Handle hooks cause shutdown asserts in Debug on Windows 7. crbug.com/571304 - if (base::win::GetVersion() < base::win::VERSION_WIN8) - return; -#endif - HANDLE handle = ::CreateMutex(nullptr, FALSE, nullptr); - ASSERT_NE(HANDLE(NULL), handle); - ASSERT_DEATH({ - base::win::ScopedHandle handle_holder(handle); - // Calling CloseHandle on a tracked handle should crash. - ::CloseHandle(handle); - }, "CloseHandle called on tracked handle."); -} - -TEST(ScopedHandleTest, ActiveVerifierTrackedHasBeenClosed) { - HANDLE handle = ::CreateMutex(nullptr, FALSE, nullptr); - ASSERT_NE(HANDLE(NULL), handle); - typedef NTSTATUS(WINAPI * NtCloseFunc)(HANDLE); - NtCloseFunc ntclose = reinterpret_cast<NtCloseFunc>( - GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtClose")); - ASSERT_NE(nullptr, ntclose); - - ASSERT_DEATH({ - base::win::ScopedHandle handle_holder(handle); - ntclose(handle); - // Destructing a ScopedHandle with an illegally closed handle should fail. - }, "CloseHandle failed."); -} - -TEST(ScopedHandleTest, ActiveVerifierDoubleTracking) { - HANDLE handle = ::CreateMutex(nullptr, FALSE, nullptr); - ASSERT_NE(HANDLE(NULL), handle); - - base::win::ScopedHandle handle_holder(handle); - - ASSERT_DEATH({ - base::win::ScopedHandle handle_holder2(handle); - }, "Attempt to start tracking already tracked handle."); -} - -TEST(ScopedHandleTest, ActiveVerifierWrongOwner) { - HANDLE handle = ::CreateMutex(nullptr, FALSE, nullptr); - ASSERT_NE(HANDLE(NULL), handle); - - base::win::ScopedHandle handle_holder(handle); - ASSERT_DEATH({ - base::win::ScopedHandle handle_holder2; - handle_holder2.handle_ = handle; - }, "Attempting to close a handle not owned by opener."); - ASSERT_TRUE(handle_holder.IsValid()); - handle_holder.Close(); -} - -TEST(ScopedHandleTest, ActiveVerifierUntrackedHandle) { - HANDLE handle = ::CreateMutex(nullptr, FALSE, nullptr); - ASSERT_NE(HANDLE(NULL), handle); - - ASSERT_DEATH({ - base::win::ScopedHandle handle_holder; - handle_holder.handle_ = handle; - }, "Attempting to close an untracked handle."); - - ASSERT_TRUE(::CloseHandle(handle)); -} - -} // namespace win -} // namespace base
diff --git a/base/win/win_util.cc b/base/win/win_util.cc index 57bee8a..05250f1 100644 --- a/base/win/win_util.cc +++ b/base/win/win_util.cc
@@ -556,25 +556,6 @@ g_domain_state = state ? ENROLLED : NOT_ENROLLED; } -bool MaybeHasSHA256Support() { - const OSInfo* os_info = OSInfo::GetInstance(); - - if (os_info->version() == VERSION_PRE_XP) - return false; // Too old to have it and this OS is not supported anyway. - - if (os_info->version() == VERSION_XP) - return os_info->service_pack().major >= 3; // Windows XP SP3 has it. - - // Assume it is missing in this case, although it may not be. This category - // includes Windows XP x64, and Windows Server, where a hotfix could be - // deployed. - if (os_info->version() == VERSION_SERVER_2003) - return false; - - DCHECK(os_info->version() >= VERSION_VISTA); - return true; // New enough to have SHA-256 support. -} - bool IsUser32AndGdi32Available() { static base::LazyInstance<LazyIsUser32AndGdi32Available>::Leaky available = LAZY_INSTANCE_INITIALIZER;
diff --git a/base/win/win_util.h b/base/win/win_util.h index 6162b51..1d22ad9 100644 --- a/base/win/win_util.h +++ b/base/win/win_util.h
@@ -159,13 +159,6 @@ // simulate being in a domain and false otherwise. BASE_EXPORT void SetDomainStateForTesting(bool state); -// Returns true if the current operating system has support for SHA-256 -// certificates. As its name indicates, this function provides a best-effort -// answer, which is solely based on comparing version numbers. The function -// may be re-implemented in the future to return a reliable value, based on -// run-time detection of this capability. -BASE_EXPORT bool MaybeHasSHA256Support(); - // Returns true if the current process can make USER32 or GDI32 calls such as // CreateWindow and CreateDC. Windows 8 and above allow the kernel component // of these calls to be disabled which can cause undefined behaviour such as
diff --git a/build/all.gyp b/build/all.gyp index 59590851..7791013 100644 --- a/build/all.gyp +++ b/build/all.gyp
@@ -864,6 +864,7 @@ '../sync/sync.gyp:sync_unit_tests_apk', '../tools/android/heap_profiler/heap_profiler.gyp:heap_profiler_unittests_apk', '../ui/android/ui_android.gyp:ui_android_unittests_apk', + '../ui/android/ui_android.gyp:ui_junit_tests', '../ui/base/ui_base_tests.gyp:ui_base_unittests_apk', '../ui/events/events_unittests.gyp:events_unittests_apk', '../ui/gfx/gfx_tests.gyp:gfx_unittests_apk',
diff --git a/build/android/adb_install_apk.py b/build/android/adb_install_apk.py index c6bd7c25..4bf5ad5 100755 --- a/build/android/adb_install_apk.py +++ b/build/android/adb_install_apk.py
@@ -63,6 +63,10 @@ help='Enable verbose logging.') parser.add_argument('--downgrade', action='store_true', help='If set, allows downgrading of apk.') + parser.add_argument('--timeout', type=int, + default=device_utils.DeviceUtils.INSTALL_DEFAULT_TIMEOUT, + help='Seconds to wait for APK installation. ' + '(default: %(default)s)') args = parser.parse_args() @@ -121,7 +125,8 @@ allow_downgrade=args.downgrade) else: device.Install(apk, reinstall=args.keep_data, - allow_downgrade=args.downgrade) + allow_downgrade=args.downgrade, + timeout=args.timeout) except device_errors.CommandFailedError: logging.exception('Failed to install %s', args.apk_name) if blacklist:
diff --git a/build/android/devil/android/forwarder.py b/build/android/devil/android/forwarder.py index 8794797..d3c2949 100644 --- a/build/android/devil/android/forwarder.py +++ b/build/android/devil/android/forwarder.py
@@ -9,6 +9,7 @@ import os import psutil +from devil import base_error from devil import devil_env from devil.android.constants import file_system from devil.android.valgrind_tools import base_tool @@ -40,6 +41,13 @@ os.close(self._fd) +class HostForwarderError(base_error.BaseError): + """Exception for failures involving host_forwarder.""" + + def __init__(self, message): + super(HostForwarderError, self).__init__(message) + + class Forwarder(object): """Thread-safe class to manage port forwards from the device to the host.""" @@ -90,8 +98,9 @@ [instance._host_forwarder_path] + redirection_command) except OSError as e: if e.errno == 2: - raise Exception('Unable to start host forwarder. Make sure you have' - ' built host_forwarder.') + raise HostForwarderError( + 'Unable to start host forwarder. ' + 'Make sure you have built host_forwarder.') else: raise if exit_code != 0: Forwarder._KillDeviceLocked(device, tool) @@ -101,12 +110,14 @@ for line in ps_out: if 'device_forwarder' in line: logging.info(' %s', line) - raise Exception('%s exited with %d:\n%s' % ( - instance._host_forwarder_path, exit_code, '\n'.join(output))) + raise HostForwarderError( + '%s exited with %d:\n%s' % (instance._host_forwarder_path, + exit_code, '\n'.join(output))) tokens = output.split(':') if len(tokens) != 2: - raise Exception('Unexpected host forwarder output "%s", ' - 'expected "device_port:host_port"' % output) + raise HostForwarderError( + 'Unexpected host forwarder output "%s", ' + 'expected "device_port:host_port"' % output) device_port = int(tokens[0]) host_port = int(tokens[1]) serial_with_port = (device_serial, device_port) @@ -305,8 +316,9 @@ (exit_code, output) = cmd_helper.GetCmdStatusAndOutput( ['pkill', '-9', 'host_forwarder']) if exit_code != 0: - raise Exception('%s exited with %d:\n%s' % ( - self._host_forwarder_path, exit_code, '\n'.join(output))) + raise HostForwarderError( + '%s exited with %d:\n%s' % (self._host_forwarder_path, exit_code, + '\n'.join(output))) @staticmethod def _KillDeviceLocked(device, tool):
diff --git a/build/android/devil/utils/lsusb.py b/build/android/devil/utils/lsusb.py index 37bf4f2..6a6213e 100644 --- a/build/android/devil/utils/lsusb.py +++ b/build/android/devil/utils/lsusb.py
@@ -17,7 +17,7 @@ def _lsusbv_on_device(bus_id, dev_id): """Calls lsusb -v on device.""" _, raw_output = cmd_helper.GetCmdStatusAndOutputWithTimeout( - ['lsusb', '-v', '-s', '%s:%s' % (bus_id, dev_id)], timeout=2) + ['lsusb', '-v', '-s', '%s:%s' % (bus_id, dev_id)], timeout=10) device = {'bus': bus_id, 'device': dev_id} depth_stack = [device] @@ -80,14 +80,19 @@ def lsusb(): """Call lsusb and return the parsed output.""" _, lsusb_list_output = cmd_helper.GetCmdStatusAndOutputWithTimeout( - ['lsusb'], timeout=2) + ['lsusb'], timeout=10) devices = [] for line in lsusb_list_output.splitlines(): m = _LSUSB_BUS_DEVICE_RE.match(line) if m: bus_num = m.group(1) dev_num = m.group(2) - devices.append(_lsusbv_on_device(bus_num, dev_num)) + try: + devices.append(_lsusbv_on_device(bus_num, dev_num)) + except cmd_helper.TimeoutError: + # Will be blacklisted if it is in expected device file, but times out. + logging.info('lsusb -v %s:%s timed out.', bus_num, dev_num) + return devices def get_lsusb_serial(device):
diff --git a/build/android/gyp/apkbuilder.py b/build/android/gyp/apkbuilder.py index 8278b2c..ca320f9 100755 --- a/build/android/gyp/apkbuilder.py +++ b/build/android/gyp/apkbuilder.py
@@ -57,6 +57,9 @@ default='[]') parser.add_argument('--emma-device-jar', help='Path to emma_device.jar to include.') + parser.add_argument('--uncompress-shared-libraries', + action='store_true', + help='Uncompress shared libraries') options = parser.parse_args(args) options.assets = build_utils.ParseGypList(options.assets) options.uncompressed_assets = build_utils.ParseGypList( @@ -206,7 +209,16 @@ for path in native_libs: basename = os.path.basename(path) apk_path = 'lib/%s/%s' % (options.android_abi, basename) - build_utils.AddToZipHermetic(out_apk, apk_path, src_path=path) + + compress = None + if (options.uncompress_shared_libraries and + os.path.splitext(basename)[1] == '.so'): + compress = False + + build_utils.AddToZipHermetic(out_apk, + apk_path, + src_path=path, + compress=compress) for name in sorted(options.native_lib_placeholders): # Empty libs files are ignored by md5check, but rezip requires them
diff --git a/build/android/gyp/finalize_apk.py b/build/android/gyp/finalize_apk.py index a6a1040d..d71cb8f 100755 --- a/build/android/gyp/finalize_apk.py +++ b/build/android/gyp/finalize_apk.py
@@ -55,10 +55,17 @@ build_utils.CheckOutput(sign_cmd) -def AlignApk(zipalign_path, unaligned_path, final_path): +def AlignApk(zipalign_path, package_align, unaligned_path, final_path): align_cmd = [ zipalign_path, - '-f', '4', # 4 bytes + '-f' + ] + + if package_align: + align_cmd += ['-p'] + + align_cmd += [ + '4', # 4 bytes unaligned_path, final_path, ] @@ -74,6 +81,9 @@ parser.add_option('--rezip-apk-jar-path', help='Path to the RezipApk jar file.') parser.add_option('--zipalign-path', help='Path to the zipalign tool.') + parser.add_option('--page-align-shared-libraries', + action='store_true', + help='Page align shared libraries.') parser.add_option('--unsigned-apk-path', help='Path to input unsigned APK.') parser.add_option('--final-apk-path', help='Path to output signed and aligned APK.') @@ -100,6 +110,7 @@ options.load_library_from_zip, options.key_name, options.key_passwd, + options.page_align_shared_libraries, ] build_utils.CallAndWriteDepfileIfStale( @@ -140,7 +151,10 @@ options.rezip_apk_jar_path, signed_apk_path, options.final_apk_path) else: # Align uncompressed items to 4 bytes - AlignApk(options.zipalign_path, signed_apk_path, options.final_apk_path) + AlignApk(options.zipalign_path, + options.page_align_shared_libraries, + signed_apk_path, + options.final_apk_path) if __name__ == '__main__':
diff --git a/build/android/pylib/local/device/local_device_test_run.py b/build/android/pylib/local/device/local_device_test_run.py index 2a93c681..7387bb9 100644 --- a/build/android/pylib/local/device/local_device_test_run.py +++ b/build/android/pylib/local/device/local_device_test_run.py
@@ -6,6 +6,7 @@ import functools import logging +from devil import base_error from devil.android import device_errors from pylib import valgrind_tools from pylib.base import base_test_result @@ -38,12 +39,13 @@ def wrapper(dev, *args, **kwargs): try: return f(dev, *args, **kwargs) - except device_errors.CommandFailedError: - logging.exception('Shard failed: %s(%s)', f.__name__, str(dev)) except device_errors.CommandTimeoutError: logging.exception('Shard timed out: %s(%s)', f.__name__, str(dev)) except device_errors.DeviceUnreachableError: logging.exception('Shard died: %s(%s)', f.__name__, str(dev)) + except base_error.BaseError: + logging.exception('Shard failed: %s(%s)', f.__name__, + str(dev)) if on_failure: on_failure(dev, f.__name__) return None
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index 8ae340c..37da385 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni
@@ -764,6 +764,11 @@ _rebased_emma_device_jar = rebase_path(_emma_device_jar, root_build_dir) args += [ "--emma-device-jar=$_rebased_emma_device_jar" ] } + + if (defined(invoker.uncompress_shared_libraries) && + invoker.uncompress_shared_libraries) { + args += [ "--uncompress-shared-libraries" ] + } } } @@ -825,6 +830,11 @@ rebase_path(_rezip_jar_path, root_build_dir), ] } + + if (defined(invoker.page_align_shared_libraries) && + invoker.page_align_shared_libraries) { + args += [ "--page-align-shared-libraries" ] + } } } @@ -1061,6 +1071,7 @@ "emma_instrument", "native_lib_placeholders", "native_libs_filearg", + "uncompress_shared_libraries", "write_asset_list", ]) deps = _deps + [ ":${_package_resources_target_name}" ] @@ -1080,6 +1091,7 @@ [ "assets_build_config", "emma_instrument", + "uncompress_shared_libraries", ]) _dex_target = "//build/android/incremental_install:bootstrap_java__dex" deps = _incremental_deps + [ @@ -1107,6 +1119,8 @@ _finalize_apk_rule_name = "${target_name}__finalize" finalize_apk(_finalize_apk_rule_name) { + forward_variables_from(invoker, [ "page_align_shared_libraries" ]) + input_apk_path = _packaged_apk_path output_apk_path = _final_apk_path keystore_path = _keystore_path
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni index 1c65d215..f9bfd3d43 100644 --- a/build/config/android/rules.gni +++ b/build/config/android/rules.gni
@@ -1707,8 +1707,10 @@ "deps", "extensions_to_not_compress", "language_splits", + "page_align_shared_libraries", "public_deps", "shared_resources", + "uncompress_shared_libraries", "write_asset_list", ]) apk_path = _final_apk_path
diff --git a/build/gn_migration.gypi b/build/gn_migration.gypi index 4399879..99b543d 100644 --- a/build/gn_migration.gypi +++ b/build/gn_migration.gypi
@@ -87,7 +87,6 @@ '../third_party/leveldatabase/leveldatabase.gyp:env_chromium_unittests', '../third_party/libaddressinput/libaddressinput.gyp:libaddressinput_unittests', '../third_party/smhasher/smhasher.gyp:pmurhash', - '../tools/battor_agent/battor_agent.gyp:battor_agent', '../tools/telemetry/telemetry.gyp:bitmaptools#host', '../ui/accessibility/accessibility.gyp:accessibility_unittests', '../ui/base/ui_base_tests.gyp:ui_base_unittests', @@ -236,6 +235,7 @@ '../tools/imagediff/image_diff.gyp:image_diff#host', '../tools/telemetry/telemetry.gyp:bitmaptools#host', '../ui/android/ui_android.gyp:ui_android_unittests_apk', + '../ui/android/ui_android.gyp:ui_junit_tests', '../ui/base/ui_base_tests.gyp:ui_base_unittests_apk', '../ui/events/events_unittests.gyp:events_unittests_apk', '../ui/gfx/gfx_tests.gyp:gfx_unittests_apk', @@ -367,6 +367,7 @@ '../third_party/codesighs/codesighs.gyp:maptsvdifftool', '../third_party/pdfium/samples/samples.gyp:pdfium_diff', '../third_party/pdfium/samples/samples.gyp:pdfium_test', + '../tools/battor_agent/battor_agent.gyp:battor_agent', '../tools/gn/gn.gyp:gn', '../tools/gn/gn.gyp:gn_unittests', '../tools/perf/clear_system_cache/clear_system_cache.gyp:clear_system_cache',
diff --git a/build/symlink.py b/build/symlink.py index 75a3e4e..21b79b9 100755 --- a/build/symlink.py +++ b/build/symlink.py
@@ -28,6 +28,8 @@ t = os.path.join(target, os.path.basename(s)) if len(sources) == 1 and not os.path.isdir(target): t = target + if os.path.realpath(t) == s: + continue try: os.symlink(s, t) except OSError, e:
diff --git a/cc/tiles/image_decode_controller.cc b/cc/tiles/image_decode_controller.cc index 7c1cf364..ad499fd5 100644 --- a/cc/tiles/image_decode_controller.cc +++ b/cc/tiles/image_decode_controller.cc
@@ -318,8 +318,12 @@ decoded_info.minRowBytes()); // Now scale the pixels into the destination size. - SkImageInfo scaled_info = SkImageInfo::MakeN32Premul( - key.target_size().width(), key.target_size().height()); + // TODO(vmpstr): Once we support skipping images altogether, we can remove + // this and skip drawing images that are empty in size. crbug.com/581163 + const gfx::Size& target_size = + key.target_size().IsEmpty() ? gfx::Size(1, 1) : key.target_size(); + SkImageInfo scaled_info = + SkImageInfo::MakeN32Premul(target_size.width(), target_size.height()); scoped_ptr<base::DiscardableMemory> scaled_pixels; { TRACE_EVENT0(
diff --git a/chrome/VERSION b/chrome/VERSION index ad6aff3..cd6b6e51 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=50 MINOR=0 -BUILD=2631 +BUILD=2632 PATCH=0
diff --git a/chrome/android/chrome_sync_shell_test_apk.isolate b/chrome/android/chrome_sync_shell_test_apk.isolate index ea45408..6144c1c48 100644 --- a/chrome/android/chrome_sync_shell_test_apk.isolate +++ b/chrome/android/chrome_sync_shell_test_apk.isolate
@@ -11,6 +11,7 @@ '--enable-platform-mode', '-e', 'local', '--apk-under-test', '<(PRODUCT_DIR)/apks/ChromeSyncShell.apk', + '--logcat-output-dir', '${ISOLATED_OUTDIR}/logcats', ], 'files': [ '../../third_party/proguard/',
diff --git a/chrome/android/java/res/layout/account_chooser_dialog_title.xml b/chrome/android/java/res/layout/account_chooser_dialog_title.xml index 3ce791e..6009aa2 100644 --- a/chrome/android/java/res/layout/account_chooser_dialog_title.xml +++ b/chrome/android/java/res/layout/account_chooser_dialog_title.xml
@@ -15,4 +15,11 @@ android:layout_height="wrap_content" android:ellipsize="end" android:textAppearance="?android:attr/textAppearanceLarge"/> + <TextView + android:id="@+id/origin" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ellipsize="end" + android:textAppearance="@style/TextAppearance.AppCompat.Small"/> + </LinearLayout>
diff --git a/chrome/android/java/res/layout/eb_row_content.xml b/chrome/android/java/res/layout/eb_row_content.xml index 4e421f9d..cd7fc36e 100644 --- a/chrome/android/java/res/layout/eb_row_content.xml +++ b/chrome/android/java/res/layout/eb_row_content.xml
@@ -26,6 +26,7 @@ android:layout_width="0dp" android:layout_height="48dp" android:layout_weight="1" + android:gravity="center_vertical" android:orientation="vertical" > <TextView
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelAnimation.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelAnimation.java index fe46eaf..d7e4b718 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelAnimation.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelAnimation.java
@@ -235,7 +235,7 @@ // Calculate the nearest state from the current position, and then calculate the duration // of the animation that will start with a desired initial velocity and move the desired // amount of dps (displacement). - final PanelState nearestState = findNearestPanelStateFromHeight(getHeight()); + final PanelState nearestState = findNearestPanelStateFromHeight(getHeight(), 0.0f); final float displacement = getPanelHeightFromState(nearestState) - getHeight(); final long duration = calculateAnimationDuration( INITIAL_ANIMATION_VELOCITY_DP_PER_SECOND, displacement); @@ -254,7 +254,7 @@ // Calculate the projected state the Panel will be at the end of the fling movement and the // duration of the animation given the current velocity and the projected displacement. - PanelState projectedState = findNearestPanelStateFromHeight(projectedHeight); + PanelState projectedState = findNearestPanelStateFromHeight(projectedHeight, velocity); // Prevent the fling gesture from moving the Panel from PEEKED to MAXIMIZED if the Panel // Promo is available and we are running in full screen panel mode. This is to make sure
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java index 00935d5..3e562d3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java
@@ -774,10 +774,20 @@ } /** + * @return If the the panel supports an EXPANDED state rather than just PEEKING or MAXIMIZED. + */ + public boolean supportsExpandedState() { + return true; + } + + /** * @return The {@code PanelState} that is before the |state| in the order of states. */ public PanelState getPreviousPanelState(PanelState state) { PanelState prevState = PREVIOUS_STATES.get(state); + if (prevState == PanelState.EXPANDED && !supportsExpandedState()) { + prevState = PREVIOUS_STATES.get(prevState); + } return prevState != null ? prevState : PanelState.UNDEFINED; } @@ -807,6 +817,8 @@ * @return whether the state is valid. */ public boolean isValidState(PanelState state) { + // EXPANDED is not a valid state if a panel implementation doesn't support it. + if (!supportsExpandedState() && state == PanelState.EXPANDED) return false; // MAXIMIZED is not the previous state of anything, but it's a valid state. return PREVIOUS_STATES.values().contains(state) || state == PanelState.MAXIMIZED; } @@ -876,32 +888,53 @@ } /** + * @return The fraction of the distance the panel has to be to its next state before animating + * itself there. Default is the panel must be half of the way to the next state. + */ + protected float getThresholdToNextState() { + return 0.5f; + } + + /** * Finds the state which has the nearest height compared to a given * |desiredPanelHeight|. * * @param desiredPanelHeight The height to compare to. + * @param velocity The velocity of the swipe if applicable. The swipe is upward if less than 0. * @return The nearest panel state. */ - protected PanelState findNearestPanelStateFromHeight(float desiredPanelHeight) { - PanelState closestPanelState = PanelState.CLOSED; - float smallestHeightDiff = Float.POSITIVE_INFINITY; + protected PanelState findNearestPanelStateFromHeight(float desiredPanelHeight, float velocity) { + // If the panel was flung hard enough to make the desired height negative, it's closed. + if (desiredPanelHeight < 0) return PanelState.CLOSED; - // Iterate over all states and find the one which has the nearest - // height. + // First, find the two states that the desired panel height is between. + PanelState nextState = PanelState.values()[0]; + PanelState prevState = nextState; for (PanelState state : PanelState.values()) { if (!isValidState(state)) { continue; } - - float height = getPanelHeightFromState(state); - float heightDiff = Math.abs(desiredPanelHeight - height); - if (heightDiff < smallestHeightDiff) { - closestPanelState = state; - smallestHeightDiff = heightDiff; + prevState = nextState; + nextState = state; + // The values in PanelState are ascending, they should be kept that way in order for + // this to work. + if (desiredPanelHeight >= getPanelHeightFromState(prevState) + && desiredPanelHeight < getPanelHeightFromState(nextState)) { + break; } } - return closestPanelState; + // If the desired height is close enough to a certain state, depending on the direction of + // the velocity, move to that state. + float lowerBound = getPanelHeightFromState(prevState); + float distance = getPanelHeightFromState(nextState) - lowerBound; + float thresholdToNextState = velocity < 0.0f + ? getThresholdToNextState() : 1.0f - getThresholdToNextState(); + if ((desiredPanelHeight - lowerBound) / distance > thresholdToNextState) { + return nextState; + } else { + return prevState; + } } /** @@ -1143,21 +1176,27 @@ updatePromoVisibility(1.f - percentage); // Base page offset. - mBasePageY = getBasePageTargetY(); + float startTargetY = supportsExpandedState() ? getBasePageTargetY() : 0.0f; + mBasePageY = MathUtils.interpolate( + startTargetY, + getBasePageTargetY(), + percentage); // Base page brightness. - float brightness = MathUtils.interpolate( - BASE_PAGE_BRIGHTNESS_STATE_EXPANDED, + float startBrightness = supportsExpandedState() + ? BASE_PAGE_BRIGHTNESS_STATE_EXPANDED : BASE_PAGE_BRIGHTNESS_STATE_PEEKED; + mBasePageBrightness = MathUtils.interpolate( + startBrightness, BASE_PAGE_BRIGHTNESS_STATE_MAXIMIZED, percentage); - mBasePageBrightness = brightness; // Bar height. - float barHeight = Math.round(MathUtils.interpolate( - getBarHeightExpanded(), + float startBarHeight = supportsExpandedState() + ? getBarHeightExpanded() : getBarHeightPeeking(); + mBarHeight = Math.round(MathUtils.interpolate( + startBarHeight, getBarHeightMaximized(), percentage)); - mBarHeight = barHeight; // Bar border. mIsBarBorderVisible = true;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModePanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModePanel.java index 616a431..226f2a34 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModePanel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModePanel.java
@@ -206,6 +206,16 @@ } @Override + public boolean supportsExpandedState() { + return false; + } + + @Override + protected float getThresholdToNextState() { + return 0.30f; + } + + @Override protected void updatePanelForCloseOrPeek(float percent) { super.updatePanelForCloseOrPeek(percent); @@ -217,41 +227,27 @@ } @Override - protected void updatePanelForExpansion(float percent) { - super.updatePanelForExpansion(percent); + protected void updatePanelForMaximization(float percent) { + super.updatePanelForMaximization(percent); if (percent < 0.5f) { mReaderBarTextOpacity = 1.0f - 2.0f * percent; getReaderModeBarControl().setBarText(R.string.reader_view_text); } else { mReaderBarTextOpacity = 2.0f * (percent - 0.5f); - getReaderModeBarControl().setBarText(R.string.reader_mode_expanded_title); + getReaderModeBarControl().setBarText(R.string.reader_mode_maximized_title); } } @Override - protected void updatePanelForMaximization(float percent) { - super.updatePanelForMaximization(percent); - getReaderModeBarControl().setBarText(R.string.reader_mode_expanded_title); - mReaderBarTextOpacity = 1.0f; - } - - @Override protected void maximizePanel(StateChangeReason reason) { - long duration = BASE_ANIMATION_DURATION_MS; - // Extend animation time when animating from PEEKED state to MAXIMIZED. - // TODO(mdjones): This check will be unnecessary after the expanded state is removed. - if (getPanelState() == PanelState.PEEKED) { - duration += 150; - } - - super.animatePanelToState(PanelState.MAXIMIZED, reason, duration); + // Extend animation time by 150ms. + super.animatePanelToState(PanelState.MAXIMIZED, reason, BASE_ANIMATION_DURATION_MS + 150); } @Override protected void onAnimationFinished() { super.onAnimationFinished(); - boolean animatingToOpenState = getPanelState() == PanelState.EXPANDED - || getPanelState() == PanelState.MAXIMIZED; + boolean animatingToOpenState = getPanelState() == PanelState.MAXIMIZED; // Start or stop the timer for how long the user has been reading. if (!mTimerRunning && animatingToOpenState) { mStartTime = System.currentTimeMillis();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java index bd2ec024..3e52aa6f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
@@ -41,7 +41,6 @@ // Members used only for testing purposes. private boolean mDidOverrideDecidedStateForTesting; private boolean mDecidedStateForTesting; - private boolean mDidResetCounters; private Integer mTapTriggeredPromoLimitForTesting; private Integer mTapResolveLimitForDecided; private Integer mTapPrefetchLimitForDecided; @@ -388,17 +387,6 @@ // -------------------------------------------------------------------------------------------- /** - * Resets all policy counters. - */ - @VisibleForTesting - void resetCounters() { - updateCountersForOpen(); - - mPreferenceManager.setContextualSearchPromoOpenCount(0); - mDidResetCounters = true; - } - - /** * Overrides the decided/undecided state for the user preference. * @param decidedState Whether the user has decided or not. */ @@ -409,14 +397,6 @@ } /** - * @return Whether counters have been reset yet (by resetCounters) or not. - */ - @VisibleForTesting - boolean didResetCounters() { - return mDidResetCounters; - } - - /** * @return count of times the panel with the promo has been opened. */ @VisibleForTesting @@ -432,6 +412,10 @@ return mPreferenceManager.getContextualSearchTapCount(); } + // -------------------------------------------------------------------------------------------- + // Translation support. + // -------------------------------------------------------------------------------------------- + /** * Determines whether translation is needed between the given languages. * @param sourceLanguage The source language code; language we're translating from.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/document/IncognitoNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/document/IncognitoNotificationManager.java index bebfae3..cb22ffec 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/document/IncognitoNotificationManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/document/IncognitoNotificationManager.java
@@ -37,6 +37,7 @@ .setOngoing(true) .setVisibility(Notification.VISIBILITY_SECRET) .setSmallIcon(R.drawable.incognito_statusbar) + .setShowWhen(false) .setLocalOnly(true); NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkBookmarkRow.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkBookmarkRow.java index 1b0a612..5011497 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkBookmarkRow.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkBookmarkRow.java
@@ -99,12 +99,12 @@ TextView textView = (TextView) findViewById(R.id.offline_page_size); View bookmarkRowView = findViewById(R.id.bookmark_row); if (offlinePage != null) { - int bottomPadding = textView.getResources().getDimensionPixelSize( + int verticalPadding = textView.getResources().getDimensionPixelSize( R.dimen.offline_page_item_vertical_spacing); textView.setText(Formatter.formatFileSize(getContext(), offlinePage.getFileSize())); // Get the embedded bookmark_row layout, and add padding. This is because the entries // in filter view are larger (contain more items) than normal bookmark view. - bookmarkRowView.setPadding(0, 0, 0, bottomPadding); + bookmarkRowView.setPadding(0, verticalPadding / 2, 0, verticalPadding / 2); textView.setVisibility(View.VISIBLE); } else { textView.setVisibility(View.GONE);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java index a925f57..d436748a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java
@@ -51,7 +51,7 @@ VISIT, } - private EnhancedBookmarksModel mEnhancedBookmarksModel; + private EnhancedBookmarksModel mModel; private BookmarkId mBookmarkId; private EmptyAlertEditText mTitleEditText; private EmptyAlertEditText mUrlEditText; @@ -76,7 +76,7 @@ @Override public void bookmarkNodeMoved(BookmarkItem oldParent, int oldIndex, BookmarkItem newParent, int newIndex) { - BookmarkId movedBookmark = mEnhancedBookmarksModel.getChildAt(newParent.getId(), + BookmarkId movedBookmark = mModel.getChildAt(newParent.getId(), newIndex); if (movedBookmark.equals(mBookmarkId)) { mFolderTextView.setText(newParent.getTitle()); @@ -86,14 +86,14 @@ @Override public void bookmarkNodeChanged(BookmarkItem node) { if (mBookmarkId.equals(node.getId()) || node.getId().equals( - mEnhancedBookmarksModel.getBookmarkById(mBookmarkId).getParentId())) { + mModel.getBookmarkById(mBookmarkId).getParentId())) { updateViewContent(); } } @Override public void bookmarkModelChanged() { - if (mEnhancedBookmarksModel.doesBookmarkExist(mBookmarkId)) { + if (mModel.doesBookmarkExist(mBookmarkId)) { updateViewContent(); } else { Log.wtf(TAG, "The bookmark was deleted somehow during bookmarkModelChange!", @@ -110,11 +110,15 @@ int title = OfflinePageUtils.getStringId(R.string.edit_bookmark); setTitle(title); EnhancedBookmarkUtils.setTaskDescriptionInDocumentMode(this, getString(title)); - mEnhancedBookmarksModel = new EnhancedBookmarksModel(); + mModel = new EnhancedBookmarksModel(); mBookmarkId = BookmarkId.getBookmarkIdFromString( getIntent().getStringExtra(INTENT_BOOKMARK_ID)); - mEnhancedBookmarksModel.addObserver(mBookmarkModelObserver); - assert mEnhancedBookmarksModel.getBookmarkById(mBookmarkId).isEditable(); + mModel.addObserver(mBookmarkModelObserver); + BookmarkItem item = mModel.getBookmarkById(mBookmarkId); + if (!mModel.doesBookmarkExist(mBookmarkId) || item == null) { + finish(); + return; + } setContentView(R.layout.eb_edit); mTitleEditText = (EmptyAlertEditText) findViewById(R.id.title_text); @@ -130,7 +134,7 @@ }); if (OfflinePageBridge.isEnabled() && OfflinePageBridge.canSavePage( - mEnhancedBookmarksModel.getBookmarkById(mBookmarkId).getUrl())) { + mModel.getBookmarkById(mBookmarkId).getUrl())) { mOfflinePageModelObserver = new OfflinePageModelObserver() { @Override public void offlinePageDeleted(BookmarkId bookmarkId) { @@ -140,7 +144,7 @@ } }; - mEnhancedBookmarksModel.getOfflinePageBridge().addObserver(mOfflinePageModelObserver); + mModel.getOfflinePageBridge().addObserver(mOfflinePageModelObserver); // Make offline page section visible and find controls. findViewById(R.id.offline_page_group).setVisibility(View.VISIBLE); getIntent().setExtrasClassLoader(WebContents.class.getClassLoader()); @@ -156,18 +160,19 @@ } private void updateViewContent() { - BookmarkItem bookmarkItem = mEnhancedBookmarksModel.getBookmarkById(mBookmarkId); + BookmarkItem bookmarkItem = mModel.getBookmarkById(mBookmarkId); if (!TextUtils.equals(mTitleEditText.getTrimmedText(), bookmarkItem.getTitle())) { mTitleEditText.setText(bookmarkItem.getTitle()); } - String folderTitle = mEnhancedBookmarksModel.getBookmarkTitle(bookmarkItem.getParentId()); + String folderTitle = mModel.getBookmarkTitle(bookmarkItem.getParentId()); if (!TextUtils.equals(mFolderTextView.getText(), folderTitle)) { mFolderTextView.setText(folderTitle); } if (!TextUtils.equals(mUrlEditText.getTrimmedText(), bookmarkItem.getUrl())) { mUrlEditText.setText(bookmarkItem.getUrl()); } + mTitleEditText.setEnabled(bookmarkItem.isEditable()); mUrlEditText.setEnabled(bookmarkItem.isUrlEditable()); mFolderTextView.setEnabled(bookmarkItem.isMovable()); } @@ -188,7 +193,7 @@ // Log added for detecting delete button double clicking. Log.i(TAG, "Delete button pressed by user! isFinishing() == " + isFinishing()); - mEnhancedBookmarksModel.deleteBookmark(mBookmarkId); + mModel.deleteBookmark(mBookmarkId); finish(); return true; } else if (item.getItemId() == android.R.id.home) { @@ -200,26 +205,26 @@ @Override protected void onStop() { - if (mEnhancedBookmarksModel.doesBookmarkExist(mBookmarkId)) { + if (mModel.doesBookmarkExist(mBookmarkId)) { final String originalUrl = - mEnhancedBookmarksModel.getBookmarkById(mBookmarkId).getUrl(); + mModel.getBookmarkById(mBookmarkId).getUrl(); final String title = mTitleEditText.getTrimmedText(); final String url = mUrlEditText.getTrimmedText(); if (!mTitleEditText.isEmpty()) { - mEnhancedBookmarksModel.setBookmarkTitle(mBookmarkId, title); + mModel.setBookmarkTitle(mBookmarkId, title); } if (!mUrlEditText.isEmpty() - && mEnhancedBookmarksModel.getBookmarkById(mBookmarkId).isUrlEditable()) { + && mModel.getBookmarkById(mBookmarkId).isUrlEditable()) { String fixedUrl = UrlUtilities.fixupUrl(url); if (fixedUrl != null && !fixedUrl.equals(originalUrl)) { boolean hasOfflinePage = OfflinePageBridge.isEnabled() - && mEnhancedBookmarksModel.getOfflinePageBridge() + && mModel.getOfflinePageBridge() .getPageByBookmarkId(mBookmarkId) != null; RecordHistogram.recordBooleanHistogram( "OfflinePages.Edit.BookmarkUrlChangedForOfflinePage", hasOfflinePage); - mEnhancedBookmarksModel.setBookmarkUrl(mBookmarkId, fixedUrl); + mModel.setBookmarkUrl(mBookmarkId, fixedUrl); } } } @@ -231,12 +236,12 @@ protected void onDestroy() { recordOfflineButtonAction(false); if (OfflinePageBridge.isEnabled()) { - mEnhancedBookmarksModel.getOfflinePageBridge().removeObserver( + mModel.getOfflinePageBridge().removeObserver( mOfflinePageModelObserver); } - mEnhancedBookmarksModel.removeObserver(mBookmarkModelObserver); - mEnhancedBookmarksModel.destroy(); - mEnhancedBookmarksModel = null; + mModel.removeObserver(mBookmarkModelObserver); + mModel.destroy(); + mModel = null; super.onDestroy(); } @@ -245,14 +250,14 @@ // It is possible that callback arrives after the activity was dismissed. // See http://crbug.com/566939 - if (mEnhancedBookmarksModel == null) return; + if (mModel == null) return; - mEnhancedBookmarksModel.getOfflinePageBridge().checkOfflinePageMetadata(); + mModel.getOfflinePageBridge().checkOfflinePageMetadata(); Button saveRemoveVisitButton = (Button) findViewById(R.id.offline_page_save_remove_button); TextView offlinePageInfoTextView = (TextView) findViewById(R.id.offline_page_info_text); - OfflinePageItem offlinePage = mEnhancedBookmarksModel.getOfflinePageBridge() + OfflinePageItem offlinePage = mModel.getOfflinePageBridge() .getPageByBookmarkId(mBookmarkId); if (offlinePage != null) { // Offline page exists. Show information and button to remove. @@ -282,7 +287,7 @@ @Override public void onClick(View v) { recordOfflineButtonAction(true); - mEnhancedBookmarksModel.getOfflinePageBridge().deletePage( + mModel.getOfflinePageBridge().deletePage( mBookmarkId, new DeletePageCallback() { @Override public void onDeletePageDone(int deletePageResult) { @@ -303,7 +308,7 @@ @Override public void onClick(View v) { recordOfflineButtonAction(true); - mEnhancedBookmarksModel.getOfflinePageBridge().savePage( + mModel.getOfflinePageBridge().savePage( mWebContents, mBookmarkId, new SavePageCallback() { @Override public void onSavePageDone(int savePageResult, String url) { @@ -333,7 +338,7 @@ // TODO(kkimlabs): Refactor this out to handle the intent in ChromeActivity. if (DeviceFormFactor.isTablet(this)) { EnhancedBookmarkUtils.openBookmark( - mEnhancedBookmarksModel, this, mBookmarkId, LaunchLocation.BOOKMARK_EDITOR); + mModel, this, mBookmarkId, LaunchLocation.BOOKMARK_EDITOR); } else { Intent intent = new Intent(); intent.putExtra(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/LogoView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/LogoView.java index c92240c3..9360f975 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/LogoView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/LogoView.java
@@ -132,11 +132,10 @@ } /** - * @return True after the animated GIF logo starts playing. False otherwise. + * @return True after we receive an animated logo from the server. */ public boolean isAnimatedLogoShowing() { - return mAnimatedLogoDrawable != null && mAnimatedLogoDrawable.isRunning() - && mAnimatedLogoDrawable.isValid(); + return mAnimatedLogoDrawable != null; } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java index 13b0c92..9c05f23 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
@@ -9,6 +9,7 @@ import android.content.pm.PackageManager; import android.location.Location; import android.net.Uri; +import android.os.Build; import android.os.Process; import android.util.Base64; @@ -145,9 +146,23 @@ } static boolean hasGeolocationPermission(Context context) { - return context.checkPermission( - Manifest.permission.ACCESS_COARSE_LOCATION, Process.myPid(), Process.myUid()) - == PackageManager.PERMISSION_GRANTED; + int pid = Process.myPid(); + int uid = Process.myUid(); + if (context.checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION, pid, uid) + != PackageManager.PERMISSION_GRANTED) { + return false; + } + + // Work around a bug in OnePlus2 devices running Lollipop, where the NETWORK_PROVIDER + // incorrectly requires FINE_LOCATION permission (it should only require COARSE_LOCATION + // permission). http://crbug.com/580733 + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M + && context.checkPermission(Manifest.permission.ACCESS_FINE_LOCATION, pid, uid) + != PackageManager.PERMISSION_GRANTED) { + return false; + } + + return true; } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/AccountChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/AccountChooserDialog.java index b8cb261e..839ed24 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/AccountChooserDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/AccountChooserDialog.java
@@ -46,6 +46,7 @@ private final String mTitle; private final int mTitleLinkStart; private final int mTitleLinkEnd; + private final String mOrigin; private ArrayAdapter<Credential> mAdapter; /** @@ -56,7 +57,8 @@ private AlertDialog mDialog; private AccountChooserDialog(Context context, long nativeAccountChooserDialog, - Credential[] credentials, String title, int titleLinkStart, int titleLinkEnd) { + Credential[] credentials, String title, int titleLinkStart, int titleLinkEnd, + String origin) { mNativeAccountChooserDialog = nativeAccountChooserDialog; mContext = context; mCredentials = credentials.clone(); @@ -64,6 +66,7 @@ mTitle = title; mTitleLinkStart = titleLinkStart; mTitleLinkEnd = titleLinkEnd; + mOrigin = origin; } /** @@ -72,15 +75,17 @@ * @param title Title message for the dialog, which can contain Smart Lock branding. * @param titleLinkStart Start of a link in case title contains Smart Lock branding. * @param titleLinkEnd End of a link in case title contains Smart Lock branding. + * @param origin Address of the web page, where dialog was triggered. */ @CalledByNative private static AccountChooserDialog createAccountChooser(WindowAndroid windowAndroid, long nativeAccountChooserDialog, Credential[] credentials, String title, - int titleLinkStart, int titleLinkEnd) { + int titleLinkStart, int titleLinkEnd, String origin) { Activity activity = windowAndroid.getActivity().get(); if (activity == null) return null; - AccountChooserDialog chooser = new AccountChooserDialog(activity, - nativeAccountChooserDialog, credentials, title, titleLinkStart, titleLinkEnd); + AccountChooserDialog chooser = + new AccountChooserDialog(activity, nativeAccountChooserDialog, credentials, title, + titleLinkStart, titleLinkEnd, origin); chooser.show(activity.getFragmentManager(), null); return chooser; } @@ -129,8 +134,9 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { View titleView = LayoutInflater.from(mContext).inflate(R.layout.account_chooser_dialog_title, null); + TextView origin = (TextView) titleView.findViewById(R.id.origin); + origin.setText(mOrigin); TextView titleMessageText = (TextView) titleView.findViewById(R.id.title); - // TODO(melandory): add support for showing site origin in the title. if (mTitleLinkStart != 0 && mTitleLinkEnd != 0) { SpannableString spanableTitle = new SpannableString(mTitle); spanableTitle.setSpan(new ClickableSpan() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java index 6b2f758..7bd0c96 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java
@@ -13,6 +13,8 @@ import org.chromium.chrome.browser.signin.SigninPromoUma; import java.util.Locale; + + /** * ChromePreferenceManager stores and retrieves various values in Android shared preferences. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java index 0ff5973a..6a11c6db 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
@@ -214,7 +214,10 @@ // It takes some time to parse the title of the webcontent, and before that Tab#getTitle // always return the url. We postpone the title animation until the title is authentic. - if (mShouldShowTitle && !TextUtils.equals(currentTab.getTitle(), currentTab.getUrl())) { + // TODO(yusufo): Clear the explicit references to about:blank here and for domain. + if (mShouldShowTitle + && !TextUtils.equals(currentTab.getTitle(), currentTab.getUrl()) + && !TextUtils.equals(currentTab.getTitle(), "about:blank")) { long duration = System.currentTimeMillis() - mInitializeTimeStamp; if (duration >= TITLE_ANIM_DELAY_MS) { mTitleAnimationStarter.run();
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index 78ec2a7d..3ba265d 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -2155,7 +2155,7 @@ <message name="IDS_READER_VIEW_TEXT" desc="Message shown on the reader mode button bar, to invite the user to tap to open a reader mode. Reader mode extracts content and removes clutter from a web page and puts the result in a panel making it easier to read."> Make page mobile-friendly </message> - <message name="IDS_READER_MODE_EXPANDED_TITLE" desc="Message shown on the reader mode button bar when it is opened to show reader mode. Reader mode extracts content and removes clutter from a web page and puts the result in a panel making it easier to read."> + <message name="IDS_READER_MODE_MAXIMIZED_TITLE" desc="Message shown on the reader mode button bar when it is opened to show reader mode. Reader mode extracts content and removes clutter from a web page and puts the result in a panel making it easier to read."> Mobile-friendly view </message> <message name="IDS_FRE_LABEL" desc="First Run Experience Strings">
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb index 98d0676..4fea77ab 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">የይለፍ ሐረግዎን ከረሱ በ<ph name="BEGIN_LINK" />Google ዳሽቦርድ<ph name="END_LINK" /> በኩል ስምረትን ያቁሙና ዳግም ያስጀምሩ።</translation> <translation id="5916664084637901428">በርቷል</translation> <translation id="5939518447894949180">ዳግም አስጀምር</translation> -<translation id="5953603475187800576">የGoogle ክፍያዎች አድራሻዎችን እና ክሬዲት ካርዶችን አሳይ</translation> <translation id="5968595432776860642">«<ph name="VIDEO_TITLE" />»ን በመጫወት ላይ</translation> <translation id="6010869025736512584">የቪዲዮ ግብዓትን በመድረስ ላይ</translation> <translation id="6012342843556706400">Chrome እሱን ለዚህ ጣቢያ ለማጋራት የአካባቢ መዳረሻ ያስፈልገዋል።</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb index e6e2299b..ec90888 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -355,7 +355,6 @@ <translation id="5913211790276112891">إذا كنت نسيت عبارة المرور، فتوقف وأعد تعيين المزامنة عبر <ph name="BEGIN_LINK" />لوحة تحكم Google.<ph name="END_LINK" /></translation> <translation id="5916664084637901428">تشغيل</translation> <translation id="5939518447894949180">إعادة</translation> -<translation id="5953603475187800576">عرض العناوين وبطاقات الائتمان من Google Payments</translation> <translation id="5968595432776860642">يتم الآن التشغيل "<ph name="VIDEO_TITLE" />"</translation> <translation id="6010869025736512584">جارٍ الوصول إلى إدخال الفيديو</translation> <translation id="6012342843556706400">يحتاج Chrome إلى الحصول على حق الوصول إلى الموقع لمشاركته مع موقع الويب هذا.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb index 641c676a..7d13292 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Ако сте забравили пропуска си, спрете и нулирайте синхронизирането посредством <ph name="BEGIN_LINK" />Google Табло за управление<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Включено</translation> <translation id="5939518447894949180">Нулиране</translation> -<translation id="5953603475187800576">Показване на адресите и кредитните карти от Google Payments</translation> <translation id="5968595432776860642">„<ph name="VIDEO_TITLE" />“ се възпроизвежда</translation> <translation id="6010869025736512584">Осъществява се достъп до видеовхода</translation> <translation id="6012342843556706400">Chrome се нуждае от достъп до местоположението, за да го сподели с този сайт.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb index 08cb7660..fd12a9a 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -54,7 +54,7 @@ <translation id="1648687357130613845">Espai d'emmagatzematge</translation> <translation id="1657479659644194568">Configurar Chrome</translation> <translation id="169033420419426091">No s'ha pogut baixar <ph name="FILE_NAME" /> perquè no s'ha trobat la targeta SD.</translation> -<translation id="1692118695553449118">Sincronització activada</translation> +<translation id="1692118695553449118">La sincronització està activada</translation> <translation id="1709438864123551175">Economitzador de dades</translation> <translation id="1741127251791687432">Heu iniciat la sessió als comptes de Google següents.</translation> <translation id="1742134235943978220">S'ha traduït a <ph name="TARGET_LANGUAGE" />.</translation> @@ -357,7 +357,6 @@ <translation id="5913211790276112891">Si heu oblidat la frase de contrasenya, atureu i restabliu la sincronització al <ph name="BEGIN_LINK" />Tauler de control de Google<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Activat</translation> <translation id="5939518447894949180">Restableix</translation> -<translation id="5953603475187800576">Mostra les adreces i les targetes de crèdit de Google Payments</translation> <translation id="5968595432776860642">S'està reproduint "<ph name="VIDEO_TITLE" />"</translation> <translation id="6010869025736512584">S'està accedint a l'entrada de vídeo</translation> <translation id="6012342843556706400">Chrome necessita accés a la ubicació per compartir-la amb aquest lloc web.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb index 63e733d2..b6139713 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Pokud jste zapomněli heslo, zastavte a resetujte synchronizaci pomocí <ph name="BEGIN_LINK" />Hlavního panelu Google<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Zapnuto</translation> <translation id="5939518447894949180">Resetovat</translation> -<translation id="5953603475187800576">Zobrazit adresy a platební karty ze služby Google Payments</translation> <translation id="5968595432776860642">Přehrávání videa <ph name="VIDEO_TITLE" /></translation> <translation id="6010869025736512584">Přístup k vstupu videa</translation> <translation id="6012342843556706400">Aby Chrome mohl s těmito webovými stránkami sdílet polohu, musí k ní mít přístup.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb index 9b97c795..5396594ec 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Hvis du har glemt din adgangssætning, skal du stoppe og nulstille synkronisering via <ph name="BEGIN_LINK" />Google Betjeningspanel<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Til</translation> <translation id="5939518447894949180">Nulstil</translation> -<translation id="5953603475187800576">Vis adresser og kreditkort fra Google Payments</translation> <translation id="5968595432776860642">Afspiller "<ph name="VIDEO_TITLE" />"</translation> <translation id="6010869025736512584">Åbner videoinput</translation> <translation id="6012342843556706400">Chrome skal have adgang til din placering for at kunne dele den med dette website.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb index a37aa81..2207079 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -114,7 +114,7 @@ <translation id="2536728043171574184">Eine Offline-Kopie dieser Seite wird angezeigt.</translation> <translation id="257931822824936280">Maximiert – zum Minimieren klicken</translation> <translation id="2587052924345400782">Neuere Version verfügbar</translation> -<translation id="2593272815202181319">Festbreitenschrift</translation> +<translation id="2593272815202181319">Monospace</translation> <translation id="2646820313617290661">Deine Eltern verwalten diese Einstellungen.</translation> <translation id="2677748264148917807">Verlassen</translation> <translation id="2707726405694321444">Seite aktualisieren</translation> @@ -357,7 +357,6 @@ <translation id="5913211790276112891">Wenn Sie die Passphrase vergessen haben, können Sie die Synchronisierung über das <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" /> stoppen und zurücksetzen.</translation> <translation id="5916664084637901428">An</translation> <translation id="5939518447894949180">Zurücksetzen</translation> -<translation id="5953603475187800576">Adressen und Kreditkarten aus Google Payments anzeigen</translation> <translation id="5968595432776860642">"<ph name="VIDEO_TITLE" />" wird abgespielt.</translation> <translation id="6010869025736512584">Zugriff auf Video-Eingang</translation> <translation id="6012342843556706400">Chrome benötigt Zugriff auf den Standort, um ihn für diese Website freizugeben.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb index b588ec2..2344421 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -358,7 +358,6 @@ <translation id="5913211790276112891">Αν έχετε ξεχάσει την κωδική φράση πρόσβασης, διακόψτε και επαναφέρετε τον Συγχρονισμό μέσω του <ph name="BEGIN_LINK" />Πίνακα ελέγχου Google<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Ενεργό</translation> <translation id="5939518447894949180">Επαναφορά</translation> -<translation id="5953603475187800576">Εμφάνιση διευθύνσεων και πιστωτικών καρτών από το Google Payments</translation> <translation id="5968595432776860642">Αναπαραγωγή "<ph name="VIDEO_TITLE" />"</translation> <translation id="6010869025736512584">Πρόσβαση στην είσοδο βίντεο</translation> <translation id="6012342843556706400">Το Chrome χρειάζεται πρόσβαση στην τοποθεσία προκειμένου να την μοιραστεί με αυτόν τον ιστότοπο.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb index 9a47618..3a6f6417 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">If you’ve forgotten your passphrase, stop and reset Sync via <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">On</translation> <translation id="5939518447894949180">Reset</translation> -<translation id="5953603475187800576">Show addresses and credit cards from Google Payments</translation> <translation id="5968595432776860642">Playing “<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">Accessing video input</translation> <translation id="6012342843556706400">Chrome needs location access to share it with this site.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb index 1b447f29..1e7a002 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
@@ -358,7 +358,6 @@ <translation id="5913211790276112891">Si olvidaste tu frase de contraseña, detente y restablece la sincronización mediante el <ph name="BEGIN_LINK" />Panel de control de Google<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Activada</translation> <translation id="5939518447894949180">Restablecer</translation> -<translation id="5953603475187800576">Mostrar las direcciones y las tarjetas de crédito de Google Payments</translation> <translation id="5968595432776860642">Reproduciendo "<ph name="VIDEO_TITLE" />"</translation> <translation id="6010869025736512584">Accediendo a la entrada de video</translation> <translation id="6012342843556706400">Chrome necesita acceso a la ubicación para compartirla con este sitio.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb index d397cae..d842b911 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Si has olvidado tu frase de contraseña, detén y reinicia la sincronización a través del <ph name="BEGIN_LINK" />panel de control de Google<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Activar</translation> <translation id="5939518447894949180">Restablecer</translation> -<translation id="5953603475187800576">Mostrar direcciones y tarjetas de crédito de Google Payments</translation> <translation id="5968595432776860642">Reproduciendo "<ph name="VIDEO_TITLE" />"</translation> <translation id="6010869025736512584">Accediendo a la entrada de vídeo</translation> <translation id="6012342843556706400">Chrome necesita acceder a la información de ubicación para compartirla con este sitio web.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb index 8536ad4a..1e0432e3 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -356,7 +356,6 @@ <translation id="5913211790276112891">اگر عبارت عبورتان را فراموش کردهاید، صبر کنید و همگامسازی را از طریق <ph name="BEGIN_LINK" />داشبورد Google<ph name="END_LINK" /> بازنشانی کنید.</translation> <translation id="5916664084637901428">روشن</translation> <translation id="5939518447894949180">بازنشانی</translation> -<translation id="5953603475187800576">نمایش آدرسها و کارتهای اعتباری از Google Payments</translation> <translation id="5968595432776860642">در حال پخش «<ph name="VIDEO_TITLE" />»</translation> <translation id="6010869025736512584">در حال دسترسی به ورودی ویدیویی</translation> <translation id="6012342843556706400">Chrome باید به موقعیت مکانی دسترسی داشته باشد تا آن را با این سایت به اشتراک بگذارد.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb index 308c9979..b8cae13 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Jos olet unohtanut tunnuslauseen, keskeytä ja nollaa synkronointi <ph name="BEGIN_LINK" />Google-hallintapaneelista<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Käytössä</translation> <translation id="5939518447894949180">Tyhjennä</translation> -<translation id="5953603475187800576">Näytä Google Paymentsin osoitteet ja luottokortit</translation> <translation id="5968595432776860642">Toistetaan videota <ph name="VIDEO_TITLE" />.</translation> <translation id="6010869025736512584">Videotuloa käytetään</translation> <translation id="6012342843556706400">Chrome tarvitsee sijainnin käyttöoikeuden voidakseen jakaa sen tämän sivuston kanssa.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb index 80f76d0..15ab483 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Kung nakalimutan mo ang iyong passphrase, ihinto at i-reset ang Pag-sync sa pamamagitan ng <ph name="BEGIN_LINK" />Dashboard ng Google<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Naka-on</translation> <translation id="5939518447894949180">I-reset</translation> -<translation id="5953603475187800576">Ipakita ang mga address at credit card mula sa Google Payments</translation> <translation id="5968595432776860642">Pine-play ang “<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">Ina-access ang input ng video</translation> <translation id="6012342843556706400">Kailangan ng Chrome ng access sa lokasyon upang maibahagi ito sa site na ito.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb index 01cc665..d40a874 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -358,7 +358,6 @@ <translation id="5913211790276112891">Si vous avez oublié votre phrase secrète, interrompez la synchronisation, puis reconfigurez-la via <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Activé</translation> <translation id="5939518447894949180">Réinitialiser</translation> -<translation id="5953603475187800576">Afficher les adresses et les cartes de paiement figurant sur Google Payments</translation> <translation id="5968595432776860642">Lecture de la vidéo "<ph name="VIDEO_TITLE" />" en cours…</translation> <translation id="6010869025736512584">Accès à l'entrée vidéo en cours…</translation> <translation id="6012342843556706400">Chrome doit disposer de l'accès à votre position pour la partager avec ce site.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb index c91c61d1..8957099 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">यदि आप अपना पासफ़्रेज़ भूल गए हैं, तो समन्वयन को रोकें और <ph name="BEGIN_LINK" />Google डैशबोर्ड<ph name="END_LINK" /> के द्वारा रीसेट करें.</translation> <translation id="5916664084637901428">चालू</translation> <translation id="5939518447894949180">रीसेट करें</translation> -<translation id="5953603475187800576">Google पेमेंट्स से पते और क्रेडिट कार्ड दिखाएं</translation> <translation id="5968595432776860642">“<ph name="VIDEO_TITLE" />” चल रहा है</translation> <translation id="6010869025736512584">वीडियो इनपुट ऐक्सेस हो रहा है</translation> <translation id="6012342843556706400">Chrome को स्थान ऐक्सेस की आवश्यकता है ताकि स्थान को इस साइट के साथ साझा किया जा सके.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb index 88578e3d..8027e374 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Ako ste zaboravili zaporku, zaustavite se i poništite sinkronizaciju na <ph name="BEGIN_LINK" />Google nadzornoj ploči<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Uključi</translation> <translation id="5939518447894949180">Ponovno postavi</translation> -<translation id="5953603475187800576">Prikaži adrese i kreditne kartice s Google Paymentsa</translation> <translation id="5968595432776860642">Reproducira se "<ph name="VIDEO_TITLE" />"</translation> <translation id="6010869025736512584">Pristupanje videoulazu</translation> <translation id="6012342843556706400">Chrome treba imati pristup lokaciji da bi je dijelio s ovom web-lokacijom.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb index 3b7443c..92579c4c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Ha elfelejtette összetett jelszavát, állítsa le, majd állítsa vissza a szinkronizálást a <ph name="BEGIN_LINK" />Google Irányítópulton<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Be</translation> <translation id="5939518447894949180">Visszaállítás</translation> -<translation id="5953603475187800576">Címek és hitelkártyák mutatása a Google Payments szolgáltatásból</translation> <translation id="5968595432776860642">„<ph name="VIDEO_TITLE" />” lejátszása</translation> <translation id="6010869025736512584">Hozzáférés videobemenethez</translation> <translation id="6012342843556706400">A Chrome-nak rendelkeznie kell hozzáféréssel a tartózkodási helyhez, hogy megoszthassa ezzel a webhellyel.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb index 8e0df3e..c48bcf9 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Jika Anda lupa sandi, hentikan dan setel ulang Sinkronisasi melalui <ph name="BEGIN_LINK" />Google Dasbor<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Aktif</translation> <translation id="5939518447894949180">Setel ulang</translation> -<translation id="5953603475187800576">Tampilkan alamat dan kartu kredit di Google Payments</translation> <translation id="5968595432776860642">Memutar “<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">Mengakses masukan video</translation> <translation id="6012342843556706400">Chrome memerlukan akses lokasi untuk berbagi dengan situs ini.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb index b7051fd..87c3288 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Se hai dimenticato la passphrase, interrompi e reimposta la sincronizzazione tramite <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">On</translation> <translation id="5939518447894949180">Ripristina</translation> -<translation id="5953603475187800576">Mostra indirizzi e carte di credito di Google Payments</translation> <translation id="5968595432776860642">"<ph name="VIDEO_TITLE" />" in riproduzione</translation> <translation id="6010869025736512584">Accesso all'input video in corso</translation> <translation id="6012342843556706400">Chrome deve avere accesso alla posizione per condividerla con questo sito.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb index a2ae5d7..7397a0c6 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">אם שכחת את ביטוי הסיסמה, עצור ואפס את הסנכרון דרך <ph name="BEGIN_LINK" />מרכז השליטה של Google<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">פועל</translation> <translation id="5939518447894949180">אפס</translation> -<translation id="5953603475187800576">הצג כתובות וכרטיסי אשראי מ-Google Payments</translation> <translation id="5968595432776860642">מפעיל את "<ph name="VIDEO_TITLE" />"</translation> <translation id="6010869025736512584">גישה לפלט אודיו</translation> <translation id="6012342843556706400">Chrome זקוק לגישה אל המיקום כדי לשתף אותו עם האתר הזה.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb index 029a1f0..05145eba 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">パスフレーズを忘れた場合は、<ph name="BEGIN_LINK" />Google ダッシュボード<ph name="END_LINK" />から同期の停止とリセットを行ってください。</translation> <translation id="5916664084637901428">オン</translation> <translation id="5939518447894949180">リセット</translation> -<translation id="5953603475187800576">Google ペイメントに登録した住所とクレジット カードの情報を表示する</translation> <translation id="5968595432776860642">「<ph name="VIDEO_TITLE" />」を再生しています</translation> <translation id="6010869025736512584">ビデオ入力にアクセスしています</translation> <translation id="6012342843556706400">このサイトと位置情報を共有するには Chrome に位置情報へのアクセスを許可する必要があります。</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb index 4c2ae21..6833c6e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -285,7 +285,7 @@ <translation id="5168917394043976756">탐색 창 열기</translation> <translation id="5171045022955879922">검색 또는 URL 입력</translation> <translation id="5184329579814168207">Chrome에서 열기</translation> -<translation id="5199929503336119739">작업 프로필</translation> +<translation id="5199929503336119739">직장용 프로필</translation> <translation id="5210365745912300556">탭 닫기</translation> <translation id="5210714456814679336">다른 기기의 Chrome에서 연 탭이 여기에 표시됩니다.</translation> <translation id="5228579091201413441">동기화 사용</translation> @@ -357,7 +357,6 @@ <translation id="5913211790276112891">암호를 잊어버린 경우 <ph name="BEGIN_LINK" />Google 대시보드<ph name="END_LINK" />에서 동기화를 중지하고 재설정하세요.</translation> <translation id="5916664084637901428">사용</translation> <translation id="5939518447894949180">초기화</translation> -<translation id="5953603475187800576">Google Payments에 저장된 주소와 신용카드 표시</translation> <translation id="5968595432776860642">'<ph name="VIDEO_TITLE" />' 재생 중</translation> <translation id="6010869025736512584">비디오 입력 장치에 액세스 중</translation> <translation id="6012342843556706400">이 사이트에 공유하려면 Chrome에 위치 정보 액세스 권한이 있어야 합니다.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb index 291c47e0..eb672eaf 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -358,7 +358,6 @@ <translation id="5913211790276112891">Jei pamiršote slaptafrazę, sustabdykite ir iš naujo nustatykite sinchronizavimą naudodami <ph name="BEGIN_LINK" />„Google“ informacijos suvestinę<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Įjungta</translation> <translation id="5939518447894949180">Nustatyti iš naujo</translation> -<translation id="5953603475187800576">Rodyti „Google Payments“ adresus ir kredito korteles</translation> <translation id="5968595432776860642">Leidžiamas „<ph name="VIDEO_TITLE" />“</translation> <translation id="6010869025736512584">Pasiekiama vaizdo įrašų įvestis</translation> <translation id="6012342843556706400">„Chrome“ reikia galimybės pasiekti vietovės informaciją, kad ją būtų galima bendrinti su šia svetaine.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb index a0b55bce..4a9356b 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Ja esat aizmirsis ieejas frāzi, apturiet un atiestatiet sinhronizāciju, izmantojot <ph name="BEGIN_LINK" />Google vadības paneli<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Iesl.</translation> <translation id="5939518447894949180">Atiestatīt</translation> -<translation id="5953603475187800576">Rādīt adreses un kredītkartes no pakalpojuma Google Payments</translation> <translation id="5968595432776860642">Notiek videoklipa “<ph name="VIDEO_TITLE" />” atskaņošana</translation> <translation id="6010869025736512584">Notiek piekļūšana video ievadei</translation> <translation id="6012342843556706400">Pārlūkam Chrome ir nepieciešama piekļuve atrašanās vietai, lai kopīgotu to ar šo vietni.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb index 185ced5..20c466e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Als je je wachtwoordzin bent vergeten, stop je de functie Synchroniseren en stel je deze opnieuw in via <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Aan</translation> <translation id="5939518447894949180">Terugzetten</translation> -<translation id="5953603475187800576">Adressen en creditcards uit Google Payments weergeven</translation> <translation id="5968595432776860642">'<ph name="VIDEO_TITLE" />' afspelen</translation> <translation id="6010869025736512584">Video-invoer openen</translation> <translation id="6012342843556706400">Chrome heeft locatietoegang nodig om het item te delen met deze site.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb index 0a003311..4eae8af 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Hvis du har glemt passordfrasen din, kan du stoppe og tilbakestille synkroniseringen via <ph name="BEGIN_LINK" />Google Oversikt<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">På</translation> <translation id="5939518447894949180">Tilbakestill</translation> -<translation id="5953603475187800576">Vis adresser og kredittkort fra Google Payments</translation> <translation id="5968595432776860642">Spiller av <ph name="VIDEO_TITLE" /> ...</translation> <translation id="6010869025736512584">Åpner videoinngang</translation> <translation id="6012342843556706400">Chrome må ha tilgang til posisjonen din for å kunne dele den med dette nettstedet.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb index 2967c04..bc9eca4 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Jeśli nie pamiętasz hasła, zatrzymaj i zresetuj synchronizację w <ph name="BEGIN_LINK" />Panelu Google<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Włączone</translation> <translation id="5939518447894949180">Resetuj</translation> -<translation id="5953603475187800576">Pokaż adresy i karty kredytowe z Google Payments</translation> <translation id="5968595432776860642">Odtwarzam „<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">Otwieram wejście wideo</translation> <translation id="6012342843556706400">Aby zezwolić stronie na wykorzystanie danych o lokalizacji, Chrome musi mieć do nich dostęp.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb index ebfbc38..0d346fc4 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -356,7 +356,6 @@ <translation id="5913211790276112891">Caso tenha esquecido sua senha, pare e reinicie a sincronização por meio do <ph name="BEGIN_LINK" />Painel do Google<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Ativado</translation> <translation id="5939518447894949180">Redefinir</translation> -<translation id="5953603475187800576">Mostrar endereços e cartões de crédito do Google Payments</translation> <translation id="5968595432776860642">Reproduzindo “<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">Acessando entrada de vídeo</translation> <translation id="6012342843556706400">O Chrome precisa ter acesso ao local para compartilhá-lo com este site.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb index 75e0af57..f0b826b 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Se se tiver esquecido da frase de acesso, pare e reinicie a Sincronização através do <ph name="BEGIN_LINK" />Painel de Controlo Google<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Ativado</translation> <translation id="5939518447894949180">Repor</translation> -<translation id="5953603475187800576">Mostrar endereços e cartões de crédito do Google Payments</translation> <translation id="5968595432776860642">A reproduzir "<ph name="VIDEO_TITLE" />"</translation> <translation id="6010869025736512584">A aceder à entrada de vídeo</translation> <translation id="6012342843556706400">O Chrome necessita de acesso à localização para a partilhar com este site.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb index bc75fdd6..3d20f07 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Dacă ai uitat expresia de acces, oprește și resetează sincronizarea folosind <ph name="BEGIN_LINK" />Tabloul de bord Google<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Activat</translation> <translation id="5939518447894949180">Resetează</translation> -<translation id="5953603475187800576">Afișează adresele și cardurile de credit din Google Payments</translation> <translation id="5968595432776860642">Se redă „<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">Se accesează intrarea video</translation> <translation id="6012342843556706400">Chrome are nevoie de acces la locație pentru a-l acorda acestui site.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb index 70077347..30577c4 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Если вы забыли кодовую фразу, остановите и возобновите синхронизацию в <ph name="BEGIN_LINK" />Личном кабинете<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">ВКЛ</translation> <translation id="5939518447894949180">Сбросить</translation> -<translation id="5953603475187800576">Показывать адреса и кредитные карты из Google Payments</translation> <translation id="5968595432776860642">Воспроизведение видео "<ph name="VIDEO_TITLE" />"</translation> <translation id="6010869025736512584">Доступ к видеовходу</translation> <translation id="6012342843556706400">Предоставьте браузеру Chrome доступ к геоданным, чтобы продолжить работу на этом сайте.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb index 9a387ea9..74e99e6e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Ak ste zabudli svoju prístupovú frázu, zastavte a obnovte synchronizáciu pomocou služby <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Zapnúť</translation> <translation id="5939518447894949180">Obnoviť</translation> -<translation id="5953603475187800576">Zobrazovať adresy a kreditné karty zo služby Google Payments</translation> <translation id="5968595432776860642">Prehráva sa video <ph name="VIDEO_TITLE" /></translation> <translation id="6010869025736512584">Pristupovanie k vstupu videa</translation> <translation id="6012342843556706400">Na to, aby Chrome mohol s týmito webovými stránkami zdieľať polohu, musí mať k nej prístup.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb index 40ec3450..c7033ba 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Če ste pozabili geslo, na <ph name="BEGIN_LINK" />Google Nadzorni plošči<ph name="END_LINK" /> ustavite in ponastavite sinhronizacijo.</translation> <translation id="5916664084637901428">Vklopljeno</translation> <translation id="5939518447894949180">Ponastavi</translation> -<translation id="5953603475187800576">Prikaz naslovov in kreditnih kartic iz Google Payments</translation> <translation id="5968595432776860642">Predvajanje: »<ph name="VIDEO_TITLE" />«</translation> <translation id="6010869025736512584">Dostopanje do videovhoda</translation> <translation id="6012342843556706400">Chrome potrebuje dostop do lokacije, če želite, da temu spletnemu mestu omogoči dostop do nje.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb index 84d6e07..23816be 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Ако сте заборавили приступну фразу, зауставите и ресетујте синхронизацију преко <ph name="BEGIN_LINK" />Google контролне табле<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Укључи</translation> <translation id="5939518447894949180">Ресетуј</translation> -<translation id="5953603475187800576">Приказуј адресе и кредитне картице из Google Payments-а</translation> <translation id="5968595432776860642">Репродукује се „<ph name="VIDEO_TITLE" />“</translation> <translation id="6010869025736512584">Приступа се видео улазу</translation> <translation id="6012342843556706400">Chrome-у је потребан приступ за локацију да би га делио са овим сајтом.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb index f7c9215..20384ba6 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Om du har glömt lösenfrasen avslutar du och återställer synkroniseringen via <ph name="BEGIN_LINK" />Google Översikt<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">På</translation> <translation id="5939518447894949180">Återställ</translation> -<translation id="5953603475187800576">Visa adresser och kreditkort från Google Payments</translation> <translation id="5968595432776860642">Spelar upp <ph name="VIDEO_TITLE" /></translation> <translation id="6010869025736512584">Får åtkomst till videoindata</translation> <translation id="6012342843556706400">Chrome behöver tillgång till platsinformation för att kunna dela den på den här webbplatsen.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb index 250ad58..9583318 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Ikiwa umesahau kaulisiri yako, acha na uweke upya Usawazishaji kupitia <ph name="BEGIN_LINK" />Dashibodi ya Google<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Imewashwa</translation> <translation id="5939518447894949180">Weka upya</translation> -<translation id="5953603475187800576">Onyesha anwani na kadi za malipo kutoka Google Payments</translation> <translation id="5968595432776860642">Inacheza “<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">Inafikia vifaa vya kuingiza sauti ya video</translation> <translation id="6012342843556706400">Chrome inahitaji idhini ya kufikia mahali ili ipashiriki na tovuti hii.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb index f98a26d..f078d95e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">หากคุณลืมรหัสผ่าน ให้หยุดและรีเซ็ตการซิงค์ผ่าน <ph name="BEGIN_LINK" />Google แดชบอร์ด<ph name="END_LINK" /></translation> <translation id="5916664084637901428">เปิด</translation> <translation id="5939518447894949180">รีเซ็ต</translation> -<translation id="5953603475187800576">แสดงที่อยู่และบัตรเครดิตจาก Google Payments</translation> <translation id="5968595432776860642">กำลังเล่น “<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">กำลังเข้าถึงอินพุตวิดีโอ</translation> <translation id="6012342843556706400">Chrome ต้องการเข้าถึงตำแหน่งเพื่อแชร์กับเว็บไซต์นี้</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb index 392bbb0..8179300 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Parolanızı unuttuysanız, <ph name="BEGIN_LINK" />Google Hesap Özeti<ph name="END_LINK" />'ni kullanarak senkronizasyonu durdurun ve sıfırlayın.</translation> <translation id="5916664084637901428">Açık</translation> <translation id="5939518447894949180">Sıfırla</translation> -<translation id="5953603475187800576">Google Payments'taki adresleri ve kredi kartlarını göster</translation> <translation id="5968595432776860642">“<ph name="VIDEO_TITLE" />” oynatılıyor</translation> <translation id="6010869025736512584">Video girişine erişiliyor</translation> <translation id="6012342843556706400">Chrome'un konumu bu siteyle paylaşması için konum erişimine ihtiyacı var.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb index 280b8918..428bf571 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Якщо ви забули парольну фразу, припиніть і скиньте синхронізацію на <ph name="BEGIN_LINK" />Інформаційній панелі Google<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Увімкнути</translation> <translation id="5939518447894949180">Скинути</translation> -<translation id="5953603475187800576">Показувати адреси та дані кредитних карток із Google Payments</translation> <translation id="5968595432776860642">Відео "<ph name="VIDEO_TITLE" />" відтворюється</translation> <translation id="6010869025736512584">Отримання доступу до відеовходу</translation> <translation id="6012342843556706400">Chrome потрібен доступ до геоданих, щоб дозволити цьому сайту використовувати їх.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb index a80a14fa..b2ce240 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">Nếu bạn đã quên cụm mật khẩu của mình, hãy dừng và đặt lại Đồng bộ hóa qua <ph name="BEGIN_LINK" />Trang tổng quan của Google<ph name="END_LINK" />.</translation> <translation id="5916664084637901428">Bật</translation> <translation id="5939518447894949180">Đặt lại</translation> -<translation id="5953603475187800576">Hiển thị địa chỉ và thẻ tín dụng từ Google Payments</translation> <translation id="5968595432776860642">Đang phát “<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">Đang truy cập thiết bị đầu vào video</translation> <translation id="6012342843556706400">Chrome cần quyền truy cập vị trí để chia sẻ vị trí với trang web này.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb index f1946dcc6..6723756 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">如果您忘记了密码,请通过 <ph name="BEGIN_LINK" />Google 信息中心<ph name="END_LINK" />停止并重置同步功能。</translation> <translation id="5916664084637901428">启用</translation> <translation id="5939518447894949180">重置</translation> -<translation id="5953603475187800576">显示 Google Payments 中保存的地址和信用卡数据</translation> <translation id="5968595432776860642">正在播放“<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">正在存取视频输入</translation> <translation id="6012342843556706400">Chrome 需要具有位置信息使用权,才能批准此网站的分享请求。</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb index 98b7e6f7..bc6e26a 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -357,7 +357,6 @@ <translation id="5913211790276112891">如果您忘記通關密語,請透過 <ph name="BEGIN_LINK" />Google 資訊主頁<ph name="END_LINK" />停止並重設同步功能。</translation> <translation id="5916664084637901428">開啟</translation> <translation id="5939518447894949180">重設</translation> -<translation id="5953603475187800576">顯示 Google Payments 中儲存的地址和信用卡資料</translation> <translation id="5968595432776860642">正在播放「<ph name="VIDEO_TITLE" />」</translation> <translation id="6010869025736512584">正在存取視訊輸入</translation> <translation id="6012342843556706400">Chrome 需要存取位置資訊,才能與這個網站分享。</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/banners/InstallerDelegateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/banners/InstallerDelegateTest.java index 29a1c5fa..63fd5736 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/banners/InstallerDelegateTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/banners/InstallerDelegateTest.java
@@ -6,7 +6,6 @@ import android.content.pm.PackageInfo; import android.os.HandlerThread; -import android.test.FlakyTest; import android.test.InstrumentationTestCase; import android.test.mock.MockPackageManager; import android.test.suitebuilder.annotation.SmallTest; @@ -91,14 +90,6 @@ private void startMonitoring() throws InterruptedException { mTestDelegate.start(); mInstallStarted = true; - - // Wait until we know that the Thread is running the InstallerDelegate task. - CriteriaHelper.pollForCriteria(new Criteria() { - @Override - public boolean isSatisfied() { - return mTestDelegate.isRunning(); - } - }); } private void checkResults(boolean expectedResult) throws InterruptedException { @@ -159,8 +150,6 @@ /** * Makes sure that the runnable isn't called until returning from start(). */ - /* Appears to be flaky crbug.com/542627 */ - @FlakyTest @SmallTest public void testRunnableRaceCondition() throws InterruptedException { mPackageManager.isInstalled = true;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBaseTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBaseTest.java new file mode 100644 index 0000000..f864354 --- /dev/null +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBaseTest.java
@@ -0,0 +1,236 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.compositor.bottombar; + +import android.content.Context; +import android.test.InstrumentationTestCase; +import android.test.suitebuilder.annotation.SmallTest; + +import org.chromium.base.test.util.Feature; +import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.PanelState; + +/** + * Tests logic in the OverlayPanelBase. + */ +public class OverlayPanelBaseTest extends InstrumentationTestCase { + + private static final float UPWARD_VELOCITY = -1.0f; + private static final float DOWNWARD_VELOCITY = 1.0f; + + private static final float MOCK_PEEKED_HEIGHT = 200.0f; + private static final float MOCK_EXPANDED_HEIGHT = 400.0f; + private static final float MOCK_MAXIMIZED_HEIGHT = 600.0f; + + MockOverlayPanel mNoExpandPanel; + MockOverlayPanel mExpandPanel; + + /** + * Mock OverlayPanel. + */ + private static class MockOverlayPanel extends OverlayPanel { + public MockOverlayPanel(Context context, OverlayPanelManager manager) { + super(context, null, manager); + } + + /** + * Expose protected super method as public. + */ + @Override + public PanelState findNearestPanelStateFromHeight(float desiredHeight, float velocity) { + return super.findNearestPanelStateFromHeight(desiredHeight, velocity); + } + + /** + * Override to return arbitrary test heights. + */ + @Override + protected float getPanelHeightFromState(PanelState state) { + switch (state) { + case PEEKED: + return MOCK_PEEKED_HEIGHT; + case EXPANDED: + return MOCK_EXPANDED_HEIGHT; + case MAXIMIZED: + return MOCK_MAXIMIZED_HEIGHT; + default: + return 0.0f; + } + } + } + + /** + * A MockOverlayPanel that does not support the EXPANDED panel state. + */ + private static class NoExpandMockOverlayPanel extends MockOverlayPanel { + + public NoExpandMockOverlayPanel(Context context, OverlayPanelManager manager) { + super(context, manager); + } + + @Override + public boolean supportsExpandedState() { + return false; + } + + @Override + public float getThresholdToNextState() { + return 0.3f; + } + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + OverlayPanelManager panelManager = new OverlayPanelManager(); + mExpandPanel = new MockOverlayPanel(getInstrumentation().getTargetContext(), panelManager); + mNoExpandPanel = new NoExpandMockOverlayPanel(getInstrumentation().getTargetContext(), + panelManager); + } + + // Start OverlayPanelBase test suite. + + /** + * Tests that a panel with the EXPANDED state disabled and a lower movement threshold will move + * to the correct state based on current position and swipe velocity. + */ + @SmallTest + @Feature({"OverlayPanelBase"}) + public void testNonExpandingPanelMovesToCorrectState() { + final float threshold = mNoExpandPanel.getThresholdToNextState(); + final float height = MOCK_MAXIMIZED_HEIGHT - MOCK_PEEKED_HEIGHT; + final float peekToMaxBound = threshold * height + MOCK_PEEKED_HEIGHT; + final float maxToPeekBound = (1.0f - threshold) * height + MOCK_PEEKED_HEIGHT; + + // Between PEEKING and MAXIMIZED past the threshold in the up direction. + PanelState nextState = mNoExpandPanel.findNearestPanelStateFromHeight( + peekToMaxBound + 1, UPWARD_VELOCITY); + assertTrue(nextState == PanelState.MAXIMIZED); + + // Between PEEKING and MAXIMIZED before the threshold in the up direction. + nextState = mNoExpandPanel.findNearestPanelStateFromHeight( + peekToMaxBound - 1, UPWARD_VELOCITY); + assertTrue(nextState == PanelState.PEEKED); + + // Between PEEKING and MAXIMIZED before the threshold in the down direction. + nextState = mNoExpandPanel.findNearestPanelStateFromHeight( + maxToPeekBound + 1, DOWNWARD_VELOCITY); + assertTrue(nextState == PanelState.MAXIMIZED); + + // Between PEEKING and MAXIMIZED past the threshold in the down direction. + nextState = mNoExpandPanel.findNearestPanelStateFromHeight( + maxToPeekBound - 1, DOWNWARD_VELOCITY); + assertTrue(nextState == PanelState.PEEKED); + } + + /** + * Tests that a panel will move to the correct state based on current position and swipe + * velocity. + */ + @SmallTest + @Feature({"OverlayPanelBase"}) + public void testExpandingPanelMovesToCorrectState() { + final float threshold = mExpandPanel.getThresholdToNextState(); + final float peekToExpHeight = MOCK_EXPANDED_HEIGHT - MOCK_PEEKED_HEIGHT; + final float expToMaxHeight = MOCK_MAXIMIZED_HEIGHT - MOCK_EXPANDED_HEIGHT; + + // The boundry for moving to the next state will be different depending on the direction + // of the swipe and the threshold. In the default case, the threshold is 0.5, meaning the + // the panel must be half way to the next state in order to animate to it. In other cases + // where the threshold is 0.3, for example, the boundry will be closer to the top when + // swiping down and closer to the bottom when swiping up. Ultimately this means it will + // take less effort to swipe to a different state. + // NOTE(mdjones): Consider making these constants to exclude computation from these tests. + final float peekToExpBound = threshold * peekToExpHeight + MOCK_PEEKED_HEIGHT; + final float expToPeekBound = (1.0f - threshold) * peekToExpHeight + MOCK_PEEKED_HEIGHT; + final float expToMaxBound = threshold * expToMaxHeight + MOCK_EXPANDED_HEIGHT; + final float maxToExpBound = (1.0f - threshold) * expToMaxHeight + MOCK_EXPANDED_HEIGHT; + + // Between PEEKING and EXPANDED past the threshold in the up direction. + PanelState nextState = mExpandPanel.findNearestPanelStateFromHeight( + peekToExpBound + 1, UPWARD_VELOCITY); + assertTrue(nextState == PanelState.EXPANDED); + + // Between PEEKING and EXPANDED before the threshold in the up direction. + nextState = mExpandPanel.findNearestPanelStateFromHeight( + peekToExpBound - 1, UPWARD_VELOCITY); + assertTrue(nextState == PanelState.PEEKED); + + // Between PEEKING and EXPANDED before the threshold in the down direction. + nextState = mExpandPanel.findNearestPanelStateFromHeight( + expToPeekBound + 1, DOWNWARD_VELOCITY); + assertTrue(nextState == PanelState.EXPANDED); + + // Between PEEKING and EXPANDED past the threshold in the down direction. + nextState = mExpandPanel.findNearestPanelStateFromHeight( + expToPeekBound - 1, DOWNWARD_VELOCITY); + assertTrue(nextState == PanelState.PEEKED); + + // Between EXPANDED and MAXIMIZED past the threshold in the up direction. + nextState = mExpandPanel.findNearestPanelStateFromHeight( + expToMaxBound + 1, UPWARD_VELOCITY); + assertTrue(nextState == PanelState.MAXIMIZED); + + // Between EXPANDED and MAXIMIZED before the threshold in the up direction. + nextState = mExpandPanel.findNearestPanelStateFromHeight( + expToMaxBound - 1, UPWARD_VELOCITY); + assertTrue(nextState == PanelState.EXPANDED); + + // Between EXPANDED and MAXIMIZED past the threshold in the down direction. + nextState = mExpandPanel.findNearestPanelStateFromHeight( + maxToExpBound - 1, DOWNWARD_VELOCITY); + assertTrue(nextState == PanelState.EXPANDED); + + // Between EXPANDED and MAXIMIZED before the threshold in the down direction. + nextState = mExpandPanel.findNearestPanelStateFromHeight( + maxToExpBound + 1, DOWNWARD_VELOCITY); + assertTrue(nextState == PanelState.MAXIMIZED); + } + + /** + * Tests that a panel will be closed if the desired height is negative. + */ + @SmallTest + @Feature({"OverlayPanelBase"}) + public void testNegativeHeightClosesPanel() { + final float belowPeek = MOCK_PEEKED_HEIGHT - 1000; + + PanelState nextState = + mExpandPanel.findNearestPanelStateFromHeight(belowPeek, DOWNWARD_VELOCITY); + assertTrue(nextState == PanelState.CLOSED); + + nextState = mNoExpandPanel.findNearestPanelStateFromHeight(belowPeek, DOWNWARD_VELOCITY); + assertTrue(nextState == PanelState.CLOSED); + + // Make sure nothing bad happens if velocity is upward (this should never happen). + nextState = mExpandPanel.findNearestPanelStateFromHeight(belowPeek, UPWARD_VELOCITY); + assertTrue(nextState == PanelState.CLOSED); + + nextState = mNoExpandPanel.findNearestPanelStateFromHeight(belowPeek, UPWARD_VELOCITY); + assertTrue(nextState == PanelState.CLOSED); + } + + /** + * Tests that a panel is only maximized when desired height is far above the max. + */ + @SmallTest + @Feature({"OverlayPanelBase"}) + public void testLargeDesiredHeightIsMaximized() { + final float aboveMax = MOCK_MAXIMIZED_HEIGHT + 1000; + + PanelState nextState = + mExpandPanel.findNearestPanelStateFromHeight(aboveMax, UPWARD_VELOCITY); + assertTrue(nextState == PanelState.MAXIMIZED); + + nextState = mNoExpandPanel.findNearestPanelStateFromHeight(aboveMax, UPWARD_VELOCITY); + assertTrue(nextState == PanelState.MAXIMIZED); + + // Make sure nothing bad happens if velocity is downward (this should never happen). + nextState = mExpandPanel.findNearestPanelStateFromHeight(aboveMax, DOWNWARD_VELOCITY); + assertTrue(nextState == PanelState.MAXIMIZED); + + nextState = mNoExpandPanel.findNearestPanelStateFromHeight(aboveMax, DOWNWARD_VELOCITY); + assertTrue(nextState == PanelState.MAXIMIZED); + } +}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java index 56d5d0af..9259b74 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -16,6 +16,7 @@ import android.content.IntentFilter; import android.graphics.Point; import android.os.SystemClock; +import android.preference.PreferenceManager; import android.test.FlakyTest; import android.test.suitebuilder.annotation.SmallTest; import android.text.TextUtils; @@ -881,27 +882,15 @@ } /** - * Resets the tap counters on the UI thread. + * Resets all the counters used, by resetting all shared preferences. */ - private void resetCounters() throws InterruptedException { - ThreadUtils.runOnUiThread(new Runnable() { + private void resetCounters() { + ThreadUtils.runOnUiThreadBlocking(new Runnable() { @Override public void run() { - // The "Promo" tap counter is never reset outside of testing because it - // is used to persistently count the number of peeks *ever* seen by the user - // before the first open, and is then frozen in a disabled state to record that - // value rather than being reset. - // We reset it here to simulate a new user for our feature. - mPolicy.getPromoTapCounter().reset(); - mPolicy.resetCounters(); + PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().clear().apply(); } }); - CriteriaHelper.pollForCriteria(new Criteria() { - @Override - public boolean isSatisfied() { - return mPolicy.didResetCounters(); - } - }, TEST_TIMEOUT, DEFAULT_POLLING_INTERVAL); } /** @@ -1373,6 +1362,7 @@ (ChromeTabbedActivity) getActivity()); final Tab tab2 = TabModelUtils.getCurrentTab(getActivity().getCurrentTabModel()); + // TODO(donnd): consider using runOnUiThreadBlocking, won't need to waitForIdleSync? ThreadUtils.runOnUiThread(new Runnable() { @Override public void run() { @@ -1752,9 +1742,6 @@ * Tests the TapN-promo-limit feature, which disables the promo on tap after N taps if * the user has never ever opened the panel. Once the panel is opened, this limiting-feature * is permanently disabled. - * - * This test is very similar to an existing test for this same feature, so I'm proactively - * marking this as a FlakyTest too (since we're landing right before upstreaming). */ @SmallTest @Feature({"ContextualSearch"}) @@ -2105,13 +2092,10 @@ /** * Tests that long-press triggers the Peek Promo, and expanding the Panel dismisses it. - * - * Re-enable the test after fixing http://crbug.com/540820. - * @SmallTest - * @Feature({"ContextualSearch"}) */ + @SmallTest + @Feature({"ContextualSearch"}) @Restriction({RESTRICTION_TYPE_PHONE, RESTRICTION_TYPE_NON_LOW_END_DEVICE}) - @FlakyTest @CommandLineFlags.Add(ContextualSearchFieldTrial.PEEK_PROMO_ENABLED + "=true") public void testLongPressShowsPeekPromo() throws InterruptedException, TimeoutException { // Must be in undecided state in order to trigger the Peek Promo.
diff --git a/chrome/app/chrome_crash_reporter_client.cc b/chrome/app/chrome_crash_reporter_client.cc index 8c77d940..576961f 100644 --- a/chrome/app/chrome_crash_reporter_client.cc +++ b/chrome/app/chrome_crash_reporter_client.cc
@@ -162,7 +162,7 @@ Version update_version = GoogleUpdateSettings::GetGoogleUpdateVersion( !is_per_user_install); if (!update_version.IsValid() || - update_version.IsOlderThan(std::string(kMinUpdateVersion))) + update_version < base::Version(kMinUpdateVersion)) return false; return true;
diff --git a/chrome/app/nibs/MainMenu.xib b/chrome/app/nibs/MainMenu.xib index d44a34f..b4712f5 100644 --- a/chrome/app/nibs/MainMenu.xib +++ b/chrome/app/nibs/MainMenu.xib
@@ -349,7 +349,7 @@ <menuItem title="^IDS_ENTER_FULLSCREEN_MAC" tag="34030" keyEquivalent="f" id="692"> <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> <connections> - <action selector="commandDispatch:" target="-1" id="693"/> + <action selector="toggleFullScreen:" target="-1" id="693"/> </connections> </menuItem> <menuItem title="^IDS_TEXT_DEFAULT_MAC" tag="38002" keyEquivalent="0" id="460">
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index dad601c6..4c21f81d 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -3446,7 +3446,6 @@ <translation id="604001903249547235">የክላውድ ምትኬ</translation> <translation id="6040143037577758943">ዝጋ</translation> <translation id="604124094241169006">ራስ-ሰር</translation> -<translation id="6042308850641462728">ተጨማሪ</translation> <translation id="604257181445267932">Smart Lock Google ላይ ያስቀመጡትን የይለፍ ቃል በመጠቀም በፍጥነት ወደ መተግበሪዎች እና ጣቢያዎች እንዲገቡ ያግዘዎታል።</translation> <translation id="6049065490165456785">ፎቶ ከውስጣዊ ካሜራ</translation> <translation id="6051028581720248124">ወደ FedEx Office በማተም የእነሱን <ph name="START_LINK" />አገልግሎት ውል<ph name="END_LINK" /> ተቀብለዋል።</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index b4a236c8..6d119e1 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -3436,7 +3436,6 @@ <translation id="604001903249547235">النسخ الاحتياطي عبر السحاب.</translation> <translation id="6040143037577758943">إغلاق</translation> <translation id="604124094241169006">تلقائي</translation> -<translation id="6042308850641462728">المزيد</translation> <translation id="604257181445267932">يساعدك Smart Lock على تسجيل الدخول بسرعة إلى التطبيقات والمواقع باستخدام كلمات المرور التي حفظتها مع Google.</translation> <translation id="6049065490165456785">صور من الكاميرا الداخلية</translation> <translation id="6051028581720248124">من خلال الطباعة إلى مكتب FedEx، فإنك توافق على <ph name="START_LINK" />بنود الاستخدام<ph name="END_LINK" /> الخاصة بهم.</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index c3813c8..00ae2e9 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -3440,7 +3440,6 @@ <translation id="604001903249547235">Резервни копия в облака</translation> <translation id="6040143037577758943">Затваряне</translation> <translation id="604124094241169006">Автоматично</translation> -<translation id="6042308850641462728">Още</translation> <translation id="604257181445267932">Smart Lock ви помага да влизате бързо в приложения и сайтове посредством паролите, които сте запазили в Google.</translation> <translation id="6049065490165456785">Снимка от вътрешната камера</translation> <translation id="6051028581720248124">С отпечатването в офис на FedEx приемате <ph name="START_LINK" />общите условия<ph name="END_LINK" /> на компанията.</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 42c4330..98412ed 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -290,7 +290,7 @@ <translation id="1429740407920618615">সংকেত ক্ষমতা:</translation> <translation id="143027896309062157">আপনার কম্পিউটারে সব ডেটা এবং আপনার পরিদর্শন করা ওয়েবসাইটগুলি পড়ুন এবং পরিবর্তন করুন</translation> <translation id="1430915738399379752">মুদ্রণ</translation> -<translation id="1434696352799406980">এটি আপনার শুরুর পৃষ্ঠা, নতুন ট্যাব পৃষ্ঠা, সার্চ ইঞ্জিন, এবং পিন হওয়া ট্যাবগুলি পুনরায় সেট করবে। এছাড়াও এটি সকল এক্সটেনশান অক্ষম করবে এবং কুকিজের মতো অস্থায়ী ডেটা সাফ করবে। আপনার বুকমার্ক, ইতিহাস এবং সংরক্ষিত পাসওয়ার্ডগুলি সাফ করা হবে না।</translation> +<translation id="1434696352799406980">এটি আপনার শুরুর পৃষ্ঠা, নতুন ট্যাব পৃষ্ঠা, সার্চ ইঞ্জিন, এবং পিন হওয়া ট্যাবগুলি পুনরায় সেট করবে। এছাড়াও এটি সব কটি এক্সটেনশান অক্ষম করবে এবং কুকিজের মতো অস্থায়ী ডেটা সাফ করবে। আপনার বুকমার্ক, ইতিহাস এবং সংরক্ষিত পাসওয়ার্ডগুলি সাফ করা হবে না।</translation> <translation id="1434886155212424586">হোমপেজ হল নতুন ট্যাব পৃষ্ঠা</translation> <translation id="1435550882135542937">এক্সটেনশান সরঞ্জামদন্ডের পুনঃডিজাইন</translation> <translation id="1436784010935106834">সরানো হয়েছে</translation> @@ -3435,7 +3435,6 @@ <translation id="604001903249547235">ক্লাউড ব্যাকআপ</translation> <translation id="6040143037577758943">বন্ধ</translation> <translation id="604124094241169006">স্বয়ংক্রিয়</translation> -<translation id="6042308850641462728">আরো</translation> <translation id="604257181445267932">Smart Lock আপনাকে Google এর মাধ্যমে আপনি সংরক্ষণ করেছেন এমন পাসওয়ার্ডগুলি ব্যবহার করে অ্যাপ্লিকেশান ও সাইটগুলিতে সাইন ইন করতে সাহায্য করে।</translation> <translation id="6049065490165456785">অভ্যন্তরীণ ক্যামেরা থেকে ফটো</translation> <translation id="6051028581720248124">FedEx Office মুদ্রণের দ্বারা, আপনি তাদের <ph name="START_LINK" />ব্যবহারের শর্তাদিতে <ph name="END_LINK" /> সম্মত হন৷</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 615c683..87fba969 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -2589,7 +2589,7 @@ <translation id="4791148004876134991">Canvia el comportament de Cmd+` quan s'activa una aplicació de Chrome. Si s'activa aquesta opció, les Aplicacions de Chrome no es processaran quan es premi Cmd+` des d'una finestra del navegador, i les finestres del navegador no es processaran quan hi hagi una aplicació de Chrome activa.</translation> <translation id="4792711294155034829">&Informa d'un problema...</translation> <translation id="479280082949089240">Galetes emmagatzemades per aquesta pàgina</translation> -<translation id="4793866834012505469">Restableix el model de veu</translation> +<translation id="4793866834012505469">Torna a entrenar el model de veu</translation> <translation id="479536056609751218">Pàgina web, només HTML</translation> <translation id="479989351350248267">cerca</translation> <translation id="4801257000660565496">Creació de dreceres a aplicacions</translation> @@ -3192,7 +3192,7 @@ <translation id="5669267381087807207">S'està activant</translation> <translation id="5669462439438204699">Desa la targeta de crèdit</translation> <translation id="5671961047338275645">Gestió dels llocs</translation> -<translation id="5675224880872496917">Anima suaument en desplaçar-se pel contingut de la pàgina.</translation> +<translation id="5675224880872496917">Mostra una animació harmoniosa en desplaçar-se pel contingut de la pàgina.</translation> <translation id="5676267133227121599">Accediu a totes les contrasenyes des de qualsevol dispositiu a <ph name="MANAGEMENT_LINK" />.</translation> <translation id="5677503058916217575">Idioma de la pàgina:</translation> <translation id="5677928146339483299">Bloquejat</translation> @@ -3439,7 +3439,6 @@ <translation id="604001903249547235">Còpia de seguretat a Cloud</translation> <translation id="6040143037577758943">Tanca</translation> <translation id="604124094241169006">Automàtic</translation> -<translation id="6042308850641462728">Més</translation> <translation id="604257181445267932">Smart Lock serveix per iniciar la sessió ràpidament a les aplicacions i als llocs amb contrasenyes que hàgiu desat a Google.</translation> <translation id="6049065490165456785">Foto de la càmera interna</translation> <translation id="6051028581720248124">En imprimir a FedEx Office, accepteu les seves <ph name="START_LINK" />condicions del servei<ph name="END_LINK" />.</translation> @@ -4605,7 +4604,7 @@ <translation id="7892500982332576204">Detecció de comptes secundaris</translation> <translation id="7893008570150657497">Accedir a fotos, a música i a d'altres elements multimèdia de l'equip</translation> <translation id="7893393459573308604"><ph name="ENGINE_NAME" /> (Predeterminada)</translation> -<translation id="7894616681410591072">Necessiteu que <ph name="NAME" /> us doni permís per accedir a aquesta pàgina.</translation> +<translation id="7894616681410591072"><ph name="NAME" /> us ha de donar permís per accedir a aquesta pàgina.</translation> <translation id="78957024357676568">esquerra</translation> <translation id="7896906914454843592">Teclat nord-americà ampliat</translation> <translation id="7897900149154324287">La propera vegada, assegureu-vos d'expulsar el dispositiu extraïble des de l'aplicació Fitxers abans de desconnectar-lo si no en voleu perdre les dades.</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index dffc31e..1607780 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -3436,7 +3436,6 @@ <translation id="604001903249547235">Zálohování do cloudu</translation> <translation id="6040143037577758943">Zavřít</translation> <translation id="604124094241169006">Automaticky</translation> -<translation id="6042308850641462728">Více</translation> <translation id="604257181445267932">Funkce Smart Lock usnadňuje rychlé přihlášení k aplikacím a stránkám pomocí hesel, které jste na Googlu uložili.</translation> <translation id="6049065490165456785">Fotka z interního fotoaparátu</translation> <translation id="6051028581720248124">Pokud budete tisknout v pobočce společnosti FedEx, přijímáte její <ph name="START_LINK" />smluvní podmínky<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 5cf78e5..53604e70 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -290,7 +290,7 @@ <translation id="1429740407920618615">Signalstyrke:</translation> <translation id="143027896309062157">Læse og redigere alle dine data på din computer og de websites, du besøger</translation> <translation id="1430915738399379752">Udskriv</translation> -<translation id="1434696352799406980">Denne funktion nulstiller din opstartsside, siden Ny fane, din søgemaskine og dine fastgjorte faner. Den deaktiverer også alle udvidelser og rydder midlertidige data såsom cookies. Dine bogmærker, din historik og dine gemte adgangskoder slettes ikke.</translation> +<translation id="1434696352799406980">Denne funktion nulstiller din opstartsside, siden Ny fane, din søgemaskine og dine fastgjorte faner. Den deaktiverer også alle udvidelser og rydder midlertidige data, såsom cookies. Dine bogmærker, din historik og dine gemte adgangskoder slettes ikke.</translation> <translation id="1434886155212424586">Startsiden er siden Ny fane</translation> <translation id="1435550882135542937">Nyt design af udvidelsesværktøjslinjen</translation> <translation id="1436784010935106834">Fjernet</translation> @@ -1721,7 +1721,7 @@ <translation id="3460771772332290399">Tilstanden Offline automatisk genindlæsning</translation> <translation id="3462413494201477527">Vil du annullere konfigurationen af kontoen?</translation> <translation id="346431825526753">Dette er en børnekonto, som administreres af <ph name="CUSTODIAN_EMAIL" />.</translation> -<translation id="3464726836683998962">Deaktiver dataroaming for mobil</translation> +<translation id="3464726836683998962">Deaktiver mobildataroaming</translation> <translation id="3465566417615315331">Klik på dit foto</translation> <translation id="3466147780910026086">Din medieenhed scannes...</translation> <translation id="3467267818798281173">Bed Google om forslag</translation> @@ -3439,7 +3439,6 @@ <translation id="604001903249547235">Sikkerhedskopiering i skyen</translation> <translation id="6040143037577758943">Luk</translation> <translation id="604124094241169006">Automatisk</translation> -<translation id="6042308850641462728">Mere</translation> <translation id="604257181445267932">Med Smart Lock kan du hurtigt logge ind på apps og websites, der anvender adgangskoder, du har gemt med Google.</translation> <translation id="6049065490165456785">Billede fra internt kamera</translation> <translation id="6051028581720248124">Ved udskrivning til FedEx Office accepterer du deres <ph name="START_LINK" />servicevilkår<ph name="END_LINK" />.</translation> @@ -3510,7 +3509,7 @@ <translation id="6144890426075165477"><ph name="PRODUCT_NAME" /> er i øjeblikket ikke din standardbrowser.</translation> <translation id="6147020289383635445">Visning af udskrift mislykkedes.</translation> <translation id="614998064310228828">Enhedsmodel:</translation> -<translation id="6150607114729249911">Ups! Du er nødt til at spørge dine forældre, om det er i orden, at du åbner denne side.</translation> +<translation id="6150607114729249911">Ups! Du er nødt til at spørge dine forældre, om det er i orden, at du åbner dette website.</translation> <translation id="6150853954427645995">Hvis du vil gemme denne fil til offlinebrug, skal du gå online igen, højreklikke på filerne og vælge indstillingen <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> <translation id="6151323131516309312">Tryk på <ph name="SEARCH_KEY" /> for at søge på <ph name="SITE_NAME" /></translation> <translation id="6154697846084421647">Logget ind</translation> @@ -4191,7 +4190,7 @@ <translation id="7224023051066864079">Undernetmaske:</translation> <translation id="7225179976675429563">Netværkstype mangler</translation> <translation id="7231224339346098802">Brug et tal til at angive, hvor mange kopier der skal udskrives (én eller flere).</translation> -<translation id="7231308970288859235">Ups! Du skal spørge en af dine forældre, om det er i orden, at du besøger denne side.</translation> +<translation id="7231308970288859235">Ups! Du skal spørge en af dine forældre, om det er i orden, at du besøger dette website.</translation> <translation id="7238585580608191973">SHA-256-fingeraftryk</translation> <translation id="7240120331469437312">Alternativt navn på certifikatemne</translation> <translation id="7241389281993241388">Log ind på <ph name="TOKEN_NAME" /> for at importere klientcertifikatet.</translation> @@ -4614,7 +4613,7 @@ <translation id="7892500982332576204">Registrering af underkonti</translation> <translation id="7893008570150657497">Få adgang til billeder, musik og andre medier fra din computer</translation> <translation id="7893393459573308604"><ph name="ENGINE_NAME" /> (Standard)</translation> -<translation id="7894616681410591072">Ups! Du skal have tilladelse fra <ph name="NAME" /> for at få adgang til denne side.</translation> +<translation id="7894616681410591072">Ups! Du skal have tilladelse fra <ph name="NAME" /> for at få adgang til dette website.</translation> <translation id="78957024357676568">venstre</translation> <translation id="7896906914454843592">Udvidet amerikansk tastatur</translation> <translation id="7897900149154324287">For fremtiden skal du sørge for at skubbe din flytbare enhed ud i appen Filer, før du kobler den fra. Hvis ikke du gør dette, kan du risikere at miste data.</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index cac8313..39cfce2 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -3435,7 +3435,6 @@ <translation id="604001903249547235">Cloud-Sicherung</translation> <translation id="6040143037577758943">Schließen</translation> <translation id="604124094241169006">Automatisch</translation> -<translation id="6042308850641462728">Mehr</translation> <translation id="604257181445267932">Über Smart Lock können Sie sich mit Passwörtern, die Sie bei Google gespeichert haben, schnell in Apps und Websites anmelden.</translation> <translation id="6049065490165456785">Foto von interner Kamera</translation> <translation id="6051028581720248124">Durch das Drucken über FedEx Office akzeptieren Sie deren <ph name="START_LINK" />Nutzungsbedingungen<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index f28a30f..f963f97b 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -3460,7 +3460,6 @@ <translation id="604001903249547235">Αντίγραφο ασφαλείας στο cloud</translation> <translation id="6040143037577758943">Κλείσιμο</translation> <translation id="604124094241169006">Αυτόματη</translation> -<translation id="6042308850641462728">Περισσότερα</translation> <translation id="604257181445267932">Το Smart Lock σας βοηθά να συνδεθείτε γρήγορα σε εφαρμογές και ιστότοπους που χρησιμοποιούν κωδικούς πρόσβασης που έχετε αποθηκεύσει στο Google.</translation> <translation id="6049065490165456785">Φωτογραφία από την εσωτερική φωτογραφική μηχανή</translation> <translation id="6051028581720248124">Πραγματοποιώντας εκτύπωση στο FedEx Office, αποδέχεστε τους αντίστοιχους <ph name="START_LINK" />όρους παροχής υπρεσιών<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index f8c1564..e26e651f 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -3447,7 +3447,6 @@ <translation id="604001903249547235">Cloud backup</translation> <translation id="6040143037577758943">Close</translation> <translation id="604124094241169006">Automatic</translation> -<translation id="6042308850641462728">More</translation> <translation id="604257181445267932">Smart Lock helps you quickly sign in to apps and sites using passwords you have saved with Google.</translation> <translation id="6049065490165456785">Photo from internal camera</translation> <translation id="6051028581720248124">By printing to FedEx Office, you accept their <ph name="START_LINK" />terms of use<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 5c6d7e7a0..85ee42c 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -290,7 +290,7 @@ <translation id="1429740407920618615">Intensidad de la señal:</translation> <translation id="143027896309062157">Leer y cambiar todos los datos de la computadora y los sitios web que visites</translation> <translation id="1430915738399379752">Imprimir</translation> -<translation id="1434696352799406980">Esta acción restablecerá la página de inicio, la página Nueva pestaña, el motor de búsqueda y las pestañas fijas. Además, inhabilitará todas las extensiones y borrará datos temporales, como las cookies. No se borrarán tus marcadores, historial y contraseñas guardadas.</translation> +<translation id="1434696352799406980">Esta acción restablecerá la página de inicio, la página Nueva pestaña, el motor de búsqueda y las pestañas fijas. Además, inhabilitará todas las extensiones y borrará datos temporales, como las cookies. No se borrarán tus marcadores, historial ni contraseñas guardadas.</translation> <translation id="1434886155212424586">La página Nueva pestaña es la nueva página principal.</translation> <translation id="1435550882135542937">Nuevo diseño de la barra de herramientas de extensiones</translation> <translation id="1436784010935106834">Eliminado</translation> @@ -316,7 +316,7 @@ <translation id="1467432559032391204">Izquierda</translation> <translation id="1467999917853307373"><ph name="URL" /> quiere almacenar datos de forma permanente en el dispositivo.</translation> <translation id="1468038450257740950">WebGL no es compatible.</translation> -<translation id="1469042717030597817">Si esta opción está habilitada, las pestañas se descartarán automáticamente de la memoria cuando la memoria del sistema sea baja. Las pestañas descartadas siguen siendo visibles en la barra de pestañas y se vuelven a cargar cuando haces clic. Puedes encontrar información acerca de pestañas descartadas en chrome://discards.</translation> +<translation id="1469042717030597817">Si esta opción está habilitada, las pestañas se descartarán automáticamente de la memoria cuando la memoria del sistema sea baja. Las pestañas descartadas siguen siendo visibles en la barra de pestañas y se vuelven a cargar cuando haces clic en ellas. Puedes encontrar información acerca de pestañas descartadas en chrome://discards.</translation> <translation id="1470719357688513792">La nueva configuración de cookie se hará efectiva cuando vuelvas a cargar la página.</translation> <translation id="1470811252759861213">Para usar tus extensiones en todas tus computadoras, <ph name="SIGN_IN_LINK" />.</translation> <translation id="14720830734893704">Permite habilitar la compatibilidad con el teclado virtual.</translation> @@ -1005,7 +1005,7 @@ <translation id="2482081114970574549">Utiliza un flujo de acceso basado en marcos flotantes en vez de un flujo basado en la vista web.</translation> <translation id="2482878487686419369">Notificaciones</translation> <translation id="2485056306054380289">Certificado CA del servidor:</translation> -<translation id="2487915095798731898">Participar</translation> +<translation id="2487915095798731898">Unirse</translation> <translation id="2489316678672211764">Uno de los complementos (<ph name="PLUGIN_NAME" />) no responde.</translation> <translation id="2489428929217601177">el último día</translation> <translation id="2489435327075806094">Velocidad del puntero</translation> @@ -3194,7 +3194,7 @@ <translation id="5669267381087807207">Activando</translation> <translation id="5669462439438204699">Guardar la tarjeta de crédito</translation> <translation id="5671961047338275645">Administrar sitios</translation> -<translation id="5675224880872496917">Anima suavemente al desplazarte por el contenido de la página.</translation> +<translation id="5675224880872496917">Se muestra una animación suave al desplazarte por el contenido de la página.</translation> <translation id="5676267133227121599">Accede a tus contraseñas desde cualquier dispositivo en <ph name="MANAGEMENT_LINK" />.</translation> <translation id="5677503058916217575">Idioma de la página:</translation> <translation id="5677928146339483299">Bloqueado</translation> @@ -3440,7 +3440,6 @@ <translation id="604001903249547235">Copia de seguridad en la nube</translation> <translation id="6040143037577758943">Cerrar</translation> <translation id="604124094241169006">Automático</translation> -<translation id="6042308850641462728">Más</translation> <translation id="604257181445267932">Smart Lock te ayuda a acceder rápidamente a aplicaciones y sitios con las contraseñas que hayas guardado en Google.</translation> <translation id="6049065490165456785">Foto de la cámara interna</translation> <translation id="6051028581720248124">Al imprimir en una sucursal de FedEx Office, aceptas sus <ph name="START_LINK" />condiciones de uso<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 9476baa..e5f8578 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -2593,7 +2593,7 @@ <translation id="4791148004876134991">Cambia el comportamiento de Cmd+ cuando se activa una aplicación de Chrome. Cuando se habilita, las aplicaciones de Chrome no rotan cuando se pulsa Cmd+ desde una ventana del navegador y las ventanas del navegador no rotan cuando una aplicación de Chrome está activa.</translation> <translation id="4792711294155034829">&Notificar un error...</translation> <translation id="479280082949089240">Cookies almacenadas por esta página</translation> -<translation id="4793866834012505469">Restablecer modelo de voz</translation> +<translation id="4793866834012505469">Volver a entrenar el modelo de voz</translation> <translation id="479536056609751218">Página web (solo HTML)</translation> <translation id="479989351350248267">buscar</translation> <translation id="4801257000660565496">Crear accesos directos a aplicaciones</translation> @@ -3441,7 +3441,6 @@ <translation id="604001903249547235">Copia de seguridad en la nube</translation> <translation id="6040143037577758943">Cerrar</translation> <translation id="604124094241169006">Automático</translation> -<translation id="6042308850641462728">Más</translation> <translation id="604257181445267932">Smart Lock te ayuda a iniciar sesión rápidamente en aplicaciones y sitios web con contraseñas que hayas guardado en Google.</translation> <translation id="6049065490165456785">Foto de cámara interna</translation> <translation id="6051028581720248124">Al imprimir en un establecimiento FedEx Office, aceptas sus <ph name="START_LINK" />condiciones de uso<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index f3ef872..d3bfd41 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -3446,7 +3446,6 @@ <translation id="604001903249547235">Pilvepõhine varundus</translation> <translation id="6040143037577758943">Sule</translation> <translation id="604124094241169006">Automaatne</translation> -<translation id="6042308850641462728">Rohkem</translation> <translation id="604257181445267932">Smart Lock aitab teil rakendustesse ja saitidele kiiresti sisse logida paroolidega, mille olete Google’i kontole salvestanud.</translation> <translation id="6049065490165456785">Foto sisemisest kaamerast</translation> <translation id="6051028581720248124">FedEx Office'i kaudu printides nõustute nende <ph name="START_LINK" />kasutustingimustega<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index bd085a2..34426bb 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -3440,7 +3440,6 @@ <translation id="604001903249547235">پشتیبانگیری Cloud</translation> <translation id="6040143037577758943">بستن</translation> <translation id="604124094241169006">خودکار</translation> -<translation id="6042308850641462728">بیشتر</translation> <translation id="604257181445267932">Smart Lock به شما کمک میکند با استفاده از گذرواژههایی که با Google ذخیره کردهاید، سریع به سیستم برنامهها و سایتها وارد شوید.</translation> <translation id="6049065490165456785">عکس از دوربین داخلی</translation> <translation id="6051028581720248124">با چاپ در دفتر FedEx شما <ph name="START_LINK" />شرایط استفاده<ph name="END_LINK" /> آنها را میپذیرید.</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index f5cf846..f09ab5f 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -3433,7 +3433,6 @@ <translation id="604001903249547235">Pilvivarmuuskopiointi</translation> <translation id="6040143037577758943">Sulje</translation> <translation id="604124094241169006">Automaattinen</translation> -<translation id="6042308850641462728">Lisää</translation> <translation id="604257181445267932">Smart Lockin avulla voit kirjautua nopeasti sovelluksiin ja sivustoille, joiden salasanat olet tallentanut Googleen.</translation> <translation id="6049065490165456785">Kuva laitteen kamerasta</translation> <translation id="6051028581720248124">Käyttämällä FedEx Office -palvelua hyväksyt sen <ph name="START_LINK" />käyttöehdot<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index cdb3f1a0..bb9df280 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -3450,7 +3450,6 @@ <translation id="604001903249547235">Pag-back up sa Cloud</translation> <translation id="6040143037577758943">Isara</translation> <translation id="604124094241169006">Awtomatiko</translation> -<translation id="6042308850641462728">Higit pa</translation> <translation id="604257181445267932">Nakakatulong sa iyo ang Smart Lock na mabilisang mag-sign in sa mga app at site gamit ang mga password na na-save mo sa Google.</translation> <translation id="6049065490165456785">Larawan mula sa panloob na camera</translation> <translation id="6051028581720248124">Sa pamamagitan ng pag-print sa FedEx Office, tinatanggap mo ang kanilang <ph name="START_LINK" />mga tuntunin ng paggamit<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index e77e6952..7b07a5ac 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -3446,7 +3446,6 @@ <translation id="604001903249547235">Sauvegarde Cloud</translation> <translation id="6040143037577758943">Fermer</translation> <translation id="604124094241169006">Automatique</translation> -<translation id="6042308850641462728">Plus</translation> <translation id="604257181445267932">Smart Lock vous permet de vous connecter rapidement à des applications et à des sites au moyen de mots de passe que vous avez enregistrés sur Google.</translation> <translation id="6049065490165456785">Photo d'un appareil photo interne</translation> <translation id="6051028581720248124">En imprimant votre document dans une agence FedEx, vous acceptez leurs <ph name="START_LINK" />Conditions d'utilisation<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index ec843a1..a607d713 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -2693,7 +2693,7 @@ <translation id="4927301649992043040">પૅક એક્સ્ટેંશન</translation> <translation id="4927753642311223124">અહીં જોવા માટે કંઈ નથી, આગળ વધો.</translation> <translation id="4929925845384605079">શેલ્ફ બેનર્સમાં ઉમેરવાના પ્રદર્શનને સક્ષમ કરો, જે કોઈ વપરાશકર્તાને તેમના શેલ્ફમાં વેબ એપ્લિકેશન અથવા અન્ય પ્લેટફોર્મ-વિશિષ્ટ સમકક્ષ ઉમેરવા માટે સંકેત કરે છે.</translation> -<translation id="4930497775425430760">તમે આ સંદેશ જોઇ રહ્યાં છો કારણ કે નવી સાઇટ્સની તમારી પ્રથમ મુલાકાત પર તમારા માતા/પિતાએ મંજૂરી આપવી જરૂરી છે.</translation> +<translation id="4930497775425430760">તમે આ સંદેશ જોઇ રહ્યાં છો કારણ કે નવી સાઇટ્સની તમારી પ્રથમ મુલાકાત પર તમારા માતાપિતાએ મંજૂરી આપવી જરૂરી છે.</translation> <translation id="4933484234309072027"><ph name="URL" /> પર એમ્બેડ કર્યું</translation> <translation id="493571969993549666">નિરીક્ષિત વપરાશકર્તા ઉમેરો</translation> <translation id="4938972461544498524">ટચપૅડ સેટિંગ્સ</translation> @@ -3439,7 +3439,6 @@ <translation id="604001903249547235">મેઘ બેકઅપ</translation> <translation id="6040143037577758943">બંધ કરો</translation> <translation id="604124094241169006">સ્વચલિત</translation> -<translation id="6042308850641462728">વધુ</translation> <translation id="604257181445267932">Smart Lock તમને તમે Google પર સાચવેલા પાસવર્ડ્સનો ઉપયોગ કરીને ઍપ્લિકેશનો અને સાઇટ્સ પર ઝડપથી સાઇન ઇન કરવામાં સહાય કરે છે.</translation> <translation id="6049065490165456785">આંતરિક કૅમેરાથી ફોટો</translation> <translation id="6051028581720248124">FedEx Office પર પ્રિંટ કરીને, તમે તેમની <ph name="START_LINK" />ઉપયોગની શરતો<ph name="END_LINK" />ને સ્વીકારો છો.</translation> @@ -4192,7 +4191,7 @@ <translation id="7224023051066864079">સબનેટ માસ્ક:</translation> <translation id="7225179976675429563">નેટવર્ક પ્રકાર ખૂટે છે</translation> <translation id="7231224339346098802">કેટલી કૉપિ છાપવાની છે તે દર્શાવવા માટે સંખ્યાનો ઉપયોગ કરો (1 અથવા વધુ).</translation> -<translation id="7231308970288859235">અરેરે! તમે આ પૃષ્ઠની મુલાકાત લો છો તે ઠીક છે કે કેમ તે તમારે તમારા માતા/પિતાને પૂછવાની જરૂર છે.</translation> +<translation id="7231308970288859235">અરેરે! તમે આ પૃષ્ઠની મુલાકાત લો છો તે ઠીક છે કે કેમ તે તમારે તમારા માતાપિતાને પૂછવાની જરૂર છે.</translation> <translation id="7238585580608191973">SHA-256 ફિંગરપ્રિંટ</translation> <translation id="7240120331469437312">પ્રમાણપત્ર વિષય વૈકલ્પિક નામ</translation> <translation id="7241389281993241388">ક્લાયંટ પ્રમાણપત્ર આયાત કરવા માટે કૃપા કરીને <ph name="TOKEN_NAME" /> પર સાઇન ઇન કરો.</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index d87fbea..a7420ee 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -3445,7 +3445,6 @@ <translation id="604001903249547235">क्लाउड बैकअप</translation> <translation id="6040143037577758943">बंद करें</translation> <translation id="604124094241169006">स्वचालित</translation> -<translation id="6042308850641462728">अधिक</translation> <translation id="604257181445267932">Smart Lock उन ऐप्स और साइटों में तेज़ी से प्रवेश करने में आपकी सहायता करता है जो आपके द्वारा Google के साथ सहेजे गए पासवर्ड का उपयोग करते हैं.</translation> <translation id="6049065490165456785">आंतरिक कैमरे का फ़ोटो</translation> <translation id="6051028581720248124">FedEx Office पर प्रिंट करके, आप उनकी <ph name="START_LINK" />उपयोग की शर्तों<ph name="END_LINK" /> को स्वीकार करते हैं.</translation> @@ -3919,7 +3918,7 @@ <translation id="6809448577646370871">Chrome ऐप्स के लिए कस्टम विंडो चक्रण.</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> को रूट की तरह नहीं चलाया जा सकता.</translation> <translation id="6812841287760418429">बदलावों को बनाए रखें</translation> -<translation id="6814124696888326520">इनपुट पद्धतियों को आसानी से स्विच करने और अधिक इनपुट सुविधाओं के एक्सेस के लिए: ध्वनि इनपुट, हस्तलेखन और इमोजी.</translation> +<translation id="6814124696888326520">इनपुट पद्धतियों को आसानी से बदलने और अधिक इनपुट सुविधाओं के एक्सेस के लिए: ध्वनि इनपुट, हस्तलेखन और इमोजी.</translation> <translation id="6815206662964743929">उपयोगकर्ता स्विच करें</translation> <translation id="6815353853907306610"><ph name="IDS_SHORT_PRODUCT_NAME" /> को पता चला है कि संभवतः आपके ब्राउज़र की सेटिंग आपकी जानकारी के बिना बदल दी गई हैं. क्या आप उन्हें उनके मूल डिफ़ॉल्ट पर रीसेट करना चाहते हैं?</translation> <translation id="6815551780062710681">संपादित करें</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 2d8692e..96af7bf 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -3443,7 +3443,6 @@ <translation id="604001903249547235">Sigurnosno kopiranje u oblaku</translation> <translation id="6040143037577758943">Zatvori</translation> <translation id="604124094241169006">Automatski</translation> -<translation id="6042308850641462728">Više</translation> <translation id="604257181445267932">Smart Lock omogućuje brzu prijavu u aplikacije i na web-lokacije pomoću zaporki koje ste spremili na Google.</translation> <translation id="6049065490165456785">Fotografija iz internog fotoaparata</translation> <translation id="6051028581720248124">Ispisom putem usluge FedEx Office prihvaćate njene <ph name="START_LINK" />uvjete pružanja usluge<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 3eda9038..4f27e0871 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -290,7 +290,7 @@ <translation id="1429740407920618615">Jelerősség:</translation> <translation id="143027896309062157">A számítógépén és az Ön által felkeresett webhelyeken lévő adatainak olvasása és módosítása</translation> <translation id="1430915738399379752">Nyomtatás</translation> -<translation id="1434696352799406980">Ez a művelet visszaállítja a kezdőoldalt, az új lap oldalt, a keresőmotort és a rögzített lapokat. Kikapcsol továbbá minden bővítményt, és törli az ideiglenes adatokat, például a cookie-kat. Könyvjelzői, előzményei és mentett jelszavai nem törlődnek.</translation> +<translation id="1434696352799406980">Ez a művelet visszaállítja a kezdőoldalt, az új lap oldalt, a keresőmotort és a rögzített lapokat. Kikapcsol továbbá minden bővítményt, és törli az ideiglenes adatokat, például a cookie-kat. Könyvjelzői, előzményei és mentett jelszavai megmaradnak.</translation> <translation id="1434886155212424586">Az Új lap oldal a kezdőoldal</translation> <translation id="1435550882135542937">Új kialakítású eszköztár</translation> <translation id="1436784010935106834">Eltávolítva</translation> @@ -3444,7 +3444,6 @@ <translation id="604001903249547235">Biztonsági mentés a felhőbe</translation> <translation id="6040143037577758943">Bezárás</translation> <translation id="604124094241169006">Automatikus</translation> -<translation id="6042308850641462728">Hosszabban</translation> <translation id="604257181445267932">A Smart Lock segítségével gyorsan beléphet különféle alkalmazásokba és webhelyekre a Google rendszerében mentett jelszavakkal.</translation> <translation id="6049065490165456785">Fotó a belső kamerával</translation> <translation id="6051028581720248124">A FedEx Office üzletben történő nyomtatással elfogadja az ő <ph name="START_LINK" />felhasználási feltételeiket<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 63e2dc0d..c91d6cd7 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -3444,7 +3444,6 @@ <translation id="604001903249547235">Cadangan Awan</translation> <translation id="6040143037577758943">Tutup</translation> <translation id="604124094241169006">Otomatis</translation> -<translation id="6042308850641462728">Lainnya</translation> <translation id="604257181445267932">Smart Lock membantu Anda masuk ke aplikasi dan situs dengan cepat menggunakan sandi yang telah disimpan dengan Google.</translation> <translation id="6049065490165456785">Foto dari kamera internal</translation> <translation id="6051028581720248124">Dengan mencetak ke Kantor FedEx, Anda menyetujui <ph name="START_LINK" />persyaratan penggunaan<ph name="END_LINK" /> mereka.</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 2546d8c..d4b7268 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -505,7 +505,7 @@ <translation id="1702534956030472451">Europa occidentale</translation> <translation id="1702987929180449188">Quando l'opzione è attiva, la barra degli strumenti non viene mai nascosta quando viene eseguito lo scorrimento su dispositivi con schermo di dimensioni minime pari a dp >= 800. La barra continuerà a essere nascosta se i contenuti della pagina vengono mostrati a schermo intero.</translation> <translation id="1707463636381878959">Condividi questa rete con altri utenti</translation> -<translation id="1708199901407471282">Se apri una pagina web suggerita dalla pagina Nuova scheda ed è già aperta una scheda relativa al suggerimento, il suggerimento non viene caricato nella nuova scheda, ma viene attivata la scheda aperta.</translation> +<translation id="1708199901407471282">Se apri una pagina web suggerita dalla pagina Nuova scheda ed è già aperta una scheda relativa al suggerimento, quest'ultimo non viene caricato nella nuova scheda, ma viene attivata la scheda aperta.</translation> <translation id="1708338024780164500">(Non attiva)</translation> <translation id="1711973684025117106">Compressione non riuscita. Errore imprevisto: $1</translation> <translation id="1715941336038158809">Password o nome utente non valido.</translation> @@ -3437,7 +3437,6 @@ <translation id="604001903249547235">Backup nella cloud</translation> <translation id="6040143037577758943">Chiudi</translation> <translation id="604124094241169006">Automatica</translation> -<translation id="6042308850641462728">Più</translation> <translation id="604257181445267932">Smart Lock ti aiuta ad accedere rapidamente ad app e siti utilizzando le password che hai salvato con Google.</translation> <translation id="6049065490165456785">Foto dalla fotocamera interna</translation> <translation id="6051028581720248124">Se stampi presso una sede FedEx Office, accetti i relativi <ph name="START_LINK" />termini e condizioni d'uso<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 9eb44477..e2de5546 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -2687,7 +2687,7 @@ <translation id="4927301649992043040">ארוז תוסף</translation> <translation id="4927753642311223124">אין התראות להצגה, המשך הלאה.</translation> <translation id="4929925845384605079">הפעלת התצוגה של מודעות באנר להוספה למדף, המנחות את המשתמש להוסיף אפליקציית אינטרנט למדף או אפליקצייה שוות ערך אחרת של פלטפורמה ספציפית.</translation> -<translation id="4930497775425430760">אתה רואה את ההודעה הזו מפני שההורה שלך צריך לאשר אתרים חדשים עם הביקור הראשון שלך.</translation> +<translation id="4930497775425430760">אתה רואה את ההודעה הזו מפני שההורה שלך צריך לאשר אתרים חדשים בביקור הראשון שלך.</translation> <translation id="4933484234309072027">מוטבע ב-<ph name="URL" /></translation> <translation id="493571969993549666">הוסף משתמש בפיקוח</translation> <translation id="4938972461544498524">הגדרות לוח מגע</translation> @@ -3188,7 +3188,7 @@ <translation id="5669267381087807207">מפעיל</translation> <translation id="5669462439438204699">שמירת כרטיס אשראי</translation> <translation id="5671961047338275645">ניהול אתרים</translation> -<translation id="5675224880872496917">מעבר חלק בעת גלילת תוכן הדף.</translation> +<translation id="5675224880872496917">מעבר חלק כשגוללים את תוכן הדף.</translation> <translation id="5676267133227121599">גש לסיסמאות שלך מכל מכשיר ב-<ph name="MANAGEMENT_LINK" />.</translation> <translation id="5677503058916217575">שפת הדף:</translation> <translation id="5677928146339483299">במצב חסום</translation> @@ -3434,7 +3434,6 @@ <translation id="604001903249547235">גיבוי בענן</translation> <translation id="6040143037577758943">סגור</translation> <translation id="604124094241169006">אוטומטי</translation> -<translation id="6042308850641462728">עוד</translation> <translation id="604257181445267932">התכונה Smart Lock עוזרת לך להיכנס במהירות לאפליקציות ולאתרים באמצעות סיסמאות ששמרת ב-Google.</translation> <translation id="6049065490165456785">תמונה מהמצלמה הפנימית</translation> <translation id="6051028581720248124">על ידי הדפסה ל-FedEx Office, אתה מקבל את <ph name="START_LINK" />תנאי השימוש<ph name="END_LINK" /> שלהם.</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index ba10ecb..491358a 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -2373,7 +2373,7 @@ <translation id="4422347585044846479">このページのブックマークを編集します</translation> <translation id="4422428420715047158">ドメイン:</translation> <translation id="442477792133831654">近くのデバイスとの通信</translation> -<translation id="4425149324548788773">マイ ドライブ</translation> +<translation id="4425149324548788773">マイドライブ</translation> <translation id="4428582326923056538">Adobe Flash Player のカメラの例外が異なります。</translation> <translation id="4433914671537236274">リカバリ メディアの作成</translation> <translation id="4434147949468540706">スクロール終了時の効果</translation> @@ -3199,7 +3199,7 @@ <translation id="5669267381087807207">有効にしています</translation> <translation id="5669462439438204699">クレジット カードを保存</translation> <translation id="5671961047338275645">サイトの管理</translation> -<translation id="5675224880872496917">ページ コンテンツのスクロールを滑らかに表示します。</translation> +<translation id="5675224880872496917">スクロール時にコンテンツを滑らかに表示します。</translation> <translation id="5676267133227121599">どのデバイスからでも、<ph name="MANAGEMENT_LINK" /> でパスワードにアクセスできます。</translation> <translation id="5677503058916217575">ページの言語:</translation> <translation id="5677928146339483299">ブロック</translation> @@ -3445,7 +3445,6 @@ <translation id="604001903249547235">クラウド バックアップ</translation> <translation id="6040143037577758943">閉じる</translation> <translation id="604124094241169006">自動設定</translation> -<translation id="6042308850641462728">詳細表示</translation> <translation id="604257181445267932">スマートロックを使用すると、Google に保存したパスワードを使ってアプリやサイトにすばやくログインできます。</translation> <translation id="6049065490165456785">内蔵カメラの写真</translation> <translation id="6051028581720248124">FedEx Office で印刷すると、<ph name="START_LINK" />利用規約<ph name="END_LINK" />に同意したことになります。</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 9fea37cf..0e84ebc 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -316,7 +316,7 @@ <translation id="1467432559032391204">ಎಡಕ್ಕೆ</translation> <translation id="1467999917853307373">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಡೇಟಾವನ್ನು ಶಾಶ್ವತವಾಗಿ ಸಂಗ್ರಹಿಸಲು <ph name="URL" /> ಬಯಸಿದೆ.</translation> <translation id="1468038450257740950">WebGL ಬೆಂಬಲಿಸುವುದಿಲ್ಲ.</translation> -<translation id="1469042717030597817">ಸಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ, ಸಿಸ್ಟಂ ಸ್ಮರಣೆಯು ಕಡಿಮೆ ಇರುವಾಗ ಟ್ಯಾಬ್ಗಳನ್ನು ಸ್ಮರಣೆಯಿಂದ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ತ್ಯಜಿಸಲಾಗುತ್ತದೆ. ತ್ಯಜಿಸಲಾದ ಟ್ಯಾಬ್ಗಳು ಈಗಲೂ ಸಹ ಟ್ಯಾಬ್ ಸ್ಟ್ರಿಪ್ನಲ್ಲಿ ಗೋಚರಿಸುತ್ತದೆ ಮತ್ತು ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ ಮರುಲೋಡ್ ಆಗುತ್ತದೆ. ತ್ಯಜಿಸಲಾದ ಟ್ಯಾಬ್ಗಳ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು chrome://discards ನಲ್ಲಿ ಕಾಣಬಹುದಾಗಿರುತ್ತದೆ.</translation> +<translation id="1469042717030597817">ಸಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ, ಸಿಸ್ಟಂ ಮೆಮೊರಿಯು ಕಡಿಮೆ ಇರುವಾಗ ಅದರಿಂದ ಟ್ಯಾಬ್ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ. ಅಂಥ ಟ್ಯಾಬ್ಗಳು ಆ ಬಳಿಕವೂ ಟ್ಯಾಬ್ ಸ್ಟ್ರಿಪ್ನಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ, ಮಾತ್ರವಲ್ಲ, ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ ಮರುಲೋಡ್ ಆಗುತ್ತವೆ. ಆ ಟ್ಯಾಬ್ಗಳ ಮಾಹಿತಿಯನ್ನು chrome://discards ನಲ್ಲಿ ನೀವು ಕಾಣಬಹುದು.</translation> <translation id="1470719357688513792">ಪುಟವನ್ನು ಮರುಲೋಡ್ ಮಾಡಿದ ನಂತರ ಹೊಸ ಕುಕಿ ಸೆಟ್ಟಿಂಗ್ಗಳು ಕಾರ್ಯಗತವಾಗುತ್ತವೆ.</translation> <translation id="1470811252759861213">ನಿಮ್ಮ ಎಲ್ಲಾ ಕಂಪ್ಯೂಟರ್ಗಳಲ್ಲಿ ನಿಮ್ಮ ವಿಸ್ತರಣೆಗಳನ್ನು ಪಡೆಯಲು, <ph name="SIGN_IN_LINK" />.</translation> <translation id="14720830734893704">ವರ್ಚುಯಲ್ ಕೀಬೋರ್ಡ್ ಬೆಂಬಲವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> @@ -3447,7 +3447,6 @@ <translation id="604001903249547235">ಮೇಘ ಬ್ಯಾಕಪ್</translation> <translation id="6040143037577758943">ಮುಚ್ಚು</translation> <translation id="604124094241169006">ಸ್ವಯಂಚಾಲಿತ</translation> -<translation id="6042308850641462728">ಇನ್ನಷ್ಟು</translation> <translation id="604257181445267932">Google ಮೂಲಕ ನೀವು ಉಳಿಸಲಾದ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಸೈಟ್ಗಳಿಗೆ ತ್ವರಿತವಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಲು ನಿಮಗೆ Smart Lock ಸಹಾಯ ಮಾಡುತ್ತದೆ.</translation> <translation id="6049065490165456785">ಆಂತರಿಕ ಕ್ಯಾಮರಾದಿಂದ ಫೋಟೋ</translation> <translation id="6051028581720248124">FedEx Office ಗೆ ಮುದ್ರಿಸುವ ಮೂಲಕ, ನೀವು ಅವರ <ph name="START_LINK" />ಬಳಕೆಯ ನಿಯಮಗಳನ್ನು<ph name="END_LINK" /> ಸಮ್ಮತಿಸುತ್ತೀರಿ.</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 1e14c8f..6562bd3 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -693,7 +693,7 @@ <translation id="2028997212275086731">RAR 압축 파일</translation> <translation id="203168018648013061">동기화 오류: Google 대시보드를 통해 동기화를 다시 설정하세요.</translation> <translation id="2031695690821674406">사용자가 계정을 명시적으로 선택한 경우 페이지 로드 시 사용자 인증 정보를 자동완성하지 않고 비밀번호를 입력합니다.</translation> -<translation id="2031925387125903299">새로운 사이트를 처음으로 방문했을 때 부모님이 이 사이트를 승인해야 하므로 이러한 알림이 나타납니다.</translation> +<translation id="2031925387125903299">이 알림은 새로운 사이트를 처음으로 방문할 때 부모님의 승인이 필요하므로 표시되었습니다.</translation> <translation id="2040460856718599782">인증을 시도하는 중에 문제가 발생했습니다. 로그인 사용자 인증 정보를 확인하고 다시 시도해 주세요.</translation> <translation id="204497730941176055">Microsoft Certificate Template Name</translation> <translation id="2045969484888636535">쿠키 계속 차단</translation> @@ -1206,7 +1206,7 @@ <translation id="2772936498786524345">닌자</translation> <translation id="2773948261276885771">페이지 설정</translation> <translation id="2776441542064982094">네트워크에 등록할 수 있는 기기가 없는 것 같습니다. 기기의 전원이 켜져 있고 인터넷에 연결되어 있다면 사용 설명서의 안내에 따라 등록해 보세요.</translation> -<translation id="2778107779445548489">부모님이 이 사이트를 차단했으므로 이러한 알림이 표시됩니다.</translation> +<translation id="2778107779445548489">부모님이 이 사이트를 차단해 이 알림이 표시되었습니다.</translation> <translation id="2778459533137481732">권한 블랙리스트</translation> <translation id="2779552785085366231">이 페이지를 앱 런처에 추가할 수 있습니다.</translation> <translation id="2781645665747935084">벨기에어</translation> @@ -2394,7 +2394,7 @@ <translation id="4454939697743986778">이 인증서는 시스템 관리자가 설치했습니다.</translation> <translation id="4458874409874303848">SafeSites</translation> <translation id="445923051607553918">WiFi 네트워크 연결</translation> -<translation id="4461847750548395463">Google SafeSites가 사용 설정되어 있으므로 이 알림이 표시됩니다.</translation> +<translation id="4461847750548395463">Google SafeSites가 사용 설정되어 있어 이 알림이 표시되었습니다.</translation> <translation id="4462159676511157176">맞춤 이름 서버</translation> <translation id="4465830120256509958">브라질어 키보드</translation> <translation id="4467100756425880649">Chrome 웹 스토어 갤러리</translation> @@ -2698,7 +2698,7 @@ <translation id="4927301649992043040">확장 프로그램 압축</translation> <translation id="4927753642311223124">표시할 내용이 없습니다.</translation> <translation id="4929925845384605079">실행기에 추가 배너를 표시하도록 허용하여 사용자에게 실행기에 웹 앱을 추가하라는 메시지 또는 기타 플랫폼별로 이에 상응하는 메시지가 표시되도록 합니다.</translation> -<translation id="4930497775425430760">새로운 사이트를 처음으로 방문했을 때 부모님이 이 사이트를 승인해야 하므로 이 알림이 표시됩니다.</translation> +<translation id="4930497775425430760">이 메시지는 새로운 사이트를 처음으로 방문할 때 부모님의 승인이 필요하므로 표시되었습니다.</translation> <translation id="4933484234309072027"><ph name="URL" />에 삽입</translation> <translation id="493571969993549666">관리 대상 사용자 추가</translation> <translation id="4938972461544498524">터치패드 설정</translation> @@ -3337,7 +3337,7 @@ <translation id="5854409662653665676">문제가 자주 발생할 경우 다음 단계에 따라 모듈 문제를 해결할 수 있습니다.</translation> <translation id="5854912040170951372">피자왕</translation> <translation id="5855119960719984315">창 전환</translation> -<translation id="5855235287355719921">관리자가 이 사이트를 차단했으므로 이 메시지가 표시됩니다.</translation> +<translation id="5855235287355719921">관리자가 이 사이트를 차단해 이 메시지가 표시되었습니다.</translation> <translation id="5856721540245522153">디버깅 기능 사용</translation> <translation id="5857090052475505287">새 폴더</translation> <translation id="5859272821192576954">계속해서 행아웃을 사용할 준비가 되었습니다.</translation> @@ -3447,7 +3447,6 @@ <translation id="604001903249547235">클라우드 백업</translation> <translation id="6040143037577758943">닫기</translation> <translation id="604124094241169006">자동</translation> -<translation id="6042308850641462728">더보기</translation> <translation id="604257181445267932">Smart Lock을 사용하면 Google에 저장한 비밀번호로 앱과 사이트에 빠르게 로그인할 수 있습니다.</translation> <translation id="6049065490165456785">내부 카메라의 사진</translation> <translation id="6051028581720248124">FedEx Office로 인쇄하면 해당 회사의 <ph name="START_LINK" />이용약관<ph name="END_LINK" />에 동의하게 됩니다.</translation> @@ -3518,7 +3517,7 @@ <translation id="6144890426075165477">현재 <ph name="PRODUCT_NAME" />이(가) 기본 브라우저로 설정되어 있지 않습니다.</translation> <translation id="6147020289383635445">인쇄 미리보기에 실패했습니다.</translation> <translation id="614998064310228828">기기 모델:</translation> -<translation id="6150607114729249911">죄송합니다. 이 페이지를 방문해도 괜찮은지 부모님께 확인해야 합니다.</translation> +<translation id="6150607114729249911">이 페이지를 방문해도 괜찮은지 부모님께 확인해야 합니다.</translation> <translation id="6150853954427645995">오프라인에서 사용하기 위해 이 파일을 저장하려면 온라인으로 돌아가서 마우스 오른쪽 버튼으로 파일을 클릭한 다음 <ph name="OFFLINE_CHECKBOX_NAME" /> 옵션을 선택하세요.</translation> <translation id="6151323131516309312"><ph name="SEARCH_KEY" />을(를) 눌러 <ph name="SITE_NAME" /> 검색</translation> <translation id="6154697846084421647">현재 로그인되어 있음</translation> @@ -4200,12 +4199,12 @@ <translation id="7224023051066864079">서브넷 마스크:</translation> <translation id="7225179976675429563">네트워크 유형이 없습니다.</translation> <translation id="7231224339346098802">숫자로 인쇄 매수를 표시하세요(1 이상).</translation> -<translation id="7231308970288859235">죄송합니다. 이 페이지를 방문해도 괜찮은지 부모님께 확인해야 합니다.</translation> +<translation id="7231308970288859235">이 페이지를 방문해도 괜찮은지 부모님께 확인해야 합니다.</translation> <translation id="7238585580608191973">SHA-256 지문</translation> <translation id="7240120331469437312">인증서 대상 대체 이름</translation> <translation id="7241389281993241388"><ph name="TOKEN_NAME" />에 로그인하여 클라이언트 인증서를 가져오세요.</translation> <translation id="7243055093079293866">새 탭과 google.com에서 "Ok Google"이라고 말하기</translation> -<translation id="7246609911581847514">새로운 사이트를 처음으로 방문했을 때 관리자가 이 사이트를 승인해야 하므로 이 알림이 표시됩니다.</translation> +<translation id="7246609911581847514">이 알림은 새로운 사이트를 처음으로 방문할 때 관리자의 승인이 필요하므로 표시되었습니다.</translation> <translation id="724691107663265825">다음 사이트에 멀웨어가 있습니다.</translation> <translation id="725109152065019550">관리자가 계정에서 외부 저장소를 사용 중지했습니다.</translation> <translation id="7252661675567922360">로드하지 마세요.</translation> @@ -5099,7 +5098,7 @@ <translation id="8584280235376696778">새 탭에서 동영상 열기(&O)</translation> <translation id="8589311641140863898">실험실 확장 프로그램 API</translation> <translation id="8590375307970699841">자동 업데이트 설정</translation> -<translation id="8591846766485502580">부모님 중 한 명이 이 사이트를 차단했으므로 이 알림이 표시됩니다.</translation> +<translation id="8591846766485502580">부모님 중 한 명이 이 사이트를 차단해 이 알림이 표시되었습니다.</translation> <translation id="8592071947729879125">iframe 권한 제한</translation> <translation id="859285277496340001">인증서는 취소 여부를 확인하는 매커니즘을 지정하지 않습니다.</translation> <translation id="8594787581355215556"><ph name="USER_EMAIL_ADDRESS" />(으)로 로그인되었습니다. <ph name="BEGIN_LINK" />Google 대시보드<ph name="END_LINK" />에서 동기화된 데이터를 관리합니다.</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 8d26c54e..2798c9b 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -2372,7 +2372,7 @@ <translation id="4422347585044846479">Redaguoti žymę šitam puslapiui</translation> <translation id="4422428420715047158">Sritis:</translation> <translation id="442477792133831654">Užmegzti ryšį su netoliese esančiais įrenginiais</translation> -<translation id="4425149324548788773">Mano diskas</translation> +<translation id="4425149324548788773">Mano Diskas</translation> <translation id="4428582326923056538">„Adobe Flash Player“ fotoaparato išimtys skiriasi.</translation> <translation id="4433914671537236274">Kurkite atkūrimo mediją</translation> <translation id="4434147949468540706">Slinkimo pabaigos efektas</translation> @@ -3446,7 +3446,6 @@ <translation id="604001903249547235">Atsarginis kopijavimas debesyje</translation> <translation id="6040143037577758943">Uždaryti</translation> <translation id="604124094241169006">Automatinis</translation> -<translation id="6042308850641462728">Daugiau</translation> <translation id="604257181445267932">„Smart Lock“ padeda greitai prisijungti prie programų ir svetainių naudojant slaptažodžius, kuriuos išsaugojote sistemoje „Google“.</translation> <translation id="6049065490165456785">Vidiniu fotoaparatu daryta nuotrauka</translation> <translation id="6051028581720248124">Spausdindami „FedEx Office“, sutinkate su jų <ph name="START_LINK" />naudojimo sąlygomis<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 49fa7e5..18bcb30 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -3448,7 +3448,6 @@ <translation id="604001903249547235">Dublēšana mākonī</translation> <translation id="6040143037577758943">Aizvērt</translation> <translation id="604124094241169006">Automātiski</translation> -<translation id="6042308850641462728">Vairāk</translation> <translation id="604257181445267932">Smart Lock palīdz ērti pierakstīties lietotnēs un vietnēs, izmantojot paroles, ko esat saglabājis Google sistēmā.</translation> <translation id="6049065490165456785">Fotoattēls no iekšējās kameras</translation> <translation id="6051028581720248124">Drukājot FedEx birojā, jūs piekrītat FedEx <ph name="START_LINK" />pakalpojumu sniegšanas noteikumiem<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 871e620..066098be 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -3445,7 +3445,6 @@ <translation id="604001903249547235">ക്ലൗഡ് ബാക്കപ്പ്</translation> <translation id="6040143037577758943">അടയ്ക്കുക</translation> <translation id="604124094241169006">സ്വപ്രേരിതം</translation> -<translation id="6042308850641462728">കൂടുതൽ</translation> <translation id="604257181445267932">നിങ്ങൾ Google-ൽ സംരക്ഷിച്ച പാസ്വേഡുകൾ ഉപയോഗിച്ച് ആപ്സിലേക്കും സൈറ്റുകളിലേക്കും വേഗത്തിൽ സൈൻ ഇൻ ചെയ്യാൻ Smart Lock സഹായിക്കുന്നു.</translation> <translation id="6049065490165456785">ആന്തരിക ക്യാമറയിൽ നിന്നുള്ള ഫോട്ടോ</translation> <translation id="6051028581720248124">FedEx Office-ൽ പ്രിന്റുചെയ്യുന്നതിലൂടെ, നിങ്ങൾ അവയുടെ <ph name="START_LINK" />ഉപയോഗ നിബന്ധനകൾ<ph name="END_LINK" /> അംഗീകരിക്കുകയാണ്,</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index e54ac6d0..ebf92c7b 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -504,7 +504,7 @@ <translation id="1702534956030472451">पाश्चात्य</translation> <translation id="1702987929180449188">सक्षम केले असताना, किमान स्क्रीन dp >= 800 असलेल्या डिव्हाइसेसवर स्क्रोल करण्यामुळे टूलबार कधीही लपविला जात नाही. पृष्ठ सामग्री पूर्ण स्क्रीनवर असली तरीही तो लपलेला असेल.</translation> <translation id="1707463636381878959">अन्य वापरकर्त्यांसह हा नेटवर्क सामायिक करा</translation> -<translation id="1708199901407471282">नवीन टॅब पृष्ठामधून सूचविलेले वेबपृष्ठ उघडताना, सूचनेसाठी टॅब आधीपासून उघडा असल्यास, नवीन टॅबमध्ये सूचना लोड करण्याऐवजी त्यावर स्विच करा.</translation> +<translation id="1708199901407471282">नवीन टॅब पृष्ठामधून सुचविलेले वेबपृष्ठ उघडताना, सूचनेसाठी टॅब आधीपासून उघडा असल्यास, नवीन टॅबमध्ये सूचना लोड करण्याऐवजी त्यावर स्विच करा.</translation> <translation id="1708338024780164500">(निष्क्रिय)</translation> <translation id="1711973684025117106">झिप करणे अयशस्वी, अनपेक्षित त्रुटी: $1</translation> <translation id="1715941336038158809">अवैध वापरकर्ता नाव किंवा संकेतशब्द.</translation> @@ -3442,7 +3442,6 @@ <translation id="604001903249547235">मेघ बॅकअप</translation> <translation id="6040143037577758943">बंद करा</translation> <translation id="604124094241169006">स्वयंचलित</translation> -<translation id="6042308850641462728">अधिक</translation> <translation id="604257181445267932">आपण Google सह जतन केलेल्या संकेतशब्दांचा वापर करून अॅप्स आणि साइटमध्ये द्रुतपणे साइन इन करण्यास Smart Lock आपल्याला मदत करेल.</translation> <translation id="6049065490165456785">अंतर्गत कॅमेर्यातील फोटो</translation> <translation id="6051028581720248124">FedEx Office वर मुद्रण करून, आपण त्यांच्या <ph name="START_LINK" />वापर अटी<ph name="END_LINK" /> स्वीकारता.</translation> @@ -5090,7 +5089,7 @@ <translation id="8584280235376696778">नवीन टॅबमध्ये व्हिडिओ &उघडा</translation> <translation id="8589311641140863898">प्रायोगिक विस्तार API</translation> <translation id="8590375307970699841">स्वयंचलित अद्यतने सेट करा</translation> -<translation id="8591846766485502580">आपल्याला हा संदेश दिसत आहे कारण आपल्या आपल्या पालकांपैकी एकाने ही साइट अवरोधित केली आहे.</translation> +<translation id="8591846766485502580">आपल्याला हा संदेश दिसत आहे कारण आपल्या पालकांपैकी एकाने ही साइट अवरोधित केली आहे.</translation> <translation id="8592071947729879125">iframe परवानग्या प्रतिबंधित करा.</translation> <translation id="859285277496340001">प्रमाणपत्र निरस्त झाले आहे किंवा नाही हे तपासण्यासाठी प्रणाली निर्दिष्ट करत नाही.</translation> <translation id="8594787581355215556"><ph name="USER_EMAIL_ADDRESS" /> म्हणून साइन इन करा. <ph name="BEGIN_LINK" />Google डॅशबोर्ड<ph name="END_LINK" /> वर आपला समक्रमित डेटा व्यवस्थापित करा.</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index a8acb39..63f395e 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -3445,7 +3445,6 @@ <translation id="604001903249547235">Sandaran awan</translation> <translation id="6040143037577758943">Tutup</translation> <translation id="604124094241169006">Automatik</translation> -<translation id="6042308850641462728">Lagi</translation> <translation id="604257181445267932">Smart Lock membantu anda log masuk ke apl dan tapak web dengan cepat menggunakan kata laluan yang telah anda simpan di Google.</translation> <translation id="6049065490165456785">Foto dari kamera dalaman</translation> <translation id="6051028581720248124">Dengan mencetak ke Pejabat FedEx, anda menerima <ph name="START_LINK" />syarat penggunaan<ph name="END_LINK" /> mereka.</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 60bf0433..8bb5cb9 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -316,7 +316,7 @@ <translation id="1467432559032391204">Links</translation> <translation id="1467999917853307373"><ph name="URL" /> vraagt toestemming om gegevens permanent op je apparaat op te slaan.</translation> <translation id="1468038450257740950">WebGL wordt niet ondersteund.</translation> -<translation id="1469042717030597817">Indien ingeschakeld, worden tabbladen automatisch weggegooid uit het geheugen wanneer er weinig systeemgeheugen beschikbaar is. Weggegooide tabbladen zijn nog steeds zichtbaar op de tabbladstrook en worden opnieuw geladen wanneer er op ze wordt geklikt. Je kunt informatie over weggegooide tabbladen vinden op chrome://discards.</translation> +<translation id="1469042717030597817">Indien ingeschakeld, worden tabbladen automatisch weggegooid uit het geheugen wanneer er weinig systeemgeheugen beschikbaar is. Weggegooide tabbladen zijn nog steeds zichtbaar op de tabbladstrook en worden opnieuw geladen wanneer erop wordt geklikt. Je kunt informatie over weggegooide tabbladen vinden op chrome://discards.</translation> <translation id="1470719357688513792">De nieuwe cookie-instellingen worden van kracht nadat de pagina opnieuw is geladen.</translation> <translation id="1470811252759861213">Als je je extensies wilt gebruiken op al je computers, moet je <ph name="SIGN_IN_LINK" />.</translation> <translation id="14720830734893704">Hiermee schakel je ondersteuning voor een virtueel toetsenbord in.</translation> @@ -1009,7 +1009,7 @@ <translation id="2482081114970574549">Gebruikt een inlogprocedure op basis van iframes en niet op basis van webweergaven.</translation> <translation id="2482878487686419369">Meldingen</translation> <translation id="2485056306054380289">CA-certificaat van server:</translation> -<translation id="2487915095798731898">Samenvoegen</translation> +<translation id="2487915095798731898">Deelnemen</translation> <translation id="2489316678672211764">Een plug-in (<ph name="PLUGIN_NAME" />) reageert niet.</translation> <translation id="2489428929217601177">de afgelopen dag</translation> <translation id="2489435327075806094">Snelheid van aanwijzer:</translation> @@ -3445,7 +3445,6 @@ <translation id="604001903249547235">Cloudback-up</translation> <translation id="6040143037577758943">Sluiten</translation> <translation id="604124094241169006">Automatisch</translation> -<translation id="6042308850641462728">Meer</translation> <translation id="604257181445267932">Met Smart Lock kun je snel inloggen bij apps en op sites met de wachtwoorden die je hebt opgeslagen via Google.</translation> <translation id="6049065490165456785">Foto via interne camera</translation> <translation id="6051028581720248124">Je gaat akkoord met de <ph name="START_LINK" />gebruiksvoorwaarden<ph name="END_LINK" /> door af te drukken naar FedEx Office.</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 00d2dc0..85388f1 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -3432,7 +3432,6 @@ <translation id="604001903249547235">Skybasert sikkerhetskopiering</translation> <translation id="6040143037577758943">Lukk</translation> <translation id="604124094241169006">Automatisk</translation> -<translation id="6042308850641462728">Mer</translation> <translation id="604257181445267932">Med Smart Lock kan du raskt logge på apper og nettsteder som bruker passord du har lagret hos Google.</translation> <translation id="6049065490165456785">Bilde fra internt kamera</translation> <translation id="6051028581720248124">Ved utskrift til FedEx-kontorer, godtar du <ph name="START_LINK" />vilkårene<ph name="END_LINK" /> deres.</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 605b010..fe82ebc 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -3442,7 +3442,6 @@ <translation id="604001903249547235">Kopia zapasowa w chmurze</translation> <translation id="6040143037577758943">Zamknij</translation> <translation id="604124094241169006">Automatyczne</translation> -<translation id="6042308850641462728">Więcej</translation> <translation id="604257181445267932">Smart Lock umożliwia szybkie logowanie się w aplikacjach i na stronach przy użyciu haseł zapisanych w Google.</translation> <translation id="6049065490165456785">Zdjęcie z wbudowanego aparatu</translation> <translation id="6051028581720248124">Drukując za pomocą FedEx Office, akceptujesz ich <ph name="START_LINK" />Warunki korzystania z usługi<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index e04174d..79c10d3 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -290,7 +290,7 @@ <translation id="1429740407920618615">Intensidade do sinal:</translation> <translation id="143027896309062157">Ler e modificar todos os dados no seu computador e nos sites que você visitar</translation> <translation id="1430915738399379752">Imprimir</translation> -<translation id="1434696352799406980">Isso redefinirá sua página de inicialização, a página "Nova guia", o mecanismo de pesquisa e as guias fixadas. Além disso, também desativará todas as extensões e limpará os dados temporários, como cookies. Seus favoritos, histórico e senhas salvas não serão limpos.</translation> +<translation id="1434696352799406980">Esta função irá redefinir sua página de inicialização, a página "Nova guia", o mecanismo de pesquisa e as guias fixadas. Além disso, desativará todas as extensões e limpará dados temporários, como cookies. Seus favoritos, histórico e senhas salvas não serão limpos.</translation> <translation id="1434886155212424586">A página inicial é a página "Nova guia"</translation> <translation id="1435550882135542937">Reformulação da barra de ferramentas da extensão.</translation> <translation id="1436784010935106834">Removido</translation> @@ -316,7 +316,7 @@ <translation id="1467432559032391204">Para a esquerda</translation> <translation id="1467999917853307373"><ph name="URL" /> deseja armazenar permanentemente os dados em seu dispositivo.</translation> <translation id="1468038450257740950">O WebGL não é suportado.</translation> -<translation id="1469042717030597817">Se essa opção estiver ativada, as guias serão descartadas automaticamente da memória quando a memória do sistema estiver baixa. Guias descartadas ainda ficam visíveis na barra de guias e são recarregadas quando se clica nelas. Informações sobre guias descartadas podem ser encontradas em chrome://discards.</translation> +<translation id="1469042717030597817">Se essa opção estiver ativada, as guias serão descartadas automaticamente da memória quando a memória do sistema estiver baixa. Guias descartadas ainda ficam visíveis na barra de guias e são recarregadas ao serem clicadas. Informações sobre guias descartadas podem ser encontradas em chrome://discards.</translation> <translation id="1470719357688513792">Novas configurações de cookies entrarão em vigor depois que a página for atualizada.</translation> <translation id="1470811252759861213">Para ter suas extensões em todos os computadores, <ph name="SIGN_IN_LINK" />.</translation> <translation id="14720830734893704">Ativar suporte ao teclado virtual.</translation> @@ -2371,7 +2371,7 @@ <translation id="4422347585044846479">Editar favorito para esta página</translation> <translation id="4422428420715047158">Domínio:</translation> <translation id="442477792133831654">Comunicar-se com dispositivos próximos</translation> -<translation id="4425149324548788773">Meu Google Drive</translation> +<translation id="4425149324548788773">Meu Drive</translation> <translation id="4428582326923056538">As exceções da câmera do Adobe Flash Player são diferentes.</translation> <translation id="4433914671537236274">Criar mídia de recuperação</translation> <translation id="4434147949468540706">Efeito final de rolagem</translation> @@ -3196,7 +3196,7 @@ <translation id="5669267381087807207">Ativando</translation> <translation id="5669462439438204699">Salvar cartão de crédito</translation> <translation id="5671961047338275645">Gerenciar sites</translation> -<translation id="5675224880872496917">Animar levemente ao rolar o conteúdo da página.</translation> +<translation id="5675224880872496917">Anima suavemente ao rolar o conteúdo da página.</translation> <translation id="5676267133227121599">Acesse suas senhas em qualquer dispositivo em <ph name="MANAGEMENT_LINK" />.</translation> <translation id="5677503058916217575">Idioma da página:</translation> <translation id="5677928146339483299">Bloqueados</translation> @@ -3442,7 +3442,6 @@ <translation id="604001903249547235">Backup em nuvem</translation> <translation id="6040143037577758943">Fechar</translation> <translation id="604124094241169006">Automático</translation> -<translation id="6042308850641462728">Mais</translation> <translation id="604257181445267932">O Smart Lock ajuda você a fazer login rapidamente em aplicativos e sites usando senhas salvas com o Google.</translation> <translation id="6049065490165456785">Foto da câmera interna</translation> <translation id="6051028581720248124">Ao imprimir no FedEx Office, você aceita os <ph name="START_LINK" />termos de uso<ph name="END_LINK" />.</translation> @@ -3513,7 +3512,7 @@ <translation id="6144890426075165477">Atualmente, o <ph name="PRODUCT_NAME" /> não é seu navegador padrão.</translation> <translation id="6147020289383635445">A visualização de impressão falhou.</translation> <translation id="614998064310228828">Modelo do dispositivo:</translation> -<translation id="6150607114729249911">Ops! Você precisa pedir permissão para seus pais para visitar esta página.</translation> +<translation id="6150607114729249911">Ops! É preciso permissão dos seus pais para visitar esta página.</translation> <translation id="6150853954427645995">Para salvar este arquivo para uso off-line, fique on-line novamente, clique com o botão direito no arquivo e selecione a opção <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> <translation id="6151323131516309312">Pressione <ph name="SEARCH_KEY" /> para pesquisar <ph name="SITE_NAME" /></translation> <translation id="6154697846084421647">Conectado no momento</translation> @@ -3917,7 +3916,7 @@ <translation id="6809448577646370871">Alternância entre janelas personalizada para aplicativos do Google Chrome.</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> não pode ser executado como raiz.</translation> <translation id="6812841287760418429">Manter alterações</translation> -<translation id="6814124696888326520">Facilitar a alternância entre os métodos de entrada e o acesso a mais recursos de entrada: entrada de texto por voz, manuscrito e emoticons.</translation> +<translation id="6814124696888326520">Facilita a alternância entre os métodos de entrada e o acesso a mais recursos de entrada: entrada de texto por voz, manuscrito e emoticons.</translation> <translation id="6815206662964743929">Trocar usuário</translation> <translation id="6815353853907306610">O <ph name="IDS_SHORT_PRODUCT_NAME" /> detectou que as configurações do navegador podem ter sido alteradas sem seu conhecimento. Gostaria de redefini-las para os padrões originais?</translation> <translation id="6815551780062710681">editar</translation> @@ -4195,12 +4194,12 @@ <translation id="7224023051066864079">Máscara de sub-rede:</translation> <translation id="7225179976675429563">Tipo de rede ausente</translation> <translation id="7231224339346098802">Use um número para indicar quantas cópias você quer imprimir (1 ou mais).</translation> -<translation id="7231308970288859235">Ops! Você precisa pedir permissão para seus pais para visitar esta página.</translation> +<translation id="7231308970288859235">Ops! É preciso permissão dos seus pais para visitar esta página.</translation> <translation id="7238585580608191973">Assinatura digital SHA-256</translation> <translation id="7240120331469437312">Nome alternativo do requerente do certificado</translation> <translation id="7241389281993241388">Faça login no <ph name="TOKEN_NAME" /> para importar o certificado do cliente.</translation> <translation id="7243055093079293866">Diga "OK Google" em uma nova guia e no google.com</translation> -<translation id="7246609911581847514">Esta mensagem está sendo exibida porque você precisa da aprovação do seu gerente para novos sites na sua primeira visita.</translation> +<translation id="7246609911581847514">Esta mensagem está sendo exibida porque é preciso aprovação do seu gerente para novos sites na sua primeira visita.</translation> <translation id="724691107663265825">O site a seguir contém malware</translation> <translation id="725109152065019550">Seu administrador desabilitou o armazenamento externo em sua conta.</translation> <translation id="7252661675567922360">Não carregar</translation> @@ -4619,7 +4618,7 @@ <translation id="7892500982332576204">Detecção de contas filhas</translation> <translation id="7893008570150657497">Acessar fotos, música e outras mídias em seu computador</translation> <translation id="7893393459573308604"><ph name="ENGINE_NAME" /> (padrão)</translation> -<translation id="7894616681410591072">Ops! Você precisa da permissão de <ph name="NAME" /> para acessar esta página.</translation> +<translation id="7894616681410591072">Ops! É preciso permissão de <ph name="NAME" /> para acessar esta página.</translation> <translation id="78957024357676568">para a esquerda</translation> <translation id="7896906914454843592">Teclado americano estendido</translation> <translation id="7897900149154324287">No futuro, não se esqueça de ejetar o dispositivo removível no aplicativo "Arquivos" antes de desconectá-lo. Caso contrário, você poderá perder dados.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 84d5774..49d3a4d51 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -290,7 +290,7 @@ <translation id="1429740407920618615">Intensidade do Sinal:</translation> <translation id="143027896309062157">Ler e alterar todos os dados no computador e os Websites que visita</translation> <translation id="1430915738399379752">Imprimir</translation> -<translation id="1434696352799406980">Isto repõe a página inicial, a página novo separador, o motor de pesquisa e os separadores fixos. Também desativa todas as extensões e limpa os dados temporários como os cookies. Os marcadores, o histórico e as palavras-passe guardadas não são limpos.</translation> +<translation id="1434696352799406980">Repõe a página inicial, a página novo separador, o motor de pesquisa e os separadores fixos. Também desativa todas as extensões e limpa os dados temporários como os cookies. Os marcadores, o histórico e as palavras-passe guardadas não são limpos.</translation> <translation id="1434886155212424586">A Página inicial é a página Novo separador</translation> <translation id="1435550882135542937">Reformulação da barra de ferramentas de extensões</translation> <translation id="1436784010935106834">Removido</translation> @@ -506,7 +506,7 @@ <translation id="1702534956030472451">Ocidental</translation> <translation id="1702987929180449188">Quando ativado, a barra de ferramentas nunca é oculta devido ao deslocamento em dispositivos com ecrãs com um tamanho mínimo >= 800 PD (pressão diferencial). Contudo, continua a ser oculta se os conteúdos da página passarem para ecrã inteiro.</translation> <translation id="1707463636381878959">Partilhar esta rede com outros utilizadores</translation> -<translation id="1708199901407471282">Quando abrir uma página Web sugerida da página Novo separador, se um separador já estiver aberto para a sugestão, mude para esse em vez de carregar a sugestão no novo separador.</translation> +<translation id="1708199901407471282">Ao abrir uma página Web sugerida da página Novo separador, se um separador já estiver aberto para a sugestão, alterne para esse em vez de carregar a sugestão no novo separador.</translation> <translation id="1708338024780164500">(Inativa)</translation> <translation id="1711973684025117106">Falha na criação de zip; erro inesperado: $1</translation> <translation id="1715941336038158809">Nome de utilizador ou palavra-passe inválidos.</translation> @@ -693,7 +693,7 @@ <translation id="2028997212275086731">Arquivo RAR</translation> <translation id="203168018648013061">Erro de Sincronização: reinicialize a Sincronização através do Painel de Controlo do Google.</translation> <translation id="2031695690821674406">Preenchimento de palavras-passe quando o utilizador selecionar explicitamente uma palavra-passe, em vez de preencher automaticamente as credenciais durante o carregamento da página.</translation> -<translation id="2031925387125903299">Estás a ver esta mensagem porque os teus pais necessitam de aprovar os sites novos da primeira vez que os visitas.</translation> +<translation id="2031925387125903299">Estás a ver esta mensagem porque os teus pais necessitam de aprovar os sites novos sempre que os visitas pela primeira vez.</translation> <translation id="2040460856718599782">Ups! Ocorreu um erro ao tentar autenticá-lo. Verifique bem as suas credenciais de início de sessão e tente novamente.</translation> <translation id="204497730941176055">Nome do modelo de certificado Microsoft</translation> <translation id="2045969484888636535">Continuar a bloquear cookies</translation> @@ -2373,7 +2373,7 @@ <translation id="4422347585044846479">Editar marcador para esta página</translation> <translation id="4422428420715047158">Domínio:</translation> <translation id="442477792133831654">Comunicar com dispositivos nas proximidades</translation> -<translation id="4425149324548788773">O Meu Disco</translation> +<translation id="4425149324548788773">O meu disco</translation> <translation id="4428582326923056538">As exceções de câmara do Adobe Flash Player são diferentes.</translation> <translation id="4433914671537236274">Criar um Suporte de Dados de Recuperação</translation> <translation id="4434147949468540706">Deslocamento e efeito</translation> @@ -2697,7 +2697,7 @@ <translation id="4927301649992043040">Comprimir extensão</translation> <translation id="4927753642311223124">Nada de novo a apresentar por aqui.</translation> <translation id="4929925845384605079">Ativa a visualização das faixas de adicionar à prateleira, que pedem ao utilizador que adicione uma aplicação Web à respetiva prateleira, ou de um equivalente específico de outra plataforma.</translation> -<translation id="4930497775425430760">Estás a ver esta mensagem porque o teu encarregado de educação necessita de aprovar os sites novos da primeira vez que os visitas.</translation> +<translation id="4930497775425430760">Estás a ver esta mensagem porque o teu encarregado de educação necessita de aprovar os sites novos sempre que os visitas pela primeira vez.</translation> <translation id="4933484234309072027">incorporada em <ph name="URL" /></translation> <translation id="493571969993549666">Adicionar utilizador supervisionado</translation> <translation id="4938972461544498524">Definições do touchpad</translation> @@ -3445,7 +3445,6 @@ <translation id="604001903249547235">Cópia de segurança na nuvem</translation> <translation id="6040143037577758943">Fechar</translation> <translation id="604124094241169006">Automático</translation> -<translation id="6042308850641462728">Mais</translation> <translation id="604257181445267932">O Smart Lock ajuda-o a iniciar sessão rapidamente em aplicações e sites com palavras-passe que guardou com o Google.</translation> <translation id="6049065490165456785">Fotografia tirada com a câmara interna</translation> <translation id="6051028581720248124">Ao imprimir para a FedEx Office, aceita os seus <ph name="START_LINK" />termos de utilização<ph name="END_LINK" />.</translation> @@ -4201,7 +4200,7 @@ <translation id="7240120331469437312">Nome alternativo do requerente do certificado</translation> <translation id="7241389281993241388">Inicie sessão no <ph name="TOKEN_NAME" /> para importar o certificado de cliente.</translation> <translation id="7243055093079293866">Dizer "Ok Google" num separador novo e em google.com</translation> -<translation id="7246609911581847514">Está a ver esta mensagem porque o seu gestor necessita de aprovar os sites novos da primeira vez que os visita.</translation> +<translation id="7246609911581847514">Está a ver esta mensagem porque o seu gestor necessita de aprovar os sites novos sempre que o visita pela primeira vez.</translation> <translation id="724691107663265825">O site seguinte contém software malicioso</translation> <translation id="725109152065019550">Lamentamos, mas o administrador desativou o armazenamento externo na sua conta.</translation> <translation id="7252661675567922360">Não carregar</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index ae966a0..45e90cd 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -1008,7 +1008,7 @@ <translation id="2482081114970574549">Folosește un flux de conectare bazat pe iframe, nu un flux bazat pe WebView.</translation> <translation id="2482878487686419369">Notificări</translation> <translation id="2485056306054380289">Certificat CA server:</translation> -<translation id="2487915095798731898">Înscrie-te</translation> +<translation id="2487915095798731898">Urmează</translation> <translation id="2489316678672211764">Un plugin (<ph name="PLUGIN_NAME" />) nu răspunde.</translation> <translation id="2489428929217601177">ultima zi</translation> <translation id="2489435327075806094">Viteza cursorului:</translation> @@ -2371,7 +2371,7 @@ <translation id="4422347585044846479">Editați marcajul pentru această pagină</translation> <translation id="4422428420715047158">Domeniul:</translation> <translation id="442477792133831654">Comunică cu dispozitive din apropiere</translation> -<translation id="4425149324548788773">Discul meu</translation> +<translation id="4425149324548788773">Contul meu Drive</translation> <translation id="4428582326923056538">Excepțiile Adobe Flash Player pentru camera foto sunt diferite.</translation> <translation id="4433914671537236274">Creează un suport de recuperare</translation> <translation id="4434147949468540706">Efect la finalizarea derulării</translation> @@ -3442,7 +3442,6 @@ <translation id="604001903249547235">Backup în cloud</translation> <translation id="6040143037577758943">Închide</translation> <translation id="604124094241169006">Automat</translation> -<translation id="6042308850641462728">Mai multe</translation> <translation id="604257181445267932">Smart Lock te ajută să te conectezi rapid la aplicații și site-uri folosind parolele pe care le-ai salvat cu Google.</translation> <translation id="6049065490165456785">Fotografii de pe camera foto internă</translation> <translation id="6051028581720248124">Printând cu FedEx Office, sunteți de acord cu <ph name="START_LINK" />termenii și condițiile<ph name="END_LINK" /> acestui serviciu.</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 975e49a..ede5afc4 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -3445,7 +3445,6 @@ <translation id="604001903249547235">Резервное копирование в облако</translation> <translation id="6040143037577758943">Закрыть</translation> <translation id="604124094241169006">Автоматически</translation> -<translation id="6042308850641462728">Подробнее...</translation> <translation id="604257181445267932">Функция Smart Lock, которая использует сохраненные в Google пароли, позволяет быстро входить в аккаунты на сайтах и в приложениях.</translation> <translation id="6049065490165456785">Фотография с устройства</translation> <translation id="6051028581720248124">Выполняя печать в отделении FedEx, вы принимаете <ph name="START_LINK" />Условия использования<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 34d80d7..1b4121e 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -3446,7 +3446,6 @@ <translation id="604001903249547235">Záloha v cloude</translation> <translation id="6040143037577758943">Zatvoriť</translation> <translation id="604124094241169006">Automatické</translation> -<translation id="6042308850641462728">Viac</translation> <translation id="604257181445267932">Funkcia Smart Lock vám umožňuje rýchlo sa prihlásiť do aplikácií a na webových stránkach pomocou hesiel uložených na Googli.</translation> <translation id="6049065490165456785">Fotografia z vnútorného fotoaparátu</translation> <translation id="6051028581720248124">Ak tlačíte v službe FedEx Office, súhlasíte s jej <ph name="START_LINK" />zmluvnými podmienkami<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index e5e896a5..8ec2540 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -3449,7 +3449,6 @@ <translation id="604001903249547235">Varnostno kopiranje v oblak</translation> <translation id="6040143037577758943">Zapri</translation> <translation id="604124094241169006">Samodejno</translation> -<translation id="6042308850641462728">Več</translation> <translation id="604257181445267932">Funkcija Smart Lock vam pomaga pri hitrejši prijavi v aplikacije in na spletnih mestih z gesli, ki ste jih shranili v Googlu.</translation> <translation id="6049065490165456785">Fotografija iz notranjega fotoaparata</translation> <translation id="6051028581720248124">S tiskanjem v FedExovi poslovalnici sprejemate njihove <ph name="START_LINK" />pogoje uporabe<ph name="END_LINK" />.</translation> @@ -4199,7 +4198,7 @@ <translation id="7224023051066864079">Maska podomrežja:</translation> <translation id="7225179976675429563">Vrsta omrežja manjka</translation> <translation id="7231224339346098802">Vnesite število izvodov, ki jih želite natisniti (1 ali več).</translation> -<translation id="7231308970288859235">Ojoj! Vprašaj starša, ali smeš obiskati to stran.</translation> +<translation id="7231308970288859235">Ojoj! Vprašaj starše, ali smeš obiskati to stran.</translation> <translation id="7238585580608191973">Prstni odtis SHA-256</translation> <translation id="7240120331469437312">Nadomestno ime subjekta potrdila</translation> <translation id="7241389281993241388">Prijavite se v <ph name="TOKEN_NAME" />, da uvozite potrdilo odjemalca.</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index f8b54cb..dbcdaf5 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1108,7 +1108,7 @@ <translation id="26224892172169984">Не дозволи ниједном сајту да рукује протоколима</translation> <translation id="2624142942574147739">Ова страница приступа камери и микрофону.</translation> <translation id="2626799779920242286">Покушајте поново касније.</translation> -<translation id="2628791912475282217">Омогућава да Chrome на Mac-у користи дијалог прегледача заснован на приказима комплета алатки када је он доступан, а уместо еквивалентног Cocoa дијалога.</translation> +<translation id="2628791912475282217">Омогућава да Chrome на Mac-у користи дијалог прегледача по приказу комплета алатки када је он доступан, а уместо еквивалентног Cocoa дијалога.</translation> <translation id="2630681426381349926">Повежите са Wi-Fi-јем да бисте започели</translation> <translation id="2631006050119455616">Сачувано</translation> <translation id="2633199387167390344"><ph name="NAME" /> користи <ph name="USAGE" /> MB простора на диску.</translation> @@ -2315,7 +2315,7 @@ <translation id="4321179778687042513">ctrl</translation> <translation id="4322394346347055525">Затвори друге картице</translation> <translation id="4325378361067528777">Омогући позадински режим за API Push</translation> -<translation id="4326999707196471878">Дијалози прегледача засновани на приказима комплета алатки.</translation> +<translation id="4326999707196471878">Дијалози прегледача по приказу комплета алатки.</translation> <translation id="4330406155931244378">Омогући проверу правописа за више језика</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 са RSA шифровањем</translation> <translation id="4335713051520279344">Овај рачунар ће се поново покренути за 1 секунд. @@ -2448,7 +2448,7 @@ <translation id="4557136421275541763">Упозорење:</translation> <translation id="4558426062282641716">Тражи се дозвола за аутоматско покретање</translation> <translation id="4563210852471260509">Почетни језик за унос је кинески</translation> -<translation id="456664934433279154">Контролише да ли се користе прозори за Chrome апликације засновани на приказима комплета алатки.</translation> +<translation id="456664934433279154">Контролише да ли се користе прозори за Chrome апликације по приказу комплета алатки.</translation> <translation id="4569998400745857585">Мени са скривеним додацима</translation> <translation id="4570444215489785449">Сада можете да даљински закључате овај уређај у било ком тренутку у Chrome менаџеру.</translation> <translation id="4572659312570518089">Потврда аутентичности је отказана током повезивања са „<ph name="DEVICE_NAME" />“.</translation> @@ -3095,7 +3095,7 @@ <translation id="5509914365760201064">Издавалац: <ph name="CERTIFICATE_AUTHORITY" /></translation> <translation id="5511823366942919280">Да ли стварно желите да подесите овај уређај као „Ајкулу“?</translation> <translation id="5512653252560939721">Копија сертификата корисника мора да постоји на хардверу.</translation> -<translation id="5515008897660088170">Прозори апликација засновани на приказима комплета алатки.</translation> +<translation id="5515008897660088170">Прозори апликација по приказу комплета алатки.</translation> <translation id="551752069230578406">Додајемо штампач на налог – то ће можда мало да потраје...</translation> <translation id="5518584115117143805">Сертификат шифровања е-поште</translation> <translation id="5521010850848859697">2. сервер</translation> @@ -3445,7 +3445,6 @@ <translation id="604001903249547235">Прављење резервних копија у клауду</translation> <translation id="6040143037577758943">Затвори</translation> <translation id="604124094241169006">Аутоматски</translation> -<translation id="6042308850641462728">Више</translation> <translation id="604257181445267932">Smart Lock вам помаже да се брзо пријавите у апликације и на сајтове који користе лозинке које сте сачували на Google-у.</translation> <translation id="6049065490165456785">Слика са интерне камере</translation> <translation id="6051028581720248124">Штампањем у FedEx продавници прихватате њихове <ph name="START_LINK" />услове коришћења услуге<ph name="END_LINK" />.</translation> @@ -4941,7 +4940,7 @@ <translation id="8351419472474436977">Овај додатак је преузео контролу над подешавањима проксија, што значи да може да мења, прекида или шпијунира све што радите онлајн. Ако нисте сигурни зашто је дошло до ове промене, вероватно вам није потребна.</translation> <translation id="8352772353338965963">Додајте налог за вишеструко пријављивање. Свим пријављеним налозима се може приступити без лозинке, па ову функцију треба користити само са поузданим налозима.</translation> <translation id="8353683614194668312">Може да:</translation> -<translation id="8354560714384889844">Дијалог са информацијама о апликацији заснован на приказима комплета алатки.</translation> +<translation id="8354560714384889844">Дијалог са информацијама о апликацији по приказу комплета алатки.</translation> <translation id="8356258244599961364">Овај језик нема ниједан метод уноса</translation> <translation id="8357224663288891423">Тастерске пречице за додатке и апликације</translation> <translation id="8358685469073206162">Желите ли да вратите странице?</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 111e536..d4122b86 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -3448,7 +3448,6 @@ <translation id="604001903249547235">Säkerhetskopiering i molnet</translation> <translation id="6040143037577758943">Stäng</translation> <translation id="604124094241169006">Automatisk</translation> -<translation id="6042308850641462728">Mer</translation> <translation id="604257181445267932">Med Smart Lock kan du snabbt logga in i appar och på webbplatser med lösenord som du har sparat hos Google.</translation> <translation id="6049065490165456785">Bild från intern kamera</translation> <translation id="6051028581720248124">När du skriver ut till ett FedEx Office-kontor accepterar du deras <ph name="START_LINK" />användarvillkor<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index b919885..c6818b2 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -3435,7 +3435,6 @@ <translation id="604001903249547235">Hifadhi rudufu ya wingu</translation> <translation id="6040143037577758943">Funga</translation> <translation id="604124094241169006">Otomatiki</translation> -<translation id="6042308850641462728">Zaidi</translation> <translation id="604257181445267932">Smart Lock hukusaidia kuingia katika programu na tovuti kwa haraka kwa kutumia manenosiri ambayo umehifadhi kwenye Google.</translation> <translation id="6049065490165456785">Picha kutoka kamera ya ndani</translation> <translation id="6051028581720248124">Kwa kuchapisha katika FedEx Office, unakubali sheria na masharti <ph name="START_LINK" />ya<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 25fc67a0..7e26720 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -290,7 +290,7 @@ <translation id="1429740407920618615">சிக்னல் வலிமை:</translation> <translation id="143027896309062157">உங்கள் கணினி மற்றும் நீங்கள் பார்வையிடும் இணையதளங்களில் உங்கள் எல்லா தரவையும் படிக்கலாம் மற்றும் திருத்தலாம்</translation> <translation id="1430915738399379752">அச்சிடுக</translation> -<translation id="1434696352799406980">இது உங்கள் துவக்கப் பக்கம், புதிய தாவல் பக்கம், தேடல் இன்ஜின் மற்றும் பொருத்தப்பட்ட தாவல்களை மீட்டமைக்கும். இது எல்லா நீட்டிப்புகளையும் முடக்கி, குக்கீகள் போன்ற தற்காலிகத் தரவை அழிக்கும். உங்கள் புத்தகக்குறிகள், வரலாறு மற்றும் சேமித்த கடவுச்சொற்கள் அழிக்கப்படாது.</translation> +<translation id="1434696352799406980">இது உங்கள் துவக்கப் பக்கம், புதிய தாவல் பக்கம், தேடல் இன்ஜின் மற்றும் பொருத்தப்பட்ட தாவல்கள் ஆகியவற்றை மீட்டமைக்கும். மேலும் இது எல்லா நீட்டிப்புகளை முடக்கி, குக்கீகள் போன்ற தற்காலிகத் தரவையும் அழிக்கும். உங்கள் புத்தகக்குறிகள், வரலாறு மற்றும் சேமித்த கடவுச்சொற்கள் அழிக்கப்படாது.</translation> <translation id="1434886155212424586">புதிய தாவல் பக்கமே முகப்புப் பக்கமாகும்</translation> <translation id="1435550882135542937">நீட்டிப்புக் கருவிப்பட்டியின் மறுவடிவமைப்பு</translation> <translation id="1436784010935106834">அகற்றப்பட்டது</translation> @@ -505,7 +505,7 @@ <translation id="1702534956030472451">வெஸ்டர்ன்</translation> <translation id="1702987929180449188">இயக்கப்பட்டால், dp >= 800 என்கிற குறைந்தளவுத் திரை கொண்ட சாதனங்களில் உருட்டப்படுகையில், கருவிப்பட்டி ஒருபோதும் மறைக்கப்படாது. ஆனால், பக்கத்தின் உள்ளடக்கம் முழுத்திரைக்கு மாற்றப்பட்டால் அது தொடர்ந்து மறைக்கப்பட்டதாகவே இருக்கும்.</translation> <translation id="1707463636381878959">பிற பயனர்களுடன் இந்தப் பிணையத்தைப் பகிர்</translation> -<translation id="1708199901407471282">புதிய தாவல் பக்கத்திலிருந்து பரிந்துரைக்கப்பட்ட இணையப் பக்கத்தைத் திறக்கும் போது, பரிந்துரைக்கான தாவல் ஏற்கனவே திறந்திருந்தால், புதிய தாவலில் பரிந்துரையை ஏற்றுவதற்கு பதில் திறந்திருப்பதற்கு மாறவும்.</translation> +<translation id="1708199901407471282">புதிய தாவல் பக்கத்திலிருந்து பரிந்துரைக்கப்பட்ட இணையப் பக்கத்தைத் திறக்கும் போது, பரிந்துரைக்கான தாவல் ஏற்கனவே திறந்திருந்தால், புதிய தாவலில் பரிந்துரையை ஏற்றுவதற்கு பதில் திறந்திருப்பதற்கு மாறும்.</translation> <translation id="1708338024780164500">(செயல்படா நிலையில்)</translation> <translation id="1711973684025117106">ஜிப் செய்தல் தோல்வி, எதிர்பாராத பிழை: $1</translation> <translation id="1715941336038158809">செல்லாத பயனர் பெயர் அல்லது கடவுச்சொல்.</translation> @@ -692,7 +692,7 @@ <translation id="2028997212275086731">RAR archive</translation> <translation id="203168018648013061">ஒத்திசைவுப் பிழை: Google டாஷ்போர்டின் மூலம் ஒத்திசைவை மீட்டமைக்கவும்.</translation> <translation id="2031695690821674406">பக்கம் ஏற்றப்படும் போது தானாக நற்சான்றுகளை நிரப்புவதற்குப் பதிலாக பயனரால் வெளிப்படையாக தேர்ந்தெடுக்கும் போது கடவுச்சொற்களை நிரப்புகிறது.</translation> -<translation id="2031925387125903299">உங்கள் முதல் வருகையில் புதிய தளங்களை உங்கள் பெற்றோர்கள் அனுமதிக்க வேண்டும் என்பதால் இந்தச் செய்தியைப் பார்க்கிறீர்கள்.</translation> +<translation id="2031925387125903299">முதல் முறை நீங்கள் பார்வையிடும் புதிய தளங்களை உங்கள் பெற்றோர்கள் அனுமதிக்க வேண்டும் என்பதால் இந்தச் செய்தியைப் பார்க்கிறீர்கள்.</translation> <translation id="2040460856718599782">அச்சச்சோ! உங்களை அங்கீகரிக்க முயற்சிக்கும்போது ஏதோ தவறு நடந்துவிட்டது. உங்கள் உள்நுழைவு நற்சான்றிதழ்களை இருமுறை சரிபார்த்து மீண்டும் முயற்சி செய்க.</translation> <translation id="204497730941176055">Microsoft சான்றிதழ் டெம்பிளேட் பெயர்</translation> <translation id="2045969484888636535">தொடர்ந்து குக்கீகளைத் தடுக்கவும்</translation> @@ -2694,7 +2694,7 @@ <translation id="4927301649992043040">நீட்டிப்பு தொகுப்பாக்கம்</translation> <translation id="4927753642311223124">பார்க்க இங்கு எதுவுமில்லை, தொடரவும்.</translation> <translation id="4929925845384605079">வலைப் பயன்பாட்டைத் தங்கள் ஷெல்ஃபிற்குச் சேர்க்கும்படி, அல்லது அதற்கு இணையான பிற இயங்குதளம் சார்ந்தவற்றைச் சேர்க்கும்படி ஒரு பயனரை அழைக்கக்கூடிய, ஷெல்ஃபிற்குச் சேர்ப்பதற்கான பேனர்களின் காட்சியை இயக்கும்.</translation> -<translation id="4930497775425430760">உங்கள் முதல் வருகையில் புதிய தளங்களை உங்கள் பெற்றோர் அனுமதிக்க வேண்டும் என்பதால் இந்தச் செய்தியைப் பார்க்கிறீர்கள்.</translation> +<translation id="4930497775425430760">முதல் முறை நீங்கள் பார்வையிடும் புதிய தளங்களை உங்கள் பெற்றோர் அனுமதிக்க வேண்டும் என்பதால் இந்தச் செய்தியைப் பார்க்கிறீர்கள்.</translation> <translation id="4933484234309072027"><ph name="URL" /> இல் உட்பொதியப்பட்டது</translation> <translation id="493571969993549666">கண்காணிக்கப்படும் பயனரைச் சேர்</translation> <translation id="4938972461544498524">டச்பேட் அமைப்புகள்</translation> @@ -3194,7 +3194,7 @@ <translation id="5669267381087807207">செயலாக்குகிறது</translation> <translation id="5669462439438204699">கிரெடிட் கார்டைச் சேமி</translation> <translation id="5671961047338275645">தளங்களை நிர்வகி</translation> -<translation id="5675224880872496917">பக்கத்தின் உள்ளடக்கத்தை உருட்டும் போது தெளிவாக அனிமேஷனை இயக்கும்.</translation> +<translation id="5675224880872496917">பக்கத்தின் உள்ளடக்கத்தை உருட்டும் போது தடங்கலற்ற அனிமேஷனை இயக்கும்.</translation> <translation id="5676267133227121599"><ph name="MANAGEMENT_LINK" /> இல் எந்தச் சாதனத்திலிருந்தும், உங்கள் கடவுச்சொற்களை அணுகலாம்.</translation> <translation id="5677503058916217575">பக்கத்தின் மொழி:</translation> <translation id="5677928146339483299">தடுக்கப்பட்டது</translation> @@ -3440,7 +3440,6 @@ <translation id="604001903249547235">மேகக்கணி காப்புப் பிரதி</translation> <translation id="6040143037577758943">மூடு</translation> <translation id="604124094241169006">தானியங்கு</translation> -<translation id="6042308850641462728">மேலும்</translation> <translation id="604257181445267932">Google இல் நீங்கள் சேமித்துள்ள கடவுச்சொற்களைப் பயன்படுத்தி பயன்பாடுகளிலும் தளங்களிலும் விரைவாக உள்நுழைய Smart Lock உதவுகிறது.</translation> <translation id="6049065490165456785">உட்புற கேமராவிலிருந்து படம்</translation> <translation id="6051028581720248124">FedEx அலுவலகத்தில் அச்சிடுவதன் மூலம், அவர்களின் <ph name="START_LINK" />பயன்பாட்டு விதிகளை<ph name="END_LINK" /> ஒப்புக்கொள்கிறீர்கள்.</translation> @@ -4196,7 +4195,7 @@ <translation id="7240120331469437312">சான்றிதழ் பொருள் மாற்றுப் பெயர்</translation> <translation id="7241389281993241388">கிளையன்ட் சான்றிதழை இறக்குமதி செய்ய தயவுசெய்து <ph name="TOKEN_NAME" /> இல் உள்நுழைக.</translation> <translation id="7243055093079293866">புதிய தாவல் மற்றும் google.com இல் "Ok Google" என்று சொல்லவும்</translation> -<translation id="7246609911581847514">உங்கள் முதல் வருகையில் புதிய தளங்களை உங்கள் நிர்வாகி அனுமதிக்க வேண்டும் என்பதால் இந்தச் செய்தியைப் பார்க்கிறீர்கள்.</translation> +<translation id="7246609911581847514">முதல் முறை நீங்கள் பார்வையிடும் புதிய தளங்களை உங்கள் நிர்வாகி அனுமதிக்க வேண்டும் என்பதால் இந்தச் செய்தியைப் பார்க்கிறீர்கள்.</translation> <translation id="724691107663265825">தளத்தில் தீம்பொருள் உள்ளது</translation> <translation id="725109152065019550">மன்னிக்கவும், உங்கள் கணக்கில் வெளிப்புறச் சேமிப்பை நிர்வாகி முடக்கியுள்ளார்.</translation> <translation id="7252661675567922360">ஏற்ற வேண்டாம்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 794927f4..43025aa 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -316,7 +316,7 @@ <translation id="1467432559032391204">ఎడమ</translation> <translation id="1467999917853307373"><ph name="URL" /> శాశ్వతంగా డేటాను మీ పరికరంలో నిల్వ చేయాలనుకుంటోంది.</translation> <translation id="1468038450257740950">WebGLకి మద్దతు లేదు.</translation> -<translation id="1469042717030597817">ప్రారంభిస్తే, సిస్టమ్ మెమరీ తక్కువగా ఉన్నప్పుడు ట్యాబ్లు మెమరీ నుండి స్వయంచాలకంగా తీసివేయబడతాయి. తీసివేసిన ట్యాబ్లు ఇప్పటికీ ట్యాబ్ స్ట్రిప్లో కనిపిస్తాయి మరియు క్లిక్ చేసినప్పుడు మళ్లీ లోడ్ అవుతాయి. తీసివేసిన ట్యాబ్ల గురించి సమాచారాన్ని chrome://discardsలో పొందవచ్చు.</translation> +<translation id="1469042717030597817">ప్రారంభిస్తే, సిస్టమ్ మెమరీ తక్కువగా ఉన్నప్పుడు ట్యాబ్లు మెమరీ నుండి స్వయంచాలకంగా తీసివేయబడతాయి. తీసివేసిన ట్యాబ్లు ఇప్పటికీ ట్యాబ్ స్ట్రిప్లో కనిపిస్తాయి మరియు వాటిపై క్లిక్ చేసినప్పుడు మళ్లీ లోడ్ అవుతాయి. తీసివేసిన ట్యాబ్ల గురించి సమాచారాన్ని chrome://discardsలో పొందవచ్చు.</translation> <translation id="1470719357688513792">పేజీ లోడ్ అయిన తర్వాత క్రొత్త కుకీ సెట్టింగ్లు ప్రభావం చూపుతాయి.</translation> <translation id="1470811252759861213">మీ అన్ని కంప్యూటర్ల్లో మీ పొడిగింపులను పొందడానికి, <ph name="SIGN_IN_LINK" />.</translation> <translation id="14720830734893704">వర్చువల్ కీబోర్డ్ మద్దతును ప్రారంభించండి.</translation> @@ -3444,7 +3444,6 @@ <translation id="604001903249547235">Cloud బ్యాకప్</translation> <translation id="6040143037577758943">మూసివేయి</translation> <translation id="604124094241169006">స్వయంచాలకంగా</translation> -<translation id="6042308850641462728">మరింత</translation> <translation id="604257181445267932">Smart Lock అనువర్తనాలు మరియు సైట్లకు శీఘ్రంగా సైన్ ఇన్ చేయడంలో మీరు Googleతో సేవ్ చేసిన పాస్వర్డ్లను ఉపయోగించి మీకు సహాయపడగలదు.</translation> <translation id="6049065490165456785">అంతర్గత కెమెరా నుండి ఫోటో</translation> <translation id="6051028581720248124">FedEx కార్యాలయానికి ముద్రించడం ద్వారా, మీరు వారి <ph name="START_LINK" />ఉపయోగ నిబంధనలు<ph name="END_LINK" />ను అంగీకరిస్తున్నారు.</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 8bfb065..fde84ec 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -3442,7 +3442,6 @@ <translation id="604001903249547235">การสำรองข้อมูลในระบบคลาวด์</translation> <translation id="6040143037577758943">ปิด</translation> <translation id="604124094241169006">อัตโนมัติ</translation> -<translation id="6042308850641462728">เพิ่มเติม</translation> <translation id="604257181445267932">Smart Lock ช่วยให้คุณลงชื่อเข้าใช้แอปและเว็บไซต์ได้รวดเร็วด้วยรหัสผ่านที่คุณบันทึกไว้กับ Google</translation> <translation id="6049065490165456785">รูปภาพจากกล้องภายใน</translation> <translation id="6051028581720248124">การพิมพ์ไปยังสำนักงาน FedEx หมายถึงคุณยอมรับ<ph name="START_LINK" />ข้อกำหนดในการให้บริการ<ph name="END_LINK" />ของสำนักงาน</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 323a89a..e164c23 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -290,7 +290,7 @@ <translation id="1429740407920618615">Sinyal Gücü:</translation> <translation id="143027896309062157">Bilgisayarınızda ve ziyaret ettiğiniz web sitelerinde tüm verilerinizi okuma ve değiştirme</translation> <translation id="1430915738399379752">Yazdır</translation> -<translation id="1434696352799406980">Bu işlem, başlangıç sayfanızı, yeni sekme sayfanızı, arama motorunuzu ve sabit sekmelerinizi sıfırlar. Ayrıca, tüm uzantılar devre dışı bırakılır ve çerezler gibi geçici veriler temizlenir. Yer işaretleriniz, geçmişiniz ve kayıtlı parolalarınız temizlenmez.</translation> +<translation id="1434696352799406980">Bu işlem, başlangıç sayfanızı, yeni sekme sayfanızı, arama motorunuzu ve sabit sekmelerinizi sıfırlar. Ayrıca, tüm uzantılar devre dışı bırakılır ve çerezler gibi geçici veriler temizlenir. Yer işaretleriniz, geçmişiniz ve kayıtlı şifreleriniz temizlenmez.</translation> <translation id="1434886155212424586">Ana sayfa Yeni Sekme sayfasıdır</translation> <translation id="1435550882135542937">Uzantı araç çubuğu yeniden tasarımı</translation> <translation id="1436784010935106834">Kaldırıldı</translation> @@ -2392,7 +2392,7 @@ <translation id="4449996769074858870">Bu sekmede ses çalınıyor.</translation> <translation id="4450974146388585462">Teşhis Et</translation> <translation id="4454939697743986778">Bu sertifika, sistem yöneticiniz tarafından yüklenmiştir.</translation> -<translation id="4458874409874303848">Google SafeSites</translation> +<translation id="4458874409874303848">SafeSites</translation> <translation id="445923051607553918">Kablosuz ağa bağlan</translation> <translation id="4461847750548395463">Google SafeSites etkinleştirilmiş olduğu için bu iletiyi görüyorsunuz.</translation> <translation id="4462159676511157176">Özel ad sunucuları</translation> @@ -3446,7 +3446,6 @@ <translation id="604001903249547235">Bulut yedekleme</translation> <translation id="6040143037577758943">Kapat</translation> <translation id="604124094241169006">Otomatik</translation> -<translation id="6042308850641462728">Daha fazla</translation> <translation id="604257181445267932">Smart Lock, Google'a kaydettiğiniz şifreleri kullanarak uygulamalarda ve sitelerde hızlı şekilde oturum açmanıza yardımcı olur.</translation> <translation id="6049065490165456785">Dahili kamera fotoğrafı</translation> <translation id="6051028581720248124">FedEx Office'e yazdırarak, kendilerinin <ph name="START_LINK" />kullanım şartlarını<ph name="END_LINK" /> kabul etmiş olursunuz.</translation> @@ -5096,7 +5095,7 @@ <translation id="8584280235376696778">Videoyu yeni sekmede &aç</translation> <translation id="8589311641140863898">Deneysel Uzantı API'ları</translation> <translation id="8590375307970699841">Otomatik güncellemeleri ayarla</translation> -<translation id="8591846766485502580">Ebeveynlerinizden biri bu siteyi engellediği için bu iletiyi görüyorsunuz.</translation> +<translation id="8591846766485502580">Bir ebeveyniniz bu siteyi engellediği için bu iletiyi görüyorsunuz.</translation> <translation id="8592071947729879125">iframe izinlerini kısıtla.</translation> <translation id="859285277496340001">Sertifika, iptal edilip edilmediğinin denetlenebileceği bir mekanizma belirtmiyor.</translation> <translation id="8594787581355215556"><ph name="USER_EMAIL_ADDRESS" /> olarak oturum açıldı. Senkronize edilmiş verilerinizi <ph name="BEGIN_LINK" />Google Hesap Özeti<ph name="END_LINK" />'nde yönetebilirsiniz.</translation> @@ -5505,7 +5504,7 @@ <translation id="9188441292293901223">Bu <ph name="DEVICE_TYPE" /> cihazın kilidini açmak için lütfen telefonunuzu daha yeni bir Android sürümüne güncelleyin.</translation> <translation id="9189690067274055051">Giriş yapmak için telefonunuzun kilidini açın ve <ph name="DEVICE_TYPE" /> cihazınıza yaklaştırın.</translation> <translation id="9190063653747922532">L2TP/IPsec + önceden paylaşılan anahtar</translation> -<translation id="9201305942933582053">Chrome içinGoogle Now!</translation> +<translation id="9201305942933582053">Chrome için Google Now!</translation> <translation id="9203398526606335860">&Profil oluşturma etkin</translation> <translation id="9203478404496196495">Sekmenin sesini aç</translation> <translation id="9203962528777363226">Bu cihazın yöneticisi yeni kullanıcıların eklenmesini devre dışı bıraktı</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 764ad4e..bea4724 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -2371,7 +2371,7 @@ <translation id="4422347585044846479">Редагувати закладку для цієї сторінки</translation> <translation id="4422428420715047158">Домен:</translation> <translation id="442477792133831654">Обмінюватися даними з пристроями поблизу</translation> -<translation id="4425149324548788773">Мій Диск</translation> +<translation id="4425149324548788773">Мій диск</translation> <translation id="4428582326923056538">В Adobe Flash Player використовуються інші винятки для камери.</translation> <translation id="4433914671537236274">Створення носія для відновлення</translation> <translation id="4434147949468540706">Прокрутка й ефект</translation> @@ -3443,7 +3443,6 @@ <translation id="604001903249547235">Резервне копіювання у хмару</translation> <translation id="6040143037577758943">Закрити</translation> <translation id="604124094241169006">Автоматично</translation> -<translation id="6042308850641462728">Більше</translation> <translation id="604257181445267932">Завдяки Smart Lock можна швидко входити в додатки й на сайти за допомогою паролів, збережених у Google.</translation> <translation id="6049065490165456785">Фотографія з внутрішньої камери</translation> <translation id="6051028581720248124">Друкуючи в службу FedEx Office, ви приймаєте її <ph name="START_LINK" />Загальні положення та умови<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index f8348c3..50e33ae 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -3448,7 +3448,6 @@ <translation id="604001903249547235">Sao lưu đám mây</translation> <translation id="6040143037577758943">Đóng</translation> <translation id="604124094241169006">Tự động</translation> -<translation id="6042308850641462728">Thêm</translation> <translation id="604257181445267932">Smart Lock giúp bạn đăng nhập nhanh vào ứng dụng và trang web nhờ sử dụng mật khẩu bạn đã lưu với Google.</translation> <translation id="6049065490165456785">Ảnh từ máy ảnh nội bộ</translation> <translation id="6051028581720248124">Bằng cách in tới FedEx Office, bạn đồng ý với <ph name="START_LINK" />điều khoản sử dụng<ph name="END_LINK" /> của họ.</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 2699ef0..6ee28a5 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -689,7 +689,7 @@ <translation id="2028997212275086731">RAR 归档</translation> <translation id="203168018648013061">发生同步错误:请通过 Google 信息中心重置同步。</translation> <translation id="2031695690821674406">在用户明确选择了帐户时填充密码,而不是在页面加载时自动填充凭据。</translation> -<translation id="2031925387125903299">您之所以看到这条消息,是因为您第一次访问新的网站时需要获得父母的批准。</translation> +<translation id="2031925387125903299">您之所以看到这条消息,是因为您第一次访问新的网站时需要获得家长的批准。</translation> <translation id="2040460856718599782">糟糕!尝试验证您的身份时出现错误。请仔细检查您的登录凭据,然后重试。</translation> <translation id="204497730941176055">Microsoft 证书模板名称</translation> <translation id="2045969484888636535">继续拦截 Cookie</translation> @@ -1199,7 +1199,7 @@ <translation id="2772936498786524345">忍者</translation> <translation id="2773948261276885771">设置网页</translation> <translation id="2776441542064982094">似乎没有可用于在网络中注册的设备。如果您的设备已开启并连接到互联网,请按照说明手册中的说明尝试对其进行注册。</translation> -<translation id="2778107779445548489">您之所以看到这条消息,是因为您父母屏蔽了此网站。</translation> +<translation id="2778107779445548489">您之所以看到这条消息,是因为您的家长屏蔽了此网站。</translation> <translation id="2778459533137481732">权限黑名单</translation> <translation id="2779552785085366231">您可以将此网页添加到应用启动器</translation> <translation id="2781645665747935084">比利时语</translation> @@ -2684,7 +2684,7 @@ <translation id="4927301649992043040">打包扩展程序</translation> <translation id="4927753642311223124">这里没有任何通知,往前走吧。</translation> <translation id="4929925845384605079">显示“添加到文件架”横幅(提示用户将网络应用添加到文件架或其他平台上的同等位置)。</translation> -<translation id="4930497775425430760">您之所以看到这条消息,是因为您第一次访问新的网站时需要获得父母的批准。</translation> +<translation id="4930497775425430760">您之所以看到这条消息,是因为您第一次访问新的网站时需要获得家长的批准。</translation> <translation id="4933484234309072027">嵌入 <ph name="URL" /></translation> <translation id="493571969993549666">添加受监管用户</translation> <translation id="4938972461544498524">触控板设置</translation> @@ -3182,7 +3182,7 @@ <translation id="5669267381087807207">正在激活</translation> <translation id="5669462439438204699">保存信用卡</translation> <translation id="5671961047338275645">管理网站</translation> -<translation id="5675224880872496917">在滚动页面内容时显示流畅的动画效果。</translation> +<translation id="5675224880872496917">在滚动页面内容时平滑移动画面。</translation> <translation id="5676267133227121599">您可以在任意设备上通过 <ph name="MANAGEMENT_LINK" /> 获取您的密码。</translation> <translation id="5677503058916217575">网页语言:</translation> <translation id="5677928146339483299">已屏蔽</translation> @@ -3428,7 +3428,6 @@ <translation id="604001903249547235">云端备份</translation> <translation id="6040143037577758943">关闭</translation> <translation id="604124094241169006">自动</translation> -<translation id="6042308850641462728">更多</translation> <translation id="604257181445267932">借助 Smart Lock,您可以使用 Google 为您保存的密码快速登录应用和网站。</translation> <translation id="6049065490165456785">内部相机中的照片</translation> <translation id="6051028581720248124">通过 FedEx Office 进行打印即表示您接受其<ph name="START_LINK" />使用条款<ph name="END_LINK" />。</translation> @@ -3499,7 +3498,7 @@ <translation id="6144890426075165477"><ph name="PRODUCT_NAME" />目前不是默认浏览器。</translation> <translation id="6147020289383635445">打印预览失败。</translation> <translation id="614998064310228828">设备型号:</translation> -<translation id="6150607114729249911">糟糕!您必须先征得父母同意,然后才能访问此网页。</translation> +<translation id="6150607114729249911">糟糕!您必须先征得家长同意,然后才能访问此网页。</translation> <translation id="6150853954427645995">要保存此文件以供离线使用,请恢复联网状态,右键点击文件,然后选择<ph name="OFFLINE_CHECKBOX_NAME" />选项。</translation> <translation id="6151323131516309312">按 <ph name="SEARCH_KEY" /> 可通过 <ph name="SITE_NAME" /> 进行搜索</translation> <translation id="6154697846084421647">当前已登录</translation> @@ -4178,7 +4177,7 @@ <translation id="7224023051066864079">子网掩码:</translation> <translation id="7225179976675429563">缺少网络类型</translation> <translation id="7231224339346098802">用数字指明要打印多少份(1 份或多份)。</translation> -<translation id="7231308970288859235">糟糕!您必须先征得父母同意,然后才能访问此网页。</translation> +<translation id="7231308970288859235">糟糕!您必须先征得家长同意,然后才能访问此网页。</translation> <translation id="7238585580608191973">SHA-256 指纹</translation> <translation id="7240120331469437312">证书主题背景的备用名称</translation> <translation id="7241389281993241388">请登录“<ph name="TOKEN_NAME" />”,导入客户端证书。</translation> @@ -5066,7 +5065,7 @@ <translation id="8584280235376696778">在新标签页中打开视频(&O)</translation> <translation id="8589311641140863898">实验性扩展程序 API</translation> <translation id="8590375307970699841">设置自动更新</translation> -<translation id="8591846766485502580">您之所以看到这条消息,是因为您父母屏蔽了此网站。</translation> +<translation id="8591846766485502580">您之所以看到这条消息,是因为您的一位家长屏蔽了此网站。</translation> <translation id="8592071947729879125">限制 iframe 的权限。</translation> <translation id="859285277496340001">证书未指定用于检查是否已吊销证书的机制。</translation> <translation id="8594787581355215556">您已用 <ph name="USER_EMAIL_ADDRESS" /> 的身份登录。可以在 <ph name="BEGIN_LINK" />Google 信息中心<ph name="END_LINK" />里管理已同步的数据。</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 95efcaf..b7dd492 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -692,7 +692,7 @@ <translation id="2028997212275086731">RAR 封存</translation> <translation id="203168018648013061">同步功能錯誤:請透過「Google 資訊主頁」重設「同步功能」。</translation> <translation id="2031695690821674406">當使用者明確選取帳戶時才填入密碼,而不要在網頁載入後自動填入憑證。</translation> -<translation id="2031925387125903299">Chrome 顯示這則訊息是因為您的家長需要核准您首次瀏覽的新網站。</translation> +<translation id="2031925387125903299">Chrome 顯示這則訊息是因為您首次瀏覽的新網站需要獲得您的家長核准。</translation> <translation id="2040460856718599782">糟糕!嘗試驗證您的身分時發生錯誤。請重新檢查您的登入憑證,然後再試一次。</translation> <translation id="204497730941176055">Microsoft 憑證範本名稱</translation> <translation id="2045969484888636535">繼續封鎖 Cookie</translation> @@ -2692,7 +2692,7 @@ <translation id="4927301649992043040">封裝擴充功能</translation> <translation id="4927753642311223124">這裡沒有任何通知訊息,以後再來看看吧!</translation> <translation id="4929925845384605079">顯示加到檔案櫃橫幅,提示使用者將網路應用程式加到個人檔案櫃或其他平台的同等容器中。</translation> -<translation id="4930497775425430760">Chrome 顯示這則訊息是因為您的家長需要核准您首次瀏覽的新網站。</translation> +<translation id="4930497775425430760">Chrome 顯示這則訊息是因為您首次瀏覽的新網站需要獲得您的家長核准。</translation> <translation id="4933484234309072027">嵌入至 <ph name="URL" /></translation> <translation id="493571969993549666">新增受監管的使用者</translation> <translation id="4938972461544498524">觸控板設定</translation> @@ -3437,7 +3437,6 @@ <translation id="604001903249547235">雲端備份</translation> <translation id="6040143037577758943">關閉</translation> <translation id="604124094241169006">自動</translation> -<translation id="6042308850641462728">詳細資訊</translation> <translation id="604257181445267932">有了 Smart Lock,您就可以透過儲存在 Google 系統中的密碼快速登入應用程式和網站。</translation> <translation id="6049065490165456785">內部相機中的相片</translation> <translation id="6051028581720248124">透過 FedEx Office 進行列印,即表示您接受其<ph name="START_LINK" />使用條款<ph name="END_LINK" />。</translation> @@ -4192,7 +4191,7 @@ <translation id="7240120331469437312">憑證主體替代名稱</translation> <translation id="7241389281993241388">登入 <ph name="TOKEN_NAME" /> 即可匯入用戶端憑證。</translation> <translation id="7243055093079293866">在新分頁和 google.com 中說出「Ok Google」</translation> -<translation id="7246609911581847514">Chrome 顯示這則訊息是因為您的管理員需要核准您首次瀏覽的新網站。</translation> +<translation id="7246609911581847514">Chrome 顯示這則訊息是因為您首次瀏覽的新網站需要獲得管理員核准。</translation> <translation id="724691107663265825">您要造訪的網站含有惡意軟體</translation> <translation id="725109152065019550">很抱歉,您的管理員已停用您帳戶中的外部儲存裝置。</translation> <translation id="7252661675567922360">不要載入</translation>
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_avatar.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_avatar.png new file mode 100644 index 0000000..39cee7a --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_avatar.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_bottom.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_bottom.png new file mode 100644 index 0000000..cd31098 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_bottom.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_bottom_left.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_bottom_left.png new file mode 100644 index 0000000..cd31098 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_bottom_left.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_bottom_right.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_bottom_right.png new file mode 100644 index 0000000..cd31098 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_bottom_right.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_center.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_center.png new file mode 100644 index 0000000..7b6c31cc --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_center.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_bottom.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_bottom.png new file mode 100644 index 0000000..1e05a12 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_bottom.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_bottom_left.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_bottom_left.png new file mode 100644 index 0000000..1e05a12 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_bottom_left.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_bottom_right.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_bottom_right.png new file mode 100644 index 0000000..1e05a12 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_bottom_right.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_center.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_center.png new file mode 100644 index 0000000..97e8d14 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_center.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_left.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_left.png new file mode 100644 index 0000000..97e8d14 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_left.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_right.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_right.png new file mode 100644 index 0000000..97e8d14 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_right.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_top.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_top.png new file mode 100644 index 0000000..74beec4 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_top.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_top_left.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_top_left.png new file mode 100644 index 0000000..74beec4 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_top_left.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_top_right.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_top_right.png new file mode 100644 index 0000000..74beec4 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_hover_top_right.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_left.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_left.png new file mode 100644 index 0000000..7b6c31cc --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_left.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_bottom.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_bottom.png new file mode 100644 index 0000000..58cbeba --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_bottom.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_bottom_left.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_bottom_left.png new file mode 100644 index 0000000..58cbeba --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_bottom_left.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_bottom_right.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_bottom_right.png new file mode 100644 index 0000000..58cbeba --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_bottom_right.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_center.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_center.png new file mode 100644 index 0000000..b8616b0 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_center.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_left.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_left.png new file mode 100644 index 0000000..b8616b0 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_left.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_right.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_right.png new file mode 100644 index 0000000..b8616b0 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_right.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_top.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_top.png new file mode 100644 index 0000000..91c2828 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_top.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_top_left.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_top_left.png new file mode 100644 index 0000000..91c2828 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_top_left.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_top_right.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_top_right.png new file mode 100644 index 0000000..91c2828 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_pressed_top_right.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_right.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_right.png new file mode 100644 index 0000000..7b6c31cc --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_right.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_top.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_top.png new file mode 100644 index 0000000..e6fe999 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_top.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_top_left.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_top_left.png new file mode 100644 index 0000000..e6fe999 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_top_left.png Binary files differ
diff --git a/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_top_right.png b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_top_right.png new file mode 100644 index 0000000..e6fe999 --- /dev/null +++ b/chrome/app/theme/default_100_percent/win/avatar_button/win8/sign_in_button_top_right.png Binary files differ
diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resources.grd index 38cadd3..31ae6b84 100644 --- a/chrome/app/theme/theme_resources.grd +++ b/chrome/app/theme/theme_resources.grd
@@ -661,6 +661,36 @@ <structure type="chrome_scaled_image" name="IDR_AVATAR_GLASS_BUTTON_PRESSED_TOP" file="win/avatar_button/win7/sign_in_button_pressed_top.png" /> <structure type="chrome_scaled_image" name="IDR_AVATAR_GLASS_BUTTON_PRESSED_TOP_LEFT" file="win/avatar_button/win7/sign_in_button_pressed_top_left.png" /> <structure type="chrome_scaled_image" name="IDR_AVATAR_GLASS_BUTTON_PRESSED_TOP_RIGHT" file="win/avatar_button/win7/sign_in_button_pressed_top_right.png" /> + + <!-- Windows, metro --> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_AVATAR" file="win/avatar_button/win8/sign_in_button_avatar.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_NORMAL_BOTTOM" file="win/avatar_button/win8/sign_in_button_bottom.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_NORMAL_BOTTOM_LEFT" file="win/avatar_button/win8/sign_in_button_bottom_left.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_NORMAL_BOTTOM_RIGHT" file="win/avatar_button/win8/sign_in_button_bottom_right.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_NORMAL_CENTER" file="win/avatar_button/win8/sign_in_button_center.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_NORMAL_LEFT" file="win/avatar_button/win8/sign_in_button_left.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_NORMAL_RIGHT" file="win/avatar_button/win8/sign_in_button_right.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_NORMAL_TOP" file="win/avatar_button/win8/sign_in_button_top.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_NORMAL_TOP_LEFT" file="win/avatar_button/win8/sign_in_button_top_left.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_NORMAL_TOP_RIGHT" file="win/avatar_button/win8/sign_in_button_top_right.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_HOVER_BOTTOM" file="win/avatar_button/win8/sign_in_button_hover_bottom.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_HOVER_BOTTOM_LEFT" file="win/avatar_button/win8/sign_in_button_hover_bottom_left.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_HOVER_BOTTOM_RIGHT" file="win/avatar_button/win8/sign_in_button_hover_bottom_right.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_HOVER_CENTER" file="win/avatar_button/win8/sign_in_button_hover_center.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_HOVER_LEFT" file="win/avatar_button/win8/sign_in_button_hover_left.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_HOVER_RIGHT" file="win/avatar_button/win8/sign_in_button_hover_right.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_HOVER_TOP" file="win/avatar_button/win8/sign_in_button_hover_top.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_HOVER_TOP_LEFT" file="win/avatar_button/win8/sign_in_button_hover_top_left.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_HOVER_TOP_RIGHT" file="win/avatar_button/win8/sign_in_button_hover_top_right.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_PRESSED_BOTTOM" file="win/avatar_button/win8/sign_in_button_pressed_bottom.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_PRESSED_BOTTOM_LEFT" file="win/avatar_button/win8/sign_in_button_pressed_bottom_left.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_PRESSED_BOTTOM_RIGHT" file="win/avatar_button/win8/sign_in_button_pressed_bottom_right.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_PRESSED_CENTER" file="win/avatar_button/win8/sign_in_button_pressed_center.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_PRESSED_LEFT" file="win/avatar_button/win8/sign_in_button_pressed_left.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_PRESSED_RIGHT" file="win/avatar_button/win8/sign_in_button_pressed_right.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_PRESSED_TOP" file="win/avatar_button/win8/sign_in_button_pressed_top.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_PRESSED_TOP_LEFT" file="win/avatar_button/win8/sign_in_button_pressed_top_left.png" /> + <structure type="chrome_scaled_image" name="IDR_AVATAR_METRO_BUTTON_PRESSED_TOP_RIGHT" file="win/avatar_button/win8/sign_in_button_pressed_top_right.png" /> </if> <!-- toolkit_views and not is_macosx --> <if expr="is_macosx"> <!-- Mac -->
diff --git a/chrome/browser/android/signin/signin_manager_android.cc b/chrome/browser/android/signin/signin_manager_android.cc index fcfd74e..06c80fe 100644 --- a/chrome/browser/android/signin/signin_manager_android.cc +++ b/chrome/browser/android/signin/signin_manager_android.cc
@@ -159,8 +159,9 @@ void SigninManagerAndroid::SignOut(JNIEnv* env, const JavaParamRef<jobject>& obj) { - SigninManagerFactory::GetForProfile(profile_)->SignOut( - signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS); + SigninManagerFactory::GetForProfile(profile_) + ->SignOut(signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS, + signin_metrics::SignoutDelete::IGNORE_METRIC); } base::android::ScopedJavaLocalRef<jstring>
diff --git a/chrome/browser/android/tab_web_contents_delegate_android.cc b/chrome/browser/android/tab_web_contents_delegate_android.cc index ce946333..9a5d845 100644 --- a/chrome/browser/android/tab_web_contents_delegate_android.cc +++ b/chrome/browser/android/tab_web_contents_delegate_android.cc
@@ -122,11 +122,10 @@ FileSelectHelper::RunFileChooser(web_contents, params); } -scoped_ptr<BluetoothChooser> -TabWebContentsDelegateAndroid::RunBluetoothChooser( +scoped_ptr<BluetoothChooser> TabWebContentsDelegateAndroid::RunBluetoothChooser( content::WebContents* web_contents, const BluetoothChooser::EventHandler& event_handler, - const GURL& origin) { + const url::Origin& origin) { return make_scoped_ptr( new BluetoothChooserAndroid(web_contents, event_handler, origin)); }
diff --git a/chrome/browser/android/tab_web_contents_delegate_android.h b/chrome/browser/android/tab_web_contents_delegate_android.h index 383b198..e2fbdb7 100644 --- a/chrome/browser/android/tab_web_contents_delegate_android.h +++ b/chrome/browser/android/tab_web_contents_delegate_android.h
@@ -45,7 +45,7 @@ scoped_ptr<content::BluetoothChooser> RunBluetoothChooser( content::WebContents* web_contents, const content::BluetoothChooser::EventHandler& event_handler, - const GURL& origin) override; + const url::Origin& origin) override; void CloseContents(content::WebContents* web_contents) override; bool ShouldFocusLocationBarByDefault(content::WebContents* source) override; blink::WebDisplayMode GetDisplayMode(
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 4ef4c6f..769938c 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -1399,11 +1399,15 @@ } #elif defined(OS_POSIX) if (breakpad::IsCrashReporterEnabled()) { + std::string switch_value; scoped_ptr<metrics::ClientInfo> client_info = GoogleUpdateSettings::LoadMetricsClientInfo(); + if (client_info) + switch_value = client_info->client_id; + switch_value.push_back(','); + switch_value.append(chrome::GetChannelString()); command_line->AppendSwitchASCII(switches::kEnableCrashReporter, - client_info ? client_info->client_id - : std::string()); + switch_value); } #endif
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index f334040b..f588683a 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -61,6 +61,7 @@ "//components/certificate_reporting:cert_logger_proto", "//components/certificate_reporting:encrypted_cert_logger_proto", "//components/drive", + "//components/drive:drive_chromeos", "//components/flags_ui", "//components/login", "//components/onc", @@ -176,6 +177,7 @@ ":device_policy_proto", "//ash/resources", "//components/drive", + "//components/drive:test_support_chromeos", "//components/invalidation/public", "//components/policy", "//components/resources",
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc index 4b0cb9b..8d1ea13 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -116,8 +116,6 @@ #include "chromeos/tpm/tpm_token_loader.h" #include "components/arc/arc_bridge_service.h" #include "components/arc/arc_service_manager.h" -#include "components/arc/video/arc_video_bridge.h" -#include "components/arc/video/video_host_delegate.h" #include "components/browser_sync/common/browser_sync_switches.h" #include "components/device_event_log/device_event_log.h" #include "components/metrics/metrics_service.h" @@ -127,7 +125,6 @@ #include "components/user_manager/user.h" #include "components/user_manager/user_manager.h" #include "components/wallpaper/wallpaper_manager_base.h" -#include "content/public/browser/arc_video_host_delegate.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/notification_service.h" #include "content/public/common/content_switches.h" @@ -403,9 +400,6 @@ arc_service_manager_->AddService( make_scoped_ptr(new arc::ArcIntentHelperBridge( arc_service_manager_->arc_bridge_service()))); - arc_service_manager_->AddService(make_scoped_ptr( - new arc::ArcVideoBridge(arc_service_manager_->arc_bridge_service(), - content::CreateArcVideoHostDelegate()))); arc_service_manager_->arc_bridge_service()->DetectAvailability(); chromeos::ResourceReporter::GetInstance()->StartMonitoring();
diff --git a/chrome/browser/chromeos/login/supervised/supervised_user_creation_screen.cc b/chrome/browser/chromeos/login/supervised/supervised_user_creation_screen.cc index 3370ac90..f34493d8 100644 --- a/chrome/browser/chromeos/login/supervised/supervised_user_creation_screen.cc +++ b/chrome/browser/chromeos/login/supervised/supervised_user_creation_screen.cc
@@ -20,6 +20,7 @@ #include "chrome/browser/chromeos/login/supervised/supervised_user_creation_controller.h" #include "chrome/browser/chromeos/login/supervised/supervised_user_creation_controller_new.h" #include "chrome/browser/chromeos/login/supervised/supervised_user_creation_flow.h" +#include "chrome/browser/chromeos/login/ui/login_display_host.h" #include "chrome/browser/chromeos/login/users/avatar/user_image_manager.h" #include "chrome/browser/chromeos/login/users/chrome_user_manager.h" #include "chrome/browser/chromeos/login/users/supervised_user_manager.h" @@ -374,6 +375,13 @@ ash::Shell::GetInstance()-> desktop_background_controller()->MoveDesktopToLockedContainer(); + // Hide the status area and the control bar, since they will show up at the + // logged in users's preferred location, which could be on the left or right + // side of the screen. + LoginDisplayHost* default_host = LoginDisplayHost::default_host(); + default_host->SetStatusAreaVisible(false); + default_host->GetOobeUI()->GetCoreOobeActor()->ShowControlBar(false); + controller_->SetManagerProfile(manager_profile); if (actor_) actor_->ShowUsernamePage();
diff --git a/chrome/browser/chromeos/login/ui/webui_login_view.cc b/chrome/browser/chromeos/login/ui/webui_login_view.cc index b4acbd58..382140e 100644 --- a/chrome/browser/chromeos/login/ui/webui_login_view.cc +++ b/chrome/browser/chromeos/login/ui/webui_login_view.cc
@@ -309,9 +309,9 @@ void WebUILoginView::SetStatusAreaVisible(bool visible) { if (ash::Shell::GetInstance()->HasPrimaryStatusArea()) { ash::SystemTray* tray = ash::Shell::GetInstance()->GetPrimarySystemTray(); + tray->SetVisible(visible); if (visible) { // Tray may have been initialized being hidden. - tray->SetVisible(visible); tray->GetWidget()->Show(); } else { tray->GetWidget()->Hide();
diff --git a/chrome/browser/component_updater/chrome_component_updater_configurator.cc b/chrome/browser/component_updater/chrome_component_updater_configurator.cc index eb0d7830..1ce7601 100644 --- a/chrome/browser/component_updater/chrome_component_updater_configurator.cc +++ b/chrome/browser/component_updater/chrome_component_updater_configurator.cc
@@ -131,7 +131,7 @@ ChromeConfigurator::GetSequencedTaskRunner() const { return content::BrowserThread::GetBlockingPool() ->GetSequencedTaskRunnerWithShutdownBehavior( - content::BrowserThread::GetBlockingPool()->GetSequenceToken(), + base::SequencedWorkerPool::GetSequenceToken(), base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); }
diff --git a/chrome/browser/component_updater/pnacl_component_installer.cc b/chrome/browser/component_updater/pnacl_component_installer.cc index 93b2611..6c47ea1 100644 --- a/chrome/browser/component_updater/pnacl_component_installer.cc +++ b/chrome/browser/component_updater/pnacl_component_installer.cc
@@ -77,8 +77,9 @@ void CheckVersionCompatiblity(const base::Version& current_version) { // Using NoBarrier, since needs_on_demand_update is standalone and does // not have other associated data. - base::subtle::NoBarrier_Store(&needs_on_demand_update, - current_version.IsOlderThan(kMinPnaclVersion)); + base::subtle::NoBarrier_Store( + &needs_on_demand_update, + current_version < base::Version(kMinPnaclVersion)); } // PNaCl is packaged as a multi-CRX. This returns the platform-specific @@ -272,7 +273,7 @@ // |installed_file| actually exists. bool PnaclComponentInstaller::GetInstalledFile(const std::string& file, base::FilePath* installed_file) { - if (current_version().Equals(Version(kNullVersion))) + if (current_version() == Version(kNullVersion)) return false; *installed_file = GetPnaclBaseDirectory() @@ -339,7 +340,7 @@ !CheckPnaclComponentManifest(*manifest, *pnacl_manifest, &manifest_version) || - !current_version.Equals(manifest_version)) { + current_version != manifest_version) { current_version = Version(kNullVersion); } else { OverrideDirPnaclComponent(path);
diff --git a/chrome/browser/dom_distiller/dom_distiller_service_factory.cc b/chrome/browser/dom_distiller/dom_distiller_service_factory.cc index 5178d41..6c194b1 100644 --- a/chrome/browser/dom_distiller/dom_distiller_service_factory.cc +++ b/chrome/browser/dom_distiller/dom_distiller_service_factory.cc
@@ -55,7 +55,7 @@ content::BrowserContext* profile) const { scoped_refptr<base::SequencedTaskRunner> background_task_runner = content::BrowserThread::GetBlockingPool()->GetSequencedTaskRunner( - content::BrowserThread::GetBlockingPool()->GetSequenceToken()); + base::SequencedWorkerPool::GetSequenceToken()); scoped_ptr<leveldb_proto::ProtoDatabaseImpl<ArticleEntry> > db( new leveldb_proto::ProtoDatabaseImpl<ArticleEntry>(
diff --git a/chrome/browser/download/save_page_browsertest.cc b/chrome/browser/download/save_page_browsertest.cc index fbbe0e3f..8518f63 100644 --- a/chrome/browser/download/save_page_browsertest.cc +++ b/chrome/browser/download/save_page_browsertest.cc
@@ -489,7 +489,13 @@ DISALLOW_COPY_AND_ASSIGN(DelayingDownloadManagerDelegate); }; -IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveHTMLOnlyTabDestroy) { +// Disabled on ChromeOS due to flakiness. crbug.com/580766 +#if defined(OS_CHROMEOS) +#define MAYBE_SaveHTMLOnlyTabDestroy DISABLED_SaveHTMLOnlyTabDestroy +#else +#define MAYBE_SaveHTMLOnlyTabDestroy SaveHTMLOnlyTabDestroy +#endif +IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveHTMLOnlyTabDestroy) { GURL url = NavigateToMockURL("a"); scoped_ptr<DelayingDownloadManagerDelegate> delaying_delegate( new DelayingDownloadManagerDelegate(browser()->profile())); @@ -1114,15 +1120,17 @@ std::vector<std::string> expected_substrings(std::begin(arr), std::end(arr)); if (save_page_type == content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML) { - // TODO(lukasza): crbug.com/106364: Expand complete-html test beyond just - // being a crash test. In particular, the |complete_html_arr| below should - // be the same as the |arr| above (and at this point the special-casing of + // TODO(lukasza): crbug.com/106364: Expand complete-html test to cover all + // test frames. In particular, the |complete_html_arr| below should be the + // same as the |arr| above (and at this point the special-casing of // complete-html can be removed). // Draft CLs with fix proposals that should accomplish this: // - crrev.com/1502563004 // - crrev.com/1500103002 std::string complete_html_arr[] = { "frames-runtime-changes.htm: 4388232f-8d45-4d2e-9807-721b381be153", + "subframe1: 21595339-61fc-4854-b6df-0668328ea263", + "subframe2: adf55719-15e7-45be-9eda-d12fe782a1bd", }; expected_substrings = std::vector<std::string>( std::begin(complete_html_arr), std::end(complete_html_arr));
diff --git a/chrome/browser/extensions/active_script_controller.cc b/chrome/browser/extensions/active_script_controller.cc index 4970de2b..2ab86db 100644 --- a/chrome/browser/extensions/active_script_controller.cc +++ b/chrome/browser/extensions/active_script_controller.cc
@@ -89,10 +89,10 @@ switch (type) { case UserScript::CONTENT_SCRIPT: return extension->permissions_data()->GetContentScriptAccess( - extension, url, tab_id, -1, NULL); + extension, url, tab_id, nullptr); case UserScript::PROGRAMMATIC_SCRIPT: - return extension->permissions_data()->GetPageAccess( - extension, url, tab_id, -1, NULL); + return extension->permissions_data()->GetPageAccess(extension, url, + tab_id, nullptr); } NOTREACHED();
diff --git a/chrome/browser/extensions/active_tab_unittest.cc b/chrome/browser/extensions/active_tab_unittest.cc index 53d270a..70bfa17 100644 --- a/chrome/browser/extensions/active_tab_unittest.cc +++ b/chrome/browser/extensions/active_tab_unittest.cc
@@ -109,8 +109,8 @@ PermittedFeature feature, int tab_id) { const PermissionsData* permissions_data = extension->permissions_data(); - bool script = permissions_data->CanAccessPage( - extension.get(), url, tab_id, -1, NULL); + bool script = + permissions_data->CanAccessPage(extension.get(), url, tab_id, nullptr); bool capture = HasTabsPermission(extension, tab_id) && permissions_data->CanCaptureVisiblePage(tab_id, NULL); switch (feature) {
diff --git a/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc b/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc index 8e997014..1770ca5 100644 --- a/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc +++ b/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc
@@ -27,7 +27,6 @@ #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_plugin_guest_manager.h" #include "content/public/browser/render_frame_host.h" -#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/render_widget_host.h" #include "content/public/browser/render_widget_host_view.h" @@ -148,11 +147,9 @@ return true; int tab_id = ExtensionTabUtil::GetTabId(contents); - content::RenderProcessHost* process = contents->GetRenderProcessHost(); - int process_id = process ? process->GetID() : -1; std::string unused_error; - return extension->permissions_data()->CanAccessPage( - extension, url, tab_id, process_id, &unused_error); + return extension->permissions_data()->CanAccessPage(extension, url, tab_id, + &unused_error); } // Helper class that implements an action adapter for a |RenderFrameHost|.
diff --git a/chrome/browser/extensions/api/messaging/message_service.cc b/chrome/browser/extensions/api/messaging/message_service.cc index 0cc7aa2..06cd628 100644 --- a/chrome/browser/extensions/api/messaging/message_service.cc +++ b/chrome/browser/extensions/api/messaging/message_service.cc
@@ -449,6 +449,7 @@ source_extension_id, source, false)); if (!channel->opener->IsValidPort()) return; + channel->opener->OpenPort(source_process_id, source_routing_id); // Get handle of the native view and pass it to the native messaging host. gfx::NativeView native_view = source ? source->GetNativeView() : nullptr; @@ -575,6 +576,7 @@ params->source_extension_id, source, false)); if (!opener->IsValidPort()) return; + opener->OpenPort(params->source_process_id, params->source_routing_id); params->receiver->RemoveCommonFrames(*opener); if (!params->receiver->IsValidPort()) {
diff --git a/chrome/browser/extensions/api/socket/tls_socket_unittest.cc b/chrome/browser/extensions/api/socket/tls_socket_unittest.cc index b6b58b95..15f9218 100644 --- a/chrome/browser/extensions/api/socket/tls_socket_unittest.cc +++ b/chrome/browser/extensions/api/socket/tls_socket_unittest.cc
@@ -74,6 +74,8 @@ MOCK_CONST_METHOD0(GetUnverifiedServerCertificateChain, scoped_refptr<net::X509Certificate>()); MOCK_CONST_METHOD0(GetChannelIDService, net::ChannelIDService*()); + MOCK_METHOD2(GetSignedEKMForTokenBinding, + net::Error(crypto::ECPrivateKey*, std::vector<uint8_t>*)); MOCK_CONST_METHOD0(GetSSLFailureState, net::SSLFailureState()); bool IsConnected() const override { return true; }
diff --git a/chrome/browser/extensions/api/tabs/tabs_api.cc b/chrome/browser/extensions/api/tabs/tabs_api.cc index 9615815..6924b10f1 100644 --- a/chrome/browser/extensions/api/tabs/tabs_api.cc +++ b/chrome/browser/extensions/api/tabs/tabs_api.cc
@@ -67,7 +67,6 @@ #include "content/public/browser/notification_details.h" #include "content/public/browser/notification_source.h" #include "content/public/browser/render_frame_host.h" -#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_widget_host_view.h" #include "content/public/browser/web_contents.h" #include "content/public/common/url_constants.h" @@ -1345,12 +1344,10 @@ // JavaScript URLs can do the same kinds of things as cross-origin XHR, so // we need to check host permissions before allowing them. if (url.SchemeIs(url::kJavaScriptScheme)) { - content::RenderProcessHost* process = web_contents_->GetRenderProcessHost(); if (!extension()->permissions_data()->CanAccessPage( extension(), web_contents_->GetURL(), tab_id, - process ? process->GetID() : -1, &error_)) { return false; } @@ -1866,12 +1863,10 @@ // NOTE: This can give the wrong answer due to race conditions, but it is OK, // we check again in the renderer. - content::RenderProcessHost* process = contents->GetRenderProcessHost(); if (!extension()->permissions_data()->CanAccessPage( extension(), contents->GetURL(), execute_tab_id_, - process ? process->GetID() : -1, &error_)) { return false; }
diff --git a/chrome/browser/extensions/browser_permissions_policy_delegate.cc b/chrome/browser/extensions/browser_permissions_policy_delegate.cc index 2bd874a..6a2cd0d2 100644 --- a/chrome/browser/extensions/browser_permissions_policy_delegate.cc +++ b/chrome/browser/extensions/browser_permissions_policy_delegate.cc
@@ -25,7 +25,6 @@ const Extension* extension, const GURL& document_url, int tab_id, - int process_id, std::string* error) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); return true;
diff --git a/chrome/browser/extensions/browser_permissions_policy_delegate.h b/chrome/browser/extensions/browser_permissions_policy_delegate.h index a856082..a9a647b3 100644 --- a/chrome/browser/extensions/browser_permissions_policy_delegate.h +++ b/chrome/browser/extensions/browser_permissions_policy_delegate.h
@@ -20,7 +20,6 @@ bool CanExecuteScriptOnPage(const Extension* extension, const GURL& document_url, int tab_id, - int process_id, std::string* error) override; DISALLOW_COPY_AND_ASSIGN(BrowserPermissionsPolicyDelegate);
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.cc b/chrome/browser/extensions/chrome_extensions_browser_client.cc index 9221e8da..e5c924b 100644 --- a/chrome/browser/extensions/chrome_extensions_browser_client.cc +++ b/chrome/browser/extensions/chrome_extensions_browser_client.cc
@@ -213,15 +213,18 @@ last_version = base::Version(last_version_str); } - std::string current_version = version_info::GetVersionNumber(); - pref_service->SetString(pref_names::kLastChromeVersion, - current_version); + std::string current_version_str = version_info::GetVersionNumber(); + base::Version current_version(current_version_str); + pref_service->SetString(pref_names::kLastChromeVersion, current_version_str); // If there was no version string in prefs, assume we're out of date. if (!last_version.IsValid()) return true; + // If the current version string is invalid, assume we didn't update. + if (!current_version.IsValid()) + return false; - return last_version.IsOlderThan(current_version); + return last_version < current_version; } void ChromeExtensionsBrowserClient::PermitExternalProtocolHandler() {
diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc index 372bb926..abde058f 100644 --- a/chrome/browser/extensions/crx_installer.cc +++ b/chrome/browser/extensions/crx_installer.cc
@@ -268,7 +268,7 @@ } if (expected_version_.IsValid() && fail_install_if_unexpected_version_ && - !expected_version_.Equals(*extension->version())) { + expected_version_ != *extension->version()) { return CrxInstallError(l10n_util::GetStringFUTF16( IDS_EXTENSION_INSTALL_UNEXPECTED_VERSION, base::ASCIIToUTF16(expected_version_.GetString()), @@ -810,7 +810,7 @@ if ((client_ || allow_silent_install_) && grant_permissions_ && (!expected_version_.IsValid() || - expected_version_.Equals(*extension()->version()))) { + expected_version_ == *extension()->version())) { PermissionsUpdater perms_updater(profile()); perms_updater.InitializePermissions(extension()); perms_updater.GrantActivePermissions(extension());
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc index 4a4b216b..2c84655 100644 --- a/chrome/browser/extensions/extension_service.cc +++ b/chrome/browser/extensions/extension_service.cc
@@ -1528,7 +1528,7 @@ const Version old_version(old_version_string); VLOG(1) << "AddComponentExtension " << extension->name(); - if (!old_version.IsValid() || !old_version.Equals(*extension->version())) { + if (!old_version.IsValid() || old_version != *extension->version()) { VLOG(1) << "Component extension " << extension->name() << " (" << extension->id() << ") installing/upgrading from '" << old_version_string << "' to " << extension->version()->GetString();
diff --git a/chrome/browser/extensions/extension_service_sync_unittest.cc b/chrome/browser/extensions/extension_service_sync_unittest.cc index a9a05d81..9c55350 100644 --- a/chrome/browser/extensions/extension_service_sync_unittest.cc +++ b/chrome/browser/extensions/extension_service_sync_unittest.cc
@@ -407,7 +407,7 @@ EXPECT_EQ(extensions::util::IsIncognitoEnabled(good_crx, profile()), data->incognito_enabled()); EXPECT_EQ(ExtensionSyncData::BOOLEAN_UNSET, data->all_urls_enabled()); - EXPECT_TRUE(data->version().Equals(*extension->version())); + EXPECT_EQ(data->version(), *extension->version()); EXPECT_EQ(extensions::ManifestURL::GetUpdateURL(extension), data->update_url()); EXPECT_EQ(extension->name(), data->name()); @@ -508,7 +508,7 @@ EXPECT_EQ(extensions::util::IsIncognitoEnabled(good_crx, profile()), data->incognito_enabled()); EXPECT_EQ(ExtensionSyncData::BOOLEAN_UNSET, data->all_urls_enabled()); - EXPECT_TRUE(data->version().Equals(*extension->version())); + EXPECT_EQ(data->version(), *extension->version()); EXPECT_EQ(extensions::ManifestURL::GetUpdateURL(extension), data->update_url()); EXPECT_EQ(extension->name(), data->name()); @@ -1061,7 +1061,7 @@ scoped_ptr<ExtensionSyncData> extension_data = ExtensionSyncData::CreateFromSyncData(data[0]); ASSERT_TRUE(extension_data); - EXPECT_TRUE(installed_version.Equals(extension_data->version())); + EXPECT_EQ(installed_version, extension_data->version()); } // Should do nothing if extension version > sync version. @@ -1080,7 +1080,7 @@ scoped_ptr<ExtensionSyncData> extension_data = ExtensionSyncData::CreateFromSyncData(data[0]); ASSERT_TRUE(extension_data); - EXPECT_TRUE(installed_version.Equals(extension_data->version())); + EXPECT_EQ(installed_version, extension_data->version()); } // Should kick off an update if extension version < sync version. @@ -1102,7 +1102,7 @@ scoped_ptr<ExtensionSyncData> extension_data = ExtensionSyncData::CreateFromSyncData(data[0]); ASSERT_TRUE(extension_data); - EXPECT_TRUE(new_version.Equals(extension_data->version())); + EXPECT_EQ(new_version, extension_data->version()); } EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx));
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc index 60673b7..8047d11b 100644 --- a/chrome/browser/extensions/extension_service_unittest.cc +++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -2463,7 +2463,7 @@ InitializeEmptyExtensionService(); base::Version other_version("0.1"); ASSERT_TRUE(other_version.IsValid()); - ASSERT_FALSE(other_version.Equals(base::Version(kGoodVersion))); + ASSERT_NE(other_version, base::Version(kGoodVersion)); EXPECT_TRUE( service()->pending_extension_manager()->AddFromSync( kGoodId, @@ -5487,8 +5487,8 @@ // Tests assume |older_version| is less than the installed version, and // |newer_version| is greater. Verify this: - ASSERT_TRUE(older_version.IsOlderThan(ext->VersionString())); - ASSERT_TRUE(ext->version()->IsOlderThan(newer_version.GetString())); + ASSERT_LT(older_version, *ext->version()); + ASSERT_GT(newer_version, *ext->version()); // An external install for the same location should fail if the version is // older, or the same, and succeed if the version is newer. @@ -5601,7 +5601,7 @@ const extensions::PendingExtensionInfo* info; EXPECT_TRUE((info = pending->GetById(kGoodId))); EXPECT_TRUE(info->version().IsValid()); - EXPECT_TRUE(info->version().Equals(kVersion123)); + EXPECT_EQ(info->version(), kVersion123); // Adding a newer version overrides the currently pending version. EXPECT_TRUE(service()->OnExternalExtensionFileFound( @@ -5614,7 +5614,7 @@ kDontInstallImmediately)); EXPECT_TRUE((info = pending->GetById(kGoodId))); EXPECT_TRUE(info->version().IsValid()); - EXPECT_TRUE(info->version().Equals(kVersion124)); + EXPECT_EQ(info->version(), kVersion124); // Adding an older version fails. EXPECT_FALSE(service()->OnExternalExtensionFileFound( @@ -5627,7 +5627,7 @@ kDontInstallImmediately)); EXPECT_TRUE((info = pending->GetById(kGoodId))); EXPECT_TRUE(info->version().IsValid()); - EXPECT_TRUE(info->version().Equals(kVersion124)); + EXPECT_EQ(info->version(), kVersion124); // Adding an older version fails even when coming from a higher-priority // location. @@ -5641,7 +5641,7 @@ kDontInstallImmediately)); EXPECT_TRUE((info = pending->GetById(kGoodId))); EXPECT_TRUE(info->version().IsValid()); - EXPECT_TRUE(info->version().Equals(kVersion124)); + EXPECT_EQ(info->version(), kVersion124); // Adding the latest version from the webstore overrides a specific version. GURL kUpdateUrl("http://example.com/update");
diff --git a/chrome/browser/extensions/extension_sync_data_unittest.cc b/chrome/browser/extensions/extension_sync_data_unittest.cc index bae256f..a271125 100644 --- a/chrome/browser/extensions/extension_sync_data_unittest.cc +++ b/chrome/browser/extensions/extension_sync_data_unittest.cc
@@ -70,7 +70,7 @@ EXPECT_EQ(input.remote_install(), output->remote_install()); EXPECT_EQ(input.installed_by_custodian(), output->installed_by_custodian()); EXPECT_EQ(input.all_urls_enabled(), output->all_urls_enabled()); - EXPECT_TRUE(input.version().Equals(output->version())); + EXPECT_EQ(input.version(), output->version()); EXPECT_EQ(input.update_url(), output->update_url()); EXPECT_EQ(input.name(), output->name()); } @@ -110,7 +110,7 @@ EXPECT_FALSE(extension_sync_data.remote_install()); EXPECT_EQ(ExtensionSyncData::BOOLEAN_TRUE, extension_sync_data.all_urls_enabled()); - EXPECT_TRUE(Version(kVersion).Equals(extension_sync_data.version())); + EXPECT_EQ(Version(kVersion), extension_sync_data.version()); EXPECT_EQ(std::string(kName), extension_sync_data.name()); // Check the serialize-deserialize process for ExtensionSyncData to proto.
diff --git a/chrome/browser/extensions/extension_sync_service.cc b/chrome/browser/extensions/extension_sync_service.cc index 96208e4..6d6b3af 100644 --- a/chrome/browser/extensions/extension_sync_service.cc +++ b/chrome/browser/extensions/extension_sync_service.cc
@@ -178,7 +178,7 @@ if (it == pending_updates_.end()) return false; const PendingUpdate& pending = it->second; - return pending.version.Equals(version) && + return pending.version == version && pending.grant_permissions_and_reenable; }
diff --git a/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc b/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc index e1e8e64..55add1c 100644 --- a/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc +++ b/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc
@@ -310,8 +310,7 @@ const PermissionsData* permissions = extension->permissions_data(); auto get_page_access = [&permissions, &extension](const GURL& url) { - return permissions->GetPageAccess(extension.get(), url, 0 /* tab id */, - 0 /* process id */, nullptr /* error */); + return permissions->GetPageAccess(extension.get(), url, 0, nullptr); }; EXPECT_EQ(PermissionsData::ACCESS_WITHHELD, get_page_access(kUrl));
diff --git a/chrome/browser/extensions/updater/chrome_update_client_config.cc b/chrome/browser/extensions/updater/chrome_update_client_config.cc index 1c095f7d..feaedd1a 100644 --- a/chrome/browser/extensions/updater/chrome_update_client_config.cc +++ b/chrome/browser/extensions/updater/chrome_update_client_config.cc
@@ -16,7 +16,6 @@ content::BrowserContext* context) : impl_(base::CommandLine::ForCurrentProcess(), context->GetRequestContext()) { - impl_.set_enable_alt_source_url(false); } int ChromeUpdateClientConfig::InitialDelay() const {
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc index 0de54ea..5e389080 100644 --- a/chrome/browser/io_thread.cc +++ b/chrome/browser/io_thread.cc
@@ -455,8 +455,8 @@ ignore_certificate_errors(false), testing_fixed_http_port(0), testing_fixed_https_port(0), - enable_user_alternate_protocol_ports(false) { -} + enable_user_alternate_protocol_ports(false), + enable_token_binding(false) {} IOThread::Globals::~Globals() {} @@ -847,6 +847,9 @@ } globals_->enable_brotli.set( base::FeatureList::IsEnabled(features::kBrotliEncoding)); + if (command_line.HasSwitch(switches::kEnableTokenBinding)) { + globals_->enable_token_binding = true; + } // TODO(erikchen): Remove ScopedTracker below once http://crbug.com/466432 // is fixed. tracked_objects::ScopedTracker tracking_profile13( @@ -1188,6 +1191,7 @@ ¶ms->origin_to_force_quic_on); params->enable_user_alternate_protocol_ports = globals.enable_user_alternate_protocol_ports; + params->enable_token_binding = globals.enable_token_binding; } base::TimeTicks IOThread::creation_time() const {
diff --git a/chrome/browser/io_thread.h b/chrome/browser/io_thread.h index bebae8a..be33922 100644 --- a/chrome/browser/io_thread.h +++ b/chrome/browser/io_thread.h
@@ -248,6 +248,7 @@ // main frame load fails with a DNS error in order to provide more useful // information to the renderer so it can show a more specific error page. scoped_ptr<chrome_browser_net::DnsProbeService> dns_probe_service; + bool enable_token_binding; }; // |net_log| must either outlive the IOThread or be NULL.
diff --git a/chrome/browser/net/http_server_properties_manager_factory.cc b/chrome/browser/net/http_server_properties_manager_factory.cc index ecd09e18..5c566d7c 100644 --- a/chrome/browser/net/http_server_properties_manager_factory.cc +++ b/chrome/browser/net/http_server_properties_manager_factory.cc
@@ -4,11 +4,57 @@ #include "chrome/browser/net/http_server_properties_manager_factory.h" +#include "base/prefs/pref_change_registrar.h" +#include "base/prefs/pref_service.h" #include "chrome/common/pref_names.h" #include "components/pref_registry/pref_registry_syncable.h" #include "content/public/browser/browser_thread.h" #include "net/http/http_server_properties_manager.h" +namespace { + +// Connects the HttpServerPropertiesManager's storage to the Chrome prefs. +class PrefServiceAdapter + : public net::HttpServerPropertiesManager::PrefDelegate { + public: + explicit PrefServiceAdapter(PrefService* pref_service) + : pref_service_(pref_service), + path_(prefs::kHttpServerProperties) { + pref_change_registrar_.Init(pref_service_); + } + + ~PrefServiceAdapter() override { + } + + // PrefDelegate implementation. + bool HasServerProperties() override { + return pref_service_->HasPrefPath(path_); + } + const base::DictionaryValue& GetServerProperties() const override { + // Guaranteed not to return null when the pref is registered + // (RegisterProfilePrefs was called). + return *pref_service_->GetDictionary(path_); + } + void SetServerProperties(const base::DictionaryValue& value) override { + return pref_service_->Set(path_, value); + } + void StartListeningForUpdates(const base::Closure& callback) override { + pref_change_registrar_.Add(path_, callback); + } + void StopListeningForUpdates() override { + pref_change_registrar_.RemoveAll(); + } + + private: + PrefService* pref_service_; + const std::string path_; + PrefChangeRegistrar pref_change_registrar_; + + DISALLOW_COPY_AND_ASSIGN(PrefServiceAdapter); +}; + +} // namespace + namespace chrome_browser_net { /* static */ @@ -16,8 +62,7 @@ HttpServerPropertiesManagerFactory::CreateManager(PrefService* pref_service) { using content::BrowserThread; return new net::HttpServerPropertiesManager( - pref_service, - prefs::kHttpServerProperties, + new PrefServiceAdapter(pref_service), // Transfers ownership. BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)); }
diff --git a/chrome/browser/obsolete_system/obsolete_system_linux.cc b/chrome/browser/obsolete_system/obsolete_system_linux.cc index 5da7998..48863f3 100644 --- a/chrome/browser/obsolete_system/obsolete_system_linux.cc +++ b/chrome/browser/obsolete_system/obsolete_system_linux.cc
@@ -25,7 +25,10 @@ return true; #else // Ubuntu 14.04 will be used as the next build platform, and it ships with - // glibc 2.19, so check for that as the minimum requirement. + // glibc 2.19. However, as of this writing, the binary produced on Ubuntu + // 14.04 does not actually require glibc 2.19. Thus this function checks for + // glibc 2.17 as the minimum requirement, so Ubuntu 12.04 (glibc 2.15) will + // be considered obsolete, but RHEL 7 (glibc 2.17) will not. Version version(gnu_get_libc_version()); if (!version.IsValid() || version.components().size() != 2) return false; @@ -35,7 +38,7 @@ if (glibc_major_version < 2) return true; - return glibc_major_version == 2 && glibc_minor_version < 19; + return glibc_major_version == 2 && glibc_minor_version < 17; #endif // defined(ARCH_CPU_32_BITS) #else return false;
diff --git a/chrome/browser/password_manager/account_chooser_dialog_android.cc b/chrome/browser/password_manager/account_chooser_dialog_android.cc index 83398078..a025de8 100644 --- a/chrome/browser/password_manager/account_chooser_dialog_android.cc +++ b/chrome/browser/password_manager/account_chooser_dialog_android.cc
@@ -20,6 +20,7 @@ #include "components/browser_sync/browser/profile_sync_service.h" #include "components/password_manager/core/browser/password_bubble_experiment.h" #include "components/password_manager/core/browser/password_manager_constants.h" +#include "components/password_manager/core/browser/password_ui_utils.h" #include "components/password_manager/core/common/credential_manager_types.h" #include "jni/AccountChooserDialog_jni.h" #include "ui/android/window_android.h" @@ -109,7 +110,7 @@ ScopedVector<autofill::PasswordForm> federated_credentials, const GURL& origin, const ManagePasswordsState::CredentialsCallback& callback) - : web_contents_(web_contents) { + : web_contents_(web_contents), origin_(origin) { passwords_data_.set_client( ChromePasswordManagerClient::FromWebContents(web_contents_)); passwords_data_.OnRequestCredentials( @@ -146,7 +147,10 @@ env, native_window->GetJavaObject().obj(), reinterpret_cast<intptr_t>(this), java_credentials_array.obj(), base::android::ConvertUTF16ToJavaString(env, title).obj(), - title_link_range.start(), title_link_range.end())); + title_link_range.start(), title_link_range.end(), + base::android::ConvertUTF8ToJavaString( + env, password_manager::GetShownOrigin(origin_, std::string())) + .obj())); base::android::ScopedJavaLocalRef<jobject> java_dialog(java_dialog_global); net::URLRequestContextGetter* request_context = Profile::FromBrowserContext(web_contents_->GetBrowserContext())
diff --git a/chrome/browser/password_manager/account_chooser_dialog_android.h b/chrome/browser/password_manager/account_chooser_dialog_android.h index 4b7d540..21c9151 100644 --- a/chrome/browser/password_manager/account_chooser_dialog_android.h +++ b/chrome/browser/password_manager/account_chooser_dialog_android.h
@@ -63,6 +63,7 @@ content::WebContents* web_contents_; ManagePasswordsState passwords_data_; + GURL origin_; DISALLOW_COPY_AND_ASSIGN(AccountChooserDialogAndroid); };
diff --git a/chrome/browser/password_manager/password_store_mac.cc b/chrome/browser/password_manager/password_store_mac.cc index 740c2948..ed350b0 100644 --- a/chrome/browser/password_manager/password_store_mac.cc +++ b/chrome/browser/password_manager/password_store_mac.cc
@@ -225,7 +225,7 @@ } // Iterates over all elements in |forms|, passes the pointed to objects to -// |move_form|, and clears |forms| efficiently. FormMover needs to be a callable +// |mover|, and clears |forms| efficiently. FormMover needs to be a callable // entity, accepting scoped_ptr<autofill::PasswordForm> as its sole argument. template <typename FormMover> inline void MoveAllFormsOut(ScopedVector<autofill::PasswordForm>* forms,
diff --git a/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc b/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc index eb24127..78dd4de 100644 --- a/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc +++ b/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc
@@ -201,7 +201,8 @@ SigninManager* signin_manager = SigninManagerFactory::GetForProfile(browser()->profile()); ASSERT_TRUE(signin_manager); - signin_manager->SignOut(signin_metrics::SIGNOUT_TEST); + signin_manager->SignOut(signin_metrics::SIGNOUT_TEST, + signin_metrics::SignoutDelete::IGNORE_METRIC); } #endif
diff --git a/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc b/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc index 043e8c25..a11f901 100644 --- a/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc +++ b/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc
@@ -584,8 +584,9 @@ EXPECT_CALL(*mock_store_, Clear()); // Now sign out. - SigninManagerFactory::GetForProfile(profile_.get())->SignOut( - signin_metrics::SIGNOUT_TEST); + SigninManagerFactory::GetForProfile(profile_.get()) + ->SignOut(signin_metrics::SIGNOUT_TEST, + signin_metrics::SignoutDelete::IGNORE_METRIC); // UserCloudPolicyManager should be shut down. ASSERT_FALSE(manager_->core()->service());
diff --git a/chrome/browser/profiles/gaia_info_update_service_unittest.cc b/chrome/browser/profiles/gaia_info_update_service_unittest.cc index ac05fae..b7523d9 100644 --- a/chrome/browser/profiles/gaia_info_update_service_unittest.cc +++ b/chrome/browser/profiles/gaia_info_update_service_unittest.cc
@@ -6,6 +6,8 @@ #include <stddef.h> +#include <string> + #include "base/prefs/pref_service.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" @@ -130,7 +132,7 @@ void RenameProfile(const base::string16& full_name, const base::string16& given_name) { - gfx::Image image = gfx::test::CreateImage(256,256); + gfx::Image image = gfx::test::CreateImage(256, 256); std::string url("foo.com"); ProfileDownloadSuccess(full_name, given_name, image, url, base::string16()); @@ -162,7 +164,7 @@ ProfileInfoCacheTest::TearDown(); } -} // namespace +} // namespace TEST_F(GAIAInfoUpdateServiceTest, DownloadSuccess) { // No URL should be cached yet. @@ -289,7 +291,7 @@ signin_manager->SetAuthenticatedAccountInfo("gaia_id", "pat@example.com"); base::string16 gaia_name = base::UTF8ToUTF16("Pat Foo"); GetCache()->SetGAIANameOfProfileAtIndex(0, gaia_name); - gfx::Image gaia_picture = gfx::test::CreateImage(256,256); + gfx::Image gaia_picture = gfx::test::CreateImage(256, 256); GetCache()->SetGAIAPictureOfProfileAtIndex(0, &gaia_picture); // Set a fake picture URL. @@ -299,7 +301,8 @@ EXPECT_FALSE(service()->GetCachedPictureURL().empty()); // Log out. - signin_manager->SignOut(signin_metrics::SIGNOUT_TEST); + signin_manager->SignOut(signin_metrics::SIGNOUT_TEST, + signin_metrics::SignoutDelete::IGNORE_METRIC); // Verify that the GAIA name and picture, and picture URL are unset. EXPECT_TRUE(GetCache()->GetGAIANameOfProfileAtIndex(0).empty()); EXPECT_EQ(NULL, GetCache()->GetGAIAPictureOfProfileAtIndex(0));
diff --git a/chrome/browser/profiles/profile.cc b/chrome/browser/profiles/profile.cc index 07666557..a817fd5 100644 --- a/chrome/browser/profiles/profile.cc +++ b/chrome/browser/profiles/profile.cc
@@ -152,6 +152,16 @@ #endif #if defined(ENABLE_MEDIA_ROUTER) +#if defined(GOOGLE_CHROME_BUILD) + registry->RegisterBooleanPref( + prefs::kMediaRouterCloudServicesPrefSet, + false, + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); + registry->RegisterBooleanPref( + prefs::kMediaRouterEnableCloudServices, + false, + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); +#endif // defined(GOOGLE_CHROME_BUILD) registry->RegisterBooleanPref( prefs::kMediaRouterFirstRunFlowAcknowledged, false,
diff --git a/chrome/browser/profiles/profile_impl_io_data.cc b/chrome/browser/profiles/profile_impl_io_data.cc index 0cfe7e86..286bb98 100644 --- a/chrome/browser/profiles/profile_impl_io_data.cc +++ b/chrome/browser/profiles/profile_impl_io_data.cc
@@ -508,7 +508,7 @@ new QuotaPolicyChannelIDStore( lazy_params_->channel_id_path, BrowserThread::GetBlockingPool()->GetSequencedTaskRunner( - BrowserThread::GetBlockingPool()->GetSequenceToken()), + base::SequencedWorkerPool::GetSequenceToken()), lazy_params_->special_storage_policy.get()); channel_id_service = new net::ChannelIDService( new net::DefaultChannelIDStore(channel_id_db.get()),
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js index 04ece191..bea4f48 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js
@@ -500,7 +500,11 @@ var actionNode = current.start.node; if (actionNode.role == RoleType.inlineTextBox) actionNode = actionNode.parent; - actionNode.focus(); + + // Iframes, when focused, causes the child webArea to fire focus event. + // This can result in getting stuck when navigating backward. + if (actionNode.role != RoleType.iframe && !actionNode.state.focused) + actionNode.focus(); var prevRange = this.currentRange_; this.setCurrentRange(current);
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs index c919c684..c822e3f 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs
@@ -505,3 +505,25 @@ assertEquals('classic', global.backgroundObj.mode); }.bind(this)); }); + +TEST_F('BackgroundTest', 'FocusIframe', function() { + this.runWithLoadedTree( function() {/*! + <iframe tabindex=0 src="data:text/html,<p>Inside</p>"></iframe> + <button>outside</button> + */}, function(root) { + var iframe = root.find({role: 'iframe'}); + var button = root.find({role: 'button'}); + + assertEquals('iframe', iframe.role); + assertEquals('button', button.role); + + var didFocus = false; + iframe.focus = function() { + didFocus = true; + }; + var b = global.backgroundObj; + b.currentRange_ = cursors.Range.fromNode(button); + b.onGotCommand('previousElement'); + assertFalse(didFocus); + }.bind(this)); +});
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.css b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.css index a1b5da1..4f24096 100644 --- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.css +++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.css
@@ -34,9 +34,8 @@ align-items: center; background-color: white; display: flex; - height: 120px; justify-content: center; - margin-top: var(--container-header-height); + margin: 60px 0; } #device-missing a { @@ -74,6 +73,16 @@ z-index: 1; } +#first-run-flow-cloud-pref { + color: white; + display: flex; +} + +#first-run-flow-cloud-pref a { + color: white; + text-decoration: none; +} + #first-run-learn-more { font-weight: bold; text-transform: uppercase;
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html index ac39d2b..b4f3786 100644 --- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html +++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
@@ -22,12 +22,18 @@ <div id="first-run-text">[[firstRunFlowText_]]</div> <template is="dom-if" if="[[showFirstRunFlowCloudPref]]"> <div id="first-run-flow-cloud-pref"> - <paper-checkbox checked id="first-run-cloud-checkbox"> + <div> + <paper-checkbox checked id="first-run-cloud-checkbox"> + </paper-checkbox> + </div> + <div> <span>[[firstRunFlowCloudPrefText_]]</span> - <span id="first-run-learn-more"> - [[firstRunFlowCloudLearnMore_]] - </span> - </paper-checkbox> + <a href="[[firstRunFlowCloudPrefLearnMoreUrl]]"> + <span id="first-run-learn-more"> + [[firstRunFlowCloudLearnMore_]] + </span> + </a> + </div> </div> </template> <div id="first-run-button-container">
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js index 9d0450f..1bf8c58d 100644 --- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js +++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
@@ -119,6 +119,15 @@ }, /** + * The URL to open when the cloud services pref learn more link is clicked. + * @type {string} + */ + firstRunFlowCloudPrefLearnMoreUrl: { + type: String, + value: '', + }, + + /** * The text for the cloud services preference description in the first run * flow. * @private {string} @@ -214,6 +223,17 @@ }, /** + * The ID of the route that is currently being created. This is set when + * route creation is resolved but not ready for its controls to be + * displayed. + * @private {string} + */ + pendingCreatedRouteId_: { + type: String, + value: '', + }, + + /** * The time the sink list was shown and populated with at least one sink. * This is reset whenever the user switches views or there are no sinks * available for display. @@ -351,7 +371,7 @@ }, listeners: { - 'arrow-drop-click': 'toggleCastModeHidden_', + 'header-or-arrow-click': 'toggleCastModeHidden_', 'mouseleave': 'onMouseLeave_', 'mouseenter': 'onMouseEnter_', }, @@ -364,10 +384,11 @@ ready: function() { this.elementReadyTimeMs_ = performance.now(); this.showSinkList_(); - this.updateElementPositioning_(); }, attached: function() { + this.updateElementPositioning_(); + // Turn off the spinner after 3 seconds, then report the current number of // sinks. this.async(function() { @@ -385,8 +406,14 @@ * @private */ acknowledgeFirstRunFlow_: function() { + var userOptedIntoCloudServices = this.$$('#first-run-cloud-checkbox') ? + this.$$('#first-run-cloud-checkbox').checked : false; + this.fire('acknowledge-first-run-flow', { + optedIntoCloudServices: userOptedIntoCloudServices, + }); + this.showFirstRunFlow = false; - this.fire('acknowledge-first-run-flow'); + this.showFirstRunFlowCloudPref = false; }, /** @@ -884,26 +911,21 @@ * * @param {string} sinkId The ID of the sink to which the Media Route was * creating a route. - * @param {?media_router.Route} route The newly created route to the sink - * if succeeded; null otherwise. + * @param {string} routeId The ID of the newly created route for the sink if + * succeeded; empty otherwise. */ - onCreateRouteResponseReceived: function(sinkId, route) { - this.currentLaunchingSinkId_ = ''; + onCreateRouteResponseReceived: function(sinkId, routeId) { + // Check that |sinkId| exists and corresponds to |currentLaunchingSinkId_|. + if (!this.sinkMap_[sinkId] || this.currentLaunchingSinkId_ != sinkId) + return; + // The provider will handle sending an issue for a failed route request. - if (!route) + if (this.isEmptyOrWhitespace_(routeId)) { + this.resetRouteCreationProperties_(false); return; + } - // Check that |sinkId| exists. - if (!this.sinkMap_[sinkId]) - return; - - // If there is an existing route associated with the same sink, its - // |sinkToRouteMap_| entry will be overwritten with that of the new route, - // which results in the correct sink to route mapping. - this.routeList.push(route); - this.showRouteDetails_(route); - - this.startTapTimer_(); + this.pendingCreatedRouteId_ = routeId; }, /** @@ -925,12 +947,10 @@ }, /** - * Handles timeout of previous create route attempt. Clearing - * |currentLaunchingSinkId_| hides the spinner indicating there is a route - * creation in progress and show the device icon instead. + * Handles timeout of previous create route attempt. */ onNotifyRouteCreationTimeout: function() { - this.currentLaunchingSinkId_ = ''; + this.resetRouteCreationProperties_(false); }, /** @@ -963,6 +983,19 @@ tempSinkToRouteMap[route.sinkId] = route; }, this); + // If there is route creation in progress, check if any of the route ids + // correspond to |pendingCreatedRouteId_|. If so, the newly created route + // is ready to be displayed; switch to route details view. + if (this.currentLaunchingSinkId_ != '' && + this.pendingCreatedRouteId_ != '') { + var route = tempSinkToRouteMap[this.currentLaunchingSinkId_]; + if (route && this.pendingCreatedRouteId_ == route.id) { + this.showRouteDetails_(route); + this.startTapTimer_(); + this.resetRouteCreationProperties_(true); + } + } + // If |currentRoute_| is no longer active, clear |currentRoute_|. Also // switch back to the SINK_PICKER view if the user is currently in the // ROUTE_DETAILS view. @@ -1029,6 +1062,21 @@ }, /** + * Resets the properties relevant to creating a new route. Fires an event + * indicating whether or not route creation was successful. + * Clearing |currentLaunchingSinkId_| hides the spinner indicating there is + * a route creation in progress and show the device icon instead. + * + * @private + */ + resetRouteCreationProperties_: function(creationSuccess) { + this.currentLaunchingSinkId_ = ''; + this.pendingCreatedRouteId_ = ''; + + this.fire('report-route-creation', {success: creationSuccess}); + }, + + /** * Updates the shown cast mode, and updates the header text fields * according to the cast mode. If |castMode| type is AUTO, then set * |userHasSelectedCastMode_| to false. @@ -1069,7 +1117,8 @@ if (this.computeShowFirstRunFlow_(showFirstRunFlow, currentView)) { // Ensures that first run flow elements have finished stamping. this.async(function() { - var firstRunFlowHeight = this.$$('#first-run-flow').offsetHeight; + var firstRunFlowHeight = this.$$('#first-run-flow') ? + this.$$('#first-run-flow').offsetHeight : 0; this.$['container-header'].style.marginTop = firstRunFlowHeight + 'px'; this.$['sink-list-view'].style.marginTop = firstRunFlowHeight + headerHeight + 'px'; @@ -1158,7 +1207,7 @@ toggleCastModeHidden_: function() { if (this.currentView_ == media_router.MediaRouterView.CAST_MODE_LIST) { this.showSinkList_(); - } else { + } else if (this.currentView_ == media_router.MediaRouterView.SINK_LIST) { this.showCastModeList_(); this.fire('navigate-to-cast-mode-list'); }
diff --git a/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.css b/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.css index 22fee5d..373bff38 100644 --- a/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.css +++ b/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.css
@@ -30,10 +30,15 @@ } #close-button-container { + -webkit-margin-start: auto; -webkit-padding-end: 16px; -webkit-padding-start: 24px; } +#header-and-arrow-container { + display: flex; +} + #header-text { -webkit-padding-end: 4px; color: white;
diff --git a/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.html b/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.html index 1947cb1..621cf99 100644 --- a/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.html +++ b/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.html
@@ -12,13 +12,15 @@ hidden$="[[computeBackButtonHidden_(view)]]"> </paper-icon-button> </div> - <span id="header-text" title="[[tooltip]]">[[headingText]]</span> - <div id="arrow-drop-container"> - <paper-icon-button icon="[[computeArrowDropIcon_(view)]]" - id="arrow-drop-icon" on-click="onArrowDropClick_" - disabled$="[[arrowDropIconDisabled]]" - hidden$="[[computeArrowDropIconHidden_(view)]]"> - </paper-icon-button> + <div id="header-and-arrow-container" on-click="onHeaderOrArrowClick_"> + <span id="header-text" title="[[tooltip]]"> + [[headingText]]</span> + <div id="arrow-drop-container"> + <paper-icon-button icon="[[computeArrowDropIcon_(view)]]" + id="arrow-drop-icon" disabled$="[[arrowDropIconDisabled]]" + hidden$="[[computeArrowDropIconHidden_(view)]]"> + </paper-icon-button> + </div> </div> <div id="close-button-container"> <paper-icon-button icon="close" id="close-button"
diff --git a/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.js b/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.js index 3e9ea19..3afac7f4 100644 --- a/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.js +++ b/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.js
@@ -42,6 +42,7 @@ view: { type: String, value: null, + observer: 'updateHeaderCursorStyle_', }, /** @@ -94,8 +95,11 @@ * * @private */ - onArrowDropClick_: function() { - this.fire('arrow-drop-click'); + onHeaderOrArrowClick_: function() { + if (this.view == media_router.MediaRouterView.SINK_LIST || + this.view == media_router.MediaRouterView.CAST_MODE_LIST) { + this.fire('header-or-arrow-click'); + } }, /** @@ -115,4 +119,18 @@ onCloseButtonClick_: function() { this.fire('close-button-click'); }, + + /** + * Updates the cursor style for the header text when the view changes. When + * the drop arrow is also shown, the header text is also clickable. + * + * @param {?media_router.MediaRouterView} view The current view. + * @private + */ + updateHeaderCursorStyle_: function(view) { + this.$$('#header-text').style.cursor = + view == media_router.MediaRouterView.SINK_LIST || + view == media_router.MediaRouterView.CAST_MODE_LIST ? + 'pointer' : 'auto'; + }, });
diff --git a/chrome/browser/resources/media_router/media_router.js b/chrome/browser/resources/media_router/media_router.js index f358ce78..34c662eb3 100644 --- a/chrome/browser/resources/media_router/media_router.js +++ b/chrome/browser/resources/media_router/media_router.js
@@ -47,6 +47,7 @@ container.addEventListener('report-initial-action', onInitialAction); container.addEventListener('report-initial-action-close', onInitialActionClose); + container.addEventListener('report-route-creation', onReportRouteCreation); container.addEventListener('report-sink-click-time', onSinkClickTimeReported); container.addEventListener('report-sink-count', onSinkCountReported); @@ -80,9 +81,17 @@ * Updates the preference that the user has seen the first run flow. * Called when the user clicks on the acknowledgement button on the first run * flow. + * + * @param {!Event} event + * Parameters in |event|.detail: + * optedIntoCloudServices - whether or not the user opted into cloud + * services. */ - function onAcknowledgeFirstRunFlow() { - media_router.browserApi.acknowledgeFirstRunFlow(); + function onAcknowledgeFirstRunFlow(event) { + /** @type {{optedIntoCloudServices: boolean}} */ + var detail = event.detail; + media_router.browserApi.acknowledgeFirstRunFlow( + detail.optedIntoCloudServices); } /** @@ -219,6 +228,18 @@ } /** + * Reports whether or not the route creation was successful. + * + * @param {!Event} event + * Parameters in |event|.detail: + * success - whether or not the route creation was successful. + */ + function onReportRouteCreation(event) { + var detail = event.detail; + media_router.browserApi.reportRouteCreation(detail.success); + } + + /** * Reports the initial state of the dialog after it is opened. * Called after initial data is populated. *
diff --git a/chrome/browser/resources/media_router/media_router_ui_interface.js b/chrome/browser/resources/media_router/media_router_ui_interface.js index 44d9479..2f467b6 100644 --- a/chrome/browser/resources/media_router/media_router_ui_interface.js +++ b/chrome/browser/resources/media_router/media_router_ui_interface.js
@@ -22,11 +22,11 @@ * * @param {string} sinkId The ID of the sink to which the Media Route was * creating a route. - * @param {?media_router.Route} route The newly create route to the sink - * if route creation succeeded; null otherwise + * @param {string} routeId The ID of the newly created route that corresponds + * to the sink if route creation succeeded; empty otherwise. */ - function onCreateRouteResponseReceived(sinkId, route) { - container.onCreateRouteResponseReceived(sinkId, route); + function onCreateRouteResponseReceived(sinkId, routeId) { + container.onCreateRouteResponseReceived(sinkId, routeId); } /** @@ -50,25 +50,35 @@ /** * Populates the WebUI with data obtained from Media Router. * - * @param {{deviceMissingUrl: string, + * @param {{firstRunFlowCloudPrefLearnMoreUrl: string, + * deviceMissingUrl: string, * sinks: !Array<!media_router.Sink>, * routes: !Array<!media_router.Route>, * castModes: !Array<!media_router.CastMode>, - * wasFirstRunFlowAcknowledged: boolean}} data + * wasFirstRunFlowAcknowledged: boolean, + * showFirstRunFlowCloudPref: boolean}} data * Parameters in data: + * firstRunFlowCloudPrefLearnMoreUrl - url to open when the cloud services + * pref learn more link is clicked. * deviceMissingUrl - url to be opened on "Device missing?" clicked. * sinks - list of sinks to be displayed. * routes - list of routes that are associated with the sinks. * castModes - list of available cast modes. * wasFirstRunFlowAcknowledged - true if first run flow was previously * acknowledged by user. + * showFirstRunFlowCloudPref - true if the cloud pref option should be + * shown. */ function setInitialData(data) { + container.firstRunFlowCloudPrefLearnMoreUrl = + data['firstRunFlowCloudPrefLearnMoreUrl']; container.deviceMissingUrl = data['deviceMissingUrl']; container.castModeList = data['castModes']; container.allSinks = data['sinks']; container.routeList = data['routes']; container.showFirstRunFlow = !data['wasFirstRunFlowAcknowledged']; + container.showFirstRunFlowCloudPref = + data['showFirstRunFlowCloudPref']; container.maybeShowRouteDetailsOnOpen(); media_router.browserApi.onInitialDataReceived(); } @@ -129,9 +139,12 @@ /** * Indicates that the user has acknowledged the first run flow. + * + * @param {boolean} optedIntoCloudServices Whether or not the user opted into + * cloud services. */ - function acknowledgeFirstRunFlow() { - chrome.send('acknowledgeFirstRunFlow'); + function acknowledgeFirstRunFlow(optedIntoCloudServices) { + chrome.send('acknowledgeFirstRunFlow', [optedIntoCloudServices]); } /** @@ -215,6 +228,15 @@ } /** + * Reports whether or not a route was created successfully. + * + * @param {boolean} success + */ + function reportRouteCreation(success) { + chrome.send('reportRouteCreation', [success]); + } + + /** * Reports the cast mode that the user selected. * * @param {number} castModeType @@ -284,6 +306,7 @@ reportInitialState: reportInitialState, reportNavigateToView: reportNavigateToView, reportSelectedCastMode: reportSelectedCastMode, + reportRouteCreation: reportRouteCreation, reportSinkCount: reportSinkCount, reportTimeToClickSink: reportTimeToClickSink, reportTimeToInitialActionClose: reportTimeToInitialActionClose,
diff --git a/chrome/browser/resources/options/chromeos/display_options.js b/chrome/browser/resources/options/chromeos/display_options.js index 17ee9a4..4e762ca 100644 --- a/chrome/browser/resources/options/chromeos/display_options.js +++ b/chrome/browser/resources/options/chromeos/display_options.js
@@ -1043,10 +1043,14 @@ }; // Layout the display rectangles. First layout the primary display and - // then layout the secondary which is attached to the primary. + // then layout any secondary displays. + this.createDisplayLayoutDiv_( + this.displayLayoutMap_[this.primaryDisplayId_], layoutType, offset); for (var i = 0; i < this.displays_.length; i++) { - this.createDisplayLayoutDiv_( - this.displayLayoutMap_[this.displays_[i].id], layoutType, offset); + if (!this.displays_[i].isPrimary) { + this.createDisplayLayoutDiv_( + this.displayLayoutMap_[this.displays_[i].id], layoutType, offset); + } } },
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_page.js b/chrome/browser/resources/settings/appearance_page/appearance_page.js index 52691cb9..37377ed 100644 --- a/chrome/browser/resources/settings/appearance_page/appearance_page.js +++ b/chrome/browser/resources/settings/appearance_page/appearance_page.js
@@ -124,8 +124,9 @@ /** @override */ attached: function() { // Query the initial state. - cr.sendWithCallback('getResetThemeEnabled', undefined, - this.setResetThemeEnabled.bind(this)); + cr.sendWithPromise('getResetThemeEnabled').then(function(response) { + this.setResetThemeEnabled(response[0]); + }.bind(this)); // Set up the change event listener. cr.addWebUIListener('reset-theme-enabled-changed',
diff --git a/chrome/browser/search/suggestions/suggestions_service_factory.cc b/chrome/browser/search/suggestions/suggestions_service_factory.cc index bd65512..8a3fd8d9 100644 --- a/chrome/browser/search/suggestions/suggestions_service_factory.cc +++ b/chrome/browser/search/suggestions/suggestions_service_factory.cc
@@ -57,7 +57,7 @@ content::BrowserContext* profile) const { scoped_refptr<base::SequencedTaskRunner> background_task_runner = BrowserThread::GetBlockingPool()->GetSequencedTaskRunner( - BrowserThread::GetBlockingPool()->GetSequenceToken()); + base::SequencedWorkerPool::GetSequenceToken()); Profile* the_profile = static_cast<Profile*>(profile);
diff --git a/chrome/browser/services/gcm/fake_signin_manager.cc b/chrome/browser/services/gcm/fake_signin_manager.cc index b41795b..620c17f 100644 --- a/chrome/browser/services/gcm/fake_signin_manager.cc +++ b/chrome/browser/services/gcm/fake_signin_manager.cc
@@ -50,7 +50,8 @@ } void FakeSigninManager::SignOut( - signin_metrics::ProfileSignout signout_source_metric) { + signin_metrics::ProfileSignout signout_source_metric, + signin_metrics::SignoutDelete signout_delete_metric) { const std::string account_id = GetAuthenticatedAccountId(); const std::string username = GetAuthenticatedAccountInfo().email; clear_authenticated_user();
diff --git a/chrome/browser/services/gcm/fake_signin_manager.h b/chrome/browser/services/gcm/fake_signin_manager.h index 91ff0a1..7320a54 100644 --- a/chrome/browser/services/gcm/fake_signin_manager.h +++ b/chrome/browser/services/gcm/fake_signin_manager.h
@@ -32,15 +32,18 @@ #else class FakeSigninManager : public SigninManager { #endif + public: explicit FakeSigninManager(Profile* profile); ~FakeSigninManager() override; void SignIn(const std::string& username); #if defined(OS_CHROMEOS) - void SignOut(signin_metrics::ProfileSignout signout_source_metric); + void SignOut(signin_metrics::ProfileSignout signout_source_metric, + signin_metrics::SignoutDelete signout_delete_metric); #else - void SignOut(signin_metrics::ProfileSignout signout_source_metric) override; + void SignOut(signin_metrics::ProfileSignout signout_source_metric, + signin_metrics::SignoutDelete signout_delete_metric) override; #endif static KeyedService* Build(content::BrowserContext* context);
diff --git a/chrome/browser/signin/account_reconcilor_unittest.cc b/chrome/browser/signin/account_reconcilor_unittest.cc index ee009914..b70a6caf 100644 --- a/chrome/browser/signin/account_reconcilor_unittest.cc +++ b/chrome/browser/signin/account_reconcilor_unittest.cc
@@ -287,7 +287,8 @@ EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction()); - signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST); + signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST, + signin_metrics::SignoutDelete::IGNORE_METRIC); ASSERT_FALSE(reconcilor->IsRegisteredWithTokenService()); } @@ -603,7 +604,8 @@ ASSERT_FALSE(reconcilor->is_reconcile_started_); EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction()); - signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST); + signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST, + signin_metrics::SignoutDelete::IGNORE_METRIC); base::HistogramTester::CountsMap expected_counts; expected_counts["Signin.Reconciler.Duration.Failure"] = 1;
diff --git a/chrome/browser/signin/cross_device_promo_unittest.cc b/chrome/browser/signin/cross_device_promo_unittest.cc index 6d74e02..39eff0a47 100644 --- a/chrome/browser/signin/cross_device_promo_unittest.cc +++ b/chrome/browser/signin/cross_device_promo_unittest.cc
@@ -6,6 +6,10 @@ #include <stdint.h> +#include <map> +#include <string> +#include <vector> + #include "base/macros.h" #include "base/metrics/field_trial.h" #include "base/run_loop.h" @@ -295,7 +299,8 @@ { base::HistogramTester test_signed_out; - signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST); + signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST, + signin_metrics::SignoutDelete::IGNORE_METRIC); promo()->CheckPromoEligibilityForTesting(); test_signed_out.ExpectUniqueSample("Signin.XDevicePromo.Eligibility", signin_metrics::NOT_SINGLE_GAIA_ACCOUNT,
diff --git a/chrome/browser/signin/signin_manager_unittest.cc b/chrome/browser/signin/signin_manager_unittest.cc index 80562a8..8354320 100644 --- a/chrome/browser/signin/signin_manager_unittest.cc +++ b/chrome/browser/signin/signin_manager_unittest.cc
@@ -314,7 +314,8 @@ "user@gmail.com", "password", SigninManager::OAuthTokenFetchedCallback()); - manager_->SignOut(signin_metrics::SIGNOUT_TEST); + manager_->SignOut(signin_metrics::SIGNOUT_TEST, + signin_metrics::SignoutDelete::IGNORE_METRIC); EXPECT_FALSE(manager_->IsAuthenticated()); EXPECT_TRUE(manager_->GetAuthenticatedAccountInfo().email.empty()); EXPECT_TRUE(manager_->GetAuthenticatedAccountId().empty()); @@ -335,10 +336,12 @@ manager_->SetAuthenticatedAccountInfo("gaia_id", "user@gmail.com"); manager_->ProhibitSignout(true); - manager_->SignOut(signin_metrics::SIGNOUT_TEST); + manager_->SignOut(signin_metrics::SIGNOUT_TEST, + signin_metrics::SignoutDelete::IGNORE_METRIC); EXPECT_TRUE(manager_->IsAuthenticated()); manager_->ProhibitSignout(false); - manager_->SignOut(signin_metrics::SIGNOUT_TEST); + manager_->SignOut(signin_metrics::SIGNOUT_TEST, + signin_metrics::SignoutDelete::IGNORE_METRIC); EXPECT_FALSE(manager_->IsAuthenticated()); }
diff --git a/chrome/browser/stack_sampling_configuration.cc b/chrome/browser/stack_sampling_configuration.cc index 20c9594..c5fc88b6 100644 --- a/chrome/browser/stack_sampling_configuration.cc +++ b/chrome/browser/stack_sampling_configuration.cc
@@ -133,9 +133,9 @@ // Generate a configuration according to the associated weights. const Variation variations[] = { - { PROFILE_10HZ, 15}, - { PROFILE_CONTROL, 15}, - { PROFILE_DISABLED, 70} + { PROFILE_10HZ, 50}, + { PROFILE_CONTROL, 50}, + { PROFILE_DISABLED, 0} }; int total_weight = 0;
diff --git a/chrome/browser/sync/profile_sync_service_startup_unittest.cc b/chrome/browser/sync/profile_sync_service_startup_unittest.cc index c37ffeb..53ccd6f 100644 --- a/chrome/browser/sync/profile_sync_service_startup_unittest.cc +++ b/chrome/browser/sync/profile_sync_service_startup_unittest.cc
@@ -8,6 +8,7 @@ #include "base/memory/scoped_ptr.h" #include "base/prefs/pref_service.h" #include "base/strings/utf_string_conversions.h" +#include "base/thread_task_runner_handle.h" #include "build/build_config.h" #include "chrome/browser/signin/account_tracker_service_factory.h" #include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" @@ -17,7 +18,6 @@ #include "chrome/browser/sync/chrome_sync_client.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/sync/supervised_user_signin_manager_wrapper.h" -#include "chrome/common/channel_info.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" @@ -41,6 +41,7 @@ #include "google_apis/gaia/gaia_auth_consumer.h" #include "google_apis/gaia/gaia_constants.h" #include "google_apis/gaia/oauth2_token_service.h" +#include "net/url_request/url_request_test_util.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -64,10 +65,10 @@ ProfileSyncService::InitParams GetInitParams( scoped_ptr<sync_driver::SyncClient> sync_client, - Profile* profile, scoped_ptr<SigninManagerWrapper> signin_wrapper, ProfileOAuth2TokenService* oauth2_token_service, - browser_sync::ProfileSyncServiceStartBehavior start_behavior) { + browser_sync::ProfileSyncServiceStartBehavior start_behavior, + net::URLRequestContextGetter* url_request_context) { ProfileSyncService::InitParams init_params; init_params.signin_wrapper = std::move(signin_wrapper); @@ -76,10 +77,10 @@ init_params.sync_client = std::move(sync_client); init_params.network_time_update_callback = base::Bind(&browser_sync::EmptyNetworkTimeUpdate); - init_params.base_directory = profile->GetPath(); - init_params.url_request_context = profile->GetRequestContext(); - init_params.debug_identifier = profile->GetDebugName(); - init_params.channel = chrome::GetChannel(); + init_params.base_directory = base::FilePath(FILE_PATH_LITERAL("dummyPath")); + init_params.url_request_context = url_request_context; + init_params.debug_identifier = "dummyDebugName"; + init_params.channel = version_info::Channel::UNKNOWN; init_params.db_thread = content::BrowserThread::GetMessageLoopProxyForThread( content::BrowserThread::DB); init_params.file_thread = @@ -112,15 +113,15 @@ public: TestProfileSyncServiceNoBackup( scoped_ptr<sync_driver::SyncClient> sync_client, - Profile* profile, scoped_ptr<SigninManagerWrapper> signin_wrapper, ProfileOAuth2TokenService* oauth2_token_service, - browser_sync::ProfileSyncServiceStartBehavior start_behavior) + browser_sync::ProfileSyncServiceStartBehavior start_behavior, + net::URLRequestContextGetter* url_request_context) : ProfileSyncService(GetInitParams(std::move(sync_client), - profile, std::move(signin_wrapper), oauth2_token_service, - start_behavior)) {} + start_behavior, + url_request_context)) {} protected: bool NeedBackup() const override { return false; } @@ -164,12 +165,15 @@ new browser_sync::ChromeSyncClient(profile)); sync_client->SetSyncApiComponentFactoryForTesting( make_scoped_ptr(new SyncApiComponentFactoryMock())); + scoped_refptr<net::URLRequestContextGetter> url_request_context = + new net::TestURLRequestContextGetter( + base::ThreadTaskRunnerHandle::Get()); return make_scoped_ptr(new TestProfileSyncServiceNoBackup( - std::move(sync_client), profile, + std::move(sync_client), make_scoped_ptr(new SigninManagerWrapper( SigninManagerFactory::GetForProfile(profile))), ProfileOAuth2TokenServiceFactory::GetForProfile(profile), - browser_sync::MANUAL_START)); + browser_sync::MANUAL_START, url_request_context.get())); } void CreateSyncService() { @@ -271,10 +275,13 @@ new browser_sync::ChromeSyncClient(profile)); sync_client->SetSyncApiComponentFactoryForTesting( make_scoped_ptr(new SyncApiComponentFactoryMock())); + scoped_refptr<net::URLRequestContextGetter> url_request_context = + new net::TestURLRequestContextGetter( + base::ThreadTaskRunnerHandle::Get()); return make_scoped_ptr(new TestProfileSyncServiceNoBackup( - std::move(sync_client), profile, + std::move(sync_client), make_scoped_ptr(new SigninManagerWrapper(signin)), oauth2_token_service, - browser_sync::AUTO_START)); + browser_sync::AUTO_START, url_request_context.get())); } };
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 63e996e9b..c6e1a56 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -98,6 +98,7 @@ "//chrome/browser/ui/views", "//chrome/browser/ui/webui/engagement:mojo_bindings", "//chrome/browser/ui/webui/omnibox:mojo_bindings", + "//chrome/browser/ui/webui/plugins:mojo_bindings", "//chrome/common/net", "//chrome/installer/util:with_no_strings", "//components/autofill/content/browser:risk_proto",
diff --git a/chrome/browser/ui/android/bluetooth_chooser_android.cc b/chrome/browser/ui/android/bluetooth_chooser_android.cc index 04449ae8..5094a94 100644 --- a/chrome/browser/ui/android/bluetooth_chooser_android.cc +++ b/chrome/browser/ui/android/bluetooth_chooser_android.cc
@@ -12,6 +12,7 @@ #include "content/public/browser/android/content_view_core.h" #include "jni/BluetoothChooserDialog_jni.h" #include "ui/android/window_android.h" +#include "url/origin.h" using base::android::AttachCurrentThread; using base::android::ConvertUTF8ToJavaString; @@ -21,8 +22,9 @@ BluetoothChooserAndroid::BluetoothChooserAndroid( content::WebContents* web_contents, const EventHandler& event_handler, - const GURL& origin) + const url::Origin& origin) : event_handler_(event_handler) { + DCHECK(!origin.unique()); base::android::ScopedJavaLocalRef<jobject> window_android = content::ContentViewCore::FromWebContents( web_contents)->GetWindowAndroid()->GetJavaObject(); @@ -34,7 +36,7 @@ // Create (and show) the BluetoothChooser dialog. JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jstring> origin_string = - ConvertUTF8ToJavaString(env, origin.spec()); + ConvertUTF8ToJavaString(env, origin.Serialize()); java_dialog_.Reset(Java_BluetoothChooserDialog_create( env, window_android.obj(), origin_string.obj(), security_model_client->GetSecurityInfo().security_level,
diff --git a/chrome/browser/ui/android/bluetooth_chooser_android.h b/chrome/browser/ui/android/bluetooth_chooser_android.h index 3a99ffd..53cd9f8 100644 --- a/chrome/browser/ui/android/bluetooth_chooser_android.h +++ b/chrome/browser/ui/android/bluetooth_chooser_android.h
@@ -9,13 +9,17 @@ #include "content/public/browser/bluetooth_chooser.h" #include "content/public/browser/web_contents.h" +namespace url { +class Origin; +} + // Represents a way to ask the user to select a Bluetooth device from a list of // options. class BluetoothChooserAndroid : public content::BluetoothChooser { public: BluetoothChooserAndroid(content::WebContents* web_contents, const EventHandler& event_handler, - const GURL& origin); + const url::Origin& origin); ~BluetoothChooserAndroid() override; // content::BluetoothChooser:
diff --git a/chrome/browser/ui/aura/DEPS b/chrome/browser/ui/aura/DEPS new file mode 100644 index 0000000..c34c810 --- /dev/null +++ b/chrome/browser/ui/aura/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+chrome/browser/ui/views", +]
diff --git a/chrome/browser/ui/aura/chrome_browser_main_extra_parts_aura.cc b/chrome/browser/ui/aura/chrome_browser_main_extra_parts_aura.cc index 7c836e3..a42ea33 100644 --- a/chrome/browser/ui/aura/chrome_browser_main_extra_parts_aura.cc +++ b/chrome/browser/ui/aura/chrome_browser_main_extra_parts_aura.cc
@@ -23,6 +23,7 @@ #if defined(OS_LINUX) && !defined(OS_CHROMEOS) #include "base/prefs/pref_service.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/common/pref_names.h" #include "ui/aura/window.h" #include "ui/base/ime/input_method_initializer.h" @@ -51,6 +52,8 @@ return nullptr; Profile* profile = nullptr; + // Window types not listed here (such as tooltips) will never use Chrome + // theming. if (window->type() == ui::wm::WINDOW_TYPE_NORMAL || window->type() == ui::wm::WINDOW_TYPE_POPUP || window->type() == ui::wm::WINDOW_TYPE_CONTROL) { @@ -59,8 +62,16 @@ } if (profile && !profile->GetPrefs()->GetBoolean(prefs::kUsesSystemTheme)) { - return profile->IsOffTheRecord() ? ui::NativeThemeDarkAura::instance() - : ui::NativeThemeAura::instance(); + // Only toplevel browser windows and CONTROL type windows (such as the find + // in page bar) should use special theming for off the record mode. + // WINDOW_TYPE_NORMAL is not enough to distinguish browser windows because + // it also encompasses dialogs. + bool eligible_for_otr = window->type() == ui::wm::WINDOW_TYPE_CONTROL || + BrowserView::GetBrowserViewForNativeWindow(window); + if (eligible_for_otr && profile->IsOffTheRecord()) + return ui::NativeThemeDarkAura::instance(); + + return ui::NativeThemeAura::instance(); } return nullptr;
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc index 9d421f4..43350b4 100644 --- a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc +++ b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
@@ -32,7 +32,7 @@ #if !defined(OS_ANDROID) // Size difference between name and label in pixels. -const int kLabelFontSizeDelta = -2; +const int kLabelFontSizeDelta = -3; #endif } // namespace @@ -336,7 +336,7 @@ } int AutofillPopupControllerImpl::GetElidedLabelWidthForRow(size_t row) { - return gfx::GetStringWidth(GetElidedValueAt(row), label_font_list_); + return gfx::GetStringWidth(GetElidedLabelAt(row), label_font_list_); } #endif
diff --git a/chrome/browser/ui/autofill/autofill_popup_layout_model.cc b/chrome/browser/ui/autofill/autofill_popup_layout_model.cc index 986a516..fba38af3 100644 --- a/chrome/browser/ui/autofill/autofill_popup_layout_model.cc +++ b/chrome/browser/ui/autofill/autofill_popup_layout_model.cc
@@ -22,7 +22,7 @@ namespace { // The vertical height of each row in pixels. -const size_t kRowHeight = 24; +const size_t kRowHeight = 44; // The vertical height of a separator in pixels. const size_t kSeparatorHeight = 1;
diff --git a/chrome/browser/ui/autofill/autofill_popup_layout_model.h b/chrome/browser/ui/autofill/autofill_popup_layout_model.h index d43443e6..5d2cc1ae 100644 --- a/chrome/browser/ui/autofill/autofill_popup_layout_model.h +++ b/chrome/browser/ui/autofill/autofill_popup_layout_model.h
@@ -38,7 +38,7 @@ static const int kIconPadding = 5; // The amount of padding at the end of the popup in pixels. - static const int kEndPadding = 3; + static const int kEndPadding = 18; #if !defined(OS_ANDROID) // Calculates the desired height of the popup based on its contents.
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index acc57b4d..4a718e9e 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -1427,7 +1427,7 @@ scoped_ptr<content::BluetoothChooser> Browser::RunBluetoothChooser( content::WebContents* web_contents, const content::BluetoothChooser::EventHandler& event_handler, - const GURL& origin) { + const url::Origin& origin) { scoped_ptr<BluetoothChooserDesktop> bluetooth_chooser_desktop( new BluetoothChooserDesktop(event_handler)); Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h index daeb5ae..80bd890 100644 --- a/chrome/browser/ui/browser.h +++ b/chrome/browser/ui/browser.h
@@ -472,7 +472,7 @@ scoped_ptr<content::BluetoothChooser> RunBluetoothChooser( content::WebContents* web_contents, const content::BluetoothChooser::EventHandler& event_handler, - const GURL& origin) override; + const url::Origin& origin) override; bool RequestAppBanner(content::WebContents* web_contents) override; bool is_type_tabbed() const { return type_ == TYPE_TABBED; }
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc index 06497a7d..0ad39f4 100644 --- a/chrome/browser/ui/browser_command_controller.cc +++ b/chrome/browser/ui/browser_command_controller.cc
@@ -10,6 +10,7 @@ #include "base/command_line.h" #include "base/debug/debugging_flags.h" +#include "base/debug/profiler.h" #include "base/macros.h" #include "base/prefs/pref_service.h" #include "build/build_config.h" @@ -1166,9 +1167,9 @@ command_updater_.UpdateCommandEnabled(IDC_VIEW_PASSWORDS, show_main_ui); command_updater_.UpdateCommandEnabled(IDC_ABOUT, show_main_ui); command_updater_.UpdateCommandEnabled(IDC_SHOW_APP_MENU, show_main_ui); -#if BUILDFLAG(ENABLE_PROFILING) && !defined(NO_TCMALLOC) - command_updater_.UpdateCommandEnabled(IDC_PROFILING_ENABLED, show_main_ui); -#endif + + if (base::debug::IsProfilingSupported()) + command_updater_.UpdateCommandEnabled(IDC_PROFILING_ENABLED, show_main_ui); // Disable explicit fullscreen toggling when in metro snap mode. bool fullscreen_enabled = window_state != WINDOW_STATE_METRO_SNAP;
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm index 0d5f650..fb6d1c0 100644 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm
@@ -865,6 +865,11 @@ int bookmarkChildren = bookmarkModel_->bookmark_bar_node()->child_count(); if (bookmarkChildren > displayedButtonCount_) { [offTheSideButton_ setHidden:NO]; + // Set the off the side button as needing re-display. This is needed to + // avoid the button being shown with a black background the first time + // it's displayed. See https://codereview.chromium.org/1630453002/ for + // more context. + [offTheSideButton_ setNeedsDisplay:YES]; } else { // If we just deleted the last item in an off-the-side menu so the // button will be going away, make sure the menu goes away.
diff --git a/chrome/browser/ui/pdf/adobe_reader_info_win.cc b/chrome/browser/ui/pdf/adobe_reader_info_win.cc index 7f63daa..86feb5f 100644 --- a/chrome/browser/ui/pdf/adobe_reader_info_win.cc +++ b/chrome/browser/ui/pdf/adobe_reader_info_win.cc
@@ -184,5 +184,6 @@ base::ReplaceSubstringsAfterOffset(&reader_version, 0, from, to); } base::Version file_version(reader_version); - return file_version.IsValid() && !file_version.IsOlderThan(kSecureVersion); + return file_version.IsValid() && + file_version >= base::Version(kSecureVersion); }
diff --git a/chrome/browser/ui/startup/default_browser_prompt.cc b/chrome/browser/ui/startup/default_browser_prompt.cc index 0f13478..b5710ea4 100644 --- a/chrome/browser/ui/startup/default_browser_prompt.cc +++ b/chrome/browser/ui/startup/default_browser_prompt.cc
@@ -314,9 +314,9 @@ prefs::kBrowserSuppressDefaultBrowserPrompt); const Version disable_version(disable_version_string); DCHECK(disable_version_string.empty() || disable_version.IsValid()); - if (disable_version.IsValid()) { - if (disable_version.Equals(Version(version_info::GetVersionNumber()))) - show_prompt = false; + if (disable_version.IsValid() && + disable_version == Version(version_info::GetVersionNumber())) { + show_prompt = false; } }
diff --git a/chrome/browser/ui/sync/one_click_signin_sync_starter.cc b/chrome/browser/ui/sync/one_click_signin_sync_starter.cc index 70e2ff3..1a00187 100644 --- a/chrome/browser/ui/sync/one_click_signin_sync_starter.cc +++ b/chrome/browser/ui/sync/one_click_signin_sync_starter.cc
@@ -330,7 +330,8 @@ // the signin for the original profile was cancelled (must do this after // we have called Initialize() with the new profile, as otherwise this // object will get freed when the signin on the old profile is cancelled. - old_signin_manager->SignOut(signin_metrics::TRANSFER_CREDENTIALS); + old_signin_manager->SignOut(signin_metrics::TRANSFER_CREDENTIALS, + signin_metrics::SignoutDelete::IGNORE_METRIC); // Load policy for the just-created profile - once policy has finished // loading the signin process will complete. @@ -357,8 +358,9 @@ #endif void OneClickSigninSyncStarter::CancelSigninAndDelete() { - SigninManagerFactory::GetForProfile(profile_)->SignOut( - signin_metrics::ABORT_SIGNIN); + SigninManagerFactory::GetForProfile(profile_) + ->SignOut(signin_metrics::ABORT_SIGNIN, + signin_metrics::SignoutDelete::IGNORE_METRIC); // The statement above results in a call to SigninFailed() which will free // this object, so do not refer to the OneClickSigninSyncStarter object // after this point. @@ -418,8 +420,10 @@ content::RecordAction( base::UserMetricsAction("Signin_Signin_WithDefaultSyncSettings")); ProfileSyncService* profile_sync_service = GetProfileSyncService(); - if (profile_sync_service) + if (profile_sync_service) { profile_sync_service->SetFirstSetupComplete(); + profile_sync_service->RequestStart(); + } FinishProfileSyncServiceSetup(); }
diff --git a/chrome/browser/ui/toolbar/app_menu_model.cc b/chrome/browser/ui/toolbar/app_menu_model.cc index 2a143b8e..f633887 100644 --- a/chrome/browser/ui/toolbar/app_menu_model.cc +++ b/chrome/browser/ui/toolbar/app_menu_model.cc
@@ -9,6 +9,7 @@ #include "base/command_line.h" #include "base/debug/debugging_flags.h" +#include "base/debug/profiler.h" #include "base/macros.h" #include "base/metrics/histogram.h" #include "base/prefs/pref_service.h" @@ -285,10 +286,10 @@ AddSeparator(ui::NORMAL_SEPARATOR); AddItemWithStringId(IDC_DEV_TOOLS, IDS_DEV_TOOLS); -#if BUILDFLAG(ENABLE_PROFILING) && !defined(NO_TCMALLOC) - AddSeparator(ui::NORMAL_SEPARATOR); - AddCheckItemWithStringId(IDC_PROFILING_ENABLED, IDS_PROFILING_ENABLED); -#endif + if (base::debug::IsProfilingSupported()) { + AddSeparator(ui::NORMAL_SEPARATOR); + AddCheckItemWithStringId(IDC_PROFILING_ENABLED, IDS_PROFILING_ENABLED); + } } ////////////////////////////////////////////////////////////////////////////////
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 0675c12..95943d0 100644 --- a/chrome/browser/ui/views/frame/glass_browser_frame_view.cc +++ b/chrome/browser/ui/views/frame/glass_browser_frame_view.cc
@@ -303,7 +303,7 @@ if ((frame()->IsMaximized() || frame()->IsFullscreen()) && !restored) return 0; - return (base::win::GetVersion() <= base::win::VERSION_WIN8_1) + return (base::win::GetVersion() < base::win::VERSION_WIN10) ? kNonClientBorderThicknessPreWin10 : kNonClientBorderThicknessWin10; } @@ -331,7 +331,7 @@ !browser_view()->toolbar()->GetPreferredSize().IsEmpty(); } -void GlassBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) { +void GlassBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) const { gfx::Rect toolbar_bounds(browser_view()->GetToolbarBounds()); if (toolbar_bounds.IsEmpty()) return; @@ -436,7 +436,7 @@ } } -void GlassBrowserFrameView::PaintClientEdge(gfx::Canvas* canvas) { +void GlassBrowserFrameView::PaintClientEdge(gfx::Canvas* canvas) const { gfx::Rect client_bounds = CalculateClientAreaBounds(); int y = client_bounds.y(); const bool normal_mode = browser_view()->IsTabStripVisible(); @@ -546,6 +546,7 @@ } void GlassBrowserFrameView::LayoutIncognitoIcon() { + const bool md = ui::MaterialDesignController::IsModeMaterial(); const gfx::Insets insets(GetLayoutInsets(AVATAR_ICON)); gfx::Size size; // During startup it's possible to reach here before the browser view has been @@ -562,11 +563,17 @@ x = width() - frame()->GetMinimizeButtonOffset() + (new_avatar_button() ? (new_avatar_button()->width() + kNewAvatarButtonOffset) : 0); + } else if (!md && !avatar_button() && + (base::win::GetVersion() < base::win::VERSION_WIN10)) { + // In non-MD before Win 10, the toolbar has a rounded corner that we don't + // want the tabstrip to overlap. + x += browser_view()->GetToolbarBounds().x() - kContentEdgeShadowThickness + + GetThemeProvider()->GetImageSkiaNamed( + IDR_CONTENT_TOP_LEFT_CORNER)->width(); } const int bottom = GetTopInset(false) + browser_view()->GetTabStripHeight() - insets.bottom(); - const int y = (ui::MaterialDesignController::IsModeMaterial() || - !frame()->IsMaximized()) ? + const int y = (md || !frame()->IsMaximized()) ? (bottom - size.height()) : FrameTopBorderHeight(false); incognito_bounds_.SetRect(x + (avatar_button() ? insets.left() : 0), y, avatar_button() ? size.width() : 0, bottom - y);
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 84ba06e..e9280b63 100644 --- a/chrome/browser/ui/views/frame/glass_browser_frame_view.h +++ b/chrome/browser/ui/views/frame/glass_browser_frame_view.h
@@ -75,8 +75,8 @@ bool IsToolbarVisible() const; // Paint various sub-components of this view. - void PaintToolbarBackground(gfx::Canvas* canvas); - void PaintClientEdge(gfx::Canvas* canvas); + void PaintToolbarBackground(gfx::Canvas* canvas) const; + void PaintClientEdge(gfx::Canvas* canvas) const; void FillClientEdgeRects(int x, int y, int right,
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc index 8405ea28..638bdd4b 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
@@ -431,6 +431,12 @@ return s; } +int OpaqueBrowserFrameView::GetToolbarLeadingCornerClientWidth() const { + return browser_view()->GetToolbarBounds().x() - kContentEdgeShadowThickness + + GetThemeProvider()->GetImageSkiaNamed( + IDR_CONTENT_TOP_LEFT_CORNER)->width(); +} + /////////////////////////////////////////////////////////////////////////////// // OpaqueBrowserFrameView, protected: @@ -574,7 +580,8 @@ IsMaximized()); } -void OpaqueBrowserFrameView::PaintRestoredFrameBorder(gfx::Canvas* canvas) { +void OpaqueBrowserFrameView::PaintRestoredFrameBorder( + gfx::Canvas* canvas) const { frame_background_->set_frame_color(GetFrameColor()); frame_background_->set_theme_image(GetFrameImage()); frame_background_->set_theme_overlay_image(GetFrameOverlayImage()); @@ -599,7 +606,8 @@ // all this in PaintRestoredClientEdge(). } -void OpaqueBrowserFrameView::PaintMaximizedFrameBorder(gfx::Canvas* canvas) { +void OpaqueBrowserFrameView::PaintMaximizedFrameBorder( + gfx::Canvas* canvas) const { frame_background_->set_frame_color(GetFrameColor()); frame_background_->set_theme_image(GetFrameImage()); frame_background_->set_theme_overlay_image(GetFrameOverlayImage()); @@ -609,7 +617,7 @@ frame_background_->PaintMaximized(canvas, this); } -void OpaqueBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) { +void OpaqueBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) const { gfx::Rect toolbar_bounds(browser_view()->GetToolbarBounds()); if (toolbar_bounds.IsEmpty()) return; @@ -714,7 +722,7 @@ } } -void OpaqueBrowserFrameView::PaintClientEdge(gfx::Canvas* canvas) { +void OpaqueBrowserFrameView::PaintClientEdge(gfx::Canvas* canvas) const { gfx::Rect client_bounds = layout_->CalculateClientAreaBounds(width(), height()); const int x = client_bounds.x();
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.h b/chrome/browser/ui/views/frame/opaque_browser_frame_view.h index 39ca521..41632a7 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.h +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.h
@@ -86,6 +86,7 @@ int GetTabStripHeight() const override; bool IsToolbarVisible() const override; gfx::Size GetTabstripPreferredSize() const override; + int GetToolbarLeadingCornerClientWidth() const override; protected: views::ImageButton* minimize_button() const { return minimize_button_; } @@ -140,10 +141,10 @@ // Paint various sub-components of this view. The *FrameBorder() functions // also paint the background of the titlebar area, since the top frame border // and titlebar background are a contiguous component. - void PaintRestoredFrameBorder(gfx::Canvas* canvas); - void PaintMaximizedFrameBorder(gfx::Canvas* canvas); - void PaintToolbarBackground(gfx::Canvas* canvas); - void PaintClientEdge(gfx::Canvas* canvas); + void PaintRestoredFrameBorder(gfx::Canvas* canvas) const; + void PaintMaximizedFrameBorder(gfx::Canvas* canvas) const; + void PaintToolbarBackground(gfx::Canvas* canvas) const; + void PaintClientEdge(gfx::Canvas* canvas) const; void FillClientEdgeRects(int x, int y, int right,
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc index 3b18ab2..5807f8b 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc
@@ -11,6 +11,7 @@ #include "chrome/browser/ui/views/profiles/avatar_menu_button.h" #include "chrome/common/chrome_switches.h" #include "components/signin/core/common/profile_management_switches.h" +#include "ui/base/material_design/material_design_controller.h" #include "ui/gfx/font.h" #include "ui/views/controls/button/image_button.h" #include "ui/views/controls/label.h" @@ -42,17 +43,6 @@ // There is a 4 px gap between the icon and the title text. const int kIconTitleSpacing = 4; -// The avatar ends 2 px above the bottom of the tabstrip (which, given the -// way the tabstrip draws its bottom edge, will appear like a 1 px gap to the -// user). -const int kAvatarBottomSpacing = 2; - -// Space between the frame border and the edge of the avatar. -const int kAvatarOuterSpacing = 2; - -// Space between the edge of the avatar and the tabstrip. -const int kAvatarInnerSpacing = 4; - // How far the new avatar button is from the closest caption button. const int kNewAvatarButtonOffset = 5; @@ -72,14 +62,6 @@ // overrides the two previous constants. const int kNewTabNoCaptionButtonsSpacing = 5; -// The top 3 px of the tabstrip is shadow; in maximized mode we push this off -// the top of the screen so the tabs appear flush against the screen edge. -const int kTabstripTopShadowThickness = 3; - -// How far to indent the tabstrip from the left side of the screen when there -// is no avatar icon. -const int kTabStripIndent = -6; - #if defined(OS_LINUX) && !defined(OS_CHROMEOS) // Default extra space between the top of the frame and the top of the window // caption buttons. @@ -132,20 +114,10 @@ gfx::Rect OpaqueBrowserFrameViewLayout::GetBoundsForTabStrip( const gfx::Size& tabstrip_preferred_size, int available_width) const { - available_width -= trailing_button_start_; - available_width -= leading_button_start_; - - const int caption_spacing = NewTabCaptionSpacing(); - const int tabstrip_width = available_width - caption_spacing; - gfx::Rect bounds(leading_button_start_, GetTabStripInsetsTop(false), - std::max(0, tabstrip_width), + int x = leading_button_start_ + GetLayoutInsets(AVATAR_ICON).right(); + available_width -= x + NewTabCaptionSpacing() + trailing_button_start_; + return gfx::Rect(x, GetTabStripInsetsTop(false), std::max(0, available_width), tabstrip_preferred_size.height()); - - int leading_tabstrip_indent = kTabStripIndent; - if (delegate_->ShouldShowAvatar() && !ShouldAvatarBeOnRight()) - leading_tabstrip_indent += kAvatarInnerSpacing; - bounds.Inset(leading_tabstrip_indent, 0, 0, 0); - return bounds; } gfx::Size OpaqueBrowserFrameViewLayout::GetMinimumSize( @@ -265,9 +237,9 @@ /////////////////////////////////////////////////////////////////////////////// // OpaqueBrowserFrameView, private: -bool OpaqueBrowserFrameViewLayout::ShouldAvatarBeOnRight() const { - // The avatar should be shown either on the end of the left or the beginning - // of the right depending on which side has fewer buttons. +bool OpaqueBrowserFrameViewLayout::ShouldIncognitoIconBeOnRight() const { + // The incognito should be shown either on the end of the left or the + // beginning of the right, depending on which side has fewer buttons. return trailing_buttons_.size() < leading_buttons_.size(); } @@ -405,41 +377,43 @@ kCaptionButtonHeight); } -void OpaqueBrowserFrameViewLayout::LayoutAvatar(views::View* host) { - // Even though the avatar is used for both incognito and profiles we always - // use the incognito icon to layout the avatar button. The profile icon - // can be customized so we can't depend on its size to perform layout. - gfx::ImageSkia incognito_icon = delegate_->GetOTRAvatarIcon(); +void OpaqueBrowserFrameViewLayout::LayoutIncognitoIcon(views::View* host) { + const int old_button_size = leading_button_start_ + trailing_button_start_; - bool avatar_on_right = ShouldAvatarBeOnRight(); - int avatar_bottom = GetTabStripInsetsTop(false) + - delegate_->GetTabStripHeight() - kAvatarBottomSpacing; - int avatar_restored_y = avatar_bottom - incognito_icon.height(); - int avatar_x = avatar_on_right ? - host->width() - trailing_button_start_ - kAvatarOuterSpacing - - incognito_icon.width() : - leading_button_start_ + kAvatarOuterSpacing; - int avatar_y = IsTitleBarCondensed() ? - (NonClientTopBorderHeight(false) + kTabstripTopShadowThickness) : - avatar_restored_y; - avatar_bounds_.SetRect( - avatar_x, - avatar_y, - incognito_icon.width(), - delegate_->ShouldShowAvatar() ? (avatar_bottom - avatar_y) : 0); + // Any buttons/icon/title were laid out based on the frame border thickness, + // but the tabstrip bounds need to be based on the non-client border thickness + // on any side where there aren't other buttons forcing a larger inset. + const bool md = ui::MaterialDesignController::IsModeMaterial(); + int min_button_width = NonClientBorderThickness(); + // In non-MD, the toolbar has a rounded corner that we don't want the tabstrip + // to overlap. + if (!md && !avatar_button_) + min_button_width += delegate_->GetToolbarLeadingCornerClientWidth(); + leading_button_start_ = std::max(leading_button_start_, min_button_width); + // The trailing corner is a mirror of the leading one. + trailing_button_start_ = std::max(trailing_button_start_, min_button_width); + if (avatar_button_) { - avatar_button_->SetBoundsRect(avatar_bounds_); - - int edge_offset = kAvatarOuterSpacing + incognito_icon.width(); - if (avatar_on_right) - trailing_button_start_ += edge_offset; - else - leading_button_start_ += edge_offset; - - // We just add the avatar button size to the minimum size because clicking - // the avatar label does the same thing as clicking the avatar button. - minimum_size_for_buttons_ += kAvatarOuterSpacing + incognito_icon.width(); + const gfx::Insets insets(GetLayoutInsets(AVATAR_ICON)); + const gfx::Size size(delegate_->GetOTRAvatarIcon().size()); + const int incognito_width = insets.left() + size.width(); + int x; + if (ShouldIncognitoIconBeOnRight()) { + trailing_button_start_ += incognito_width; + x = host->width() - trailing_button_start_; + } else { + x = leading_button_start_ + insets.left(); + leading_button_start_ += incognito_width; + } + const int bottom = GetTabStripInsetsTop(false) + + delegate_->GetTabStripHeight() - insets.bottom(); + const int y = (md || !IsTitleBarCondensed()) ? + (bottom - size.height()) : FrameBorderThickness(false); + avatar_button_->SetBounds(x, y, size.width(), bottom - y); } + + minimum_size_for_buttons_ += + (leading_button_start_ + trailing_button_start_ - old_button_size); } void OpaqueBrowserFrameViewLayout::ConfigureButton( @@ -639,15 +613,9 @@ LayoutWindowControls(host); LayoutTitleBar(host); - // We now add a single pixel to the leading spacing. We do this because the - // avatar and tab strip start one pixel inward compared to where things start - // on the trailing side. - leading_button_start_++; - if (delegate_->IsRegularOrGuestSession()) LayoutNewStyleAvatar(host); - else - LayoutAvatar(host); + LayoutIncognitoIcon(host); client_view_bounds_ = CalculateClientAreaBounds( host->width(), host->height());
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h index 4614503..9d17744 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h
@@ -107,9 +107,9 @@ ALIGN_TRAILING }; - // Determines whether the avatar should be shown on the right side of the tab - // strip (instead of the usual left). - bool ShouldAvatarBeOnRight() const; + // Determines whether the incognito icon should be shown on the right side of + // the tab strip (instead of the usual left). + bool ShouldIncognitoIconBeOnRight() const; // Determines the amount of spacing between the New Tab button and the element // to its immediate right. @@ -118,7 +118,7 @@ // Layout various sub-components of this view. void LayoutWindowControls(views::View* host); void LayoutTitleBar(views::View* host); - void LayoutAvatar(views::View* host); + void LayoutIncognitoIcon(views::View* host); void LayoutNewStyleAvatar(views::View* host); void ConfigureButton(views::View* host, @@ -146,9 +146,6 @@ OpaqueBrowserFrameViewLayoutDelegate* delegate_; - // The layout rect of the avatar icon, if visible. - gfx::Rect avatar_bounds_; - // The bounds of the ClientView. gfx::Rect client_view_bounds_;
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_delegate.h b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_delegate.h index 9785ae6..8a2c9d9 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_delegate.h +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_delegate.h
@@ -54,6 +54,11 @@ // it. virtual gfx::Size GetTabstripPreferredSize() const = 0; + // Returns the width of the portion of the toolbar's leading-edge rounded + // corner that is within the client area. This is only necessary pre-Material + // Design. + virtual int GetToolbarLeadingCornerClientWidth() const = 0; + protected: virtual ~OpaqueBrowserFrameViewLayoutDelegate() {} };
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc index 557245e..32fad08 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc
@@ -115,6 +115,10 @@ return IsTabStripVisible() ? gfx::Size(78, 29) : gfx::Size(0, 0); } + int GetToolbarLeadingCornerClientWidth() const override { + return 0; + } + private: base::string16 window_title_; bool show_avatar_; @@ -261,7 +265,7 @@ EXPECT_EQ("429,0 25x18", restore_button_->bounds().ToString()); EXPECT_EQ("454,0 46x18", close_button_->bounds().ToString()); - EXPECT_EQ("-5,-3 392x29", + EXPECT_EQ("-6,-3 393x29", layout_manager_->GetBoundsForTabStrip( delegate_->GetTabstripPreferredSize(), kWidth).ToString()); EXPECT_EQ("262x61", layout_manager_->GetMinimumSize(kWidth).ToString()); @@ -287,7 +291,7 @@ EXPECT_EQ("429,0 25x20", restore_button_->bounds().ToString()); EXPECT_EQ("454,0 46x20", close_button_->bounds().ToString()); - EXPECT_EQ("-5,-3 392x29", + EXPECT_EQ("-6,-3 393x29", layout_manager_->GetBoundsForTabStrip( delegate_->GetTabstripPreferredSize(), kWidth).ToString()); EXPECT_EQ("262x61", layout_manager_->GetMinimumSize(kWidth).ToString()); @@ -312,7 +316,7 @@ EXPECT_EQ("0,0 0x0", restore_button_->bounds().ToString()); EXPECT_EQ("4,1 43x18", close_button_->bounds().ToString()); - EXPECT_EQ("93,13 398x29", + EXPECT_EQ("92,13 398x29", layout_manager_->GetBoundsForTabStrip( delegate_->GetTabstripPreferredSize(), kWidth).ToString()); EXPECT_EQ("261x73", layout_manager_->GetMinimumSize(kWidth).ToString()); @@ -333,7 +337,7 @@ EXPECT_EQ("0,0 0x0", restore_button_->bounds().ToString()); EXPECT_EQ("0,0 0x0", close_button_->bounds().ToString()); - EXPECT_EQ("-5,-3 500x29", + EXPECT_EQ("-6,-3 501x29", layout_manager_->GetBoundsForTabStrip( delegate_->GetTabstripPreferredSize(), kWidth).ToString()); EXPECT_EQ("251x61", layout_manager_->GetMinimumSize(kWidth).ToString()); @@ -355,7 +359,7 @@ EXPECT_EQ("0,0 0x0", restore_button_->bounds().ToString()); EXPECT_EQ("0,0 0x0", close_button_->bounds().ToString()); - EXPECT_EQ("-5,-3 500x29", + EXPECT_EQ("-6,-3 501x29", layout_manager_->GetBoundsForTabStrip( delegate_->GetTabstripPreferredSize(), kWidth).ToString()); EXPECT_EQ("251x61", layout_manager_->GetMinimumSize(kWidth).ToString());
diff --git a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc index b98ede0..a8dc1224 100644 --- a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc +++ b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc
@@ -113,7 +113,7 @@ // this up when MD is on by default. bool icon_has_enough_padding = !is_extension_icon_ || ui::MaterialDesignController::IsModeMaterial(); - const int image_width = image()->GetPreferredSize().width(); + const int image_width = image_->GetPreferredSize().width(); image_->SetBounds(std::min((width() - image_width) / 2, GetBubbleOuterPadding(icon_has_enough_padding)), 0, image_->GetPreferredSize().width(), height());
diff --git a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.h b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.h index 557973b..ad46081 100644 --- a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.h +++ b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.h
@@ -28,7 +28,7 @@ // View used to draw a bubble, containing an icon and a label. We use this as a // base for the classes that handle the location icon (including the EV bubble), // tab-to-search UI, and content settings. -class IconLabelBubbleView : public views::ImageView { +class IconLabelBubbleView : public views::View { public: IconLabelBubbleView(int contained_image, const gfx::FontList& font_list, @@ -47,6 +47,8 @@ is_extension_icon_ = is_extension_icon; } + const views::ImageView* GetImageView() const { return image_; } + protected: views::ImageView* image() { return image_; } views::Label* label() { return label_; }
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc index 24ff380..90d7643e 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.cc +++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -445,13 +445,13 @@ } gfx::Point LocationBarView::GetLocationBarAnchorPoint() const { + const views::ImageView* image = location_icon_view_->GetImageView(); // The +1 in the next line creates a 1-px gap between icon and arrow tip. - const int icon_padding = GetLayoutConstant(ICON_LABEL_VIEW_TRAILING_PADDING); - gfx::Point icon_bottom( - 0, location_icon_view_->GetImageBounds().bottom() - icon_padding + 1); - gfx::Point icon_center(location_icon_view_->GetImageBounds().CenterPoint()); - gfx::Point point(icon_center.x(), icon_bottom.y()); - ConvertPointToTarget(location_icon_view_, this, &point); + int icon_bottom = image->GetImageBounds().bottom() - + GetLayoutConstant(ICON_LABEL_VIEW_TRAILING_PADDING) + 1; + gfx::Point icon_center(image->GetImageBounds().CenterPoint()); + gfx::Point point(icon_center.x(), icon_bottom); + ConvertPointToTarget(image, this, &point); return point; } @@ -1353,7 +1353,7 @@ void LocationBarView::OnChanged() { RefreshLocationIcon(); - location_icon_view_->ShowTooltip(!GetOmniboxView()->IsEditingOrEmpty()); + location_icon_view_->set_show_tooltip(!GetOmniboxView()->IsEditingOrEmpty()); Layout(); SchedulePaint(); }
diff --git a/chrome/browser/ui/views/location_bar/location_icon_view.cc b/chrome/browser/ui/views/location_bar/location_icon_view.cc index 7524f32..fd2431d 100644 --- a/chrome/browser/ui/views/location_bar/location_icon_view.cc +++ b/chrome/browser/ui/views/location_bar/location_icon_view.cc
@@ -118,6 +118,13 @@ event->SetHandled(); } +bool LocationIconView::GetTooltipText(const gfx::Point& p, + base::string16* tooltip) const { + if (show_tooltip_) + *tooltip = l10n_util::GetStringUTF16(IDS_TOOLTIP_LOCATION_ICON); + return show_tooltip_; +} + void LocationIconView::OnClickOrTap(const ui::LocatedEvent& event) { // Do not show page info if the user has been editing the location bar or the // location bar is at the NTP. @@ -126,11 +133,6 @@ ProcessEvent(event); } -void LocationIconView::ShowTooltip(bool show) { - SetTooltipText(show ? - l10n_util::GetStringUTF16(IDS_TOOLTIP_LOCATION_ICON) : base::string16()); -} - void LocationIconView::ProcessEvent(const ui::LocatedEvent& event) { if (!HitTestPoint(event.location())) return;
diff --git a/chrome/browser/ui/views/location_bar/location_icon_view.h b/chrome/browser/ui/views/location_bar/location_icon_view.h index 65dabff..5593bba 100644 --- a/chrome/browser/ui/views/location_bar/location_icon_view.h +++ b/chrome/browser/ui/views/location_bar/location_icon_view.h
@@ -33,11 +33,13 @@ bool OnKeyPressed(const ui::KeyEvent& event) override; bool OnKeyReleased(const ui::KeyEvent& event) override; void OnGestureEvent(ui::GestureEvent* event) override; + bool GetTooltipText(const gfx::Point& p, + base::string16* tooltip) const override; SkColor GetTextColor() const override; SkColor GetBorderColor() const override; // Whether we should show the tooltip for this icon or not. - void ShowTooltip(bool show); + void set_show_tooltip(bool show_tooltip) { show_tooltip_ = show_tooltip; } // Returns what the minimum size would be if the label text were |text|. gfx::Size GetMinimumSizeForLabelText(const base::string16& text) const; @@ -64,6 +66,9 @@ // clicking the icon repeatedly will appear to toggle the bubble on and off. bool suppress_mouse_released_action_; + // True if hovering this view should display a tooltip. + bool show_tooltip_; + LocationBarView* location_bar_; DISALLOW_COPY_AND_ASSIGN(LocationIconView);
diff --git a/chrome/browser/ui/views/profiles/new_avatar_button.cc b/chrome/browser/ui/views/profiles/new_avatar_button.cc index 479be926..64dd9b8 100644 --- a/chrome/browser/ui/views/profiles/new_avatar_button.cc +++ b/chrome/browser/ui/views/profiles/new_avatar_button.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "base/win/windows_version.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile_manager.h" @@ -79,6 +80,17 @@ SetBorder(CreateBorder(kNormalImageSet, kHotImageSet, kPushedImageSet)); generic_avatar_ = *rb->GetImageNamed(IDR_AVATAR_THEMED_BUTTON_AVATAR).ToImageSkia(); +#if defined(OS_WIN) + } else if (base::win::GetVersion() >= base::win::VERSION_WIN8 || + browser->host_desktop_type() == chrome::HOST_DESKTOP_TYPE_ASH) { + const int kNormalImageSet[] = IMAGE_GRID(IDR_AVATAR_METRO_BUTTON_NORMAL); + const int kHotImageSet[] = IMAGE_GRID(IDR_AVATAR_METRO_BUTTON_HOVER); + const int kPushedImageSet[] = IMAGE_GRID(IDR_AVATAR_METRO_BUTTON_PRESSED); + + SetBorder(CreateBorder(kNormalImageSet, kHotImageSet, kPushedImageSet)); + generic_avatar_ = + *rb->GetImageNamed(IDR_AVATAR_METRO_BUTTON_AVATAR).ToImageSkia(); +#endif } else { const int kNormalImageSet[] = IMAGE_GRID(IDR_AVATAR_GLASS_BUTTON_NORMAL); const int kHotImageSet[] = IMAGE_GRID(IDR_AVATAR_GLASS_BUTTON_HOVER);
diff --git a/chrome/browser/ui/webui/engagement/site_engagement_ui.cc b/chrome/browser/ui/webui/engagement/site_engagement_ui.cc index e75d528e..2a3b37f3 100644 --- a/chrome/browser/ui/webui/engagement/site_engagement_ui.cc +++ b/chrome/browser/ui/webui/engagement/site_engagement_ui.cc
@@ -88,7 +88,6 @@ source->AddResourcePath( "chrome/browser/ui/webui/engagement/site_engagement.mojom", IDR_SITE_ENGAGEMENT_MOJO_JS); - source->AddMojoResources(); source->SetDefaultResource(IDR_SITE_ENGAGEMENT_HTML); content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source.release());
diff --git a/chrome/browser/ui/webui/media_router/media_router_ui.cc b/chrome/browser/ui/webui/media_router/media_router_ui.cc index 7814a68..9ceaded1 100644 --- a/chrome/browser/ui/webui/media_router/media_router_ui.cc +++ b/chrome/browser/ui/webui/media_router/media_router_ui.cc
@@ -465,7 +465,8 @@ DVLOG(0) << "MediaRouteResponse returned error: " << error; } - handler_->OnCreateRouteResponseReceived(sink_id, route); + std::string route_id = route ? route->media_route_id() : std::string(); + handler_->OnCreateRouteResponseReceived(sink_id, route_id); current_route_request_id_ = -1; route_creation_timer_.Stop(); }
diff --git a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc index 558392b..8a9a427 100644 --- a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc +++ b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc
@@ -41,6 +41,7 @@ const char kReportInitialAction[] = "reportInitialAction"; const char kReportInitialState[] = "reportInitialState"; const char kReportNavigateToView[] = "reportNavigateToView"; +const char kReportRouteCreation[] = "reportRouteCreation"; const char kReportSelectedCastMode[] = "reportSelectedCastMode"; const char kReportSinkCount[] = "reportSinkCount"; const char kReportTimeToClickSink[] = "reportTimeToClickSink"; @@ -222,22 +223,11 @@ void MediaRouterWebUIMessageHandler::OnCreateRouteResponseReceived( const MediaSink::Id& sink_id, - const MediaRoute* route) { + const MediaRoute::Id& route_id) { DVLOG(2) << "OnCreateRouteResponseReceived"; - if (route) { - scoped_ptr<base::DictionaryValue> route_value(RouteToValue(*route, false, - media_router_ui_->GetRouteProviderExtensionId())); - web_ui()->CallJavascriptFunction(kOnCreateRouteResponseReceived, - base::StringValue(sink_id), *route_value); - UMA_HISTOGRAM_BOOLEAN("MediaRouter.Ui.Action.StartLocalSessionSuccessful", - true); - } else { - web_ui()->CallJavascriptFunction(kOnCreateRouteResponseReceived, - base::StringValue(sink_id), - *base::Value::CreateNullValue()); - UMA_HISTOGRAM_BOOLEAN("MediaRouter.Ui.Action.StartLocalSessionSuccessful", - false); - } + web_ui()->CallJavascriptFunction(kOnCreateRouteResponseReceived, + base::StringValue(sink_id), + base::StringValue(route_id)); } void MediaRouterWebUIMessageHandler::UpdateIssue(const Issue* issue) { @@ -299,6 +289,10 @@ base::Bind(&MediaRouterWebUIMessageHandler::OnReportInitialAction, base::Unretained(this))); web_ui()->RegisterMessageCallback( + kReportRouteCreation, + base::Bind(&MediaRouterWebUIMessageHandler::OnReportRouteCreation, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( kReportSelectedCastMode, base::Bind(&MediaRouterWebUIMessageHandler::OnReportSelectedCastMode, base::Unretained(this))); @@ -331,6 +325,11 @@ media_router_ui_->OnUIInitiallyLoaded(); base::DictionaryValue initial_data; +#if defined(GOOGLE_CHROME_BUILD) + // "Casting to a Hangout from Chrome" Chromecast help center page. + initial_data.SetString("firstRunFlowCloudPrefLearnMoreUrl", + base::StringPrintf(kHelpPageUrlPrefix, 6320939)); +#endif // defined(GOOGLE_CHROME_BUILD) // "No Cast devices found?" Chromecast help center page. initial_data.SetString("deviceMissingUrl", base::StringPrintf(kHelpPageUrlPrefix, 3249268)); @@ -349,11 +348,24 @@ media_router_ui_->GetPresentationRequestSourceName())); initial_data.Set("castModes", cast_modes_list.release()); + Profile* profile = Profile::FromWebUI(web_ui()); + bool first_run_flow_acknowledged = - Profile::FromWebUI(web_ui())->GetPrefs()->GetBoolean( + profile->GetPrefs()->GetBoolean( prefs::kMediaRouterFirstRunFlowAcknowledged); initial_data.SetBoolean("wasFirstRunFlowAcknowledged", first_run_flow_acknowledged); + bool show_cloud_pref = false; +#if defined(GOOGLE_CHROME_BUILD) + // Cloud services preference is shown if user has sync enabled. + // If the user enables sync after acknowledging the first run flow, this is + // treated as the user opting into Google services, including cloud services, + // if the browser is a Chrome branded build. + show_cloud_pref = profile->IsSyncAllowed() && + !profile->GetPrefs()->GetBoolean( + prefs::kMediaRouterCloudServicesPrefSet); +#endif // defined(GOOGLE_CHROME_BUILD) + initial_data.SetBoolean("showFirstRunFlowCloudPref", show_cloud_pref); web_ui()->CallJavascriptFunction(kSetInitialData, initial_data); media_router_ui_->UIInitialized(); @@ -415,6 +427,19 @@ DVLOG(1) << "OnAcknowledgeFirstRunFlow"; Profile::FromWebUI(web_ui())->GetPrefs()->SetBoolean( prefs::kMediaRouterFirstRunFlowAcknowledged, true); + +#if defined(GOOGLE_CHROME_BUILD) + bool enabled_cloud_services = false; + if (!args->GetBoolean(0, &enabled_cloud_services)) { + DVLOG(1) << "Unable to extract args."; + return; + } + + Profile::FromWebUI(web_ui())->GetPrefs()->SetBoolean( + prefs::kMediaRouterEnableCloudServices, enabled_cloud_services); + Profile::FromWebUI(web_ui())->GetPrefs()->SetBoolean( + prefs::kMediaRouterCloudServicesPrefSet, true); +#endif // defined(GOOGLE_CHROME_BUILD) } void MediaRouterWebUIMessageHandler::OnActOnIssue( @@ -567,6 +592,19 @@ } } +void MediaRouterWebUIMessageHandler::OnReportRouteCreation( + const base::ListValue* args) { + DVLOG(1) << "OnReportRouteCreation"; + bool route_created_successfully; + if (!args->GetBoolean(0, &route_created_successfully)) { + DVLOG(1) << "Unable to extract args."; + return; + } + + UMA_HISTOGRAM_BOOLEAN("MediaRouter.Ui.Action.StartLocalSessionSuccessful", + route_created_successfully); +} + void MediaRouterWebUIMessageHandler::OnReportSelectedCastMode( const base::ListValue* args) { DVLOG(1) << "OnReportSelectedCastMode";
diff --git a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h index e5bec19..562ba43 100644 --- a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h +++ b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h
@@ -38,7 +38,7 @@ void UpdateCastModes(const CastModeSet& cast_modes, const std::string& source_host); void OnCreateRouteResponseReceived(const MediaSink::Id& sink_id, - const MediaRoute* route); + const MediaRoute::Id& route_id); // Does not take ownership of |issue|. Note that |issue| can be nullptr, when // there are no more issues. @@ -68,6 +68,7 @@ void OnReportInitialAction(const base::ListValue* args); void OnReportInitialState(const base::ListValue* args); void OnReportNavigateToView(const base::ListValue* args); + void OnReportRouteCreation(const base::ListValue* args); void OnReportSelectedCastMode(const base::ListValue* args); void OnReportSinkCount(const base::ListValue* args); void OnReportTimeToClickSink(const base::ListValue* args);
diff --git a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler_unittest.cc b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler_unittest.cc index a936dd7c..39b5341 100644 --- a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler_unittest.cc +++ b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler_unittest.cc
@@ -174,9 +174,7 @@ MediaRoute route(route_id, MediaSource("mediaSource"), sink_id, description, is_local, "", true); - EXPECT_CALL(*mock_media_router_ui_, GetRouteProviderExtensionId()).WillOnce( - ReturnRef(provider_extension_id())); - handler_->OnCreateRouteResponseReceived(sink_id, &route); + handler_->OnCreateRouteResponseReceived(sink_id, route.media_route_id()); EXPECT_EQ(1u, web_ui_->call_data().size()); const content::TestWebUI::CallData& call_data = *web_ui_->call_data()[0]; EXPECT_EQ("media_router.ui.onCreateRouteResponseReceived", @@ -187,20 +185,9 @@ EXPECT_EQ(sink_id, sink_id_value->GetString()); const base::Value* arg2 = call_data.arg2(); - const base::DictionaryValue* route_value = nullptr; - ASSERT_TRUE(arg2->GetAsDictionary(&route_value)); - - std::string value; - EXPECT_TRUE(route_value->GetString("id", &value)); - EXPECT_EQ(route_id, value); - EXPECT_TRUE(route_value->GetString("sinkId", &value)); - EXPECT_EQ(sink_id, value); - EXPECT_TRUE(route_value->GetString("description", &value)); - EXPECT_EQ(description, value); - - bool actual_is_local = false; - EXPECT_TRUE(route_value->GetBoolean("isLocal", &actual_is_local)); - EXPECT_EQ(is_local, actual_is_local); + const base::StringValue* route_id_value = nullptr; + ASSERT_TRUE(arg2->GetAsString(&route_id_value)); + EXPECT_EQ(route_id, route_id_value->GetString()); } TEST_F(MediaRouterWebUIMessageHandlerTest, UpdateIssue) {
diff --git a/chrome/browser/ui/webui/omnibox/omnibox_ui.cc b/chrome/browser/ui/webui/omnibox/omnibox_ui.cc index 09bf3f4..94dcd1a 100644 --- a/chrome/browser/ui/webui/omnibox/omnibox_ui.cc +++ b/chrome/browser/ui/webui/omnibox/omnibox_ui.cc
@@ -22,7 +22,6 @@ source->AddResourcePath("omnibox.js", IDR_OMNIBOX_JS); source->AddResourcePath("chrome/browser/ui/webui/omnibox/omnibox.mojom", IDR_OMNIBOX_MOJO_JS); - source->AddMojoResources(); source->SetDefaultResource(IDR_OMNIBOX_HTML); content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source);
diff --git a/chrome/browser/ui/webui/options/sync_setup_handler.cc b/chrome/browser/ui/webui/options/sync_setup_handler.cc index 653c6f5..e4a3ae5 100644 --- a/chrome/browser/ui/webui/options/sync_setup_handler.cc +++ b/chrome/browser/ui/webui/options/sync_setup_handler.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/ui/webui/options/sync_setup_handler.h" +#include <string> + #include "base/bind.h" #include "base/bind_helpers.h" #include "base/command_line.h" @@ -672,11 +674,16 @@ void SyncSetupHandler::HandleStopSyncing(const base::ListValue* args) { if (GetSyncService()) ProfileSyncService::SyncEvent(ProfileSyncService::STOP_FROM_OPTIONS); - SigninManagerFactory::GetForProfile(GetProfile())->SignOut( - signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS); bool delete_profile = false; - if (args->GetBoolean(0, &delete_profile) && delete_profile) { + args->GetBoolean(0, &delete_profile); + signin_metrics::SignoutDelete delete_metric = + delete_profile ? signin_metrics::SignoutDelete::DELETED + : signin_metrics::SignoutDelete::KEEPING; + SigninManagerFactory::GetForProfile(GetProfile()) + ->SignOut(signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS, delete_metric); + + if (delete_profile) { // Do as BrowserOptionsHandler::DeleteProfile(). options::helper::DeleteProfileAtPath(GetProfile()->GetPath(), web_ui()); } @@ -719,8 +726,9 @@ // initial setup. // TODO(rsimha): Revisit this for M30. See http://crbug.com/252049. if (sync_service->IsFirstSetupInProgress()) { - SigninManagerFactory::GetForProfile(GetProfile())->SignOut( - signin_metrics::ABORT_SIGNIN); + SigninManagerFactory::GetForProfile(GetProfile()) + ->SignOut(signin_metrics::ABORT_SIGNIN, + signin_metrics::SignoutDelete::IGNORE_METRIC); } #endif }
diff --git a/chrome/browser/ui/webui/options/sync_setup_handler_unittest.cc b/chrome/browser/ui/webui/options/sync_setup_handler_unittest.cc index c2e53de..8312ccf 100644 --- a/chrome/browser/ui/webui/options/sync_setup_handler_unittest.cc +++ b/chrome/browser/ui/webui/options/sync_setup_handler_unittest.cc
@@ -311,7 +311,8 @@ EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); // Ensure that the user is not signed in before calling |HandleStartSignin()|. SigninManager* manager = static_cast<SigninManager*>(mock_signin_); - manager->SignOut(signin_metrics::SIGNOUT_TEST); + manager->SignOut(signin_metrics::SIGNOUT_TEST, + signin_metrics::SignoutDelete::IGNORE_METRIC); handler_->HandleStartSignin(NULL); // Sync setup hands off control to the gaia login tab.
diff --git a/chrome/browser/ui/webui/plugins/BUILD.gn b/chrome/browser/ui/webui/plugins/BUILD.gn new file mode 100644 index 0000000..595c9e1a --- /dev/null +++ b/chrome/browser/ui/webui/plugins/BUILD.gn
@@ -0,0 +1,11 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +import("//mojo/public/tools/bindings/mojom.gni") + +# GYP version: chrome/chrome_web_ui_mojo_bindings.gyp:webui_mojo_bindings +mojom("mojo_bindings") { + sources = [ + "plugins.mojom", + ] +}
diff --git a/chrome/browser/ui/webui/plugins/plugins.mojom b/chrome/browser/ui/webui/plugins/plugins.mojom new file mode 100644 index 0000000..b42f3f4 --- /dev/null +++ b/chrome/browser/ui/webui/plugins/plugins.mojom
@@ -0,0 +1,45 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +struct MimeType { + string description; + array<string> file_extensions; + string mime_type; +}; + +struct PluginFile { + string description; + string enabled_mode; + array<MimeType> mime_types; + string name; + string path; + string type; + string version; +}; + +struct PluginData { + bool always_allowed; + string description; + bool critical; + string enabled_mode; + string id; + string name; + string update_url; + string version; + array<PluginFile> plugin_files; +}; + +interface PluginsHandlerMojo { + GetPluginsData() => (array<PluginData> plugins); + GetShowDetails() => (bool show_details); + SaveShowDetailsToPrefs(bool details_mode); + SetPluginAlwaysAllowed(string plugin, bool allowed); + SetPluginEnabled(string plugin_path, bool enable); + SetPluginGroupEnabled(string group_name, bool enable); + SetClientPage(PluginsPageMojo page); +}; + +interface PluginsPageMojo { + OnPluginsUpdated(array<PluginData> plugins); +};
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc index 81f47a9..754ff46 100644 --- a/chrome/browser/ui/webui/settings/people_handler.cc +++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/ui/webui/settings/people_handler.h" +#include <string> + #include "base/bind.h" #include "base/bind_helpers.h" #include "base/command_line.h" @@ -623,11 +625,16 @@ void PeopleHandler::HandleStopSyncing(const base::ListValue* args) { if (GetSyncService()) ProfileSyncService::SyncEvent(ProfileSyncService::STOP_FROM_OPTIONS); - SigninManagerFactory::GetForProfile(profile_) - ->SignOut(signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS); bool delete_profile = false; - if (args->GetBoolean(0, &delete_profile) && delete_profile) { + args->GetBoolean(0, &delete_profile); + signin_metrics::SignoutDelete delete_metric = + delete_profile ? signin_metrics::SignoutDelete::DELETED + : signin_metrics::SignoutDelete::KEEPING; + SigninManagerFactory::GetForProfile(profile_) + ->SignOut(signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS, delete_metric); + + if (delete_profile) { // Do as BrowserOptionsHandler::DeleteProfile(). options::helper::DeleteProfileAtPath(profile_->GetPath(), web_ui()); } @@ -680,7 +687,8 @@ // TODO(rsimha): Revisit this for M30. See http://crbug.com/252049. if (sync_service->IsFirstSetupInProgress()) { SigninManagerFactory::GetForProfile(profile_) - ->SignOut(signin_metrics::ABORT_SIGNIN); + ->SignOut(signin_metrics::ABORT_SIGNIN, + signin_metrics::SignoutDelete::IGNORE_METRIC); } #endif }
diff --git a/chrome/browser/ui/webui/settings/people_handler_unittest.cc b/chrome/browser/ui/webui/settings/people_handler_unittest.cc index ab5cff3..e1207db 100644 --- a/chrome/browser/ui/webui/settings/people_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
@@ -316,7 +316,8 @@ EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); // Ensure that the user is not signed in before calling |HandleStartSignin()|. SigninManager* manager = static_cast<SigninManager*>(mock_signin_); - manager->SignOut(signin_metrics::SIGNOUT_TEST); + manager->SignOut(signin_metrics::SIGNOUT_TEST, + signin_metrics::SignoutDelete::IGNORE_METRIC); handler_->HandleStartSignin(NULL); // Sync setup hands off control to the gaia login tab.
diff --git a/chrome/chrome_browser_chromeos.gypi b/chrome/chrome_browser_chromeos.gypi index 14ee9b9c..260b68b4 100644 --- a/chrome/chrome_browser_chromeos.gypi +++ b/chrome/chrome_browser_chromeos.gypi
@@ -1129,6 +1129,7 @@ '../components/components.gyp:certificate_reporting', '../components/components.gyp:cloud_policy_proto', '../components/components.gyp:drive', + '../components/components.gyp:drive_chromeos', '../components/components.gyp:flags_ui', '../components/components.gyp:login', '../components/components.gyp:onc_component',
diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi index 5a71c26..8503d6d0 100644 --- a/chrome/chrome_browser_ui.gypi +++ b/chrome/chrome_browser_ui.gypi
@@ -2903,6 +2903,7 @@ '<@(chrome_browser_ui_toolbar_model_sources)', '<(SHARED_INTERMEDIATE_DIR)/chrome/browser/ui/webui/engagement/site_engagement.mojom.cc', '<(SHARED_INTERMEDIATE_DIR)/chrome/browser/ui/webui/omnibox/omnibox.mojom.cc', + '<(SHARED_INTERMEDIATE_DIR)/chrome/browser/ui/webui/plugins/plugins.mojom.cc', ], 'dependencies': [ 'chrome_web_ui_mojo_bindings.gyp:web_ui_mojo_bindings',
diff --git a/chrome/chrome_exe.gypi b/chrome/chrome_exe.gypi index fb218f1..346322166 100644 --- a/chrome/chrome_exe.gypi +++ b/chrome/chrome_exe.gypi
@@ -558,6 +558,7 @@ '../crypto/crypto.gyp:crypto_nacl_win64', '../ipc/ipc.gyp:ipc_win64', '../sandbox/sandbox.gyp:sandbox_win64', + '../third_party/kasko/kasko.gyp:kasko_features', ], 'defines': [ '<@(nacl_win64_defines)',
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 7da5fb0..6f3aa4a1 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi
@@ -1001,6 +1001,7 @@ 'test/data/webui/settings/settings_page_browsertest.js', 'test/data/webui/settings/settings_passwords_section_browsertest.js', 'test/data/webui/settings/settings_subpage_browsertest.js', + 'test/data/webui/webui_resource_async_browsertest.js', ], # TODO(rockot) bug 505926: These should be moved to a target in # //extensions but have old dependencies on chrome files. The chrome
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi index d474576..bd2b255 100644 --- a/chrome/chrome_tests_unit.gypi +++ b/chrome/chrome_tests_unit.gypi
@@ -2552,6 +2552,7 @@ '../ash/ash_resources.gyp:ash_resources', '../chromeos/ime/input_method.gyp:gencode', '../components/components.gyp:drive_test_support', + '../components/components.gyp:drive_test_support_chromeos', '../ui/chromeos/ui_chromeos.gyp:ui_chromeos_resources', ], 'sources!': [
diff --git a/chrome/chrome_web_ui_mojo_bindings.gyp b/chrome/chrome_web_ui_mojo_bindings.gyp index aaf67baa..7e2842a 100644 --- a/chrome/chrome_web_ui_mojo_bindings.gyp +++ b/chrome/chrome_web_ui_mojo_bindings.gyp
@@ -14,6 +14,8 @@ 'browser/ui/webui/engagement/site_engagement.mojom', # GN version: //chrome/browser/ui/webui/omnibox:mojo_bindings 'browser/ui/webui/omnibox/omnibox.mojom', + # GN version: //chrome/browser/ui/webui/plugins:mojo_bindings + 'browser/ui/webui/plugins/plugins.mojom', ], 'includes': [ '../third_party/mojo/mojom_bindings_generator.gypi' ], },
diff --git a/chrome/common/chrome_content_client.cc b/chrome/common/chrome_content_client.cc index 50064fb5..a956d00c 100644 --- a/chrome/common/chrome_content_client.cc +++ b/chrome/common/chrome_content_client.cc
@@ -470,9 +470,9 @@ Version version_x(x->version); Version version_y(y->version); DCHECK(version_x.IsValid() && version_y.IsValid()); - if (version_x.Equals(version_y)) + if (version_x == version_y) return !x->is_debug && y->is_debug; - return version_x.IsOlderThan(y->version); + return version_x < version_y; }); return it != plugins.end() ? *it : nullptr; }
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index 1b9d6644..01473155 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc
@@ -545,6 +545,9 @@ // instant-extended-api, where thumbnails are generally smaller. const char kEnableThumbnailRetargeting[] = "enable-thumbnail-retargeting"; +// Enables token binding (draft-ietf-tokbind-protocol-02). +const char kEnableTokenBinding[] = "enable-token-binding"; + // Enables Alternate-Protocol when the port is user controlled (> 1024). const char kEnableUserAlternateProtocolPorts[] = "enable-user-controlled-alternate-protocol-ports";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index 71aac50..b98abe4 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h
@@ -155,6 +155,7 @@ extern const char kEnableSupervisedUserManagedBookmarksFolder[]; extern const char kEnableTabAudioMuting[]; extern const char kEnableThumbnailRetargeting[]; +extern const char kEnableTokenBinding[]; extern const char kEnableUserAlternateProtocolPorts[]; extern const char kEnableWebAppFrame[]; extern const char kEnableWebNotificationCustomLayouts[];
diff --git a/chrome/common/extensions/extension_unittest.cc b/chrome/common/extensions/extension_unittest.cc index eb5d088..57d7d6bc 100644 --- a/chrome/common/extensions/extension_unittest.cc +++ b/chrome/common/extensions/extension_unittest.cc
@@ -245,69 +245,69 @@ extension = LoadManifest("permissions", "permissions_all_urls.json"); EXPECT_TRUE(extension->wants_file_access()); EXPECT_FALSE(extension->permissions_data()->CanAccessPage( - extension.get(), file_url, -1, -1, NULL)); + extension.get(), file_url, -1, nullptr)); extension = LoadManifest( "permissions", "permissions_all_urls.json", Extension::ALLOW_FILE_ACCESS); EXPECT_TRUE(extension->wants_file_access()); EXPECT_TRUE(extension->permissions_data()->CanAccessPage( - extension.get(), file_url, -1, -1, NULL)); + extension.get(), file_url, -1, nullptr)); // file:///* permission extension = LoadManifest("permissions", "permissions_file_scheme.json"); EXPECT_TRUE(extension->wants_file_access()); EXPECT_FALSE(extension->permissions_data()->CanAccessPage( - extension.get(), file_url, -1, -1, NULL)); + extension.get(), file_url, -1, nullptr)); extension = LoadManifest("permissions", "permissions_file_scheme.json", Extension::ALLOW_FILE_ACCESS); EXPECT_TRUE(extension->wants_file_access()); EXPECT_TRUE(extension->permissions_data()->CanAccessPage( - extension.get(), file_url, -1, -1, NULL)); + extension.get(), file_url, -1, nullptr)); // http://* permission extension = LoadManifest("permissions", "permissions_http_scheme.json"); EXPECT_FALSE(extension->wants_file_access()); EXPECT_FALSE(extension->permissions_data()->CanAccessPage( - extension.get(), file_url, -1, -1, NULL)); + extension.get(), file_url, -1, nullptr)); extension = LoadManifest("permissions", "permissions_http_scheme.json", Extension::ALLOW_FILE_ACCESS); EXPECT_FALSE(extension->wants_file_access()); EXPECT_FALSE(extension->permissions_data()->CanAccessPage( - extension.get(), file_url, -1, -1, NULL)); + extension.get(), file_url, -1, nullptr)); // <all_urls> content script match extension = LoadManifest("permissions", "content_script_all_urls.json"); EXPECT_TRUE(extension->wants_file_access()); EXPECT_FALSE(extension->permissions_data()->CanRunContentScriptOnPage( - extension.get(), file_url, -1, -1, NULL)); + extension.get(), file_url, -1, nullptr)); extension = LoadManifest("permissions", "content_script_all_urls.json", Extension::ALLOW_FILE_ACCESS); EXPECT_TRUE(extension->wants_file_access()); EXPECT_TRUE(extension->permissions_data()->CanRunContentScriptOnPage( - extension.get(), file_url, -1, -1, NULL)); + extension.get(), file_url, -1, nullptr)); // file:///* content script match extension = LoadManifest("permissions", "content_script_file_scheme.json"); EXPECT_TRUE(extension->wants_file_access()); EXPECT_FALSE(extension->permissions_data()->CanRunContentScriptOnPage( - extension.get(), file_url, -1, -1, NULL)); + extension.get(), file_url, -1, nullptr)); extension = LoadManifest("permissions", "content_script_file_scheme.json", Extension::ALLOW_FILE_ACCESS); EXPECT_TRUE(extension->wants_file_access()); EXPECT_TRUE(extension->permissions_data()->CanRunContentScriptOnPage( - extension.get(), file_url, -1, -1, NULL)); + extension.get(), file_url, -1, nullptr)); // http://* content script match extension = LoadManifest("permissions", "content_script_http_scheme.json"); EXPECT_FALSE(extension->wants_file_access()); EXPECT_FALSE(extension->permissions_data()->CanRunContentScriptOnPage( - extension.get(), file_url, -1, -1, NULL)); + extension.get(), file_url, -1, nullptr)); extension = LoadManifest("permissions", "content_script_http_scheme.json", Extension::ALLOW_FILE_ACCESS); EXPECT_FALSE(extension->wants_file_access()); EXPECT_FALSE(extension->permissions_data()->CanRunContentScriptOnPage( - extension.get(), file_url, -1, -1, NULL)); + extension.get(), file_url, -1, nullptr)); } TEST(ExtensionTest, ExtraFlags) {
diff --git a/chrome/common/extensions/manifest_tests/extension_manifests_chromepermission_unittest.cc b/chrome/common/extensions/manifest_tests/extension_manifests_chromepermission_unittest.cc index 8cc795b..00ca695 100644 --- a/chrome/common/extensions/manifest_tests/extension_manifests_chromepermission_unittest.cc +++ b/chrome/common/extensions/manifest_tests/extension_manifests_chromepermission_unittest.cc
@@ -37,7 +37,8 @@ EXPECT_EQ("", error); const GURL newtab_url(chrome::kChromeUINewTabURL); EXPECT_TRUE(extension->permissions_data()->CanAccessPage( - extension.get(), newtab_url, 0, -1, &error)) << error; + extension.get(), newtab_url, 0, &error)) + << error; } TEST_F(ChromePermissionManifestTest,
diff --git a/chrome/common/extensions/permissions/permissions_data_unittest.cc b/chrome/common/extensions/permissions/permissions_data_unittest.cc index 22ac1e8..f2fe4a6 100644 --- a/chrome/common/extensions/permissions/permissions_data_unittest.cc +++ b/chrome/common/extensions/permissions/permissions_data_unittest.cc
@@ -415,13 +415,13 @@ } bool AllowedScript(const Extension* extension, const GURL& url, int tab_id) { - return extension->permissions_data()->CanAccessPage( - extension, url, tab_id, -1, NULL); + return extension->permissions_data()->CanAccessPage(extension, url, tab_id, + nullptr); } bool BlockedScript(const Extension* extension, const GURL& url) { - return !extension->permissions_data()->CanAccessPage( - extension, url, -1, -1, NULL); + return !extension->permissions_data()->CanAccessPage(extension, url, -1, + nullptr); } bool Allowed(const Extension* extension, const GURL& url) { @@ -429,8 +429,8 @@ } bool Allowed(const Extension* extension, const GURL& url, int tab_id) { - return (extension->permissions_data()->CanAccessPage( - extension, url, tab_id, -1, NULL) && + return (extension->permissions_data()->CanAccessPage(extension, url, tab_id, + nullptr) && extension->permissions_data()->CanCaptureVisiblePage(tab_id, NULL)); } @@ -439,9 +439,10 @@ } bool CaptureOnly(const Extension* extension, const GURL& url, int tab_id) { - return !extension->permissions_data()->CanAccessPage( - extension, url, tab_id, -1, NULL) && - extension->permissions_data()->CanCaptureVisiblePage(tab_id, NULL); + return !extension->permissions_data()->CanAccessPage(extension, url, tab_id, + nullptr) && + extension->permissions_data()->CanCaptureVisiblePage(tab_id, + nullptr); } bool ScriptOnly(const Extension* extension, const GURL& url) { @@ -450,7 +451,8 @@ bool ScriptOnly(const Extension* extension, const GURL& url, int tab_id) { return AllowedScript(extension, url, tab_id) && - !extension->permissions_data()->CanCaptureVisiblePage(tab_id, NULL); + !extension->permissions_data()->CanCaptureVisiblePage(tab_id, + nullptr); } bool Blocked(const Extension* extension, const GURL& url) { @@ -458,10 +460,10 @@ } bool Blocked(const Extension* extension, const GURL& url, int tab_id) { - return !(extension->permissions_data()->CanAccessPage( - extension, url, tab_id, -1, NULL) || - extension->permissions_data()->CanCaptureVisiblePage(tab_id, - NULL)); + return !extension->permissions_data()->CanAccessPage(extension, url, tab_id, + nullptr) && + !extension->permissions_data()->CanCaptureVisiblePage(tab_id, + nullptr); } bool ScriptAllowedExclusivelyOnTab(
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index 30030244d..a9f60db6b 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc
@@ -2162,6 +2162,15 @@ #endif #if defined(ENABLE_MEDIA_ROUTER) +#if defined(GOOGLE_CHROME_BUILD) +// Whether or not the user has explicitly set the cloud services preference +// through the first run flow. +const char kMediaRouterCloudServicesPrefSet[] = + "media_router.cloudservices.prefset"; +// Whether or not the user has enabled cloud services with Media Router. +const char kMediaRouterEnableCloudServices[] = + "media_router.cloudservices.enabled"; +#endif // defined(GOOGLE_CHROME_BUILD) // Whether or not the Media Router first run flow has been acknowledged by the // user. const char kMediaRouterFirstRunFlowAcknowledged[] =
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 837d581..710cdcdf 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -796,6 +796,10 @@ #endif #if defined(ENABLE_MEDIA_ROUTER) +#if defined(GOOGLE_CHROME_BUILD) +extern const char kMediaRouterCloudServicesPrefSet[]; +extern const char kMediaRouterEnableCloudServices[]; +#endif // defined(GOOGLE_CHROME_BUILD) extern const char kMediaRouterFirstRunFlowAcknowledged[]; #endif
diff --git a/chrome/installer/setup/install.cc b/chrome/installer/setup/install.cc index 21855fe6..a8660d36 100644 --- a/chrome/installer/setup/install.cc +++ b/chrome/installer/setup/install.cc
@@ -211,7 +211,7 @@ installer_state.UpdateStage(installer::ROLLINGBACK); installer::InstallStatus result = base::PathExists(new_chrome_exe) && current_version->get() && - new_version.Equals(*current_version->get()) ? + new_version == *current_version->get() ? installer::SAME_VERSION_REPAIR_FAILED : installer::INSTALL_FAILED; LOG(ERROR) << "Install failed, rolling back... result: " << result; @@ -225,28 +225,28 @@ installer::RefreshElevationPolicy(); if (!current_version->get()) { - VLOG(1) << "First install of version " << new_version.GetString(); + VLOG(1) << "First install of version " << new_version; return installer::FIRST_INSTALL_SUCCESS; } - if (new_version.Equals(**current_version)) { - VLOG(1) << "Install repaired of version " << new_version.GetString(); + if (new_version == **current_version) { + VLOG(1) << "Install repaired of version " << new_version; return installer::INSTALL_REPAIRED; } - if (new_version.CompareTo(**current_version) > 0) { + if (new_version > **current_version) { if (base::PathExists(new_chrome_exe)) { - VLOG(1) << "Version updated to " << new_version.GetString() - << " while running " << (*current_version)->GetString(); + VLOG(1) << "Version updated to " << new_version + << " while running " << **current_version; return installer::IN_USE_UPDATED; } - VLOG(1) << "Version updated to " << new_version.GetString(); + VLOG(1) << "Version updated to " << new_version; return installer::NEW_VERSION_UPDATED; } LOG(ERROR) << "Not sure how we got here while updating" - << ", new version: " << new_version.GetString() - << ", old version: " << (*current_version)->GetString(); + << ", new version: " << new_version + << ", old version: " << **current_version; return installer::INSTALL_FAILED; }
diff --git a/chrome/installer/setup/install_worker.cc b/chrome/installer/setup/install_worker.cc index 5217bc9a..5878c004 100644 --- a/chrome/installer/setup/install_worker.cc +++ b/chrome/installer/setup/install_worker.cc
@@ -365,7 +365,7 @@ // Note that we pass true for check_duplicates to avoid failing on in-use // repair runs if the current_version is the same as the new_version. bool check_for_duplicates = (current_version && - current_version->Equals(new_version)); + *current_version == new_version); install_list->AddMoveTreeWorkItem( src_path.AppendASCII(new_version.GetString()).value(), target_path.AppendASCII(new_version.GetString()).value(),
diff --git a/chrome/installer/test/alternate_version_generator.cc b/chrome/installer/test/alternate_version_generator.cc index bf492c4..c0ec333 100644 --- a/chrome/installer/test/alternate_version_generator.cc +++ b/chrome/installer/test/alternate_version_generator.cc
@@ -43,6 +43,7 @@ #include "base/path_service.h" #include "base/process/launch.h" #include "base/process/process_handle.h" +#include "base/strings/string16.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/version.h" @@ -60,7 +61,8 @@ const wchar_t kB7[] = L"B7"; const wchar_t kBl[] = L"BL"; const wchar_t kChromeBin[] = L"Chrome-bin"; -const wchar_t kChromePacked7z[] = L"chrome.packed.7z"; +const wchar_t kChromePacked7z[] = L"CHROME.PACKED.7Z"; +const wchar_t kChrome7z[] = L"CHROME.7Z"; const wchar_t kExe[] = L"exe"; const wchar_t kExpandExe[] = L"expand.exe"; const wchar_t kExtDll[] = L".dll"; @@ -130,6 +132,8 @@ ULONGLONG value() const { return version_; } void set_value(ULONGLONG value) { version_ = value; } std::wstring ToString() const; + std::string ToASCII() const; + private: ULONGLONG version_; }; // class ChromeVersion @@ -144,6 +148,14 @@ return std::wstring(&buffer[0], string_len); } +std::string ChromeVersion::ToASCII() const { + char buffer[24]; + int string_len = sprintf_s(&buffer[0], arraysize(buffer), "%hu.%hu.%hu.%hu", + major(), minor(), build(), patch()); + DCHECK_NE(-1, string_len); + DCHECK_GT(static_cast<int>(arraysize(buffer)), string_len); + return std::string(&buffer[0], string_len); +} // A read/write mapping of a file. // Note: base::MemoryMappedFile is not used because it doesn't support @@ -166,16 +178,10 @@ }; // class MappedFile MappedFile::~MappedFile() { - if (view_ != NULL) { - if (UnmapViewOfFile(view_) == 0) { - PLOG(DFATAL) << "MappedFile failed to unmap view."; - } - } - if (mapping_ != NULL) { - if (CloseHandle(mapping_) == 0) { - PLOG(DFATAL) << "Could not close file mapping handle."; - } - } + if (view_ && !UnmapViewOfFile(view_)) + PLOG(DFATAL) << "MappedFile failed to unmap view."; + if (mapping_ && !CloseHandle(mapping_)) + PLOG(DFATAL) << "Could not close file mapping handle."; } bool MappedFile::Initialize(base::File file) { @@ -191,11 +197,10 @@ if (mapping_ != NULL) { view_ = MapViewOfFile(mapping_, FILE_MAP_WRITE, 0, 0, static_cast<size_t>(file_info.size)); - if (view_ != NULL) { + if (view_) result = true; - } else { + else PLOG(DFATAL) << "MapViewOfFile failed"; - } } else { PLOG(DFATAL) << "CreateFileMapping failed"; } @@ -275,9 +280,8 @@ return GetFileVersion(work_dir.Append(&kSetupExe[0]), version); } - -// Replace all occurrences in the sequence [|dest_first|, |dest_last) that -// equals [|src_first|, |src_last) with the sequence at |replacement_first| of +// Replace all occurrences in the sequence [|dest_first|, |dest_last|) that +// equals [|src_first|, |src_last|) with the sequence at |replacement_first| of // the same length. Returns true on success. If non-NULL, |replacements_made| // is set to true/false accordingly. bool ReplaceAll(uint8_t* dest_first, @@ -290,9 +294,8 @@ bool changed = false; do { dest_first = std::search(dest_first, dest_last, src_first, src_last); - if (dest_first == dest_last) { + if (dest_first == dest_last) break; - } changed = true; if (memcpy_s(dest_first, dest_last - dest_first, replacement_first, src_last - src_first) != 0) { @@ -302,9 +305,8 @@ dest_first += (src_last - src_first); } while (true); - if (replacements_made != NULL) { + if (replacements_made != NULL) *replacements_made = changed; - } return result; } @@ -320,6 +322,7 @@ // Replaces the old version with the new in a resource. A first pass is made to // replace the string form (e.g., "9.0.584.0"). If any replacements are made, a // second pass is made to replace the binary form (e.g., 0x0000024800000009). +// A final pass is made to replace the ASCII string form. void VisitResource(const upgrade_test::EntryPath& path, uint8_t* data, DWORD size, @@ -337,7 +340,7 @@ reinterpret_cast<const uint8_t*>(ctx.new_version_str.c_str()), &changing_version) && changing_version) { - // Replace all occurrences of current_version with new_version + // Replace all binary occurrences of current_version with new_version. struct VersionPair { DWORD high; DWORD low; @@ -352,6 +355,14 @@ reinterpret_cast<const uint8_t*>(&cur_ver) + sizeof(cur_ver), reinterpret_cast<const uint8_t*>(&new_ver), NULL); } + + // Replace all ASCII occurrences of current_version with new_version. + std::string current_version(ctx.current_version.ToASCII()); + std::string new_version(ctx.new_version.ToASCII()); + ReplaceAll( + data, data + size, reinterpret_cast<uint8_t*>(¤t_version[0]), + reinterpret_cast<uint8_t*>(¤t_version[current_version.size()]), + reinterpret_cast<uint8_t*>(&new_version[0]), NULL); } // Updates the version strings and numbers in all of |image_file|'s resources. @@ -398,6 +409,26 @@ return result; } +bool UpdateManifestVersion(const base::FilePath& manifest, + VisitResourceContext* context) { + std::string contents; + if (!base::ReadFileToString(manifest, &contents)) + return false; + std::string old_version(context->current_version.ToASCII()); + std::string new_version(context->new_version.ToASCII()); + bool modified = false; + if (!ReplaceAll(reinterpret_cast<uint8_t*>(&contents[0]), + reinterpret_cast<uint8_t*>(&contents[contents.size()]), + reinterpret_cast<uint8_t*>(&old_version[0]), + reinterpret_cast<uint8_t*>(&old_version[old_version.size()]), + reinterpret_cast<uint8_t*>(&new_version[0]), &modified)) { + return false; + } + DCHECK(modified); + return base::WriteFile(manifest, &contents[0], contents.size()) == + contents.size(); +} + bool IncrementNewVersion(upgrade_test::Direction direction, VisitResourceContext* ctx) { DCHECK(ctx); @@ -421,50 +452,60 @@ // Raises or lowers the version of all .exe and .dll files in |work_dir| as well // as the |work-dir|\Chrome-bin\w.x.y.z directory. |original_version| and -// |new_version|, when non-NULL, are given the original and new version numbers +// |new_version|, when non-null, are given the original and new version numbers // on success. bool ApplyAlternateVersion(const base::FilePath& work_dir, upgrade_test::Direction direction, std::wstring* original_version, std::wstring* new_version) { VisitResourceContext ctx; - if (!GetSetupExeVersion(work_dir, &ctx.current_version)) { + if (!GetSetupExeVersion(work_dir, &ctx.current_version)) return false; - } ctx.current_version_str = ctx.current_version.ToString(); - if (!IncrementNewVersion(direction, &ctx)) { + if (!IncrementNewVersion(direction, &ctx)) return false; - } // Modify all .dll and .exe files with the current version. - bool doing_great = true; base::FileEnumerator all_files(work_dir, true, base::FileEnumerator::FILES); - do { + while (true) { base::FilePath file = all_files.Next(); - if (file.empty()) { + if (file.empty()) break; - } std::wstring extension = file.Extension(); - if (extension == &kExtExe[0] || extension == &kExtDll[0]) { - doing_great = UpdateVersionIfMatch(file, &ctx); + if ((extension == &kExtExe[0] || extension == &kExtDll[0]) && + !UpdateVersionIfMatch(file, &ctx)) { + return false; } - } while (doing_great); + } // Change the versioned directory. base::FilePath chrome_bin = work_dir.Append(&kChromeBin[0]); - doing_great = base::Move(chrome_bin.Append(ctx.current_version_str), - chrome_bin.Append(ctx.new_version_str)); - - if (doing_great) { - // Report the version numbers if requested. - if (original_version != NULL) - original_version->assign(ctx.current_version_str); - if (new_version != NULL) - new_version->assign(ctx.new_version_str); + if (!base::Move(chrome_bin.Append(ctx.current_version_str), + chrome_bin.Append(ctx.new_version_str))) { + return false; } - return doing_great; + // Update the manifest (revise post-XP; see https://crbug.com/581133). + base::FilePath current_manifest = + chrome_bin.Append(ctx.new_version_str) + .Append(ctx.current_version_str + L".manifest"); + if (base::PathExists(current_manifest)) { + base::FilePath new_manifest = + current_manifest.DirName().Append(ctx.new_version_str + L".manifest"); + if (!base::Move(current_manifest, new_manifest) || + !UpdateManifestVersion(new_manifest, &ctx)) { + return false; + } + } + + // Report the version numbers if requested. + if (original_version) + original_version->assign(ctx.current_version_str); + if (new_version) + new_version->assign(ctx.new_version_str); + + return true; } // Returns the path to the directory holding the 7za executable. By default, it @@ -537,8 +578,10 @@ } base::FilePath setup_ex_ = work_dir.directory().Append(&kSetupEx_[0]); - base::FilePath chrome_packed_7z = - work_dir.directory().Append(&kChromePacked7z[0]); + base::FilePath chrome_packed_7z; // Empty for component builds. + base::FilePath chrome_7z; + const wchar_t* archive_resource_name = nullptr; + base::FilePath* archive_file = nullptr; // Load the original file and extract setup.ex_ and chrome.packed.7z { ResourceLoader resource_loader; @@ -559,15 +602,26 @@ return false; } - // Write out chrome.packed.7z - if (!resource_loader.Load(&kChromePacked7z[0], &kB7[0], &resource_data)) + // Write out chrome.packed.7z (static build) or chrome.7z (component build) + if (resource_loader.Load(&kChromePacked7z[0], &kB7[0], &resource_data)) { + archive_resource_name = &kChromePacked7z[0]; + chrome_packed_7z = work_dir.directory().Append(archive_resource_name); + archive_file = &chrome_packed_7z; + } else if (resource_loader.Load(&kChrome7z[0], &kB7[0], &resource_data)) { + archive_resource_name = &kChrome7z[0]; + chrome_7z = work_dir.directory().Append(archive_resource_name); + archive_file = &chrome_7z; + } else { return false; - written = - base::WriteFile(chrome_packed_7z, - reinterpret_cast<const char*>(resource_data.first), - static_cast<int>(resource_data.second)); + } + DCHECK(archive_resource_name); + DCHECK(!chrome_packed_7z.empty() || !chrome_7z.empty()); + DCHECK(archive_file); + written = base::WriteFile( + *archive_file, reinterpret_cast<const char*>(resource_data.first), + static_cast<int>(resource_data.second)); if (written != static_cast<int>(resource_data.second)) { - LOG(DFATAL) << "Failed writing \"" << chrome_packed_7z.value() << "\""; + LOG(DFATAL) << "Failed writing \"" << archive_file->value() << "\""; return false; } } @@ -590,26 +644,30 @@ return false; } - // Unpack chrome.packed.7z - std::wstring chrome_7z_name; - if (LzmaUtil::UnPackArchive(chrome_packed_7z.value(), - work_dir.directory().value(), - &chrome_7z_name) != NO_ERROR) { - LOG(DFATAL) << "Failed unpacking \"" << chrome_packed_7z.value() << "\""; - return false; + // Unpack chrome.packed.7z (static build only). + if (!chrome_packed_7z.empty()) { + base::string16 chrome_7z_name; + if (LzmaUtil::UnPackArchive(chrome_packed_7z.value(), + work_dir.directory().value(), + &chrome_7z_name) != NO_ERROR) { + LOG(DFATAL) << "Failed unpacking \"" << chrome_packed_7z.value() << "\""; + return false; + } + chrome_7z = base::FilePath(chrome_7z_name); } + DCHECK(!chrome_7z.empty()); // Unpack chrome.7z - if (LzmaUtil::UnPackArchive(chrome_7z_name, work_dir.directory().value(), + if (LzmaUtil::UnPackArchive(chrome_7z.value(), work_dir.directory().value(), NULL) != NO_ERROR) { - LOG(DFATAL) << "Failed unpacking \"" << chrome_7z_name << "\""; + LOG(DFATAL) << "Failed unpacking \"" << chrome_7z.value() << "\""; return false; } // Get rid of intermediate files - base::FilePath chrome_7z(chrome_7z_name); if (!base::DeleteFile(chrome_7z, false) || - !base::DeleteFile(chrome_packed_7z, false) || + (!chrome_packed_7z.empty() && + !base::DeleteFile(chrome_packed_7z, false)) || !base::DeleteFile(setup_ex_, false)) { LOG(DFATAL) << "Failed deleting intermediate files"; return false; @@ -623,9 +681,11 @@ if (!CreateArchive(chrome_7z, work_dir.directory().Append(&kChromeBin[0]), 0)) return false; - // Compress chrome.7z into chrome.packed.7z - if (!CreateArchive(chrome_packed_7z, chrome_7z, 9)) + // Compress chrome.7z into chrome.packed.7z for static builds. + if (!chrome_packed_7z.empty() && + !CreateArchive(chrome_packed_7z, chrome_7z, 9)) { return false; + } // Compress setup.exe into setup.ex_ command_line.assign(1, L'"') @@ -641,16 +701,20 @@ return false; } - // Replace the mini_installer's setup.ex_ and chrome.packed.7z resources. + // Replace the mini_installer's setup.ex_ and chrome.packed.7z (or chrome.7z + // in component builds) resources. ResourceUpdater updater; if (!updater.Initialize(mini_installer) || !updater.Update(&kSetupEx_[0], &kBl[0], MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), setup_ex_) || - !updater.Update(&kChromePacked7z[0], &kB7[0], + !updater.Update(archive_resource_name, &kB7[0], MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), - chrome_packed_7z) || + *archive_file) || !updater.Commit()) { + LOG(ERROR) << "It is common for this step to fail for very large resources," + " as is the case for Debug component=shared_library builds. " + "Try with a Release or component=static_library build."; return false; }
diff --git a/chrome/installer/test/resource_updater.cc b/chrome/installer/test/resource_updater.cc index 933921c..3a2ba519 100644 --- a/chrome/installer/test/resource_updater.cc +++ b/chrome/installer/test/resource_updater.cc
@@ -48,7 +48,8 @@ static_cast<DWORD>(input.length())) != FALSE) { return true; } - PLOG(DFATAL) << "UpdateResource failed for resource \"" << name << "\""; + PLOG(ERROR) << "UpdateResource failed for resource \"" << name + << "\" of size " << input.length() << " bytes"; } else { PLOG(DFATAL) << "Failed mapping \"" << input_file.value() << "\""; }
diff --git a/chrome/installer/util/google_update_settings_unittest.cc b/chrome/installer/util/google_update_settings_unittest.cc index 2f229ae..6d411b62d 100644 --- a/chrome/installer/util/google_update_settings_unittest.cc +++ b/chrome/installer/util/google_update_settings_unittest.cc
@@ -1097,9 +1097,9 @@ TEST_P(GetGoogleUpdateVersion, TestRealValue) { RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE) .WriteValue(google_update::kRegGoogleUpdateVersion, kDummyVersion); - Version expected(base::UTF16ToUTF8(kDummyVersion)); - EXPECT_TRUE(expected.Equals( - GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_))); + base::Version expected(base::UTF16ToUTF8(kDummyVersion)); + EXPECT_EQ(expected, + GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_)); // Make sure that there's no value in the other level (user or system). EXPECT_FALSE( GoogleUpdateSettings::GetGoogleUpdateVersion(!system_install_)
diff --git a/chrome/installer/util/installer_state_unittest.cc b/chrome/installer/util/installer_state_unittest.cc index 99b5a7f..1ced49e 100644 --- a/chrome/installer/util/installer_state_unittest.cc +++ b/chrome/installer/util/installer_state_unittest.cc
@@ -378,7 +378,7 @@ Version found_version(*installer_state.GetCurrentVersion(machine_state)); EXPECT_TRUE(found_version.IsValid()); if (found_version.IsValid()) - EXPECT_TRUE(current_version.Equals(found_version)); + EXPECT_EQ(current_version, found_version); } } } @@ -745,7 +745,7 @@ TEST_F(InstallerStateCriticalVersionTest, CriticalBeforeOpv) { MockInstallerState& installer_state(Initialize(low_version_)); - EXPECT_TRUE(installer_state.critical_update_version().Equals(*low_version_)); + EXPECT_EQ(installer_state.critical_update_version(), *low_version_); // Unable to determine the installed version, so assume critical update. EXPECT_TRUE( installer_state.DetermineCriticalVersion(NULL, *pv_version_).IsValid()); @@ -764,7 +764,7 @@ TEST_F(InstallerStateCriticalVersionTest, CriticalEqualsOpv) { MockInstallerState& installer_state(Initialize(opv_version_)); - EXPECT_TRUE(installer_state.critical_update_version().Equals(*opv_version_)); + EXPECT_EQ(installer_state.critical_update_version(), *opv_version_); // Unable to determine the installed version, so assume critical update. EXPECT_TRUE( installer_state.DetermineCriticalVersion(NULL, *pv_version_).IsValid()); @@ -783,8 +783,7 @@ TEST_F(InstallerStateCriticalVersionTest, CriticalBetweenOpvAndPv) { MockInstallerState& installer_state(Initialize(middle_version_)); - EXPECT_TRUE(installer_state.critical_update_version().Equals( - *middle_version_)); + EXPECT_EQ(installer_state.critical_update_version(), *middle_version_); // Unable to determine the installed version, so assume critical update. EXPECT_TRUE( installer_state.DetermineCriticalVersion(NULL, *pv_version_).IsValid()); @@ -803,8 +802,7 @@ TEST_F(InstallerStateCriticalVersionTest, CriticalEqualsPv) { MockInstallerState& installer_state(Initialize(pv_version_)); - EXPECT_TRUE(installer_state.critical_update_version().Equals( - *pv_version_)); + EXPECT_EQ(installer_state.critical_update_version(), *pv_version_); // Unable to determine the installed version, so assume critical update. EXPECT_TRUE( installer_state.DetermineCriticalVersion(NULL, *pv_version_).IsValid()); @@ -823,8 +821,7 @@ TEST_F(InstallerStateCriticalVersionTest, CriticalAfterPv) { MockInstallerState& installer_state(Initialize(high_version_)); - EXPECT_TRUE(installer_state.critical_update_version().Equals( - *high_version_)); + EXPECT_EQ(installer_state.critical_update_version(), *high_version_); // Critical update newer than the new version. EXPECT_FALSE( installer_state.DetermineCriticalVersion(NULL, *pv_version_).IsValid());
diff --git a/chrome/installer/util/product_unittest.cc b/chrome/installer/util/product_unittest.cc index 9eeba10..82d89bb 100644 --- a/chrome/installer/util/product_unittest.cc +++ b/chrome/installer/util/product_unittest.cc
@@ -78,7 +78,7 @@ machine_state.GetProductState(system_level, distribution->GetType()); EXPECT_TRUE(chrome_state != NULL); if (chrome_state != NULL) { - EXPECT_TRUE(chrome_state->version().Equals(current_version)); + EXPECT_EQ(chrome_state->version(), current_version); EXPECT_FALSE(chrome_state->is_msi()); }
diff --git a/chrome/renderer/extensions/renderer_permissions_policy_delegate.cc b/chrome/renderer/extensions/renderer_permissions_policy_delegate.cc index 11f92be..240da30 100644 --- a/chrome/renderer/extensions/renderer_permissions_policy_delegate.cc +++ b/chrome/renderer/extensions/renderer_permissions_policy_delegate.cc
@@ -27,7 +27,6 @@ const Extension* extension, const GURL& document_url, int tab_id, - int process_id, std::string* error) { if (PermissionsData::CanExecuteScriptEverywhere(extension)) return true;
diff --git a/chrome/renderer/extensions/renderer_permissions_policy_delegate.h b/chrome/renderer/extensions/renderer_permissions_policy_delegate.h index 3c82509..24587f1 100644 --- a/chrome/renderer/extensions/renderer_permissions_policy_delegate.h +++ b/chrome/renderer/extensions/renderer_permissions_policy_delegate.h
@@ -22,7 +22,6 @@ bool CanExecuteScriptOnPage(const Extension* extension, const GURL& document_url, int tab_id, - int process_id, std::string* error) override; private:
diff --git a/chrome/renderer/extensions/renderer_permissions_policy_delegate_unittest.cc b/chrome/renderer/extensions/renderer_permissions_policy_delegate_unittest.cc index e3906071..1aa453c 100644 --- a/chrome/renderer/extensions/renderer_permissions_policy_delegate_unittest.cc +++ b/chrome/renderer/extensions/renderer_permissions_policy_delegate_unittest.cc
@@ -70,8 +70,9 @@ scoped_refptr<const Extension> extension(CreateTestExtension("a")); std::string error; - EXPECT_TRUE(extension->permissions_data()->CanAccessPage( - extension.get(), kAnyUrl, -1, -1, &error)) << error; + EXPECT_TRUE(extension->permissions_data()->CanAccessPage(extension.get(), + kAnyUrl, -1, &error)) + << error; // Pretend we are in the webstore process. We should not be able to execute // script. @@ -80,7 +81,7 @@ RendererExtensionRegistry::Get()->Insert(webstore_extension.get()); extension_dispatcher_->OnActivateExtension(extensions::kWebStoreAppId); EXPECT_FALSE(extension->permissions_data()->CanAccessPage( - extension.get(), kAnyUrl, -1, -1, &error)) + extension.get(), kAnyUrl, -1, &error)) << error; }
diff --git a/chrome/renderer/media/chrome_key_systems.cc b/chrome/renderer/media/chrome_key_systems.cc index 5042cf1..0a855299 100644 --- a/chrome/renderer/media/chrome_key_systems.cc +++ b/chrome/renderer/media/chrome_key_systems.cc
@@ -153,7 +153,7 @@ #if defined(WIDEVINE_CDM_MIN_GLIBC_VERSION) Version glibc_version(gnu_get_libc_version()); DCHECK(glibc_version.IsValid()); - if (glibc_version.IsOlderThan(WIDEVINE_CDM_MIN_GLIBC_VERSION)) + if (glibc_version < base::Version(WIDEVINE_CDM_MIN_GLIBC_VERSION)) return; #endif // defined(WIDEVINE_CDM_MIN_GLIBC_VERSION)
diff --git a/chrome/test/chromedriver/VERSION b/chrome/test/chromedriver/VERSION index a4b5a6f4a..2ef40bd 100644 --- a/chrome/test/chromedriver/VERSION +++ b/chrome/test/chromedriver/VERSION
@@ -1 +1 @@ -2.20 +2.21
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py index 7d031b8..6b1e691 100755 --- a/chrome/test/chromedriver/test/run_py_tests.py +++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -146,6 +146,8 @@ _ANDROID_NEGATIVE_FILTER['chromium'] = ( _ANDROID_NEGATIVE_FILTER['chrome'] + [ 'ChromeDriverTest.testSwitchToWindow', + # https://crbug.com/579782 + 'ChromeDriverTest.testTouchLongPressElement', ] ) _ANDROID_NEGATIVE_FILTER['chromedriver_webview_shell'] = (
diff --git a/chrome/test/data/autofill/heuristics/input/bug_497850.html b/chrome/test/data/autofill/heuristics/input/bug_497850.html new file mode 100644 index 0000000..a49d730 --- /dev/null +++ b/chrome/test/data/autofill/heuristics/input/bug_497850.html
@@ -0,0 +1,197 @@ +<form method="post" action="/ssl/us/processpages/resmake/" id="aspnetForm"> + + <div class="headertopcontentresponsive"> + +<ul> + <li> + + </li> + <li class="homelink"> + <a href="/us/" title="Home">Home</a> + </li> +</ul> + + </div> + + <table class="pagelayouttable" cellspacing="0" cellpadding="0"> + <tbody><tr> + <td class="layoutcellwide"> + + <table class="layouttable" cellspacing="0" cellpadding="0"> + <tbody><tr> + <td class="layoutcell"> + +<table cellpadding="0" cellspacing="0" border="0" class="layouttable"> + <tbody><tr> + <td class="layoutcell"> + <div class="pagetitlebox"> + <h1> + Confirm reservation + </h1> + </div> + </td> + <td align="right" class="layoutcell"> + <table cellpadding="0" cellspacing="0" border="0"><tbody><tr><td class="progressbarpast"> </td><td class="progressbarpast"> </td><td class="progressbarpast"> </td><td class="progressbarpast"> </td><td class="progressbarfuture"> </td></tr> +<tr><td class="progresslabelpast" nowrap="nowrap"> 1. Passengers </td><td class="progresslabelpast" nowrap="nowrap"> 2. Seating </td><td class="progresslabelpast" nowrap="nowrap"> 3. Additional </td><td colspan="2" class="progresslabelpresent" nowrap="nowrap"> 4. Payment </td></tr></tbody></table> + </td> + </tr> +</tbody></table> +<div class="contentbox"> + <table class="layouttable" cellpadding="0" cellspacing="0"> + <tbody><tr> + <td class="maincontentbox"> + <div style="display:inline" id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_upnlMsg"> + +</div> + <div class="sectioncontainer"> + + <div class="sectionbox"> + <div class="headerbox"> + Payment information + </div> + <div class="subheaderbox"> + It is safe to pay by credit card. <a href="#" onclick="InfoWindow = window.open('/us/infourl/infoidnorwegiansecurity/', 'InfoWindow', 'width=700,height=750,resizable=1,scrollbars=1,location=0,menubar=0,status=0,toolbar=0'); InfoWindow.focus(); return false;">Read more >></a> + </div> + <div class="body"> + <div id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_pnlPaymentBox" class="paymentbox"> + + <div id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_upnlPaymentBox"> + + <a id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_lbtPostBackFaker" class="HiddenControl" href="javascript:__doPostBack('ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$lbtPostBackFaker','')"></a> + + <div id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_contentPayNow" class="bodybox"> + <div id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_innerContentPayNow"> + <table border="0" cellspacing="0" cellpadding="0" class="layouttable"> + <tbody> + <tr> + <td colspan="3"> + <div id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_pnlTotalFare"> + + <div class="para"> + Total price (incl. taxes and charges): 759.70 USD</div> + <div class="separator"> + </div> + + </div> + + </td> + </tr> + + <tr> + <td> + <div class="formlistitem"> + <span id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_lblCcType" class="formlabel">Card type</span><br> + <div id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_upnlPaymentType"> + + <select name="ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$ddlCcType" onchange="javascript:setTimeout('__doPostBack(\'ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$ddlCcType\',\'\')', 0)" id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_ddlCcType" class="select"> + <option selected="selected" value="">- Choose -</option> + <option value="AX">Amex (no surcharge)</option> + <option value="DC">Diners (no surcharge)</option> + <option value="CA">Mastercard/Eurocard (no surcharge)</option> + <option value="VI">Visa (no surcharge)</option> + + </select> + + </div> + </div> + </td> + <td colspan="2"> + <div class="formlistitem"> + <span id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_lblCcNumber" class="formlabel">Card number</span><br> + <input name="ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$txtCcNumber" type="text" id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_txtCcNumber" class="textbox" autocomplete="off"> + </div> + </td> + </tr> + <tr> + <td> + <div class="formlistitem"> + <span id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_lblCcHolder" class="formlabel">Card holder name</span><br> + <input name="ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$txtCcHolder" type="text" id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_txtCcHolder" class="textbox" autocomplete="off"> + </div> + </td> + <td> + <div class="formlistitem"> + <span id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_lblCcExpiry" class="formlabel">Expiry date</span><br> + <select name="ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$ddlCcExpiryMonth" id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_ddlCcExpiryMonth" class="selectmonth"> + <option value="MM">MM</option> + <option value="01">01</option> + <option value="02">02</option> + <option value="03">03</option> + <option value="04">04</option> + <option value="05">05</option> + <option value="06">06</option> + <option value="07">07</option> + <option value="08">08</option> + <option value="09">09</option> + <option value="10">10</option> + <option value="11">11</option> + <option value="12">12</option> + + </select> + <select name="ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$ddlCcExpiryYear" id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_ddlCcExpiryYear" class="selectyear"> + <option value="YYYY">YYYY</option> + <option value="2016">2016</option> + <option value="2017">2017</option> + <option value="2018">2018</option> + <option value="2019">2019</option> + <option value="2020">2020</option> + <option value="2021">2021</option> + <option value="2022">2022</option> + <option value="2023">2023</option> + <option value="2024">2024</option> + <option value="2025">2025</option> + <option value="2026">2026</option> + <option value="2027">2027</option> + <option value="2028">2028</option> + <option value="2029">2029</option> + <option value="2030">2030</option> + + </select> + </div> + </td> + <td> + <div id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_upnlCvc"> + + <div id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_pnlCcCvc" class="formlistitem"> + + <span id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_lblCcCvc" class="formlabel">Verification Code (CVC)</span><br> + <input name="ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$txtCcCvc" type="text" maxlength="4" id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_txtCcCvc" class="textboxcvc" autocomplete="off"> <a href="#" onclick="InfoWindow = window.open('/us/infourl/infoidnorwegiancvcinfo/', 'InfoWindow', 'width=600,height=750,resizable=1,scrollbars=1,location=0,menubar=0,status=0,toolbar=0'); InfoWindow.focus(); return false;">What is CVC? >></a> + + </div> + + </div> + </td> + </tr> + + <tr> + <td colspan="3"> + + </td> + </tr> + + </tbody> + </table> + </div> + </div> + <input type="hidden" name="ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$hdnCpAmount" id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_hdnCpAmount"> + <input type="hidden" name="ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$hdnSelectedPaymentOption" id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcPayment_hdnSelectedPaymentOption" value="1"> + + </div> + +</div> + +<div class="buttonbarbox"> + <table class="buttonbartable" cellspacing="0" cellpadding="0" border="0"> + <tbody><tr> + <td valign="top"> + <a id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcButtonBar_lnkBack" class="buttonalternative" href="javascript:__doPostBack('ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcButtonBar$lnkBack','')">< Go back</a> + <a onclick="return NasCommon.ConfirmMessage('You are about to cancel. Is this intentional?');" id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcButtonBar_lnkCancel" class="buttoncancel" href="javascript:__doPostBack('ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcButtonBar$lnkCancel','')">Cancel</a> + </td> + <td valign="top" align="right"> + <a id="ctl01_ctl00_MainContentRegion_MainRegion_ctl00_ipcButtonBar_lnkContinue" class="button" href="javascript:__doPostBack('ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcButtonBar$lnkContinue','')">Confirm and pay</a> + </td> + </tr> + </tbody></table> +</div> + +</form>
diff --git a/chrome/test/data/autofill/heuristics/output/bug_497850.out b/chrome/test/data/autofill/heuristics/output/bug_497850.out new file mode 100644 index 0000000..130f32dd --- /dev/null +++ b/chrome/test/data/autofill/heuristics/output/bug_497850.out
@@ -0,0 +1,6 @@ +UNKNOWN_TYPE | ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$ddlCcType | Card type | | ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$ddlCcType_1-default +CREDIT_CARD_NUMBER | ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$txtCcNumber | Card number | | ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$ddlCcType_1-cc +CREDIT_CARD_NAME | ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$txtCcHolder | Card holder name | | ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$ddlCcType_1-cc +CREDIT_CARD_EXP_MONTH | ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$ddlCcExpiryMonth | Expiry date | MM | ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$ddlCcType_1-cc +CREDIT_CARD_EXP_4_DIGIT_YEAR | ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$ddlCcExpiryYear | Expiry date | YYYY | ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$ddlCcType_1-cc +CREDIT_CARD_VERIFICATION_CODE | ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$txtCcCvc | Verification Code (CVC) | | ctl01$ctl00$MainContentRegion$MainRegion$ctl00$ipcPayment$ddlCcType_1-cc
diff --git a/chrome/test/data/extensions/api_test/messaging/connect/page.js b/chrome/test/data/extensions/api_test/messaging/connect/page.js index bf122e7..eef9fc6 100644 --- a/chrome/test/data/extensions/api_test/messaging/connect/page.js +++ b/chrome/test/data/extensions/api_test/messaging/connect/page.js
@@ -40,7 +40,10 @@ chrome.test.assertFalse(chrome.runtime.onConnect.hasListeners()); testConnectChildFrameAndNavigateSetup(); } else if (msg.testDisconnectOnClose) { - window.location = "about:blank"; + chrome.runtime.connect().onMessage.addListener(function(msg) { + chrome.test.assertEq('unloadTabContent', msg); + window.location = 'about:blank'; + }); } else if (msg.testPortName) { port.postMessage({portName:port.name}); } else if (msg.testSendMessageFromTabError) {
diff --git a/chrome/test/data/extensions/api_test/messaging/connect/test.js b/chrome/test/data/extensions/api_test/messaging/connect/test.js index 356f3d69..6956e82 100644 --- a/chrome/test/data/extensions/api_test/messaging/connect/test.js +++ b/chrome/test/data/extensions/api_test/messaging/connect/test.js
@@ -275,8 +275,26 @@ .postMessage({testConnectChildFrameAndNavigateSetup: true}); }, + // The previous test removed the onConnect listener. Add it back. + function reloadTabForTest() { + var doneListening = listenForever(chrome.tabs.onUpdated, + function(tabId, info) { + if (tabId === testTab.id && info.status == 'complete') { + doneListening(); + } + }); + chrome.tabs.reload(testTab.id); + }, + // Tests that we get the disconnect event when the tab context closes. function disconnectOnClose() { + listenOnce(chrome.runtime.onConnect, function(portFromTab) { + listenOnce(portFromTab.onDisconnect, function() { + chrome.test.assertNoLastError(); + }); + portFromTab.postMessage('unloadTabContent'); + }); + var port = chrome.tabs.connect(testTab.id); port.postMessage({testDisconnectOnClose: true}); listenOnce(port.onDisconnect, function() {
diff --git a/chrome/test/data/save_page/frames-runtime-changes.htm b/chrome/test/data/save_page/frames-runtime-changes.htm index 897f15ac..78caad3 100644 --- a/chrome/test/data/save_page/frames-runtime-changes.htm +++ b/chrome/test/data/save_page/frames-runtime-changes.htm
@@ -8,7 +8,7 @@ } function onLoad() { - if (location.href.indexOf("do_runtime_changes") == (-1)) + if (location.href.indexOf("do_runtime_changes=1") == (-1)) return addNewMarker("subframe1", "21595339-61fc-4854-b6df-0668328ea263")
diff --git a/chrome/test/data/webui/cr_test.html b/chrome/test/data/webui/cr_test.html index b592cac..05a2c682 100644 --- a/chrome/test/data/webui/cr_test.html +++ b/chrome/test/data/webui/cr_test.html
@@ -243,7 +243,7 @@ assertEquals('object', typeof z, 'Should work after clearing for testing'); assertNotEqual(null, z, 'Created object should not be null'); - assertNotEqual(x, z, + assertNotEqual(x, z, 'Should return a different object after clearing for testing'); } @@ -264,70 +264,7 @@ } /** - * Executes a function given a potentially namespaced function name, e.g., - * cr.webUIListenerCallback. - * @param {string} functionName The name of the function, including any - * namespaces, to execute. - */ -function executeFunctionByName(functionName) { - var args = Array.prototype.slice.call(arguments, 1); - var func = (0, eval)(functionName); - func.apply(undefined, args); -} - -/** - * Tests that cr.sendWithCallback correctly handles the case where the JS sends - * no arguments to the WebUI handler. - */ -function testSendWithCallback_PassesJSArgs() { - var testMethodName = 'getFullscreenState'; - - // Mock out chrome.send to emulate a WebUI handler calling back with the - // result of a getFullscreenState call. - window.chrome = {}; - window.chrome.send = function(method, args) { - assertEquals(testMethodName, method); - var callbackName = args[0]; - var id = args[1]; - executeFunctionByName(callbackName, id, /* fullscreen */ true); - }; - - var callbackResponse; - cr.sendWithCallback(testMethodName, undefined, function(fullscreen) { - callbackResponse = fullscreen; - }); - - assertTrue(callbackResponse); -} - -/** - * Tests that cr.sendWithCallback passes arguments from JS to the WebUI - * handler. - */ -function testSendWithCallback_PassesJSArgs() { - var testMethodName = 'getSquareOfX'; - - // Mock out chrome.send to emulate a WebUI handler calling back with the - // result of a getSquareOfX call. - window.chrome = {}; - window.chrome.send = function(method, args) { - assertEquals(testMethodName, method); - var callbackName = args[0]; - var id = args[1]; - var x = args[2]; - executeFunctionByName(callbackName, id, x * x); - }; - - var callbackResponse; - cr.sendWithCallback(testMethodName, [5], function(square) { - callbackResponse = square; - }); - - assertEquals(25, callbackResponse); -} - -/** - * Tests that an event fired by a WebUI handler is sent to all listeners. + * Tests that an event fired by a WebUI handler is sent to all listeners. */ function testAddWebUIListener() { var responses = new Map(); @@ -338,9 +275,7 @@ responses.set('second', enabled); }); - executeFunctionByName( - 'cr.webUIListenerCallback', 'fullscreen-enabled', true); - + cr.webUIListenerCallback('fullscreen-enabled', true); assertTrue(responses.get('first')); assertTrue(responses.get('second')); }
diff --git a/chrome/test/data/webui/media_router/media_router_container_tests.js b/chrome/test/data/webui/media_router/media_router_container_tests.js index 4d008a4e..cfb96dd 100644 --- a/chrome/test/data/webui/media_router/media_router_container_tests.js +++ b/chrome/test/data/webui/media_router/media_router_container_tests.js
@@ -173,7 +173,9 @@ container.showFirstRunFlow = true; setTimeout(function() { - container.addEventListener('acknowledge-first-run-flow', function() { + container.addEventListener('acknowledge-first-run-flow', + function(data) { + assertFalse(data.detail.optedIntoCloudServices); done(); }); MockInteractions.tap(container.shadowRoot.getElementById( @@ -181,6 +183,45 @@ }); }); + // Tests for 'acknowledge-first-run-flow' event firing when the + // 'first-run-button' button is clicked and the cloud preference checkbox + // is also shown. + test('first run button with cloud pref click', function(done) { + container.showFirstRunFlow = true; + container.showFirstRunFlowCloudPref = true; + + setTimeout(function() { + container.addEventListener('acknowledge-first-run-flow', + function(data) { + assertTrue(data.detail.optedIntoCloudServices); + done(); + }); + MockInteractions.tap(container.shadowRoot.getElementById( + 'first-run-button')); + }); + }); + + // Tests for 'acknowledge-first-run-flow' event firing when the + // 'first-run-button' button is clicked after the cloud preference + // checkbox is deselected. + test('first run button with cloud pref deselected click', + function(done) { + container.showFirstRunFlow = true; + container.showFirstRunFlowCloudPref = true; + + setTimeout(function() { + container.addEventListener('acknowledge-first-run-flow', + function(data) { + assertFalse(data.detail.optedIntoCloudServices); + done(); + }); + MockInteractions.tap(container.shadowRoot.getElementById( + 'first-run-cloud-checkbox')); + MockInteractions.tap(container.shadowRoot.getElementById( + 'first-run-button')); + }); + }); + // Tests for 'create-route' event firing when a sink with no associated // route is clicked. test('select sink without a route', function(done) {
diff --git a/chrome/test/data/webui/media_router/media_router_header_tests.js b/chrome/test/data/webui/media_router/media_router_header_tests.js index 966948a..f82ef68 100644 --- a/chrome/test/data/webui/media_router/media_router_header_tests.js +++ b/chrome/test/data/webui/media_router/media_router_header_tests.js
@@ -81,15 +81,62 @@ MockInteractions.tap(header.$['back-button']); }); - // Tests for 'arrow-drop-click' event firing when the arrow drop button - // is clicked. + // Tests for 'header-or-arrow-click' event firing when the arrow drop + // button is clicked on the CAST_MODE_LIST view. test('arrow drop icon click', function(done) { - header.addEventListener('arrow-drop-click', function() { + header.view = media_router.MediaRouterView.CAST_MODE_LIST; + header.addEventListener('header-or-arrow-click', function() { done(); }); MockInteractions.tap(header.$['arrow-drop-icon']); }); + // Tests for 'header-or-arrow-click' event firing when the arrow drop + // button is clicked on the SINK_LIST view. + test('arrow drop icon click', function(done) { + header.view = media_router.MediaRouterView.SINK_LIST; + header.addEventListener('header-or-arrow-click', function() { + done(); + }); + MockInteractions.tap(header.$['arrow-drop-icon']); + }); + + // Tests for 'header-or-arrow-click' event firing when the header text is + // clicked on the CAST_MODE_LIST view. + test('header text click on cast mode list view', function(done) { + header.view = media_router.MediaRouterView.CAST_MODE_LIST; + header.addEventListener('header-or-arrow-click', function() { + done(); + }); + MockInteractions.tap(header.$['header-text']); + }); + + // Tests for 'header-or-arrow-click' event firing when the header text is + // clicked on the SINK_LIST view. + test('header text click on sink list view', function(done) { + header.view = media_router.MediaRouterView.SINK_LIST; + header.addEventListener('header-or-arrow-click', function() { + done(); + }); + MockInteractions.tap(header.$['header-text']); + }); + + // Tests for no event firing when the header text is clicked on certain + // views. + test('header text click without event firing', function(done) { + header.addEventListener('header-or-arrow-click', function() { + assertNotReached(); + }); + + header.view = media_router.MediaRouterView.FILTER; + MockInteractions.tap(header.$['header-text']); + header.view = media_router.MediaRouterView.ISSUE; + MockInteractions.tap(header.$['header-text']); + header.view = media_router.MediaRouterView.ROUTE_DETAILS; + MockInteractions.tap(header.$['header-text']); + done(); + }); + // Tests the |computeArrowDropIcon_| function. test('compute arrow drop icon', function() { assertEquals('arrow-drop-up',
diff --git a/chrome/test/data/webui/webui_resource_async_browsertest.js b/chrome/test/data/webui/webui_resource_async_browsertest.js new file mode 100644 index 0000000..24baa25a --- /dev/null +++ b/chrome/test/data/webui/webui_resource_async_browsertest.js
@@ -0,0 +1,81 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview Framework for running async JS tests for cr.js utility methods. + */ + +/** @const {string} Path to source root. */ +var ROOT_PATH = '../../../../'; + +/** @const {string} Name of the chrome.send() message to be used in tests. */ +var CHROME_SEND_NAME = 'echoMessage'; + +/** + * Test fixture for testing async methods of cr.js. + * @constructor + * @extends testing.Test + */ +function WebUIResourceAsyncTest() {} + +WebUIResourceAsyncTest.prototype = { + __proto__: testing.Test.prototype, + + /** @override */ + browsePreload: DUMMY_URL, + + /** @override */ + isAsync: true, + + /** @override */ + runAccessibilityChecks: false, + + /** @override */ + extraLibraries: [ + ROOT_PATH + 'third_party/mocha/mocha.js', + ROOT_PATH + 'chrome/test/data/webui/mocha_adapter.js', + ROOT_PATH + 'ui/webui/resources/js/cr.js', + ], +}; + +TEST_F('WebUIResourceAsyncTest', 'SendWithPromise', function() { + /** + * TODO(dpapad): Move this helper method in test_api.js. + * @param {string} name chrome.send message name. + * @return {!Promise} Fires when chrome.send is called with the given message + * name. + */ + function whenChromeSendCalled(name) { + return new Promise(function(resolve, reject) { + registerMessageCallback(name, null, resolve); + }); + } + + suite('cr.js', function() { + setup(function() { + // Simulate a WebUI handler that echoes back all parameters passed to it. + whenChromeSendCalled(CHROME_SEND_NAME).then(function(args) { + assertEquals('cr.webUIResponse', args[0]); + var globalCallbackArgs = args.slice(1); + cr.webUIResponse.apply(null, globalCallbackArgs); + }); + }); + + test('sendWithPromise_MultipleArgs', function() { + return cr.sendWithPromise(CHROME_SEND_NAME, 'foo', 'bar').then( + function(response) { + assertEquals(['foo', 'bar'].join(), response.join()); + }); + }); + + test('sendWithPromise_NoArgs', function() { + return cr.sendWithPromise(CHROME_SEND_NAME).then(function(response) { + assertEquals([].join(), response.join()); + }); + }); + }); + + // Run all registered tests. + mocha.run(); +});
diff --git a/chrome_elf/chrome_elf_constants.cc b/chrome_elf/chrome_elf_constants.cc index 2182268..76560228 100644 --- a/chrome_elf/chrome_elf_constants.cc +++ b/chrome_elf/chrome_elf_constants.cc
@@ -5,6 +5,9 @@ #include "chrome_elf/chrome_elf_constants.h" #if defined(GOOGLE_CHROME_BUILD) +// Using PRODUCT_STRING_PATH will make Google Chrome and Canary configurations +// collide. This was deemed to be the best option due to ELF's inability to +// depend on BrowserDistribution. http://crbug.com/577820 #define PRODUCT_STRING_PATH L"Google\\Chrome" #elif defined(CHROMIUM_BUILD) #define PRODUCT_STRING_PATH L"Chromium"
diff --git a/chromecast/media/BUILD.gn b/chromecast/media/BUILD.gn index 4c4a87e..832ea64 100644 --- a/chromecast/media/BUILD.gn +++ b/chromecast/media/BUILD.gn
@@ -57,4 +57,10 @@ "//testing/gtest", "//ui/gfx/geometry", ] + + if (chromecast_branding == "public") { + # Link default libcast_media_1.0 statically not to link dummy one + # dynamically for public unittests. + deps += [ "//chromecast/media/base:libcast_media_1.0_default_core" ] + } }
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index 66d21e0..43945df 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -7862.0.0 \ No newline at end of file +7863.0.0 \ No newline at end of file
diff --git a/components/arc.gypi b/components/arc.gypi index 20dbad6..03146b85 100644 --- a/components/arc.gypi +++ b/components/arc.gypi
@@ -13,6 +13,7 @@ ], 'dependencies': [ 'arc_mojo_bindings', + 'components.gyp:onc_component', '../base/base.gyp:base', '../chromeos/chromeos.gyp:chromeos', '../chromeos/chromeos.gyp:power_manager_proto', @@ -21,6 +22,7 @@ '../ui/aura/aura.gyp:aura', '../ui/base/ime/ui_base_ime.gyp:ui_base_ime', '../ui/base/ui_base.gyp:ui_base', + '../ui/base/ui_base.gyp:ui_base_test_support', '../ui/events/events.gyp:events_base', ], 'sources': [ @@ -43,11 +45,10 @@ 'arc/ime/arc_ime_ipc_host_impl.h', 'arc/input/arc_input_bridge.cc', 'arc/input/arc_input_bridge.h', + 'arc/net/arc_net_host_impl.cc', + 'arc/net/arc_net_host_impl.h', 'arc/power/arc_power_bridge.cc', 'arc/power/arc_power_bridge.h', - 'arc/video/arc_video_bridge.cc', - 'arc/video/arc_video_bridge.h', - 'arc/video/video_host_delegate.h', ], }, { @@ -86,11 +87,11 @@ 'arc/common/ime.mojom', 'arc/common/input.mojom', 'arc/common/intent_helper.mojom', + 'arc/common/net.mojom', 'arc/common/notifications.mojom', 'arc/common/power.mojom', 'arc/common/process.mojom', 'arc/common/settings.mojom', - 'arc/common/video.mojom', ], }, ],
diff --git a/components/arc/BUILD.gn b/components/arc/BUILD.gn index 0a5501d..004f9db 100644 --- a/components/arc/BUILD.gn +++ b/components/arc/BUILD.gn
@@ -25,11 +25,10 @@ "ime/arc_ime_ipc_host_impl.h", "input/arc_input_bridge.cc", "input/arc_input_bridge.h", + "net/arc_net_host_impl.cc", + "net/arc_net_host_impl.h", "power/arc_power_bridge.cc", "power/arc_power_bridge.h", - "video/arc_video_bridge.cc", - "video/arc_video_bridge.h", - "video/video_host_delegate.h", ] deps = [ @@ -37,6 +36,7 @@ "//base:prefs", "//chromeos", "//chromeos:power_manager_proto", + "//components/onc", "//components/signin/core/account_id", "//ipc:ipc", "//ipc/mojo:mojo", @@ -63,11 +63,11 @@ "common/ime.mojom", "common/input.mojom", "common/intent_helper.mojom", + "common/net.mojom", "common/notifications.mojom", "common/power.mojom", "common/process.mojom", "common/settings.mojom", - "common/video.mojom", ] } @@ -108,6 +108,7 @@ "//mojo/public/cpp/system:system", "//testing/gtest", "//ui/aura", + "//ui/base:test_support", "//ui/base/ime", "//ui/events", "//ui/events:dom_keycode_converter",
diff --git a/components/arc/arc_bridge_service.cc b/components/arc/arc_bridge_service.cc index 62bbcf73..986bbdd 100644 --- a/components/arc/arc_bridge_service.cc +++ b/components/arc/arc_bridge_service.cc
@@ -63,14 +63,14 @@ observer->OnImeInstanceReady(); if (input_instance()) observer->OnInputInstanceReady(); + if (net_instance()) + observer->OnNetInstanceReady(); if (notifications_instance()) observer->OnNotificationsInstanceReady(); if (power_instance()) observer->OnPowerInstanceReady(); if (process_instance()) observer->OnProcessInstanceReady(); - if (video_instance()) - observer->OnVideoInstanceReady(); } void ArcBridgeService::RemoveObserver(Observer* observer) { @@ -225,6 +225,30 @@ FOR_EACH_OBSERVER(Observer, observer_list(), OnIntentHelperInstanceClosed()); } +void ArcBridgeService::OnNetInstanceReady(NetInstancePtr net_ptr) { + DCHECK(CalledOnValidThread()); + temporary_net_ptr_ = std::move(net_ptr); + temporary_net_ptr_.QueryVersion(base::Bind( + &ArcBridgeService::OnNetVersionReady, weak_factory_.GetWeakPtr())); +} + +void ArcBridgeService::OnNetVersionReady(int32_t version) { + DCHECK(CalledOnValidThread()); + net_ptr_ = std::move(temporary_net_ptr_); + net_ptr_.set_connection_error_handler(base::Bind( + &ArcBridgeService::CloseNetChannel, weak_factory_.GetWeakPtr())); + FOR_EACH_OBSERVER(Observer, observer_list(), OnNetInstanceReady()); +} + +void ArcBridgeService::CloseNetChannel() { + DCHECK(CalledOnValidThread()); + if (!net_ptr_) + return; + + net_ptr_.reset(); + FOR_EACH_OBSERVER(Observer, observer_list(), OnNetInstanceClosed()); +} + void ArcBridgeService::OnNotificationsInstanceReady( NotificationsInstancePtr notifications_ptr) { DCHECK(CalledOnValidThread()); @@ -305,30 +329,6 @@ // Obsolete interface. } -void ArcBridgeService::OnVideoInstanceReady(VideoInstancePtr video_ptr) { - DCHECK(CalledOnValidThread()); - temporary_video_ptr_ = std::move(video_ptr); - temporary_video_ptr_.QueryVersion(base::Bind( - &ArcBridgeService::OnVideoVersionReady, weak_factory_.GetWeakPtr())); -} - -void ArcBridgeService::OnVideoVersionReady(int32_t version) { - DCHECK(CalledOnValidThread()); - video_ptr_ = std::move(temporary_video_ptr_); - video_ptr_.set_connection_error_handler(base::Bind( - &ArcBridgeService::CloseVideoChannel, weak_factory_.GetWeakPtr())); - FOR_EACH_OBSERVER(Observer, observer_list(), OnVideoInstanceReady()); -} - -void ArcBridgeService::CloseVideoChannel() { - DCHECK(CalledOnValidThread()); - if (!video_ptr_) - return; - - video_ptr_.reset(); - FOR_EACH_OBSERVER(Observer, observer_list(), OnVideoInstanceClosed()); -} - void ArcBridgeService::SetState(State state) { DCHECK(CalledOnValidThread()); // DCHECK on enum classes not supported. @@ -357,10 +357,10 @@ CloseImeChannel(); CloseInputChannel(); CloseIntentHelperChannel(); + CloseNetChannel(); CloseNotificationsChannel(); ClosePowerChannel(); CloseProcessChannel(); - CloseVideoChannel(); } } // namespace arc
diff --git a/components/arc/arc_bridge_service.h b/components/arc/arc_bridge_service.h index 7e35833..fd7caaa2 100644 --- a/components/arc/arc_bridge_service.h +++ b/components/arc/arc_bridge_service.h
@@ -101,6 +101,10 @@ virtual void OnNotificationsInstanceReady() {} virtual void OnNotificationsInstanceClosed() {} + // Called whenever the ARC net interface state changes. + virtual void OnNetInstanceReady() {} + virtual void OnNetInstanceClosed() {} + // Called whenever the ARC power interface state changes. virtual void OnPowerInstanceReady() {} virtual void OnPowerInstanceClosed() {} @@ -109,10 +113,6 @@ virtual void OnProcessInstanceReady() {} virtual void OnProcessInstanceClosed() {} - // Called whenever the ARC video interface state changes. - virtual void OnVideoInstanceReady() {} - virtual void OnVideoInstanceClosed() {} - protected: virtual ~Observer() {} }; @@ -158,12 +158,12 @@ IntentHelperInstance* intent_helper_instance() { return intent_helper_ptr_.get(); } + NetInstance* net_instance() { return net_ptr_.get(); } NotificationsInstance* notifications_instance() { return notifications_ptr_.get(); } PowerInstance* power_instance() { return power_ptr_.get(); } ProcessInstance* process_instance() { return process_ptr_.get(); } - VideoInstance* video_instance() { return video_ptr_.get(); } int32_t app_version() const { return app_ptr_.version(); } int32_t auth_version() const { return auth_ptr_.version(); } @@ -174,7 +174,6 @@ int32_t notifications_version() const { return notifications_ptr_.version(); } int32_t power_version() const { return power_ptr_.version(); } int32_t process_version() const { return process_ptr_.version(); } - int32_t video_version() const { return video_ptr_.version(); } // ArcHost: void OnAppInstanceReady(AppInstancePtr app_ptr) override; @@ -184,12 +183,12 @@ void OnInputInstanceReady(InputInstancePtr input_ptr) override; void OnIntentHelperInstanceReady( IntentHelperInstancePtr intent_helper_ptr) override; + void OnNetInstanceReady(NetInstancePtr net_ptr) override; void OnNotificationsInstanceReady( NotificationsInstancePtr notifications_ptr) override; void OnPowerInstanceReady(PowerInstancePtr power_ptr) override; void OnProcessInstanceReady(ProcessInstancePtr process_ptr) override; void OnSettingsInstanceReady(SettingsInstancePtr settings_ptr) override; - void OnVideoInstanceReady(VideoInstancePtr video_ptr) override; // Gets the current state of the bridge service. State state() const { return state_; } @@ -227,10 +226,10 @@ void CloseImeChannel(); void CloseInputChannel(); void CloseIntentHelperChannel(); + void CloseNetChannel(); void CloseNotificationsChannel(); void ClosePowerChannel(); void CloseProcessChannel(); - void CloseVideoChannel(); // Callbacks for QueryVersion. void OnAppVersionReady(int32_t version); @@ -239,10 +238,10 @@ void OnImeVersionReady(int32_t version); void OnInputVersionReady(int32_t version); void OnIntentHelperVersionReady(int32_t version); + void OnNetVersionReady(int32_t version); void OnNotificationsVersionReady(int32_t version); void OnPowerVersionReady(int32_t version); void OnProcessVersionReady(int32_t version); - void OnVideoVersionReady(int32_t version); // Mojo interfaces. AppInstancePtr app_ptr_; @@ -251,10 +250,10 @@ ImeInstancePtr ime_ptr_; InputInstancePtr input_ptr_; IntentHelperInstancePtr intent_helper_ptr_; + NetInstancePtr net_ptr_; NotificationsInstancePtr notifications_ptr_; PowerInstancePtr power_ptr_; ProcessInstancePtr process_ptr_; - VideoInstancePtr video_ptr_; // Temporary Mojo interfaces. After a Mojo interface pointer has been // received from the other endpoint, we still need to asynchronously query @@ -268,10 +267,10 @@ ImeInstancePtr temporary_ime_ptr_; InputInstancePtr temporary_input_ptr_; IntentHelperInstancePtr temporary_intent_helper_ptr_; + NetInstancePtr temporary_net_ptr_; NotificationsInstancePtr temporary_notifications_ptr_; PowerInstancePtr temporary_power_ptr_; ProcessInstancePtr temporary_process_ptr_; - VideoInstancePtr temporary_video_ptr_; base::ObserverList<Observer> observer_list_;
diff --git a/components/arc/arc_service_manager.cc b/components/arc/arc_service_manager.cc index 85f52fe..9563358 100644 --- a/components/arc/arc_service_manager.cc +++ b/components/arc/arc_service_manager.cc
@@ -4,8 +4,6 @@ #include "components/arc/arc_service_manager.h" -#include <utility> - #include "base/sequenced_task_runner.h" #include "base/thread_task_runner_handle.h" #include "components/arc/arc_bridge_bootstrap.h" @@ -13,6 +11,7 @@ #include "components/arc/clipboard/arc_clipboard_bridge.h" #include "components/arc/ime/arc_ime_bridge.h" #include "components/arc/input/arc_input_bridge.h" +#include "components/arc/net/arc_net_host_impl.h" #include "components/arc/power/arc_power_bridge.h" #include "ui/arc/notification/arc_notification_manager.h" @@ -34,6 +33,7 @@ AddService(make_scoped_ptr(new ArcClipboardBridge(arc_bridge_service()))); AddService(make_scoped_ptr(new ArcImeBridge(arc_bridge_service()))); AddService(make_scoped_ptr(new ArcInputBridge(arc_bridge_service()))); + AddService(make_scoped_ptr(new ArcNetHostImpl(arc_bridge_service()))); AddService(make_scoped_ptr(new ArcPowerBridge(arc_bridge_service()))); }
diff --git a/components/arc/common/arc_bridge.mojom b/components/arc/common/arc_bridge.mojom index c3c837d..52b0a0c82 100644 --- a/components/arc/common/arc_bridge.mojom +++ b/components/arc/common/arc_bridge.mojom
@@ -10,11 +10,11 @@ import "ime.mojom"; import "input.mojom"; import "intent_helper.mojom"; +import "net.mojom"; import "notifications.mojom"; import "power.mojom"; import "process.mojom"; import "settings.mojom"; -import "video.mojom"; interface ArcBridgeHost { // Keep the entries alphabetical. In order to do so without breaking @@ -40,6 +40,9 @@ [MinVersion=4] OnIntentHelperInstanceReady@111( IntentHelperInstance instance_ptr); + // Notifies Chrome that the NetInstance interface is ready. + [MinVersion=5] OnNetInstanceReady@108(NetInstance instance_ptr); + // Notifies Chrome that the NotificationsInstance interface is ready. OnNotificationsInstanceReady@102(NotificationsInstance instance_ptr); @@ -51,9 +54,6 @@ // Notifies Chrome that the SettingsInstance interface is ready. OnSettingsInstanceReady@105(SettingsInstance instance_ptr); - - // Notifies Chrome that the VideoInstance interface is ready. - [MinVersion=2] OnVideoInstanceReady@107(VideoInstance instance_ptr); }; interface ArcBridgeInstance {
diff --git a/components/arc/common/net.mojom b/components/arc/common/net.mojom new file mode 100644 index 0000000..0835c73 --- /dev/null +++ b/components/arc/common/net.mojom
@@ -0,0 +1,37 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module arc; + +enum NetworkResult { + SUCCESS = 0, + FAILURE = 1, +}; + +struct WifiConfiguration { + // These correspond to ONC properties returned by + // chrome.networkingPrivate.getNetworks(). + // See components/onc/docs/onc_spec.html + string ssid; + int32 frequency; + int32 signal_strength; + string bssid; + string security; +}; + +struct NetworkData { + NetworkResult status; + array<WifiConfiguration> networks; +}; + +interface NetHost { + // Sends a request to get configured or visible WiFi networks based on the + // |configured_only| and |visible_only| flags. + GetNetworks@0(bool configured_only, bool visible_only) => (NetworkData data); +}; + +interface NetInstance { + // Establishes full-duplex communication with the host. + Init@0(NetHost host_ptr); +};
diff --git a/components/arc/common/video.mojom b/components/arc/common/video.mojom deleted file mode 100644 index b21a1db..0000000 --- a/components/arc/common/video.mojom +++ /dev/null
@@ -1,15 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module arc; - -interface VideoHost { - // Notifies Chrome a request for ipc channel of video acceleration. - OnRequestArcVideoAcceleratorChannel() => (handle channel_handle); -}; - -interface VideoInstance { - // Establishes full-duplex communication with the host. - Init(VideoHost host_ptr); -};
diff --git a/components/arc/ime/arc_ime_bridge.cc b/components/arc/ime/arc_ime_bridge.cc index 669cdd23..8d69a47 100644 --- a/components/arc/ime/arc_ime_bridge.cc +++ b/components/arc/ime/arc_ime_bridge.cc
@@ -35,7 +35,8 @@ : ArcService(bridge_service), ipc_host_(new ArcImeIpcHostImpl(this, bridge_service)), ime_type_(ui::TEXT_INPUT_TYPE_NONE), - has_composition_text_(false) { + has_composition_text_(false), + test_input_method_(nullptr) { aura::Env* env = aura::Env::GetInstanceDontCreate(); if (env) env->AddObserver(this); @@ -60,7 +61,14 @@ ipc_host_ = std::move(test_ipc_host); } +void ArcImeBridge::SetInputMethodForTesting( + ui::InputMethod* test_input_method) { + test_input_method_ = test_input_method; +} + ui::InputMethod* ArcImeBridge::GetInputMethod() { + if (test_input_method_) + return test_input_method_; if (!focused_arc_window_.has_windows()) return nullptr; return focused_arc_window_.windows().front()->GetHost()->GetInputMethod(); @@ -114,8 +122,18 @@ ime_type_ = type; ui::InputMethod* const input_method = GetInputMethod(); - if (input_method) + if (input_method) { input_method->OnTextInputTypeChanged(this); + if (input_method->GetTextInputClient() == this && + ime_type_ != ui::TEXT_INPUT_TYPE_NONE) { + // TODO(kinaba): crbug.com/581282. This is tentative short-term solution. + // + // For fully correct implementation, rather than to piggyback the "show" + // request with the input type change, we need dedicated IPCs to share the + // virtual keyboard show/hide states between Chromium and ARC. + input_method->ShowImeIfNeeded(); + } + } } void ArcImeBridge::OnCursorRectChanged(const gfx::Rect& rect) {
diff --git a/components/arc/ime/arc_ime_bridge.h b/components/arc/ime/arc_ime_bridge.h index 7c969b33..1fcfc1b 100644 --- a/components/arc/ime/arc_ime_bridge.h +++ b/components/arc/ime/arc_ime_bridge.h
@@ -45,6 +45,9 @@ // Injects the custom IPC host object for testing purpose only. void SetIpcHostForTesting(scoped_ptr<ArcImeIpcHost> test_ipc_host); + // Injects the custom IME for testing purpose only. + void SetInputMethodForTesting(ui::InputMethod* test_input_method); + // Overridden from aura::EnvObserver: void OnWindowInitialized(aura::Window* new_window) override; @@ -104,6 +107,8 @@ aura::WindowTracker arc_windows_; aura::WindowTracker focused_arc_window_; + ui::InputMethod* test_input_method_; + DISALLOW_COPY_AND_ASSIGN(ArcImeBridge); };
diff --git a/components/arc/ime/arc_ime_bridge_unittest.cc b/components/arc/ime/arc_ime_bridge_unittest.cc index 0677526..bddb887 100644 --- a/components/arc/ime/arc_ime_bridge_unittest.cc +++ b/components/arc/ime/arc_ime_bridge_unittest.cc
@@ -11,6 +11,7 @@ #include "components/arc/test/fake_arc_bridge_service.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/ime/composition_text.h" +#include "ui/base/ime/dummy_input_method.h" namespace arc { @@ -26,6 +27,31 @@ } }; +class FakeInputMethod : public ui::DummyInputMethod { + public: + FakeInputMethod() : client_(nullptr), count_show_ime_if_needed_(0) {} + + void SetFocusedTextInputClient(ui::TextInputClient* client) override { + client_ = client; + } + + ui::TextInputClient* GetTextInputClient() const override { + return client_; + } + + void ShowImeIfNeeded() override { + count_show_ime_if_needed_++; + } + + int count_show_ime_if_needed() const { + return count_show_ime_if_needed_; + } + + private: + ui::TextInputClient* client_; + int count_show_ime_if_needed_; +}; + } // namespace class ArcImeBridgeTest : public testing::Test { @@ -34,6 +60,7 @@ protected: scoped_ptr<FakeArcBridgeService> fake_arc_bridge_service_; + scoped_ptr<FakeInputMethod> fake_input_method_; scoped_ptr<ArcImeBridge> instance_; private: @@ -41,6 +68,9 @@ fake_arc_bridge_service_.reset(new FakeArcBridgeService); instance_.reset(new ArcImeBridge(fake_arc_bridge_service_.get())); instance_->SetIpcHostForTesting(make_scoped_ptr(new FakeArcImeIpcHost)); + + fake_input_method_.reset(new FakeInputMethod); + instance_->SetInputMethodForTesting(fake_input_method_.get()); } void TearDown() override { @@ -76,4 +106,24 @@ EXPECT_FALSE(instance_->HasCompositionText()); } +TEST_F(ArcImeBridgeTest, ShowImeIfNeeded) { + fake_input_method_->SetFocusedTextInputClient(instance_.get()); + instance_->OnTextInputTypeChanged(ui::TEXT_INPUT_TYPE_NONE); + ASSERT_EQ(0, fake_input_method_->count_show_ime_if_needed()); + + instance_->OnTextInputTypeChanged(ui::TEXT_INPUT_TYPE_TEXT); + EXPECT_EQ(1, fake_input_method_->count_show_ime_if_needed()); + + // The type is not changing, hence no call. + instance_->OnTextInputTypeChanged(ui::TEXT_INPUT_TYPE_TEXT); + EXPECT_EQ(1, fake_input_method_->count_show_ime_if_needed()); + + instance_->OnTextInputTypeChanged(ui::TEXT_INPUT_TYPE_SEARCH); + EXPECT_EQ(2, fake_input_method_->count_show_ime_if_needed()); + + // Change to NONE should not trigger the showing event. + instance_->OnTextInputTypeChanged(ui::TEXT_INPUT_TYPE_NONE); + EXPECT_EQ(2, fake_input_method_->count_show_ime_if_needed()); +} + } // namespace arc
diff --git a/components/arc/net/DEPS b/components/arc/net/DEPS new file mode 100644 index 0000000..541abf5 --- /dev/null +++ b/components/arc/net/DEPS
@@ -0,0 +1,4 @@ +include_rules = [ + "+chromeos/network", + "+components/onc", +]
diff --git a/components/arc/net/arc_net_host_impl.cc b/components/arc/net/arc_net_host_impl.cc new file mode 100644 index 0000000..0740556 --- /dev/null +++ b/components/arc/net/arc_net_host_impl.cc
@@ -0,0 +1,99 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/arc/net/arc_net_host_impl.h" + +#include <string> +#include <vector> + +#include "base/logging.h" +#include "base/posix/eintr_wrapper.h" +#include "base/thread_task_runner_handle.h" +#include "base/time/time.h" +#include "chromeos/network/network_util.h" +#include "chromeos/network/onc/onc_utils.h" +#include "components/arc/arc_bridge_service.h" +#include "third_party/mojo/src/mojo/edk/embedder/embedder.h" + +namespace { + +const int kGetNetworksListLimit = 100; + +} // namespace + +namespace arc { + +ArcNetHostImpl::ArcNetHostImpl(ArcBridgeService* bridge_service) + : ArcService(bridge_service), binding_(this) { + arc_bridge_service()->AddObserver(this); +} + +ArcNetHostImpl::~ArcNetHostImpl() { + DCHECK(thread_checker_.CalledOnValidThread()); + arc_bridge_service()->RemoveObserver(this); +} + +void ArcNetHostImpl::OnNetInstanceReady() { + DCHECK(thread_checker_.CalledOnValidThread()); + + NetHostPtr host; + binding_.Bind(GetProxy(&host)); + arc_bridge_service()->net_instance()->Init(std::move(host)); +} + +void ArcNetHostImpl::GetNetworks(bool configured_only, + bool visible_only, + const GetNetworksCallback& callback) { + NetworkDataPtr data = NetworkData::New(); + data->status = NetworkResult::SUCCESS; + + // Retrieve list of nearby wifi networks + chromeos::NetworkTypePattern network_pattern = + chromeos::onc::NetworkTypePatternFromOncType(onc::network_type::kWiFi); + scoped_ptr<base::ListValue> network_properties_list = + chromeos::network_util::TranslateNetworkListToONC( + network_pattern, configured_only, visible_only, + kGetNetworksListLimit); + + // Extract info for each network and add it to the list. + for (base::Value* value : *network_properties_list) { + WifiConfigurationPtr wc = WifiConfiguration::New(); + + base::DictionaryValue* network_dict = nullptr; + value->GetAsDictionary(&network_dict); + DCHECK(network_dict); + + // kName is a post-processed version of kHexSSID. + std::string tmp; + network_dict->GetString(onc::network_config::kName, &tmp); + DCHECK(!tmp.empty()); + wc->ssid = tmp; + + base::DictionaryValue* wifi_dict = nullptr; + network_dict->GetDictionary(onc::network_config::kWiFi, &wifi_dict); + DCHECK(wifi_dict); + + if (!wifi_dict->GetInteger(onc::wifi::kFrequency, &wc->frequency)) + wc->frequency = 0; + if (!wifi_dict->GetInteger(onc::wifi::kSignalStrength, + &wc->signal_strength)) + wc->signal_strength = 0; + + if (!wifi_dict->GetString(onc::wifi::kSecurity, &tmp)) + NOTREACHED(); + DCHECK(!tmp.empty()); + wc->security = tmp; + + if (!wifi_dict->GetString(onc::wifi::kBSSID, &tmp)) + NOTREACHED(); + DCHECK(!tmp.empty()); + wc->bssid = tmp; + + data->networks.push_back(std::move(wc)); + } + + callback.Run(std::move(data)); +} + +} // namespace arc
diff --git a/components/arc/net/arc_net_host_impl.h b/components/arc/net/arc_net_host_impl.h new file mode 100644 index 0000000..0ec4ee63 --- /dev/null +++ b/components/arc/net/arc_net_host_impl.h
@@ -0,0 +1,50 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_ARC_NET_ARC_NET_HOST_IMPL_H_ +#define COMPONENTS_ARC_NET_ARC_NET_HOST_IMPL_H_ + +#include <stdint.h> +#include <string> +#include <vector> + +#include "base/files/scoped_file.h" +#include "base/macros.h" +#include "base/threading/thread_checker.h" +#include "components/arc/arc_bridge_service.h" +#include "components/arc/arc_service.h" +#include "components/arc/common/net.mojom.h" +#include "mojo/public/cpp/bindings/binding.h" + +namespace arc { + +class ArcBridgeService; + +// Private implementation of ArcNetHost. +class ArcNetHostImpl : public ArcService, + public ArcBridgeService::Observer, + public NetHost { + public: + // The constructor will register an Observer with ArcBridgeService. + explicit ArcNetHostImpl(ArcBridgeService* arc_bridge_service); + ~ArcNetHostImpl() override; + + // Called when a GetNetworks call is sent from ARC. + void GetNetworks(bool configured_only, + bool visible_only, + const GetNetworksCallback& callback) override; + + // Overridden from ArcBridgeService::Observer: + void OnNetInstanceReady() override; + + private: + base::ThreadChecker thread_checker_; + mojo::Binding<arc::NetHost> binding_; + + DISALLOW_COPY_AND_ASSIGN(ArcNetHostImpl); +}; + +} // namespace arc + +#endif // COMPONENTS_ARC_NET_ARC_NET_HOST_IMPL_H_
diff --git a/components/arc/video/video_host_delegate.h b/components/arc/video/video_host_delegate.h deleted file mode 100644 index 3edc792..0000000 --- a/components/arc/video/video_host_delegate.h +++ /dev/null
@@ -1,26 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_ARC_VIDEO_VIDEO_HOST_DELEGATE_H -#define COMPONENTS_ARC_VIDEO_VIDEO_HOST_DELEGATE_H - -#include "components/arc/common/video.mojom.h" - -namespace arc { - -// VideoHostDelegate is an abstract class providing video decoding/encoding -// acceleration service. -// -// The purpose of this interface is to create a channel into the GPU process -// only, which then handles video decoding/encoding, without going through -// VideoHostDelegate anymore. -class VideoHostDelegate : public VideoHost { - public: - // Called when the video service is stopping. - virtual void OnStopping() = 0; -}; - -} // namespace arc - -#endif // COMPONENTS_ARC_VIDEO_VIDEO_HOST_DELEGATE_H
diff --git a/components/autofill/core/browser/autofill_external_delegate.cc b/components/autofill/core/browser/autofill_external_delegate.cc index 25ff5850..6a7566f 100644 --- a/components/autofill/core/browser/autofill_external_delegate.cc +++ b/components/autofill/core/browser/autofill_external_delegate.cc
@@ -303,6 +303,8 @@ suggestions->push_back(Suggestion(l10n_util::GetStringUTF16( IsKeyboardAccessoryEnabled() ? IDS_AUTOFILL_OPTIONS_CONTENT_DESCRIPTION : IDS_AUTOFILL_OPTIONS_POPUP))); + suggestions->back().label = + l10n_util::GetStringUTF16(IDS_AUTOFILL_OPTIONS_POPUP_LABEL); suggestions->back().frontend_id = POPUP_ITEM_ID_AUTOFILL_OPTIONS; if (IsKeyboardAccessoryEnabled()) suggestions->back().icon = base::ASCIIToUTF16("settings");
diff --git a/components/autofill/core/browser/autofill_field.cc b/components/autofill/core/browser/autofill_field.cc index 9ef2e2b2..e9eaa736 100644 --- a/components/autofill/core/browser/autofill_field.cc +++ b/components/autofill/core/browser/autofill_field.cc
@@ -196,49 +196,65 @@ return false; } +// Attempt to fill the user's expiration month |value| inside the <select> +// |field|. Since |value| is well defined but the website's |field| option +// values may not be, some heuristics are run to cover all observed cases. bool FillExpirationMonthSelectControl(const base::string16& value, const std::string& app_locale, FormFieldData* field) { - int index = 0; - if (!StringToInt(value, &index) || index <= 0 || index > 12) + // |value| is defined to be between 1 and 12, inclusively. + int month = 0; + if (!StringToInt(value, &month) || month <= 0 || month > 12) return false; - if (field->option_values.size() == 12) { - // The select only contains the months. - // If the first value of the select is 0, decrement the value of the index - // so January is associated with 0 instead of 1. + // We trim the whitespace from the select values before attempting to convert + // them to months. + std::vector<base::string16> trimmed_values(field->option_values.size()); + for (size_t i = 0; i < field->option_values.size(); ++i) + base::TrimWhitespace(field->option_values[i], base::TRIM_ALL, + &trimmed_values[i]); + + if (trimmed_values.size() == 12) { + // The select presumable only contains the year's months. + // If the first value of the select is 0, decrement the value of |month| so + // January is associated with 0 instead of 1. int first_value; - if (StringToInt(field->option_values[0], &first_value) && first_value == 0) - --index; - } else if (field->option_values.size() == 13) { - // The select uses the first value as a placeholder. - // If the first value of the select is 1, increment the value of the index - // to skip the placeholder value (January = 2). + if (StringToInt(trimmed_values[0], &first_value) && first_value == 0) + --month; + } else if (trimmed_values.size() == 13) { + // The select presumably uses the first value as a placeholder. + // If the first value of the select is 1, increment the value of |month| to + // skip the placeholder value (January = 2). int first_value; - if (StringToInt(field->option_values[0], &first_value) && first_value == 1) - ++index; + if (StringToInt(trimmed_values[0], &first_value) && first_value == 1) + ++month; } - for (const base::string16& option_value : field->option_values) { + // Attempt to match the user's |month| with the field's value attributes. + for (size_t i = 0; i < trimmed_values.size(); ++i) { int converted_value = 0; - if (CreditCard::ConvertMonth(option_value, app_locale, &converted_value) && - index == converted_value) { - field->value = option_value; + // We use the trimmed value to match with |month|, but the original select + // value to fill the field (otherwise filling wouldn't work). + if (CreditCard::ConvertMonth(trimmed_values[i], app_locale, + &converted_value) && + month == converted_value) { + field->value = field->option_values[i]; return true; } } + // Attempt to match with each of the options' content. for (const base::string16& option_contents : field->option_contents) { int converted_contents = 0; if (CreditCard::ConvertMonth(option_contents, app_locale, &converted_contents) && - index == converted_contents) { + month == converted_contents) { field->value = option_contents; return true; } } - return FillNumericSelectControl(index, field); + return FillNumericSelectControl(month, field); } // Returns true if the last two digits in |year| match those in |str|. @@ -439,7 +455,8 @@ html_mode_(HTML_MODE_NONE), phone_part_(IGNORED), credit_card_number_offset_(0), - previously_autofilled_(false) {} + previously_autofilled_(false), + parseable_name_(field.name) {} AutofillField::~AutofillField() {}
diff --git a/components/autofill/core/browser/autofill_field.h b/components/autofill/core/browser/autofill_field.h index 9aaf9fcd..6c9d523 100644 --- a/components/autofill/core/browser/autofill_field.h +++ b/components/autofill/core/browser/autofill_field.h
@@ -40,6 +40,7 @@ const ServerFieldTypeSet& possible_types() const { return possible_types_; } PhonePart phone_part() const { return phone_part_; } bool previously_autofilled() const { return previously_autofilled_; } + const base::string16& parseable_name() const { return parseable_name_; } // Setters for the detected type and section for this field. void set_section(const std::string& section) { section_ = section; } @@ -52,6 +53,9 @@ void set_previously_autofilled(bool previously_autofilled) { previously_autofilled_ = previously_autofilled; } + void set_parseable_name(base::string16 parseable_name) { + parseable_name_ = std::move(parseable_name); + } // This function automatically chooses between server and heuristic autofill // type, depending on the data available. @@ -139,6 +143,11 @@ // Whether the field was autofilled then later edited. bool previously_autofilled_; + // The parseable name attribute, with unnecessary information removed (such as + // a common prefix shared with other fields). Will be used for heuristics + // parsing. + base::string16 parseable_name_; + DISALLOW_COPY_AND_ASSIGN(AutofillField); };
diff --git a/components/autofill/core/browser/autofill_field_unittest.cc b/components/autofill/core/browser/autofill_field_unittest.cc index 9ef7d7f6..6f3b0d4 100644 --- a/components/autofill/core/browser/autofill_field_unittest.cc +++ b/components/autofill/core/browser/autofill_field_unittest.cc
@@ -470,6 +470,9 @@ // Values start at 1. {{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"}, NotNumericMonthsContentsNoPlaceholder()}, + // Values start at 1 but single digits are whitespace padded! + {{" 1", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", "10", "11", "12"}, + NotNumericMonthsContentsNoPlaceholder()}, // Values start at 0. {{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"}, NotNumericMonthsContentsNoPlaceholder()},
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc index 594ca1e7..fad9ab5 100644 --- a/components/autofill/core/browser/autofill_manager.cc +++ b/components/autofill/core/browser/autofill_manager.cc
@@ -98,6 +98,18 @@ return false; } +// Returns the credit card field |value| trimmed from whitespace and with stop +// characters removed. +base::string16 SanitizeCreditCardFieldValue(const base::string16& value) { + base::string16 sanitized; + base::TrimWhitespace(value, base::TRIM_ALL, &sanitized); + // Some sites have ____-____-____-____ in their credit card number fields, for + // example. + base::ReplaceChars(sanitized, base::ASCIIToUTF16("-_"), + base::ASCIIToUTF16(""), &sanitized); + return sanitized; +} + } // namespace AutofillManager::AutofillManager( @@ -1526,8 +1538,11 @@ std::vector<Suggestion> AutofillManager::GetCreditCardSuggestions( const FormFieldData& field, const AutofillType& type) const { + // The field value is sanitized before attempting to match it to the user's + // data. std::vector<Suggestion> suggestions = - personal_data_->GetCreditCardSuggestions(type, field.value); + personal_data_->GetCreditCardSuggestions( + type, SanitizeCreditCardFieldValue(field.value)); for (size_t i = 0; i < suggestions.size(); i++) { suggestions[i].frontend_id = MakeFrontendID(suggestions[i].backend_id, std::string());
diff --git a/components/autofill/core/browser/autofill_manager_unittest.cc b/components/autofill/core/browser/autofill_manager_unittest.cc index 7d3b09b..cf5e328 100644 --- a/components/autofill/core/browser/autofill_manager_unittest.cc +++ b/components/autofill/core/browser/autofill_manager_unittest.cc
@@ -1312,7 +1312,7 @@ // Test that we return all credit card profile suggestions when all form fields // are empty. -TEST_F(AutofillManagerTest, GetCreditCardSuggestionsEmptyValue) { +TEST_F(AutofillManagerTest, GetCreditCardSuggestions_EmptyValue) { // Set up our form data. FormData form; CreateTestCreditCardFormData(&form, true, false); @@ -1335,6 +1335,86 @@ "10/14", kMasterCard, autofill_manager_->GetPackedCreditCardID(5))); } +// Test that we return all credit card profile suggestions when the triggering +// field has whitespace in it. +TEST_F(AutofillManagerTest, GetCreditCardSuggestions_Whitespace) { + // Set up our form data. + FormData form; + CreateTestCreditCardFormData(&form, true, false); + std::vector<FormData> forms(1, form); + FormsSeen(forms); + + FormFieldData field = form.fields[1]; + field.value = ASCIIToUTF16(" "); + GetAutofillSuggestions(form, field); + + // Test that we sent the right values to the external delegate. + external_delegate_->CheckSuggestions( + kDefaultPageID, Suggestion("Visa\xC2\xA0\xE2\x8B\xAF" + "3456", + "04/12", kVisaCard, + autofill_manager_->GetPackedCreditCardID(4)), + Suggestion("MasterCard\xC2\xA0\xE2\x8B\xAF" + "8765", + "10/14", kMasterCard, + autofill_manager_->GetPackedCreditCardID(5))); +} + +// Test that we return all credit card profile suggestions when the triggering +// field has stop characters in it, which should be removed. +TEST_F(AutofillManagerTest, GetCreditCardSuggestions_StopCharsOnly) { + // Set up our form data. + FormData form; + CreateTestCreditCardFormData(&form, true, false); + std::vector<FormData> forms(1, form); + FormsSeen(forms); + + FormFieldData field = form.fields[1]; + field.value = ASCIIToUTF16("____-____-____-____"); + GetAutofillSuggestions(form, field); + + // Test that we sent the right values to the external delegate. + external_delegate_->CheckSuggestions( + kDefaultPageID, Suggestion("Visa\xC2\xA0\xE2\x8B\xAF" + "3456", + "04/12", kVisaCard, + autofill_manager_->GetPackedCreditCardID(4)), + Suggestion("MasterCard\xC2\xA0\xE2\x8B\xAF" + "8765", + "10/14", kMasterCard, + autofill_manager_->GetPackedCreditCardID(5))); +} + +// Test that we return all credit card profile suggestions when the triggering +// field has stop characters in it and some input. +TEST_F(AutofillManagerTest, GetCreditCardSuggestions_StopCharsWithInput) { + // Add a credit card with particular numbers that we will attempt to recall. + CreditCard* credit_card = new CreditCard; + test::SetCreditCardInfo(credit_card, "John Smith", + "5255667890123123", // Mastercard + "08", "2017"); + credit_card->set_guid("00000000-0000-0000-0000-000000000007"); + autofill_manager_->AddCreditCard(credit_card); + + // Set up our form data. + FormData form; + CreateTestCreditCardFormData(&form, true, false); + std::vector<FormData> forms(1, form); + FormsSeen(forms); + + FormFieldData field = form.fields[1]; + + field.value = ASCIIToUTF16("5255-66__-____-____"); + GetAutofillSuggestions(form, field); + + // Test that we sent the right value to the external delegate. + external_delegate_->CheckSuggestions( + kDefaultPageID, Suggestion("MasterCard\xC2\xA0\xE2\x8B\xAF" + "3123", + "08/17", kMasterCard, + autofill_manager_->GetPackedCreditCardID(7))); +} + // Test that we return only matching credit card profile suggestions when the // selected form field has been partially filled out. TEST_F(AutofillManagerTest, GetCreditCardSuggestionsMatchCharacter) {
diff --git a/components/autofill/core/browser/form_field.cc b/components/autofill/core/browser/form_field.cc index 50d7e8a3..fd43fc1 100644 --- a/components/autofill/core/browser/form_field.cc +++ b/components/autofill/core/browser/form_field.cc
@@ -185,7 +185,7 @@ } if ((match_type & FormField::MATCH_NAME) && - MatchesPattern(field->name, pattern)) { + MatchesPattern(field->parseable_name(), pattern)) { return true; }
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc index 73aeb1a6..feb1ddc 100644 --- a/components/autofill/core/browser/form_structure.cc +++ b/components/autofill/core/browser/form_structure.cc
@@ -6,6 +6,7 @@ #include <stdint.h> +#include <algorithm> #include <map> #include <utility> @@ -48,6 +49,14 @@ // mismatches exceeds this threshold. const int kNumberOfMismatchesThreshold = 3; +// Only removing common name prefixes if we have a minimum number of fields and +// a minimum prefix length. These values are chosen to avoid cases such as two +// fields with "address1" and "address2" and be effective against web frameworks +// which prepend prefixes such as "ctl01$ctl00$MainContentRegion$" on all +// fields. +const int kCommonNamePrefixRemovalFieldThreshold = 3; +const int kMinCommonNamePrefixLength = 10; + // Maximum number of characters in the field label to be encoded in a proto. const int kMaxFieldLabelNumChars = 200; @@ -319,6 +328,9 @@ base::SizeTToString16(++unique_names[field.name]); fields_.push_back(new AutofillField(field, unique_name)); } + + // Do further processing on the fields, as needed. + ProcessExtractedFields(); } FormStructure::~FormStructure() {} @@ -1241,4 +1253,47 @@ return field.is_checkable; } +void FormStructure::ProcessExtractedFields() { + // Update the field name parsed by heuristics if several criteria are met. + // Several fields must be present in the form. + if (field_count() < kCommonNamePrefixRemovalFieldThreshold) + return; + + // Find the longest common prefix within all the field names. + std::vector<base::string16> names; + names.reserve(field_count()); + for (const AutofillField* field : *this) + names.push_back(field->name); + + base::StringPiece16 longest_prefix = FindLongestCommonPrefix(names); + if (longest_prefix.size() < kMinCommonNamePrefixLength) + return; + + // The name without the prefix will be used for heuristics parsing. + for (AutofillField* field : *this) { + field->set_parseable_name( + field->name.substr(longest_prefix.size(), field->name.size())); + } +} + +// static +base::StringPiece16 FormStructure::FindLongestCommonPrefix( + const std::vector<base::string16>& strings) { + if (strings.empty()) + return base::StringPiece16(); + + // Go through each character of the first string until there is a mismatch at + // the same position in any other string. Adapted from http://goo.gl/YGukMM. + for (size_t prefix_len = 0; prefix_len < strings[0].size(); prefix_len++) { + for (size_t i = 1; i < strings.size(); i++) { + if (prefix_len >= strings[i].size() || + strings[i].at(prefix_len) != strings[0].at(prefix_len)) { + // Mismatch found. + return base::StringPiece16(strings[i].data(), prefix_len); + } + } + } + return strings[0]; +} + } // namespace autofill
diff --git a/components/autofill/core/browser/form_structure.h b/components/autofill/core/browser/form_structure.h index 9f86d56..1a14f8d 100644 --- a/components/autofill/core/browser/form_structure.h +++ b/components/autofill/core/browser/form_structure.h
@@ -17,6 +17,7 @@ #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "base/strings/string16.h" +#include "base/strings/string_piece.h" #include "components/autofill/core/browser/autofill_field.h" #include "components/autofill/core/browser/autofill_type.h" #include "components/autofill/core/browser/field_types.h" @@ -215,6 +216,7 @@ private: friend class FormStructureTest; FRIEND_TEST_ALL_PREFIXES(AutofillDownloadTest, QueryAndUploadTest); + FRIEND_TEST_ALL_PREFIXES(FormStructureTest, FindLongestCommonPrefix); // Encodes information about this form and its fields into |query_form|. void EncodeFormForQuery( @@ -243,6 +245,15 @@ // Returns true if field should be skipped when talking to Autofill server. bool ShouldSkipField(const FormFieldData& field) const; + // Further processes the extracted |fields_|. + void ProcessExtractedFields(); + + // Returns the longest common prefix found within |strings|. IMPORTANT: the + // returned StringPiece16 is a view into |strings| and the latter must remain + // valid while the StringPiece16 is used. + static base::StringPiece16 FindLongestCommonPrefix( + const std::vector<base::string16>& strings); + // The name of the form. base::string16 form_name_;
diff --git a/components/autofill/core/browser/form_structure_unittest.cc b/components/autofill/core/browser/form_structure_unittest.cc index 24a2e85..424a3341 100644 --- a/components/autofill/core/browser/form_structure_unittest.cc +++ b/components/autofill/core/browser/form_structure_unittest.cc
@@ -445,6 +445,90 @@ EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type()); } +// All fields share a common prefix which could confuse the heuristics. Test +// that the common prefix is stripped out before running heuristics. +TEST_F(FormStructureTest, StripCommonNamePrefix) { + FormData form; + FormFieldData field; + field.form_control_type = "text"; + + field.label = ASCIIToUTF16("First Name"); + field.name = ASCIIToUTF16("ctl01$ctl00$ShippingAddressCreditPhone$firstname"); + form.fields.push_back(field); + + field.label = ASCIIToUTF16("Last Name"); + field.name = ASCIIToUTF16("ctl01$ctl00$ShippingAddressCreditPhone$lastname"); + form.fields.push_back(field); + + field.label = ASCIIToUTF16("Email"); + field.name = ASCIIToUTF16("ctl01$ctl00$ShippingAddressCreditPhone$email"); + form.fields.push_back(field); + + field.label = ASCIIToUTF16("Phone"); + field.name = ASCIIToUTF16("ctl01$ctl00$ShippingAddressCreditPhone$phone"); + form.fields.push_back(field); + + field.label = base::string16(); + field.name = ASCIIToUTF16("ctl01$ctl00$ShippingAddressCreditPhone$submit"); + field.form_control_type = "submit"; + form.fields.push_back(field); + + scoped_ptr<FormStructure> form_structure(new FormStructure(form)); + form_structure->DetermineHeuristicTypes(); + EXPECT_TRUE(form_structure->IsAutofillable()); + + // Expect the correct number of fields. + ASSERT_EQ(5U, form_structure->field_count()); + ASSERT_EQ(4U, form_structure->autofill_count()); + + // First name. + EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); + // Last name. + EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type()); + // Email. + EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type()); + // Phone. + EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, + form_structure->field(3)->heuristic_type()); + // Submit. + EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(4)->heuristic_type()); +} + +// All fields share a common prefix which is small enough that it is not +// stripped from the name before running the heuristics. +TEST_F(FormStructureTest, StripCommonNamePrefix_SmallPrefix) { + FormData form; + FormFieldData field; + field.form_control_type = "text"; + + field.label = ASCIIToUTF16("Address 1"); + field.name = ASCIIToUTF16("address1"); + form.fields.push_back(field); + + field.label = ASCIIToUTF16("Address 2"); + field.name = ASCIIToUTF16("address2"); + form.fields.push_back(field); + + field.label = ASCIIToUTF16("Address 3"); + field.name = ASCIIToUTF16("address3"); + form.fields.push_back(field); + + scoped_ptr<FormStructure> form_structure(new FormStructure(form)); + form_structure->DetermineHeuristicTypes(); + EXPECT_TRUE(form_structure->IsAutofillable()); + + // Expect the correct number of fields. + ASSERT_EQ(3U, form_structure->field_count()); + ASSERT_EQ(3U, form_structure->autofill_count()); + + // Address 1. + EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type()); + // Address 2. + EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); + // Address 3 + EXPECT_EQ(ADDRESS_HOME_LINE3, form_structure->field(2)->heuristic_type()); +} + // Verify that we can correctly process the 'autocomplete' attribute for phone // number types (especially phone prefixes and suffixes). TEST_F(FormStructureTest, HeuristicsAutocompleteAttributePhoneTypes) { @@ -2238,7 +2322,7 @@ std::vector<ServerFieldTypeSet> possible_field_types; FormData form; // Setting the form name which we expect to see in the upload. - form.name = base::ASCIIToUTF16("myform"); + form.name = ASCIIToUTF16("myform"); form_structure.reset(new FormStructure(form)); form_structure->DetermineHeuristicTypes(); @@ -3319,4 +3403,42 @@ EXPECT_EQ(76, forms[0]->field(1)->server_type()); } +TEST_F(FormStructureTest, FindLongestCommonPrefix) { + // Normal case. + std::vector<base::string16> strings; + strings.push_back(ASCIIToUTF16("123456789")); + strings.push_back(ASCIIToUTF16("12345678")); + strings.push_back(ASCIIToUTF16("123456")); + strings.push_back(ASCIIToUTF16("1234567")); + base::StringPiece16 prefix = FormStructure::FindLongestCommonPrefix(strings); + EXPECT_EQ(ASCIIToUTF16("123456"), prefix.as_string()); + + // Handles no common prefix. + strings.clear(); + strings.push_back(ASCIIToUTF16("123")); + strings.push_back(ASCIIToUTF16("456")); + strings.push_back(ASCIIToUTF16("789")); + prefix = FormStructure::FindLongestCommonPrefix(strings); + EXPECT_EQ(ASCIIToUTF16(""), prefix.as_string()); + + // Empty strings in the mix. + strings.clear(); + strings.push_back(ASCIIToUTF16("123456789")); + strings.push_back(ASCIIToUTF16("")); + strings.push_back(ASCIIToUTF16("12345678")); + prefix = FormStructure::FindLongestCommonPrefix(strings); + EXPECT_EQ(ASCIIToUTF16(""), prefix.as_string()); + + // Only one string. + strings.clear(); + strings.push_back(ASCIIToUTF16("123456789")); + prefix = FormStructure::FindLongestCommonPrefix(strings); + EXPECT_EQ(ASCIIToUTF16("123456789"), prefix.as_string()); + + // Empty vector. + strings.clear(); + prefix = FormStructure::FindLongestCommonPrefix(strings); + EXPECT_EQ(ASCIIToUTF16(""), prefix.as_string()); +} + } // namespace autofill
diff --git a/components/autofill_strings.grdp b/components/autofill_strings.grdp index 34371d1..2f91af8 100644 --- a/components/autofill_strings.grdp +++ b/components/autofill_strings.grdp
@@ -132,14 +132,18 @@ Privacy Policy </message> + <message name="IDS_AUTOFILL_OPTIONS_POPUP" desc="The text displayed in the Autofill popup to direct the user to the Autofill settings UI."> + Manage My Info + </message> + <if expr="_google_chrome"> - <message name="IDS_AUTOFILL_OPTIONS_POPUP" desc="The text displayed in the Autofill popup to direct the user to the Autofill settings UI."> - Chrome Autofill settings... + <message name="IDS_AUTOFILL_OPTIONS_POPUP_LABEL" desc="The label of the text displayed in the Autofill popup to direct the user to the Autofill settings UI."> + Chrome </message> </if> <if expr="not _google_chrome"> - <message name="IDS_AUTOFILL_OPTIONS_POPUP" desc="The text displayed in the Autofill popup to direct the user to the Autofill settings UI."> - Chromium Autofill settings... + <message name="IDS_AUTOFILL_OPTIONS_POPUP_LABEL" desc="The label of the text displayed in the Autofill popup to direct the user to the Autofill settings UI."> + Chromium </message> </if> <message name="IDS_AUTOFILL_OPTIONS_CONTENT_DESCRIPTION" desc="The text verbalised by a screen reader for the button that directs the user to the Autofill settings UI. This string is not displayed.">
diff --git a/components/browser_sync/browser/profile_sync_service.cc b/components/browser_sync/browser/profile_sync_service.cc index 0a5237e8..3ecd19c 100644 --- a/components/browser_sync/browser/profile_sync_service.cc +++ b/components/browser_sync/browser/profile_sync_service.cc
@@ -1379,7 +1379,8 @@ if (!startup_controller_->auto_start_enabled()) { SigninManager* signin_manager = static_cast<SigninManager*>(signin_->GetOriginal()); - signin_manager->SignOut(signin_metrics::SERVER_FORCED_DISABLE); + signin_manager->SignOut(signin_metrics::SERVER_FORCED_DISABLE, + signin_metrics::SignoutDelete::IGNORE_METRIC); } #endif break;
diff --git a/components/browser_sync/browser/profile_sync_service_unittest.cc b/components/browser_sync/browser/profile_sync_service_unittest.cc index 81e746c9..e587ef8 100644 --- a/components/browser_sync/browser/profile_sync_service_unittest.cc +++ b/components/browser_sync/browser/profile_sync_service_unittest.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include <utility> +#include <vector> #include "base/callback.h" #include "base/command_line.h" @@ -340,7 +341,8 @@ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) void CreateServiceWithoutSignIn() { CreateService(browser_sync::AUTO_START); - signin_manager_->SignOut(signin_metrics::SIGNOUT_TEST); + signin_manager_->SignOut(signin_metrics::SIGNOUT_TEST, + signin_metrics::SignoutDelete::IGNORE_METRIC); } #endif @@ -434,10 +436,12 @@ AccountTrackerService* account_tracker() { return account_tracker_.get(); } #if defined(OS_CHROMEOS) - SigninManagerBase* signin_manager() { + SigninManagerBase* signin_manager() #else - SigninManager* signin_manager() { + SigninManager* signin_manager() #endif + // Opening brace is outside of macro to avoid confusing lint. + { return signin_manager_.get(); } @@ -632,7 +636,8 @@ EXPECT_TRUE(service()->IsSyncActive()); EXPECT_FALSE(prefs()->GetBoolean(sync_driver::prefs::kSyncSuppressStart)); - signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST); + signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST, + signin_metrics::SignoutDelete::IGNORE_METRIC); EXPECT_FALSE(service()->IsSyncActive()); } #endif // !defined(OS_CHROMEOS) @@ -717,7 +722,8 @@ base::RunLoop().RunUntilIdle(); EXPECT_FALSE(service()->GetAccessTokenForTest().empty()); - signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST); + signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST, + signin_metrics::SignoutDelete::IGNORE_METRIC); EXPECT_TRUE(service()->GetAccessTokenForTest().empty()); } #endif
diff --git a/components/component_updater/component_updater_url_constants.cc b/components/component_updater/component_updater_url_constants.cc index 7c78f64b..3cb8ef1 100644 --- a/components/component_updater/component_updater_url_constants.cc +++ b/components/component_updater/component_updater_url_constants.cc
@@ -6,9 +6,6 @@ namespace component_updater { -// The alternative URL for the v3 protocol service endpoint. -const char kUpdaterAltUrl[] = "http://clients2.google.com/service/update2"; - // The default URL for the v3 protocol service endpoint. In some cases, the // component updater is allowed to fall back to and alternate URL source, if // the request to the default URL source fails.
diff --git a/components/component_updater/component_updater_url_constants.h b/components/component_updater/component_updater_url_constants.h index 6f83a4d..3195dd8 100644 --- a/components/component_updater/component_updater_url_constants.h +++ b/components/component_updater/component_updater_url_constants.h
@@ -7,7 +7,6 @@ namespace component_updater { -extern const char kUpdaterAltUrl[]; extern const char kUpdaterDefaultUrl[]; } // namespace component_updater
diff --git a/components/component_updater/configurator_impl.cc b/components/component_updater/configurator_impl.cc index 407da85..be529131 100644 --- a/components/component_updater/configurator_impl.cc +++ b/components/component_updater/configurator_impl.cc
@@ -59,19 +59,6 @@ return (std::find(vec.begin(), vec.end(), test) != vec.end()); } -// Returns true if falling back on an alternate, unsafe, service URL is -// allowed. In the fallback case, the security of the component update relies -// only on the integrity of the CRX payloads, which is self-validating. -// This is allowed only for some of the pre-Windows Vista versions not including -// Windows XP SP3. As a side note, pings could be sent to the alternate URL too. -bool CanUseAltUrlSource() { -#if defined(OS_WIN) - return !base::win::MaybeHasSHA256Support(); -#else - return false; -#endif // OS_WIN -} - // If there is an element of |vec| of the form |test|=.*, returns the right- // hand side of that assignment. Otherwise, returns an empty string. // The right-hand side may contain additional '=' characters, allowing for @@ -101,8 +88,7 @@ fast_update_(false), pings_enabled_(false), deltas_enabled_(false), - background_downloads_enabled_(false), - fallback_to_alt_source_url_enabled_(false) { + background_downloads_enabled_(false) { // Parse comma-delimited debug flags. std::vector<std::string> switch_values = base::SplitString( cmdline->GetSwitchValueASCII(switches::kComponentUpdater), ",", @@ -127,8 +113,6 @@ if (HasSwitchValue(switch_values, kSwitchRequestParam)) extra_info_ += "testrequest=\"1\""; - - fallback_to_alt_source_url_enabled_ = CanUseAltUrlSource(); } ConfiguratorImpl::~ConfiguratorImpl() {} @@ -159,9 +143,6 @@ urls.push_back(GURL(url_source_override_)); } else { urls.push_back(GURL(kUpdaterDefaultUrl)); - if (fallback_to_alt_source_url_enabled_) { - urls.push_back(GURL(kUpdaterAltUrl)); - } } return urls; } @@ -194,8 +175,4 @@ return background_downloads_enabled_; } -void ConfiguratorImpl::set_enable_alt_source_url(bool enable_alt_source_url) { - fallback_to_alt_source_url_enabled_ = enable_alt_source_url; -} - } // namespace component_updater
diff --git a/components/component_updater/configurator_impl.h b/components/component_updater/configurator_impl.h index b2e75a9..959a9b1 100644 --- a/components/component_updater/configurator_impl.h +++ b/components/component_updater/configurator_impl.h
@@ -77,11 +77,6 @@ // non on-demand components. bool UseBackgroundDownloader() const; - // Setting this to false means that we'll only use secure transport (eg https) - // for update/ping urls. This is already false by default everywhere but older - // versions of Windows XP. - void set_enable_alt_source_url(bool enable_alt_source_url); - private: net::URLRequestContextGetter* url_request_getter_; std::string extra_info_; @@ -90,7 +85,6 @@ bool pings_enabled_; bool deltas_enabled_; bool background_downloads_enabled_; - bool fallback_to_alt_source_url_enabled_; DISALLOW_COPY_AND_ASSIGN(ConfiguratorImpl); };
diff --git a/components/component_updater/default_component_installer.cc b/components/component_updater/default_component_installer.cc index 9e3f34a..659da95 100644 --- a/components/component_updater/default_component_installer.cc +++ b/components/component_updater/default_component_installer.cc
@@ -118,7 +118,7 @@ bool DefaultComponentInstaller::GetInstalledFile( const std::string& file, base::FilePath* installed_file) { - if (current_version_.Equals(base::Version(kNullVersion))) + if (current_version_ == base::Version(kNullVersion)) return false; // No component has been installed yet. *installed_file = installer_traits_->GetBaseDirectory()
diff --git a/components/components_unittests_apk.isolate b/components/components_unittests_apk.isolate index 14a3401..e21059f 100644 --- a/components/components_unittests_apk.isolate +++ b/components/components_unittests_apk.isolate
@@ -9,6 +9,7 @@ 'variables': { 'command': [ '<(PRODUCT_DIR)/bin/run_components_unittests', + '--logcat-output-dir', '${ISOLATED_OUTDIR}/logcats', ], 'files': [ '../base/base.isolate',
diff --git a/components/crash.gypi b/components/crash.gypi index 00ee69c..2e5cf24 100644 --- a/components/crash.gypi +++ b/components/crash.gypi
@@ -139,6 +139,7 @@ ], 'dependencies': [ 'crash_component_lib', + 'crash_core_common', '../base/base.gyp:base', ], 'defines': ['CRASH_IMPLEMENTATION'],
diff --git a/components/crash/content/app/breakpad_linux.cc b/components/crash/content/app/breakpad_linux.cc index 3435f04..aab3a98 100644 --- a/components/crash/content/app/breakpad_linux.cc +++ b/components/crash/content/app/breakpad_linux.cc
@@ -37,6 +37,7 @@ #include "base/posix/eintr_wrapper.h" #include "base/posix/global_descriptors.h" #include "base/process/memory.h" +#include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/threading/thread_checker.h" #include "breakpad/src/client/linux/crash_generation/crash_generation_client.h" @@ -223,11 +224,37 @@ return len; } -void SetClientIdFromCommandLine(const base::CommandLine& command_line) { - // Get the guid from the command line switch. +bool GetEnableCrashReporterSwitchParts(const base::CommandLine& command_line, + std::vector<std::string>* switch_parts) { std::string switch_value = command_line.GetSwitchValueASCII(switches::kEnableCrashReporter); - GetCrashReporterClient()->SetCrashReporterClientIdFromGUID(switch_value); + std::vector<std::string> parts = base::SplitString(switch_value, + ",", + base::KEEP_WHITESPACE, + base::SPLIT_WANT_ALL); + if (parts.size() != 2) + return false; + + *switch_parts = parts; + return true; +} + +#if !defined(OS_ANDROID) +void SetChannelFromCommandLine(const base::CommandLine& command_line) { + std::vector<std::string> switch_parts; + if (!GetEnableCrashReporterSwitchParts(command_line, &switch_parts)) + return; + + base::debug::SetCrashKeyValue(crash_keys::kChannel, switch_parts[1]); +} +#endif + +void SetClientIdFromCommandLine(const base::CommandLine& command_line) { + std::vector<std::string> switch_parts; + if (!GetEnableCrashReporterSwitchParts(command_line, &switch_parts)) + return; + + GetCrashReporterClient()->SetCrashReporterClientIdFromGUID(switch_parts[0]); } // MIME substrings. @@ -1827,7 +1854,9 @@ // simplicity. if (!parsed_command_line.HasSwitch(switches::kEnableCrashReporter)) return; + InitCrashKeys(); + SetChannelFromCommandLine(parsed_command_line); SetClientIdFromCommandLine(parsed_command_line); EnableNonBrowserCrashDumping(); VLOG(1) << "Non Browser crash dumping enabled for: " << process_type;
diff --git a/components/cronet/android/api/src/org/chromium/net/CronetEngine.java b/components/cronet/android/api/src/org/chromium/net/CronetEngine.java index 63365334..0ede759 100644 --- a/components/cronet/android/api/src/org/chromium/net/CronetEngine.java +++ b/components/cronet/android/api/src/org/chromium/net/CronetEngine.java
@@ -41,6 +41,21 @@ * then {@link #build} is called to create the {@code CronetEngine}. */ public static class Builder { + /** + * A class which provides a method for loading the cronet native library. Apps needing to + * implement custom library loading logic can inherit from this class and pass an instance + * to {@link CronetEngine.Builder#setLibraryLoader}. For example, this might be required + * to work around {@code UnsatisfiedLinkError}s caused by flaky installation on certain + * older devices. + */ + public abstract static class LibraryLoader { + /** + * Loads the native library. + * @param libName name of the library to load + */ + public abstract void loadLibrary(String libName); + } + // A hint that a host supports QUIC. static class QuicHint { // The host. @@ -86,6 +101,7 @@ private String mUserAgent; private String mStoragePath; private boolean mLegacyModeEnabled; + private LibraryLoader mLibraryLoader; private String mLibraryName; private boolean mQuicEnabled; private boolean mHttp2Enabled; @@ -187,8 +203,22 @@ return this; } - String libraryName() { - return mLibraryName; + /** + * Sets a {@link LibraryLoader} to be used to load the native library. + * If not set, the library will be loaded using {@link System#loadLibrary}. + * @return the builder to facilitate chaining. + */ + public Builder setLibraryLoader(LibraryLoader loader) { + mLibraryLoader = loader; + return this; + } + + void loadLibrary() { + if (mLibraryLoader == null) { + System.loadLibrary(mLibraryName); + } else { + mLibraryLoader.loadLibrary(mLibraryName); + } } /**
diff --git a/components/cronet/android/cronet_url_request_context_adapter.cc b/components/cronet/android/cronet_url_request_context_adapter.cc index d6106afd..ef1fde0 100644 --- a/components/cronet/android/cronet_url_request_context_adapter.cc +++ b/components/cronet/android/cronet_url_request_context_adapter.cc
@@ -21,6 +21,7 @@ #include "base/memory/scoped_vector.h" #include "base/message_loop/message_loop.h" #include "base/metrics/statistics_recorder.h" +#include "base/prefs/pref_change_registrar.h" #include "base/prefs/pref_filter.h" #include "base/prefs/pref_registry_simple.h" #include "base/prefs/pref_service.h" @@ -55,6 +56,44 @@ const char kHttpServerProperties[] = "net.http_server_properties"; +// Connects the HttpServerPropertiesManager's storage to the prefs. +class PrefServiceAdapter + : public net::HttpServerPropertiesManager::PrefDelegate { + public: + explicit PrefServiceAdapter(PrefService* pref_service) + : pref_service_(pref_service), path_(kHttpServerProperties) { + pref_change_registrar_.Init(pref_service_); + } + + ~PrefServiceAdapter() override {} + + // PrefDelegate implementation. + bool HasServerProperties() override { + return pref_service_->HasPrefPath(path_); + } + const base::DictionaryValue& GetServerProperties() const override { + // Guaranteed not to return null when the pref is registered + // (RegisterProfilePrefs was called). + return *pref_service_->GetDictionary(path_); + } + void SetServerProperties(const base::DictionaryValue& value) override { + return pref_service_->Set(path_, value); + } + void StartListeningForUpdates(const base::Closure& callback) override { + pref_change_registrar_.Add(path_, callback); + } + void StopListeningForUpdates() override { + pref_change_registrar_.RemoveAll(); + } + + private: + PrefService* pref_service_; + std::string path_; + PrefChangeRegistrar pref_change_registrar_; + + DISALLOW_COPY_AND_ASSIGN(PrefServiceAdapter); +}; + class BasicNetworkDelegate : public net::NetworkDelegateImpl { public: BasicNetworkDelegate() {} @@ -313,9 +352,9 @@ pref_service_ = factory.Create(registry.get()); scoped_ptr<net::HttpServerPropertiesManager> http_server_properties_manager( - new net::HttpServerPropertiesManager(pref_service_.get(), - kHttpServerProperties, - GetNetworkTaskRunner())); + new net::HttpServerPropertiesManager( + new PrefServiceAdapter(pref_service_.get()), + GetNetworkTaskRunner())); http_server_properties_manager->InitializeOnNetworkThread(); http_server_properties_manager_ = http_server_properties_manager.get(); context_builder.SetHttpServerProperties(
diff --git a/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java b/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java index e51334e..e5db0b42 100644 --- a/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java +++ b/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java
@@ -32,7 +32,7 @@ if (sInitTaskPosted) { return; } - System.loadLibrary(builder.libraryName()); + builder.loadLibrary(); if (!Version.CRONET_VERSION.equals(nativeGetCronetVersion())) { throw new RuntimeException(String.format( "Expected Cronet version number %s, " @@ -74,7 +74,7 @@ nativeCronetInitOnMainThread(); } - // Native methods are implemented in cronet_loader.cc. + // Native methods are implemented in cronet_library_loader.cc. private static native void nativeCronetInitOnMainThread(); private static native String nativeGetCronetVersion(); }
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java index ce07d6b..195eafcb 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java
@@ -960,4 +960,35 @@ // Verifies that CronetEngine.Builder config from testCronetEngineBuilderConfig() is properly // translated to a native UrlRequestContextConfig. private static native void nativeVerifyUrlRequestContextConfig(long config, String storagePath); + + private static class TestBadLibraryLoader extends CronetEngine.Builder.LibraryLoader { + private boolean mWasCalled = false; + + public void loadLibrary(String libName) { + // Report that this method was called, but don't load the library + mWasCalled = true; + } + + boolean wasCalled() { + return mWasCalled; + } + } + + @SmallTest + @Feature({"Cronet"}) + public void testSkipLibraryLoading() throws Exception { + CronetEngine.Builder builder = new CronetEngine.Builder(getContext()); + TestBadLibraryLoader loader = new TestBadLibraryLoader(); + builder.setLibraryLoader(loader).setLibraryName("cronet_tests"); + try { + // ensureInitialized() calls native code to check the version right after library load + // and will error with the message below if library loading was skipped + CronetLibraryLoader.ensureInitialized(getContext(), builder); + fail("Native library should not be loaded"); + } catch (UnsatisfiedLinkError e) { + assertTrue(e.getMessage().contains( + "No implementation found for java.lang.String org.chromium.net")); + assertTrue(loader.wasCalled()); + } + } }
diff --git a/components/drive.gypi b/components/drive.gypi index 781f546..c97397c 100644 --- a/components/drive.gypi +++ b/components/drive.gypi
@@ -27,13 +27,6 @@ '../third_party/re2/re2.gyp:re2', ], 'sources': [ - 'drive/change_list_loader.cc', - 'drive/change_list_loader.h', - 'drive/change_list_loader_observer.h', - 'drive/change_list_processor.cc', - 'drive/change_list_processor.h', - 'drive/directory_loader.cc', - 'drive/directory_loader.h', 'drive/drive_api_util.cc', 'drive/drive_api_util.h', 'drive/drive_app_registry.cc', @@ -48,14 +41,65 @@ 'drive/drive_uploader.h', 'drive/event_logger.cc', 'drive/event_logger.h', - 'drive/file_cache.cc', - 'drive/file_cache.h', 'drive/file_change.cc', 'drive/file_change.h', 'drive/file_errors.cc', 'drive/file_errors.h', + 'drive/file_system_core_util.cc', + 'drive/file_system_core_util.h', + 'drive/file_system_metadata.cc', + 'drive/file_system_metadata.h', + 'drive/file_write_watcher.cc', + 'drive/file_write_watcher.h', + 'drive/job_list.cc', + 'drive/job_list.h', + 'drive/job_queue.cc', + 'drive/job_queue.h', + 'drive/job_scheduler.cc', + 'drive/job_scheduler.h', + 'drive/local_file_reader.cc', + 'drive/local_file_reader.h', + 'drive/resource_entry_conversion.cc', + 'drive/resource_entry_conversion.h', + 'drive/resource_metadata_storage.cc', + 'drive/resource_metadata_storage.h', + 'drive/service/drive_api_service.cc', + 'drive/service/drive_api_service.h', + 'drive/service/drive_service_interface.cc', + 'drive/service/drive_service_interface.h', + ], + }, + + { + # GN version: //components/drive:drive_chromeos + 'target_name': 'drive_chromeos', + 'type': 'static_library', + 'include_dirs': [ + '..', + ], + 'dependencies': [ + 'drive', + 'drive_proto', + '../base/base.gyp:base', + '../google_apis/google_apis.gyp:google_apis', + '../net/net.gyp:net', + ], + # TODO(yawano): move these files under components/drive/chromeos. + 'sources': [ + 'drive/change_list_loader.cc', + 'drive/change_list_loader.h', + 'drive/change_list_loader_observer.h', + 'drive/change_list_processor.cc', + 'drive/change_list_processor.h', + 'drive/directory_loader.cc', + 'drive/directory_loader.h', + 'drive/file_cache.cc', + 'drive/file_cache.h', 'drive/file_system.cc', 'drive/file_system.h', + 'drive/file_system_interface.cc', + 'drive/file_system_interface.h', + 'drive/file_system_observer.h', 'drive/file_system/copy_operation.cc', 'drive/file_system/copy_operation.h', 'drive/file_system/create_directory_operation.cc', @@ -82,45 +126,20 @@ 'drive/file_system/touch_operation.h', 'drive/file_system/truncate_operation.cc', 'drive/file_system/truncate_operation.h', - 'drive/file_system_core_util.cc', - 'drive/file_system_core_util.h', - 'drive/file_system_interface.cc', - 'drive/file_system_interface.h', - 'drive/file_system_metadata.cc', - 'drive/file_system_metadata.h', - 'drive/file_system_observer.h', - 'drive/file_write_watcher.cc', - 'drive/file_write_watcher.h', - 'drive/job_list.cc', - 'drive/job_list.h', - 'drive/job_queue.cc', - 'drive/job_queue.h', - 'drive/job_scheduler.cc', - 'drive/job_scheduler.h', - 'drive/local_file_reader.cc', - 'drive/local_file_reader.h', 'drive/remove_stale_cache_files.cc', 'drive/remove_stale_cache_files.h', - 'drive/resource_entry_conversion.cc', - 'drive/resource_entry_conversion.h', 'drive/resource_metadata.cc', 'drive/resource_metadata.h', - 'drive/resource_metadata_storage.cc', - 'drive/resource_metadata_storage.h', 'drive/search_metadata.cc', 'drive/search_metadata.h', - 'drive/service/drive_api_service.cc', - 'drive/service/drive_api_service.h', - 'drive/service/drive_service_interface.cc', - 'drive/service/drive_service_interface.h', + 'drive/sync_client.cc', + 'drive/sync_client.h', 'drive/sync/entry_revert_performer.cc', 'drive/sync/entry_revert_performer.h', 'drive/sync/entry_update_performer.cc', 'drive/sync/entry_update_performer.h', 'drive/sync/remove_performer.cc', 'drive/sync/remove_performer.h', - 'drive/sync_client.cc', - 'drive/sync_client.h', ], }, @@ -153,14 +172,6 @@ '../net/net.gyp:net', ], 'sources': [ - "drive/drive_test_util.cc", - "drive/drive_test_util.h", - "drive/dummy_file_system.cc", - "drive/dummy_file_system.h", - "drive/fake_file_system.cc", - "drive/fake_file_system.h", - "drive/fake_free_disk_space_getter.cc", - "drive/fake_free_disk_space_getter.h", "drive/service/dummy_drive_service.cc", "drive/service/dummy_drive_service.h", "drive/service/fake_drive_service.cc", @@ -170,6 +181,32 @@ ], }, + { + # GN version: //components/drive:test_support_chromeos + 'target_name': 'drive_test_support_chromeos', + 'type': 'static_library', + 'include_dirs': [ + '..', + ], + 'dependencies': [ + 'drive', + 'drive_chromeos', + 'drive_proto', + '../base/base.gyp:base', + '../content/content_shell_and_tests.gyp:test_support_content', + ], + 'sources': [ + "drive/drive_test_util.cc", + "drive/drive_test_util.h", + "drive/dummy_file_system.cc", + "drive/dummy_file_system.h", + "drive/fake_file_system.cc", + "drive/fake_file_system.h", + "drive/fake_free_disk_space_getter.cc", + "drive/fake_free_disk_space_getter.h", + ] + } + # TODO(lukasza): drive_unittests target. # Currently tests are built as part of chrome/chrome_tests_unit.gypi. ],
diff --git a/components/drive/BUILD.gn b/components/drive/BUILD.gn index c1957fb..273027f 100644 --- a/components/drive/BUILD.gn +++ b/components/drive/BUILD.gn
@@ -6,13 +6,6 @@ source_set("drive") { sources = [ - "change_list_loader.cc", - "change_list_loader.h", - "change_list_loader_observer.h", - "change_list_processor.cc", - "change_list_processor.h", - "directory_loader.cc", - "directory_loader.h", "drive_api_util.cc", "drive_api_util.h", "drive_app_registry.cc", @@ -27,12 +20,65 @@ "drive_uploader.h", "event_logger.cc", "event_logger.h", - "file_cache.cc", - "file_cache.h", "file_change.cc", "file_change.h", "file_errors.cc", "file_errors.h", + "file_system_core_util.cc", + "file_system_core_util.h", + "file_system_metadata.cc", + "file_system_metadata.h", + "file_write_watcher.cc", + "file_write_watcher.h", + "job_list.cc", + "job_list.h", + "job_queue.cc", + "job_queue.h", + "job_scheduler.cc", + "job_scheduler.h", + "local_file_reader.cc", + "local_file_reader.h", + "resource_entry_conversion.cc", + "resource_entry_conversion.h", + "resource_metadata_storage.cc", + "resource_metadata_storage.h", + "service/drive_api_service.cc", + "service/drive_api_service.h", + "service/drive_service_interface.cc", + "service/drive_service_interface.h", + ] + deps = [ + "//base", + "//base:i18n", + "//base:prefs", + "//components/invalidation/public", + "//components/keyed_service/core", + + # TODO(lukasza): Remove this dependency (see DEPS file for more info). + "//content/public/browser", + "//google_apis:google_apis", + "//net:net", + "//third_party/cacheinvalidation", + "//third_party/leveldatabase", + "//third_party/re2", + ] + public_deps = [ + ":proto", + ] +} + +source_set("drive_chromeos") { + # TODO(yawano): move these files under components/drive/chromeos. + sources = [ + "change_list_loader.cc", + "change_list_loader.h", + "change_list_loader_observer.h", + "change_list_processor.cc", + "change_list_processor.h", + "directory_loader.cc", + "directory_loader.h", + "file_cache.cc", + "file_cache.h", "file_system.cc", "file_system.h", "file_system/copy_operation.cc", @@ -61,37 +107,15 @@ "file_system/touch_operation.h", "file_system/truncate_operation.cc", "file_system/truncate_operation.h", - "file_system_core_util.cc", - "file_system_core_util.h", "file_system_interface.cc", "file_system_interface.h", - "file_system_metadata.cc", - "file_system_metadata.h", "file_system_observer.h", - "file_write_watcher.cc", - "file_write_watcher.h", - "job_list.cc", - "job_list.h", - "job_queue.cc", - "job_queue.h", - "job_scheduler.cc", - "job_scheduler.h", - "local_file_reader.cc", - "local_file_reader.h", "remove_stale_cache_files.cc", "remove_stale_cache_files.h", - "resource_entry_conversion.cc", - "resource_entry_conversion.h", "resource_metadata.cc", "resource_metadata.h", - "resource_metadata_storage.cc", - "resource_metadata_storage.h", "search_metadata.cc", "search_metadata.h", - "service/drive_api_service.cc", - "service/drive_api_service.h", - "service/drive_service_interface.cc", - "service/drive_service_interface.h", "sync/entry_revert_performer.cc", "sync/entry_revert_performer.h", "sync/entry_update_performer.cc", @@ -102,19 +126,12 @@ "sync_client.h", ] deps = [ + ":drive", "//base", "//base:i18n", "//base:prefs", - "//components/invalidation/public", - "//components/keyed_service/core", - - # TODO(lukasza): Remove this dependency (see DEPS file for more info). - "//content/public/browser", "//google_apis:google_apis", "//net:net", - "//third_party/cacheinvalidation", - "//third_party/leveldatabase", - "//third_party/re2", ] public_deps = [ ":proto", @@ -130,14 +147,6 @@ source_set("test_support") { testonly = true sources = [ - "drive_test_util.cc", - "drive_test_util.h", - "dummy_file_system.cc", - "dummy_file_system.h", - "fake_file_system.cc", - "fake_file_system.h", - "fake_free_disk_space_getter.cc", - "fake_free_disk_space_getter.h", "service/dummy_drive_service.cc", "service/dummy_drive_service.h", "service/fake_drive_service.cc", @@ -155,3 +164,26 @@ "//net:net", ] } + +source_set("test_support_chromeos") { + testonly = true + sources = [ + "drive_test_util.cc", + "drive_test_util.h", + "dummy_file_system.cc", + "dummy_file_system.h", + "fake_file_system.cc", + "fake_file_system.h", + "fake_free_disk_space_getter.cc", + "fake_free_disk_space_getter.h", + ] + deps = [ + ":drive", + ":drive_chromeos", + ":proto", + "//base", + "//base:prefs_test_support", + "//content/test:test_support", + "//google_apis:test_support", + ] +}
diff --git a/components/html_viewer/html_document_application_delegate.cc b/components/html_viewer/html_document_application_delegate.cc index 028ea247..17234082 100644 --- a/components/html_viewer/html_document_application_delegate.cc +++ b/components/html_viewer/html_document_application_delegate.cc
@@ -105,7 +105,7 @@ } else if (url_ == "about:blank") { // This is a little unfortunate. At the browser side, when starting a new // app for "about:blank", the application manager uses - // mojo::runner::AboutFetcher to construct a response for "about:blank". + // mojo::shell::AboutFetcher to construct a response for "about:blank". // However, when an app for "about:blank" already exists, it is reused and // we end up here. We cannot fetch the URL using mojo::URLLoader because it // is not an actual Web resource.
diff --git a/components/mus/gles2/BUILD.gn b/components/mus/gles2/BUILD.gn index d673c28..f5bda993 100644 --- a/components/mus/gles2/BUILD.gn +++ b/components/mus/gles2/BUILD.gn
@@ -7,7 +7,7 @@ "//components/mus:*", "//components/mus/ws:*", "//components/mus/surfaces:*", - "//mojo/runner:lib", # For android + "//mojo/shell/standalone:lib", # For android ] sources = [
diff --git a/components/nacl/renderer/plugin/pnacl_translate_thread.cc b/components/nacl/renderer/plugin/pnacl_translate_thread.cc index c4a466c3..6d25d22 100644 --- a/components/nacl/renderer/plugin/pnacl_translate_thread.cc +++ b/components/nacl/renderer/plugin/pnacl_translate_thread.cc
@@ -14,7 +14,6 @@ #include "components/nacl/renderer/plugin/plugin_error.h" #include "components/nacl/renderer/plugin/utility.h" #include "content/public/common/sandbox_init.h" -#include "native_client/src/shared/platform/nacl_sync_raii.h" #include "ppapi/c/ppb_file_io.h" #include "ppapi/cpp/var.h" #include "ppapi/proxy/ppapi_messages.h" @@ -64,6 +63,7 @@ ld_subprocess_(NULL), compiler_subprocess_active_(false), ld_subprocess_active_(false), + buffer_cond_(&cond_mu_), done_(false), compile_time_(0), obj_files_(NULL), @@ -73,9 +73,6 @@ coordinator_(NULL), compiler_channel_peer_pid_(base::kNullProcessId), ld_channel_peer_pid_(base::kNullProcessId) { - NaClXMutexCtor(&subprocess_mu_); - NaClXMutexCtor(&cond_mu_); - NaClXCondVarCtor(&buffer_cond_); } void PnaclTranslateThread::SetupState( @@ -154,20 +151,18 @@ // Called from main thread to send bytes to the translator. void PnaclTranslateThread::PutBytes(const void* bytes, int32_t count) { CHECK(bytes != NULL); - NaClXMutexLock(&cond_mu_); + base::AutoLock lock(cond_mu_); data_buffers_.push_back(std::string()); data_buffers_.back().insert(data_buffers_.back().end(), static_cast<const char*>(bytes), static_cast<const char*>(bytes) + count); - NaClXCondVarSignal(&buffer_cond_); - NaClXMutexUnlock(&cond_mu_); + buffer_cond_.Signal(); } void PnaclTranslateThread::EndStream() { - NaClXMutexLock(&cond_mu_); + base::AutoLock lock(cond_mu_); done_ = true; - NaClXCondVarSignal(&buffer_cond_); - NaClXMutexUnlock(&cond_mu_); + buffer_cond_.Signal(); } ppapi::proxy::SerializedHandle PnaclTranslateThread::GetHandleForSubprocess( @@ -202,7 +197,7 @@ void PnaclTranslateThread::DoCompile() { { - nacl::MutexLocker ml(&subprocess_mu_); + base::AutoLock lock(subprocess_mu_); // If the main thread asked us to exit in between starting the thread // and now, just leave now. if (!compiler_subprocess_active_) @@ -253,9 +248,9 @@ // llc process is started. while(!done_ || data_buffers_.size() > 0) { - NaClXMutexLock(&cond_mu_); + cond_mu_.Acquire(); while(!done_ && data_buffers_.size() == 0) { - NaClXCondVarWait(&buffer_cond_, &cond_mu_); + buffer_cond_.Wait(); } PLUGIN_PRINTF(("PnaclTranslateThread awake (done=%d, size=%" NACL_PRIuS ")\n", @@ -264,7 +259,7 @@ std::string data; data.swap(data_buffers_.front()); data_buffers_.pop_front(); - NaClXMutexUnlock(&cond_mu_); + cond_mu_.Release(); PLUGIN_PRINTF(("StreamChunk\n")); if (!compiler_channel_filter_->Send( @@ -288,7 +283,7 @@ coordinator_->GetCompileProgressCallback(data.size()), PP_OK); } else { - NaClXMutexUnlock(&cond_mu_); + cond_mu_.Release(); } } PLUGIN_PRINTF(("PnaclTranslateThread done with chunks\n")); @@ -315,10 +310,11 @@ compile_time_); // Shut down the compiler subprocess. - NaClXMutexLock(&subprocess_mu_); - compiler_subprocess_active_ = false; - compiler_subprocess_->Shutdown(); - NaClXMutexUnlock(&subprocess_mu_); + { + base::AutoLock lock(subprocess_mu_); + compiler_subprocess_active_ = false; + compiler_subprocess_->Shutdown(); + } core->CallOnMainThread(0, compile_finished_callback_, PP_OK); } @@ -329,7 +325,7 @@ void PnaclTranslateThread::DoLink() { { - nacl::MutexLocker ml(&subprocess_mu_); + base::AutoLock lock(subprocess_mu_); // If the main thread asked us to exit in between starting the thread // and now, just leave now. if (!ld_subprocess_active_) @@ -379,10 +375,11 @@ this)); // Shut down the ld subprocess. - NaClXMutexLock(&subprocess_mu_); - ld_subprocess_active_ = false; - ld_subprocess_->Shutdown(); - NaClXMutexUnlock(&subprocess_mu_); + { + base::AutoLock lock(subprocess_mu_); + ld_subprocess_active_ = false; + ld_subprocess_->Shutdown(); + } pp::Core* core = pp::Module::Get()->core(); core->CallOnMainThread(0, report_translate_finished_, PP_OK); @@ -406,24 +403,25 @@ void PnaclTranslateThread::AbortSubprocesses() { PLUGIN_PRINTF(("PnaclTranslateThread::AbortSubprocesses\n")); - NaClXMutexLock(&subprocess_mu_); - if (compiler_subprocess_ != NULL && compiler_subprocess_active_) { - // We only run the service_runtime's Shutdown and do not run the - // NaClSubprocess Shutdown, which would otherwise nullify some - // pointers that could still be in use (srpc_client, etc.). - compiler_subprocess_->service_runtime()->Shutdown(); - compiler_subprocess_active_ = false; + { + base::AutoLock lock(subprocess_mu_); + if (compiler_subprocess_ != NULL && compiler_subprocess_active_) { + // We only run the service_runtime's Shutdown and do not run the + // NaClSubprocess Shutdown, which would otherwise nullify some + // pointers that could still be in use (srpc_client, etc.). + compiler_subprocess_->service_runtime()->Shutdown(); + compiler_subprocess_active_ = false; + } + if (ld_subprocess_ != NULL && ld_subprocess_active_) { + ld_subprocess_->service_runtime()->Shutdown(); + ld_subprocess_active_ = false; + } } - if (ld_subprocess_ != NULL && ld_subprocess_active_) { - ld_subprocess_->service_runtime()->Shutdown(); - ld_subprocess_active_ = false; - } - NaClXMutexUnlock(&subprocess_mu_); - nacl::MutexLocker ml(&cond_mu_); + base::AutoLock lock(cond_mu_); done_ = true; // Free all buffered bitcode chunks data_buffers_.clear(); - NaClXCondVarSignal(&buffer_cond_); + buffer_cond_.Signal(); } PnaclTranslateThread::~PnaclTranslateThread() { @@ -432,9 +430,6 @@ if (translate_thread_) translate_thread_->Join(); PLUGIN_PRINTF(("~PnaclTranslateThread joined\n")); - NaClCondVarDtor(&buffer_cond_); - NaClMutexDtor(&cond_mu_); - NaClMutexDtor(&subprocess_mu_); } } // namespace plugin
diff --git a/components/nacl/renderer/plugin/pnacl_translate_thread.h b/components/nacl/renderer/plugin/pnacl_translate_thread.h index 9187ed6..fe01119 100644 --- a/components/nacl/renderer/plugin/pnacl_translate_thread.h +++ b/components/nacl/renderer/plugin/pnacl_translate_thread.h
@@ -13,9 +13,10 @@ #include "base/files/file.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" +#include "base/synchronization/condition_variable.h" +#include "base/synchronization/lock.h" #include "base/threading/simple_thread.h" #include "components/nacl/renderer/plugin/plugin_error.h" -#include "native_client/src/shared/platform/nacl_sync_checked.h" #include "ppapi/cpp/completion_callback.h" #include "ppapi/proxy/serialized_handle.h" @@ -121,7 +122,7 @@ // Used to guard compiler_subprocess, ld_subprocess, // compiler_subprocess_active_, and ld_subprocess_active_ // (touched by the main thread and the translate thread). - struct NaClMutex subprocess_mu_; + base::Lock subprocess_mu_; // The compiler_subprocess and ld_subprocess memory is owned by the // coordinator so we do not delete them. However, the main thread delegates // shutdown to this thread, since this thread may still be accessing the @@ -136,13 +137,13 @@ bool compiler_subprocess_active_; bool ld_subprocess_active_; + // Mutex for buffer_cond_. + base::Lock cond_mu_; // Condition variable to synchronize communication with the SRPC thread. // SRPC thread waits on this condvar if data_buffers_ is empty (meaning // there is no bitcode to send to the translator), and the main thread // appends to data_buffers_ and signals it when it receives bitcode. - struct NaClCondVar buffer_cond_; - // Mutex for buffer_cond_. - struct NaClMutex cond_mu_; + base::ConditionVariable buffer_cond_; // Data buffers from FileDownloader are enqueued here to pass from the // main thread to the SRPC thread. Protected by cond_mu_ std::deque<std::string> data_buffers_;
diff --git a/components/password_manager/core/browser/password_ui_utils.cc b/components/password_manager/core/browser/password_ui_utils.cc index 9f52ec6..d30e28b5 100644 --- a/components/password_manager/core/browser/password_ui_utils.cc +++ b/components/password_manager/core/browser/password_ui_utils.cc
@@ -33,9 +33,12 @@ if (*is_android_uri) return GetHumanReadableOriginForAndroidUri(facet_uri); - std::string original = - base::UTF16ToUTF8(url_formatter::FormatUrlForSecurityDisplayOmitScheme( - password_form.origin, languages)); + return GetShownOrigin(password_form.origin, languages); +} + +std::string GetShownOrigin(const GURL& origin, const std::string& languages) { + std::string original = base::UTF16ToUTF8( + url_formatter::FormatUrlForSecurityDisplayOmitScheme(origin, languages)); base::StringPiece result = original; for (base::StringPiece prefix : kRemovedPrefixes) { if (base::StartsWith(result, prefix,
diff --git a/components/password_manager/core/browser/password_ui_utils.h b/components/password_manager/core/browser/password_ui_utils.h index 28cabd2..b0e516c 100644 --- a/components/password_manager/core/browser/password_ui_utils.h +++ b/components/password_manager/core/browser/password_ui_utils.h
@@ -27,6 +27,11 @@ const std::string& languages, bool* is_android_uri); +// Returns a string suitable for security display to the user (just like +// |FormatUrlForSecurityDisplayOmitScheme| based on origin of |password_form| +// and |languages|) and without prefixes "m.", "mobile." or "www.". +std::string GetShownOrigin(const GURL& origin, const std::string& languages); + } // namespace password_manager #endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_UI_UTILS_H_
diff --git a/components/password_manager/core/browser/password_ui_utils_unittest.cc b/components/password_manager/core/browser/password_ui_utils_unittest.cc index c5a66d8..c757000 100644 --- a/components/password_manager/core/browser/password_ui_utils_unittest.cc +++ b/components/password_manager/core/browser/password_ui_utils_unittest.cc
@@ -38,6 +38,7 @@ GetShownOrigin(password_form, "", &is_android_uri)) << "for input " << test_case.input; EXPECT_FALSE(is_android_uri) << "for input " << test_case.input; + EXPECT_EQ(test_case.output, GetShownOrigin(password_form.origin, "")); } }
diff --git a/components/search_provider_logos/google_logo_api.cc b/components/search_provider_logos/google_logo_api.cc index d3bbe33..44c29dac 100644 --- a/components/search_provider_logos/google_logo_api.cc +++ b/components/search_provider_logos/google_logo_api.cc
@@ -71,16 +71,11 @@ if (response_sp.starts_with(kResponsePreamble)) response_sp.remove_prefix(strlen(kResponsePreamble)); - scoped_ptr<base::Value> value = base::JSONReader::Read(response_sp); - - // Check if no logo today. - if (!value.get()) { - *parsing_failed = false; - return scoped_ptr<EncodedLogo>(); - } - // Default parsing failure to be true. *parsing_failed = true; + scoped_ptr<base::Value> value = base::JSONReader::Read(response_sp); + if (!value.get()) + return scoped_ptr<EncodedLogo>(); // The important data lives inside several nested dictionaries: // {"update": {"logo": { "mime_type": ..., etc } } } const base::DictionaryValue* outer_dict; @@ -89,6 +84,13 @@ const base::DictionaryValue* update_dict; if (!outer_dict->GetDictionary("update", &update_dict)) return scoped_ptr<EncodedLogo>(); + + // If there is no logo today, the "update" dictionary will be empty. + if (update_dict->empty()) { + *parsing_failed = false; + return scoped_ptr<EncodedLogo>(); + } + const base::DictionaryValue* logo_dict; if (!update_dict->GetDictionary("logo", &logo_dict)) return scoped_ptr<EncodedLogo>();
diff --git a/components/signin/core/browser/fake_signin_manager.cc b/components/signin/core/browser/fake_signin_manager.cc index 0b59650..ab631a9b 100644 --- a/components/signin/core/browser/fake_signin_manager.cc +++ b/components/signin/core/browser/fake_signin_manager.cc
@@ -64,7 +64,8 @@ void FakeSigninManager::ForceSignOut() { prohibit_signout_ = false; - SignOut(signin_metrics::SIGNOUT_TEST); + SignOut(signin_metrics::SIGNOUT_TEST, + signin_metrics::SignoutDelete::IGNORE_METRIC); } void FakeSigninManager::FailSignin(const GoogleServiceAuthError& error) { @@ -73,7 +74,8 @@ } void FakeSigninManager::SignOut( - signin_metrics::ProfileSignout signout_source_metric) { + signin_metrics::ProfileSignout signout_source_metric, + signin_metrics::SignoutDelete signout_delete_metric) { if (IsSignoutProhibited()) return; set_auth_in_progress(std::string());
diff --git a/components/signin/core/browser/fake_signin_manager.h b/components/signin/core/browser/fake_signin_manager.h index 18b79aa..1b957c5 100644 --- a/components/signin/core/browser/fake_signin_manager.h +++ b/components/signin/core/browser/fake_signin_manager.h
@@ -58,7 +58,8 @@ const std::string& password, const OAuthTokenFetchedCallback& oauth_fetched_callback) override; - void SignOut(signin_metrics::ProfileSignout signout_source_metric) override; + void SignOut(signin_metrics::ProfileSignout signout_source_metric, + signin_metrics::SignoutDelete signout_delete_metric) override; void CompletePendingSignin() override;
diff --git a/components/signin/core/browser/signin_manager.cc b/components/signin/core/browser/signin_manager.cc index a6c56a43..b2432d8 100644 --- a/components/signin/core/browser/signin_manager.cc +++ b/components/signin/core/browser/signin_manager.cc
@@ -147,10 +147,11 @@ } void SigninManager::SignOut( - signin_metrics::ProfileSignout signout_source_metric) { + signin_metrics::ProfileSignout signout_source_metric, + signin_metrics::SignoutDelete signout_delete_metric) { DCHECK(IsInitialized()); - signin_metrics::LogSignout(signout_source_metric); + signin_metrics::LogSignout(signout_source_metric, signout_delete_metric); if (!IsAuthenticated()) { if (AuthInProgress()) { // If the user is in the process of signing in, then treat a call to @@ -228,7 +229,8 @@ if ((!account_id.empty() && !IsAllowedUsername(user)) || !IsSigninAllowed()) { // User is signed in, but the username is invalid - the administrator must // have changed the policy since the last signin, so sign out the user. - SignOut(signin_metrics::SIGNIN_PREF_CHANGED_DURING_SIGNIN); + SignOut(signin_metrics::SIGNIN_PREF_CHANGED_DURING_SIGNIN, + signin_metrics::SignoutDelete::IGNORE_METRIC); } if (account_tracker_service()->GetMigrationState() == @@ -250,7 +252,8 @@ !IsAllowedUsername(GetAuthenticatedAccountInfo().email)) { // Signed in user is invalid according to the current policy so sign // the user out. - SignOut(signin_metrics::GOOGLE_SERVICE_NAME_PATTERN_CHANGED); + SignOut(signin_metrics::GOOGLE_SERVICE_NAME_PATTERN_CHANGED, + signin_metrics::SignoutDelete::IGNORE_METRIC); } } @@ -260,7 +263,8 @@ void SigninManager::OnSigninAllowedPrefChanged() { if (!IsSigninAllowed()) - SignOut(signin_metrics::SIGNOUT_PREF_CHANGED); + SignOut(signin_metrics::SIGNOUT_PREF_CHANGED, + signin_metrics::SignoutDelete::IGNORE_METRIC); } // static
diff --git a/components/signin/core/browser/signin_manager.h b/components/signin/core/browser/signin_manager.h index f0e76c0..91f5266c 100644 --- a/components/signin/core/browser/signin_manager.h +++ b/components/signin/core/browser/signin_manager.h
@@ -94,7 +94,8 @@ // Sign a user out, removing the preference, erasing all keys // associated with the user, and canceling all auth in progress. - virtual void SignOut(signin_metrics::ProfileSignout signout_source_metric); + virtual void SignOut(signin_metrics::ProfileSignout signout_source_metric, + signin_metrics::SignoutDelete signout_delete_metric); // On platforms where SigninManager is responsible for dealing with // invalid username policy updates, we need to check this during
diff --git a/components/signin/core/browser/signin_metrics.cc b/components/signin/core/browser/signin_metrics.cc index 5a6e1a4..aa523121 100644 --- a/components/signin/core/browser/signin_metrics.cc +++ b/components/signin/core/browser/signin_metrics.cc
@@ -100,9 +100,14 @@ UMA_HISTOGRAM_BOOLEAN("Signin.AddAccount", true); } -void LogSignout(ProfileSignout metric) { - UMA_HISTOGRAM_ENUMERATION("Signin.SignoutProfile", metric, +void LogSignout(ProfileSignout source_metric, SignoutDelete delete_metric) { + UMA_HISTOGRAM_ENUMERATION("Signin.SignoutProfile", source_metric, NUM_PROFILE_SIGNOUT_METRICS); + if (delete_metric != SignoutDelete::IGNORE_METRIC) { + UMA_HISTOGRAM_BOOLEAN( + "Signin.SignoutDeleteProfile", + delete_metric == SignoutDelete::DELETED ? true : false); + } } void LogExternalCcResultFetches(
diff --git a/components/signin/core/browser/signin_metrics.h b/components/signin/core/browser/signin_metrics.h index 762fd37..12a214c 100644 --- a/components/signin/core/browser/signin_metrics.h +++ b/components/signin/core/browser/signin_metrics.h
@@ -228,6 +228,15 @@ HISTOGRAM_COUNT, }; +// When the user is give a choice of deleting their profile or not when signing +// out, the |DELETED| or |KEEPING| metric should be used. If the user is not +// given any option, then use the |IGNORE_METRIC| value should be used. +enum class SignoutDelete : int { + DELETED = 0, + KEEPING, + IGNORE_METRIC, +}; + // Tracks the access point of sign in. void LogSigninAccessPointStarted(AccessPoint access_point); void LogSigninAccessPointCompleted(AccessPoint access_point); @@ -269,7 +278,7 @@ void LogSigninProfile(bool is_first_run, base::Time install_date); // Track a profile signout. -void LogSignout(ProfileSignout metric); +void LogSignout(ProfileSignout source_metric, SignoutDelete delete_metric); // Tracks whether the external connection results were all fetched before // the gaia cookie manager service tried to use them with merge session.
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index eaa22487..75b24024f 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">سياسة غير معروفة.</translation> <translation id="1227633850867390598">إخفاء القيمة</translation> <translation id="1228893227497259893">معرف الكيان خاطئ</translation> +<translation id="1241381048229838873">عرض كل الإشارات المرجعية</translation> <translation id="1270699273812232624">السماح بالعناصر</translation> <translation id="1285320974508926690">عدم ترجمة هذا الموقع مطلقًا</translation> <translation id="1339601241726513588">نطاق التسجيل:</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index b1ef5ad67..b613302 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Неизвестно правило.</translation> <translation id="1227633850867390598">Скриване на стойността</translation> <translation id="1228893227497259893">Грешен идентификатор на обект</translation> +<translation id="1241381048229838873">Показване на всички отметки</translation> <translation id="1270699273812232624">Разрешаване на елементите</translation> <translation id="1285320974508926690">Този сайт да не се превежда никога</translation> <translation id="1339601241726513588">Домейн за записване:</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index a31ec55..8cbe414d 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -31,6 +31,7 @@ <translation id="1227224963052638717">Política desconeguda.</translation> <translation id="1227633850867390598">Amaga el valor</translation> <translation id="1228893227497259893">Identificador d'entitat incorrecte</translation> +<translation id="1241381048229838873">Mostra totes les adreces d'interès</translation> <translation id="1270699273812232624">Permet els elements</translation> <translation id="1285320974508926690">No tradueixis mai aquest lloc</translation> <translation id="1339601241726513588">Domini d'inscripció:</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index 060be29..3e47090 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -31,6 +31,7 @@ <translation id="1227224963052638717">Neznámá zásada.</translation> <translation id="1227633850867390598">Skrýt hodnotu</translation> <translation id="1228893227497259893">Nesprávný identifikátor subjektu</translation> +<translation id="1241381048229838873">Zobrazit všechny záložky</translation> <translation id="1270699273812232624">Povolit položky</translation> <translation id="1285320974508926690">Tento web nikdy nepřekládat</translation> <translation id="1339601241726513588">Doména registrace:</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index bdf6f29..ef0e506b 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Ukendt politik.</translation> <translation id="1227633850867390598">Skjul værdi</translation> <translation id="1228893227497259893">Forkert enheds-id</translation> +<translation id="1241381048229838873">Vis alle bogmærker</translation> <translation id="1270699273812232624">Tillad elementer</translation> <translation id="1285320974508926690">Oversæt aldrig dette website</translation> <translation id="1339601241726513588">Registreringsdomæne:</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 6a0c4aa3..352c837 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -35,6 +35,7 @@ <translation id="1227224963052638717">Unbekannte Richtlinie</translation> <translation id="1227633850867390598">Wert ausblenden</translation> <translation id="1228893227497259893">Falsche Entitätskennung</translation> +<translation id="1241381048229838873">Alle Lesezeichen anzeigen</translation> <translation id="1270699273812232624">Elemente zulassen</translation> <translation id="1285320974508926690">Diese Website nie übersetzen</translation> <translation id="1339601241726513588">Anmeldedomain:</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index 52ea15b..9f187ec 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Άγνωστη πολιτική.</translation> <translation id="1227633850867390598">Απόκρυψη τιμής</translation> <translation id="1228893227497259893">Εσφαλμένο αναγνωριστικό οντότητας</translation> +<translation id="1241381048229838873">Εμφάνιση όλων των σελιδοδεικτών</translation> <translation id="1270699273812232624">Να επιτρέπονται τα στοιχεία</translation> <translation id="1285320974508926690">Να μην γίνεται ποτέ μετάφραση αυτού του ιστότοπου</translation> <translation id="1339601241726513588">Τομέας εγγραφής:</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index f524e29..45a9bafa 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Unknown policy.</translation> <translation id="1227633850867390598">Hide value</translation> <translation id="1228893227497259893">Wrong entity identifier</translation> +<translation id="1241381048229838873">Show all bookmarks</translation> <translation id="1270699273812232624">Allow items</translation> <translation id="1285320974508926690">Never translate this site</translation> <translation id="1339601241726513588">Enrolment domain:</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index 0fa9462..ff17bd154 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -33,6 +33,7 @@ <translation id="1227224963052638717">Política desconocida</translation> <translation id="1227633850867390598">Ocultar valor</translation> <translation id="1228893227497259893">El identificador de la entidad es incorrecto.</translation> +<translation id="1241381048229838873">Mostrar todos los marcadores</translation> <translation id="1270699273812232624">Permitir elementos</translation> <translation id="1285320974508926690">Nunca traducir este sitio</translation> <translation id="1339601241726513588">Inscripción de dominio:</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 0009e5ba..0b470bb 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Política desconocida</translation> <translation id="1227633850867390598">Ocultar valor</translation> <translation id="1228893227497259893">Identificador de entidad incorrecto</translation> +<translation id="1241381048229838873">Mostrar todos los marcadores</translation> <translation id="1270699273812232624">Permitir elementos</translation> <translation id="1285320974508926690">No traducir nunca este sitio</translation> <translation id="1339601241726513588">Dominio de registro:</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 94e6e805..5e93652c 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Tundmatud eeskirjad.</translation> <translation id="1227633850867390598">Peida väärtus</translation> <translation id="1228893227497259893">Üksuse vale identifikaator</translation> +<translation id="1241381048229838873">Kuva kõik järjehoidjad</translation> <translation id="1270699273812232624">Luba üksused</translation> <translation id="1285320974508926690">Ära kunagi seda saiti tõlgi</translation> <translation id="1339601241726513588">Registreerimisdomeen:</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index 2809908..f3981ab 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Tuntematon käytäntö.</translation> <translation id="1227633850867390598">Piilota arvo</translation> <translation id="1228893227497259893">Väärä entiteettitunnus</translation> +<translation id="1241381048229838873">Näytä kaikki kirjanmerkit</translation> <translation id="1270699273812232624">Salli kohteet</translation> <translation id="1285320974508926690">Älä käännä tätä sivustoa</translation> <translation id="1339601241726513588">Käyttöönoton verkkotunnus:</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 99dde00d..be17f07 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Hindi kilalang patakaran</translation> <translation id="1227633850867390598">Itago ang halaga</translation> <translation id="1228893227497259893">Maling tagatukoy ng entity</translation> +<translation id="1241381048229838873">Ipakita ang lahat ng mga bookmark</translation> <translation id="1270699273812232624">Payagan ang mga item</translation> <translation id="1285320974508926690">Huwag isalin kailanman ang site na ito</translation> <translation id="1339601241726513588">Domain ng pagpapatala:</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index f61e85a..6af10af 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Règle inconnue</translation> <translation id="1227633850867390598">Masquer la valeur</translation> <translation id="1228893227497259893">Identifiant d'entité incorrect.</translation> +<translation id="1241381048229838873">Afficher tous les favoris</translation> <translation id="1270699273812232624">Autoriser les éléments</translation> <translation id="1285320974508926690">Ne jamais traduire ce site</translation> <translation id="1339601241726513588">Domaine d'enregistrement :</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index 04acdf8..4372aa5 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">अज्ञात नीति.</translation> <translation id="1227633850867390598">मान छिपाएं</translation> <translation id="1228893227497259893">गलत इकाई पहचानकर्ता</translation> +<translation id="1241381048229838873">सभी बुकमार्क दिखाएं</translation> <translation id="1270699273812232624">आइटम की अनुमति दें</translation> <translation id="1285320974508926690">कभी भी इस साइट का अनुवाद न करें</translation> <translation id="1339601241726513588">नामांकन डोमेन:</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 70a71f5..d2b05f4 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Nepoznato pravilo.</translation> <translation id="1227633850867390598">Skrivanje vrijednosti</translation> <translation id="1228893227497259893">Pogrešan identifikator entiteta</translation> +<translation id="1241381048229838873">Pokaži sve oznake</translation> <translation id="1270699273812232624">Dopusti stavke</translation> <translation id="1285320974508926690">Nikad nemoj prevoditi ovu web-lokaciju</translation> <translation id="1339601241726513588">Domena upisa:</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index 4fae6b78..a7c00a9 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Ismeretlen házirend</translation> <translation id="1227633850867390598">Érték elrejtése</translation> <translation id="1228893227497259893">Helytelen entitásazonosító</translation> +<translation id="1241381048229838873">Az összes könyvjelző megjelenítése</translation> <translation id="1270699273812232624">Elemek engedélyezése</translation> <translation id="1285320974508926690">Ezt a webhelyet soha ne fordítsa le</translation> <translation id="1339601241726513588">Regisztrációs domain:</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index 4d5e253..76270fd 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Kebijakan tidak dikenal.</translation> <translation id="1227633850867390598">Sembunyikan nilai</translation> <translation id="1228893227497259893">Pengidentifikasi entitas salah</translation> +<translation id="1241381048229838873">Tampilkan semua bookmark</translation> <translation id="1270699273812232624">Izinkan item</translation> <translation id="1285320974508926690">Jangan pernah terjemahkan situs ini</translation> <translation id="1339601241726513588">Domain pendaftaran:</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 3823310..bb66518 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -31,6 +31,7 @@ <translation id="1227224963052638717">Norma sconosciuta.</translation> <translation id="1227633850867390598">Nascondi valore</translation> <translation id="1228893227497259893">Identificatore entità errato</translation> +<translation id="1241381048229838873">Mostra tutti i Preferiti</translation> <translation id="1270699273812232624">Consenti elementi</translation> <translation id="1285320974508926690">Non tradurre mai questo sito</translation> <translation id="1339601241726513588">Dominio registrazione:</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 7d7f4328..24f2fa5 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -33,6 +33,7 @@ <translation id="1227224963052638717">מדיניות לא ידועה.</translation> <translation id="1227633850867390598">הסתר ערך</translation> <translation id="1228893227497259893">מזהה יישות שגוי</translation> +<translation id="1241381048229838873">הצג את כל הסימניות</translation> <translation id="1270699273812232624">אפשר פריטים</translation> <translation id="1285320974508926690">לעולם אל תתרגם אתר זה</translation> <translation id="1339601241726513588">דומיין הרשמה:</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index 49bd0aa0..9d0f744 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">不明なポリシー。</translation> <translation id="1227633850867390598">値を非表示</translation> <translation id="1228893227497259893">エンティティ識別子が正しくありません</translation> +<translation id="1241381048229838873">すべてのブックマークを表示</translation> <translation id="1270699273812232624">アイテムを許可</translation> <translation id="1285320974508926690">このサイトは翻訳しない</translation> <translation id="1339601241726513588">登録ドメイン:</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index b16f967..66c33b8 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">알 수 없는 정책입니다.</translation> <translation id="1227633850867390598">값 숨기기</translation> <translation id="1228893227497259893">잘못된 개체 식별자</translation> +<translation id="1241381048229838873">모든 북마크 표시</translation> <translation id="1270699273812232624">항목 허용</translation> <translation id="1285320974508926690">이 사이트 번역 안함</translation> <translation id="1339601241726513588">등록 도메인:</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index 5ab66fb4..f1d0c0a 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Nežinoma politika.</translation> <translation id="1227633850867390598">Slėpti vertę</translation> <translation id="1228893227497259893">Netinkamas subjekto identifikatorius</translation> +<translation id="1241381048229838873">Rodyti visas žymas</translation> <translation id="1270699273812232624">Leisti elementus</translation> <translation id="1285320974508926690">Niekada neversti šios svetainės</translation> <translation id="1339601241726513588">Registracijos domenas:</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index a18865b..3c2f8e0d 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Nezināma politika.</translation> <translation id="1227633850867390598">Slēpt vērtību</translation> <translation id="1228893227497259893">Nepareizs vienības identifikators</translation> +<translation id="1241381048229838873">Rādīt visas grāmatzīmes</translation> <translation id="1270699273812232624">Atļaut vienumus</translation> <translation id="1285320974508926690">Nekad netulkot šo vietni</translation> <translation id="1339601241726513588">Reģistrācijas domēns:</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index 2e05673..270adcc 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -31,6 +31,7 @@ <translation id="1227224963052638717">Onbekend beleid.</translation> <translation id="1227633850867390598">Waarde verbergen</translation> <translation id="1228893227497259893">Onjuiste entiteits-ID</translation> +<translation id="1241381048229838873">Alle bladwijzers weergeven</translation> <translation id="1270699273812232624">Items toestaan</translation> <translation id="1285320974508926690">Deze site nooit vertalen</translation> <translation id="1339601241726513588">Inschrijvingsdomein:</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index db73a86c..be11884a 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Ukjent innstilling.</translation> <translation id="1227633850867390598">Skjul verdien</translation> <translation id="1228893227497259893">Feil enhetsidentifikator</translation> +<translation id="1241381048229838873">Vis alle bokmerker</translation> <translation id="1270699273812232624">Tillat elementer</translation> <translation id="1285320974508926690">Oversett aldri dette nettstedet</translation> <translation id="1339601241726513588">Registreringsdomene:</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index d80a33d..b50cd072 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Nieznana zasada.</translation> <translation id="1227633850867390598">Ukryj wartość</translation> <translation id="1228893227497259893">Błędny identyfikator elementu</translation> +<translation id="1241381048229838873">Pokaż wszystkie zakładki</translation> <translation id="1270699273812232624">Zezwól na elementy</translation> <translation id="1285320974508926690">Nigdy nie tłumacz tej witryny</translation> <translation id="1339601241726513588">Domena rejestracji:</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index a60c911..4065f1a 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Política desconhecida.</translation> <translation id="1227633850867390598">Ocultar valor</translation> <translation id="1228893227497259893">Identificador de entidade incorreto</translation> +<translation id="1241381048229838873">Mostrar todos os favoritos</translation> <translation id="1270699273812232624">Permitir itens</translation> <translation id="1285320974508926690">Nunca traduzir este site</translation> <translation id="1339601241726513588">Domínio de inscrição:</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index e2227b8..578890a 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Política desconhecida.</translation> <translation id="1227633850867390598">Esconder o valor</translation> <translation id="1228893227497259893">Identificador de entidade errado</translation> +<translation id="1241381048229838873">Mostrar todos os marcadores</translation> <translation id="1270699273812232624">Permitir itens</translation> <translation id="1285320974508926690">Nunca traduzir este site</translation> <translation id="1339601241726513588">Domínio de inscrição:</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index 8fa0eda..968c048 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Politică necunoscută.</translation> <translation id="1227633850867390598">Ascundeți valoarea</translation> <translation id="1228893227497259893">Identificator greșit pentru entitate</translation> +<translation id="1241381048229838873">Afișează toate marcajele</translation> <translation id="1270699273812232624">Permiteți aceste elemente</translation> <translation id="1285320974508926690">Nu traduce niciodată acest site</translation> <translation id="1339601241726513588">Domeniu de înregistrare:</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index d6a9521..2b692ce 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Неизвестное правило.</translation> <translation id="1227633850867390598">Скрыть значение</translation> <translation id="1228893227497259893">Неверный идентификатор объекта</translation> +<translation id="1241381048229838873">Показать все закладки</translation> <translation id="1270699273812232624">Разрешить для выбранных элементов</translation> <translation id="1285320974508926690">Никогда не переводить этот сайт</translation> <translation id="1339601241726513588">Регистрация домена:</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 406dfa6..b8d5350 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -31,6 +31,7 @@ <translation id="1227224963052638717">Neznáme pravidlo.</translation> <translation id="1227633850867390598">Skryť hodnotu</translation> <translation id="1228893227497259893">Nesprávny identifikátor entity</translation> +<translation id="1241381048229838873">Zobraziť všetky záložky</translation> <translation id="1270699273812232624">Povoliť položky</translation> <translation id="1285320974508926690">Nikdy neprekladať tieto webové stránky</translation> <translation id="1339601241726513588">Doména registrácie:</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index e36df79..74b03dea 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Neznan pravilnik</translation> <translation id="1227633850867390598">Skrij vrednost</translation> <translation id="1228893227497259893">Napačni identifikator subjekta</translation> +<translation id="1241381048229838873">Pokaži vse zaznamke</translation> <translation id="1270699273812232624">Dovoli elemente</translation> <translation id="1285320974508926690">Nikoli ne prevedi tega spletnega mesta</translation> <translation id="1339601241726513588">Domena za prijavo:</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index b0edd85..52b6514 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -33,6 +33,7 @@ <translation id="1227224963052638717">Непознате смернице.</translation> <translation id="1227633850867390598">Сакриј вредност</translation> <translation id="1228893227497259893">Погрешан идентификатор ентитета</translation> +<translation id="1241381048229838873">Прикажи све обележиваче</translation> <translation id="1270699273812232624">Дозволи ставке</translation> <translation id="1285320974508926690">Никад не преводи овај сајт</translation> <translation id="1339601241726513588">Домен уписнице:</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index c82b02da..dfccb05 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Okänd policy.</translation> <translation id="1227633850867390598">Dölj värde</translation> <translation id="1228893227497259893">Fel enhetsidentifierare</translation> +<translation id="1241381048229838873">Visa alla bokmärken</translation> <translation id="1270699273812232624">Tillåt objekt</translation> <translation id="1285320974508926690">Översätt aldrig den här webbplatsen</translation> <translation id="1339601241726513588">Registreringsdomän:</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index b101f1f..367e9df3 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">นโยบายที่ไม่รู้จัก</translation> <translation id="1227633850867390598">ซ่อนค่า</translation> <translation id="1228893227497259893">ตัวระบุเอนทิตีไม่ถูกต้อง</translation> +<translation id="1241381048229838873">แสดงบุ๊กมาร์กทั้งหมด</translation> <translation id="1270699273812232624">อนุญาตรายการ</translation> <translation id="1285320974508926690">ไม่ต้องแปลไซต์นี้</translation> <translation id="1339601241726513588">โดเมนการลงทะเบียน:</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index 6c21858d..aef99a2 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Bilinmeyen politika.</translation> <translation id="1227633850867390598">Değeri gizle</translation> <translation id="1228893227497259893">Yanlış varlık tanımlayıcı</translation> +<translation id="1241381048229838873">Tüm yer işaretlerini göster</translation> <translation id="1270699273812232624">Öğelere izin ver</translation> <translation id="1285320974508926690">Bu siteyi hiçbir zaman çevirme</translation> <translation id="1339601241726513588">Kayıt alan adı:</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index c28107a..d44225c 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Невідоме правило</translation> <translation id="1227633850867390598">Сховати значення</translation> <translation id="1228893227497259893">Неправильний ідентифікатор організації</translation> +<translation id="1241381048229838873">Показати всі закладки</translation> <translation id="1270699273812232624">Дозволити елементи</translation> <translation id="1285320974508926690">Ніколи не перекладати цей сайт</translation> <translation id="1339601241726513588">Домен реєстрації:</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index ec84ed6..30b0b47 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">Chính sách không xác định.</translation> <translation id="1227633850867390598">Ẩn giá trị</translation> <translation id="1228893227497259893">Số nhận dạng tổ chức không đúng</translation> +<translation id="1241381048229838873">Hiển thị tất cả dấu trang</translation> <translation id="1270699273812232624">Cho phép mục</translation> <translation id="1285320974508926690">Không bao giờ dịch trang web này</translation> <translation id="1339601241726513588">Tên miền đăng ký:</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index a6ab40d..792d5519 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -32,6 +32,7 @@ <translation id="1227224963052638717">未知政策。</translation> <translation id="1227633850867390598">隐藏值</translation> <translation id="1228893227497259893">实体标识符有误</translation> +<translation id="1241381048229838873">显示所有书签</translation> <translation id="1270699273812232624">允许历史记录项</translation> <translation id="1285320974508926690">一律不翻译此网站</translation> <translation id="1339601241726513588">注册域:</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index 295b3fe..a4366bb 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -34,6 +34,7 @@ <translation id="1227224963052638717">不明政策。</translation> <translation id="1227633850867390598">隱藏政策值</translation> <translation id="1228893227497259893">實體識別碼錯誤</translation> +<translation id="1241381048229838873">顯示所有書籤</translation> <translation id="1270699273812232624">允許項目</translation> <translation id="1285320974508926690">一律不翻譯此網站</translation> <translation id="1339601241726513588">註冊網域:</translation>
diff --git a/components/sync_driver/sync_prefs.cc b/components/sync_driver/sync_prefs.cc index c448903..6cebfa7 100644 --- a/components/sync_driver/sync_prefs.cc +++ b/components/sync_driver/sync_prefs.cc
@@ -129,7 +129,6 @@ void SyncPrefs::SetFirstSetupComplete() { DCHECK(CalledOnValidThread()); pref_service_->SetBoolean(prefs::kSyncFirstSetupComplete, true); - SetSyncRequested(true); } bool SyncPrefs::SyncHasAuthError() const {
diff --git a/components/update_client/update_client_unittest.cc b/components/update_client/update_client_unittest.cc index 5b7e663..371ade6 100644 --- a/components/update_client/update_client_unittest.cc +++ b/components/update_client/update_client_unittest.cc
@@ -421,8 +421,8 @@ const auto& ping_items = items(); EXPECT_EQ(1U, ping_items.size()); EXPECT_EQ("jebgalgnebhfojomionfpkfelancnnkf", ping_items[0].id); - EXPECT_TRUE(base::Version("0.9").Equals(ping_items[0].previous_version)); - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[0].next_version)); + EXPECT_EQ(base::Version("0.9"), ping_items[0].previous_version); + EXPECT_EQ(base::Version("1.0"), ping_items[0].next_version); EXPECT_EQ(0, ping_items[0].error_category); EXPECT_EQ(0, ping_items[0].error_code); } @@ -645,13 +645,13 @@ const auto& ping_items = items(); EXPECT_EQ(2U, ping_items.size()); EXPECT_EQ("jebgalgnebhfojomionfpkfelancnnkf", ping_items[0].id); - EXPECT_TRUE(base::Version("0.9").Equals(ping_items[0].previous_version)); - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[0].next_version)); + EXPECT_EQ(base::Version("0.9"), ping_items[0].previous_version); + EXPECT_EQ(base::Version("1.0"), ping_items[0].next_version); EXPECT_EQ(0, ping_items[0].error_category); EXPECT_EQ(0, ping_items[0].error_code); EXPECT_EQ("ihfokbkgjpifnbbojhneepfflplebdkc", ping_items[1].id); - EXPECT_TRUE(base::Version("0.8").Equals(ping_items[1].previous_version)); - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[1].next_version)); + EXPECT_EQ(base::Version("0.8"), ping_items[1].previous_version); + EXPECT_EQ(base::Version("1.0"), ping_items[1].next_version); EXPECT_EQ(0, ping_items[1].error_category); EXPECT_EQ(0, ping_items[1].error_code); } @@ -884,13 +884,13 @@ const auto& ping_items = items(); EXPECT_EQ(2U, ping_items.size()); EXPECT_EQ("jebgalgnebhfojomionfpkfelancnnkf", ping_items[0].id); - EXPECT_TRUE(base::Version("0.9").Equals(ping_items[0].previous_version)); - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[0].next_version)); + EXPECT_EQ(base::Version("0.9"), ping_items[0].previous_version); + EXPECT_EQ(base::Version("1.0"), ping_items[0].next_version); EXPECT_EQ(1, ping_items[0].error_category); // Network error. EXPECT_EQ(-118, ping_items[0].error_code); EXPECT_EQ("ihfokbkgjpifnbbojhneepfflplebdkc", ping_items[1].id); - EXPECT_TRUE(base::Version("0.8").Equals(ping_items[1].previous_version)); - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[1].next_version)); + EXPECT_EQ(base::Version("0.8"), ping_items[1].previous_version); + EXPECT_EQ(base::Version("1.0"), ping_items[1].next_version); EXPECT_EQ(0, ping_items[1].error_category); EXPECT_EQ(0, ping_items[1].error_code); } @@ -1143,13 +1143,13 @@ const auto& ping_items = items(); EXPECT_EQ(2U, ping_items.size()); EXPECT_EQ("ihfokbkgjpifnbbojhneepfflplebdkc", ping_items[0].id); - EXPECT_TRUE(base::Version("0.8").Equals(ping_items[0].previous_version)); - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[0].next_version)); + EXPECT_EQ(base::Version("0.8"), ping_items[0].previous_version); + EXPECT_EQ(base::Version("1.0"), ping_items[0].next_version); EXPECT_EQ(0, ping_items[0].error_category); EXPECT_EQ(0, ping_items[0].error_code); EXPECT_EQ("ihfokbkgjpifnbbojhneepfflplebdkc", ping_items[1].id); - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[1].previous_version)); - EXPECT_TRUE(base::Version("2.0").Equals(ping_items[1].next_version)); + EXPECT_EQ(base::Version("1.0"), ping_items[1].previous_version); + EXPECT_EQ(base::Version("2.0"), ping_items[1].next_version); EXPECT_EQ(0, ping_items[1].diff_error_category); EXPECT_EQ(0, ping_items[1].diff_error_code); } @@ -1361,8 +1361,8 @@ const auto& ping_items = items(); EXPECT_EQ(1U, ping_items.size()); EXPECT_EQ("jebgalgnebhfojomionfpkfelancnnkf", ping_items[0].id); - EXPECT_TRUE(base::Version("0.9").Equals(ping_items[0].previous_version)); - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[0].next_version)); + EXPECT_EQ(base::Version("0.9"), ping_items[0].previous_version); + EXPECT_EQ(base::Version("1.0"), ping_items[0].next_version); EXPECT_EQ(3, ping_items[0].error_category); // kInstallError. EXPECT_EQ(9, ping_items[0].error_code); // kInstallerError. } @@ -1616,13 +1616,13 @@ const auto& ping_items = items(); EXPECT_EQ(2U, ping_items.size()); EXPECT_EQ("ihfokbkgjpifnbbojhneepfflplebdkc", ping_items[0].id); - EXPECT_TRUE(base::Version("0.8").Equals(ping_items[0].previous_version)); - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[0].next_version)); + EXPECT_EQ(base::Version("0.8"), ping_items[0].previous_version); + EXPECT_EQ(base::Version("1.0"), ping_items[0].next_version); EXPECT_EQ(0, ping_items[0].error_category); EXPECT_EQ(0, ping_items[0].error_code); EXPECT_EQ("ihfokbkgjpifnbbojhneepfflplebdkc", ping_items[1].id); - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[1].previous_version)); - EXPECT_TRUE(base::Version("2.0").Equals(ping_items[1].next_version)); + EXPECT_EQ(base::Version("1.0"), ping_items[1].previous_version); + EXPECT_EQ(base::Version("2.0"), ping_items[1].next_version); EXPECT_TRUE(ping_items[1].diff_update_failed); EXPECT_EQ(1, ping_items[1].diff_error_category); // kNetworkError. EXPECT_EQ(-1, ping_items[1].diff_error_code); @@ -1920,8 +1920,8 @@ const auto& ping_items = items(); EXPECT_EQ(1U, ping_items.size()); EXPECT_EQ("jebgalgnebhfojomionfpkfelancnnkf", ping_items[0].id); - EXPECT_TRUE(base::Version("0.0").Equals(ping_items[0].previous_version)); - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[0].next_version)); + EXPECT_EQ(base::Version("0.0"), ping_items[0].previous_version); + EXPECT_EQ(base::Version("1.0"), ping_items[0].next_version); EXPECT_EQ(0, ping_items[0].error_category); EXPECT_EQ(0, ping_items[0].error_code); } @@ -2176,8 +2176,8 @@ const auto& ping_items = items(); EXPECT_EQ(1U, ping_items.size()); EXPECT_EQ("jebgalgnebhfojomionfpkfelancnnkf", ping_items[0].id); - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[0].previous_version)); - EXPECT_TRUE(base::Version("0.0").Equals(ping_items[0].next_version)); + EXPECT_EQ(base::Version("1.0"), ping_items[0].previous_version); + EXPECT_EQ(base::Version("0.0"), ping_items[0].next_version); EXPECT_EQ(10, ping_items[0].extra_code1); } };
diff --git a/components/variations/service/variations_service.cc b/components/variations/service/variations_service.cc index 0a63321..58bfab3 100644 --- a/components/variations/service/variations_service.cc +++ b/components/variations/service/variations_service.cc
@@ -799,7 +799,7 @@ // Determine if the version from the saved pref matches |version|. const bool does_version_match = - is_pref_valid && version.Equals(base::Version(stored_version_string)); + is_pref_valid && version == base::Version(stored_version_string); // Determine if the country in the saved pref matches the country in // |latest_country|.
diff --git a/components/visitedlink/browser/visitedlink_master.cc b/components/visitedlink/browser/visitedlink_master.cc index 4328700..70dfd1f 100644 --- a/components/visitedlink/browser/visitedlink_master.cc +++ b/components/visitedlink/browser/visitedlink_master.cc
@@ -282,7 +282,7 @@ used_items_ = 0; table_size_override_ = 0; suppress_rebuild_ = false; - sequence_token_ = BrowserThread::GetBlockingPool()->GetSequenceToken(); + sequence_token_ = base::SequencedWorkerPool::GetSequenceToken(); } bool VisitedLinkMaster::Init() {
diff --git a/components/web_view/test_runner/BUILD.gn b/components/web_view/test_runner/BUILD.gn index 7213ba4..b2ddb84 100644 --- a/components/web_view/test_runner/BUILD.gn +++ b/components/web_view/test_runner/BUILD.gn
@@ -21,9 +21,9 @@ "//build/config/sanitizers:deps", "//mojo/common", "//mojo/environment:chromium", - "//mojo/runner:lib", - "//mojo/runner:register_local_aliases_fwd", "//mojo/shell/runner/host:lib", + "//mojo/shell/standalone:lib", + "//mojo/shell/standalone:register_local_aliases_fwd", "//url", ]
diff --git a/components/web_view/test_runner/DEPS b/components/web_view/test_runner/DEPS index 6de84ba..e1fc2bb 100644 --- a/components/web_view/test_runner/DEPS +++ b/components/web_view/test_runner/DEPS
@@ -4,8 +4,8 @@ "+components/test_runner", "+components/web_view/public", "+mojo/public", - "+mojo/runner", "+mojo/shell/public", "+mojo/shell/runner", + "+mojo/shell/standalone", "+ui/gfx", ]
diff --git a/components/web_view/test_runner/launcher.cc b/components/web_view/test_runner/launcher.cc index 115835b..3fa9af4 100644 --- a/components/web_view/test_runner/launcher.cc +++ b/components/web_view/test_runner/launcher.cc
@@ -7,7 +7,7 @@ #include "base/bind.h" #include "base/message_loop/message_loop.h" #include "base/path_service.h" -#include "mojo/runner/context.h" +#include "mojo/shell/standalone/context.h" #include "url/gurl.h" namespace web_view { @@ -15,7 +15,7 @@ int LaunchTestRunner(int argc, char** argv) { // We want the runner::Context to outlive the MessageLoop so that pipes are // all gracefully closed / error-out before we try to shut the Context down. - mojo::runner::Context shell_context; + mojo::shell::Context shell_context; { base::MessageLoop message_loop; base::FilePath shell_dir; @@ -25,7 +25,7 @@ } message_loop.PostTask(FROM_HERE, - base::Bind(&mojo::runner::Context::Run, + base::Bind(&mojo::shell::Context::Run, base::Unretained(&shell_context), GURL("mojo:web_view_test_runner"))); message_loop.Run();
diff --git a/components/web_view/test_runner/register_local_aliases.cc b/components/web_view/test_runner/register_local_aliases.cc index 4d2e167..9533ed805 100644 --- a/components/web_view/test_runner/register_local_aliases.cc +++ b/components/web_view/test_runner/register_local_aliases.cc
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/register_local_aliases.h" +#include "mojo/shell/standalone/register_local_aliases.h" namespace mojo { -namespace runner { +namespace shell { -void RegisterLocalAliases(shell::PackageManagerImpl* manager) { +void RegisterLocalAliases(PackageManagerImpl* manager) { } -} // namespace runner +} // namespace shell } // namespace mojo
diff --git a/content/app/content_main_runner.cc b/content/app/content_main_runner.cc index 037c79bd..c04782f 100644 --- a/content/app/content_main_runner.cc +++ b/content/app/content_main_runner.cc
@@ -115,12 +115,6 @@ #include "crypto/nss_util.h" #endif -#if !defined(OS_MACOSX) && defined(USE_TCMALLOC) -extern "C" { -int tc_set_new_mode(int mode); -} -#endif - namespace content { extern int GpuMain(const content::MainFunctionParams&); #if defined(ENABLE_PLUGINS) @@ -150,10 +144,6 @@ g_empty_content_utility_client = LAZY_INSTANCE_INITIALIZER; #endif // !OS_IOS && !CHROME_MULTIPLE_DLL_BROWSER -#if defined(OS_WIN) - -#endif // defined(OS_WIN) - #if defined(OS_POSIX) && !defined(OS_IOS) // Setup signal-handling state: resanitize most signals, ignore SIGPIPE. @@ -417,16 +407,6 @@ Shutdown(); } -#if defined(USE_TCMALLOC) - static bool GetNumericPropertyThunk(const char* name, size_t* value) { - return MallocExtension::instance()->GetNumericProperty(name, value); - } - - static void ReleaseFreeMemoryThunk() { - MallocExtension::instance()->ReleaseFreeMemory(); - } -#endif - int Initialize(const ContentMainParams& params) override { ui_task_ = params.ui_task; @@ -445,20 +425,7 @@ TRACE_EVENT0("startup,benchmark", "ContentMainRunnerImpl::Initialize"); #endif // OS_ANDROID - // NOTE(willchan): One might ask why these TCMalloc-related calls are done - // here rather than in process_util_linux.cc with the definition of - // EnableTerminationOnOutOfMemory(). That's because base shouldn't have a - // dependency on TCMalloc. Really, we ought to have our allocator shim code - // implement this EnableTerminationOnOutOfMemory() function. Whateverz. - // This works for now. #if !defined(OS_MACOSX) && defined(USE_TCMALLOC) - // For tcmalloc, we need to tell it to behave like new. - tc_set_new_mode(1); - - // On windows, we've already set these thunks up in _heap_init() - base::allocator::SetGetNumericPropertyFunction(GetNumericPropertyThunk); - base::allocator::SetReleaseFreeMemoryFunction(ReleaseFreeMemoryThunk); - // Provide optional hook for monitoring allocation quantities on a // per-thread basis. Only set the hook if the environment indicates this // needs to be enabled.
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 4d66f86..cc4419c 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -417,10 +417,6 @@ if (is_chromeos) { sources -= [ "device_sensors/data_fetcher_shared_memory_default.cc" ] - sources += [ - "gpu/gpu_arc_video_service_host.cc", - "gpu/gpu_arc_video_service_host.h", - ] deps += [ "//chromeos", "//chromeos:power_manager_proto",
diff --git a/content/browser/DEPS b/content/browser/DEPS index 5e33c93..93be705 100644 --- a/content/browser/DEPS +++ b/content/browser/DEPS
@@ -1,7 +1,6 @@ include_rules = [ # Allow inclusion of specific components that we depend on. We may only # depend on components which we share with the mojo html_viewer. - "+components/arc", "+components/mime_util", "+components/mus/public/interfaces", "+components/mus/public",
diff --git a/content/browser/background_sync/background_sync.proto b/content/browser/background_sync/background_sync.proto index c6b4045..62dbe72 100644 --- a/content/browser/background_sync/background_sync.proto +++ b/content/browser/background_sync/background_sync.proto
@@ -14,16 +14,11 @@ NETWORK_STATE_ONLINE = 2; } -enum SyncPeriodicity { - SYNC_PERIODIC = 0; - SYNC_ONE_SHOT = 1; -} - message BackgroundSyncRegistrationProto { required int64 id = 1; required string tag = 2; - required SyncPeriodicity periodicity = 3; - required int64 min_period = 4; + // required SyncPeriodicity periodicity = 3; + // required int64 min_period = 4; required SyncNetworkState network_state = 5; // required SyncPowerState power_state = 6; required int32 num_attempts = 7;
diff --git a/content/browser/background_sync/background_sync_browsertest.cc b/content/browser/background_sync/background_sync_browsertest.cc index 3205c75b..10d5be9 100644 --- a/content/browser/background_sync/background_sync_browsertest.cc +++ b/content/browser/background_sync/background_sync_browsertest.cc
@@ -57,7 +57,7 @@ action.c_str()); } -void OneShotPendingCallback( +void RegistrationPendingCallback( const base::Closure& quit, const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, bool* result_out, @@ -66,7 +66,7 @@ task_runner->PostTask(FROM_HERE, quit); } -void OneShotPendingDidGetSyncRegistration( +void RegistrationPendingDidGetSyncRegistration( const base::Callback<void(bool)>& callback, BackgroundSyncStatus error_type, scoped_ptr<BackgroundSyncRegistrationHandle> registration_handle) { @@ -75,7 +75,7 @@ BackgroundSyncState::PENDING); } -void OneShotPendingDidGetSWRegistration( +void RegistrationPendingDidGetSWRegistration( const scoped_refptr<BackgroundSyncContext> sync_context, const std::string& tag, const base::Callback<void(bool)>& callback, @@ -85,19 +85,19 @@ int64_t service_worker_id = registration->id(); BackgroundSyncManager* sync_manager = sync_context->background_sync_manager(); sync_manager->GetRegistration( - service_worker_id, tag, SYNC_ONE_SHOT, - base::Bind(&OneShotPendingDidGetSyncRegistration, callback)); + service_worker_id, tag, + base::Bind(&RegistrationPendingDidGetSyncRegistration, callback)); } -void OneShotPendingOnIOThread( +void RegistrationPendingOnIOThread( const scoped_refptr<BackgroundSyncContext> sync_context, const scoped_refptr<ServiceWorkerContextWrapper> sw_context, const std::string& tag, const GURL& url, const base::Callback<void(bool)>& callback) { sw_context->FindReadyRegistrationForDocument( - url, base::Bind(&OneShotPendingDidGetSWRegistration, sync_context, tag, - callback)); + url, base::Bind(&RegistrationPendingDidGetSWRegistration, sync_context, + tag, callback)); } void SetMaxSyncAttemptsOnIOThread( @@ -169,9 +169,9 @@ result); } - // Returns true if the one-shot sync with tag is currently pending. Fails + // Returns true if the registration with tag |tag| is currently pending. Fails // (assertion failure) if the tag isn't registered. - bool OneShotPending(const std::string& tag); + bool RegistrationPending(const std::string& tag); // Sets the BackgroundSyncManager's max sync attempts per registration. void SetMaxSyncAttempts(int max_sync_attempts); @@ -181,17 +181,16 @@ std::string PopConsoleString(); bool PopConsole(const std::string& expected_msg); bool RegisterServiceWorker(); - bool RegisterOneShot(const std::string& tag); - bool RegisterOneShotFromServiceWorker(const std::string& tag); - bool GetRegistrationOneShot(const std::string& tag); - bool GetRegistrationOneShotFromServiceWorker(const std::string& tag); - bool MatchRegistrations(const std::string& script_result, - const std::vector<std::string>& expected_tags); - bool GetRegistrationsOneShot(const std::vector<std::string>& expected_tags); - bool GetRegistrationsOneShotFromServiceWorker( - const std::vector<std::string>& expected_tags); - bool CompleteDelayedOneShot(); - bool RejectDelayedOneShot(); + bool Register(const std::string& tag); + bool RegisterFromServiceWorker(const std::string& tag); + bool HasTag(const std::string& tag); + bool HasTagFromServiceWorker(const std::string& tag); + bool MatchTags(const std::string& script_result, + const std::vector<std::string>& expected_tags); + bool GetTags(const std::vector<std::string>& expected_tags); + bool GetTagsFromServiceWorker(const std::vector<std::string>& expected_tags); + bool CompleteDelayedSyncEvent(); + bool RejectDelayedSyncEvent(); net::EmbeddedTestServer* https_server() { return https_server_.get(); } @@ -202,7 +201,7 @@ DISALLOW_COPY_AND_ASSIGN(BackgroundSyncBrowserTest); }; -bool BackgroundSyncBrowserTest::OneShotPending(const std::string& tag) { +bool BackgroundSyncBrowserTest::RegistrationPending(const std::string& tag) { bool is_pending; base::RunLoop run_loop; @@ -213,12 +212,13 @@ storage->GetServiceWorkerContext()); base::Callback<void(bool)> callback = - base::Bind(&OneShotPendingCallback, run_loop.QuitClosure(), + base::Bind(&RegistrationPendingCallback, run_loop.QuitClosure(), base::ThreadTaskRunnerHandle::Get(), &is_pending); BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, - base::Bind(&OneShotPendingOnIOThread, make_scoped_refptr(sync_context), + base::Bind(&RegistrationPendingOnIOThread, + make_scoped_refptr(sync_context), make_scoped_refptr(service_worker_context), tag, https_server_->GetURL(kDefaultTestURL), callback)); @@ -281,41 +281,37 @@ return script_result == BuildExpectedResult("service worker", "registered"); } -bool BackgroundSyncBrowserTest::RegisterOneShot(const std::string& tag) { +bool BackgroundSyncBrowserTest::Register(const std::string& tag) { std::string script_result; - EXPECT_TRUE( - RunScript(BuildScriptString("registerOneShot", tag), &script_result)); + EXPECT_TRUE(RunScript(BuildScriptString("register", tag), &script_result)); return script_result == BuildExpectedResult(tag, "registered"); } -bool BackgroundSyncBrowserTest::RegisterOneShotFromServiceWorker( +bool BackgroundSyncBrowserTest::RegisterFromServiceWorker( const std::string& tag) { std::string script_result; - EXPECT_TRUE( - RunScript(BuildScriptString("registerOneShotFromServiceWorker", tag), - &script_result)); + EXPECT_TRUE(RunScript(BuildScriptString("registerFromServiceWorker", tag), + &script_result)); return script_result == BuildExpectedResult(tag, "register sent to SW"); } -bool BackgroundSyncBrowserTest::GetRegistrationOneShot(const std::string& tag) { +bool BackgroundSyncBrowserTest::HasTag(const std::string& tag) { std::string script_result; - EXPECT_TRUE(RunScript(BuildScriptString("getRegistrationOneShot", tag), - &script_result)); + EXPECT_TRUE(RunScript(BuildScriptString("hasTag", tag), &script_result)); return script_result == BuildExpectedResult(tag, "found"); } -bool BackgroundSyncBrowserTest::GetRegistrationOneShotFromServiceWorker( +bool BackgroundSyncBrowserTest::HasTagFromServiceWorker( const std::string& tag) { std::string script_result; - EXPECT_TRUE(RunScript( - BuildScriptString("getRegistrationOneShotFromServiceWorker", tag), - &script_result)); - EXPECT_TRUE(script_result == "ok - getRegistration sent to SW"); + EXPECT_TRUE(RunScript(BuildScriptString("hasTagFromServiceWorker", tag), + &script_result)); + EXPECT_TRUE(script_result == "ok - hasTag sent to SW"); return PopConsole(BuildExpectedResult(tag, "found")); } -bool BackgroundSyncBrowserTest::MatchRegistrations( +bool BackgroundSyncBrowserTest::MatchTags( const std::string& script_result, const std::vector<std::string>& expected_tags) { EXPECT_TRUE(base::StartsWith(script_result, kSuccessfulOperationPrefix, @@ -329,79 +325,80 @@ std::set<std::string>(result_tags.begin(), result_tags.end()); } -bool BackgroundSyncBrowserTest::GetRegistrationsOneShot( +bool BackgroundSyncBrowserTest::GetTags( const std::vector<std::string>& expected_tags) { std::string script_result; - EXPECT_TRUE(RunScript("getRegistrationsOneShot()", &script_result)); + EXPECT_TRUE(RunScript("getTags()", &script_result)); - return MatchRegistrations(script_result, expected_tags); + return MatchTags(script_result, expected_tags); } -bool BackgroundSyncBrowserTest::GetRegistrationsOneShotFromServiceWorker( +bool BackgroundSyncBrowserTest::GetTagsFromServiceWorker( const std::vector<std::string>& expected_tags) { std::string script_result; - EXPECT_TRUE( - RunScript("getRegistrationsOneShotFromServiceWorker()", &script_result)); - EXPECT_TRUE(script_result == "ok - getRegistrations sent to SW"); + EXPECT_TRUE(RunScript("getTagsFromServiceWorker()", &script_result)); + EXPECT_TRUE(script_result == "ok - getTags sent to SW"); - return MatchRegistrations(PopConsoleString(), expected_tags); + return MatchTags(PopConsoleString(), expected_tags); } -bool BackgroundSyncBrowserTest::CompleteDelayedOneShot() { +bool BackgroundSyncBrowserTest::CompleteDelayedSyncEvent() { std::string script_result; - EXPECT_TRUE(RunScript("completeDelayedOneShot()", &script_result)); + EXPECT_TRUE(RunScript("completeDelayedSyncEvent()", &script_result)); return script_result == BuildExpectedResult("delay", "completing"); } -bool BackgroundSyncBrowserTest::RejectDelayedOneShot() { +bool BackgroundSyncBrowserTest::RejectDelayedSyncEvent() { std::string script_result; - EXPECT_TRUE(RunScript("rejectDelayedOneShot()", &script_result)); + EXPECT_TRUE(RunScript("rejectDelayedSyncEvent()", &script_result)); return script_result == BuildExpectedResult("delay", "rejecting"); } -IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, OneShotFiresControlled) { +IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, + RegisterFromControlledDocument) { EXPECT_TRUE(RegisterServiceWorker()); EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. - EXPECT_TRUE(RegisterOneShot("foo")); + EXPECT_TRUE(Register("foo")); EXPECT_TRUE(PopConsole("foo fired")); - EXPECT_FALSE(GetRegistrationOneShot("foo")); + EXPECT_FALSE(HasTag("foo")); } -IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, OneShotFiresUncontrolled) { +IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, + RegisterFromUncontrolledDocument) { EXPECT_TRUE(RegisterServiceWorker()); - EXPECT_TRUE(RegisterOneShot("foo")); + EXPECT_TRUE(Register("foo")); EXPECT_TRUE(PopConsole("foo fired")); - EXPECT_FALSE(GetRegistrationOneShot("foo")); + EXPECT_FALSE(HasTag("foo")); } // Verify that Register works in a service worker -IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, - OneShotFromServiceWorkerFires) { +IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, RegisterFromServiceWorker) { EXPECT_TRUE(RegisterServiceWorker()); EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. - EXPECT_TRUE(RegisterOneShotFromServiceWorker("foo_sw")); + EXPECT_TRUE(RegisterFromServiceWorker("foo_sw")); EXPECT_TRUE(PopConsole("ok - foo_sw registered in SW")); EXPECT_TRUE(PopConsole("foo_sw fired")); - EXPECT_FALSE(GetRegistrationOneShot("foo_sw")); + EXPECT_FALSE(HasTag("foo_sw")); } -IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, OneShotDelaysForNetwork) { +IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, + RegistrationDelaysForNetwork) { EXPECT_TRUE(RegisterServiceWorker()); EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. // Prevent firing by going offline. background_sync_test_util::SetOnline(web_contents(), false); - EXPECT_TRUE(RegisterOneShot("foo")); - EXPECT_TRUE(GetRegistrationOneShot("foo")); - EXPECT_TRUE(OneShotPending("foo")); + EXPECT_TRUE(Register("foo")); + EXPECT_TRUE(HasTag("foo")); + EXPECT_TRUE(RegistrationPending("foo")); // Resume firing by going online. background_sync_test_util::SetOnline(web_contents(), true); EXPECT_TRUE(PopConsole("foo fired")); - EXPECT_FALSE(GetRegistrationOneShot("foo")); + EXPECT_FALSE(HasTag("foo")); } IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, WaitUntil) { @@ -409,18 +406,18 @@ EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. background_sync_test_util::SetOnline(web_contents(), true); - EXPECT_TRUE(RegisterOneShot("delay")); + EXPECT_TRUE(Register("delay")); // Verify that it is firing. - EXPECT_TRUE(GetRegistrationOneShot("delay")); - EXPECT_FALSE(OneShotPending("delay")); + EXPECT_TRUE(HasTag("delay")); + EXPECT_FALSE(RegistrationPending("delay")); // Complete the task. - EXPECT_TRUE(CompleteDelayedOneShot()); + EXPECT_TRUE(CompleteDelayedSyncEvent()); EXPECT_TRUE(PopConsole("ok - delay completed")); // Verify that it finished firing. - EXPECT_FALSE(GetRegistrationOneShot("delay")); + EXPECT_FALSE(HasTag("delay")); } IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, WaitUntilReject) { @@ -428,16 +425,16 @@ EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. background_sync_test_util::SetOnline(web_contents(), true); - EXPECT_TRUE(RegisterOneShot("delay")); + EXPECT_TRUE(Register("delay")); // Verify that it is firing. - EXPECT_TRUE(GetRegistrationOneShot("delay")); - EXPECT_FALSE(OneShotPending("delay")); + EXPECT_TRUE(HasTag("delay")); + EXPECT_FALSE(RegistrationPending("delay")); // Complete the task. - EXPECT_TRUE(RejectDelayedOneShot()); + EXPECT_TRUE(RejectDelayedSyncEvent()); EXPECT_TRUE(PopConsole("ok - delay rejected")); - EXPECT_FALSE(GetRegistrationOneShot("delay")); + EXPECT_FALSE(HasTag("delay")); } IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, Incognito) { @@ -445,8 +442,8 @@ EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. background_sync_test_util::SetOnline(web_contents(), false); - EXPECT_TRUE(RegisterOneShot("normal")); - EXPECT_TRUE(OneShotPending("normal")); + EXPECT_TRUE(Register("normal")); + EXPECT_TRUE(RegistrationPending("normal")); // Go incognito and verify that incognito doesn't see the registration. SetIncognitoMode(true); @@ -459,34 +456,34 @@ EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); EXPECT_TRUE(RegisterServiceWorker()); - EXPECT_FALSE(GetRegistrationOneShot("normal")); + EXPECT_FALSE(HasTag("normal")); - EXPECT_TRUE(RegisterOneShot("incognito")); - EXPECT_TRUE(OneShotPending("incognito")); + EXPECT_TRUE(Register("incognito")); + EXPECT_TRUE(RegistrationPending("incognito")); // Switch back and make sure the registration is still there. SetIncognitoMode(false); EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Should be controlled. - EXPECT_TRUE(GetRegistrationOneShot("normal")); - EXPECT_FALSE(GetRegistrationOneShot("incognito")); + EXPECT_TRUE(HasTag("normal")); + EXPECT_FALSE(HasTag("incognito")); } -IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, GetRegistrations) { +IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, GetTags) { EXPECT_TRUE(RegisterServiceWorker()); EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. std::vector<std::string> registered_tags; - EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); + EXPECT_TRUE(GetTags(registered_tags)); background_sync_test_util::SetOnline(web_contents(), false); registered_tags.push_back("foo"); registered_tags.push_back("bar"); for (const std::string& tag : registered_tags) - EXPECT_TRUE(RegisterOneShot(tag)); + EXPECT_TRUE(Register(tag)); - EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); + EXPECT_TRUE(GetTags(registered_tags)); } // Verify that GetRegistrations works in a service worker @@ -496,34 +493,33 @@ EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. std::vector<std::string> registered_tags; - EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); + EXPECT_TRUE(GetTags(registered_tags)); background_sync_test_util::SetOnline(web_contents(), false); registered_tags.push_back("foo_sw"); registered_tags.push_back("bar_sw"); for (const std::string& tag : registered_tags) { - EXPECT_TRUE(RegisterOneShotFromServiceWorker(tag)); + EXPECT_TRUE(RegisterFromServiceWorker(tag)); EXPECT_TRUE(PopConsole(BuildExpectedResult(tag, "registered in SW"))); } - EXPECT_TRUE(GetRegistrationsOneShotFromServiceWorker(registered_tags)); + EXPECT_TRUE(GetTagsFromServiceWorker(registered_tags)); } // Verify that GetRegistration works in a service worker -IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, - GetRegistrationFromServiceWorker) { +IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, HasTagFromServiceWorker) { EXPECT_TRUE(RegisterServiceWorker()); EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. std::vector<std::string> registered_tags; - EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); + EXPECT_TRUE(GetTags(registered_tags)); background_sync_test_util::SetOnline(web_contents(), false); - EXPECT_TRUE(RegisterOneShotFromServiceWorker("foo_sw")); + EXPECT_TRUE(RegisterFromServiceWorker("foo_sw")); EXPECT_TRUE(PopConsole("ok - foo_sw registered in SW")); - EXPECT_TRUE(GetRegistrationOneShotFromServiceWorker("foo_sw")); + EXPECT_TRUE(HasTagFromServiceWorker("foo_sw")); } // Verify that a background sync registration is deleted when site data is @@ -535,15 +531,15 @@ // Prevent firing by going offline. background_sync_test_util::SetOnline(web_contents(), false); - EXPECT_TRUE(RegisterOneShot("foo")); - EXPECT_TRUE(GetRegistrationOneShot("foo")); - EXPECT_TRUE(OneShotPending("foo")); + EXPECT_TRUE(Register("foo")); + EXPECT_TRUE(HasTag("foo")); + EXPECT_TRUE(RegistrationPending("foo")); // Simulate a user clearing site data (including Service Workers, crucially), // by clearing data from the storage partition. ClearStoragePartitionData(); - EXPECT_FALSE(GetRegistrationOneShot("foo")); + EXPECT_FALSE(HasTag("foo")); } // Verify that a background sync registration, from a service worker, is deleted @@ -554,19 +550,19 @@ EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. std::vector<std::string> registered_tags; - EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); + EXPECT_TRUE(GetTags(registered_tags)); background_sync_test_util::SetOnline(web_contents(), false); - EXPECT_TRUE(RegisterOneShotFromServiceWorker("foo_sw")); + EXPECT_TRUE(RegisterFromServiceWorker("foo_sw")); EXPECT_TRUE(PopConsole("ok - foo_sw registered in SW")); - EXPECT_TRUE(GetRegistrationOneShotFromServiceWorker("foo_sw")); + EXPECT_TRUE(HasTagFromServiceWorker("foo_sw")); // Simulate a user clearing site data (including Service Workers, crucially), // by clearing data from the storage partition. ClearStoragePartitionData(); - EXPECT_FALSE(GetRegistrationOneShotFromServiceWorker("foo")); + EXPECT_FALSE(HasTagFromServiceWorker("foo")); } // Verify that multiple background sync registrations are deleted when site @@ -577,26 +573,26 @@ EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. std::vector<std::string> registered_tags; - EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); + EXPECT_TRUE(GetTags(registered_tags)); background_sync_test_util::SetOnline(web_contents(), false); registered_tags.push_back("foo"); registered_tags.push_back("bar"); for (const std::string& tag : registered_tags) - EXPECT_TRUE(RegisterOneShot(tag)); + EXPECT_TRUE(Register(tag)); - EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); + EXPECT_TRUE(GetTags(registered_tags)); for (const std::string& tag : registered_tags) - EXPECT_TRUE(OneShotPending(tag)); + EXPECT_TRUE(RegistrationPending(tag)); // Simulate a user clearing site data (including Service Workers, crucially), // by clearing data from the storage partition. ClearStoragePartitionData(); for (const std::string& tag : registered_tags) - EXPECT_FALSE(GetRegistrationOneShot(tag)); + EXPECT_FALSE(HasTag(tag)); } // Verify that a sync event that is currently firing is deleted when site @@ -607,18 +603,18 @@ EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. background_sync_test_util::SetOnline(web_contents(), true); - EXPECT_TRUE(RegisterOneShot("delay")); + EXPECT_TRUE(Register("delay")); // Verify that it is firing. - EXPECT_TRUE(GetRegistrationOneShot("delay")); - EXPECT_FALSE(OneShotPending("delay")); + EXPECT_TRUE(HasTag("delay")); + EXPECT_FALSE(RegistrationPending("delay")); // Simulate a user clearing site data (including Service Workers, crucially), // by clearing data from the storage partition. ClearStoragePartitionData(); // Verify that it was deleted. - EXPECT_FALSE(GetRegistrationOneShot("delay")); + EXPECT_FALSE(HasTag("delay")); } // Disabled due to flakiness. See https://crbug.com/578952. @@ -628,20 +624,19 @@ SetMaxSyncAttempts(2); - EXPECT_TRUE(RegisterOneShot("delay")); - EXPECT_TRUE(RejectDelayedOneShot()); + EXPECT_TRUE(Register("delay")); + EXPECT_TRUE(RejectDelayedSyncEvent()); EXPECT_TRUE(PopConsole("ok - delay rejected")); - // Verify that the oneshot is still around and waiting to try again. - EXPECT_TRUE(OneShotPending("delay")); + // Verify that the registration is still around and waiting to try again. + EXPECT_TRUE(RegistrationPending("delay")); } IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, RegisterFromNonMainFrame) { std::string script_result; GURL url = https_server()->GetURL(kEmptyURL); - EXPECT_TRUE( - RunScript(BuildScriptString("registerOneShotFromLocalFrame", url.spec()), - &script_result)); + EXPECT_TRUE(RunScript(BuildScriptString("registerFromLocalFrame", url.spec()), + &script_result)); EXPECT_EQ(BuildExpectedResult("iframe", "failed to register sync"), script_result); } @@ -655,10 +650,9 @@ std::string script_result; GURL url = alt_server.GetURL(kRegisterSyncURL); - EXPECT_TRUE( - RunScript(BuildScriptString("registerOneShotFromCrossOriginServiceWorker", - url.spec()), - &script_result)); + EXPECT_TRUE(RunScript( + BuildScriptString("registerFromCrossOriginServiceWorker", url.spec()), + &script_result)); EXPECT_EQ(BuildExpectedResult("worker", "failed to register sync"), script_result); }
diff --git a/content/browser/background_sync/background_sync_manager.cc b/content/browser/background_sync/background_sync_manager.cc index b10978d..001f5f7 100644 --- a/content/browser/background_sync/background_sync_manager.cc +++ b/content/browser/background_sync/background_sync_manager.cc
@@ -126,8 +126,6 @@ int request_id, const ServiceWorkerVersion::StatusCallback& callback, ServiceWorkerEventStatus status) { - TRACE_EVENT1("ServiceWorker", "BackgroundSyncManager::OnSyncEventFinished", - "Request id", request_id); if (!active_version->FinishRequest(request_id)) return; callback.Run(mojo::ConvertTo<ServiceWorkerStatusCode>(status)); @@ -163,19 +161,17 @@ BackgroundSyncManager::RegistrationKey::RegistrationKey( const BackgroundSyncRegistration& registration) - : RegistrationKey(registration.options()->tag, - registration.options()->periodicity) { -} + : RegistrationKey(registration.options()->tag) {} BackgroundSyncManager::RegistrationKey::RegistrationKey( const BackgroundSyncRegistrationOptions& options) - : RegistrationKey(options.tag, options.periodicity) { -} + : RegistrationKey(options.tag) {} -BackgroundSyncManager::RegistrationKey::RegistrationKey( - const std::string& tag, - SyncPeriodicity periodicity) - : value_(periodicity == SYNC_ONE_SHOT ? "o_" + tag : "p_" + tag) { +BackgroundSyncManager::RegistrationKey::RegistrationKey(const std::string& tag) + : value_("o_" + tag) { + // Note that the "o_" prefix on the key is because at one time one-shots were + // prefixed with an "o_" and periodic with a "p_". Removing the "o_" requires + // migration. } void BackgroundSyncManager::Register( @@ -187,7 +183,7 @@ if (disabled_) { BackgroundSyncMetrics::CountRegisterFailure( - options.periodicity, BACKGROUND_SYNC_STATUS_STORAGE_ERROR); + BACKGROUND_SYNC_STATUS_STORAGE_ERROR); PostErrorResponse(BACKGROUND_SYNC_STATUS_STORAGE_ERROR, callback); return; } @@ -209,7 +205,6 @@ void BackgroundSyncManager::GetRegistration( int64_t sw_registration_id, const std::string& sync_registration_tag, - SyncPeriodicity periodicity, const StatusAndRegistrationCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); @@ -218,7 +213,7 @@ return; } - RegistrationKey registration_key(sync_registration_tag, periodicity); + RegistrationKey registration_key(sync_registration_tag); op_scheduler_.ScheduleOperation(base::Bind( &BackgroundSyncManager::GetRegistrationImpl, @@ -228,7 +223,6 @@ void BackgroundSyncManager::GetRegistrations( int64_t sw_registration_id, - SyncPeriodicity periodicity, const StatusAndRegistrationsCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); @@ -246,7 +240,7 @@ op_scheduler_.ScheduleOperation( base::Bind(&BackgroundSyncManager::GetRegistrationsImpl, weak_ptr_factory_.GetWeakPtr(), sw_registration_id, - periodicity, MakeStatusAndRegistrationsCompletion(callback))); + MakeStatusAndRegistrationsCompletion(callback))); } // Given a HandleId |handle_id|, return a new handle for the same @@ -397,8 +391,7 @@ break; } - RegistrationKey registration_key(registration_proto.tag(), - registration_proto.periodicity()); + RegistrationKey registration_key(registration_proto.tag()); scoped_refptr<RefCountedRegistration> ref_registration( new RefCountedRegistration()); @@ -407,8 +400,6 @@ BackgroundSyncRegistrationOptions* options = registration->options(); options->tag = registration_proto.tag(); - options->periodicity = registration_proto.periodicity(); - options->min_period = registration_proto.min_period(); options->network_state = registration_proto.network_state(); registration->set_id(registration_proto.id()); @@ -444,7 +435,7 @@ service_worker_context_->GetLiveRegistration(sw_registration_id); if (!sw_registration || !sw_registration->active_version()) { BackgroundSyncMetrics::CountRegisterFailure( - options.periodicity, BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER); + BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER); PostErrorResponse(BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER, callback); return; } @@ -465,7 +456,7 @@ if (!has_main_frame_client) { BackgroundSyncMetrics::CountRegisterFailure( - options.periodicity, BACKGROUND_SYNC_STATUS_NOT_ALLOWED); + BACKGROUND_SYNC_STATUS_NOT_ALLOWED); PostErrorResponse(BACKGROUND_SYNC_STATUS_NOT_ALLOWED, callback); return; } @@ -480,14 +471,14 @@ if (disabled_) { BackgroundSyncMetrics::CountRegisterFailure( - options.periodicity, BACKGROUND_SYNC_STATUS_STORAGE_ERROR); + BACKGROUND_SYNC_STATUS_STORAGE_ERROR); PostErrorResponse(BACKGROUND_SYNC_STATUS_STORAGE_ERROR, callback); return; } if (options.tag.length() > kMaxTagLength) { BackgroundSyncMetrics::CountRegisterFailure( - options.periodicity, BACKGROUND_SYNC_STATUS_NOT_ALLOWED); + BACKGROUND_SYNC_STATUS_NOT_ALLOWED); PostErrorResponse(BACKGROUND_SYNC_STATUS_NOT_ALLOWED, callback); return; } @@ -496,7 +487,7 @@ service_worker_context_->GetLiveRegistration(sw_registration_id); if (!sw_registration || !sw_registration->active_version()) { BackgroundSyncMetrics::CountRegisterFailure( - options.periodicity, BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER); + BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER); PostErrorResponse(BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER, callback); return; } @@ -518,7 +509,6 @@ ? BackgroundSyncMetrics::REGISTRATION_COULD_FIRE : BackgroundSyncMetrics::REGISTRATION_COULD_NOT_FIRE; BackgroundSyncMetrics::CountRegisterSuccess( - existing_registration->options()->periodicity, registration_could_fire, BackgroundSyncMetrics::REGISTRATION_IS_DUPLICATE); @@ -666,8 +656,6 @@ registrations_proto.add_registration(); registration_proto->set_id(registration.id()); registration_proto->set_tag(registration.options()->tag); - registration_proto->set_periodicity(registration.options()->periodicity); - registration_proto->set_min_period(registration.options()->min_period); registration_proto->set_network_state( registration.options()->network_state); registration_proto->set_num_attempts(registration.num_attempts()); @@ -695,7 +683,6 @@ if (status == SERVICE_WORKER_ERROR_NOT_FOUND) { // The service worker registration is gone. BackgroundSyncMetrics::CountRegisterFailure( - new_registration->options()->periodicity, BACKGROUND_SYNC_STATUS_STORAGE_ERROR); active_registrations_.erase(sw_registration_id); PostErrorResponse(BACKGROUND_SYNC_STATUS_STORAGE_ERROR, callback); @@ -706,7 +693,6 @@ LOG(ERROR) << "BackgroundSync failed to store registration due to backend " "failure."; BackgroundSyncMetrics::CountRegisterFailure( - new_registration->options()->periodicity, BACKGROUND_SYNC_STATUS_STORAGE_ERROR); DisableAndClearManager(base::Bind( callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR, @@ -719,7 +705,7 @@ ? BackgroundSyncMetrics::REGISTRATION_COULD_FIRE : BackgroundSyncMetrics::REGISTRATION_COULD_NOT_FIRE; BackgroundSyncMetrics::CountRegisterSuccess( - new_registration->options()->periodicity, registration_could_fire, + registration_could_fire, BackgroundSyncMetrics::REGISTRATION_IS_NOT_DUPLICATE); FireReadyEvents(); @@ -779,7 +765,7 @@ callback); } -void BackgroundSyncManager::FireOneShotSync( +void BackgroundSyncManager::DispatchSyncEvent( BackgroundSyncRegistrationHandle::HandleId handle_id, const scoped_refptr<ServiceWorkerVersion>& active_version, BackgroundSyncEventLastChance last_chance, @@ -789,7 +775,7 @@ if (active_version->running_status() != ServiceWorkerVersion::RUNNING) { active_version->RunAfterStartWorker( - base::Bind(&BackgroundSyncManager::FireOneShotSync, + base::Bind(&BackgroundSyncManager::DispatchSyncEvent, weak_ptr_factory_.GetWeakPtr(), handle_id, active_version, last_chance, callback), callback); @@ -870,7 +856,6 @@ if (disabled_) { BackgroundSyncMetrics::CountUnregister( - registration->options()->periodicity, BACKGROUND_SYNC_STATUS_STORAGE_ERROR); base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR)); @@ -880,20 +865,19 @@ op_scheduler_.ScheduleOperation(base::Bind( &BackgroundSyncManager::UnregisterImpl, weak_ptr_factory_.GetWeakPtr(), sw_registration_id, RegistrationKey(*registration), registration->id(), - registration->options()->periodicity, MakeStatusCompletion(callback))); + MakeStatusCompletion(callback))); } void BackgroundSyncManager::UnregisterImpl( int64_t sw_registration_id, const RegistrationKey& registration_key, BackgroundSyncRegistration::RegistrationId sync_registration_id, - SyncPeriodicity periodicity, const StatusCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); if (disabled_) { BackgroundSyncMetrics::CountUnregister( - periodicity, BACKGROUND_SYNC_STATUS_STORAGE_ERROR); + BACKGROUND_SYNC_STATUS_STORAGE_ERROR); base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR)); return; @@ -904,8 +888,7 @@ if (!existing_registration || existing_registration->value()->id() != sync_registration_id) { - BackgroundSyncMetrics::CountUnregister(periodicity, - BACKGROUND_SYNC_STATUS_NOT_FOUND); + BackgroundSyncMetrics::CountUnregister(BACKGROUND_SYNC_STATUS_NOT_FOUND); base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_NOT_FOUND)); return; @@ -915,14 +898,13 @@ RemoveActiveRegistration(sw_registration_id, registration_key); - StoreRegistrations(sw_registration_id, - base::Bind(&BackgroundSyncManager::UnregisterDidStore, - weak_ptr_factory_.GetWeakPtr(), - sw_registration_id, periodicity, callback)); + StoreRegistrations( + sw_registration_id, + base::Bind(&BackgroundSyncManager::UnregisterDidStore, + weak_ptr_factory_.GetWeakPtr(), sw_registration_id, callback)); } void BackgroundSyncManager::UnregisterDidStore(int64_t sw_registration_id, - SyncPeriodicity periodicity, const StatusCallback& callback, ServiceWorkerStatusCode status) { DCHECK_CURRENTLY_ON(BrowserThread::IO); @@ -930,7 +912,7 @@ if (status == SERVICE_WORKER_ERROR_NOT_FOUND) { // ServiceWorker was unregistered. BackgroundSyncMetrics::CountUnregister( - periodicity, BACKGROUND_SYNC_STATUS_STORAGE_ERROR); + BACKGROUND_SYNC_STATUS_STORAGE_ERROR); active_registrations_.erase(sw_registration_id); base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR)); @@ -940,14 +922,13 @@ if (status != SERVICE_WORKER_OK) { LOG(ERROR) << "BackgroundSync failed to unregister due to backend failure."; BackgroundSyncMetrics::CountUnregister( - periodicity, BACKGROUND_SYNC_STATUS_STORAGE_ERROR); + BACKGROUND_SYNC_STATUS_STORAGE_ERROR); DisableAndClearManager( base::Bind(callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR)); return; } - BackgroundSyncMetrics::CountUnregister(periodicity, - BACKGROUND_SYNC_STATUS_OK); + BackgroundSyncMetrics::CountUnregister(BACKGROUND_SYNC_STATUS_OK); base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_OK)); } @@ -977,7 +958,6 @@ scoped_ptr<BackgroundSyncRegistrationHandle> registration_handle, const StatusAndStateCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - DCHECK_EQ(SYNC_ONE_SHOT, registration_handle->options()->periodicity); if (disabled_) { base::ThreadTaskRunnerHandle::Get()->PostTask( @@ -1034,7 +1014,6 @@ void BackgroundSyncManager::GetRegistrationsImpl( int64_t sw_registration_id, - SyncPeriodicity periodicity, const StatusAndRegistrationsCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); @@ -1055,10 +1034,8 @@ const BackgroundSyncRegistrations& registrations = it->second; for (const auto& tag_and_registration : registrations.registration_map) { RefCountedRegistration* registration = tag_and_registration.second.get(); - if (registration->value()->options()->periodicity == periodicity) { - out_registrations->push_back( - CreateRegistrationHandle(registration).release()); - } + out_registrations->push_back( + CreateRegistrationHandle(registration).release()); } } @@ -1077,18 +1054,12 @@ const BackgroundSyncRegistration& registration) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - // TODO(jkarlin): Add support for firing periodic registrations. - if (registration.options()->periodicity == SYNC_PERIODIC) - return false; - if (registration.sync_state() != BackgroundSyncState::PENDING) return false; if (clock_->Now() < registration.delay_until()) return false; - DCHECK_EQ(SYNC_ONE_SHOT, registration.options()->periodicity); - return AreOptionConditionsMet(*registration.options()); } @@ -1102,18 +1073,13 @@ const BackgroundSyncRegistration& registration = *key_and_registration.second->value(); if (registration.sync_state() == BackgroundSyncState::PENDING) { - if (registration.options()->periodicity == SYNC_ONE_SHOT) { - if (clock_->Now() >= registration.delay_until()) { - soonest_wakeup_delta = base::TimeDelta(); - } else { - base::TimeDelta delay_delta = - registration.delay_until() - clock_->Now(); - if (delay_delta < soonest_wakeup_delta) - soonest_wakeup_delta = delay_delta; - } + if (clock_->Now() >= registration.delay_until()) { + soonest_wakeup_delta = base::TimeDelta(); } else { - // TODO(jkarlin): Support keeping the browser alive for periodic - // syncs. + base::TimeDelta delay_delta = + registration.delay_until() - clock_->Now(); + if (delay_delta < soonest_wakeup_delta) + soonest_wakeup_delta = delay_delta; } } } @@ -1260,10 +1226,9 @@ HasMainFrameProviderHost( service_worker_registration->pattern().GetOrigin(), - base::Bind(&BackgroundSyncMetrics::RecordEventStarted, - registration->value()->options()->periodicity)); + base::Bind(&BackgroundSyncMetrics::RecordEventStarted)); - FireOneShotSync( + DispatchSyncEvent( handle_id, service_worker_registration->active_version(), last_chance, base::Bind(&BackgroundSyncManager::EventComplete, weak_ptr_factory_.GetWeakPtr(), service_worker_registration, @@ -1326,52 +1291,44 @@ HasMainFrameProviderHost( sw_registration->pattern().GetOrigin(), base::Bind(&BackgroundSyncMetrics::RecordEventResult, - registration->options()->periodicity, status_code == SERVICE_WORKER_OK)); } - if (registration->options()->periodicity == SYNC_ONE_SHOT) { + if (registration->sync_state() == + BackgroundSyncState::REREGISTERED_WHILE_FIRING) { + registration->set_sync_state(BackgroundSyncState::PENDING); + registration->set_num_attempts(0); + } else if (status_code != SERVICE_WORKER_OK) { // Sync failed + bool can_retry = + registration->num_attempts() < parameters_->max_sync_attempts; if (registration->sync_state() == - BackgroundSyncState::REREGISTERED_WHILE_FIRING) { + BackgroundSyncState::UNREGISTERED_WHILE_FIRING) { + registration->set_sync_state(can_retry ? BackgroundSyncState::UNREGISTERED + : BackgroundSyncState::FAILED); + registration->RunFinishedCallbacks(); + } else if (can_retry) { registration->set_sync_state(BackgroundSyncState::PENDING); - registration->set_num_attempts(0); - } else if (status_code != SERVICE_WORKER_OK) { // Sync failed - bool can_retry = - registration->num_attempts() < parameters_->max_sync_attempts; - if (registration->sync_state() == - BackgroundSyncState::UNREGISTERED_WHILE_FIRING) { - registration->set_sync_state(can_retry - ? BackgroundSyncState::UNREGISTERED - : BackgroundSyncState::FAILED); - registration->RunFinishedCallbacks(); - } else if (can_retry) { - registration->set_sync_state(BackgroundSyncState::PENDING); - registration->set_delay_until( - clock_->Now() + - parameters_->initial_retry_delay * - pow(parameters_->retry_delay_factor, - registration->num_attempts() - 1)); - } else { - registration->set_sync_state(BackgroundSyncState::FAILED); - registration->RunFinishedCallbacks(); - } - } else { // Sync succeeded - registration->set_sync_state(BackgroundSyncState::SUCCESS); + registration->set_delay_until(clock_->Now() + + parameters_->initial_retry_delay * + pow(parameters_->retry_delay_factor, + registration->num_attempts() - 1)); + } else { + registration->set_sync_state(BackgroundSyncState::FAILED); registration->RunFinishedCallbacks(); } + } else { // Sync succeeded + registration->set_sync_state(BackgroundSyncState::SUCCESS); + registration->RunFinishedCallbacks(); + } - if (registration->HasCompleted()) { - RegistrationKey key(*registration); - RefCountedRegistration* active_registration = - LookupActiveRegistration(service_worker_id, key); - if (active_registration && - active_registration->value()->id() == registration->id()) { - RemoveActiveRegistration(service_worker_id, key); - } + if (registration->HasCompleted()) { + RegistrationKey key(*registration); + RefCountedRegistration* active_registration = + LookupActiveRegistration(service_worker_id, key); + if (active_registration && + active_registration->value()->id() == registration->id()) { + RemoveActiveRegistration(service_worker_id, key); } - } else { // !SYNC_ONE_SHOT - // TODO(jkarlin): Add support for running periodic syncs. (crbug.com/479674) - NOTREACHED(); } if (disabled_) {
diff --git a/content/browser/background_sync/background_sync_manager.h b/content/browser/background_sync/background_sync_manager.h index 5f1c762..5b8c85b 100644 --- a/content/browser/background_sync/background_sync_manager.h +++ b/content/browser/background_sync/background_sync_manager.h
@@ -64,9 +64,9 @@ ~BackgroundSyncManager() override; // Stores the given background sync registration and adds it to the scheduling - // queue. It will overwrite an existing registration with the same tag and - // periodicity unless they're identical (save for the id). Calls |callback| - // with BACKGROUND_SYNC_STATUS_OK and the accepted registration on success. + // queue. It will overwrite an existing registration with the same tag unless + // they're identical (save for the id). Calls |callback| with + // BACKGROUND_SYNC_STATUS_OK and the accepted registration on success. // The accepted registration will have a unique id. It may also have altered // parameters if the user or UA chose different parameters than those // supplied. @@ -76,22 +76,19 @@ const StatusAndRegistrationCallback& callback); // Finds the background sync registration associated with - // |sw_registration_id|, periodicity |periodicity|, and tag - // |sync_registration_tag|. Calls |callback| with - // BACKGROUND_SYNC_STATUS_NOT_FOUND if it doesn't exist. Calls |callback| with - // BACKGROUND_SYNC_STATUS_OK on success. If the callback's status - // is not BACKGROUND_SYNC_STATUS_OK then the callback's RegistrationHandle - // will be nullptr. + // |sw_registration_id|, and tag |sync_registration_tag|. Calls |callback| + // with BACKGROUND_SYNC_STATUS_NOT_FOUND if it doesn't exist. Calls |callback| + // with BACKGROUND_SYNC_STATUS_OK on success. If the callback's status is not + // BACKGROUND_SYNC_STATUS_OK then the callback's RegistrationHandle will be + // nullptr. void GetRegistration(int64_t sw_registration_id, const std::string& sync_registration_tag, - SyncPeriodicity periodicity, const StatusAndRegistrationCallback& callback); // Finds the background sync registrations associated with - // |sw_registration_id| and periodicity |periodicity|. Calls - // |callback| with BACKGROUND_SYNC_STATUS_OK on success. + // |sw_registration_id|. Calls |callback| with BACKGROUND_SYNC_STATUS_OK on + // success. void GetRegistrations(int64_t sw_registration_id, - SyncPeriodicity periodicity, const StatusAndRegistrationsCallback& callback); // Given a HandleId |handle_id|, return a new handle for the same @@ -143,7 +140,7 @@ const std::string& backend_key, const ServiceWorkerStorage::GetUserDataForAllRegistrationsCallback& callback); - virtual void FireOneShotSync( + virtual void DispatchSyncEvent( BackgroundSyncRegistrationHandle::HandleId handle_id, const scoped_refptr<ServiceWorkerVersion>& active_version, BackgroundSyncEventLastChance last_chance, @@ -162,7 +159,7 @@ public: explicit RegistrationKey(const BackgroundSyncRegistration& registration); explicit RegistrationKey(const BackgroundSyncRegistrationOptions& options); - RegistrationKey(const std::string& tag, SyncPeriodicity periodicity); + RegistrationKey(const std::string& tag); RegistrationKey(const RegistrationKey& other) = default; RegistrationKey& operator=(const RegistrationKey& other) = default; @@ -266,10 +263,9 @@ const StatusAndRegistrationCallback& callback, ServiceWorkerStatusCode status); - // Removes the background sync with periodicity |periodicity| and id - // |sync_registration_id|. Calls |callback| with - // BACKGROUND_SYNC_STATUS_NOT_FOUND if no match is found. Calls |callback| - // with BACKGROUND_SYNC_STATUS_OK on success. + // Removes the background sync with id |sync_registration_id|. Calls + // |callback| with BACKGROUND_SYNC_STATUS_NOT_FOUND if no match is found. + // Calls |callback| with BACKGROUND_SYNC_STATUS_OK on success. void Unregister(int64_t sw_registration_id, BackgroundSyncRegistrationHandle::HandleId handle_id, const StatusCallback& callback); @@ -277,10 +273,8 @@ int64_t sw_registration_id, const RegistrationKey& key, BackgroundSyncRegistration::RegistrationId sync_registration_id, - SyncPeriodicity periodicity, const StatusCallback& callback); void UnregisterDidStore(int64_t sw_registration_id, - SyncPeriodicity periodicity, const StatusCallback& callback, ServiceWorkerStatusCode status); @@ -302,7 +296,6 @@ // GetRegistrations callbacks void GetRegistrationsImpl(int64_t sw_registration_id, - SyncPeriodicity periodicity, const StatusAndRegistrationsCallback& callback); bool AreOptionConditionsMet(const BackgroundSyncRegistrationOptions& options);
diff --git a/content/browser/background_sync/background_sync_manager_unittest.cc b/content/browser/background_sync/background_sync_manager_unittest.cc index 4b138e89..d2c1a017a 100644 --- a/content/browser/background_sync/background_sync_manager_unittest.cc +++ b/content/browser/background_sync/background_sync_manager_unittest.cc
@@ -67,7 +67,7 @@ *called = true; } -void OneShotSuccessfulCallback( +void DispatchSyncSuccessfulCallback( int* count, const scoped_refptr<ServiceWorkerVersion>& active_version, const ServiceWorkerVersion::StatusCallback& callback) { @@ -75,7 +75,7 @@ callback.Run(SERVICE_WORKER_OK); } -void OneShotFailedCallback( +void DispatchSyncFailedCallback( int* count, const scoped_refptr<ServiceWorkerVersion>& active_version, const ServiceWorkerVersion::StatusCallback& callback) { @@ -83,7 +83,7 @@ callback.Run(SERVICE_WORKER_ERROR_FAILED); } -void OneShotDelayedCallback( +void DispatchSyncDelayedCallback( int* count, ServiceWorkerVersion::StatusCallback* out_callback, const scoped_refptr<ServiceWorkerVersion>& active_version, @@ -148,7 +148,7 @@ // storage and service worker onsync events. class TestBackgroundSyncManager : public BackgroundSyncManager { public: - using OneShotCallback = + using DispatchSyncCallback = base::Callback<void(const scoped_refptr<ServiceWorkerVersion>&, const ServiceWorkerVersion::StatusCallback&)>; @@ -188,8 +188,8 @@ corrupt_backend_ = corrupt_backend; } void set_delay_backend(bool delay_backend) { delay_backend_ = delay_backend; } - void set_one_shot_callback(const OneShotCallback& callback) { - one_shot_callback_ = callback; + void set_dispatch_sync_callback(const DispatchSyncCallback& callback) { + dispatch_sync_callback_ = callback; } base::Closure delayed_task() const { return delayed_task_; } @@ -249,14 +249,14 @@ Continue(); } - void FireOneShotSync( + void DispatchSyncEvent( BackgroundSyncRegistrationHandle::HandleId handle_id, const scoped_refptr<ServiceWorkerVersion>& active_version, BackgroundSyncEventLastChance last_chance, const ServiceWorkerVersion::StatusCallback& callback) override { - ASSERT_FALSE(one_shot_callback_.is_null()); + ASSERT_FALSE(dispatch_sync_callback_.is_null()); last_chance_ = last_chance; - one_shot_callback_.Run(active_version, callback); + dispatch_sync_callback_.Run(active_version, callback); } void ScheduleDelayedTask(const base::Closure& callback, @@ -277,7 +277,7 @@ BackgroundSyncEventLastChance last_chance_ = BackgroundSyncEventLastChance::IS_NOT_LAST_CHANCE; base::Closure continuation_; - OneShotCallback one_shot_callback_; + DispatchSyncCallback dispatch_sync_callback_; base::Closure delayed_task_; base::TimeDelta delayed_task_delta_; }; @@ -288,11 +288,9 @@ : browser_thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP), network_change_notifier_(net::NetworkChangeNotifier::CreateMock()) { sync_options_1_.tag = "foo"; - sync_options_1_.periodicity = SYNC_ONE_SHOT; sync_options_1_.network_state = NETWORK_STATE_ONLINE; sync_options_2_.tag = "bar"; - sync_options_2_.periodicity = SYNC_ONE_SHOT; sync_options_2_.network_state = NETWORK_STATE_ONLINE; } @@ -536,7 +534,6 @@ bool was_called = false; background_sync_manager_->GetRegistration( sw_registration_id, registration_options.tag, - registration_options.periodicity, base::Bind(&BackgroundSyncManagerTest::StatusAndRegistrationCallback, base::Unretained(this), &was_called)); base::RunLoop().RunUntilIdle(); @@ -550,16 +547,14 @@ return callback_status_ == BACKGROUND_SYNC_STATUS_OK; } - bool GetRegistrations(SyncPeriodicity periodicity) { - return GetRegistrationWithServiceWorkerId(sw_registration_id_1_, - periodicity); + bool GetRegistrations() { + return GetRegistrationWithServiceWorkerId(sw_registration_id_1_); } - bool GetRegistrationWithServiceWorkerId(int64_t sw_registration_id, - SyncPeriodicity periodicity) { + bool GetRegistrationWithServiceWorkerId(int64_t sw_registration_id) { bool was_called = false; background_sync_manager_->GetRegistrations( - sw_registration_id, periodicity, + sw_registration_id, base::Bind(&BackgroundSyncManagerTest::StatusAndRegistrationsCallback, base::Unretained(this), &was_called)); base::RunLoop().RunUntilIdle(); @@ -588,23 +583,24 @@ } void SetupForSyncEvent( - const TestBackgroundSyncManager::OneShotCallback& callback) { - test_background_sync_manager_->set_one_shot_callback(callback); + const TestBackgroundSyncManager::DispatchSyncCallback& callback) { + test_background_sync_manager_->set_dispatch_sync_callback(callback); SetNetwork(net::NetworkChangeNotifier::CONNECTION_WIFI); } void InitSyncEventTest() { SetupForSyncEvent( - base::Bind(OneShotSuccessfulCallback, &sync_events_called_)); + base::Bind(DispatchSyncSuccessfulCallback, &sync_events_called_)); } void InitFailedSyncEventTest() { - SetupForSyncEvent(base::Bind(OneShotFailedCallback, &sync_events_called_)); + SetupForSyncEvent( + base::Bind(DispatchSyncFailedCallback, &sync_events_called_)); } void InitDelayedSyncEventTest() { - SetupForSyncEvent(base::Bind(OneShotDelayedCallback, &sync_events_called_, - &sync_fired_callback_)); + SetupForSyncEvent(base::Bind(DispatchSyncDelayedCallback, + &sync_events_called_, &sync_fired_callback_)); } void RegisterAndVerifySyncEventDelayed( @@ -689,36 +685,6 @@ EXPECT_EQ(BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER, callback_status_); } -TEST_F(BackgroundSyncManagerTest, RegisterOverwrites) { - EXPECT_TRUE(Register(sync_options_1_)); - scoped_ptr<BackgroundSyncRegistrationHandle> first_registration_handle = - std::move(callback_registration_handle_); - - sync_options_1_.min_period = 100; - EXPECT_TRUE(Register(sync_options_1_)); - EXPECT_LT(first_registration_handle->handle_id(), - callback_registration_handle_->handle_id()); - EXPECT_FALSE(first_registration_handle->options()->Equals( - *callback_registration_handle_->options())); -} - -TEST_F(BackgroundSyncManagerTest, RegisterOverlappingPeriodicAndOneShotTags) { - // Registrations with the same tags but different periodicities should not - // collide. - sync_options_1_.tag = ""; - sync_options_2_.tag = ""; - sync_options_1_.periodicity = SYNC_PERIODIC; - sync_options_2_.periodicity = SYNC_ONE_SHOT; - EXPECT_TRUE(Register(sync_options_1_)); - EXPECT_TRUE(Register(sync_options_2_)); - EXPECT_TRUE(GetRegistration(sync_options_1_)); - EXPECT_EQ(SYNC_PERIODIC, - callback_registration_handle_->options()->periodicity); - EXPECT_TRUE(GetRegistration(sync_options_2_)); - EXPECT_EQ(SYNC_ONE_SHOT, - callback_registration_handle_->options()->periodicity); -} - TEST_F(BackgroundSyncManagerTest, RegisterBadBackend) { test_background_sync_manager_->set_corrupt_backend(true); EXPECT_FALSE(Register(sync_options_1_)); @@ -769,55 +735,38 @@ } TEST_F(BackgroundSyncManagerTest, GetRegistrationsZero) { - EXPECT_TRUE(GetRegistrations(SYNC_ONE_SHOT)); + EXPECT_TRUE(GetRegistrations()); EXPECT_EQ(0u, callback_registration_handles_->size()); } TEST_F(BackgroundSyncManagerTest, GetRegistrationsOne) { EXPECT_TRUE(Register(sync_options_1_)); - EXPECT_TRUE(GetRegistrations(sync_options_1_.periodicity)); + EXPECT_TRUE(GetRegistrations()); EXPECT_EQ(1u, callback_registration_handles_->size()); sync_options_1_.Equals(*(*callback_registration_handles_)[0]->options()); } TEST_F(BackgroundSyncManagerTest, GetRegistrationsTwo) { - EXPECT_EQ(sync_options_1_.periodicity, sync_options_2_.periodicity); - EXPECT_TRUE(Register(sync_options_1_)); EXPECT_TRUE(Register(sync_options_2_)); - EXPECT_TRUE(GetRegistrations(sync_options_1_.periodicity)); + EXPECT_TRUE(GetRegistrations()); EXPECT_EQ(2u, callback_registration_handles_->size()); sync_options_1_.Equals(*(*callback_registration_handles_)[0]->options()); sync_options_2_.Equals(*(*callback_registration_handles_)[1]->options()); } -TEST_F(BackgroundSyncManagerTest, GetRegistrationsPeriodicity) { - sync_options_1_.periodicity = SYNC_ONE_SHOT; - sync_options_2_.periodicity = SYNC_PERIODIC; - EXPECT_TRUE(Register(sync_options_1_)); - EXPECT_TRUE(Register(sync_options_2_)); - - EXPECT_TRUE(GetRegistrations(SYNC_ONE_SHOT)); - EXPECT_EQ(1u, callback_registration_handles_->size()); - sync_options_1_.Equals(*(*callback_registration_handles_)[0]->options()); - - EXPECT_TRUE(GetRegistrations(SYNC_PERIODIC)); - EXPECT_EQ(1u, callback_registration_handles_->size()); - sync_options_2_.Equals(*(*callback_registration_handles_)[0]->options()); -} - TEST_F(BackgroundSyncManagerTest, GetRegistrationsBadBackend) { EXPECT_TRUE(Register(sync_options_1_)); test_background_sync_manager_->set_corrupt_backend(true); - EXPECT_TRUE(GetRegistrations(sync_options_1_.periodicity)); + EXPECT_TRUE(GetRegistrations()); EXPECT_FALSE(Register(sync_options_2_)); // Registration should have discovered the bad backend and disabled the // BackgroundSyncManager. - EXPECT_FALSE(GetRegistrations(sync_options_1_.periodicity)); + EXPECT_FALSE(GetRegistrations()); test_background_sync_manager_->set_corrupt_backend(false); - EXPECT_FALSE(GetRegistrations(sync_options_1_.periodicity)); + EXPECT_FALSE(GetRegistrations()); } TEST_F(BackgroundSyncManagerTest, Unregister) { @@ -841,7 +790,6 @@ } TEST_F(BackgroundSyncManagerTest, UnregisterBadBackend) { - sync_options_1_.min_period += 1; EXPECT_TRUE(Register(sync_options_1_)); EXPECT_TRUE(Register(sync_options_2_)); test_background_sync_manager_->set_corrupt_backend(true); @@ -937,7 +885,7 @@ base::Bind(&BackgroundSyncManagerTest::StatusAndRegistrationCallback, base::Unretained(this), ®ister_called)); test_background_sync_manager_->GetRegistration( - sw_registration_id_1_, sync_options_1_.tag, sync_options_1_.periodicity, + sw_registration_id_1_, sync_options_1_.tag, base::Bind(&BackgroundSyncManagerTest::StatusAndRegistrationCallback, base::Unretained(this), &get_registration_called)); @@ -1048,23 +996,6 @@ EXPECT_FALSE(reg_1.Equals(reg_2)); } -TEST_F(BackgroundSyncManagerTest, RegistrationEqualsPeriodicity) { - BackgroundSyncRegistration reg_1; - BackgroundSyncRegistration reg_2; - EXPECT_TRUE(reg_1.Equals(reg_2)); - reg_1.options()->periodicity = SYNC_PERIODIC; - reg_2.options()->periodicity = SYNC_ONE_SHOT; - EXPECT_FALSE(reg_1.Equals(reg_2)); -} - -TEST_F(BackgroundSyncManagerTest, RegistrationEqualsMinPeriod) { - BackgroundSyncRegistration reg_1; - BackgroundSyncRegistration reg_2; - EXPECT_TRUE(reg_1.Equals(reg_2)); - reg_2.options()->min_period = reg_1.options()->min_period + 1; - EXPECT_FALSE(reg_1.Equals(reg_2)); -} - TEST_F(BackgroundSyncManagerTest, RegistrationEqualsNetworkState) { BackgroundSyncRegistration reg_1; BackgroundSyncRegistration reg_2; @@ -1075,14 +1006,13 @@ } TEST_F(BackgroundSyncManagerTest, StoreAndRetrievePreservesValues) { + InitDelayedSyncEventTest(); BackgroundSyncRegistrationOptions options; + // Set non-default values for each field. options.tag = "foo"; - EXPECT_NE(SYNC_PERIODIC, options.periodicity); - options.periodicity = SYNC_PERIODIC; - options.min_period += 1; - EXPECT_NE(NETWORK_STATE_ANY, options.network_state); - options.network_state = NETWORK_STATE_ANY; + EXPECT_NE(NETWORK_STATE_AVOID_CELLULAR, options.network_state); + options.network_state = NETWORK_STATE_AVOID_CELLULAR; // Store the registration. EXPECT_TRUE(Register(options)); @@ -1105,36 +1035,7 @@ EXPECT_FALSE(GetRegistration(sync_options_1_)); } -TEST_F(BackgroundSyncManagerTest, OverlappingPeriodicAndOneShotTags) { - // Registrations with the same tags but different periodicities should not - // collide. - sync_options_1_.tag = ""; - sync_options_2_.tag = ""; - sync_options_1_.periodicity = SYNC_PERIODIC; - sync_options_2_.periodicity = SYNC_ONE_SHOT; - - EXPECT_TRUE(Register(sync_options_1_)); - EXPECT_TRUE(Register(sync_options_2_)); - - EXPECT_TRUE(GetRegistration(sync_options_1_)); - EXPECT_EQ(SYNC_PERIODIC, - callback_registration_handle_->options()->periodicity); - EXPECT_TRUE(GetRegistration(sync_options_2_)); - EXPECT_EQ(SYNC_ONE_SHOT, - callback_registration_handle_->options()->periodicity); - - EXPECT_TRUE(GetRegistration(sync_options_1_)); - EXPECT_TRUE(Unregister(callback_registration_handle_.get())); - EXPECT_FALSE(GetRegistration(sync_options_1_)); - EXPECT_TRUE(GetRegistration(sync_options_2_)); - EXPECT_EQ(SYNC_ONE_SHOT, - callback_registration_handle_->options()->periodicity); - - EXPECT_TRUE(Unregister(callback_registration_handle_.get())); - EXPECT_FALSE(GetRegistration(sync_options_2_)); -} - -TEST_F(BackgroundSyncManagerTest, OneShotFiresOnRegistration) { +TEST_F(BackgroundSyncManagerTest, FiresOnRegistration) { InitSyncEventTest(); EXPECT_TRUE(Register(sync_options_1_)); @@ -1365,6 +1266,8 @@ EXPECT_TRUE(GetRegistration(sync_options_1_)); EXPECT_EQ(NETWORK_STATE_ONLINE, callback_registration_handle_->options()->network_state); + EXPECT_LT(original_handle->handle_id(), + callback_registration_handle_->handle_id()); EXPECT_TRUE(NotifyWhenFinished(original_handle.get())); EXPECT_EQ(BackgroundSyncState::UNREGISTERED, FinishedState()); @@ -1457,7 +1360,7 @@ EXPECT_EQ(BackgroundSyncState::SUCCESS, FinishedState()); } -TEST_F(BackgroundSyncManagerTest, OneShotFiresOnNetworkChange) { +TEST_F(BackgroundSyncManagerTest, FiresOnNetworkChange) { InitSyncEventTest(); SetNetwork(net::NetworkChangeNotifier::CONNECTION_NONE); @@ -1471,7 +1374,7 @@ EXPECT_FALSE(GetRegistration(sync_options_1_)); } -TEST_F(BackgroundSyncManagerTest, MultipleOneShotsFireOnNetworkChange) { +TEST_F(BackgroundSyncManagerTest, MultipleRegistrationsFireOnNetworkChange) { InitSyncEventTest(); SetNetwork(net::NetworkChangeNotifier::CONNECTION_NONE); @@ -1488,7 +1391,7 @@ EXPECT_FALSE(GetRegistration(sync_options_2_)); } -TEST_F(BackgroundSyncManagerTest, OneShotFiresOnManagerRestart) { +TEST_F(BackgroundSyncManagerTest, FiresOnManagerRestart) { InitSyncEventTest(); // Initially the event won't run because there is no network. @@ -1510,7 +1413,7 @@ EXPECT_FALSE(GetRegistration(sync_options_1_)); } -TEST_F(BackgroundSyncManagerTest, FailedOneShotShouldBeRemoved) { +TEST_F(BackgroundSyncManagerTest, FailedRegistrationShouldBeRemoved) { InitFailedSyncEventTest(); EXPECT_TRUE(Register(sync_options_1_)); @@ -1518,7 +1421,7 @@ EXPECT_FALSE(GetRegistration(sync_options_1_)); } -TEST_F(BackgroundSyncManagerTest, FailedOneShotReregisteredAndFires) { +TEST_F(BackgroundSyncManagerTest, FailedRegistrationReregisteredAndFires) { InitFailedSyncEventTest(); // The initial sync event fails. @@ -1535,7 +1438,7 @@ EXPECT_FALSE(GetRegistration(sync_options_1_)); } -TEST_F(BackgroundSyncManagerTest, DelayOneShotMidSync) { +TEST_F(BackgroundSyncManagerTest, DelayMidSync) { InitDelayedSyncEventTest(); RegisterAndVerifySyncEventDelayed(sync_options_1_); @@ -1556,8 +1459,8 @@ RegisterAndVerifySyncEventDelayed(sync_options_1_); // Don't delay the next sync. - test_background_sync_manager_->set_one_shot_callback( - base::Bind(OneShotSuccessfulCallback, &sync_events_called_)); + test_background_sync_manager_->set_dispatch_sync_callback( + base::Bind(DispatchSyncSuccessfulCallback, &sync_events_called_)); // Register a different sync event with the same tag, overwriting the first. sync_options_1_.network_state = NETWORK_STATE_ONLINE; @@ -1579,7 +1482,7 @@ EXPECT_FALSE(GetRegistration(sync_options_1_)); } -TEST_F(BackgroundSyncManagerTest, UnregisterOneShotMidSync) { +TEST_F(BackgroundSyncManagerTest, UnregisterMidSync) { InitDelayedSyncEventTest(); RegisterAndVerifySyncEventDelayed(sync_options_1_);
diff --git a/content/browser/background_sync/background_sync_metrics.cc b/content/browser/background_sync/background_sync_metrics.cc index 20b3a66..8198815c 100644 --- a/content/browser/background_sync/background_sync_metrics.cc +++ b/content/browser/background_sync/background_sync_metrics.cc
@@ -33,40 +33,18 @@ namespace content { // static -void BackgroundSyncMetrics::RecordEventStarted(SyncPeriodicity periodicity, - bool started_in_foreground) { - switch (periodicity) { - case SYNC_ONE_SHOT: - UMA_HISTOGRAM_BOOLEAN("BackgroundSync.Event.OneShotStartedInForeground", - started_in_foreground); - return; - case SYNC_PERIODIC: - UMA_HISTOGRAM_BOOLEAN("BackgroundSync.Event.PeriodicStartedInForeground", - started_in_foreground); - return; - } - NOTREACHED(); +void BackgroundSyncMetrics::RecordEventStarted(bool started_in_foreground) { + UMA_HISTOGRAM_BOOLEAN("BackgroundSync.Event.OneShotStartedInForeground", + started_in_foreground); } // static -void BackgroundSyncMetrics::RecordEventResult(SyncPeriodicity periodicity, - bool success, +void BackgroundSyncMetrics::RecordEventResult(bool success, bool finished_in_foreground) { - switch (periodicity) { - case SYNC_ONE_SHOT: - UMA_HISTOGRAM_ENUMERATION( - "BackgroundSync.Event.OneShotResultPattern", - EventResultToResultPattern(success, finished_in_foreground), - RESULT_PATTERN_MAX + 1); - return; - case SYNC_PERIODIC: - UMA_HISTOGRAM_ENUMERATION( - "BackgroundSync.Event.PeriodicResultPattern", - EventResultToResultPattern(success, finished_in_foreground), - RESULT_PATTERN_MAX + 1); - return; - } - NOTREACHED(); + UMA_HISTOGRAM_ENUMERATION( + "BackgroundSync.Event.OneShotResultPattern", + EventResultToResultPattern(success, finished_in_foreground), + RESULT_PATTERN_MAX + 1); } // static @@ -84,62 +62,30 @@ // static void BackgroundSyncMetrics::CountRegisterSuccess( - SyncPeriodicity periodicity, RegistrationCouldFire registration_could_fire, RegistrationIsDuplicate registration_is_duplicate) { - switch (periodicity) { - case SYNC_ONE_SHOT: - UMA_HISTOGRAM_ENUMERATION("BackgroundSync.Registration.OneShot", - BACKGROUND_SYNC_STATUS_OK, - BACKGROUND_SYNC_STATUS_MAX + 1); - UMA_HISTOGRAM_BOOLEAN("BackgroundSync.Registration.OneShot.CouldFire", - registration_could_fire == REGISTRATION_COULD_FIRE); - UMA_HISTOGRAM_BOOLEAN( - "BackgroundSync.Registration.OneShot.IsDuplicate", - registration_is_duplicate == REGISTRATION_IS_DUPLICATE); - return; - case SYNC_PERIODIC: - UMA_HISTOGRAM_ENUMERATION("BackgroundSync.Registration.Periodic", - BACKGROUND_SYNC_STATUS_OK, - BACKGROUND_SYNC_STATUS_MAX + 1); - UMA_HISTOGRAM_BOOLEAN( - "BackgroundSync.Registration.Periodic.IsDuplicate", - registration_is_duplicate == REGISTRATION_IS_DUPLICATE); - return; - } - NOTREACHED(); + UMA_HISTOGRAM_ENUMERATION("BackgroundSync.Registration.OneShot", + BACKGROUND_SYNC_STATUS_OK, + BACKGROUND_SYNC_STATUS_MAX + 1); + UMA_HISTOGRAM_BOOLEAN("BackgroundSync.Registration.OneShot.CouldFire", + registration_could_fire == REGISTRATION_COULD_FIRE); + UMA_HISTOGRAM_BOOLEAN("BackgroundSync.Registration.OneShot.IsDuplicate", + registration_is_duplicate == REGISTRATION_IS_DUPLICATE); + return; } // static -void BackgroundSyncMetrics::CountRegisterFailure(SyncPeriodicity periodicity, - BackgroundSyncStatus result) { - switch (periodicity) { - case SYNC_ONE_SHOT: - UMA_HISTOGRAM_ENUMERATION("BackgroundSync.Registration.OneShot", result, - BACKGROUND_SYNC_STATUS_MAX + 1); - return; - case SYNC_PERIODIC: - UMA_HISTOGRAM_ENUMERATION("BackgroundSync.Registration.Periodic", result, - BACKGROUND_SYNC_STATUS_MAX + 1); - return; - } - NOTREACHED(); +void BackgroundSyncMetrics::CountRegisterFailure(BackgroundSyncStatus result) { + UMA_HISTOGRAM_ENUMERATION("BackgroundSync.Registration.OneShot", result, + BACKGROUND_SYNC_STATUS_MAX + 1); + return; } // static -void BackgroundSyncMetrics::CountUnregister(SyncPeriodicity periodicity, - BackgroundSyncStatus result) { - switch (periodicity) { - case SYNC_ONE_SHOT: - UMA_HISTOGRAM_ENUMERATION("BackgroundSync.Unregistration.OneShot", result, - BACKGROUND_SYNC_STATUS_MAX + 1); - return; - case SYNC_PERIODIC: - UMA_HISTOGRAM_ENUMERATION("BackgroundSync.Unregistration.Periodic", - result, BACKGROUND_SYNC_STATUS_MAX + 1); - return; - } - NOTREACHED(); +void BackgroundSyncMetrics::CountUnregister(BackgroundSyncStatus result) { + UMA_HISTOGRAM_ENUMERATION("BackgroundSync.Unregistration.OneShot", result, + BACKGROUND_SYNC_STATUS_MAX + 1); + return; } } // namespace content
diff --git a/content/browser/background_sync/background_sync_metrics.h b/content/browser/background_sync/background_sync_metrics.h index f92a7c5..891e11494 100644 --- a/content/browser/background_sync/background_sync_metrics.h +++ b/content/browser/background_sync/background_sync_metrics.h
@@ -29,13 +29,10 @@ }; // Records the start of a sync event. - static void RecordEventStarted(SyncPeriodicity periodicity, - bool startedin_foreground); + static void RecordEventStarted(bool startedin_foreground); // Records the result of a single sync event firing. - static void RecordEventResult(SyncPeriodicity periodicity, - bool result, - bool finished_in_foreground); + static void RecordEventResult(bool result, bool finished_in_foreground); // Records the result of running a batch of sync events, including the total // time spent, and the batch size. @@ -46,17 +43,14 @@ // indicates whether the conditions were sufficient for the sync to fire // immediately at the time it was registered. static void CountRegisterSuccess( - SyncPeriodicity periodicity, RegistrationCouldFire could_fire, RegistrationIsDuplicate registration_is_duplicate); // Records the status of a failed sync registration. - static void CountRegisterFailure(SyncPeriodicity periodicity, - BackgroundSyncStatus status); + static void CountRegisterFailure(BackgroundSyncStatus status); // Records the result of trying to unregister a sync. - static void CountUnregister(SyncPeriodicity periodicity, - BackgroundSyncStatus result); + static void CountUnregister(BackgroundSyncStatus result); private: DISALLOW_IMPLICIT_CONSTRUCTORS(BackgroundSyncMetrics);
diff --git a/content/browser/background_sync/background_sync_registration_handle.h b/content/browser/background_sync/background_sync_registration_handle.h index 22cfdaa..da4db86 100644 --- a/content/browser/background_sync/background_sync_registration_handle.h +++ b/content/browser/background_sync/background_sync_registration_handle.h
@@ -53,8 +53,7 @@ // succeeded. The provided state is BackgroundSyncState::SUCCESS on success, // BACKGRUOND_SYNC_STATE_FAILED on final failure, and // BackgroundSyncState::UNREGISTERED if the registration was unregistered - // before it could complete. NotifyWhenFinished should only be called for - // SYNC_ONE_SHOT registrations. + // before it could complete. void NotifyWhenFinished(const StatusAndStateCallback& callback); // Returns true if the handle is backed by a BackgroundSyncRegistration in the
diff --git a/content/browser/background_sync/background_sync_registration_options.cc b/content/browser/background_sync/background_sync_registration_options.cc index 24c68fd..7b8e1e7e 100644 --- a/content/browser/background_sync/background_sync_registration_options.cc +++ b/content/browser/background_sync/background_sync_registration_options.cc
@@ -8,9 +8,7 @@ bool BackgroundSyncRegistrationOptions::Equals( const BackgroundSyncRegistrationOptions& other) const { - return tag == other.tag && min_period == other.min_period && - network_state == other.network_state && - periodicity == other.periodicity; + return tag == other.tag && network_state == other.network_state; } } // namespace content
diff --git a/content/browser/background_sync/background_sync_registration_options.h b/content/browser/background_sync/background_sync_registration_options.h index 7f02648e..5c81e308 100644 --- a/content/browser/background_sync/background_sync_registration_options.h +++ b/content/browser/background_sync/background_sync_registration_options.h
@@ -19,9 +19,7 @@ bool Equals(const BackgroundSyncRegistrationOptions& other) const; std::string tag; - int64_t min_period = 0; SyncNetworkState network_state = NETWORK_STATE_ONLINE; - SyncPeriodicity periodicity = SYNC_ONE_SHOT; }; } // namespace content
diff --git a/content/browser/background_sync/background_sync_service_impl.cc b/content/browser/background_sync/background_sync_service_impl.cc index 430348e..52a08bad 100644 --- a/content/browser/background_sync/background_sync_service_impl.cc +++ b/content/browser/background_sync/background_sync_service_impl.cc
@@ -24,9 +24,7 @@ BackgroundSyncRegistrationOptions out; out.tag = in->tag; - out.min_period = in->min_period_ms; out.network_state = static_cast<SyncNetworkState>(in->network_state); - out.periodicity = static_cast<SyncPeriodicity>(in->periodicity); return out; } @@ -35,9 +33,6 @@ SyncRegistrationPtr out(content::SyncRegistration::New()); out->handle_id = in.handle_id(); out->tag = in.options()->tag; - out->min_period_ms = in.options()->min_period; - out->periodicity = static_cast<content::BackgroundSyncPeriodicity>( - in.options()->periodicity); out->network_state = static_cast<content::BackgroundSyncNetworkState>( in.options()->network_state); return out; @@ -73,13 +68,6 @@ COMPILE_ASSERT_MATCHING_ENUM(BackgroundSyncNetworkState::MAX, SyncNetworkState::NETWORK_STATE_ONLINE); -COMPILE_ASSERT_MATCHING_ENUM(BackgroundSyncPeriodicity::PERIODIC, - SyncPeriodicity::SYNC_PERIODIC); -COMPILE_ASSERT_MATCHING_ENUM(BackgroundSyncPeriodicity::ONE_SHOT, - SyncPeriodicity::SYNC_ONE_SHOT); -COMPILE_ASSERT_MATCHING_ENUM(BackgroundSyncPeriodicity::MAX, - SyncPeriodicity::SYNC_ONE_SHOT); - BackgroundSyncServiceImpl::~BackgroundSyncServiceImpl() { DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK(background_sync_context_->background_sync_manager()); @@ -142,7 +130,6 @@ } void BackgroundSyncServiceImpl::GetRegistration( - BackgroundSyncPeriodicity periodicity, const mojo::String& tag, int64_t sw_registration_id, const GetRegistrationCallback& callback) { @@ -151,13 +138,12 @@ background_sync_context_->background_sync_manager(); DCHECK(background_sync_manager); background_sync_manager->GetRegistration( - sw_registration_id, tag.get(), static_cast<SyncPeriodicity>(periodicity), + sw_registration_id, tag.get(), base::Bind(&BackgroundSyncServiceImpl::OnRegisterResult, weak_ptr_factory_.GetWeakPtr(), callback)); } void BackgroundSyncServiceImpl::GetRegistrations( - BackgroundSyncPeriodicity periodicity, int64_t sw_registration_id, const GetRegistrationsCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); @@ -165,20 +151,18 @@ background_sync_context_->background_sync_manager(); DCHECK(background_sync_manager); background_sync_manager->GetRegistrations( - sw_registration_id, static_cast<SyncPeriodicity>(periodicity), + sw_registration_id, base::Bind(&BackgroundSyncServiceImpl::OnGetRegistrationsResult, weak_ptr_factory_.GetWeakPtr(), callback)); } void BackgroundSyncServiceImpl::GetPermissionStatus( - BackgroundSyncPeriodicity periodicity, int64_t sw_registration_id, const GetPermissionStatusCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); // TODO(iclelland): Implement a real policy. This is a stub implementation. - // OneShot: crbug.com/482091 - // Periodic: crbug.com/482093 + // See https://crbug.com/482091. callback.Run(BackgroundSyncError::NONE, PermissionStatus::GRANTED); }
diff --git a/content/browser/background_sync/background_sync_service_impl.h b/content/browser/background_sync/background_sync_service_impl.h index a5b6d18..77df3b6a 100644 --- a/content/browser/background_sync/background_sync_service_impl.h +++ b/content/browser/background_sync/background_sync_service_impl.h
@@ -39,15 +39,12 @@ void Unregister(BackgroundSyncRegistrationHandle::HandleId handle_id, int64_t sw_registration_id, const UnregisterCallback& callback) override; - void GetRegistration(BackgroundSyncPeriodicity periodicity, - const mojo::String& tag, + void GetRegistration(const mojo::String& tag, int64_t sw_registration_id, const GetRegistrationCallback& callback) override; - void GetRegistrations(BackgroundSyncPeriodicity periodicity, - int64_t sw_registration_id, + void GetRegistrations(int64_t sw_registration_id, const GetRegistrationsCallback& callback) override; void GetPermissionStatus( - BackgroundSyncPeriodicity periodicity, int64_t sw_registration_id, const GetPermissionStatusCallback& callback) override; void DuplicateRegistrationHandle(
diff --git a/content/browser/background_sync/background_sync_service_impl_unittest.cc b/content/browser/background_sync/background_sync_service_impl_unittest.cc index 21f312f12..84a630f 100644 --- a/content/browser/background_sync/background_sync_service_impl_unittest.cc +++ b/content/browser/background_sync/background_sync_service_impl_unittest.cc
@@ -191,35 +191,31 @@ } // Helpers for testing BackgroundSyncServiceImpl methods - void RegisterOneShot( - SyncRegistrationPtr sync, - const BackgroundSyncService::RegisterCallback& callback) { + void Register(SyncRegistrationPtr sync, + const BackgroundSyncService::RegisterCallback& callback) { service_impl_->Register(std::move(sync), sw_registration_id_, false /* requested_from_service_worker */, callback); base::RunLoop().RunUntilIdle(); } - void UnregisterOneShot( - int32_t handle_id, - const BackgroundSyncService::UnregisterCallback& callback) { + void Unregister(int32_t handle_id, + const BackgroundSyncService::UnregisterCallback& callback) { service_impl_->Unregister( handle_id, sw_registration_id_, callback); base::RunLoop().RunUntilIdle(); } - void GetRegistrationOneShot( + void GetRegistration( const mojo::String& tag, const BackgroundSyncService::RegisterCallback& callback) { - service_impl_->GetRegistration(BackgroundSyncPeriodicity::ONE_SHOT, tag, - sw_registration_id_, callback); + service_impl_->GetRegistration(tag, sw_registration_id_, callback); base::RunLoop().RunUntilIdle(); } - void GetRegistrationsOneShot( + void GetRegistrations( const BackgroundSyncService::GetRegistrationsCallback& callback) { - service_impl_->GetRegistrations(BackgroundSyncPeriodicity::ONE_SHOT, - sw_registration_id_, callback); + service_impl_->GetRegistrations(sw_registration_id_, callback); base::RunLoop().RunUntilIdle(); } @@ -249,9 +245,8 @@ bool called = false; BackgroundSyncError error; SyncRegistrationPtr reg; - RegisterOneShot( - default_sync_registration_.Clone(), - base::Bind(&ErrorAndRegistrationCallback, &called, &error, ®)); + Register(default_sync_registration_.Clone(), + base::Bind(&ErrorAndRegistrationCallback, &called, &error, ®)); EXPECT_TRUE(called); EXPECT_EQ(BackgroundSyncError::NONE, error); EXPECT_EQ("", reg->tag); @@ -261,9 +256,8 @@ bool unregister_called = false; BackgroundSyncError unregister_error; SyncRegistrationPtr reg; - UnregisterOneShot( - default_sync_registration_->handle_id, - base::Bind(&ErrorCallback, &unregister_called, &unregister_error)); + Unregister(default_sync_registration_->handle_id, + base::Bind(&ErrorCallback, &unregister_called, &unregister_error)); EXPECT_TRUE(unregister_called); EXPECT_EQ(BackgroundSyncError::NOT_ALLOWED, unregister_error); } @@ -274,14 +268,13 @@ BackgroundSyncError register_error; BackgroundSyncError unregister_error; SyncRegistrationPtr reg; - RegisterOneShot(default_sync_registration_.Clone(), - base::Bind(&ErrorAndRegistrationCallback, ®ister_called, - ®ister_error, ®)); + Register(default_sync_registration_.Clone(), + base::Bind(&ErrorAndRegistrationCallback, ®ister_called, + ®ister_error, ®)); EXPECT_TRUE(register_called); EXPECT_EQ(BackgroundSyncError::NONE, register_error); - UnregisterOneShot( - reg->handle_id, - base::Bind(&ErrorCallback, &unregister_called, &unregister_error)); + Unregister(reg->handle_id, + base::Bind(&ErrorCallback, &unregister_called, &unregister_error)); EXPECT_TRUE(unregister_called); EXPECT_EQ(BackgroundSyncError::NONE, unregister_error); } @@ -290,7 +283,7 @@ bool called = false; BackgroundSyncError error; SyncRegistrationPtr reg; - GetRegistrationOneShot( + GetRegistration( "", base::Bind(&ErrorAndRegistrationCallback, &called, &error, ®)); EXPECT_TRUE(called); EXPECT_EQ(BackgroundSyncError::NOT_FOUND, error); @@ -303,12 +296,12 @@ BackgroundSyncError getregistration_error; SyncRegistrationPtr register_reg; SyncRegistrationPtr getregistration_reg; - RegisterOneShot(default_sync_registration_.Clone(), - base::Bind(&ErrorAndRegistrationCallback, ®ister_called, - ®ister_error, ®ister_reg)); + Register(default_sync_registration_.Clone(), + base::Bind(&ErrorAndRegistrationCallback, ®ister_called, + ®ister_error, ®ister_reg)); EXPECT_TRUE(register_called); EXPECT_EQ(BackgroundSyncError::NONE, register_error); - GetRegistrationOneShot( + GetRegistration( register_reg->tag, base::Bind(&ErrorAndRegistrationCallback, &getregistration_called, &getregistration_error, &getregistration_reg)); @@ -320,8 +313,8 @@ bool called = false; BackgroundSyncError error; unsigned long array_size = 0UL; - GetRegistrationsOneShot(base::Bind(&ErrorAndRegistrationListCallback, &called, - &error, &array_size)); + GetRegistrations(base::Bind(&ErrorAndRegistrationListCallback, &called, + &error, &array_size)); EXPECT_TRUE(called); EXPECT_EQ(BackgroundSyncError::NONE, error); EXPECT_EQ(0UL, array_size); @@ -334,14 +327,14 @@ BackgroundSyncError getregistrations_error; SyncRegistrationPtr register_reg; unsigned long array_size = 0UL; - RegisterOneShot(default_sync_registration_.Clone(), - base::Bind(&ErrorAndRegistrationCallback, ®ister_called, - ®ister_error, ®ister_reg)); + Register(default_sync_registration_.Clone(), + base::Bind(&ErrorAndRegistrationCallback, ®ister_called, + ®ister_error, ®ister_reg)); EXPECT_TRUE(register_called); EXPECT_EQ(BackgroundSyncError::NONE, register_error); - GetRegistrationsOneShot(base::Bind(&ErrorAndRegistrationListCallback, - &getregistrations_called, - &getregistrations_error, &array_size)); + GetRegistrations(base::Bind(&ErrorAndRegistrationListCallback, + &getregistrations_called, &getregistrations_error, + &array_size)); EXPECT_TRUE(getregistrations_called); EXPECT_EQ(BackgroundSyncError::NONE, getregistrations_error); EXPECT_EQ(1UL, array_size); @@ -352,18 +345,17 @@ bool register_called = false; BackgroundSyncError register_error; SyncRegistrationPtr reg; - RegisterOneShot(default_sync_registration_.Clone(), - base::Bind(&ErrorAndRegistrationCallback, ®ister_called, - ®ister_error, ®)); + Register(default_sync_registration_.Clone(), + base::Bind(&ErrorAndRegistrationCallback, ®ister_called, + ®ister_error, ®)); EXPECT_TRUE(register_called); EXPECT_EQ(BackgroundSyncError::NONE, register_error); // Unregister it. bool unregister_called = false; BackgroundSyncError unregister_error; - UnregisterOneShot( - reg->handle_id, - base::Bind(&ErrorCallback, &unregister_called, &unregister_error)); + Unregister(reg->handle_id, + base::Bind(&ErrorCallback, &unregister_called, &unregister_error)); EXPECT_TRUE(unregister_called); EXPECT_EQ(BackgroundSyncError::NONE, unregister_error);
diff --git a/content/browser/bluetooth/bluetooth_dispatcher_host.cc b/content/browser/bluetooth/bluetooth_dispatcher_host.cc index deb626df..0d3385e2 100644 --- a/content/browser/bluetooth/bluetooth_dispatcher_host.cc +++ b/content/browser/bluetooth/bluetooth_dispatcher_host.cc
@@ -634,6 +634,14 @@ return; } + if (render_frame_host->GetLastCommittedOrigin().unique()) { + VLOG(1) << "Request device with unique origin."; + Send(new BluetoothMsg_RequestDeviceError( + thread_id, request_id, + WebBluetoothError::RequestDeviceWithUniqueOrigin)); + return; + } + if (!adapter_) { VLOG(1) << "No BluetoothAdapter. Can't serve requestDevice."; RecordRequestDeviceOutcome(UMARequestDeviceOutcome::NO_BLUETOOTH_ADAPTER); @@ -673,9 +681,7 @@ if (WebContentsDelegate* delegate = web_contents->GetDelegate()) { session->chooser = delegate->RunBluetoothChooser( web_contents, chooser_event_handler, - // TODO(ortuno): Replace with GetLastCommittedOrigin. - // http://crbug.com/577451 - render_frame_host->GetLastCommittedURL().GetOrigin()); + render_frame_host->GetLastCommittedOrigin()); } } if (!session->chooser) {
diff --git a/content/browser/browser_main_runner.cc b/content/browser/browser_main_runner.cc index 2585c8dd..9ee9ee1 100644 --- a/content/browser/browser_main_runner.cc +++ b/content/browser/browser_main_runner.cc
@@ -34,12 +34,8 @@ #endif #if defined(OS_WIN) -#include "base/win/win_util.h" #include "base/win/windows_version.h" -#include "net/cert/sha256_legacy_support_win.h" -#include "sandbox/win/src/sidestep/preamble_patcher.h" #include "ui/base/win/scoped_ole_initializer.h" -#include "ui/gfx/switches.h" #include "ui/gfx/win/direct_write.h" #endif @@ -49,86 +45,6 @@ bool g_exited_main_message_loop = false; -#if defined(OS_WIN) -#if !defined(_WIN64) -// Pointer to the original CryptVerifyCertificateSignatureEx function. -net::sha256_interception::CryptVerifyCertificateSignatureExFunc - g_real_crypt_verify_signature_stub = NULL; - -// Stub function that is called whenever the Crypt32 function -// CryptVerifyCertificateSignatureEx is called. It just defers to net to perform -// the actual verification. -BOOL WINAPI CryptVerifyCertificateSignatureExStub( - HCRYPTPROV_LEGACY provider, - DWORD encoding_type, - DWORD subject_type, - void* subject_data, - DWORD issuer_type, - void* issuer_data, - DWORD flags, - void* extra) { - return net::sha256_interception::CryptVerifyCertificateSignatureExHook( - g_real_crypt_verify_signature_stub, provider, encoding_type, subject_type, - subject_data, issuer_type, issuer_data, flags, extra); -} -#endif // !defined(_WIN64) - -// If necessary, install an interception -void InstallSha256LegacyHooks() { -#if defined(_WIN64) - // Interception on x64 is not supported. - return; -#else - if (base::win::MaybeHasSHA256Support()) - return; - - net::sha256_interception::CryptVerifyCertificateSignatureExFunc - cert_verify_signature_ptr = reinterpret_cast< - net::sha256_interception::CryptVerifyCertificateSignatureExFunc>( - ::GetProcAddress(::GetModuleHandle(L"crypt32.dll"), - "CryptVerifyCertificateSignatureEx")); - CHECK(cert_verify_signature_ptr); - - DWORD old_protect = 0; - if (!::VirtualProtect(cert_verify_signature_ptr, 5, PAGE_EXECUTE_READWRITE, - &old_protect)) { - return; - } - - g_real_crypt_verify_signature_stub = - reinterpret_cast< - net::sha256_interception::CryptVerifyCertificateSignatureExFunc>( - VirtualAllocEx(::GetCurrentProcess(), NULL, - sidestep::kMaxPreambleStubSize, MEM_COMMIT, - PAGE_EXECUTE_READWRITE)); - if (g_real_crypt_verify_signature_stub == NULL) { - CHECK(::VirtualProtect(cert_verify_signature_ptr, 5, old_protect, - &old_protect)); - return; - } - - sidestep::SideStepError patch_result = - sidestep::PreamblePatcher::Patch( - cert_verify_signature_ptr, CryptVerifyCertificateSignatureExStub, - g_real_crypt_verify_signature_stub, sidestep::kMaxPreambleStubSize); - if (patch_result != sidestep::SIDESTEP_SUCCESS) { - CHECK(::VirtualFreeEx(::GetCurrentProcess(), - g_real_crypt_verify_signature_stub, 0, - MEM_RELEASE)); - CHECK(::VirtualProtect(cert_verify_signature_ptr, 5, old_protect, - &old_protect)); - return; - } - - DWORD dummy = 0; - CHECK(::VirtualProtect(cert_verify_signature_ptr, 5, old_protect, &dummy)); - CHECK(::VirtualProtect(g_real_crypt_verify_signature_stub, - sidestep::kMaxPreambleStubSize, old_protect, - &old_protect)); -#endif // _WIN64 -} -#endif // OS_WIN - } // namespace class BrowserMainRunnerImpl : public BrowserMainRunner { @@ -180,7 +96,6 @@ // Win32 API here directly. ImmDisableTextFrameService(static_cast<DWORD>(-1)); } - InstallSha256LegacyHooks(); #endif // OS_WIN base::StatisticsRecorder::Initialize();
diff --git a/content/browser/download/base_file.cc b/content/browser/download/base_file.cc index 7bd2b0b..8fda8de 100644 --- a/content/browser/download/base_file.cc +++ b/content/browser/download/base_file.cc
@@ -203,7 +203,11 @@ if (calculate_hash_) secure_hash_->Finish(sha256_hash_, crypto::kSHA256Length); + Close(); +} +void BaseFile::FinishWithError() { + DCHECK_CURRENTLY_ON(BrowserThread::FILE); Close(); }
diff --git a/content/browser/download/base_file.h b/content/browser/download/base_file.h index 9a98d09..cc87ae6 100644 --- a/content/browser/download/base_file.h +++ b/content/browser/download/base_file.h
@@ -75,6 +75,11 @@ // Indicate that the download has finished. No new data will be received. void Finish(); + // Indicate that the download is being aborted due to an error. This is + // identical to Finish() with the exception that the hash state will not be + // finalized. + void FinishWithError(); + // Set the client guid which will be used to identify the app to the // system AV scanning function. Should be called before // AnnotateWithSourceInformation() to take effect.
diff --git a/content/browser/download/download_browsertest.cc b/content/browser/download/download_browsertest.cc index 794e8327..dc965d4 100644 --- a/content/browser/download/download_browsertest.cc +++ b/content/browser/download/download_browsertest.cc
@@ -383,6 +383,8 @@ return true; } + bool GenerateFileHash() override { return true; } + void SetDelayedOpen(bool delay) { delay_download_open_ = delay; } @@ -1399,6 +1401,59 @@ EXPECT_EQ(download->GetState(), DownloadItem::COMPLETE); } +IN_PROC_BROWSER_TEST_P(DownloadResumptionContentTest, Resume_Hash) { + using InjectedError = TestDownloadRequestHandler::InjectedError; + const char kExpectedHash[] = + "\xa7\x44\x49\x86\x24\xc6\x84\x6c\x89\xdf\xd8\xec\xa0\xe0\x61\x12\xdc\x80" + "\x13\xf2\x83\x49\xa9\x14\x52\x32\xf0\x95\x20\xca\x5b\x30"; + std::string expected_hash(kExpectedHash); + TestDownloadRequestHandler request_handler; + TestDownloadRequestHandler::Parameters parameters; + + // As a control, let's try GetHash() on an uninterrupted download. + request_handler.StartServing(parameters); + DownloadItem* uninterrupted_download(StartDownloadAndReturnItem( + initiator_shell_for_resumption(), request_handler.url())); + WaitForCompletion(uninterrupted_download); + EXPECT_EQ(expected_hash, uninterrupted_download->GetHash()); + + // Now with interruptions. + parameters.injected_errors.push( + InjectedError(100, net::ERR_CONNECTION_RESET)); + parameters.injected_errors.push( + InjectedError(211, net::ERR_CONNECTION_RESET)); + parameters.injected_errors.push( + InjectedError(337, net::ERR_CONNECTION_RESET)); + parameters.injected_errors.push( + InjectedError(400, net::ERR_CONNECTION_RESET)); + parameters.injected_errors.push( + InjectedError(512, net::ERR_CONNECTION_RESET)); + request_handler.StartServing(parameters); + + // Start and watch for interrupt. + DownloadItem* download(StartDownloadAndReturnItem( + initiator_shell_for_resumption(), request_handler.url())); + WaitForInterrupt(download); + + PrepareToResume(); + download->Resume(); + WaitForInterrupt(download); + + download->Resume(); + WaitForInterrupt(download); + + download->Resume(); + WaitForInterrupt(download); + + download->Resume(); + WaitForInterrupt(download); + + download->Resume(); + WaitForCompletion(download); + + EXPECT_EQ(expected_hash, download->GetHash()); +} + // An interrupted download should remove the intermediate file when it is // cancelled. IN_PROC_BROWSER_TEST_P(DownloadResumptionContentTest,
diff --git a/content/browser/download/download_file_impl.cc b/content/browser/download/download_file_impl.cc index 0a1f398..e8e31cee 100644 --- a/content/browser/download/download_file_impl.cc +++ b/content/browser/download/download_file_impl.cc
@@ -280,7 +280,10 @@ stream_reader_->GetStatus()); SendUpdate(); base::TimeTicks close_start(base::TimeTicks::Now()); - file_.Finish(); + if (reason == DOWNLOAD_INTERRUPT_REASON_NONE) + file_.Finish(); + else + file_.FinishWithError(); base::TimeTicks now(base::TimeTicks::Now()); disk_writes_time_ += (now - close_start); RecordFileBandwidth(
diff --git a/content/browser/download/save_item.cc b/content/browser/download/save_item.cc index edea2632..5fa26277 100644 --- a/content/browser/download/save_item.cc +++ b/content/browser/download/save_item.cc
@@ -27,10 +27,12 @@ SaveItem::SaveItem(const GURL& url, const Referrer& referrer, SavePackage* package, - SaveFileCreateInfo::SaveFileSource save_source) + SaveFileCreateInfo::SaveFileSource save_source, + int frame_tree_node_id) : save_item_id_(GetNextSaveItemId()), url_(url), referrer_(referrer), + frame_tree_node_id_(frame_tree_node_id), total_bytes_(0), received_bytes_(0), state_(WAIT_START),
diff --git a/content/browser/download/save_item.h b/content/browser/download/save_item.h index b0e655d..ef46395 100644 --- a/content/browser/download/save_item.h +++ b/content/browser/download/save_item.h
@@ -30,7 +30,8 @@ SaveItem(const GURL& url, const Referrer& referrer, SavePackage* package, - SaveFileCreateInfo::SaveFileSource save_source); + SaveFileCreateInfo::SaveFileSource save_source, + int frame_tree_node_id); ~SaveItem(); @@ -61,6 +62,7 @@ const base::FilePath& file_name() const { return file_name_; } const GURL& url() const { return url_; } const Referrer& referrer() const { return referrer_; } + int frame_tree_node_id() const { return frame_tree_node_id_; } int64_t total_bytes() const { return total_bytes_; } int64_t received_bytes() const { return received_bytes_; } bool has_final_name() const { return has_final_name_; } @@ -87,6 +89,10 @@ GURL url_; Referrer referrer_; + // Frame tree node id, if this save item represents a frame + // (otherwise FrameTreeNode::kFrameTreeNodeInvalidID). + int frame_tree_node_id_; + // Total bytes expected. int64_t total_bytes_;
diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc index 5b7d6a6..8454625 100644 --- a/content/browser/download/save_package.cc +++ b/content/browser/download/save_package.cc
@@ -354,10 +354,8 @@ SaveFileCreateInfo::SaveFileSource save_source = page_url_.SchemeIsFile() ? SaveFileCreateInfo::SAVE_FILE_FROM_FILE : SaveFileCreateInfo::SAVE_FILE_FROM_NET; - SaveItem* save_item = new SaveItem(page_url_, - Referrer(), - this, - save_source); + SaveItem* save_item = new SaveItem(page_url_, Referrer(), this, save_source, + FrameTreeNode::kFrameTreeNodeInvalidId); // Add this item to waiting list. waiting_item_queue_.push_back(save_item); all_save_items_count_ = 1; @@ -999,30 +997,53 @@ FrameTreeNode* target_tree_node) { DCHECK(target_tree_node); int target_frame_tree_node_id = target_tree_node->frame_tree_node_id(); + RenderFrameHostImpl* target = target_tree_node->current_frame_host(); // Collect all saved success items. // SECURITY NOTE: We don't send *all* urls / local paths, but only // those that the given frame had access to already (because it contained // the savable resources / subframes associated with save items). std::map<GURL, base::FilePath> url_to_local_path; + std::map<int, base::FilePath> routing_id_to_local_path; auto it = frame_tree_node_id_to_contained_save_items_.find( target_frame_tree_node_id); if (it != frame_tree_node_id_to_contained_save_items_.end()) { for (SaveItem* save_item : it->second) { + // Calculate the local link to use for this |save_item|. DCHECK(save_item->has_final_name()); base::FilePath local_path(base::FilePath::kCurrentDirectory); if (target_tree_node->IsMainFrame()) { local_path = local_path.Append(saved_main_directory_path_.BaseName()); } local_path = local_path.Append(save_item->file_name()); - url_to_local_path[save_item->url()] = local_path; + + // Insert the link into |url_to_local_path| or |routing_id_to_local_path|. + if (save_item->save_source() != SaveFileCreateInfo::SAVE_FILE_FROM_DOM) { + DCHECK_EQ(FrameTreeNode::kFrameTreeNodeInvalidId, + save_item->frame_tree_node_id()); + url_to_local_path[save_item->url()] = local_path; + } else { + FrameTreeNode* save_item_frame_tree_node = + target_tree_node->frame_tree()->FindByID( + save_item->frame_tree_node_id()); + if (!save_item_frame_tree_node) { + // crbug.com/541354: Raciness when saving a dynamically changing page. + continue; + } + + int routing_id = + save_item_frame_tree_node->render_manager() + ->GetRoutingIdForSiteInstance(target->GetSiteInstance()); + DCHECK_NE(MSG_ROUTING_NONE, routing_id); + + routing_id_to_local_path[routing_id] = local_path; + } } } // Ask target frame to serialize itself. - RenderFrameHostImpl* target = target_tree_node->current_frame_host(); target->Send(new FrameMsg_GetSerializedHtmlWithLocalLinks( - target->GetRoutingID(), url_to_local_path)); + target->GetRoutingID(), url_to_local_path, routing_id_to_local_path)); } // Process the serialized HTML content data of a specified frame @@ -1150,6 +1171,7 @@ SaveItem* SavePackage::CreatePendingSaveItem( int container_frame_tree_node_id, + int save_item_frame_tree_node_id, const GURL& url, const Referrer& referrer, SaveFileCreateInfo::SaveFileSource save_source) { @@ -1157,7 +1179,8 @@ SaveItem* save_item; Referrer sanitized_referrer = Referrer::SanitizeForRequest(url, referrer); - save_item = new SaveItem(url, sanitized_referrer, this, save_source); + save_item = new SaveItem(url, sanitized_referrer, this, save_source, + save_item_frame_tree_node_id); waiting_item_queue_.push_back(save_item); frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] @@ -1167,6 +1190,7 @@ SaveItem* SavePackage::CreatePendingSaveItemDeduplicatingByUrl( int container_frame_tree_node_id, + int save_item_frame_tree_node_id, const GURL& url, const Referrer& referrer, SaveFileCreateInfo::SaveFileSource save_source) { @@ -1182,7 +1206,8 @@ frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] .push_back(save_item); } else { - save_item = CreatePendingSaveItem(container_frame_tree_node_id, url, + save_item = CreatePendingSaveItem(container_frame_tree_node_id, + save_item_frame_tree_node_id, url, referrer, save_source); url_to_save_item_[url] = save_item; } @@ -1199,8 +1224,9 @@ SaveFileCreateInfo::SaveFileSource save_source = url.SchemeIsFile() ? SaveFileCreateInfo::SAVE_FILE_FROM_FILE : SaveFileCreateInfo::SAVE_FILE_FROM_NET; - CreatePendingSaveItemDeduplicatingByUrl(container_frame_tree_node_id, url, - referrer, save_source); + CreatePendingSaveItemDeduplicatingByUrl( + container_frame_tree_node_id, FrameTreeNode::kFrameTreeNodeInvalidId, url, + referrer, save_source); } void SavePackage::EnqueueFrame(int container_frame_tree_node_id, @@ -1209,9 +1235,9 @@ if (!frame_original_url.is_valid()) return; - SaveItem* save_item = - CreatePendingSaveItem(container_frame_tree_node_id, frame_original_url, - Referrer(), SaveFileCreateInfo::SAVE_FILE_FROM_DOM); + SaveItem* save_item = CreatePendingSaveItem( + container_frame_tree_node_id, frame_tree_node_id, frame_original_url, + Referrer(), SaveFileCreateInfo::SAVE_FILE_FROM_DOM); DCHECK(save_item); frame_tree_node_id_to_save_item_[frame_tree_node_id] = save_item; }
diff --git a/content/browser/download/save_package.h b/content/browser/download/save_package.h index eabf657..d468551 100644 --- a/content/browser/download/save_package.h +++ b/content/browser/download/save_package.h
@@ -206,6 +206,7 @@ // Helper for finding or creating a SaveItem with the given parameters. SaveItem* CreatePendingSaveItem( int container_frame_tree_node_id, + int save_item_frame_tree_node_id, const GURL& url, const Referrer& referrer, SaveFileCreateInfo::SaveFileSource save_source); @@ -214,6 +215,7 @@ // creating a SaveItem with the given parameters. SaveItem* CreatePendingSaveItemDeduplicatingByUrl( int container_frame_tree_node_id, + int save_item_frame_tree_node_id, const GURL& url, const Referrer& referrer, SaveFileCreateInfo::SaveFileSource save_source);
diff --git a/content/browser/fileapi/copy_or_move_operation_delegate_unittest.cc b/content/browser/fileapi/copy_or_move_operation_delegate_unittest.cc index 055b8f2..6e2fcca 100644 --- a/content/browser/fileapi/copy_or_move_operation_delegate_unittest.cc +++ b/content/browser/fileapi/copy_or_move_operation_delegate_unittest.cc
@@ -619,8 +619,10 @@ ASSERT_TRUE(helper.DirectoryExists(src)); ASSERT_TRUE(helper.DirectoryExists(dest)); + // In the move operation, [file 0, file 2, file 3] are processed as LIFO. + // After file 3 is processed, file 2 is rejected by the validator and the + // operation fails. That is, only file 3 should be in dest. FileSystemTestCaseRecord kMoveDirResultCases[] = { - {false, FILE_PATH_LITERAL("file 0"), 38}, {false, FILE_PATH_LITERAL("file 3"), 0}, };
diff --git a/content/browser/gpu/gpu_arc_video_service_host.cc b/content/browser/gpu/gpu_arc_video_service_host.cc deleted file mode 100644 index 7ba572d..0000000 --- a/content/browser/gpu/gpu_arc_video_service_host.cc +++ /dev/null
@@ -1,76 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/gpu/gpu_arc_video_service_host.h" - -#include "base/location.h" -#include "base/logging.h" -#include "base/message_loop/message_loop.h" -#include "content/browser/gpu/gpu_process_host.h" -#include "content/common/gpu/gpu_messages.h" -#include "content/public/browser/arc_video_host_delegate.h" -#include "content/public/browser/browser_thread.h" -#include "ipc/ipc_channel_handle.h" -#include "ipc/ipc_message_macros.h" -#include "ipc/ipc_message_utils.h" -#include "third_party/mojo/src/mojo/edk/embedder/embedder.h" - -namespace content { - -namespace { - -void CreateChannelOnIOThread( - const GpuProcessHost::CreateArcVideoAcceleratorChannelCallback& callback) { - GpuProcessHost* gpu_process_host = - GpuProcessHost::Get(GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED, - CAUSE_FOR_GPU_LAUNCH_ARCVIDEOACCELERATOR); - gpu_process_host->CreateArcVideoAcceleratorChannel(callback); -} - -void HandleChannelCreatedReply( - const arc::VideoHost::OnRequestArcVideoAcceleratorChannelCallback& callback, - const IPC::ChannelHandle& handle) { - MojoHandle wrapped_handle; - MojoResult wrap_result = mojo::embedder::CreatePlatformHandleWrapper( - mojo::embedder::ScopedPlatformHandle( - mojo::embedder::PlatformHandle(handle.socket.fd)), - &wrapped_handle); - if (wrap_result != MOJO_RESULT_OK) { - LOG(WARNING) << "Pipe failed to wrap handles. Closing: " << wrap_result; - callback.Run(mojo::ScopedHandle()); - return; - } - callback.Run(mojo::ScopedHandle(mojo::Handle(wrapped_handle))); -} - -} // namespace - -scoped_ptr<arc::VideoHostDelegate> CreateArcVideoHostDelegate() { - return make_scoped_ptr(new GpuArcVideoServiceHost()); -} - -GpuArcVideoServiceHost::GpuArcVideoServiceHost() - : io_task_runner_(content::BrowserThread::GetMessageLoopProxyForThread( - content::BrowserThread::IO)) {} - -GpuArcVideoServiceHost::~GpuArcVideoServiceHost() { - DCHECK(thread_checker_.CalledOnValidThread()); -} - -void GpuArcVideoServiceHost::OnRequestArcVideoAcceleratorChannel( - const OnRequestArcVideoAcceleratorChannelCallback& callback) { - DCHECK(thread_checker_.CalledOnValidThread()); - - io_task_runner_->PostTask( - FROM_HERE, base::Bind(&CreateChannelOnIOThread, - base::Bind(&HandleChannelCreatedReply, callback))); -} - -void GpuArcVideoServiceHost::OnStopping() { - GpuProcessHost::SendOnIO(GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED, - CAUSE_FOR_GPU_LAUNCH_NO_LAUNCH, - new GpuMsg_ShutdownArcVideoService()); -} - -} // namespace content
diff --git a/content/browser/gpu/gpu_arc_video_service_host.h b/content/browser/gpu/gpu_arc_video_service_host.h deleted file mode 100644 index 3a5ca2a..0000000 --- a/content/browser/gpu/gpu_arc_video_service_host.h +++ /dev/null
@@ -1,54 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_GPU_GPU_ARC_VIDEO_SERVICE_HOST_H_ -#define CONTENT_BROWSER_GPU_GPU_ARC_VIDEO_SERVICE_HOST_H_ - -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/threading/thread_checker.h" -#include "components/arc/video/video_host_delegate.h" - -namespace base { -class SingleThreadTaskRunner; -} - -namespace IPC { -struct ChannelHandle; -} - -namespace content { - -// This class passes requests from arc::VideoInstance to GpuArcVideoService to -// create a video accelerator channel in GPU process and reply the created -// channel. -// -// Don't be confused two senses of "host" of this class. This class, which -// implements arc::VideoHost, handles requests from arc::VideoInstance. At the -// same time, as its name says, this class is the host of corresponding class, -// GpuArcVideoService, in the GPU process. -class GpuArcVideoServiceHost : public arc::VideoHostDelegate { - public: - GpuArcVideoServiceHost(); - ~GpuArcVideoServiceHost() override; - - // arc::VideoHostDelegate implementation. - void OnStopping() override; - - // arc::VideoHost implementation. - void OnRequestArcVideoAcceleratorChannel( - const OnRequestArcVideoAcceleratorChannelCallback& callback) override; - - private: - base::ThreadChecker thread_checker_; - - // IO task runner, where GpuProcessHost tasks run. - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; - - DISALLOW_COPY_AND_ASSIGN(GpuArcVideoServiceHost); -}; - -} // namespace content - -#endif // CONTENT_BROWSER_GPU_GPU_ARC_VIDEO_SERVICE_HOST_H_
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc index 8de9cd30..1ac99f10 100644 --- a/content/browser/gpu/gpu_process_host.cc +++ b/content/browser/gpu/gpu_process_host.cc
@@ -604,10 +604,6 @@ OnGpuMemoryBufferCreated) IPC_MESSAGE_HANDLER(GpuHostMsg_DidCreateOffscreenContext, OnDidCreateOffscreenContext) -#if defined(OS_CHROMEOS) - IPC_MESSAGE_HANDLER(GpuHostMsg_ArcVideoAcceleratorChannelCreated, - OnArcVideoAcceleratorChannelCreated) -#endif IPC_MESSAGE_HANDLER(GpuHostMsg_DidLoseContext, OnDidLoseContext) IPC_MESSAGE_HANDLER(GpuHostMsg_DidDestroyOffscreenContext, OnDidDestroyOffscreenContext) @@ -789,19 +785,6 @@ Send(new GpuMsg_DestroyGpuMemoryBuffer(id, client_id, sync_token)); } -#if defined(OS_CHROMEOS) -void GpuProcessHost::CreateArcVideoAcceleratorChannel( - const CreateArcVideoAcceleratorChannelCallback& callback) { - DCHECK(CalledOnValidThread()); - - if (Send(new GpuMsg_CreateArcVideoAcceleratorChannel())) { - create_arc_video_accelerator_channel_requests_.push(callback); - } else { - callback.Run(IPC::ChannelHandle()); - } -} -#endif - void GpuProcessHost::OnInitialized(bool result, const gpu::GPUInfo& gpu_info) { UMA_HISTOGRAM_BOOLEAN("GPU.GPUProcessInitialized", result); initialized_ = result; @@ -869,24 +852,6 @@ callback.Run(handle); } -#if defined(OS_CHROMEOS) -void GpuProcessHost::OnArcVideoAcceleratorChannelCreated( - const IPC::ChannelHandle& handle) { - if (create_arc_video_accelerator_channel_requests_.empty()) { - RouteOnUIThread( - GpuHostMsg_OnLogMessage(logging::LOG_WARNING, "WARNING", - "Received a ArcVideoAcceleratorChannelCreated " - "message but no requests in queue.")); - return; - } - - CreateArcVideoAcceleratorChannelCallback callback = - create_arc_video_accelerator_channel_requests_.front(); - create_arc_video_accelerator_channel_requests_.pop(); - callback.Run(handle); -} -#endif - void GpuProcessHost::OnDidCreateOffscreenContext(const GURL& url) { urls_with_live_offscreen_contexts_.insert(url); } @@ -1092,15 +1057,6 @@ create_gpu_memory_buffer_requests_.pop(); callback.Run(gfx::GpuMemoryBufferHandle()); } - -#if defined(OS_CHROMEOS) - while (!create_arc_video_accelerator_channel_requests_.empty()) { - CreateArcVideoAcceleratorChannelCallback callback = - create_arc_video_accelerator_channel_requests_.front(); - create_arc_video_accelerator_channel_requests_.pop(); - callback.Run(IPC::ChannelHandle()); - } -#endif } void GpuProcessHost::BlockLiveOffscreenContexts() {
diff --git a/content/browser/gpu/gpu_process_host.h b/content/browser/gpu/gpu_process_host.h index c3ce718..9b7c1ab 100644 --- a/content/browser/gpu/gpu_process_host.h +++ b/content/browser/gpu/gpu_process_host.h
@@ -74,11 +74,6 @@ typedef base::Callback<void(const gfx::GpuMemoryBufferHandle& handle)> CreateGpuMemoryBufferCallback; -#if defined(OS_CHROMEOS) - typedef base::Callback<void(const IPC::ChannelHandle&)> - CreateArcVideoAcceleratorChannelCallback; -#endif - static bool gpu_enabled() { return gpu_enabled_; } static int gpu_crash_count() { return gpu_crash_count_; } @@ -158,13 +153,6 @@ int client_id, const gpu::SyncToken& sync_token); -#if defined(OS_CHROMEOS) - // Tells the GPU process to create a new ipc channel for - // ArcVideoAccelerator. - void CreateArcVideoAcceleratorChannel( - const CreateArcVideoAcceleratorChannelCallback& callback); -#endif - // What kind of GPU process, e.g. sandboxed or unsandboxed. GpuProcessKind kind(); @@ -207,7 +195,6 @@ void OnChannelEstablished(const IPC::ChannelHandle& channel_handle); void OnCommandBufferCreated(CreateCommandBufferResult result); void OnGpuMemoryBufferCreated(const gfx::GpuMemoryBufferHandle& handle); - void OnArcVideoAcceleratorChannelCreated(const IPC::ChannelHandle& handle); void OnDidCreateOffscreenContext(const GURL& url); void OnDidLoseContext(bool offscreen, gpu::error::ContextLostReason reason, @@ -254,13 +241,6 @@ // The pending create gpu memory buffer requests we need to reply to. std::queue<CreateGpuMemoryBufferCallback> create_gpu_memory_buffer_requests_; -#if defined(OS_CHROMEOS) - // The pending create arc video accelerator channel requests we need to reply - // to. - std::queue<CreateArcVideoAcceleratorChannelCallback> - create_arc_video_accelerator_channel_requests_; -#endif - // Qeueud messages to send when the process launches. std::queue<IPC::Message*> queued_messages_;
diff --git a/content/browser/push_messaging/push_messaging_router.cc b/content/browser/push_messaging/push_messaging_router.cc index 3f72a75..7b8deab 100644 --- a/content/browser/push_messaging/push_messaging_router.cc +++ b/content/browser/push_messaging/push_messaging_router.cc
@@ -10,6 +10,7 @@ #include "content/browser/service_worker/service_worker_context_wrapper.h" #include "content/browser/service_worker/service_worker_registration.h" #include "content/browser/service_worker/service_worker_storage.h" +#include "content/common/service_worker/service_worker_messages.h" #include "content/common/service_worker/service_worker_status_code.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" @@ -22,6 +23,7 @@ void RunDeliverCallback( const PushMessagingRouter::DeliverMessageCallback& deliver_message_callback, PushDeliveryStatus delivery_status) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(deliver_message_callback, delivery_status)); @@ -87,11 +89,27 @@ // alive until the callback dies. Otherwise the registration could be // released when this method returns - before the event is delivered to the // service worker. - base::Callback<void(ServiceWorkerStatusCode)> dispatch_event_callback = + version->RunAfterStartWorker( + base::Bind(&PushMessagingRouter::DeliverMessageToWorker, + make_scoped_refptr(version), service_worker_registration, data, + deliver_message_callback), base::Bind(&PushMessagingRouter::DeliverMessageEnd, - deliver_message_callback, service_worker_registration); + deliver_message_callback, service_worker_registration)); +} - version->DispatchPushEvent(dispatch_event_callback, data); +// static +void PushMessagingRouter::DeliverMessageToWorker( + const scoped_refptr<ServiceWorkerVersion>& service_worker, + const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration, + const std::string& data, + const DeliverMessageCallback& deliver_message_callback) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + int request_id = service_worker->StartRequest( + ServiceWorkerMetrics::EventType::PUSH, + base::Bind(&PushMessagingRouter::DeliverMessageEnd, + deliver_message_callback, service_worker_registration)); + service_worker->DispatchSimpleEvent<ServiceWorkerHostMsg_PushEventFinished>( + request_id, ServiceWorkerMsg_PushEvent(request_id, data)); } // static
diff --git a/content/browser/push_messaging/push_messaging_router.h b/content/browser/push_messaging/push_messaging_router.h index dae9973..8cfa82c1 100644 --- a/content/browser/push_messaging/push_messaging_router.h +++ b/content/browser/push_messaging/push_messaging_router.h
@@ -12,6 +12,7 @@ #include "base/memory/weak_ptr.h" #include "content/common/service_worker/service_worker_status_code.h" #include "content/public/common/push_messaging_status.h" +#include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerEventResult.h" #include "url/gurl.h" namespace content { @@ -19,6 +20,7 @@ class BrowserContext; class ServiceWorkerContextWrapper; class ServiceWorkerRegistration; +class ServiceWorkerVersion; class PushMessagingRouter { public: @@ -54,6 +56,15 @@ const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration); + // Delivers a push message with |data| to a specific |service_worker|. Must be + // called on the IO thread, with the the worker running. + static void DeliverMessageToWorker( + const scoped_refptr<ServiceWorkerVersion>& service_worker, + const scoped_refptr<ServiceWorkerRegistration>& + service_worker_registration, + const std::string& data, + const DeliverMessageCallback& deliver_message_callback); + // Gets called asynchronously after the Service Worker has dispatched the push // event. Must be called on the IO thread. static void DeliverMessageEnd(
diff --git a/content/browser/renderer_host/memory_benchmark_message_filter.cc b/content/browser/renderer_host/memory_benchmark_message_filter.cc deleted file mode 100644 index 9125a8c..0000000 --- a/content/browser/renderer_host/memory_benchmark_message_filter.cc +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright (c) 2013 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/browser/renderer_host/memory_benchmark_message_filter.h" - -#include "build/build_config.h" -#include "content/common/memory_benchmark_messages.h" - -#if defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID)) - -#include "third_party/tcmalloc/chromium/src/gperftools/heap-profiler.h" - -namespace content { - -MemoryBenchmarkMessageFilter::MemoryBenchmarkMessageFilter() - : BrowserMessageFilter(MemoryBenchmarkMsgStart) { -} - -bool MemoryBenchmarkMessageFilter::OnMessageReceived( - const IPC::Message& message) { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(MemoryBenchmarkMessageFilter, message) - IPC_MESSAGE_HANDLER(MemoryBenchmarkHostMsg_HeapProfilerDump, - OnHeapProfilerDump) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; -} - -MemoryBenchmarkMessageFilter::~MemoryBenchmarkMessageFilter() { -} - -void MemoryBenchmarkMessageFilter::OnHeapProfilerDump( - const std::string& reason) { - ::HeapProfilerDump(reason.c_str()); -} - -} // namespace content - -#endif // defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID))
diff --git a/content/browser/renderer_host/memory_benchmark_message_filter.h b/content/browser/renderer_host/memory_benchmark_message_filter.h deleted file mode 100644 index 0bafa73..0000000 --- a/content/browser/renderer_host/memory_benchmark_message_filter.h +++ /dev/null
@@ -1,31 +0,0 @@ -// Copyright (c) 2013 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_BROWSER_RENDERER_HOST_MEMORY_BENCHMARK_MESSAGE_FILTER_H_ -#define CONTENT_BROWSER_RENDERER_HOST_MEMORY_BENCHMARK_MESSAGE_FILTER_H_ - -#include <string> - -#include "base/macros.h" -#include "content/public/browser/browser_message_filter.h" - -namespace content { - -class MemoryBenchmarkMessageFilter : public BrowserMessageFilter { - public: - MemoryBenchmarkMessageFilter(); - - bool OnMessageReceived(const IPC::Message& message) override; - - private: - ~MemoryBenchmarkMessageFilter() override; - - void OnHeapProfilerDump(const std::string& reason); - - DISALLOW_COPY_AND_ASSIGN(MemoryBenchmarkMessageFilter); -}; - -} // namespace content - -#endif // CONTENT_BROWSER_RENDERER_HOST_MEMORY_BENCHMARK_MESSAGE_FILTER_H_
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 21b23a5..e5a1a98 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -97,7 +97,6 @@ #include "content/browser/renderer_host/media/media_stream_dispatcher_host.h" #include "content/browser/renderer_host/media/peer_connection_tracker_host.h" #include "content/browser/renderer_host/media/video_capture_host.h" -#include "content/browser/renderer_host/memory_benchmark_message_filter.h" #include "content/browser/renderer_host/pepper/pepper_message_filter.h" #include "content/browser/renderer_host/pepper/pepper_renderer_connection.h" #include "content/browser/renderer_host/render_message_filter.h" @@ -1047,10 +1046,6 @@ AddFilter(new DeviceOrientationAbsoluteMessageFilter()); AddFilter(new ProfilerMessageFilter(PROCESS_TYPE_RENDERER)); AddFilter(new HistogramMessageFilter()); -#if defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID)) - if (browser_command_line.HasSwitch(switches::kEnableMemoryBenchmarking)) - AddFilter(new MemoryBenchmarkMessageFilter()); -#endif AddFilter(new MemoryMessageFilter(this)); AddFilter(new PushMessagingMessageFilter( GetID(), storage_partition_impl_->GetServiceWorkerContext()));
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 4822172..6c1364db 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -11,6 +11,7 @@ #include "base/callback.h" #include "base/command_line.h" +#include "base/debug/dump_without_crashing.h" #include "base/i18n/rtl.h" #include "base/json/json_reader.h" #include "base/message_loop/message_loop.h" @@ -46,6 +47,7 @@ #include "content/common/frame_messages.h" #include "content/common/input_messages.h" #include "content/common/inter_process_time_ticks_converter.h" +#include "content/common/site_isolation_policy.h" #include "content/common/speech_recognition_messages.h" #include "content/common/swapped_out_messages.h" #include "content/common/view_messages.h" @@ -300,6 +302,15 @@ CHECK(main_frame_routing_id_ != MSG_ROUTING_NONE || proxy_route_id != MSG_ROUTING_NONE); + // If swappedout:// is disabled, we should not set both main_frame_routing_id_ + // and proxy_route_id. Log cases that this happens (without crashing) to + // track down https://crbug.com/574245. + // TODO(creis): Remove this once we've found the cause. + if (SiteIsolationPolicy::IsSwappedOutStateForbidden() && + main_frame_routing_id_ != MSG_ROUTING_NONE && + proxy_route_id != MSG_ROUTING_NONE) + base::debug::DumpWithoutCrashing(); + GetWidget()->set_renderer_initialized(true); // Ensure the RenderView starts with a next_page_id larger than any existing
diff --git a/content/browser/service_worker/embedded_worker_instance.h b/content/browser/service_worker/embedded_worker_instance.h index a4ed91ca..2d7c426 100644 --- a/content/browser/service_worker/embedded_worker_instance.h +++ b/content/browser/service_worker/embedded_worker_instance.h
@@ -150,6 +150,10 @@ void set_devtools_attached(bool attached) { devtools_attached_ = attached; } bool devtools_attached() const { return devtools_attached_; } + bool network_accessed_for_script() const { + return network_accessed_for_script_; + } + // Called when the script load request accessed the network. void OnNetworkAccessedForScriptLoad();
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc index 76c218b..bfd13f3cc6 100644 --- a/content/browser/service_worker/embedded_worker_test_helper.cc +++ b/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -160,8 +160,8 @@ SimulateWorkerReadyForInspection(embedded_worker_id); SimulateWorkerScriptCached(embedded_worker_id); SimulateWorkerScriptLoaded(embedded_worker_id); - SimulateWorkerThreadStarted(next_thread_id_++, embedded_worker_id); - SimulateWorkerScriptEvaluated(embedded_worker_id); + SimulateWorkerThreadStarted(GetNextThreadId(), embedded_worker_id); + SimulateWorkerScriptEvaluated(embedded_worker_id, true /* success */); SimulateWorkerStarted(embedded_worker_id); } @@ -271,11 +271,12 @@ } void EmbeddedWorkerTestHelper::SimulateWorkerScriptEvaluated( - int embedded_worker_id) { + int embedded_worker_id, + bool success) { EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id); ASSERT_TRUE(worker != NULL); - registry()->OnWorkerScriptEvaluated( - worker->process_id(), embedded_worker_id, true /* success */); + registry()->OnWorkerScriptEvaluated(worker->process_id(), embedded_worker_id, + success); } void EmbeddedWorkerTestHelper::SimulateWorkerStarted(
diff --git a/content/browser/service_worker/embedded_worker_test_helper.h b/content/browser/service_worker/embedded_worker_test_helper.h index 961f1637..10c71699 100644 --- a/content/browser/service_worker/embedded_worker_test_helper.h +++ b/content/browser/service_worker/embedded_worker_test_helper.h
@@ -77,11 +77,17 @@ ServiceWorkerContextWrapper* context_wrapper() { return wrapper_.get(); } void ShutdownContext(); + int GetNextThreadId() { return next_thread_id_++; } + int mock_render_process_id() const { return mock_render_process_id_;} MockRenderProcessHost* mock_render_process_host() { return render_process_host_.get(); } + std::map<int, int64_t> embedded_worker_id_service_worker_version_id_map() { + return embedded_worker_id_service_worker_version_id_map_; + } + // Only used for tests that force creating a new render process. There is no // corresponding MockRenderProcessHost. int new_render_process_id() const { return mock_render_process_id_ + 1; } @@ -127,7 +133,7 @@ void SimulateWorkerScriptCached(int embedded_worker_id); void SimulateWorkerScriptLoaded(int embedded_worker_id); void SimulateWorkerThreadStarted(int thread_id, int embedded_worker_id); - void SimulateWorkerScriptEvaluated(int embedded_worker_id); + void SimulateWorkerScriptEvaluated(int embedded_worker_id, bool success); void SimulateWorkerStarted(int embedded_worker_id); void SimulateWorkerStopped(int embedded_worker_id); void SimulateSend(IPC::Message* message);
diff --git a/content/browser/service_worker/service_worker_job_unittest.cc b/content/browser/service_worker/service_worker_job_unittest.cc index a5572a4f..c9e29b76 100644 --- a/content/browser/service_worker/service_worker_job_unittest.cc +++ b/content/browser/service_worker/service_worker_job_unittest.cc
@@ -788,6 +788,17 @@ return context()->job_coordinator(); } + bool force_bypass_cache_for_scripts() const { + return force_bypass_cache_for_scripts_; + } + void set_force_bypass_cache_for_scripts(bool force_bypass_cache_for_scripts) { + force_bypass_cache_for_scripts_ = force_bypass_cache_for_scripts; + } + + void set_force_start_worker_failure(bool force_start_worker_failure) { + force_start_worker_failure_ = force_start_worker_failure; + } + scoped_refptr<ServiceWorkerRegistration> SetupInitialRegistration( const GURL& test_origin) { scoped_refptr<ServiceWorkerRegistration> registration; @@ -823,6 +834,8 @@ ASSERT_TRUE(version); version->AddListener(this); + if (force_bypass_cache_for_scripts()) + version->set_force_bypass_cache_for_scripts(true); if (!is_update) { // Spoof caching the script for the initial version. int64_t resource_id = storage()->NewResourceId(); @@ -844,8 +857,18 @@ version->script_cache_map()->NotifyFinishedCaching( script, kMockScriptSize, net::URLRequestStatus(), std::string()); } - EmbeddedWorkerTestHelper::OnStartWorker(embedded_worker_id, version_id, - scope, script); + if (!force_start_worker_failure_) { + EmbeddedWorkerTestHelper::OnStartWorker(embedded_worker_id, version_id, + scope, script); + } else { + (embedded_worker_id_service_worker_version_id_map())[embedded_worker_id] = + version_id; + SimulateWorkerReadyForInspection(embedded_worker_id); + SimulateWorkerScriptCached(embedded_worker_id); + SimulateWorkerScriptLoaded(embedded_worker_id); + SimulateWorkerThreadStarted(GetNextThreadId(), embedded_worker_id); + SimulateWorkerScriptEvaluated(embedded_worker_id, false); + } } // ServiceWorkerRegistration::Listener overrides @@ -865,7 +888,6 @@ } void OnUpdateFound(ServiceWorkerRegistration* registration) override { - ASSERT_FALSE(update_found_); update_found_ = true; } @@ -882,6 +904,8 @@ std::vector<AttributeChangeLogEntry> attribute_change_log_; std::vector<StateChangeLogEntry> state_change_log_; bool update_found_ = false; + bool force_bypass_cache_for_scripts_ = false; + bool force_start_worker_failure_ = false; }; // Helper class for update tests that evicts the active version when the update @@ -965,16 +989,35 @@ helper_.reset(update_helper); scoped_refptr<ServiceWorkerRegistration> registration = update_helper->SetupInitialRegistration(kNoChangeOrigin); + ASSERT_TRUE(registration.get()); - // Run an update where the last update check was less than 24 hours ago. The - // check time shouldn't change, as we didn't bypass cache. + registration->AddListener(update_helper); + + // Run an update that does not bypass the network cache. The check time + // should not be updated. registration->set_last_update_check(kToday); registration->active_version()->StartUpdate(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(kToday, registration->last_update_check()); + registration->RemoveListener(update_helper); - // Run an update where the last update check was over 24 hours ago. The - // check time should change, as the cache was bypassed. + registration = update_helper->SetupInitialRegistration(kNewVersionOrigin); + ASSERT_TRUE(registration.get()); + + registration->AddListener(update_helper); + + // Run an update that bypasses the network cache. The check time should be + // updated. + update_helper->set_force_bypass_cache_for_scripts(true); + registration->set_last_update_check(kYesterday); + registration->active_version()->StartUpdate(); + base::RunLoop().RunUntilIdle(); + EXPECT_LT(kYesterday, registration->last_update_check()); + + // Run an update to a worker that loads successfully but fails to start up + // (script evaluation failure). The check time should be updated. + update_helper->set_force_bypass_cache_for_scripts(true); + update_helper->set_force_start_worker_failure(true); registration->set_last_update_check(kYesterday); registration->active_version()->StartUpdate(); base::RunLoop().RunUntilIdle();
diff --git a/content/browser/service_worker/service_worker_metrics.cc b/content/browser/service_worker/service_worker_metrics.cc index 64c8d43..f32a091 100644 --- a/content/browser/service_worker/service_worker_metrics.cc +++ b/content/browser/service_worker/service_worker_metrics.cc
@@ -46,6 +46,33 @@ } // namespace +const char* ServiceWorkerMetrics::EventTypeToString(EventType event_type) { + switch (event_type) { + case EventType::ACTIVATE: + return "Activate"; + case EventType::INSTALL: + return "Install"; + case EventType::FETCH: + return "Fetch"; + case EventType::SYNC: + return "Sync"; + case EventType::NOTIFICATION_CLICK: + return "Notification Click"; + case EventType::PUSH: + return "Push"; + case EventType::GEOFENCING: + return "Geofencing"; + case EventType::SERVICE_PORT_CONNECT: + return "Service Port Connect"; + case EventType::MESSAGE: + return "Message"; + case EventType::NUM_TYPES: + break; + } + NOTREACHED() << "Got unexpected event type: " << static_cast<int>(event_type); + return "Unknown"; +} + bool ServiceWorkerMetrics::ShouldExcludeSiteFromHistogram(Site site) { return site == ServiceWorkerMetrics::Site::NEW_TAB_PAGE; }
diff --git a/content/browser/service_worker/service_worker_metrics.h b/content/browser/service_worker/service_worker_metrics.h index eec21d06..2827bec 100644 --- a/content/browser/service_worker/service_worker_metrics.h +++ b/content/browser/service_worker/service_worker_metrics.h
@@ -91,6 +91,9 @@ // Used for UMA. Append only. enum class Site { OTHER, NEW_TAB_PAGE, NUM_TYPES }; + // Converts an event type to a string. Used for tracing. + static const char* EventTypeToString(EventType event_type); + // Excludes NTP scope from UMA for now as it tends to dominate the stats and // makes the results largely skewed. Some metrics don't follow this policy // and hence don't call this function.
diff --git a/content/browser/service_worker/service_worker_register_job.cc b/content/browser/service_worker/service_worker_register_job.cc index 69f5acdc..b079c00 100644 --- a/content/browser/service_worker/service_worker_register_job.cc +++ b/content/browser/service_worker/service_worker_register_job.cc
@@ -352,6 +352,20 @@ void ServiceWorkerRegisterJob::OnStartWorkerFinished( ServiceWorkerStatusCode status) { + // Bump the last update check time only when the register/update job fetched + // the version having bypassed the network cache. We assume that the + // BYPASS_CACHE flag evicts an existing cache entry, so even if the install + // ultimately failed for whatever reason, we know the version in the HTTP + // cache is not stale, so it's OK to bump the update check time. + if (new_version()->embedded_worker()->network_accessed_for_script() || + new_version()->force_bypass_cache_for_scripts() || + registration()->last_update_check().is_null()) { + registration()->set_last_update_check(base::Time::Now()); + + if (registration()->waiting_version() || registration()->active_version()) + context_->storage()->UpdateLastUpdateCheckTime(registration()); + } + if (status == SERVICE_WORKER_OK) { InstallAndContinue(); return; @@ -359,16 +373,6 @@ // The updated worker is identical to the incumbent. if (status == SERVICE_WORKER_ERROR_EXISTS) { - // Only bump the last check time when we've bypassed the browser cache. - base::TimeDelta time_since_last_check = - base::Time::Now() - registration()->last_update_check(); - if (time_since_last_check > base::TimeDelta::FromHours( - kServiceWorkerScriptMaxCacheAgeInHours) || - new_version()->force_bypass_cache_for_scripts()) { - registration()->set_last_update_check(base::Time::Now()); - context_->storage()->UpdateLastUpdateCheckTime(registration()); - } - ResolvePromise(SERVICE_WORKER_OK, std::string(), registration()); Complete(status, "The updated worker is identical to the incumbent."); return; @@ -433,7 +437,7 @@ } SetPhase(STORE); - registration()->set_last_update_check(base::Time::Now()); + DCHECK(!registration()->last_update_check().is_null()); context_->storage()->StoreRegistration( registration(), new_version(),
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc index 25d33fa5..8e9771b 100644 --- a/content/browser/service_worker/service_worker_version.cc +++ b/content/browser/service_worker/service_worker_version.cc
@@ -94,6 +94,8 @@ void RunIDMapCallbacks(IDMAP* requests, const Params&... params) { typename IDMAP::iterator iter(requests); while (!iter.IsAtEnd()) { + TRACE_EVENT_ASYNC_END0("ServiceWorker", "ServiceWorkerVersion::Request", + iter.GetCurrentValue()); iter.GetCurrentValue()->callback.Run(params...); iter.Advance(); } @@ -108,6 +110,8 @@ if (!request) return false; + TRACE_EVENT_ASYNC_END0("ServiceWorker", "ServiceWorkerVersion::Request", + request); request->callback.Run(params...); requests->Remove(request_id); return true; @@ -681,30 +685,6 @@ } } -void ServiceWorkerVersion::DispatchPushEvent(const StatusCallback& callback, - const std::string& data) { - OnBeginEvent(); - DCHECK_EQ(ACTIVATED, status()) << status(); - if (running_status() != RUNNING) { - // Schedule calling this method after starting the worker. - StartWorker(base::Bind(&RunTaskAfterStartWorker, - weak_factory_.GetWeakPtr(), callback, - base::Bind(&self::DispatchPushEvent, - weak_factory_.GetWeakPtr(), - callback, data))); - return; - } - - int request_id = AddRequest(callback, &push_requests_, REQUEST_PUSH, - ServiceWorkerMetrics::EventType::PUSH); - ServiceWorkerStatusCode status = embedded_worker_->SendMessage( - ServiceWorkerMsg_PushEvent(request_id, data)); - if (status != SERVICE_WORKER_OK) { - push_requests_.Remove(request_id); - RunSoon(base::Bind(callback, status)); - } -} - void ServiceWorkerVersion::DispatchCrossOriginMessageEvent( const NavigatorConnectClient& client, const base::string16& message, @@ -897,6 +877,8 @@ while (!iter.IsAtEnd()) { PendingRequest<StatusCallback>* request = iter.GetCurrentValue(); if (request->mojo_service == service_name_) { + TRACE_EVENT_ASYNC_END0("ServiceWorker", "ServiceWorkerVersion::Request", + request); request->callback.Run(SERVICE_WORKER_ERROR_FAILED); worker_->custom_requests_.Remove(iter.GetCurrentKey()); } @@ -1014,8 +996,6 @@ OnFetchEventFinished) IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_NotificationClickEventFinished, OnNotificationClickEventFinished) - IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished, - OnPushEventFinished) IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_OpenWindow, OnOpenWindow) IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SetCachedMetadata, @@ -1205,27 +1185,20 @@ RemoveCallbackAndStopIfRedundant(¬ification_click_requests_, request_id); } -void ServiceWorkerVersion::OnPushEventFinished( +void ServiceWorkerVersion::OnSimpleEventResponse( int request_id, blink::WebServiceWorkerEventResult result) { - TRACE_EVENT1("ServiceWorker", - "ServiceWorkerVersion::OnPushEventFinished", - "Request id", request_id); - PendingRequest<StatusCallback>* request = push_requests_.Lookup(request_id); - if (!request) { - NOTREACHED() << "Got unexpected message: " << request_id; - return; - } + // Copy error callback before calling FinishRequest. + PendingRequest<StatusCallback>* request = custom_requests_.Lookup(request_id); + DCHECK(request) << "Invalid request id"; + StatusCallback callback = request->callback; + + FinishRequest(request_id); + ServiceWorkerStatusCode status = SERVICE_WORKER_OK; if (result == blink::WebServiceWorkerEventResultRejected) status = SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED; - - ServiceWorkerMetrics::RecordEventDuration( - request->event_type, base::TimeTicks::Now() - request->start_time); - - scoped_refptr<ServiceWorkerVersion> protect(this); - request->callback.Run(status); - RemoveCallbackAndStopIfRedundant(&push_requests_, request_id); + callback.Run(status); } void ServiceWorkerVersion::OnOpenWindow(int request_id, GURL url) { @@ -1763,7 +1736,7 @@ bool ServiceWorkerVersion::HasInflightRequests() const { return !activate_requests_.IsEmpty() || !install_requests_.IsEmpty() || !fetch_requests_.IsEmpty() || - !notification_click_requests_.IsEmpty() || !push_requests_.IsEmpty() || + !notification_click_requests_.IsEmpty() || !custom_requests_.IsEmpty() || !streaming_url_request_jobs_.empty(); } @@ -1812,6 +1785,11 @@ void ServiceWorkerVersion::RemoveCallbackAndStopIfRedundant(IDMAP* callbacks, int request_id) { RestartTick(&idle_time_); + auto* request = callbacks->Lookup(request_id); + if (request) { + TRACE_EVENT_ASYNC_END0("ServiceWorker", "ServiceWorkerVersion::Request", + request); + } callbacks->Remove(request_id); if (is_redundant()) { // The stop should be already scheduled, but try to stop immediately, in @@ -1841,8 +1819,12 @@ ServiceWorkerMetrics::EventType event_type, base::TimeTicks expiration, TimeoutBehavior timeout_behavior) { - int request_id = callback_map->Add(new PendingRequest<CallbackType>( - callback, base::TimeTicks::Now(), event_type)); + PendingRequest<CallbackType>* request = new PendingRequest<CallbackType>( + callback, base::TimeTicks::Now(), event_type); + int request_id = callback_map->Add(request); + TRACE_EVENT_ASYNC_BEGIN2("ServiceWorker", "ServiceWorkerVersion::Request", + request, "Request id", request_id, "Event type", + ServiceWorkerMetrics::EventTypeToString(event_type)); requests_.push(RequestInfo(request_id, request_type, event_type, expiration, timeout_behavior)); return request_id; @@ -1864,9 +1846,6 @@ case REQUEST_NOTIFICATION_CLICK: return RunIDMapCallback(¬ification_click_requests_, info.id, SERVICE_WORKER_ERROR_TIMEOUT); - case REQUEST_PUSH: - return RunIDMapCallback(&push_requests_, info.id, - SERVICE_WORKER_ERROR_TIMEOUT); case REQUEST_CUSTOM: return RunIDMapCallback(&custom_requests_, info.id, SERVICE_WORKER_ERROR_TIMEOUT); @@ -1986,7 +1965,6 @@ SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse()); RunIDMapCallbacks(¬ification_click_requests_, SERVICE_WORKER_ERROR_FAILED); - RunIDMapCallbacks(&push_requests_, SERVICE_WORKER_ERROR_FAILED); RunIDMapCallbacks(&custom_requests_, SERVICE_WORKER_ERROR_FAILED); // Close all mojo services. This will also fire and clear all callbacks
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h index f8619b7..9cde042 100644 --- a/content/browser/service_worker/service_worker_version.h +++ b/content/browser/service_worker/service_worker_version.h
@@ -227,6 +227,15 @@ const IPC::Message& message, const ResponseCallbackType& callback); + // For simple events where the full functionality of DispatchEvent is not + // needed, this method can be used instead. The ResponseMessage must consist + // of just a request_id and a blink::WebServiceWorkerEventResult field. The + // result is converted to a ServiceWorkerStatusCode and passed to the error + // handler associated with the request. Additionally this methods calls + // FinishRequest before passing the reply to the callback. + template <typename ResponseMessage> + void DispatchSimpleEvent(int request_id, const IPC::Message& message); + // Sends a message event to the associated embedded worker. void DispatchMessageEvent( const base::string16& message, @@ -273,14 +282,6 @@ const PlatformNotificationData& notification_data, int action_index); - // Sends push event to the associated embedded worker and asynchronously calls - // |callback| when it errors out or it gets a response from the worker to - // notify completion. - // - // This must be called when the status() is ACTIVATED. - void DispatchPushEvent(const StatusCallback& callback, - const std::string& data); - // Sends a cross origin message event to the associated embedded worker and // asynchronously calls |callback| when the message was sent (or failed to // sent). @@ -409,7 +410,6 @@ REQUEST_INSTALL, REQUEST_FETCH, REQUEST_NOTIFICATION_CLICK, - REQUEST_PUSH, REQUEST_CUSTOM, NUM_REQUEST_TYPES }; @@ -571,8 +571,8 @@ ServiceWorkerFetchEventResult result, const ServiceWorkerResponse& response); void OnNotificationClickEventFinished(int request_id); - void OnPushEventFinished(int request_id, - blink::WebServiceWorkerEventResult result); + void OnSimpleEventResponse(int request_id, + blink::WebServiceWorkerEventResult result); void OnOpenWindow(int request_id, GURL url); void OnOpenWindowFinished(int request_id, ServiceWorkerStatusCode status, @@ -701,7 +701,6 @@ IDMap<PendingRequest<FetchCallback>, IDMapOwnPointer> fetch_requests_; IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> notification_click_requests_; - IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> push_requests_; IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> custom_requests_; // Stores all open connections to mojo services. Maps the service name to @@ -813,6 +812,14 @@ } } +template <typename ResponseMessage> +void ServiceWorkerVersion::DispatchSimpleEvent(int request_id, + const IPC::Message& message) { + DispatchEvent<ResponseMessage>( + request_id, message, + base::Bind(&ServiceWorkerVersion::OnSimpleEventResponse, this)); +} + template <typename ResponseMessage, typename CallbackType> bool ServiceWorkerVersion::EventResponseHandler<ResponseMessage, CallbackType>:: OnMessageReceived(const IPC::Message& message) { @@ -823,6 +830,7 @@ if (!result || received_request_id != request_id_) return false; + CallbackType protect(callback_); // Essentially same code as what IPC_MESSAGE_FORWARD expands to. void* param = nullptr; if (!ResponseMessage::Dispatch(&message, &callback_, this, param,
diff --git a/content/browser/service_worker/service_worker_version_unittest.cc b/content/browser/service_worker/service_worker_version_unittest.cc index 5890004..b8c9323 100644 --- a/content/browser/service_worker/service_worker_version_unittest.cc +++ b/content/browser/service_worker/service_worker_version_unittest.cc
@@ -33,6 +33,12 @@ IPC_MESSAGE_CONTROL1(TestMsg_TestEvent, int) IPC_MESSAGE_ROUTED2(TestMsg_TestEventResult, int, std::string) +IPC_MESSAGE_ROUTED2(TestMsg_TestSimpleEventResult, + int, + blink::WebServiceWorkerEventResult) + +IPC_ENUM_TRAITS_MAX_VALUE(blink::WebServiceWorkerEventResult, + blink::WebServiceWorkerEventResultLast) // --------------------------------------------------------------------------- @@ -74,6 +80,13 @@ new TestMsg_TestEventResult(embedded_worker_id, request_id, reply)); } + void SimulateSendSimpleEventResult(int embedded_worker_id, + int request_id, + blink::WebServiceWorkerEventResult reply) { + SimulateSend(new TestMsg_TestSimpleEventResult(embedded_worker_id, + request_id, reply)); + } + private: void OnMessage() { // Do nothing. @@ -240,6 +253,30 @@ helper_.reset(); } + void SimulateDispatchEvent() { + ServiceWorkerStatusCode status = + SERVICE_WORKER_ERROR_MAX_VALUE; // dummy value + + // Make sure worker is running. + scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); + version_->RunAfterStartWorker(runner->QuitClosure(), + CreateReceiverOnCurrentThread(&status)); + runner->Run(); + EXPECT_EQ(SERVICE_WORKER_ERROR_MAX_VALUE, status); + EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); + + // Start request, as if an event is being dispatched. + int request_id = + version_->StartRequest(ServiceWorkerMetrics::EventType::PUSH, + CreateReceiverOnCurrentThread(&status)); + base::RunLoop().RunUntilIdle(); + + // And finish request, as if a response to the event was received. + EXPECT_TRUE(version_->FinishRequest(request_id)); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(SERVICE_WORKER_ERROR_MAX_VALUE, status); + } + TestBrowserThreadBundle thread_bundle_; scoped_ptr<MessageReceiver> helper_; scoped_refptr<ServiceWorkerRegistration> registration_; @@ -723,16 +760,11 @@ // Test that update isn't triggered for a non-stale worker. TEST_F(ServiceWorkerVersionTest, StaleUpdate_FreshWorker) { - ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; - version_->SetStatus(ServiceWorkerVersion::ACTIVATED); registration_->SetActiveVersion(version_); registration_->set_last_update_check(base::Time::Now()); - version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), - std::string()); - base::RunLoop().RunUntilIdle(); + SimulateDispatchEvent(); - EXPECT_EQ(SERVICE_WORKER_OK, status); EXPECT_TRUE(version_->stale_time_.is_null()); EXPECT_FALSE(version_->update_timer_.IsRunning()); } @@ -760,10 +792,7 @@ version_->SetStatus(ServiceWorkerVersion::ACTIVATED); registration_->SetActiveVersion(version_); registration_->set_last_update_check(GetYesterday()); - version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), - std::string()); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(SERVICE_WORKER_OK, status); + SimulateDispatchEvent(); EXPECT_FALSE(version_->stale_time_.is_null()); EXPECT_FALSE(version_->update_timer_.IsRunning()); @@ -777,16 +806,11 @@ // Test that staleness is detected on a running worker. TEST_F(ServiceWorkerVersionTest, StaleUpdate_RunningWorker) { - ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; - // Start a fresh worker. version_->SetStatus(ServiceWorkerVersion::ACTIVATED); registration_->SetActiveVersion(version_); registration_->set_last_update_check(base::Time::Now()); - version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), - std::string()); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(SERVICE_WORKER_OK, status); + SimulateDispatchEvent(); EXPECT_TRUE(version_->stale_time_.is_null()); // Simulate it running for a day. It will be marked stale. @@ -819,10 +843,13 @@ version_->stale_time_ = stale_time; // Stale time is not deferred. - version_->DispatchPushEvent( - base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); - version_->DispatchPushEvent( - base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); + version_->RunAfterStartWorker( + base::Bind(&base::DoNothing), + base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); + version_->RunAfterStartWorker( + base::Bind(&base::DoNothing), + base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); + base::RunLoop().RunUntilIdle(); EXPECT_EQ(stale_time, version_->stale_time_); // Timeout triggers the update. @@ -832,12 +859,9 @@ // Update timer is not deferred. base::TimeTicks run_time = version_->update_timer_.desired_run_time(); - version_->DispatchPushEvent( - base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); - version_->DispatchPushEvent( - base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); - version_->DispatchPushEvent( - base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); + SimulateDispatchEvent(); + SimulateDispatchEvent(); + SimulateDispatchEvent(); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(version_->stale_time_.is_null()); EXPECT_EQ(run_time, version_->update_timer_.desired_run_time()); @@ -1425,4 +1449,76 @@ EXPECT_TRUE(version_->FinishRequest(request_id1)); } +TEST_F(ServiceWorkerVersionTest, DispatchSimpleEvent_Completed) { + ServiceWorkerStatusCode status = + SERVICE_WORKER_ERROR_MAX_VALUE; // dummy value + + // Activate and start worker. + version_->SetStatus(ServiceWorkerVersion::ACTIVATED); + version_->StartWorker(CreateReceiverOnCurrentThread(&status)); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(SERVICE_WORKER_OK, status); + EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); + + // Start request and dispatch test event. + status = SERVICE_WORKER_ERROR_MAX_VALUE; // dummy value + scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); + int request_id = version_->StartRequest( + ServiceWorkerMetrics::EventType::SYNC, + CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); + version_->DispatchSimpleEvent<TestMsg_TestSimpleEventResult>( + request_id, TestMsg_TestEvent(request_id)); + + // Verify event got dispatched to worker. + base::RunLoop().RunUntilIdle(); + ASSERT_EQ(1u, helper_->inner_ipc_sink()->message_count()); + const IPC::Message* msg = helper_->inner_ipc_sink()->GetMessageAt(0); + EXPECT_EQ(TestMsg_TestEvent::ID, msg->type()); + + // Simulate sending reply to event. + helper_->SimulateSendSimpleEventResult( + version_->embedded_worker()->embedded_worker_id(), request_id, + blink::WebServiceWorkerEventResultCompleted); + runner->Run(); + + // Verify callback was called with correct status. + EXPECT_EQ(SERVICE_WORKER_OK, status); +} + +TEST_F(ServiceWorkerVersionTest, DispatchSimpleEvent_Rejected) { + ServiceWorkerStatusCode status = + SERVICE_WORKER_ERROR_MAX_VALUE; // dummy value + + // Activate and start worker. + version_->SetStatus(ServiceWorkerVersion::ACTIVATED); + version_->StartWorker(CreateReceiverOnCurrentThread(&status)); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(SERVICE_WORKER_OK, status); + EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); + + // Start request and dispatch test event. + status = SERVICE_WORKER_ERROR_MAX_VALUE; // dummy value + scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); + int request_id = version_->StartRequest( + ServiceWorkerMetrics::EventType::SYNC, + CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); + version_->DispatchSimpleEvent<TestMsg_TestSimpleEventResult>( + request_id, TestMsg_TestEvent(request_id)); + + // Verify event got dispatched to worker. + base::RunLoop().RunUntilIdle(); + ASSERT_EQ(1u, helper_->inner_ipc_sink()->message_count()); + const IPC::Message* msg = helper_->inner_ipc_sink()->GetMessageAt(0); + EXPECT_EQ(TestMsg_TestEvent::ID, msg->type()); + + // Simulate sending reply to event. + helper_->SimulateSendSimpleEventResult( + version_->embedded_worker()->embedded_worker_id(), request_id, + blink::WebServiceWorkerEventResultRejected); + runner->Run(); + + // Verify callback was called with correct status. + EXPECT_EQ(SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, status); +} + } // namespace content
diff --git a/content/browser/service_worker/service_worker_write_to_cache_job.cc b/content/browser/service_worker/service_worker_write_to_cache_job.cc index 09bcb88..b5477ab9 100644 --- a/content/browser/service_worker/service_worker_write_to_cache_job.cc +++ b/content/browser/service_worker/service_worker_write_to_cache_job.cc
@@ -341,8 +341,10 @@ version_->SetMainScriptHttpResponseInfo(net_request_->response_info()); } - if (net_request_->response_info().network_accessed) + if (net_request_->response_info().network_accessed && + !(net_request_->response_info().was_cached)) { version_->embedded_worker()->OnNetworkAccessedForScriptLoad(); + } http_info_.reset(new net::HttpResponseInfo(net_request_->response_info())); scoped_refptr<HttpResponseInfoIOBuffer> info_buffer =
diff --git a/content/browser/tracing/tracing_controller_impl.cc b/content/browser/tracing/tracing_controller_impl.cc index c0b503d..70edf234 100644 --- a/content/browser/tracing/tracing_controller_impl.cc +++ b/content/browser/tracing/tracing_controller_impl.cc
@@ -252,8 +252,7 @@ } void TracingControllerImpl::OnStartAgentTracingDone( - const TraceConfig& trace_config, - const StartTracingDoneCallback& callback) { + const TraceConfig& trace_config) { DCHECK_CURRENTLY_ON(BrowserThread::UI); TRACE_EVENT_API_ADD_METADATA_EVENT("IsTimeTicksHighResolution", "value", @@ -267,10 +266,10 @@ it->get()->SendBeginTracing(trace_config); } - if (!callback.is_null()) - callback.Run(); - - start_tracing_done_callback_.Reset(); + if (!start_tracing_done_callback_.is_null()) { + start_tracing_done_callback_.Run(); + start_tracing_done_callback_.Reset(); + } } bool TracingControllerImpl::StopTracing( @@ -883,8 +882,7 @@ base::Closure on_start_tracing_done_callback = base::Bind(&TracingControllerImpl::OnStartAgentTracingDone, - base::Unretained(this), - trace_config, start_tracing_done_callback_); + base::Unretained(this), trace_config); if (!BrowserThread::PostTask( BrowserThread::FILE, FROM_HERE, base::Bind(&TracingControllerImpl::SetEnabledOnFileThread,
diff --git a/content/browser/tracing/tracing_controller_impl.h b/content/browser/tracing/tracing_controller_impl.h index 90dcc40..0eed97c 100644 --- a/content/browser/tracing/tracing_controller_impl.h +++ b/content/browser/tracing/tracing_controller_impl.h
@@ -167,8 +167,7 @@ const base::Closure& callback); void SetDisabledOnFileThread(const base::Closure& callback); void OnStartAgentTracingDone( - const base::trace_event::TraceConfig& trace_config, - const StartTracingDoneCallback& callback); + const base::trace_event::TraceConfig& trace_config); void StopTracingAfterClockSync(); void OnStopTracingDone(); void OnStartMonitoringDone(
diff --git a/content/browser/webui/web_ui_data_source_impl.cc b/content/browser/webui/web_ui_data_source_impl.cc index 9a02600..e8b5b9fd 100644 --- a/content/browser/webui/web_ui_data_source_impl.cc +++ b/content/browser/webui/web_ui_data_source_impl.cc
@@ -15,7 +15,6 @@ #include "content/grit/content_resources.h" #include "content/public/browser/content_browser_client.h" #include "content/public/common/content_client.h" -#include "mojo/public/js/constants.h" #include "ui/base/webui/jstemplate_builder.h" #include "ui/base/webui/web_ui_util.h" @@ -139,24 +138,6 @@ filter_callback_ = callback; } -void WebUIDataSourceImpl::AddMojoResources() { - static const struct { - const char* path; - int id; - } resources[] = { - {mojo::kBindingsModuleName, IDR_MOJO_BINDINGS_JS}, - {mojo::kBufferModuleName, IDR_MOJO_BUFFER_JS}, - {mojo::kCodecModuleName, IDR_MOJO_CODEC_JS}, - {mojo::kConnectionModuleName, IDR_MOJO_CONNECTION_JS}, - {mojo::kConnectorModuleName, IDR_MOJO_CONNECTOR_JS}, - {mojo::kRouterModuleName, IDR_MOJO_ROUTER_JS}, - {mojo::kUnicodeModuleName, IDR_MOJO_UNICODE_JS}, - {mojo::kValidatorModuleName, IDR_MOJO_VALIDATOR_JS}, - }; - for (size_t i = 0; i < arraysize(resources); ++i) - AddResourcePath(resources[i].path, resources[i].id); -} - void WebUIDataSourceImpl::DisableReplaceExistingSource() { replace_existing_source_ = false; }
diff --git a/content/browser/webui/web_ui_data_source_impl.h b/content/browser/webui/web_ui_data_source_impl.h index 7d899a9e1..b084ba54 100644 --- a/content/browser/webui/web_ui_data_source_impl.h +++ b/content/browser/webui/web_ui_data_source_impl.h
@@ -38,7 +38,6 @@ void SetDefaultResource(int resource_id) override; void SetRequestFilter( const WebUIDataSource::HandleRequestCallback& callback) override; - void AddMojoResources() override; void DisableReplaceExistingSource() override; void DisableContentSecurityPolicy() override; void OverrideContentSecurityPolicyObjectSrc(const std::string& data) override;
diff --git a/content/browser/webui/web_ui_mojo_browsertest.cc b/content/browser/webui/web_ui_mojo_browsertest.cc index 805f1bb5..1d667ee 100644 --- a/content/browser/webui/web_ui_mojo_browsertest.cc +++ b/content/browser/webui/web_ui_mojo_browsertest.cc
@@ -31,7 +31,6 @@ #include "content/test/data/web_ui_test_mojo_bindings.mojom.h" #include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/interface_request.h" -#include "mojo/public/js/constants.h" #include "mojo/test/test_utils.h" #include "net/test/embedded_test_server/embedded_test_server.h" @@ -44,17 +43,6 @@ // up the generated file from disk and returns it. bool GetResource(const std::string& id, const WebUIDataSource::GotDataCallback& callback) { - // These are handled by the WebUIDataSource that AddMojoDataSource() creates. - if (id == mojo::kBindingsModuleName || - id == mojo::kBufferModuleName || - id == mojo::kCodecModuleName || - id == mojo::kConnectionModuleName || - id == mojo::kConnectorModuleName || - id == mojo::kUnicodeModuleName || - id == mojo::kRouterModuleName || - id == mojo::kValidatorModuleName) - return false; - if (id.find(".mojom") != std::string::npos) { std::string contents; CHECK(base::ReadFileToString(mojo::test::GetFilePathForJSResource(id), @@ -110,7 +98,6 @@ : WebUIController(web_ui), run_loop_(run_loop) { content::WebUIDataSource* data_source = WebUIDataSource::Create("mojo-web-ui"); - data_source->AddMojoResources(); data_source->SetRequestFilter(base::Bind(&GetResource)); content::WebUIDataSource::Add(web_ui->GetWebContents()->GetBrowserContext(), data_source);
diff --git a/content/browser/zygote_host/zygote_host_impl_linux.cc b/content/browser/zygote_host/zygote_host_impl_linux.cc index 8b5ad76..f61d813 100644 --- a/content/browser/zygote_host/zygote_host_impl_linux.cc +++ b/content/browser/zygote_host/zygote_host_impl_linux.cc
@@ -4,6 +4,7 @@ #include "content/browser/zygote_host/zygote_host_impl_linux.h" +#include "base/allocator/allocator_extension.h" #include "base/files/file_enumerator.h" #include "base/process/kill.h" #include "base/process/memory.h" @@ -11,10 +12,6 @@ #include "content/public/browser/content_browser_client.h" #include "sandbox/linux/suid/common/sandbox.h" -#if defined(USE_TCMALLOC) -#include "third_party/tcmalloc/chromium/src/gperftools/heap-profiler.h" -#endif - namespace content { // static @@ -104,13 +101,12 @@ } if (use_suid_sandbox_for_adj_oom_score_ && !selinux) { -#if defined(USE_TCMALLOC) // If heap profiling is running, these processes are not exiting, at least // on ChromeOS. The easiest thing to do is not launch them when profiling. // TODO(stevenjb): Investigate further and fix. - if (IsHeapProfilerRunning()) + if (base::allocator::IsHeapProfilerRunning()) return; -#endif + std::vector<std::string> adj_oom_score_cmdline; adj_oom_score_cmdline.push_back(sandbox_binary_); adj_oom_score_cmdline.push_back(sandbox::kAdjustOOMScoreSwitch);
diff --git a/content/child/background_sync/background_sync_provider.cc b/content/child/background_sync/background_sync_provider.cc index 9895820..9975246 100644 --- a/content/child/background_sync/background_sync_provider.cc +++ b/content/child/background_sync/background_sync_provider.cc
@@ -127,7 +127,6 @@ } void BackgroundSyncProvider::getRegistration( - blink::WebSyncRegistration::Periodicity periodicity, const blink::WebString& tag, blink::WebServiceWorkerRegistration* service_worker_registration, blink::WebSyncRegistrationCallbacks* callbacks) { @@ -140,15 +139,13 @@ // base::Unretained is safe here, as the mojo channel will be deleted (and // will wipe its callbacks) before 'this' is deleted. GetBackgroundSyncServicePtr()->GetRegistration( - mojo::ConvertTo<BackgroundSyncPeriodicity>(periodicity), tag.utf8(), - service_worker_registration_id, + tag.utf8(), service_worker_registration_id, base::Bind(&BackgroundSyncProvider::GetRegistrationCallback, base::Unretained(this), base::Passed(std::move(callbacksPtr)))); } void BackgroundSyncProvider::getRegistrations( - blink::WebSyncRegistration::Periodicity periodicity, blink::WebServiceWorkerRegistration* service_worker_registration, blink::WebSyncGetRegistrationsCallbacks* callbacks) { DCHECK(service_worker_registration); @@ -160,7 +157,6 @@ // base::Unretained is safe here, as the mojo channel will be deleted (and // will wipe its callbacks) before 'this' is deleted. GetBackgroundSyncServicePtr()->GetRegistrations( - mojo::ConvertTo<BackgroundSyncPeriodicity>(periodicity), service_worker_registration_id, base::Bind(&BackgroundSyncProvider::GetRegistrationsCallback, base::Unretained(this), @@ -168,7 +164,6 @@ } void BackgroundSyncProvider::getPermissionStatus( - blink::WebSyncRegistration::Periodicity periodicity, blink::WebServiceWorkerRegistration* service_worker_registration, blink::WebSyncGetPermissionStatusCallbacks* callbacks) { DCHECK(service_worker_registration); @@ -181,7 +176,6 @@ // base::Unretained is safe here, as the mojo channel will be deleted (and // will wipe its callbacks) before 'this' is deleted. GetBackgroundSyncServicePtr()->GetPermissionStatus( - mojo::ConvertTo<BackgroundSyncPeriodicity>(periodicity), service_worker_registration_id, base::Bind(&BackgroundSyncProvider::GetPermissionStatusCallback, base::Unretained(this),
diff --git a/content/child/background_sync/background_sync_provider.h b/content/child/background_sync/background_sync_provider.h index 3d5aea2..0d8e6b9 100644 --- a/content/child/background_sync/background_sync_provider.h +++ b/content/child/background_sync/background_sync_provider.h
@@ -22,12 +22,12 @@ namespace content { // The BackgroundSyncProvider is called by the SyncManager and SyncRegistration -// objects (and their Periodic counterparts) and communicates with the -// BackgroundSyncManager object in the browser process. Each thread will have -// its own instance (e.g. main thread, worker threads), instantiated as needed -// by BlinkPlatformImpl. Each instance of the provider creates a new mojo -// connection to a new BackgroundSyncManagerImpl, which then talks to the -// BackgroundSyncManager object. +// objects and communicates with the BackgroundSyncManager object in the browser +// process. Each thread will have its own instance (e.g. main thread, worker +// threads), instantiated as needed by BlinkPlatformImpl. Each instance of +// the provider creates a new mojo connection to a new +// BackgroundSyncManagerImpl, which then talks to the BackgroundSyncManager +// object. class BackgroundSyncProvider : public blink::WebSyncProvider, public WorkerThread::Observer { public: @@ -55,16 +55,13 @@ blink::WebServiceWorkerRegistration* service_worker_registration, blink::WebSyncUnregistrationCallbacks* callbacks) override; void getRegistration( - blink::WebSyncRegistration::Periodicity, const blink::WebString& tag, blink::WebServiceWorkerRegistration* service_worker_registration, blink::WebSyncRegistrationCallbacks* callbacks) override; void getRegistrations( - blink::WebSyncRegistration::Periodicity periodicity, blink::WebServiceWorkerRegistration* service_worker_registration, blink::WebSyncGetRegistrationsCallbacks* callbacks) override; void getPermissionStatus( - blink::WebSyncRegistration::Periodicity periodicity, blink::WebServiceWorkerRegistration* service_worker_registration, blink::WebSyncGetPermissionStatusCallbacks* callbacks) override; // TODO(jkarlin): Rename to releaseRegistrationHandle.
diff --git a/content/child/background_sync/background_sync_type_converters.cc b/content/child/background_sync/background_sync_type_converters.cc index 8502654..61088f8 100644 --- a/content/child/background_sync/background_sync_type_converters.cc +++ b/content/child/background_sync/background_sync_type_converters.cc
@@ -13,14 +13,6 @@ static_cast<int>(blink::blink_name), \ "mojo and blink enums must match") -COMPILE_ASSERT_MATCHING_ENUM(BackgroundSyncPeriodicity::PERIODIC, - WebSyncRegistration::PeriodicityPeriodic); -COMPILE_ASSERT_MATCHING_ENUM(BackgroundSyncPeriodicity::ONE_SHOT, - WebSyncRegistration::PeriodicityOneShot); -COMPILE_ASSERT_MATCHING_ENUM(BackgroundSyncPeriodicity::MAX, - WebSyncRegistration::PeriodicityOneShot); -COMPILE_ASSERT_MATCHING_ENUM(BackgroundSyncPeriodicity::MAX, - WebSyncRegistration::PeriodicityLast); COMPILE_ASSERT_MATCHING_ENUM(BackgroundSyncNetworkState::ANY, WebSyncRegistration::NetworkStateAny); COMPILE_ASSERT_MATCHING_ENUM(BackgroundSyncNetworkState::AVOID_CELLULAR, @@ -37,22 +29,6 @@ WebServiceWorkerContextProxy::IsLastChance); // static -blink::WebSyncRegistration::Periodicity - TypeConverter<blink::WebSyncRegistration::Periodicity, - content::BackgroundSyncPeriodicity>::Convert( - content::BackgroundSyncPeriodicity input) { - return static_cast<blink::WebSyncRegistration::Periodicity>(input); -} - -// static -content::BackgroundSyncPeriodicity - TypeConverter<content::BackgroundSyncPeriodicity, - blink::WebSyncRegistration::Periodicity>::Convert( - blink::WebSyncRegistration::Periodicity input) { - return static_cast<content::BackgroundSyncPeriodicity>(input); -} - -// static blink::WebSyncRegistration::NetworkState TypeConverter<blink::WebSyncRegistration::NetworkState, content::BackgroundSyncNetworkState>::Convert( @@ -76,10 +52,7 @@ scoped_ptr<blink::WebSyncRegistration> result( new blink::WebSyncRegistration()); result->id = input->handle_id; - result->periodicity = - ConvertTo<blink::WebSyncRegistration::Periodicity>(input->periodicity); result->tag = blink::WebString::fromUTF8(input->tag); - result->minPeriodMs = input->min_period_ms; result->networkState = ConvertTo<blink::WebSyncRegistration::NetworkState>(input->network_state); return result; @@ -93,10 +66,7 @@ content::SyncRegistrationPtr result( content::SyncRegistration::New()); result->handle_id = input.id; - result->periodicity = - ConvertTo<content::BackgroundSyncPeriodicity>(input.periodicity); result->tag = input.tag.utf8(); - result->min_period_ms = input.minPeriodMs; result->network_state = ConvertTo<content::BackgroundSyncNetworkState>(input.networkState); return result;
diff --git a/content/child/background_sync/background_sync_type_converters.h b/content/child/background_sync/background_sync_type_converters.h index 4152f2b..950e629 100644 --- a/content/child/background_sync/background_sync_type_converters.h +++ b/content/child/background_sync/background_sync_type_converters.h
@@ -15,23 +15,6 @@ namespace mojo { -// blink::WebSyngRegistration::Periodicity <=> -// content::BackgroundSyncPeriodicity - -template <> -struct CONTENT_EXPORT TypeConverter<blink::WebSyncRegistration::Periodicity, - content::BackgroundSyncPeriodicity> { - static blink::WebSyncRegistration::Periodicity Convert( - content::BackgroundSyncPeriodicity input); -}; - -template <> -struct CONTENT_EXPORT TypeConverter<content::BackgroundSyncPeriodicity, - blink::WebSyncRegistration::Periodicity> { - static content::BackgroundSyncPeriodicity Convert( - blink::WebSyncRegistration::Periodicity input); -}; - // blink::WebSyncRegistration::NetworkState <=> // content::BackgroundSyncNetworkState
diff --git a/content/child/background_sync/background_sync_type_converters_unittest.cc b/content/child/background_sync/background_sync_type_converters_unittest.cc index 12e3aa9d..991d37aa 100644 --- a/content/child/background_sync/background_sync_type_converters_unittest.cc +++ b/content/child/background_sync/background_sync_type_converters_unittest.cc
@@ -1,3 +1,4 @@ + // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,24 +10,6 @@ namespace mojo { namespace { -TEST(BackgroundSyncTypeConverterTest, TestBlinkToMojoPeriodicityConversions) { - ASSERT_EQ(blink::WebSyncRegistration::PeriodicityPeriodic, - ConvertTo<blink::WebSyncRegistration::Periodicity>( - content::BackgroundSyncPeriodicity::PERIODIC)); - ASSERT_EQ(blink::WebSyncRegistration::PeriodicityOneShot, - ConvertTo<blink::WebSyncRegistration::Periodicity>( - content::BackgroundSyncPeriodicity::ONE_SHOT)); -} - -TEST(BackgroundSyncTypeConverterTest, TestMojoToBlinkPeriodicityConversions) { - ASSERT_EQ(content::BackgroundSyncPeriodicity::PERIODIC, - ConvertTo<content::BackgroundSyncPeriodicity>( - blink::WebSyncRegistration::PeriodicityPeriodic)); - ASSERT_EQ(content::BackgroundSyncPeriodicity::ONE_SHOT, - ConvertTo<content::BackgroundSyncPeriodicity>( - blink::WebSyncRegistration::PeriodicityOneShot)); -} - TEST(BackgroundSyncTypeConverterTest, TestBlinkToMojoNetworkStateConversions) { ASSERT_EQ(blink::WebSyncRegistration::NetworkStateAny, ConvertTo<blink::WebSyncRegistration::NetworkState>( @@ -57,38 +40,18 @@ ConvertTo<content::SyncRegistrationPtr>(in); ASSERT_EQ(blink::WebSyncRegistration::UNREGISTERED_SYNC_ID, out->handle_id); - ASSERT_EQ(content::BackgroundSyncPeriodicity::ONE_SHOT, out->periodicity); ASSERT_EQ("", out->tag); - ASSERT_EQ(0UL, out->min_period_ms); ASSERT_EQ(content::BackgroundSyncNetworkState::ONLINE, out->network_state); } -TEST(BackgroundSyncTypeConverterTest, TestFullPeriodicBlinkToMojoConversion) { +TEST(BackgroundSyncTypeConverterTest, TestFullBlinkToMojoConversion) { blink::WebSyncRegistration in( - 7, blink::WebSyncRegistration::PeriodicityPeriodic, "BlinkToMojo", - 12340000, blink::WebSyncRegistration::NetworkStateAvoidCellular); + 7, "BlinkToMojo", blink::WebSyncRegistration::NetworkStateAvoidCellular); content::SyncRegistrationPtr out = ConvertTo<content::SyncRegistrationPtr>(in); ASSERT_EQ(7, out->handle_id); - ASSERT_EQ(content::BackgroundSyncPeriodicity::PERIODIC, out->periodicity); ASSERT_EQ("BlinkToMojo", out->tag); - ASSERT_EQ(12340000UL, out->min_period_ms); - ASSERT_EQ(content::BackgroundSyncNetworkState::AVOID_CELLULAR, - out->network_state); -} - -TEST(BackgroundSyncTypeConverterTest, TestFullOneShotBlinkToMojoConversion) { - blink::WebSyncRegistration in( - 7, blink::WebSyncRegistration::PeriodicityOneShot, "BlinkToMojo", - 12340000, blink::WebSyncRegistration::NetworkStateAvoidCellular); - content::SyncRegistrationPtr out = - ConvertTo<content::SyncRegistrationPtr>(in); - - ASSERT_EQ(7, out->handle_id); - ASSERT_EQ(content::BackgroundSyncPeriodicity::ONE_SHOT, out->periodicity); - ASSERT_EQ("BlinkToMojo", out->tag); - ASSERT_EQ(12340000UL, out->min_period_ms); ASSERT_EQ(content::BackgroundSyncNetworkState::AVOID_CELLULAR, out->network_state); } @@ -100,46 +63,21 @@ ConvertTo<scoped_ptr<blink::WebSyncRegistration>>(in); ASSERT_EQ(blink::WebSyncRegistration::UNREGISTERED_SYNC_ID, out->id); - ASSERT_EQ(blink::WebSyncRegistration::PeriodicityOneShot, out->periodicity); ASSERT_EQ("",out->tag); - ASSERT_EQ(0UL, out->minPeriodMs); ASSERT_EQ(blink::WebSyncRegistration::NetworkStateOnline, out->networkState); } -TEST(BackgroundSyncTypeConverterTest, TestFullPeriodicMojoToBlinkConversion) { +TEST(BackgroundSyncTypeConverterTest, TestFullMojoToBlinkConversion) { content::SyncRegistrationPtr in( content::SyncRegistration::New()); in->handle_id = 41; - in->periodicity = content::BackgroundSyncPeriodicity::PERIODIC; in->tag = mojo::String("MojoToBlink"); - in->min_period_ms = 43210000; in->network_state = content::BackgroundSyncNetworkState::AVOID_CELLULAR; scoped_ptr<blink::WebSyncRegistration> out = ConvertTo<scoped_ptr<blink::WebSyncRegistration>>(in); ASSERT_EQ(41, out->id); - ASSERT_EQ(blink::WebSyncRegistration::PeriodicityPeriodic, out->periodicity); ASSERT_EQ("MojoToBlink", out->tag.utf8()); - ASSERT_EQ(43210000UL, out->minPeriodMs); - ASSERT_EQ(blink::WebSyncRegistration::NetworkStateAvoidCellular, - out->networkState); -} - -TEST(BackgroundSyncTypeConverterTest, TestFullOneShotMojoToBlinkConversion) { - content::SyncRegistrationPtr in( - content::SyncRegistration::New()); - in->handle_id = 41; - in->periodicity = content::BackgroundSyncPeriodicity::ONE_SHOT; - in->tag = mojo::String("MojoToBlink"); - in->min_period_ms = 43210000; - in->network_state = content::BackgroundSyncNetworkState::AVOID_CELLULAR; - scoped_ptr<blink::WebSyncRegistration> out = - ConvertTo<scoped_ptr<blink::WebSyncRegistration>>(in); - - ASSERT_EQ(41, out->id); - ASSERT_EQ(blink::WebSyncRegistration::PeriodicityOneShot, out->periodicity); - ASSERT_EQ("MojoToBlink", out->tag.utf8()); - ASSERT_EQ(43210000UL, out->minPeriodMs); ASSERT_EQ(blink::WebSyncRegistration::NetworkStateAvoidCellular, out->networkState); }
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn index 0c8c1f68..13f3059 100644 --- a/content/common/BUILD.gn +++ b/content/common/BUILD.gn
@@ -381,8 +381,6 @@ if (is_chromeos) { sources += [ "gpu/media/accelerated_video_decoder.h", - "gpu/media/gpu_arc_video_service.cc", - "gpu/media/gpu_arc_video_service.h", "gpu/media/h264_decoder.cc", "gpu/media/h264_decoder.h", "gpu/media/h264_dpb.cc", @@ -396,7 +394,6 @@ "gpu/media/vp9_picture.cc", "gpu/media/vp9_picture.h", ] - deps += [ "//components/arc" ] if (use_v4lplugin) { defines += [ "USE_LIBV4L2" ] sources += get_target_outputs(":libv4l2_generate_stubs")
diff --git a/content/common/background_sync_service.mojom b/content/common/background_sync_service.mojom index d1b0cd1..d30edc85 100644 --- a/content/common/background_sync_service.mojom +++ b/content/common/background_sync_service.mojom
@@ -36,16 +36,13 @@ Register(SyncRegistration options, int64 service_worker_registration_id, bool requested_from_service_worker) => (BackgroundSyncError err, SyncRegistration options); - GetRegistration(BackgroundSyncPeriodicity periodicity, string tag, - int64 service_worker_registration_id) + GetRegistration(string tag, int64 service_worker_registration_id) => (BackgroundSyncError err, SyncRegistration? registration); - GetRegistrations(BackgroundSyncPeriodicity periodicity, - int64 service_worker_registration_id) + GetRegistrations(int64 service_worker_registration_id) => (BackgroundSyncError err, array<SyncRegistration> registrations); Unregister(int64 handle_id, int64 service_worker_registration_id) => (BackgroundSyncError err); - GetPermissionStatus(BackgroundSyncPeriodicity periodicity, - int64 service_worker_registration_id) + GetPermissionStatus(int64 service_worker_registration_id) => (BackgroundSyncError err, PermissionStatus status); DuplicateRegistrationHandle(int64 handle_id) => (BackgroundSyncError err, SyncRegistration? registration);
diff --git a/content/common/content_message_generator.h b/content/common/content_message_generator.h index 3d49ab2..7f6d031 100644 --- a/content/common/content_message_generator.h +++ b/content/common/content_message_generator.h
@@ -42,7 +42,6 @@ #include "content/common/media/peer_connection_tracker_messages.h" #include "content/common/media/video_capture_messages.h" #include "content/common/media/webrtc_identity_messages.h" -#include "content/common/memory_benchmark_messages.h" #include "content/common/memory_messages.h" #include "content/common/message_port_messages.h" #include "content/common/mime_registry_messages.h"
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h index 1fd22bf5..95e23f0 100644 --- a/content/common/frame_messages.h +++ b/content/common/frame_messages.h
@@ -56,8 +56,10 @@ #ifndef CONTENT_COMMON_FRAME_MESSAGES_H_ #define CONTENT_COMMON_FRAME_MESSAGES_H_ -using FrameMsg_GetSerializedHtmlWithLocalLinks_Map = +using FrameMsg_GetSerializedHtmlWithLocalLinks_UrlMap = std::map<GURL, base::FilePath>; +using FrameMsg_GetSerializedHtmlWithLocalLinks_FrameRoutingIdMap = + std::map<int, base::FilePath>; using FrameMsg_SerializeAsMHTML_FrameRoutingIdToContentIdMap = std::map<int, std::string>; @@ -806,8 +808,9 @@ // Get html data by serializing the target frame and replacing all resource // links with a path to the local copy passed in the message payload. -IPC_MESSAGE_ROUTED1(FrameMsg_GetSerializedHtmlWithLocalLinks, - FrameMsg_GetSerializedHtmlWithLocalLinks_Map) +IPC_MESSAGE_ROUTED2(FrameMsg_GetSerializedHtmlWithLocalLinks, + FrameMsg_GetSerializedHtmlWithLocalLinks_UrlMap, + FrameMsg_GetSerializedHtmlWithLocalLinks_FrameRoutingIdMap) // Serialize target frame and its resources into MHTML and write it into the // provided destination file handle. Note that when serializing multiple
diff --git a/content/common/gpu/gpu_channel_manager.cc b/content/common/gpu/gpu_channel_manager.cc index cddbe5c..a75500f 100644 --- a/content/common/gpu/gpu_channel_manager.cc +++ b/content/common/gpu/gpu_channel_manager.cc
@@ -30,10 +30,6 @@ #include "ui/gl/gl_bindings.h" #include "ui/gl/gl_share_group.h" -#if defined(OS_CHROMEOS) -#include "content/common/gpu/media/gpu_arc_video_service.h" -#endif - namespace content { namespace { @@ -142,10 +138,6 @@ IPC_MESSAGE_HANDLER(GpuMsg_CreateViewCommandBuffer, OnCreateViewCommandBuffer) IPC_MESSAGE_HANDLER(GpuMsg_DestroyGpuMemoryBuffer, OnDestroyGpuMemoryBuffer) -#if defined(OS_CHROMEOS) - IPC_MESSAGE_HANDLER(GpuMsg_CreateArcVideoAcceleratorChannel, - OnCreateArcVideoAcceleratorChannel) -#endif IPC_MESSAGE_HANDLER(GpuMsg_LoadedShader, OnLoadedShader) IPC_MESSAGE_HANDLER(GpuMsg_UpdateValueState, OnUpdateValueState) #if defined(OS_ANDROID) @@ -254,28 +246,6 @@ DestroyGpuMemoryBuffer(id, client_id); } -#if defined(OS_CHROMEOS) -void GpuChannelManager::OnCreateArcVideoAcceleratorChannel() { - if (!gpu_arc_video_service_) { - gpu_arc_video_service_.reset( - new GpuArcVideoService(shutdown_event_, io_task_runner_)); - } - - gpu_arc_video_service_->CreateChannel( - base::Bind(&GpuChannelManager::ArcVideoAcceleratorChannelCreated, - weak_factory_.GetWeakPtr())); -} - -void GpuChannelManager::ArcVideoAcceleratorChannelCreated( - const IPC::ChannelHandle& handle) { - Send(new GpuHostMsg_ArcVideoAcceleratorChannelCreated(handle)); -} - -void GpuChannelManager::OnShutdownArcVideoService() { - gpu_arc_video_service_.reset(); -} -#endif - void GpuChannelManager::OnUpdateValueState( int client_id, unsigned int target, const gpu::ValueState& state) { // Only pass updated state to the channel corresponding to the
diff --git a/content/common/gpu/gpu_channel_manager.h b/content/common/gpu/gpu_channel_manager.h index 7286e4a..89795fc 100644 --- a/content/common/gpu/gpu_channel_manager.h +++ b/content/common/gpu/gpu_channel_manager.h
@@ -58,9 +58,6 @@ struct GpuMsg_EstablishChannel_Params; namespace content { -#if defined(OS_CHROMEOS) -class GpuArcVideoService; -#endif class GpuChannel; class GpuMemoryBufferFactory; class GpuWatchdog; @@ -166,11 +163,6 @@ void OnDestroyGpuMemoryBuffer(gfx::GpuMemoryBufferId id, int client_id, const gpu::SyncToken& sync_token); -#if defined(OS_CHROMEOS) - void OnCreateArcVideoAcceleratorChannel(); - void ArcVideoAcceleratorChannelCreated(const IPC::ChannelHandle& handle); - void OnShutdownArcVideoService(); -#endif void OnUpdateValueState(int client_id, unsigned int target, @@ -202,9 +194,6 @@ scoped_refptr<gpu::gles2::FramebufferCompletenessCache> framebuffer_completeness_cache_; scoped_refptr<gfx::GLSurface> default_offscreen_surface_; -#if defined(OS_CHROMEOS) - scoped_ptr<GpuArcVideoService> gpu_arc_video_service_; -#endif GpuMemoryBufferFactory* const gpu_memory_buffer_factory_; #if defined(OS_ANDROID) // Last time we know the GPU was powered on. Global for tracking across all
diff --git a/content/common/gpu/gpu_messages.h b/content/common/gpu/gpu_messages.h index 634316e..832ad00 100644 --- a/content/common/gpu/gpu_messages.h +++ b/content/common/gpu/gpu_messages.h
@@ -833,26 +833,3 @@ IPC_MESSAGE_ROUTED2(AcceleratedJpegDecoderHostMsg_DecodeAck, int32_t, /* bitstream_buffer_id */ media::JpegDecodeAccelerator::Error /* error */) - -#if defined(OS_CHROMEOS) -//------------------------------------------------------------------------------ -// Arc Video Accelerator Messages -// These messages are sent from the Browser process to GPU process. - -// Tells the GPU process to create a new channel for communication with -// ArcVideoAccelerator. The channel is returned using -// GpuHostMsg_ArcVideoAcceleratorChannelCreated message. -IPC_MESSAGE_CONTROL0(GpuMsg_CreateArcVideoAcceleratorChannel) - -// Tells the GPU process to shutdown arc video service and terminate all -// instances of ArcVideoAccelerator. -IPC_MESSAGE_CONTROL0(GpuMsg_ShutdownArcVideoService) - -//------------------------------------------------------------------------------ -// Arc Video Accelerator Host Messages -// These messages are sent from the GPU process to Browser process. - -// Response from GPU to a GpuMsg_CreateArcVideoAcceleratorChannel message. -IPC_MESSAGE_CONTROL1(GpuHostMsg_ArcVideoAcceleratorChannelCreated, - IPC::ChannelHandle /* handle to channel */) -#endif
diff --git a/content/common/gpu/gpu_process_launch_causes.h b/content/common/gpu/gpu_process_launch_causes.h index 1c280761..533a5943 100644 --- a/content/common/gpu/gpu_process_launch_causes.h +++ b/content/common/gpu/gpu_process_launch_causes.h
@@ -23,7 +23,6 @@ CAUSE_FOR_GPU_LAUNCH_GPU_MEMORY_BUFFER_ALLOCATE, CAUSE_FOR_GPU_LAUNCH_JPEGDECODEACCELERATOR_INITIALIZE, CAUSE_FOR_GPU_LAUNCH_MOJO_SETUP, - CAUSE_FOR_GPU_LAUNCH_ARCVIDEOACCELERATOR, // All new values should be inserted above this point so that // existing values continue to match up with those in histograms.xml.
diff --git a/content/common/gpu/media/android_deferred_rendering_backing_strategy.cc b/content/common/gpu/media/android_deferred_rendering_backing_strategy.cc index 0bec437..660785ee 100644 --- a/content/common/gpu/media/android_deferred_rendering_backing_strategy.cc +++ b/content/common/gpu/media/android_deferred_rendering_backing_strategy.cc
@@ -41,6 +41,10 @@ void AndroidDeferredRenderingBackingStrategy::Cleanup( bool have_context, const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers) { + // If we failed before Initialize, then do nothing. + if (!shared_state_) + return; + // Make sure that no PictureBuffer textures refer to the SurfaceTexture or to // the service_id that we created for it. for (const std::pair<int, media::PictureBuffer>& entry : buffers)
diff --git a/content/common/gpu/media/gpu_arc_video_service.cc b/content/common/gpu/media/gpu_arc_video_service.cc deleted file mode 100644 index 91d3698..0000000 --- a/content/common/gpu/media/gpu_arc_video_service.cc +++ /dev/null
@@ -1,92 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/common/gpu/media/gpu_arc_video_service.h" - -#include "base/logging.h" -#include "content/common/gpu/gpu_messages.h" -#include "ipc/ipc_listener.h" -#include "ipc/ipc_message_macros.h" -#include "ipc/ipc_sync_channel.h" - -namespace content { - -// TODO(kcwu) implement ArcVideoAccelerator::Client. -class GpuArcVideoService::AcceleratorStub : public IPC::Listener, - public IPC::Sender { - public: - // |owner| outlives AcceleratorStub. - explicit AcceleratorStub(GpuArcVideoService* owner) : owner_(owner) {} - - ~AcceleratorStub() override { - DCHECK(thread_checker_.CalledOnValidThread()); - channel_->Close(); - } - - IPC::ChannelHandle CreateChannel( - base::WaitableEvent* shutdown_event, - const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner) { - IPC::ChannelHandle handle = - IPC::Channel::GenerateVerifiedChannelID("arc-video"); - channel_ = IPC::SyncChannel::Create(handle, IPC::Channel::MODE_SERVER, this, - io_task_runner, false, shutdown_event); - base::ScopedFD client_fd = channel_->TakeClientFileDescriptor(); - DCHECK(client_fd.is_valid()); - handle.socket = base::FileDescriptor(std::move(client_fd)); - return handle; - } - - // IPC::Sender implementation: - bool Send(IPC::Message* msg) override { - DCHECK(msg); - return channel_->Send(msg); - } - - // IPC::Listener implementation: - void OnChannelError() override { - DCHECK(thread_checker_.CalledOnValidThread()); - // RemoveClient will delete |this|. - owner_->RemoveClient(this); - } - - // IPC::Listener implementation: - bool OnMessageReceived(const IPC::Message& msg) override { - DCHECK(thread_checker_.CalledOnValidThread()); - - // TODO(kcwu) Add handlers here. - return false; - } - - private: - base::ThreadChecker thread_checker_; - GpuArcVideoService* const owner_; - scoped_ptr<IPC::SyncChannel> channel_; -}; - -GpuArcVideoService::GpuArcVideoService( - base::WaitableEvent* shutdown_event, - const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner) - : shutdown_event_(shutdown_event), io_task_runner_(io_task_runner) {} - -GpuArcVideoService::~GpuArcVideoService() {} - -void GpuArcVideoService::CreateChannel(const CreateChannelCallback& callback) { - DCHECK(thread_checker_.CalledOnValidThread()); - - scoped_ptr<AcceleratorStub> stub(new AcceleratorStub(this)); - - IPC::ChannelHandle handle = - stub->CreateChannel(shutdown_event_, io_task_runner_); - accelerator_stubs_[stub.get()] = std::move(stub); - - callback.Run(handle); -} - -void GpuArcVideoService::RemoveClient(AcceleratorStub* stub) { - DCHECK(thread_checker_.CalledOnValidThread()); - - accelerator_stubs_.erase(stub); -} - -} // namespace content
diff --git a/content/common/gpu/media/gpu_arc_video_service.h b/content/common/gpu/media/gpu_arc_video_service.h deleted file mode 100644 index 131150c..0000000 --- a/content/common/gpu/media/gpu_arc_video_service.h +++ /dev/null
@@ -1,68 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_COMMON_GPU_MEDIA_GPU_ARC_VIDEO_SERVICE_H_ -#define CONTENT_COMMON_GPU_MEDIA_GPU_ARC_VIDEO_SERVICE_H_ - -#include <map> - -#include "base/callback.h" -#include "base/threading/thread_checker.h" - -namespace base { -class SingleThreadTaskRunner; -class WaitableEvent; -} - -namespace IPC { -struct ChannelHandle; -} - -namespace content { - -// GpuArcVideoService manages life-cycle and IPC message translation for -// ArcVideoAccelerator. -// -// For each creation request from GpuChannelManager, GpuArcVideoService will -// create a new IPC channel. -class GpuArcVideoService { - public: - class AcceleratorStub; - using CreateChannelCallback = base::Callback<void(const IPC::ChannelHandle&)>; - - // |shutdown_event| should signal an event when this process is about to be - // shut down in order to notify our new IPC channel to terminate. - GpuArcVideoService( - base::WaitableEvent* shutdown_event, - const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner); - - // Upon deletion, all ArcVideoAccelerator will be deleted and the associated - // IPC channels are closed. - ~GpuArcVideoService(); - - // Creates a new accelerator stub. The creation result will be sent back via - // |callback|. - void CreateChannel(const CreateChannelCallback& callback); - - // Removes the reference of |stub| (and trigger deletion) from this class. - void RemoveClient(AcceleratorStub* stub); - - private: - base::ThreadChecker thread_checker_; - - // Shutdown event of GPU process. - base::WaitableEvent* shutdown_event_; - - // GPU io thread task runner. - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; - - // Bookkeeping all accelerator stubs. - std::map<AcceleratorStub*, scoped_ptr<AcceleratorStub>> accelerator_stubs_; - - DISALLOW_COPY_AND_ASSIGN(GpuArcVideoService); -}; - -} // namespace content - -#endif // CONTENT_COMMON_GPU_MEDIA_GPU_ARC_VIDEO_SERVICE_H_
diff --git a/content/common/memory_benchmark_messages.h b/content/common/memory_benchmark_messages.h deleted file mode 100644 index 3955630..0000000 --- a/content/common/memory_benchmark_messages.h +++ /dev/null
@@ -1,15 +0,0 @@ -// Copyright (c) 2013 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. - -// IPC messages for memory benchmark. -// Multiply-included message file, hence no include guard. - -#include <string> - -#include "ipc/ipc_message_macros.h" - -#define IPC_MESSAGE_START MemoryBenchmarkMsgStart - -IPC_MESSAGE_CONTROL1(MemoryBenchmarkHostMsg_HeapProfilerDump, - std::string /* dump reason */)
diff --git a/content/content_browser.gypi b/content/content_browser.gypi index 8713d4b..a473591 100644 --- a/content/content_browser.gypi +++ b/content/content_browser.gypi
@@ -114,7 +114,6 @@ 'public/browser/browser_thread.h', 'public/browser/browser_thread_delegate.h', 'public/browser/browser_url_handler.h', - 'public/browser/arc_video_host_delegate.h', 'public/browser/cache_storage_context.h', 'public/browser/cache_storage_usage_info.h', 'public/browser/cert_store.h', @@ -1266,8 +1265,6 @@ 'browser/renderer_host/media/video_capture_host.h', 'browser/renderer_host/media/video_capture_manager.cc', 'browser/renderer_host/media/video_capture_manager.h', - 'browser/renderer_host/memory_benchmark_message_filter.cc', - 'browser/renderer_host/memory_benchmark_message_filter.h', 'browser/renderer_host/native_web_keyboard_event_aura.cc', 'browser/renderer_host/native_web_keyboard_event_mac.mm', 'browser/renderer_host/overscroll_configuration.cc', @@ -2117,11 +2114,6 @@ '../build/linux/system.gyp:dbus', '../chromeos/chromeos.gyp:chromeos', '../chromeos/chromeos.gyp:power_manager_proto', - '../components/components.gyp:arc', - ], - 'sources': [ - 'browser/gpu/gpu_arc_video_service_host.cc', - 'browser/gpu/gpu_arc_video_service_host.h', ], 'sources!': [ 'browser/device_sensors/data_fetcher_shared_memory_default.cc',
diff --git a/content/content_browsertests_apk.isolate b/content/content_browsertests_apk.isolate index da10e3a..af7e427 100644 --- a/content/content_browsertests_apk.isolate +++ b/content/content_browsertests_apk.isolate
@@ -10,6 +10,7 @@ 'variables': { 'command': [ '<(PRODUCT_DIR)/bin/run_content_browsertests', + '--logcat-output-dir', '${ISOLATED_OUTDIR}/logcats', ], 'files': [ '../base/base.isolate',
diff --git a/content/content_common.gypi b/content/content_common.gypi index e4d0884..1231847 100644 --- a/content/content_common.gypi +++ b/content/content_common.gypi
@@ -445,7 +445,6 @@ 'common/media/video_capture.h', 'common/media/video_capture_messages.h', 'common/media/webrtc_identity_messages.h', - 'common/memory_benchmark_messages.h', 'common/memory_messages.h', 'common/message_port_messages.h', 'common/message_router.cc', @@ -882,8 +881,6 @@ ['chromeos==1', { 'sources': [ 'common/gpu/media/accelerated_video_decoder.h', - 'common/gpu/media/gpu_arc_video_service.cc', - 'common/gpu/media/gpu_arc_video_service.h', 'common/gpu/media/h264_decoder.cc', 'common/gpu/media/h264_decoder.h', 'common/gpu/media/h264_dpb.cc',
diff --git a/content/content_renderer.gypi b/content/content_renderer.gypi index 7a74672..d7c98a2 100644 --- a/content/content_renderer.gypi +++ b/content/content_renderer.gypi
@@ -341,8 +341,6 @@ 'renderer/media/webmediaplayer_ms.h', 'renderer/media/webmediaplayer_ms_compositor.cc', 'renderer/media/webmediaplayer_ms_compositor.h', - 'renderer/memory_benchmarking_extension.cc', - 'renderer/memory_benchmarking_extension.h', 'renderer/menu_item_builder.cc', 'renderer/menu_item_builder.h', 'renderer/mojo/service_registry_js_wrapper.cc',
diff --git a/content/content_unittests_apk.isolate b/content/content_unittests_apk.isolate index 6d94fd7c..a67e2afd 100644 --- a/content/content_unittests_apk.isolate +++ b/content/content_unittests_apk.isolate
@@ -10,6 +10,7 @@ 'variables': { 'command': [ '<(PRODUCT_DIR)/bin/run_content_unittests', + '--logcat-output-dir', '${ISOLATED_OUTDIR}/logcats', ], 'files': [ '../base/base.isolate',
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java index 71ad6d0..8654cc5 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java +++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
@@ -825,8 +825,8 @@ * Queue up a spawn requests for testing. */ @VisibleForTesting - static void enqueuePendingSpawnForTesting(Context context) { - sPendingSpawnQueue.enqueue(new PendingSpawnData(context, new String[0], 1, + static void enqueuePendingSpawnForTesting(Context context, String[] commandLine) { + sPendingSpawnQueue.enqueue(new PendingSpawnData(context, commandLine, 1, new FileDescriptorInfo[0], 0, CALLBACK_FOR_RENDERER_PROCESS, true)); }
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupDialog.java b/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupDialog.java index fc5f38d1..f14b93a 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupDialog.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupDialog.java
@@ -40,11 +40,9 @@ mContentViewCore = contentViewCore; final ListView listView = new ListView(windowContext); - listView.setCacheColorHint(0); AlertDialog.Builder b = new AlertDialog.Builder(windowContext) .setView(listView) - .setCancelable(true) - .setInverseBackgroundForced(true); + .setCancelable(true); if (multiple) { b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java index eff9d4f..d2b9ed2 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java
@@ -9,9 +9,9 @@ import android.test.InstrumentationTestCase; import android.test.suitebuilder.annotation.MediumTest; +import org.chromium.base.BaseSwitches; import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.library_loader.LibraryProcessType; -import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; @@ -20,6 +20,12 @@ * Instrumentation tests for ChildProcessLauncher. */ public class ChildProcessLauncherTest extends InstrumentationTestCase { + // Pseudo command line arguments to instruct the child process to wait until being killed. + // Allowing the process to continue would lead to a crash when attempting to initialize IPC + // channels that are not being set up in this test. + private static final String[] sProcessWaitArguments = { + "_", "--" + BaseSwitches.RENDERER_WAIT_FOR_JAVA_DEBUGGER }; + /** * Tests cleanup for a connection that fails to connect in the first place. */ @@ -109,8 +115,7 @@ assertEquals(1, ChildProcessLauncher.allocatedConnectionsCountForTesting(appContext)); // Initiate the connection setup. - ChildProcessLauncher.triggerConnectionSetup(connection, new String[0], 1, - new FileDescriptorInfo[0], ChildProcessLauncher.CALLBACK_FOR_RENDERER_PROCESS, 0); + triggerConnectionSetup(connection); // Verify that the connection completes the setup. CriteriaHelper.pollForCriteria(new Criteria( @@ -157,12 +162,8 @@ /** * Tests spawning a pending process from queue. */ - /* @MediumTest @Feature({"ProcessManagement"}) - crbug.com/483089 - */ - @DisabledTest public void testPendingSpawnQueue() throws InterruptedException, RemoteException { final Context appContext = getInstrumentation().getTargetContext(); assertEquals(0, ChildProcessLauncher.allocatedConnectionsCountForTesting(appContext)); @@ -171,13 +172,13 @@ final ChildProcessConnectionImpl connection = startConnection(); assertEquals(1, ChildProcessLauncher.allocatedConnectionsCountForTesting(appContext)); - // Queue up a a new spawn request. - ChildProcessLauncher.enqueuePendingSpawnForTesting(appContext); + // Queue up a new spawn request. There is no way to kill the pending connection, leak it + // until the browser restart. + ChildProcessLauncher.enqueuePendingSpawnForTesting(appContext, sProcessWaitArguments); assertEquals(1, ChildProcessLauncher.pendingSpawnsCountForTesting()); // Initiate the connection setup. - ChildProcessLauncher.triggerConnectionSetup(connection, new String[0], 1, - new FileDescriptorInfo[0], ChildProcessLauncher.CALLBACK_FOR_RENDERER_PROCESS, 0); + triggerConnectionSetup(connection); // Verify that the connection completes the setup. CriteriaHelper.pollForCriteria( @@ -243,6 +244,11 @@ return connection; } + private void triggerConnectionSetup(ChildProcessConnectionImpl connection) { + ChildProcessLauncher.triggerConnectionSetup(connection, sProcessWaitArguments, 1, + new FileDescriptorInfo[0], ChildProcessLauncher.CALLBACK_FOR_RENDERER_PROCESS, 0); + } + @Override protected void setUp() throws Exception { super.setUp();
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ViewportTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ViewportTest.java index 2f191bf..932b8bd3 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/ViewportTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/ViewportTest.java
@@ -5,10 +5,11 @@ package org.chromium.content.browser; import android.content.Context; +import android.test.suitebuilder.annotation.MediumTest; import android.util.DisplayMetrics; import android.view.WindowManager; -import org.chromium.base.test.util.DisabledTest; +import org.chromium.base.test.util.Feature; import org.chromium.content.browser.test.util.JavaScriptUtils; import org.chromium.content_shell_apk.ContentShellTestBase; @@ -30,12 +31,8 @@ return Integer.parseInt(evaluateStringValue(expression)); } - /* @MediumTest @Feature({"Viewport", "InitialViewportSize"}) - https://bugs.webkit.org/show_bug.cgi?id=107424 - */ - @DisabledTest public void testDefaultViewportSize() throws Throwable { launchContentShellWithUrl("about:blank"); waitForActiveShellToBeDoneLoading();
diff --git a/content/public/browser/arc_video_host_delegate.h b/content/public/browser/arc_video_host_delegate.h deleted file mode 100644 index 08f54f8d..0000000 --- a/content/public/browser/arc_video_host_delegate.h +++ /dev/null
@@ -1,21 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_PUBLIC_BROWSER_ARC_VIDEO_HOST_DELEGATE_H_ -#define CONTENT_PUBLIC_BROWSER_ARC_VIDEO_HOST_DELEGATE_H_ - -#include "base/memory/scoped_ptr.h" -#include "content/common/content_export.h" - -namespace arc { -class VideoHostDelegate; -} - -namespace content { - -CONTENT_EXPORT scoped_ptr<arc::VideoHostDelegate> CreateArcVideoHostDelegate(); - -} // namespace content - -#endif // CONTENT_PUBLIC_BROWSER_ARC_VIDEO_HOST_DELEGATE_H_
diff --git a/content/public/browser/web_contents_delegate.cc b/content/public/browser/web_contents_delegate.cc index 165488f..71c3075 100644 --- a/content/public/browser/web_contents_delegate.cc +++ b/content/public/browser/web_contents_delegate.cc
@@ -156,7 +156,7 @@ scoped_ptr<BluetoothChooser> WebContentsDelegate::RunBluetoothChooser( WebContents* web_contents, const BluetoothChooser::EventHandler& event_handler, - const GURL& origin) { + const url::Origin& origin) { return nullptr; }
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h index 4145d4a..b6015b0 100644 --- a/content/public/browser/web_contents_delegate.h +++ b/content/public/browser/web_contents_delegate.h
@@ -60,6 +60,10 @@ class Size; } +namespace url { +class Origin; +} + namespace blink { class WebGestureEvent; } @@ -354,7 +358,7 @@ virtual scoped_ptr<BluetoothChooser> RunBluetoothChooser( WebContents* web_contents, const BluetoothChooser::EventHandler& event_handler, - const GURL& origin); + const url::Origin& origin); // Returns true if the delegate will embed a WebContents-owned fullscreen // render widget. In this case, the delegate may access the widget by calling
diff --git a/content/public/browser/web_ui_data_source.h b/content/public/browser/web_ui_data_source.h index 2966da3..3b174c44 100644 --- a/content/public/browser/web_ui_data_source.h +++ b/content/public/browser/web_ui_data_source.h
@@ -72,9 +72,6 @@ // Allows a caller to add a filter for URL requests. virtual void SetRequestFilter(const HandleRequestCallback& callback) = 0; - // Adds the necessary resources for mojo bindings. - virtual void AddMojoResources() = 0; - // The following map to methods on URLDataSource. See the documentation there. // NOTE: it's not acceptable to call DisableContentSecurityPolicy for new // pages, see URLDataSource::ShouldAddContentSecurityPolicy and talk to
diff --git a/content/public/common/background_sync.mojom b/content/public/common/background_sync.mojom index 6fc547fe..969e0b6 100644 --- a/content/public/common/background_sync.mojom +++ b/content/public/common/background_sync.mojom
@@ -11,16 +11,8 @@ MAX=ONLINE }; -enum BackgroundSyncPeriodicity { - PERIODIC, - ONE_SHOT, - MAX=ONE_SHOT -}; - struct SyncRegistration { int64 handle_id = -1; - BackgroundSyncPeriodicity periodicity = ONE_SHOT; string tag = ""; - uint64 min_period_ms = 0; BackgroundSyncNetworkState network_state = ONLINE; };
diff --git a/content/public/common/bindings_policy.h b/content/public/common/bindings_policy.h index 9a4745c..ee3b0e87 100644 --- a/content/public/common/bindings_policy.h +++ b/content/public/common/bindings_policy.h
@@ -22,6 +22,16 @@ // metrics. (By default this isn't allowed unless the app has been started up // with the --enable-stats-collection-bindings switch.) BINDINGS_POLICY_STATS_COLLECTION = 1 << 2, + // Bindings that allows the JS content to access Mojo system API and + // ServiceRegistry modules. The system API modules are defined in + // //mojo/public/js and provide the ability to create Mojo primitives such as + // message and data pipes. The ServiceRegistry module (see + // //content/renderer/mojo/service_registry_js_wrapper.h) in turn allows these + // Mojo primitives to be used to connect to named services exposed either by + // the browser or testing code. These bindings should not be exposed to + // normal web contents and are intended only for use with WebUI and layout + // tests. + BINDINGS_POLICY_MOJO = 1 << 3, };
diff --git a/content/renderer/dom_serializer_browsertest.cc b/content/renderer/dom_serializer_browsertest.cc index 5267254..bf725866 100644 --- a/content/renderer/dom_serializer_browsertest.cc +++ b/content/renderer/dom_serializer_browsertest.cc
@@ -158,6 +158,30 @@ runner->Run(); } + class SingleLinkRewritingDelegate + : public WebFrameSerializer::LinkRewritingDelegate { + public: + SingleLinkRewritingDelegate(const WebURL& url, const WebString& localPath) + : url_(url), local_path_(localPath) {} + + bool rewriteFrameSource(WebFrame* frame, + WebString* rewritten_link) override { + return false; + } + + bool rewriteLink(const WebURL& url, WebString* rewritten_link) override { + if (url != url_) + return false; + + *rewritten_link = local_path_; + return true; + } + + private: + const WebURL url_; + const WebString local_path_; + }; + // Serialize DOM belonging to a frame with the specified |frame_url|. void SerializeDomForURL(const GURL& frame_url) { // Find corresponding WebFrame according to frame_url. @@ -165,12 +189,10 @@ ASSERT_TRUE(web_frame != NULL); WebString file_path = base::FilePath(FILE_PATH_LITERAL("c:\\dummy.htm")).AsUTF16Unsafe(); - std::vector<std::pair<WebURL, WebString>> url_to_local_path; - url_to_local_path.push_back(std::make_pair(WebURL(frame_url), file_path)); + SingleLinkRewritingDelegate delegate(frame_url, file_path); // Start serializing DOM. - bool result = WebFrameSerializer::serialize( - web_frame->toWebLocalFrame(), - static_cast<WebFrameSerializerClient*>(this), url_to_local_path); + bool result = WebFrameSerializer::serialize(web_frame->toWebLocalFrame(), + this, &delegate); ASSERT_TRUE(result); }
diff --git a/content/renderer/memory_benchmarking_extension.cc b/content/renderer/memory_benchmarking_extension.cc deleted file mode 100644 index be554c3..0000000 --- a/content/renderer/memory_benchmarking_extension.cc +++ /dev/null
@@ -1,88 +0,0 @@ -// Copyright (c) 2013 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/renderer/memory_benchmarking_extension.h" - -#include "build/build_config.h" -#include "content/common/memory_benchmark_messages.h" -#include "content/public/renderer/chrome_object_extensions_utils.h" -#include "content/renderer/render_thread_impl.h" -#include "gin/arguments.h" -#include "gin/handle.h" -#include "gin/object_template_builder.h" -#include "third_party/WebKit/public/web/WebFrame.h" -#include "third_party/WebKit/public/web/WebKit.h" - -#if defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID)) -#include "third_party/tcmalloc/chromium/src/gperftools/heap-profiler.h" -#endif - -namespace content { - -gin::WrapperInfo MemoryBenchmarkingExtension::kWrapperInfo = { - gin::kEmbedderNativeGin}; - -// static -void MemoryBenchmarkingExtension::Install(blink::WebFrame* frame) { - v8::Isolate* isolate = blink::mainThreadIsolate(); - v8::HandleScope handle_scope(isolate); - v8::Local<v8::Context> context = frame->mainWorldScriptContext(); - if (context.IsEmpty()) - return; - - v8::Context::Scope context_scope(context); - gin::Handle<MemoryBenchmarkingExtension> controller = - gin::CreateHandle(isolate, new MemoryBenchmarkingExtension()); - if (controller.IsEmpty()) - return; - - v8::Local<v8::Object> chrome = GetOrCreateChromeObject(isolate, - context->Global()); - chrome->Set(gin::StringToV8(isolate, "memoryBenchmarking"), - controller.ToV8()); -} - -MemoryBenchmarkingExtension::MemoryBenchmarkingExtension() {} - -MemoryBenchmarkingExtension::~MemoryBenchmarkingExtension() {} - -gin::ObjectTemplateBuilder -MemoryBenchmarkingExtension::GetObjectTemplateBuilder(v8::Isolate* isolate) { - return gin::Wrappable<MemoryBenchmarkingExtension>::GetObjectTemplateBuilder( - isolate) - .SetMethod("isHeapProfilerRunning", - &MemoryBenchmarkingExtension::IsHeapProfilerRunning) - .SetMethod("heapProfilerDump", - &MemoryBenchmarkingExtension::HeapProfilerDump); -} - -bool MemoryBenchmarkingExtension::IsHeapProfilerRunning() { -#if defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID)) - return ::IsHeapProfilerRunning(); -#else - return false; -#endif -} - -void MemoryBenchmarkingExtension::HeapProfilerDump(gin::Arguments* args) { - std::string process_type; - std::string reason("benchmarking_extension"); - - if (!args->PeekNext().IsEmpty() && args->PeekNext()->IsString()) { - args->GetNext(&process_type); - if (!args->PeekNext().IsEmpty() && args->PeekNext()->IsString()) - args->GetNext(&reason); - } - -#if defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID)) - if (process_type == "browser") { - content::RenderThreadImpl::current()->Send( - new MemoryBenchmarkHostMsg_HeapProfilerDump(reason)); - } else { - ::HeapProfilerDump(reason.c_str()); - } -#endif -} - -} // namespace content
diff --git a/content/renderer/memory_benchmarking_extension.h b/content/renderer/memory_benchmarking_extension.h deleted file mode 100644 index af7f4f2..0000000 --- a/content/renderer/memory_benchmarking_extension.h +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright (c) 2013 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_RENDERER_MEMORY_BENCHMARKING_EXTENSION_H_ -#define CONTENT_RENDERER_MEMORY_BENCHMARKING_EXTENSION_H_ - -#include "base/macros.h" -#include "gin/wrappable.h" - -namespace blink { -class WebFrame; -} - -namespace gin { -class Arguments; -} - -namespace content { - -class MemoryBenchmarkingExtension - : public gin::Wrappable<MemoryBenchmarkingExtension> { - public: - static gin::WrapperInfo kWrapperInfo; - - static void Install(blink::WebFrame* frame); - - private: - MemoryBenchmarkingExtension(); - ~MemoryBenchmarkingExtension() override; - - // gin::Wrappable. - gin::ObjectTemplateBuilder GetObjectTemplateBuilder( - v8::Isolate* isolate) override; - - bool IsHeapProfilerRunning(); - - void HeapProfilerDump(gin::Arguments* args); - - DISALLOW_COPY_AND_ASSIGN(MemoryBenchmarkingExtension); -}; - -} // namespace content - -#endif // CONTENT_RENDERER_MEMORY_BENCHMARKING_EXTENSION_H_
diff --git a/content/renderer/mojo_bindings_controller.cc b/content/renderer/mojo_bindings_controller.cc index 08abcf5..b3b9f07 100644 --- a/content/renderer/mojo_bindings_controller.cc +++ b/content/renderer/mojo_bindings_controller.cc
@@ -26,9 +26,11 @@ } // namespace -MojoBindingsController::MojoBindingsController(RenderFrame* render_frame) +MojoBindingsController::MojoBindingsController(RenderFrame* render_frame, + bool for_layout_tests) : RenderFrameObserver(render_frame), - RenderFrameObserverTracker<MojoBindingsController>(render_frame) {} + RenderFrameObserverTracker<MojoBindingsController>(render_frame), + for_layout_tests_(for_layout_tests) {} MojoBindingsController::~MojoBindingsController() { } @@ -40,7 +42,7 @@ v8::Local<v8::Context> context = frame->mainWorldScriptContext(); gin::PerContextData* context_data = gin::PerContextData::From(context); MojoContextStateData* data = new MojoContextStateData; - data->state.reset(new MojoContextState(frame, context)); + data->state.reset(new MojoContextState(frame, context, for_layout_tests_)); context_data->SetUserData(kMojoContextStateKey, data); }
diff --git a/content/renderer/mojo_bindings_controller.h b/content/renderer/mojo_bindings_controller.h index 3ebb744c..9d4ac9b 100644 --- a/content/renderer/mojo_bindings_controller.h +++ b/content/renderer/mojo_bindings_controller.h
@@ -28,7 +28,7 @@ : public RenderFrameObserver, public RenderFrameObserverTracker<MojoBindingsController> { public: - explicit MojoBindingsController(RenderFrame* render_frame); + MojoBindingsController(RenderFrame* render_frame, bool for_layout_tests); private: ~MojoBindingsController() override; @@ -44,6 +44,8 @@ void DidCreateDocumentElement() override; void DidClearWindowObject() override; + const bool for_layout_tests_; + DISALLOW_COPY_AND_ASSIGN(MojoBindingsController); };
diff --git a/content/renderer/mojo_context_state.cc b/content/renderer/mojo_context_state.cc index 2d3bdea..bf00642 100644 --- a/content/renderer/mojo_context_state.cc +++ b/content/renderer/mojo_context_state.cc
@@ -6,8 +6,16 @@ #include <stddef.h> +#include <map> +#include <string> + #include "base/bind.h" +#include "base/lazy_instance.h" +#include "base/memory/ref_counted.h" +#include "base/memory/ref_counted_memory.h" #include "base/stl_util.h" +#include "content/grit/content_resources.h" +#include "content/public/common/content_client.h" #include "content/public/renderer/render_frame.h" #include "content/public/renderer/resource_fetcher.h" #include "content/renderer/mojo_main_runner.h" @@ -16,6 +24,7 @@ #include "gin/per_context_data.h" #include "gin/public/context_holder.h" #include "gin/try_catch.h" +#include "mojo/public/js/constants.h" #include "third_party/WebKit/public/platform/WebURLResponse.h" #include "third_party/WebKit/public/web/WebFrame.h" #include "third_party/WebKit/public/web/WebScriptSource.h" @@ -40,10 +49,52 @@ runner->Call(start, runner->global(), 0, NULL); } +using ModuleSourceMap = + std::map<std::string, scoped_refptr<base::RefCountedMemory>>; + +base::LazyInstance<scoped_ptr<ModuleSourceMap>>::Leaky g_module_sources; + +scoped_refptr<base::RefCountedMemory> GetBuiltinModuleData( + const std::string& path) { + static const struct { + const char* path; + const int id; + } kBuiltinModuleResources[] = { + { mojo::kBindingsModuleName, IDR_MOJO_BINDINGS_JS }, + { mojo::kBufferModuleName, IDR_MOJO_BUFFER_JS }, + { mojo::kCodecModuleName, IDR_MOJO_CODEC_JS }, + { mojo::kConnectionModuleName, IDR_MOJO_CONNECTION_JS }, + { mojo::kConnectorModuleName, IDR_MOJO_CONNECTOR_JS }, + { mojo::kRouterModuleName, IDR_MOJO_ROUTER_JS }, + { mojo::kUnicodeModuleName, IDR_MOJO_UNICODE_JS }, + { mojo::kValidatorModuleName, IDR_MOJO_VALIDATOR_JS }, + }; + + scoped_ptr<ModuleSourceMap>& module_sources = g_module_sources.Get(); + if (!module_sources) { + // Initialize the module source map on first access. + module_sources.reset(new ModuleSourceMap); + for (size_t i = 0; i < arraysize(kBuiltinModuleResources); ++i) { + const auto& resource = kBuiltinModuleResources[i]; + scoped_refptr<base::RefCountedMemory> data = + GetContentClient()->GetDataResourceBytes(resource.id); + DCHECK_GT(data->size(), 0u); + module_sources->insert(std::make_pair(std::string(resource.path), data)); + } + } + + DCHECK(module_sources); + auto source_iter = module_sources->find(path); + if (source_iter == module_sources->end()) + return nullptr; + return source_iter->second; +} + } // namespace MojoContextState::MojoContextState(blink::WebFrame* frame, - v8::Local<v8::Context> context) + v8::Local<v8::Context> context, + bool for_layout_tests) : frame_(frame), module_added_(false), module_prefix_(frame_->securityOrigin().toString().utf8() + "/") { @@ -54,7 +105,21 @@ gin::ModuleRegistry::From(context)->AddObserver(this); content::RenderFrame::FromWebFrame(frame) ->EnsureMojoBuiltinsAreAvailable(context_holder->isolate(), context); - gin::ModuleRegistry::InstallGlobals(context->GetIsolate(), context->Global()); + v8::Local<v8::Object> install_target; + if (for_layout_tests) { + // In layout tests we install the module system under 'mojo.define' + // for now to avoid globally exposing something as generic as 'define'. + // + // TODO(rockot): Remove this if/when we can integrate gin + ES6 modules. + install_target = v8::Object::New(context->GetIsolate()); + gin::SetProperty(context->GetIsolate(), context->Global(), + gin::StringToSymbol(context->GetIsolate(), "mojo"), + install_target); + } else { + // Otherwise we're fine installing a global 'define'. + install_target = context->Global(); + } + gin::ModuleRegistry::InstallGlobals(context->GetIsolate(), install_target); // Warning |frame| may be destroyed. // TODO(sky): add test for this. } @@ -81,7 +146,11 @@ for (size_t i = 0; i < ids.size(); ++i) { if (fetched_modules_.find(ids[i]) == fetched_modules_.end() && registry->available_modules().count(ids[i]) == 0) { - FetchModule(ids[i]); + scoped_refptr<base::RefCountedMemory> data = GetBuiltinModuleData(ids[i]); + if (data) + runner_->Run(std::string(data->front_as<char>(), data->size()), ids[i]); + else + FetchModule(ids[i]); } } }
diff --git a/content/renderer/mojo_context_state.h b/content/renderer/mojo_context_state.h index f6516b4f7..c9af262 100644 --- a/content/renderer/mojo_context_state.h +++ b/content/renderer/mojo_context_state.h
@@ -33,7 +33,9 @@ // by way of gin. Non-builtin modules are downloaded by way of ResourceFetchers. class MojoContextState : public gin::ModuleRegistryObserver { public: - MojoContextState(blink::WebFrame* frame, v8::Local<v8::Context> context); + MojoContextState(blink::WebFrame* frame, + v8::Local<v8::Context> context, + bool for_layout_tests); ~MojoContextState() override; void Run();
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index b22176be3..ad0e0ab 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -105,7 +105,6 @@ #include "content/renderer/media/renderer_webmediaplayer_delegate.h" #include "content/renderer/media/user_media_client_impl.h" #include "content/renderer/media/webmediaplayer_ms.h" -#include "content/renderer/memory_benchmarking_extension.h" #include "content/renderer/mojo/service_registry_js_wrapper.h" #include "content/renderer/mojo_bindings_controller.h" #include "content/renderer/navigation_state_impl.h" @@ -600,6 +599,42 @@ path.NormalizePathSeparatorsTo(FILE_PATH_LITERAL('/')).AsUTF8Unsafe()); } +// Implementation of WebFrameSerializer::LinkRewritingDelegate that responds +// based on the payload of FrameMsg_GetSerializedHtmlWithLocalLinks. +class LinkRewritingDelegate : public WebFrameSerializer::LinkRewritingDelegate { + public: + LinkRewritingDelegate( + const std::map<GURL, base::FilePath>& url_to_local_path, + const std::map<int, base::FilePath>& frame_routing_id_to_local_path) + : url_to_local_path_(url_to_local_path), + frame_routing_id_to_local_path_(frame_routing_id_to_local_path) {} + + bool rewriteFrameSource(WebFrame* frame, WebString* rewritten_link) override { + int routing_id = GetRoutingIdForFrameOrProxy(frame); + auto it = frame_routing_id_to_local_path_.find(routing_id); + if (it == frame_routing_id_to_local_path_.end()) + return false; // This can happen because of https://crbug.com/541354. + + const base::FilePath& local_path = it->second; + *rewritten_link = ConvertRelativePathToHtmlAttribute(local_path); + return true; + } + + bool rewriteLink(const WebURL& url, WebString* rewritten_link) override { + auto it = url_to_local_path_.find(url); + if (it == url_to_local_path_.end()) + return false; + + const base::FilePath& local_path = it->second; + *rewritten_link = ConvertRelativePathToHtmlAttribute(local_path); + return true; + } + + private: + const std::map<GURL, base::FilePath>& url_to_local_path_; + const std::map<int, base::FilePath>& frame_routing_id_to_local_path_; +}; + // Implementation of WebFrameSerializer::MHTMLPartsGenerationDelegate that // 1. Bases shouldSkipResource and getContentID responses on contents of // FrameMsg_SerializeAsMHTML_Params. @@ -634,8 +669,8 @@ return false; } - WebString getContentID(const WebFrame& frame) override { - int routing_id = GetRoutingIdForFrameOrProxy(const_cast<WebFrame*>(&frame)); + WebString getContentID(WebFrame* frame) override { + int routing_id = GetRoutingIdForFrameOrProxy(frame); auto it = params_.frame_routing_id_to_content_id.find(routing_id); if (it == params_.frame_routing_id_to_content_id.end()) @@ -1052,7 +1087,7 @@ if (IsMainFrame() && RenderProcess::current()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI) { - EnableMojoBindings(); + EnableMojoBindings(false /* for_layout_tests */); } #if defined(ENABLE_PLUGINS) @@ -3273,9 +3308,6 @@ if (command_line.HasSwitch(cc::switches::kEnableGpuBenchmarking)) GpuBenchmarking::Install(frame); - if (command_line.HasSwitch(switches::kEnableMemoryBenchmarking)) - MemoryBenchmarkingExtension::Install(frame); - if (command_line.HasSwitch(switches::kEnableSkiaBenchmarking)) SkiaBenchmarking::Install(frame); @@ -4915,20 +4947,16 @@ } void RenderFrameImpl::OnGetSerializedHtmlWithLocalLinks( - const std::map<GURL, base::FilePath>& url_to_local_path) { + const std::map<GURL, base::FilePath>& url_to_local_path, + const std::map<int, base::FilePath>& frame_routing_id_to_local_path) { // Convert input to the canonical way of passing a map into a Blink API. - std::vector<std::pair<WebURL, WebString>> weburl_to_local_path; - for (const auto& it : url_to_local_path) { - const GURL& url = it.first; - const base::FilePath& local_path = it.second; - weburl_to_local_path.push_back(std::make_pair( - WebURL(url), ConvertRelativePathToHtmlAttribute(local_path))); - } + LinkRewritingDelegate delegate(url_to_local_path, + frame_routing_id_to_local_path); // Serialize the frame (without recursing into subframes). WebFrameSerializer::serialize(GetWebFrame(), this, // WebFrameSerializerClient. - weburl_to_local_path); + &delegate); } void RenderFrameImpl::OnSerializeAsMHTML( @@ -5726,12 +5754,12 @@ routing_id_, SingleHistoryItemToPageState(current_history_item_))); } -void RenderFrameImpl::EnableMojoBindings() { +void RenderFrameImpl::EnableMojoBindings(bool for_layout_tests) { // If an MojoBindingsController already exists for this RenderFrameImpl, avoid // creating another one. It is not kept as a member, as it deletes itself when // the frame is destroyed. if (!RenderFrameObserverTracker<MojoBindingsController>::Get(this)) - new MojoBindingsController(this); + new MojoBindingsController(this, for_layout_tests); } void RenderFrameImpl::SendFailedProvisionalLoad(
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index bc51882..cd1f5987 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -654,8 +654,9 @@ void SendUpdateState(); // Creates a MojoBindingsController to allow WebUI documents to communicate - // with the browser process. - void EnableMojoBindings(); + // with the browser process. If |for_layout_tests| is true, the module system + // is exposed on a global "mojo" object rather than "define". + void EnableMojoBindings(bool for_layout_tests); protected: explicit RenderFrameImpl(const CreateParams& params); @@ -794,7 +795,8 @@ int error_code); void OnGetSavableResourceLinks(); void OnGetSerializedHtmlWithLocalLinks( - const std::map<GURL, base::FilePath>& url_to_local_path); + const std::map<GURL, base::FilePath>& url_to_local_path, + const std::map<int, base::FilePath>& frame_routing_id_to_local_path); void OnSerializeAsMHTML(const FrameMsg_SerializeAsMHTML_Params& params); void OnFind(int request_id, const base::string16& search_text,
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 84e6d1a..cb1625f 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc
@@ -2361,7 +2361,13 @@ new WebUIExtensionData(this); if (main_render_frame_) - main_render_frame_->EnableMojoBindings(); + main_render_frame_->EnableMojoBindings(false /* for_layout_tests */); + } + + if ((enabled_bindings_flags & BINDINGS_POLICY_MOJO) && + !(enabled_bindings_ & BINDINGS_POLICY_MOJO) && + main_render_frame_) { + main_render_frame_->EnableMojoBindings(true /* for_layout_tests */); } enabled_bindings_ |= enabled_bindings_flags;
diff --git a/content/shell/browser/blink_test_controller.cc b/content/shell/browser/blink_test_controller.cc index db01425..623a6677 100644 --- a/content/shell/browser/blink_test_controller.cc +++ b/content/shell/browser/blink_test_controller.cc
@@ -378,7 +378,7 @@ scoped_ptr<BluetoothChooser> BlinkTestController::RunBluetoothChooser( WebContents* web_contents, const BluetoothChooser::EventHandler& event_handler, - const GURL& origin) { + const url::Origin& origin) { if (bluetooth_chooser_factory_) { return bluetooth_chooser_factory_->RunBluetoothChooser( web_contents, event_handler, origin);
diff --git a/content/shell/browser/blink_test_controller.h b/content/shell/browser/blink_test_controller.h index 6b57de7..492f918 100644 --- a/content/shell/browser/blink_test_controller.h +++ b/content/shell/browser/blink_test_controller.h
@@ -30,6 +30,10 @@ class SkBitmap; +namespace url { +class Origin; +} + namespace content { class LayoutTestBluetoothChooserFactory; @@ -131,7 +135,7 @@ scoped_ptr<BluetoothChooser> RunBluetoothChooser( WebContents* web_contents, const BluetoothChooser::EventHandler& event_handler, - const GURL& origin); + const url::Origin& origin); BlinkTestResultPrinter* printer() { return printer_.get(); } void set_printer(BlinkTestResultPrinter* printer) { printer_.reset(printer); }
diff --git a/content/shell/browser/layout_test/layout_test_bluetooth_chooser_factory.cc b/content/shell/browser/layout_test/layout_test_bluetooth_chooser_factory.cc index d4c53dc2..d5a881d 100644 --- a/content/shell/browser/layout_test/layout_test_bluetooth_chooser_factory.cc +++ b/content/shell/browser/layout_test/layout_test_bluetooth_chooser_factory.cc
@@ -6,7 +6,7 @@ #include "base/macros.h" #include "base/strings/utf_string_conversions.h" -#include "url/gurl.h" +#include "url/origin.h" namespace content { @@ -102,9 +102,10 @@ LayoutTestBluetoothChooserFactory::RunBluetoothChooser( WebContents* web_contents, const BluetoothChooser::EventHandler& event_handler, - const GURL& origin) { + const url::Origin& origin) { + DCHECK(!origin.unique()); std::string event = "chooser-opened("; - event += origin.spec(); + event += origin.Serialize(); event += ")"; events_.push_back(event); return make_scoped_ptr(new Chooser(weak_this_.GetWeakPtr(), event_handler));
diff --git a/content/shell/browser/layout_test/layout_test_bluetooth_chooser_factory.h b/content/shell/browser/layout_test/layout_test_bluetooth_chooser_factory.h index 5f83f853f..6b37eb90 100644 --- a/content/shell/browser/layout_test/layout_test_bluetooth_chooser_factory.h +++ b/content/shell/browser/layout_test/layout_test_bluetooth_chooser_factory.h
@@ -13,7 +13,9 @@ #include "base/memory/weak_ptr.h" #include "content/public/browser/bluetooth_chooser.h" -class GURL; +namespace url { +class Origin; +} namespace content { @@ -27,7 +29,7 @@ scoped_ptr<BluetoothChooser> RunBluetoothChooser( WebContents* web_contents, const BluetoothChooser::EventHandler& event_handler, - const GURL& origin); + const url::Origin& origin); std::vector<std::string> GetAndResetEvents();
diff --git a/content/shell/browser/shell.cc b/content/shell/browser/shell.cc index 6e8d8fc8..d2ff030 100644 --- a/content/shell/browser/shell.cc +++ b/content/shell/browser/shell.cc
@@ -24,6 +24,7 @@ #include "content/public/browser/render_widget_host.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_observer.h" +#include "content/public/common/bindings_policy.h" #include "content/public/common/content_switches.h" #include "content/public/common/renderer_preferences.h" #include "content/public/common/webrtc_ip_handling_policy.h" @@ -122,6 +123,7 @@ if (command_line->HasSwitch(switches::kRunLayoutTest)) { web_contents->GetMutableRendererPrefs()->use_custom_colors = false; web_contents->GetRenderViewHost()->SyncRendererPrefs(); + web_contents->GetRenderViewHost()->AllowBindings(BINDINGS_POLICY_MOJO); } #if defined(ENABLE_WEBRTC) @@ -382,7 +384,7 @@ scoped_ptr<BluetoothChooser> Shell::RunBluetoothChooser( WebContents* web_contents, const BluetoothChooser::EventHandler& event_handler, - const GURL& origin) { + const url::Origin& origin) { const base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); if (command_line.HasSwitch(switches::kRunLayoutTest)) {
diff --git a/content/shell/browser/shell.h b/content/shell/browser/shell.h index 2581c409..f53d2f4 100644 --- a/content/shell/browser/shell.h +++ b/content/shell/browser/shell.h
@@ -138,7 +138,7 @@ scoped_ptr<BluetoothChooser> RunBluetoothChooser( WebContents* web_contents, const BluetoothChooser::EventHandler& event_handler, - const GURL& origin) override; + const url::Origin& origin) override; #if defined(OS_MACOSX) void HandleKeyboardEvent(WebContents* source, const NativeWebKeyboardEvent& event) override;
diff --git a/content/test/data/background_sync/background_sync_test_helpers.js b/content/test/data/background_sync/background_sync_test_helpers.js index 7d11875..a03963d6 100644 --- a/content/test/data/background_sync/background_sync_test_helpers.js +++ b/content/test/data/background_sync/background_sync_test_helpers.js
@@ -31,7 +31,7 @@ .catch(sendErrorToTest); } -function registerOneShot(tag) { +function register(tag) { navigator.serviceWorker.ready .then(function(swRegistration) { return swRegistration.sync.register(tag); @@ -42,16 +42,16 @@ .catch(sendErrorToTest); } -function registerOneShotFromServiceWorker(tag) { +function registerFromServiceWorker(tag) { navigator.serviceWorker.ready .then(function(swRegistration) { - swRegistration.active.postMessage({action: 'registerOneShot', tag: tag}); + swRegistration.active.postMessage({action: 'register', tag: tag}); sendResultToTest('ok - ' + tag + ' register sent to SW'); }) .catch(sendErrorToTest); } -function getRegistrationOneShot(tag) { +function hasTag(tag) { navigator.serviceWorker.ready .then(function(swRegistration) { return swRegistration.sync.getTags(); @@ -67,17 +67,17 @@ .catch(sendErrorToTest); } -function getRegistrationOneShotFromServiceWorker(tag) { +function hasTagFromServiceWorker(tag) { navigator.serviceWorker.ready .then(function(swRegistration) { swRegistration.active.postMessage( - {action: 'getRegistrationOneShot', tag: tag}); - sendResultToTest('ok - getRegistration sent to SW'); + {action: 'hasTag', tag: tag}); + sendResultToTest('ok - hasTag sent to SW'); }) .catch(sendErrorToTest); } -function getRegistrationsOneShot(tag) { +function getTags() { navigator.serviceWorker.ready .then(function(swRegistration) { return swRegistration.sync.getTags(); @@ -88,28 +88,30 @@ .catch(sendErrorToTest); } -function getRegistrationsOneShotFromServiceWorker() { +function getTagsFromServiceWorker() { navigator.serviceWorker.ready .then(function(swRegistration) { - swRegistration.active.postMessage({action: 'getRegistrationsOneShot'}); - sendResultToTest('ok - getRegistrations sent to SW'); + swRegistration.active.postMessage({action: 'getTags'}); + sendResultToTest('ok - getTags sent to SW'); }) .catch(sendErrorToTest); } -function completeDelayedOneShot() { +function completeDelayedSyncEvent() { navigator.serviceWorker.ready .then(function(swRegistration) { - swRegistration.active.postMessage({action: 'completeDelayedOneShot'}); + swRegistration.active.postMessage({ + action: 'completeDelayedSyncEvent' + }); sendResultToTest('ok - delay completing'); }) .catch(sendErrorToTest); } -function rejectDelayedOneShot() { +function rejectDelayedSyncEvent() { navigator.serviceWorker.ready .then(function(swRegistration) { - swRegistration.active.postMessage({action: 'rejectDelayedOneShot'}); + swRegistration.active.postMessage({action: 'rejectDelayedSyncEvent'}); sendResultToTest('ok - delay rejecting'); }) .catch(sendErrorToTest); @@ -124,7 +126,7 @@ }); } -function registerOneShotFromLocalFrame(frame_url) { +function registerFromLocalFrame(frame_url) { var frameWindow; return createFrame(frame_url) .then(function(frame) { @@ -157,7 +159,7 @@ }); } -function registerOneShotFromCrossOriginServiceWorker(cross_frame_url) { +function registerFromCrossOriginServiceWorker(cross_frame_url) { return createFrame(cross_frame_url) .then(function(frame) { return receiveMessage();
diff --git a/content/test/data/background_sync/service_worker.js b/content/test/data/background_sync/service_worker.js index 140759d..dd180d4 100644 --- a/content/test/data/background_sync/service_worker.js +++ b/content/test/data/background_sync/service_worker.js
@@ -7,7 +7,7 @@ // passed through to the document unchanged. // // "delay" - Delays finishing the sync event with event.waitUntil. -// Send a postMessage of "completeDelayedOneShot" to finish the +// Send a postMessage of "completeDelayedRegistration" to finish the // event. 'use strict'; @@ -16,7 +16,7 @@ var rejectCallback = null; this.onmessage = function(event) { - if (event.data['action'] === 'completeDelayedOneShot') { + if (event.data['action'] === 'completeDelayedSyncEvent') { if (resolveCallback === null) { sendMessageToClients('sync', 'error - resolveCallback is null'); return; @@ -27,7 +27,7 @@ return; } - if (event.data['action'] === 'rejectDelayedOneShot') { + if (event.data['action'] === 'rejectDelayedSyncEvent') { if (rejectCallback === null) { sendMessageToClients('sync', 'error - rejectCallback is null'); return; @@ -37,7 +37,7 @@ sendMessageToClients('sync', 'ok - delay rejected'); } - if (event.data['action'] === 'registerOneShot') { + if (event.data['action'] === 'register') { var tag = event.data['tag']; registration.sync.register(tag) .then(function () { @@ -46,9 +46,9 @@ .catch(sendSyncErrorToClients); } - if (event.data['action'] === 'getRegistrationOneShot') { + if (event.data['action'] === 'hasTag') { var tag = event.data['tag']; - registration.sync.getTags(tag) + registration.sync.getTags() .then(function(tags) { if (tags.indexOf(tag) >= 0) { sendMessageToClients('register', 'ok - ' + tag + ' found'); @@ -60,7 +60,7 @@ .catch(sendSyncErrorToClients); } - if (event.data['action'] === 'getRegistrationsOneShot') { + if (event.data['action'] === 'getTags') { registration.sync.getTags() .then(function(tags) { sendMessageToClients('register', 'ok - ' + tags.toString());
diff --git a/content/test/gpu/gpu_tests/webgl_conformance.py b/content/test/gpu/gpu_tests/webgl_conformance.py index 392ca2b..277c5375 100644 --- a/content/test/gpu/gpu_tests/webgl_conformance.py +++ b/content/test/gpu/gpu_tests/webgl_conformance.py
@@ -85,7 +85,8 @@ '--disable-domain-blocking-for-3d-apis', '--disable-gpu-process-crash-limit', '--js-flags=--expose-gc', - '--test-type=gpu' + '--test-type=gpu', + '--enable-experimental-canvas-features' ]) browser = browser_finder.FindBrowser(options.finder_options) if (browser.target_os.startswith('android') and @@ -115,7 +116,8 @@ '--disable-gpu-process-crash-limit', '--js-flags=--expose-gc', '--enable-unsafe-es3-apis', - '--test-type=gpu' + '--test-type=gpu', + '--enable-experimental-canvas-features' ]) browser = browser_finder.FindBrowser(options.finder_options) if browser.target_os == 'darwin':
diff --git a/crypto/rsa_private_key.h b/crypto/rsa_private_key.h index 9703334..d4808f5 100644 --- a/crypto/rsa_private_key.h +++ b/crypto/rsa_private_key.h
@@ -200,7 +200,7 @@ // Creates a copy of the object. RSAPrivateKey* Copy() const; - // Exports the private key to a PKCS #1 PrivateKey block. + // Exports the private key to a PKCS #8 PrivateKeyInfo block. bool ExportPrivateKey(std::vector<uint8_t>* output) const; // Exports the public key to an X509 SubjectPublicKeyInfo block.
diff --git a/device/device_unittests_apk.isolate b/device/device_unittests_apk.isolate index ab133fd..4c61682 100644 --- a/device/device_unittests_apk.isolate +++ b/device/device_unittests_apk.isolate
@@ -8,6 +8,7 @@ 'variables': { 'command': [ '<(PRODUCT_DIR)/bin/run_device_unittests', + '--logcat-output-dir', '${ISOLATED_OUTDIR}/logcats', ], 'files': [ '<(PRODUCT_DIR)/bin/run_device_unittests',
diff --git a/device/usb/webusb_descriptors.cc b/device/usb/webusb_descriptors.cc index 1ecdfc2..43ad170 100644 --- a/device/usb/webusb_descriptors.cc +++ b/device/usb/webusb_descriptors.cc
@@ -21,7 +21,7 @@ const uint8_t kPlatformDevCapabilityType = 0x05; // These constants are defined by the WebUSB specification: -// http://reillyeon.github.io/webusb/ +// http://wicg.github.io/webusb/ const uint8_t kWebUsbCapabilityUUID[16] = { // Little-endian encoding of {3408b638-09a9-47a0-8bfd-a0768815b665}. 0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47,
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc index 76db07f..532e43d 100644 --- a/extensions/browser/api/web_request/web_request_api.cc +++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -1072,6 +1072,9 @@ continue; } + if (!listener->ipc_sender.get()) + continue; + // Filter out the optional keys that this listener didn't request. scoped_ptr<base::ListValue> args_filtered(new base::ListValue); args_filtered->Append(
diff --git a/extensions/browser/content_hash_reader.cc b/extensions/browser/content_hash_reader.cc index 499587b..f1a39a6 100644 --- a/extensions/browser/content_hash_reader.cc +++ b/extensions/browser/content_hash_reader.cc
@@ -64,7 +64,7 @@ verified_contents_.reset(new VerifiedContents(key_.data, key_.size)); if (!verified_contents_->InitFrom(verified_contents_path, false) || !verified_contents_->valid_signature() || - !verified_contents_->version().Equals(extension_version_) || + verified_contents_->version() != extension_version_ || verified_contents_->extension_id() != extension_id_) return false;
diff --git a/extensions/browser/updater/update_client_config.cc b/extensions/browser/updater/update_client_config.cc index 3e5e1b1..36ab34f 100644 --- a/extensions/browser/updater/update_client_config.cc +++ b/extensions/browser/updater/update_client_config.cc
@@ -14,7 +14,7 @@ UpdateClientConfig::GetSequencedTaskRunner() const { return content::BrowserThread::GetBlockingPool() ->GetSequencedTaskRunnerWithShutdownBehavior( - content::BrowserThread::GetBlockingPool()->GetSequenceToken(), + base::SequencedWorkerPool::GetSequenceToken(), base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); }
diff --git a/extensions/browser/updater/update_service_unittest.cc b/extensions/browser/updater/update_service_unittest.cc index a6ed8b7..94bfad3 100644 --- a/extensions/browser/updater/update_service_unittest.cc +++ b/extensions/browser/updater/update_service_unittest.cc
@@ -203,7 +203,7 @@ ASSERT_NE(nullptr, data); ASSERT_EQ(1u, data->size()); - ASSERT_TRUE(data->at(0).version.Equals(*extension1->version())); + ASSERT_EQ(data->at(0).version, *extension1->version()); update_client::CrxInstaller* installer = data->at(0).installer.get(); ASSERT_NE(installer, nullptr);
diff --git a/extensions/common/manifest_constants.cc b/extensions/common/manifest_constants.cc index d948170..7195dda 100644 --- a/extensions/common/manifest_constants.cc +++ b/extensions/common/manifest_constants.cc
@@ -406,6 +406,7 @@ "Invalid value for overriding homepage url: '[*]'."; const char kInvalidHomepageURL[] = "Invalid value for homepage url: '[*]'."; +const char kInvalidIconKey[] = "Invalid key in icons: \"*\"."; const char kInvalidIconPath[] = "Invalid value for 'icons[\"*\"]'."; const char kInvalidIcons[] =
diff --git a/extensions/common/manifest_constants.h b/extensions/common/manifest_constants.h index b6978a9..9051aa8 100644 --- a/extensions/common/manifest_constants.h +++ b/extensions/common/manifest_constants.h
@@ -325,6 +325,7 @@ extern const char kInvalidGlobList[]; extern const char kInvalidHomepageOverrideURL[]; extern const char kInvalidHomepageURL[]; +extern const char kInvalidIconKey[]; extern const char kInvalidIconPath[]; extern const char kInvalidIcons[]; extern const char kInvalidImport[];
diff --git a/extensions/common/manifest_handler_helpers.cc b/extensions/common/manifest_handler_helpers.cc index bfc9e33..4a644b8 100644 --- a/extensions/common/manifest_handler_helpers.cc +++ b/extensions/common/manifest_handler_helpers.cc
@@ -10,6 +10,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" +#include "extensions/common/constants.h" #include "extensions/common/error_utils.h" #include "extensions/common/extension.h" #include "extensions/common/extension_icon_set.h" @@ -41,8 +42,13 @@ !iterator.IsAtEnd(); iterator.Advance()) { int size = 0; std::string icon_path; - if (!base::StringToInt(iterator.key(), &size) || - !iterator.value().GetAsString(&icon_path) || + if (!base::StringToInt(iterator.key(), &size) || size <= 0 || + size > extension_misc::EXTENSION_ICON_GIGANTOR * 4) { + *error = ErrorUtils::FormatErrorMessageUTF16(errors::kInvalidIconKey, + iterator.key()); + return false; + } + if (!iterator.value().GetAsString(&icon_path) || !NormalizeAndValidatePath(&icon_path)) { *error = ErrorUtils::FormatErrorMessageUTF16(errors::kInvalidIconPath, iterator.key());
diff --git a/extensions/common/manifest_handlers/icons_handler_unittest.cc b/extensions/common/manifest_handlers/icons_handler_unittest.cc new file mode 100644 index 0000000..fa644a9 --- /dev/null +++ b/extensions/common/manifest_handlers/icons_handler_unittest.cc
@@ -0,0 +1,69 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/test/values_test_util.h" +#include "extensions/common/manifest_handlers/icons_handler.h" +#include "extensions/common/manifest_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace extensions { + +class ProductIconManifestTest : public ManifestTest { + public: + ProductIconManifestTest() {} + + protected: + scoped_ptr<base::DictionaryValue> CreateManifest( + const std::string& extra_icons) { + scoped_ptr<base::DictionaryValue> manifest = base::DictionaryValue::From( + base::test::ParseJson("{ \n" + " \"name\": \"test\", \n" + " \"version\": \"0.1\", \n" + " \"manifest_version\": 2, \n" + " \"icons\": { \n" + + extra_icons + " \"16\": \"icon1.png\", \n" + " \"32\": \"icon2.png\" \n" + " } \n" + "} \n")); + EXPECT_TRUE(manifest); + return manifest; + } + + private: + DISALLOW_COPY_AND_ASSIGN(ProductIconManifestTest); +}; + +TEST_F(ProductIconManifestTest, Sizes) { + // Too big. + { + scoped_ptr<base::DictionaryValue> ext_manifest = + CreateManifest("\"100000\": \"icon3.png\", \n"); + ManifestData manifest(std::move(ext_manifest), "test"); + LoadAndExpectError(manifest, "Invalid key in icons: \"100000\"."); + } + // Too small. + { + scoped_ptr<base::DictionaryValue> ext_manifest = + CreateManifest("\"0\": \"icon3.png\", \n"); + ManifestData manifest(std::move(ext_manifest), "test"); + LoadAndExpectError(manifest, "Invalid key in icons: \"0\"."); + } + // NaN. + { + scoped_ptr<base::DictionaryValue> ext_manifest = + CreateManifest("\"sixteen\": \"icon3.png\", \n"); + ManifestData manifest(std::move(ext_manifest), "test"); + LoadAndExpectError(manifest, "Invalid key in icons: \"sixteen\"."); + } + // Just right. + { + scoped_ptr<base::DictionaryValue> ext_manifest = + CreateManifest("\"512\": \"icon3.png\", \n"); + ManifestData manifest(std::move(ext_manifest), "test"); + scoped_refptr<extensions::Extension> extension = + LoadAndExpectSuccess(manifest); + } +} + +} // namespace extensions
diff --git a/extensions/common/permissions/permissions_data.cc b/extensions/common/permissions/permissions_data.cc index 8fa22f4..d3634d35 100644 --- a/extensions/common/permissions/permissions_data.cc +++ b/extensions/common/permissions/permissions_data.cc
@@ -232,11 +232,10 @@ bool PermissionsData::CanAccessPage(const Extension* extension, const GURL& document_url, int tab_id, - int process_id, std::string* error) const { base::AutoLock auto_lock(runtime_lock_); AccessType result = - CanRunOnPage(extension, document_url, tab_id, process_id, + CanRunOnPage(extension, document_url, tab_id, active_permissions_unsafe_->explicit_hosts(), withheld_permissions_unsafe_->explicit_hosts(), error); // TODO(rdevlin.cronin) Update callers so that they only need ACCESS_ALLOWED. @@ -247,10 +246,9 @@ const Extension* extension, const GURL& document_url, int tab_id, - int process_id, std::string* error) const { base::AutoLock auto_lock(runtime_lock_); - return CanRunOnPage(extension, document_url, tab_id, process_id, + return CanRunOnPage(extension, document_url, tab_id, active_permissions_unsafe_->explicit_hosts(), withheld_permissions_unsafe_->explicit_hosts(), error); } @@ -258,11 +256,10 @@ bool PermissionsData::CanRunContentScriptOnPage(const Extension* extension, const GURL& document_url, int tab_id, - int process_id, std::string* error) const { base::AutoLock auto_lock(runtime_lock_); AccessType result = - CanRunOnPage(extension, document_url, tab_id, process_id, + CanRunOnPage(extension, document_url, tab_id, active_permissions_unsafe_->scriptable_hosts(), withheld_permissions_unsafe_->scriptable_hosts(), error); // TODO(rdevlin.cronin) Update callers so that they only need ACCESS_ALLOWED. @@ -273,10 +270,9 @@ const Extension* extension, const GURL& document_url, int tab_id, - int process_id, std::string* error) const { base::AutoLock auto_lock(runtime_lock_); - return CanRunOnPage(extension, document_url, tab_id, process_id, + return CanRunOnPage(extension, document_url, tab_id, active_permissions_unsafe_->scriptable_hosts(), withheld_permissions_unsafe_->scriptable_hosts(), error); } @@ -333,14 +329,13 @@ const Extension* extension, const GURL& document_url, int tab_id, - int process_id, const URLPatternSet& permitted_url_patterns, const URLPatternSet& withheld_url_patterns, std::string* error) const { runtime_lock_.AssertAcquired(); if (g_policy_delegate && - !g_policy_delegate->CanExecuteScriptOnPage( - extension, document_url, tab_id, process_id, error)) { + !g_policy_delegate->CanExecuteScriptOnPage(extension, document_url, + tab_id, error)) { return ACCESS_DENIED; }
diff --git a/extensions/common/permissions/permissions_data.h b/extensions/common/permissions/permissions_data.h index a78a0c1..bb8e51e 100644 --- a/extensions/common/permissions/permissions_data.h +++ b/extensions/common/permissions/permissions_data.h
@@ -59,7 +59,6 @@ virtual bool CanExecuteScriptOnPage(const Extension* extension, const GURL& document_url, int tab_id, - int process_id, std::string* error) = 0; }; @@ -153,7 +152,6 @@ bool CanAccessPage(const Extension* extension, const GURL& document_url, int tab_id, - int process_id, std::string* error) const; // Like CanAccessPage, but also takes withheld permissions into account. // TODO(rdevlin.cronin) We shouldn't have two functions, but not all callers @@ -161,7 +159,6 @@ AccessType GetPageAccess(const Extension* extension, const GURL& document_url, int tab_id, - int process_id, std::string* error) const; // Returns true if the |extension| has permission to inject a content script @@ -173,7 +170,6 @@ bool CanRunContentScriptOnPage(const Extension* extension, const GURL& document_url, int tab_id, - int process_id, std::string* error) const; // Like CanRunContentScriptOnPage, but also takes withheld permissions into // account. @@ -182,7 +178,6 @@ AccessType GetContentScriptAccess(const Extension* extension, const GURL& document_url, int tab_id, - int process_id, std::string* error) const; // Returns true if extension is allowed to obtain the contents of a page as @@ -234,7 +229,6 @@ AccessType CanRunOnPage(const Extension* extension, const GURL& document_url, int tab_id, - int process_id, const URLPatternSet& permitted_url_patterns, const URLPatternSet& withheld_url_patterns, std::string* error) const;
diff --git a/extensions/extensions_tests.gypi b/extensions/extensions_tests.gypi index 2c7209af..b226110f 100644 --- a/extensions/extensions_tests.gypi +++ b/extensions/extensions_tests.gypi
@@ -126,6 +126,7 @@ 'common/manifest_handlers/default_locale_manifest_unittest.cc', 'common/manifest_handlers/externally_connectable_unittest.cc', 'common/manifest_handlers/file_handler_manifest_unittest.cc', + 'common/manifest_handlers/icons_handler_unittest.cc', 'common/manifest_handlers/incognito_manifest_unittest.cc', 'common/manifest_handlers/kiosk_mode_info_unittest.cc', 'common/manifest_handlers/oauth2_manifest_unittest.cc',
diff --git a/extensions/renderer/extension_injection_host.cc b/extensions/renderer/extension_injection_host.cc index 9f520be..8e0d9b3c 100644 --- a/extensions/renderer/extension_injection_host.cc +++ b/extensions/renderer/extension_injection_host.cc
@@ -67,14 +67,12 @@ extension_, document_url, tab_id, - -1, // no process id nullptr /* ignore error */); } else { access = extension_->permissions_data()->GetContentScriptAccess( extension_, document_url, tab_id, - -1, // no process id nullptr /* ignore error */); } if (access == PermissionsData::ACCESS_WITHHELD &&
diff --git a/extensions/renderer/module_system_test.cc b/extensions/renderer/module_system_test.cc index 68c4bd1..50de79fe 100644 --- a/extensions/renderer/module_system_test.cc +++ b/extensions/renderer/module_system_test.cc
@@ -22,6 +22,7 @@ #include "extensions/renderer/object_backed_native_handler.h" #include "extensions/renderer/safe_builtins.h" #include "extensions/renderer/utils_native_handler.h" +#include "third_party/WebKit/public/web/WebHeap.h" #include "ui/base/resource/resource_bundle.h" namespace extensions { @@ -240,6 +241,7 @@ old_heap_size = stats.used_heap_size(); isolate_->RequestGarbageCollectionForTesting( v8::Isolate::kFullGarbageCollection); + blink::WebHeap::collectAllGarbageForTesting(); isolate_->GetHeapStatistics(&stats); } }
diff --git a/gpu/command_buffer/service/context_state.cc b/gpu/command_buffer/service/context_state.cc index 565536ed..893465d 100644 --- a/gpu/command_buffer/service/context_state.cc +++ b/gpu/command_buffer/service/context_state.cc
@@ -373,10 +373,10 @@ glVertexAttribDivisorANGLE(attrib_index, attrib->divisor()); // Never touch vertex attribute 0's state (in particular, never - // disable it) when running on desktop GL because it will never be - // re-enabled. + // disable it) when running on desktop GL with compatibility profile + // because it will never be re-enabled. if (attrib_index != 0 || - gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) { + feature_info_->gl_version_info().BehavesLikeGLES()) { if (attrib->enabled()) { glEnableVertexAttribArray(attrib_index); } else {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 06a5349..5f451d31 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -2691,9 +2691,10 @@ util_.set_num_compressed_texture_formats( validators_->compressed_texture_format.GetValues().size()); - if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { - // We have to enable vertex array 0 on OpenGL or it won't render. Note that - // OpenGL ES 2.0 does not have this issue. + if (!feature_info_->gl_version_info().BehavesLikeGLES()) { + // We have to enable vertex array 0 on GL with compatibility profile or it + // won't render. Note that ES or GL with core profile does not have this + // issue. glEnableVertexAttribArray(0); } glGenBuffersARB(1, &attrib_0_buffer_id_); @@ -4924,8 +4925,7 @@ void GLES2DecoderImpl::DoDisableVertexAttribArray(GLuint index) { if (state_.vertex_attrib_manager->Enable(index, false)) { - if (index != 0 || - gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) { + if (index != 0 || feature_info_->gl_version_info().BehavesLikeGLES()) { glDisableVertexAttribArray(index); } } else { @@ -7853,11 +7853,10 @@ GL_ARRAY_BUFFER, state_.bound_array_buffer.get() ? state_.bound_array_buffer->service_id() : 0); - // Never touch vertex attribute 0's state (in particular, never - // disable it) when running on desktop GL because it will never be - // re-enabled. - if (attrib_index != 0 || - gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) { + // Never touch vertex attribute 0's state (in particular, never disable it) + // when running on desktop GL with compatibility profile because it will + // never be re-enabled. + if (attrib_index != 0 || feature_info_->gl_version_info().BehavesLikeGLES()) { if (attrib->enabled()) { glEnableVertexAttribArray(attrib_index); } else { @@ -7871,7 +7870,7 @@ GLuint max_vertex_accessed, bool* simulated, GLsizei primcount) { DCHECK(simulated); *simulated = false; - if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) + if (feature_info_->gl_version_info().BehavesLikeGLES()) return true; if (!state_.vertex_attrib_manager->HaveFixedAttribs()) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc index 88a46bd..d744776 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
@@ -253,9 +253,11 @@ AddExpectationsForBindVertexArrayOES(); - EXPECT_CALL(*gl_, EnableVertexAttribArray(0)) - .Times(1) - .RetiresOnSaturation(); + if (!group_->feature_info()->gl_version_info().BehavesLikeGLES()) { + EXPECT_CALL(*gl_, EnableVertexAttribArray(0)) + .Times(1) + .RetiresOnSaturation(); + } static GLuint attrib_0_id[] = { kServiceAttrib0BufferId, };
diff --git a/gpu/config/gpu_info_collector_win.cc b/gpu/config/gpu_info_collector_win.cc index 66def99..4d2b28d 100644 --- a/gpu/config/gpu_info_collector_win.cc +++ b/gpu/config/gpu_info_collector_win.cc
@@ -397,7 +397,7 @@ UMA_HISTOGRAM_ENUMERATION("GPU.DisplayLinkInstallationStatus", DISPLAY_LINK_NOT_INSTALLED, DISPLAY_LINK_INSTALLATION_STATUS_MAX); - } else if (gpu_info->display_link_version.IsOlderThan("7.2")) { + } else if (gpu_info->display_link_version < base::Version("7.2")) { UMA_HISTOGRAM_ENUMERATION("GPU.DisplayLinkInstallationStatus", DISPLAY_LINK_7_1_OR_EARLIER, DISPLAY_LINK_INSTALLATION_STATUS_MAX);
diff --git a/ios/chrome/browser/net/http_server_properties_manager_factory.cc b/ios/chrome/browser/net/http_server_properties_manager_factory.cc index bf827e3..59263a3 100644 --- a/ios/chrome/browser/net/http_server_properties_manager_factory.cc +++ b/ios/chrome/browser/net/http_server_properties_manager_factory.cc
@@ -4,16 +4,59 @@ #include "ios/chrome/browser/net/http_server_properties_manager_factory.h" +#include "base/prefs/pref_change_registrar.h" +#include "base/prefs/pref_service.h" #include "components/pref_registry/pref_registry_syncable.h" #include "ios/chrome/browser/pref_names.h" #include "ios/web/public/web_thread.h" #include "net/http/http_server_properties_manager.h" +namespace { + +class PrefServiceAdapter + : public net::HttpServerPropertiesManager::PrefDelegate { + public: + explicit PrefServiceAdapter(PrefService* pref_service) + : pref_service_(pref_service), path_(prefs::kHttpServerProperties) { + pref_change_registrar_.Init(pref_service_); + } + + ~PrefServiceAdapter() override {} + + // PrefDelegate implementation. + bool HasServerProperties() override { + return pref_service_->HasPrefPath(path_); + } + const base::DictionaryValue& GetServerProperties() const override { + // Guaranteed not to return null when the pref is registered + // (RegisterProfilePrefs was called). + return *pref_service_->GetDictionary(path_); + } + void SetServerProperties(const base::DictionaryValue& value) override { + return pref_service_->Set(path_, value); + } + void StartListeningForUpdates(const base::Closure& callback) override { + pref_change_registrar_.Add(path_, callback); + } + void StopListeningForUpdates() override { + pref_change_registrar_.RemoveAll(); + } + + private: + PrefService* pref_service_; + const std::string path_; + PrefChangeRegistrar pref_change_registrar_; + + DISALLOW_COPY_AND_ASSIGN(PrefServiceAdapter); +}; + +} // namespace + // static net::HttpServerPropertiesManager* HttpServerPropertiesManagerFactory::CreateManager(PrefService* pref_service) { return new net::HttpServerPropertiesManager( - pref_service, prefs::kHttpServerProperties, + new PrefServiceAdapter(pref_service), // Transfers ownership. web::WebThread::GetTaskRunnerForThread(web::WebThread::IO)); }
diff --git a/ios/chrome/browser/ui/commands/ios_command_ids.h b/ios/chrome/browser/ui/commands/ios_command_ids.h index 496de1d..c4e15b09 100644 --- a/ios/chrome/browser/ui/commands/ios_command_ids.h +++ b/ios/chrome/browser/ui/commands/ios_command_ids.h
@@ -59,7 +59,6 @@ #define IDC_SHARE_PAGE 40929 #define IDC_BACK_FORWARD_IN_TAB_HISTORY 40930 #define IDC_SHOW_GOOGLE_APPS_SETTINGS 40931 -#define IDC_SHOW_SIGN_IN_WITH_PRINT_ON_COMPLETION 40933 #define IDC_SHOW_PRIVACY_SETTINGS 40934 #define IDC_HIDE_SETTINGS_AND_SHOW_PRIVACY_SETTINGS 40935 #define IDC_REPORT_AN_ISSUE 40936
diff --git a/ipc/ipc_message_start.h b/ipc/ipc_message_start.h index 8197ac629..83fc1784 100644 --- a/ipc/ipc_message_start.h +++ b/ipc/ipc_message_start.h
@@ -75,7 +75,6 @@ AppShimMsgStart, WebRtcLoggingMsgStart, TtsMsgStart, - MemoryBenchmarkMsgStart, WebSocketMsgStart, NaClHostMsgStart, WebRTCIdentityMsgStart,
diff --git a/ipc/ipc_tests_apk.isolate b/ipc/ipc_tests_apk.isolate index 0c0cf1c..50047a4 100644 --- a/ipc/ipc_tests_apk.isolate +++ b/ipc/ipc_tests_apk.isolate
@@ -8,6 +8,7 @@ 'variables': { 'command': [ '<(PRODUCT_DIR)/bin/run_ipc_tests', + '--logcat-output-dir', '${ISOLATED_OUTDIR}/logcats', ], 'files': [ '<(PRODUCT_DIR)/bin/run_ipc_tests',
diff --git a/ipc/unix_domain_socket_util.cc b/ipc/unix_domain_socket_util.cc index a21df2f..036faa2 100644 --- a/ipc/unix_domain_socket_util.cc +++ b/ipc/unix_domain_socket_util.cc
@@ -5,7 +5,6 @@ #include "ipc/unix_domain_socket_util.h" #include <errno.h> -#include <stddef.h> #include <sys/socket.h> #include <sys/stat.h> #include <sys/un.h> @@ -118,13 +117,10 @@ int* client_socket) { DCHECK(client_socket); - std::string socket_name = socket_path.value(); - base::FilePath socket_dir = socket_path.DirName(); - struct sockaddr_un unix_addr; size_t unix_addr_len; base::ScopedFD fd( - MakeUnixAddrForPath(socket_name, &unix_addr, &unix_addr_len)); + MakeUnixAddrForPath(socket_path.value(), &unix_addr, &unix_addr_len)); if (!fd.is_valid()) return false;
diff --git a/ipc/unix_domain_socket_util.h b/ipc/unix_domain_socket_util.h index 1359072..78d98644 100644 --- a/ipc/unix_domain_socket_util.h +++ b/ipc/unix_domain_socket_util.h
@@ -8,8 +8,6 @@ #include <stddef.h> #include <sys/types.h> -#include <string> - #include "ipc/ipc_export.h" namespace base {
diff --git a/mandoline/app/android/BUILD.gn b/mandoline/app/android/BUILD.gn index d74f42c7..df6ab3f 100644 --- a/mandoline/app/android/BUILD.gn +++ b/mandoline/app/android/BUILD.gn
@@ -21,11 +21,11 @@ "//mandoline/ui/desktop_ui/public/interfaces", "//mojo/common", "//mojo/environment:chromium", - "//mojo/runner:lib", - "//mojo/runner:mojo_runner_lib", - "//mojo/runner:register_local_aliases_fwd", "//mojo/shell", "//mojo/shell/package_manager", + "//mojo/shell/standalone:lib", + "//mojo/shell/standalone:main_lib", + "//mojo/shell/standalone:register_local_aliases_fwd", ] sources = [ @@ -57,8 +57,8 @@ "//components/html_viewer:html_viewer_assets", "//components/resource_provider:resource_provider_assets", "//mandoline/services/core_services:core_services_assets", - "//mojo/runner:android_assets", "//mojo/services/network:network_assets", + "//mojo/shell/standalone:android_assets", ] if (use_aura) { @@ -74,7 +74,7 @@ deps = [ "//base:base_java", - "//mojo/runner:java", + "//mojo/shell/standalone:java", ] } @@ -103,8 +103,8 @@ ":mandoline_apk_resources", ":mandoline_assets", "//base:base_java", - "//mojo/runner:java", - "//mojo/runner:resources", + "//mojo/shell/standalone:java", + "//mojo/shell/standalone:resources", "//ui/platform_window/android:platform_window_java", google_play_services_resources, ]
diff --git a/mandoline/app/android/mandoline_activity.cc b/mandoline/app/android/mandoline_activity.cc index 6ad7a8c..e76b4b9c8 100644 --- a/mandoline/app/android/mandoline_activity.cc +++ b/mandoline/app/android/mandoline_activity.cc
@@ -5,9 +5,9 @@ #include "base/android/jni_string.h" #include "jni/MandolineActivity_jni.h" #include "mandoline/ui/desktop_ui/public/interfaces/launch_handler.mojom.h" -#include "mojo/runner/android/main.h" -#include "mojo/runner/context.h" #include "mojo/shell/connect_util.h" +#include "mojo/shell/standalone/android/main.h" +#include "mojo/shell/standalone/context.h" namespace mandoline { @@ -16,7 +16,7 @@ const JavaParamRef<jstring>& jurl) { LaunchHandlerPtr launch_handler; mojo::shell::ConnectToService( - mojo::runner::GetContext()->application_manager(), GURL("mojo:phone_ui"), + mojo::shell::GetContext()->application_manager(), GURL("mojo:phone_ui"), &launch_handler); launch_handler->LaunchURL( base::android::ConvertJavaStringToUTF8(env, jurl));
diff --git a/mandoline/app/android/mandoline_context_init.cc b/mandoline/app/android/mandoline_context_init.cc index fa60c9ce..41dcb31 100644 --- a/mandoline/app/android/mandoline_context_init.cc +++ b/mandoline/app/android/mandoline_context_init.cc
@@ -5,10 +5,10 @@ #include "base/bind.h" #include "base/logging.h" #include "base/message_loop/message_loop.h" -#include "mojo/runner/context.h" +#include "mojo/shell/standalone/context.h" namespace mojo { -namespace runner { +namespace shell { void InitContext(Context* context) { base::MessageLoopForUI::current()->PostTask( @@ -18,5 +18,5 @@ GURL("mojo:phone_ui"))); } -} // namespace runner +} // namespace shell } // namespace mojo
diff --git a/mandoline/app/desktop/BUILD.gn b/mandoline/app/desktop/BUILD.gn index 21a31dbf..854cb52 100644 --- a/mandoline/app/desktop/BUILD.gn +++ b/mandoline/app/desktop/BUILD.gn
@@ -20,12 +20,12 @@ "//components/tracing:startup_tracing", "//mojo/common", "//mojo/environment:chromium", - "//mojo/runner:lib", - "//mojo/runner:register_local_aliases_fwd", "//mojo/shell", "//mojo/shell/package_manager", "//mojo/shell/runner/host:lib", "//mojo/shell/runner/host:switches", + "//mojo/shell/standalone:lib", + "//mojo/shell/standalone:register_local_aliases_fwd", ] data_deps = [
diff --git a/mandoline/app/desktop/main.cc b/mandoline/app/desktop/main.cc index ddfe4dd9..51b6ee7 100644 --- a/mandoline/app/desktop/main.cc +++ b/mandoline/app/desktop/main.cc
@@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/desktop/main_helper.h" +#include "mojo/shell/standalone/desktop/main_helper.h" int main(int argc, char** argv) { - return mojo::runner::RunnerMain(argc, argv, GURL("mojo:desktop_ui"), - base::Closure()); + return mojo::shell::StandaloneShellMain(argc, argv, GURL("mojo:desktop_ui"), + base::Closure()); }
diff --git a/mandoline/app/register_local_aliases.cc b/mandoline/app/register_local_aliases.cc index 3cc613fc..9d4e1eed 100644 --- a/mandoline/app/register_local_aliases.cc +++ b/mandoline/app/register_local_aliases.cc
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/register_local_aliases.h" +#include "mojo/shell/standalone/register_local_aliases.h" #include "mojo/shell/package_manager/package_manager_impl.h" namespace mojo { -namespace runner { +namespace shell { -void RegisterLocalAliases(shell::PackageManagerImpl* manager) { +void RegisterLocalAliases(PackageManagerImpl* manager) { // TODO(erg): We should probably handle this differently; these could be // autogenerated from package manifests. manager->RegisterApplicationPackageAlias( @@ -37,5 +37,5 @@ GURL("mojo:tracing"), GURL("mojo:core_services"), "Core"); } -} // namespace runner +} // namespace shell } // namespace mojo
diff --git a/mash/example/BUILD.gn b/mash/example/BUILD.gn index a61ace5..7b2e0ea 100644 --- a/mash/example/BUILD.gn +++ b/mash/example/BUILD.gn
@@ -11,6 +11,6 @@ "//mash/example/views_examples", "//mash/example/window_type_launcher", "//mash/wm", - "//mojo/runner:mojo_runner", + "//mojo/shell/standalone", ] }
diff --git a/media/audio/mac/audio_low_latency_input_mac.cc b/media/audio/mac/audio_low_latency_input_mac.cc index da84e95..70a9d2c 100644 --- a/media/audio/mac/audio_low_latency_input_mac.cc +++ b/media/audio/mac/audio_low_latency_input_mac.cc
@@ -784,6 +784,7 @@ } void AUAudioInputStream::HandleError(OSStatus err) { + UMA_HISTOGRAM_SPARSE_SLOWLY("Media.InputErrorMac", err); NOTREACHED() << "error " << GetMacOSStatusErrorString(err) << " (" << err << ")"; if (sink_)
diff --git a/media/media_unittests_apk.isolate b/media/media_unittests_apk.isolate index 6ddeba89..433f68d2 100644 --- a/media/media_unittests_apk.isolate +++ b/media/media_unittests_apk.isolate
@@ -9,6 +9,7 @@ 'variables': { 'command': [ '<(PRODUCT_DIR)/bin/run_media_unittests', + '--logcat-output-dir', '${ISOLATED_OUTDIR}/logcats', ], 'files': [ '../base/base.isolate',
diff --git a/mojo/BUILD.gn b/mojo/BUILD.gn index 64a93170..8f0ee8d9 100644 --- a/mojo/BUILD.gn +++ b/mojo/BUILD.gn
@@ -24,10 +24,7 @@ deps += [ "//mojo/android" ] } - deps += [ - "//mojo/runner", - "//mojo/shell:all", - ] + deps += [ "//mojo/shell:all" ] } # TODO(GYP): Delete this after we've converted everything to GN. @@ -105,6 +102,6 @@ ] if (is_android) { - deps += [ "//mojo/runner:mojo_runner_apptests_apk" ] + deps += [ "//mojo/shell/standalone:mojo_shell_standalone_apptests_apk" ] } }
diff --git a/mojo/public/mojo_application.gni b/mojo/public/mojo_application.gni index c310eb6..e481063 100644 --- a/mojo/public/mojo_application.gni +++ b/mojo/public/mojo_application.gni
@@ -79,7 +79,7 @@ if (!defined(invoker.avoid_runner_cycle) || !invoker.avoid_runner_cycle) { # Give the user an out; as some mojo services are depended on by the # runner. - data_deps += [ "//mojo/runner:mojo_runner" ] + data_deps += [ "//mojo/shell/standalone" ] } if (defined(invoker.data_deps)) { data_deps += invoker.data_deps @@ -126,10 +126,10 @@ copy(final_target_name) { forward_variables_from(invoker, - [ - "testonly", - "visibility", - ]) + [ + "testonly", + "visibility", + ]) deps = [ ":${library_target_name}", ]
diff --git a/mojo/runner/desktop/main_helper.h b/mojo/runner/desktop/main_helper.h deleted file mode 100644 index 09c135d..0000000 --- a/mojo/runner/desktop/main_helper.h +++ /dev/null
@@ -1,25 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_RUNNER_DESKTOP_MAIN_HELPER_H -#define MOJO_RUNNER_DESKTOP_MAIN_HELPER_H - -#include "base/callback.h" -#include "url/gurl.h" - -namespace mojo { -namespace runner { - -// Helper method to start Mojo Runner code. -// If |mojo_url| is not empty, the given mojo application is started. Otherwise, -// an application must have been specified on the command line and it is run. -// |callback| is only called in the later case. -int RunnerMain(int argc, char** argv, - const GURL& mojo_url, - const base::Closure& callback); - -} // namespace runner -} // namespace mojo - -#endif // MOJO_RUNNER_DESKTOP_MAIN_HELPER_H
diff --git a/mojo/runner/register_local_aliases.cc b/mojo/runner/register_local_aliases.cc deleted file mode 100644 index 6323cb2..0000000 --- a/mojo/runner/register_local_aliases.cc +++ /dev/null
@@ -1,13 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/runner/register_local_aliases.h" - -namespace mojo { -namespace runner { - -void RegisterLocalAliases(shell::PackageManagerImpl* manager) {} - -} // namespace runner -} // namespace mojo
diff --git a/mojo/runner/register_local_aliases.h b/mojo/runner/register_local_aliases.h deleted file mode 100644 index 4ca3688..0000000 --- a/mojo/runner/register_local_aliases.h +++ /dev/null
@@ -1,20 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_RUNNER_REGISTER_LOCAL_ALIASES_H_ -#define MOJO_RUNNER_REGISTER_LOCAL_ALIASES_H_ - -namespace mojo { -namespace shell { -class PackageManagerImpl; -} - -namespace runner { - -void RegisterLocalAliases(shell::PackageManagerImpl* manager); - -} // namespace runner -} // namespace mojo - -#endif // MOJO_RUNNER_REGISTER_LOCAL_ALIASES_H_
diff --git a/mojo/runner/BUILD.gn b/mojo/shell/standalone/BUILD.gn similarity index 91% rename from mojo/runner/BUILD.gn rename to mojo/shell/standalone/BUILD.gn index 265e441..a84b7212 100644 --- a/mojo/runner/BUILD.gn +++ b/mojo/shell/standalone/BUILD.gn
@@ -6,14 +6,6 @@ import("//mojo/public/tools/bindings/mojom.gni") import("//testing/test.gni") -group("runner") { - testonly = true - - deps = [ - ":mojo_runner", - ] -} - if (is_android) { import("//build/config/android/config.gni") import("//build/config/android/rules.gni") @@ -25,7 +17,10 @@ ] } -source_set("mojo_runner_lib") { +# main() entrypoint definition is structured into a static lib for Android's +# benefit, as it is shared between the standalone executable and other +# executables (e.g. Mandoline). +source_set("main_lib") { sources = [] deps = [ @@ -68,9 +63,10 @@ } } -executable("mojo_runner") { +executable("standalone") { + output_name = "mojo_runner" deps = [ - ":mojo_runner_lib", + ":main_lib", "//build/config/sanitizers:deps", ] @@ -259,12 +255,12 @@ ":bootstrap_java", ] sources = [ - "$root_out_dir/obj/mojo/runner/bootstrap_java.dex.jar", + "$root_out_dir/obj/mojo/shell/standalone/bootstrap_java.dex.jar", "$root_shlib_dir/${shlib_prefix}bootstrap$shlib_extension", ] } - android_assets("mojo_runner_apptests_assets") { + android_assets("mojo_shell_standalone_apptests_assets") { testonly = true deps = [ ":android_assets", @@ -279,7 +275,7 @@ ] } - copy("copy_mojo_runner") { + copy("copy_mojo_shell_standalone") { sources = [ "$root_out_dir/mojo_runner", ] @@ -287,11 +283,11 @@ "$root_shlib_dir/${shlib_prefix}mojo_runner$shlib_extension", ] deps = [ - ":mojo_runner", + ":standalone", ] } - android_apk("mojo_runner_apptests_apk") { + android_apk("mojo_shell_standalone_apptests_apk") { testonly = true apk_name = "MojoRunnerApptests" android_manifest = "android/apk/AndroidManifest.xml" @@ -299,9 +295,9 @@ write_asset_list = true deps = [ - ":copy_mojo_runner", + ":copy_mojo_shell_standalone", ":java", - ":mojo_runner_apptests_assets", + ":mojo_shell_standalone_apptests_assets", ":resources", "//base:base_java", "//ui/platform_window/android:platform_window_java",
diff --git a/mojo/runner/DEPS b/mojo/shell/standalone/DEPS similarity index 100% rename from mojo/runner/DEPS rename to mojo/shell/standalone/DEPS
diff --git a/mojo/runner/PRESUBMIT.py b/mojo/shell/standalone/PRESUBMIT.py similarity index 100% rename from mojo/runner/PRESUBMIT.py rename to mojo/shell/standalone/PRESUBMIT.py
diff --git a/mojo/runner/android/android_handler.cc b/mojo/shell/standalone/android/android_handler.cc similarity index 93% rename from mojo/runner/android/android_handler.cc rename to mojo/shell/standalone/android/android_handler.cc index 857a48f..dbc41ad2 100644 --- a/mojo/runner/android/android_handler.cc +++ b/mojo/shell/standalone/android/android_handler.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/android/android_handler.h" +#include "mojo/shell/standalone/android/android_handler.h" #include <stddef.h> #include <utility> @@ -16,9 +16,9 @@ #include "jni/AndroidHandler_jni.h" #include "mojo/common/data_pipe_utils.h" #include "mojo/public/c/system/main.h" -#include "mojo/runner/android/run_android_application_function.h" #include "mojo/shell/public/cpp/application_impl.h" #include "mojo/shell/runner/host/native_application_support.h" +#include "mojo/shell/standalone/android/run_android_application_function.h" #include "mojo/util/filename_util.h" #include "url/gurl.h" @@ -29,7 +29,7 @@ using base::android::GetApplicationContext; namespace mojo { -namespace runner { +namespace shell { namespace { @@ -47,7 +47,7 @@ // Load the library, so that we can set the application context there if // needed. // TODO(vtl): We'd use a ScopedNativeLibrary, but it doesn't have .get()! - base::NativeLibrary app_library = shell::LoadNativeApplication(app_path); + base::NativeLibrary app_library = LoadNativeApplication(app_path); if (!app_library) return; @@ -68,7 +68,7 @@ } // Run the application. - shell::RunNativeApplication(app_library, std::move(application_request)); + RunNativeApplication(app_library, std::move(application_request)); // TODO(vtl): See note about unloading and thread-local destructors above // declaration of |LoadNativeApplication()|. base::UnloadNativeLibrary(app_library); @@ -127,11 +127,9 @@ } // namespace -AndroidHandler::AndroidHandler() : content_handler_factory_(this) { -} +AndroidHandler::AndroidHandler() : content_handler_factory_(this) {} -AndroidHandler::~AndroidHandler() { -} +AndroidHandler::~AndroidHandler() {} void AndroidHandler::RunApplication( InterfaceRequest<Application> application_request, @@ -167,8 +165,7 @@ reinterpret_cast<jlong>(run_android_application_fn)); } -void AndroidHandler::Initialize(ApplicationImpl* app) { -} +void AndroidHandler::Initialize(ApplicationImpl* app) {} bool AndroidHandler::ConfigureIncomingConnection( ApplicationConnection* connection) { @@ -180,5 +177,5 @@ return RegisterNativesImpl(env); } -} // namespace runner +} // namespace shell } // namespace mojo
diff --git a/mojo/runner/android/android_handler.h b/mojo/shell/standalone/android/android_handler.h similarity index 84% rename from mojo/runner/android/android_handler.h rename to mojo/shell/standalone/android/android_handler.h index 43a535f..7df74fae 100644 --- a/mojo/runner/android/android_handler.h +++ b/mojo/shell/standalone/android/android_handler.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MOJO_RUNNER_ANDROID_ANDROID_HANDLER_H_ -#define MOJO_RUNNER_ANDROID_ANDROID_HANDLER_H_ +#ifndef MOJO_SHELL_STANDALONE_ANDROID_ANDROID_HANDLER_H_ +#define MOJO_SHELL_STANDALONE_ANDROID_ANDROID_HANDLER_H_ #include <jni.h> @@ -17,7 +17,7 @@ } namespace mojo { -namespace runner { +namespace shell { class AndroidHandler : public ApplicationDelegate, public ContentHandlerFactory::Delegate { @@ -40,7 +40,7 @@ bool RegisterAndroidHandlerJni(JNIEnv* env); -} // namespace runner +} // namespace shell } // namespace mojo -#endif // MOJO_RUNNER_ANDROID_ANDROID_HANDLER_H_ +#endif // MOJO_SHELL_STANDALONE_ANDROID_ANDROID_HANDLER_H_
diff --git a/mojo/runner/android/android_handler_loader.cc b/mojo/shell/standalone/android/android_handler_loader.cc similarity index 70% rename from mojo/runner/android/android_handler_loader.cc rename to mojo/shell/standalone/android/android_handler_loader.cc index fa656c9..ef7b202 100644 --- a/mojo/runner/android/android_handler_loader.cc +++ b/mojo/shell/standalone/android/android_handler_loader.cc
@@ -2,18 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/android/android_handler_loader.h" +#include "mojo/shell/standalone/android/android_handler_loader.h" #include <utility> namespace mojo { -namespace runner { +namespace shell { -AndroidHandlerLoader::AndroidHandlerLoader() { -} +AndroidHandlerLoader::AndroidHandlerLoader() {} -AndroidHandlerLoader::~AndroidHandlerLoader() { -} +AndroidHandlerLoader::~AndroidHandlerLoader() {} void AndroidHandlerLoader::Load( const GURL& url, @@ -23,5 +21,5 @@ new ApplicationImpl(&android_handler_, std::move(application_request))); } -} // namespace runner +} // namespace shell } // namespace mojo
diff --git a/mojo/runner/android/android_handler_loader.h b/mojo/shell/standalone/android/android_handler_loader.h similarity index 68% rename from mojo/runner/android/android_handler_loader.h rename to mojo/shell/standalone/android/android_handler_loader.h index 8c8e4e4..01367429 100644 --- a/mojo/runner/android/android_handler_loader.h +++ b/mojo/shell/standalone/android/android_handler_loader.h
@@ -2,20 +2,20 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MOJO_RUNNER_ANDROID_ANDROID_HANDLER_LOADER_H_ -#define MOJO_RUNNER_ANDROID_ANDROID_HANDLER_LOADER_H_ +#ifndef MOJO_SHELL_STANDALONE_ANDROID_ANDROID_HANDLER_LOADER_H_ +#define MOJO_SHELL_STANDALONE_ANDROID_ANDROID_HANDLER_LOADER_H_ #include "base/containers/scoped_ptr_hash_map.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" -#include "mojo/runner/android/android_handler.h" #include "mojo/shell/application_loader.h" #include "mojo/shell/public/cpp/application_impl.h" +#include "mojo/shell/standalone/android/android_handler.h" namespace mojo { -namespace runner { +namespace shell { -class AndroidHandlerLoader : public shell::ApplicationLoader { +class AndroidHandlerLoader : public ApplicationLoader { public: AndroidHandlerLoader(); virtual ~AndroidHandlerLoader(); @@ -31,7 +31,7 @@ DISALLOW_COPY_AND_ASSIGN(AndroidHandlerLoader); }; -} // namespace runner +} // namespace shell } // namespace mojo -#endif // MOJO_RUNNER_ANDROID_ANDROID_HANDLER_LOADER_H_ +#endif // MOJO_SHELL_STANDALONE_ANDROID_ANDROID_HANDLER_LOADER_H_
diff --git a/mojo/runner/android/apk/AndroidManifest.xml b/mojo/shell/standalone/android/apk/AndroidManifest.xml similarity index 100% rename from mojo/runner/android/apk/AndroidManifest.xml rename to mojo/shell/standalone/android/apk/AndroidManifest.xml
diff --git a/mojo/runner/android/apk/res/values/strings.xml b/mojo/shell/standalone/android/apk/res/values/strings.xml similarity index 100% rename from mojo/runner/android/apk/res/values/strings.xml rename to mojo/shell/standalone/android/apk/res/values/strings.xml
diff --git a/mojo/runner/android/apk/src/org/chromium/mojo/shell/AndroidHandler.java b/mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/AndroidHandler.java similarity index 97% rename from mojo/runner/android/apk/src/org/chromium/mojo/shell/AndroidHandler.java rename to mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/AndroidHandler.java index 8516e634..7a09c04 100644 --- a/mojo/runner/android/apk/src/org/chromium/mojo/shell/AndroidHandler.java +++ b/mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/AndroidHandler.java
@@ -23,7 +23,7 @@ * TODO(ppi): create a separate instance for each application being bootstrapped to keep track of * the temporary files and clean them up once the execution finishes. */ -@JNINamespace("mojo::runner") +@JNINamespace("mojo::shell") public class AndroidHandler { private static final String TAG = "AndroidHandler"; @@ -63,8 +63,8 @@ */ @CalledByNative private static String getNewTempArchivePath(Context context) throws IOException { - return File.createTempFile(ARCHIVE_PREFIX, ARCHIVE_SUFFIX, - getAppDir(context)).getAbsolutePath(); + return File.createTempFile(ARCHIVE_PREFIX, ARCHIVE_SUFFIX, getAppDir(context)) + .getAbsolutePath(); } /** @@ -78,8 +78,8 @@ * payload. */ @CalledByNative - private static boolean bootstrap(Context context, String archivePath, int handle, - long runApplicationPtr) { + private static boolean bootstrap( + Context context, String archivePath, int handle, long runApplicationPtr) { File bootstrapJavaLibrary; File bootstrapNativeLibrary; try { @@ -103,7 +103,7 @@ getAppDir(context), FileHelper.FileType.TEMPORARY, FileHelper.ArchiveType.NORMAL); } catch (Exception e) { - Log.e(TAG, "Extraction of application files from the archive failed.", e); + Log.e(TAG, "Extraction of application files from the archive failed.", e); return false; }
diff --git a/mojo/runner/android/apk/src/org/chromium/mojo/shell/Bootstrap.java b/mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/Bootstrap.java similarity index 97% rename from mojo/runner/android/apk/src/org/chromium/mojo/shell/Bootstrap.java rename to mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/Bootstrap.java index 4f21f2d..3899bc7 100644 --- a/mojo/runner/android/apk/src/org/chromium/mojo/shell/Bootstrap.java +++ b/mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/Bootstrap.java
@@ -15,7 +15,7 @@ * Java class with the application classloader in the call stack. We load this class in the * application classloader and call into native from it to achieve that. */ -@JNINamespace("mojo::runner") +@JNINamespace("mojo::shell") public class Bootstrap implements Runnable { private final Context mContext; private final File mBootstrapNativeLibrary;
diff --git a/mojo/runner/android/apk/src/org/chromium/mojo/shell/FileHelper.java b/mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/FileHelper.java similarity index 98% rename from mojo/runner/android/apk/src/org/chromium/mojo/shell/FileHelper.java rename to mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/FileHelper.java index a6d814e..b8da063 100644 --- a/mojo/runner/android/apk/src/org/chromium/mojo/shell/FileHelper.java +++ b/mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/FileHelper.java
@@ -169,8 +169,8 @@ outputFile.getParentFile().mkdirs(); } - BufferedInputStream inputStream = new BufferedInputStream( - context.getAssets().open(assetName)); + BufferedInputStream inputStream = + new BufferedInputStream(context.getAssets().open(assetName)); try { writeStreamToFile(inputStream, outputFile); } finally {
diff --git a/mojo/runner/android/apk/src/org/chromium/mojo/shell/MojoShellActivity.java b/mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/MojoShellActivity.java similarity index 100% rename from mojo/runner/android/apk/src/org/chromium/mojo/shell/MojoShellActivity.java rename to mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/MojoShellActivity.java
diff --git a/mojo/runner/android/apk/src/org/chromium/mojo/shell/MojoShellApplication.java b/mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/MojoShellApplication.java similarity index 96% rename from mojo/runner/android/apk/src/org/chromium/mojo/shell/MojoShellApplication.java rename to mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/MojoShellApplication.java index 9a0fce07..75f4df4 100644 --- a/mojo/runner/android/apk/src/org/chromium/mojo/shell/MojoShellApplication.java +++ b/mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/MojoShellApplication.java
@@ -47,8 +47,8 @@ */ private void initializeNative() { try { - LibraryLoader.get(LibraryProcessType.PROCESS_BROWSER).ensureInitialized( - getApplicationContext()); + LibraryLoader.get(LibraryProcessType.PROCESS_BROWSER) + .ensureInitialized(getApplicationContext()); } catch (ProcessInitException e) { Log.e(TAG, "libmojo_runner initialization failed.", e); throw new RuntimeException(e);
diff --git a/mojo/runner/android/apk/src/org/chromium/mojo/shell/ShellMain.java b/mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/ShellMain.java similarity index 98% rename from mojo/runner/android/apk/src/org/chromium/mojo/shell/ShellMain.java rename to mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/ShellMain.java index d0c2b6ee..4659e3a 100644 --- a/mojo/runner/android/apk/src/org/chromium/mojo/shell/ShellMain.java +++ b/mojo/shell/standalone/android/apk/src/org/chromium/mojo/shell/ShellMain.java
@@ -23,14 +23,13 @@ /** * A placeholder class to call native functions. **/ -@JNINamespace("mojo::runner") +@JNINamespace("mojo::shell") public class ShellMain { private static final String TAG = "ShellMain"; // The key to the library to run in forked processes when running multi-process. private static final String MOJO_LIB_KEY = "mojo_lib"; - /** * A guard flag for calling nativeInit() only once. **/
diff --git a/mojo/runner/android/background_application_loader.cc b/mojo/shell/standalone/android/background_application_loader.cc similarity index 95% rename from mojo/runner/android/background_application_loader.cc rename to mojo/shell/standalone/android/background_application_loader.cc index d9a85332..da433e7 100644 --- a/mojo/runner/android/background_application_loader.cc +++ b/mojo/shell/standalone/android/background_application_loader.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/android/background_application_loader.h" +#include "mojo/shell/standalone/android/background_application_loader.h" #include <utility> @@ -11,7 +11,7 @@ #include "mojo/shell/application_manager.h" namespace mojo { -namespace runner { +namespace shell { BackgroundApplicationLoader::BackgroundApplicationLoader( scoped_ptr<ApplicationLoader> real_loader, @@ -70,5 +70,5 @@ loader_->Load(url, std::move(application_request)); } -} // namespace runner +} // namespace shell } // namespace mojo
diff --git a/mojo/runner/android/background_application_loader.h b/mojo/shell/standalone/android/background_application_loader.h similarity index 81% rename from mojo/runner/android/background_application_loader.h rename to mojo/shell/standalone/android/background_application_loader.h index 9ced9a8..2e25e554 100644 --- a/mojo/runner/android/background_application_loader.h +++ b/mojo/shell/standalone/android/background_application_loader.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MOJO_RUNNER_ANDROID_BACKGROUND_APPLICATION_LOADER_H_ -#define MOJO_RUNNER_ANDROID_BACKGROUND_APPLICATION_LOADER_H_ +#ifndef MOJO_SHELL_STANDALONE_ANDROID_BACKGROUND_APPLICATION_LOADER_H_ +#define MOJO_SHELL_STANDALONE_ANDROID_BACKGROUND_APPLICATION_LOADER_H_ #include "base/macros.h" #include "base/memory/scoped_ptr.h" @@ -13,13 +13,13 @@ #include "mojo/shell/application_loader.h" namespace mojo { -namespace runner { +namespace shell { class BackgroundApplicationLoader - : public shell::ApplicationLoader, + : public ApplicationLoader, public base::DelegateSimpleThread::Delegate { public: - BackgroundApplicationLoader(scoped_ptr<shell::ApplicationLoader> real_loader, + BackgroundApplicationLoader(scoped_ptr<ApplicationLoader> real_loader, const std::string& thread_name, base::MessageLoop::Type message_loop_type); ~BackgroundApplicationLoader() override; @@ -38,7 +38,7 @@ const GURL& url, InterfaceRequest<Application> application_request); bool quit_on_shutdown_; - scoped_ptr<shell::ApplicationLoader> loader_; + scoped_ptr<ApplicationLoader> loader_; const base::MessageLoop::Type message_loop_type_; const std::string thread_name_; @@ -58,7 +58,7 @@ DISALLOW_COPY_AND_ASSIGN(BackgroundApplicationLoader); }; -} // namespace runner +} // namespace shell } // namespace mojo -#endif // MOJO_RUNNER_ANDROID_BACKGROUND_APPLICATION_LOADER_H_ +#endif // MOJO_SHELL_STANDALONE_ANDROID_BACKGROUND_APPLICATION_LOADER_H_
diff --git a/mojo/runner/android/background_application_loader_unittest.cc b/mojo/shell/standalone/android/background_application_loader_unittest.cc similarity index 71% rename from mojo/runner/android/background_application_loader_unittest.cc rename to mojo/shell/standalone/android/background_application_loader_unittest.cc index 7201a63e..9f66bf1 100644 --- a/mojo/runner/android/background_application_loader_unittest.cc +++ b/mojo/shell/standalone/android/background_application_loader_unittest.cc
@@ -2,21 +2,21 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/android/background_application_loader.h" +#include "mojo/shell/standalone/android/background_application_loader.h" #include "mojo/shell/public/interfaces/application.mojom.h" #include "testing/gtest/include/gtest/gtest.h" namespace mojo { -namespace runner { +namespace shell { namespace { -class DummyLoader : public shell::ApplicationLoader { +class DummyLoader : public ApplicationLoader { public: DummyLoader() : simulate_app_quit_(true) {} ~DummyLoader() override {} - // shell::ApplicationLoader overrides: + // ApplicationLoader overrides: void Load(const GURL& url, InterfaceRequest<Application> application_request) override { if (simulate_app_quit_) @@ -31,21 +31,21 @@ // Tests that the loader can start and stop gracefully. TEST(BackgroundApplicationLoaderTest, StartStop) { - scoped_ptr<shell::ApplicationLoader> real_loader(new DummyLoader()); - BackgroundApplicationLoader loader(real_loader.Pass(), "test", + scoped_ptr<ApplicationLoader> real_loader(new DummyLoader()); + BackgroundApplicationLoader loader(std::move(real_loader), "test", base::MessageLoop::TYPE_DEFAULT); } // Tests that the loader can load a service that is well behaved (quits // itself). TEST(BackgroundApplicationLoaderTest, Load) { - scoped_ptr<shell::ApplicationLoader> real_loader(new DummyLoader()); - BackgroundApplicationLoader loader(real_loader.Pass(), "test", + scoped_ptr<ApplicationLoader> real_loader(new DummyLoader()); + BackgroundApplicationLoader loader(std::move(real_loader), "test", base::MessageLoop::TYPE_DEFAULT); ApplicationPtr application; loader.Load(GURL(), GetProxy(&application)); } } // namespace -} // namespace runner +} // namespace shell } // namespace mojo
diff --git a/mojo/runner/android/bootstrap.cc b/mojo/shell/standalone/android/bootstrap.cc similarity index 87% rename from mojo/runner/android/bootstrap.cc rename to mojo/shell/standalone/android/bootstrap.cc index 4f1b394..39b6901d 100644 --- a/mojo/runner/android/bootstrap.cc +++ b/mojo/shell/standalone/android/bootstrap.cc
@@ -7,10 +7,10 @@ #include "base/files/file_path.h" #include "base/logging.h" #include "jni/Bootstrap_jni.h" -#include "mojo/runner/android/run_android_application_function.h" +#include "mojo/shell/standalone/android/run_android_application_function.h" namespace mojo { -namespace runner { +namespace shell { void Bootstrap(JNIEnv* env, const JavaParamRef<jobject>&, @@ -29,14 +29,14 @@ return RegisterNativesImpl(env); } -} // namespace runner +} // namespace shell } // namespace mojo JNI_EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { base::android::InitVM(vm); JNIEnv* env = base::android::AttachCurrentThread(); - if (!mojo::runner::RegisterBootstrapJni(env)) + if (!mojo::shell::RegisterBootstrapJni(env)) return -1; return JNI_VERSION_1_4;
diff --git a/mojo/runner/android/context_init.cc b/mojo/shell/standalone/android/context_init.cc similarity index 60% rename from mojo/runner/android/context_init.cc rename to mojo/shell/standalone/android/context_init.cc index cf4831d787..14ac0562 100644 --- a/mojo/runner/android/context_init.cc +++ b/mojo/shell/standalone/android/context_init.cc
@@ -2,13 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/android/context_init.h" +#include "mojo/shell/standalone/android/context_init.h" namespace mojo { -namespace runner { +namespace shell { -void InitContext(Context* context) { -} +void InitContext(Context* context) {} -} // namespace runner +} // namespace shell } // namespace mojo
diff --git a/mojo/runner/android/context_init.h b/mojo/shell/standalone/android/context_init.h similarity index 60% rename from mojo/runner/android/context_init.h rename to mojo/shell/standalone/android/context_init.h index 0f30bce..edf55cf 100644 --- a/mojo/runner/android/context_init.h +++ b/mojo/shell/standalone/android/context_init.h
@@ -2,18 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MOJO_RUNNER_ANDROID_CONTEXT_INIT_H_ -#define MOJO_RUNNER_ANDROID_CONTEXT_INIT_H_ +#ifndef MOJO_SHELL_STANDALONE_ANDROID_CONTEXT_INIT_H_ +#define MOJO_SHELL_STANDALONE_ANDROID_CONTEXT_INIT_H_ namespace mojo { -namespace runner { +namespace shell { class Context; // Any Context specific initialization goes here. void InitContext(Context* context); -} // namespace runner +} // namespace shell } // namespace mojo -#endif // MOJO_RUNNER_ANDROID_CONTEXT_INIT_H_ +#endif // MOJO_SHELL_STANDALONE_ANDROID_CONTEXT_INIT_H_
diff --git a/mojo/runner/android/library_loader.cc b/mojo/shell/standalone/android/library_loader.cc similarity index 86% rename from mojo/runner/android/library_loader.cc rename to mojo/shell/standalone/android/library_loader.cc index b0dd98cd..9ef3d97 100644 --- a/mojo/runner/android/library_loader.cc +++ b/mojo/shell/standalone/android/library_loader.cc
@@ -7,19 +7,19 @@ #include "base/android/jni_android.h" #include "base/android/jni_registrar.h" #include "base/bind.h" -#include "mojo/runner/android/android_handler.h" -#include "mojo/runner/android/main.h" +#include "mojo/shell/standalone/android/android_handler.h" +#include "mojo/shell/standalone/android/main.h" #include "ui/platform_window/android/platform_ime_controller_android.h" #include "ui/platform_window/android/platform_window_android.h" namespace { base::android::RegistrationMethod kMojoRegisteredMethods[] = { - {"AndroidHandler", mojo::runner::RegisterAndroidHandlerJni}, + {"AndroidHandler", mojo::shell::RegisterAndroidHandlerJni}, {"PlatformImeControllerAndroid", ui::PlatformImeControllerAndroid::Register}, {"PlatformWindowAndroid", ui::PlatformWindowAndroid::Register}, - {"ShellMain", mojo::runner::RegisterShellMain}, + {"ShellMain", mojo::shell::RegisterShellMain}, }; bool RegisterJNI(JNIEnv* env) {
diff --git a/mojo/runner/android/main.cc b/mojo/shell/standalone/android/main.cc similarity index 90% rename from mojo/runner/android/main.cc rename to mojo/shell/standalone/android/main.cc index 229c690..9fffd84 100644 --- a/mojo/runner/android/main.cc +++ b/mojo/shell/standalone/android/main.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/android/main.h" +#include "mojo/shell/standalone/android/main.h" #include "base/android/fifo_utils.h" #include "base/android/jni_android.h" @@ -23,20 +23,20 @@ #include "components/mus/android_loader.h" #include "jni/ShellMain_jni.h" #include "mojo/message_pump/message_pump_mojo.h" -#include "mojo/runner/android/android_handler_loader.h" -#include "mojo/runner/android/background_application_loader.h" -#include "mojo/runner/android/context_init.h" -#include "mojo/runner/android/ui_application_loader_android.h" -#include "mojo/runner/context.h" #include "mojo/shell/application_loader.h" #include "mojo/shell/runner/host/child_process.h" #include "mojo/shell/runner/init.h" +#include "mojo/shell/standalone/android/android_handler_loader.h" +#include "mojo/shell/standalone/android/background_application_loader.h" +#include "mojo/shell/standalone/android/context_init.h" +#include "mojo/shell/standalone/android/ui_application_loader_android.h" +#include "mojo/shell/standalone/context.h" #include "ui/gl/gl_surface_egl.h" using base::LazyInstance; namespace mojo { -namespace runner { +namespace shell { namespace { @@ -86,8 +86,8 @@ CHECK(base::CreateDirectoryAndGetError(directory, nullptr)) << "Unable to create directory: " << directory.value(); unlink(fifo_path.value().c_str()); - CHECK(base::android::CreateFIFO(fifo_path, 0666)) - << "Unable to create fifo: " << fifo_path.value(); + CHECK(base::android::CreateFIFO(fifo_path, 0666)) << "Unable to create fifo: " + << fifo_path.value(); CHECK(base::android::RedirectStream(stdout, fifo_path, "w")) << "Failed to redirect stdout to file: " << fifo_path.value(); CHECK(dup2(STDOUT_FILENO, STDERR_FILENO) != -1) @@ -120,8 +120,8 @@ base::CommandLine::Init(0, nullptr); base::CommandLine::ForCurrentProcess()->InitFromArgv(parameters); - mojo::shell::InitializeLogging(); - mojo::shell::WaitForDebuggerIfNecessary(); + InitializeLogging(); + WaitForDebuggerIfNecessary(); InitializeRedirection(); @@ -176,7 +176,7 @@ return g_context.Get().get(); } -} // namespace runner +} // namespace shell } // namespace mojo int main(int argc, char** argv) {
diff --git a/mojo/runner/android/main.h b/mojo/shell/standalone/android/main.h similarity index 62% rename from mojo/runner/android/main.h rename to mojo/shell/standalone/android/main.h index ce33246..a66aaea 100644 --- a/mojo/runner/android/main.h +++ b/mojo/shell/standalone/android/main.h
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MOJO_RUNNER_ANDROID_MAIN_H_ -#define MOJO_RUNNER_ANDROID_MAIN_H_ +#ifndef MOJO_SHELL_STANDALONE_ANDROID_MAIN_H_ +#define MOJO_SHELL_STANDALONE_ANDROID_MAIN_H_ #include <jni.h> namespace mojo { -namespace runner { +namespace shell { class Context; @@ -16,7 +16,7 @@ Context* GetContext(); -} // namespace runner +} // namespace shell } // namespace mojo -#endif // MOJO_RUNNER_ANDROID_MAIN_H_ +#endif // MOJO_SHELL_STANDALONE_ANDROID_MAIN_H_
diff --git a/mojo/runner/android/run_android_application_function.h b/mojo/shell/standalone/android/run_android_application_function.h similarity index 75% rename from mojo/runner/android/run_android_application_function.h rename to mojo/shell/standalone/android/run_android_application_function.h index 8b4295e..cedfd45 100644 --- a/mojo/runner/android/run_android_application_function.h +++ b/mojo/shell/standalone/android/run_android_application_function.h
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MOJO_RUNNER_ANDROID_RUN_ANDROID_APPLICATION_FUNCTION_H_ -#define MOJO_RUNNER_ANDROID_RUN_ANDROID_APPLICATION_FUNCTION_H_ +#ifndef MOJO_SHELL_STANDALONE_ANDROID_RUN_ANDROID_APPLICATION_FUNCTION_H_ +#define MOJO_SHELL_STANDALONE_ANDROID_RUN_ANDROID_APPLICATION_FUNCTION_H_ #include "base/android/jni_android.h" #include "base/files/file_path.h" namespace mojo { -namespace runner { +namespace shell { // Type of the function that we inject from the main .so of the Mojo shell to // the helper libbootstrap.so. This function will set the thunks in the @@ -21,7 +21,7 @@ const base::FilePath& app_path, jint j_handle); -} // namespace runner +} // namespace shell } // namespace mojo -#endif // MOJO_RUNNER_ANDROID_RUN_ANDROID_APPLICATION_FUNCTION_H_ +#endif // MOJO_SHELL_STANDALONE_ANDROID_RUN_ANDROID_APPLICATION_FUNCTION_H_
diff --git a/mojo/runner/android/ui_application_loader_android.cc b/mojo/shell/standalone/android/ui_application_loader_android.cc similarity index 92% rename from mojo/runner/android/ui_application_loader_android.cc rename to mojo/shell/standalone/android/ui_application_loader_android.cc index 01c5749..10ec4487 100644 --- a/mojo/runner/android/ui_application_loader_android.cc +++ b/mojo/shell/standalone/android/ui_application_loader_android.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/android/ui_application_loader_android.h" +#include "mojo/shell/standalone/android/ui_application_loader_android.h" #include <utility> @@ -11,7 +11,7 @@ #include "mojo/shell/application_manager.h" namespace mojo { -namespace runner { +namespace shell { UIApplicationLoader::UIApplicationLoader( scoped_ptr<ApplicationLoader> real_loader, @@ -45,5 +45,5 @@ loader_.reset(); } -} // namespace runner +} // namespace shell } // namespace mojo
diff --git a/mojo/runner/android/ui_application_loader_android.h b/mojo/shell/standalone/android/ui_application_loader_android.h similarity index 80% rename from mojo/runner/android/ui_application_loader_android.h rename to mojo/shell/standalone/android/ui_application_loader_android.h index be2be15..c990ace 100644 --- a/mojo/runner/android/ui_application_loader_android.h +++ b/mojo/shell/standalone/android/ui_application_loader_android.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MOJO_RUNNER_ANDROID_UI_APPLICATION_LOADER_ANDROID_H_ -#define MOJO_RUNNER_ANDROID_UI_APPLICATION_LOADER_ANDROID_H_ +#ifndef MOJO_SHELL_STANDALONE_ANDROID_UI_APPLICATION_LOADER_ANDROID_H_ +#define MOJO_SHELL_STANDALONE_ANDROID_UI_APPLICATION_LOADER_ANDROID_H_ #include "base/macros.h" #include "base/memory/scoped_ptr.h" @@ -14,14 +14,14 @@ } namespace mojo { -namespace runner { +namespace shell { class ApplicationManager; // ApplicationLoader implementation that creates a background thread and issues // load // requests there. -class UIApplicationLoader : public shell::ApplicationLoader { +class UIApplicationLoader : public ApplicationLoader { public: UIApplicationLoader(scoped_ptr<ApplicationLoader> real_loader, base::MessageLoop* ui_message_loop); @@ -48,7 +48,7 @@ DISALLOW_COPY_AND_ASSIGN(UIApplicationLoader); }; -} // namespace runner +} // namespace shell } // namespace mojo -#endif // MOJO_RUNNER_ANDROID_UI_APPLICATION_LOADER_ANDROID_H_ +#endif // MOJO_SHELL_STANDALONE_ANDROID_UI_APPLICATION_LOADER_ANDROID_H_
diff --git a/mojo/runner/context.cc b/mojo/shell/standalone/context.cc similarity index 86% rename from mojo/runner/context.cc rename to mojo/shell/standalone/context.cc index c7b8c9a8..22e94144 100644 --- a/mojo/runner/context.cc +++ b/mojo/shell/standalone/context.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/context.h" +#include "mojo/shell/standalone/context.h" #include <stddef.h> #include <stdint.h> @@ -29,9 +29,6 @@ #include "components/devtools_service/public/interfaces/devtools_service.mojom.h" #include "components/tracing/tracing_switches.h" #include "mojo/public/cpp/bindings/strong_binding.h" -#include "mojo/runner/register_local_aliases.h" -#include "mojo/runner/switches.h" -#include "mojo/runner/tracer.h" #include "mojo/services/tracing/public/cpp/switches.h" #include "mojo/services/tracing/public/cpp/trace_provider_impl.h" #include "mojo/services/tracing/public/cpp/tracing_impl.h" @@ -45,13 +42,16 @@ #include "mojo/shell/query_util.h" #include "mojo/shell/runner/host/in_process_native_runner.h" #include "mojo/shell/runner/host/out_of_process_native_runner.h" +#include "mojo/shell/standalone/register_local_aliases.h" +#include "mojo/shell/standalone/switches.h" +#include "mojo/shell/standalone/tracer.h" #include "mojo/shell/switches.h" #include "mojo/util/filename_util.h" #include "third_party/mojo/src/mojo/edk/embedder/embedder.h" #include "url/gurl.h" namespace mojo { -namespace runner { +namespace shell { namespace { // Used to ensure we only init once. @@ -68,7 +68,7 @@ DISALLOW_COPY_AND_ASSIGN(Setup); }; -void InitContentHandlers(shell::PackageManagerImpl* manager, +void InitContentHandlers(PackageManagerImpl* manager, const base::CommandLine& command_line) { // Default content handlers. manager->RegisterContentHandler("application/javascript", @@ -121,7 +121,7 @@ } } -void InitDevToolsServiceIfNeeded(shell::ApplicationManager* manager, +void InitDevToolsServiceIfNeeded(ApplicationManager* manager, const base::CommandLine& command_line) { if (!command_line.HasSwitch(devtools_service::kRemoteDebuggingPort)) return; @@ -137,13 +137,11 @@ } ServiceProviderPtr devtools_service_provider; - scoped_ptr<shell::ConnectToApplicationParams> params( - new shell::ConnectToApplicationParams); - params->set_source(shell::Identity(GURL("mojo:shell"), std::string(), - shell::GetPermissiveCapabilityFilter())); - params->SetTarget(shell::Identity(GURL("mojo:devtools_service"), - std::string(), - shell::GetPermissiveCapabilityFilter())); + scoped_ptr<ConnectToApplicationParams> params(new ConnectToApplicationParams); + params->set_source(Identity(GURL("mojo:shell"), std::string(), + GetPermissiveCapabilityFilter())); + params->SetTarget(Identity(GURL("mojo:devtools_service"), std::string(), + GetPermissiveCapabilityFilter())); params->set_services(GetProxy(&devtools_service_provider)); manager->ConnectToApplication(std::move(params)); @@ -217,26 +215,26 @@ task_runners_->io_runner(), embedder::ScopedPlatformHandle()); - package_manager_ = new shell::PackageManagerImpl( - shell_file_root, task_runners_->blocking_pool()); + package_manager_ = + new PackageManagerImpl(shell_file_root, task_runners_->blocking_pool()); InitContentHandlers(package_manager_, command_line); RegisterLocalAliases(package_manager_); - scoped_ptr<shell::NativeRunnerFactory> runner_factory; + scoped_ptr<NativeRunnerFactory> runner_factory; if (command_line.HasSwitch(switches::kMojoSingleProcess)) { #if defined(COMPONENT_BUILD) LOG(ERROR) << "Running Mojo in single process component build, which isn't " << "supported because statics in apps interact. Use static build" << " or don't pass --single-process."; #endif - runner_factory.reset(new shell::InProcessNativeRunnerFactory( - task_runners_->blocking_pool())); + runner_factory.reset( + new InProcessNativeRunnerFactory(task_runners_->blocking_pool())); } else { - runner_factory.reset(new shell::OutOfProcessNativeRunnerFactory( - task_runners_->blocking_pool())); + runner_factory.reset( + new OutOfProcessNativeRunnerFactory(task_runners_->blocking_pool())); } - application_manager_.reset(new shell::ApplicationManager( + application_manager_.reset(new ApplicationManager( make_scoped_ptr(package_manager_), std::move(runner_factory), task_runners_->blocking_pool())); @@ -244,12 +242,11 @@ ServiceProviderPtr tracing_exposed_services; new TracingServiceProvider(&tracer_, GetProxy(&tracing_exposed_services)); - scoped_ptr<shell::ConnectToApplicationParams> params( - new shell::ConnectToApplicationParams); - params->set_source(shell::Identity(GURL("mojo:shell"), std::string(), - shell::GetPermissiveCapabilityFilter())); - params->SetTarget(shell::Identity(GURL("mojo:tracing"), std::string(), - shell::GetPermissiveCapabilityFilter())); + scoped_ptr<ConnectToApplicationParams> params(new ConnectToApplicationParams); + params->set_source(Identity(GURL("mojo:shell"), std::string(), + GetPermissiveCapabilityFilter())); + params->SetTarget(Identity(GURL("mojo:tracing"), std::string(), + GetPermissiveCapabilityFilter())); params->set_services(GetProxy(&tracing_services)); params->set_exposed_services(std::move(tracing_exposed_services)); application_manager_->ConnectToApplication(std::move(params)); @@ -311,10 +308,9 @@ app_urls_.insert(url); - scoped_ptr<shell::ConnectToApplicationParams> params( - new shell::ConnectToApplicationParams); - params->SetTarget(shell::Identity(url, std::string(), - shell::GetPermissiveCapabilityFilter())); + scoped_ptr<ConnectToApplicationParams> params(new ConnectToApplicationParams); + params->SetTarget( + Identity(url, std::string(), GetPermissiveCapabilityFilter())); params->set_services(GetProxy(&services)); params->set_exposed_services(std::move(exposed_services)); params->set_on_application_end( @@ -352,5 +348,5 @@ } } -} // namespace runner +} // namespace shell } // namespace mojo
diff --git a/mojo/runner/context.h b/mojo/shell/standalone/context.h similarity index 79% rename from mojo/runner/context.h rename to mojo/shell/standalone/context.h index 2db71887..1a39cfc 100644 --- a/mojo/runner/context.h +++ b/mojo/shell/standalone/context.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MOJO_RUNNER_CONTEXT_H_ -#define MOJO_RUNNER_CONTEXT_H_ +#ifndef MOJO_SHELL_STANDALONE_CONTEXT_H_ +#define MOJO_SHELL_STANDALONE_CONTEXT_H_ #include <set> #include <string> @@ -11,24 +11,21 @@ #include "base/callback_forward.h" #include "base/macros.h" #include "base/time/time.h" -#include "mojo/runner/scoped_user_data_dir.h" -#include "mojo/runner/task_runners.h" -#include "mojo/runner/tracer.h" #include "mojo/shell/application_manager.h" +#include "mojo/shell/standalone/scoped_user_data_dir.h" +#include "mojo/shell/standalone/task_runners.h" +#include "mojo/shell/standalone/tracer.h" #include "third_party/mojo/src/mojo/edk/embedder/process_delegate.h" #include "url/gurl.h" namespace mojo { namespace shell { -class PackageManagerImpl; -} -namespace runner { - class NativeApplicationLoader; +class PackageManagerImpl; // The "global" context for the shell's main process. // TODO(use_chrome_edk) -//class Context : public edk::ProcessDelegate { +// class Context : public edk::ProcessDelegate { class Context : public embedder::ProcessDelegate { public: Context(); @@ -54,11 +51,11 @@ void RunCommandLineApplication(const base::Closure& callback); TaskRunners* task_runners() { return task_runners_.get(); } - shell::ApplicationManager* application_manager() { + ApplicationManager* application_manager() { return application_manager_.get(); } - shell::PackageManagerImpl* package_manager() { return package_manager_; } + PackageManagerImpl* package_manager() { return package_manager_; } private: class NativeViewportApplicationLoader; @@ -75,15 +72,15 @@ // that needs the IO thread to destruct cleanly. Tracer tracer_; // Owned by |application_manager_|. - shell::PackageManagerImpl* package_manager_; - scoped_ptr<shell::ApplicationManager> application_manager_; + PackageManagerImpl* package_manager_; + scoped_ptr<ApplicationManager> application_manager_; base::Closure app_complete_callback_; base::Time main_entry_time_; DISALLOW_COPY_AND_ASSIGN(Context); }; -} // namespace runner +} // namespace shell } // namespace mojo -#endif // MOJO_RUNNER_CONTEXT_H_ +#endif // MOJO_SHELL_STANDALONE_CONTEXT_H_
diff --git a/mojo/runner/desktop/launcher_process.cc b/mojo/shell/standalone/desktop/launcher_process.cc similarity index 78% rename from mojo/runner/desktop/launcher_process.cc rename to mojo/shell/standalone/desktop/launcher_process.cc index 7354661..331551e 100644 --- a/mojo/runner/desktop/launcher_process.cc +++ b/mojo/shell/standalone/desktop/launcher_process.cc
@@ -17,12 +17,12 @@ #include "base/path_service.h" #include "base/synchronization/waitable_event.h" #include "base/threading/platform_thread.h" -#include "mojo/runner/context.h" -#include "mojo/runner/switches.h" +#include "mojo/shell/standalone/context.h" +#include "mojo/shell/standalone/switches.h" #include "mojo/shell/switches.h" namespace mojo { -namespace runner { +namespace shell { int LauncherProcessMain(const GURL& mojo_url, const base::Closure& callback) { #if !defined(OFFICIAL_BUILD) @@ -38,8 +38,8 @@ base::PlatformThread::SetName("mojo_runner"); - // We want the shell::Context to outlive the MessageLoop so that pipes are - // all gracefully closed / error-out before we try to shut the Context down. + // We want the Context to outlive the MessageLoop so that pipes are all + // gracefully closed / error-out before we try to shut the Context down. Context shell_context; { base::MessageLoop message_loop; @@ -54,10 +54,9 @@ base::Bind(&Context::RunCommandLineApplication, base::Unretained(&shell_context), base::Closure())); } else { - message_loop.PostTask(FROM_HERE, - base::Bind(&mojo::runner::Context::Run, - base::Unretained(&shell_context), - mojo_url)); + message_loop.PostTask( + FROM_HERE, base::Bind(&mojo::shell::Context::Run, + base::Unretained(&shell_context), mojo_url)); } message_loop.Run(); @@ -68,5 +67,5 @@ return 0; } -} // namespace runner +} // namespace shell } // namespace mojo
diff --git a/mojo/runner/desktop/launcher_process.h b/mojo/shell/standalone/desktop/launcher_process.h similarity index 69% rename from mojo/runner/desktop/launcher_process.h rename to mojo/shell/standalone/desktop/launcher_process.h index ec78f5b..351cc79 100644 --- a/mojo/runner/desktop/launcher_process.h +++ b/mojo/shell/standalone/desktop/launcher_process.h
@@ -2,21 +2,21 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MOJO_SHELL_LAUNCHER_PROCESS_H_ -#define MOJO_SHELL_LAUNCHER_PROCESS_H_ +#ifndef MOJO_SHELL_STANDALONE_LAUNCHER_PROCESS_H_ +#define MOJO_SHELL_STANDALONE_LAUNCHER_PROCESS_H_ #include "base/callback_forward.h" class GURL; namespace mojo { -namespace runner { +namespace shell { // Main method for the launcher process. // See commit in main_helper.h for explanation of the parameters. int LauncherProcessMain(const GURL& mojo_url, const base::Closure& callback); -} // namespace runner +} // namespace shell } // namespace mojo -#endif // MOJO_SHELL_LAUNCHER_PROCESS_H_ +#endif // MOJO_SHELL_STANDALONE_LAUNCHER_PROCESS_H_
diff --git a/mojo/runner/desktop/main.cc b/mojo/shell/standalone/desktop/main.cc similarity index 60% rename from mojo/runner/desktop/main.cc rename to mojo/shell/standalone/desktop/main.cc index 9971326..d25f03bc 100644 --- a/mojo/runner/desktop/main.cc +++ b/mojo/shell/standalone/desktop/main.cc
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/desktop/main_helper.h" +#include "mojo/shell/standalone/desktop/main_helper.h" int main(int argc, char** argv) { - return mojo::runner::RunnerMain(argc, argv, GURL(), base::Closure()); + return mojo::shell::StandaloneShellMain(argc, argv, GURL(), base::Closure()); }
diff --git a/mojo/runner/desktop/main_helper.cc b/mojo/shell/standalone/desktop/main_helper.cc similarity index 72% rename from mojo/runner/desktop/main_helper.cc rename to mojo/shell/standalone/desktop/main_helper.cc index 00fb851..4cb69e7 100644 --- a/mojo/runner/desktop/main_helper.cc +++ b/mojo/shell/standalone/desktop/main_helper.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/desktop/main_helper.h" +#include "mojo/shell/standalone/desktop/main_helper.h" #include "base/at_exit.h" #include "base/base_switches.h" @@ -14,10 +14,10 @@ #include "base/stl_util.h" #include "base/strings/string_split.h" #include "base/strings/utf_string_conversions.h" -#include "mojo/runner/desktop/launcher_process.h" #include "mojo/shell/runner/host/child_process.h" #include "mojo/shell/runner/host/switches.h" #include "mojo/shell/runner/init.h" +#include "mojo/shell/standalone/desktop/launcher_process.h" #if defined(OS_WIN) #include <windows.h> @@ -26,28 +26,29 @@ #endif namespace mojo { -namespace runner { +namespace shell { -int RunnerMain(int argc, char** argv, - const GURL& mojo_url, - const base::Closure& callback) { +int StandaloneShellMain(int argc, + char** argv, + const GURL& mojo_url, + const base::Closure& callback) { base::CommandLine::Init(argc, argv); const base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); base::AtExitManager at_exit; - shell::InitializeLogging(); - shell::WaitForDebuggerIfNecessary(); + InitializeLogging(); + WaitForDebuggerIfNecessary(); #if !defined(OFFICIAL_BUILD) && defined(OS_WIN) base::RouteStdioToConsole(false); #endif if (command_line.HasSwitch(switches::kChildProcess)) - return shell::ChildProcessMain(); + return ChildProcessMain(); return LauncherProcessMain(mojo_url, callback); } -} // namespace runner +} // namespace shell } // namespace mojo
diff --git a/mojo/shell/standalone/desktop/main_helper.h b/mojo/shell/standalone/desktop/main_helper.h new file mode 100644 index 0000000..4872707 --- /dev/null +++ b/mojo/shell/standalone/desktop/main_helper.h
@@ -0,0 +1,26 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MOJO_SHELL_STANDALONE_DESKTOP_MAIN_HELPER_H +#define MOJO_SHELL_STANDALONE_DESKTOP_MAIN_HELPER_H + +#include "base/callback.h" +#include "url/gurl.h" + +namespace mojo { +namespace shell { + +// Helper method to start Mojo standalone shell code. +// If |mojo_url| is not empty, the given mojo application is started. Otherwise, +// an application must have been specified on the command line and it is run. +// |callback| is only called in the later case. +int StandaloneShellMain(int argc, + char** argv, + const GURL& mojo_url, + const base::Closure& callback); + +} // namespace shell +} // namespace mojo + +#endif // MOJO_SHELL_STANDALONE_DESKTOP_MAIN_HELPER_H
diff --git a/mojo/shell/standalone/register_local_aliases.cc b/mojo/shell/standalone/register_local_aliases.cc new file mode 100644 index 0000000..0b43bd8 --- /dev/null +++ b/mojo/shell/standalone/register_local_aliases.cc
@@ -0,0 +1,13 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "mojo/shell/standalone/register_local_aliases.h" + +namespace mojo { +namespace shell { + +void RegisterLocalAliases(PackageManagerImpl* manager) {} + +} // namespace shell +} // namespace mojo
diff --git a/mojo/shell/standalone/register_local_aliases.h b/mojo/shell/standalone/register_local_aliases.h new file mode 100644 index 0000000..5211587e --- /dev/null +++ b/mojo/shell/standalone/register_local_aliases.h
@@ -0,0 +1,17 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MOJO_SHELL_STANDALONE_REGISTER_LOCAL_ALIASES_H_ +#define MOJO_SHELL_STANDALONE_REGISTER_LOCAL_ALIASES_H_ + +namespace mojo { +namespace shell { +class PackageManagerImpl; + +void RegisterLocalAliases(PackageManagerImpl* manager); + +} // namespace shell +} // namespace mojo + +#endif // MOJO_SHELL_STANDALONE_REGISTER_LOCAL_ALIASES_H_
diff --git a/mojo/runner/scoped_user_data_dir.cc b/mojo/shell/standalone/scoped_user_data_dir.cc similarity index 85% rename from mojo/runner/scoped_user_data_dir.cc rename to mojo/shell/standalone/scoped_user_data_dir.cc index 8709475..dc92dfe 100644 --- a/mojo/runner/scoped_user_data_dir.cc +++ b/mojo/shell/standalone/scoped_user_data_dir.cc
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/scoped_user_data_dir.h" +#include "mojo/shell/standalone/scoped_user_data_dir.h" #include "base/command_line.h" #include "base/logging.h" -#include "mojo/runner/switches.h" +#include "mojo/shell/standalone/switches.h" namespace mojo { -namespace runner { +namespace shell { ScopedUserDataDir::ScopedUserDataDir() { base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); @@ -33,8 +33,7 @@ command_line->AppendSwitchPath(switches::kUserDataDir, temp_dir_.path()); } -ScopedUserDataDir::~ScopedUserDataDir() { -} +ScopedUserDataDir::~ScopedUserDataDir() {} -} // namespace runner +} // namespace shell } // namespace mojo
diff --git a/mojo/runner/scoped_user_data_dir.h b/mojo/shell/standalone/scoped_user_data_dir.h similarity index 73% rename from mojo/runner/scoped_user_data_dir.h rename to mojo/shell/standalone/scoped_user_data_dir.h index 01d8418..364c4630 100644 --- a/mojo/runner/scoped_user_data_dir.h +++ b/mojo/shell/standalone/scoped_user_data_dir.h
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MOJO_RUNNER_SCOPED_USER_DATA_DIR_H_ -#define MOJO_RUNNER_SCOPED_USER_DATA_DIR_H_ +#ifndef MOJO_SHELL_STANDALONE_SCOPED_USER_DATA_DIR_H_ +#define MOJO_SHELL_STANDALONE_SCOPED_USER_DATA_DIR_H_ #include "base/files/scoped_temp_dir.h" namespace mojo { -namespace runner { +namespace shell { // A scoped class which owns a ScopedTempDir if --use-temporary-user-data-dir // is set. If it is, also modifies the command line so that --user-data-dir @@ -22,7 +22,7 @@ base::ScopedTempDir temp_dir_; }; -} // namespace runner +} // namespace shell } // namespace mojo -#endif // MOJO_RUNNER_SCOPED_USER_DATA_DIR_H_ +#endif // MOJO_SHELL_STANDALONE_SCOPED_USER_DATA_DIR_H_
diff --git a/mojo/runner/shell_apptest.cc b/mojo/shell/standalone/shell_apptest.cc similarity index 95% rename from mojo/runner/shell_apptest.cc rename to mojo/shell/standalone/shell_apptest.cc index b1c57da..a8a5c5ba 100644 --- a/mojo/runner/shell_apptest.cc +++ b/mojo/shell/standalone/shell_apptest.cc
@@ -14,14 +14,14 @@ #include "base/strings/stringprintf.h" #include "mojo/common/data_pipe_utils.h" #include "mojo/public/cpp/system/macros.h" -#include "mojo/runner/kPingable.h" -#include "mojo/runner/test/pingable.mojom.h" #include "mojo/services/http_server/public/cpp/http_server_util.h" #include "mojo/services/http_server/public/interfaces/http_server.mojom.h" #include "mojo/services/http_server/public/interfaces/http_server_factory.mojom.h" #include "mojo/services/network/public/interfaces/net_address.mojom.h" #include "mojo/shell/public/cpp/application_impl.h" #include "mojo/shell/public/cpp/application_test_base.h" +#include "mojo/shell/standalone/kPingable.h" +#include "mojo/shell/standalone/test/pingable.mojom.h" namespace mojo { namespace { @@ -34,8 +34,7 @@ class GetHandler : public http_server::HttpHandler { public: GetHandler(InterfaceRequest<http_server::HttpHandler> request, uint16_t port) - : binding_(this, request.Pass()), port_(port) { - } + : binding_(this, std::move(request)), port_(port) {} ~GetHandler() override {} private: @@ -57,7 +56,7 @@ NOTREACHED(); } - callback.Run(response.Pass()); + callback.Run(std::move(response)); } Binding<http_server::HttpHandler> binding_; @@ -91,14 +90,14 @@ local_address->ipv4->addr[3] = 1; local_address->ipv4->port = 0; http_server_factory_->CreateHttpServer(GetProxy(&http_server_), - local_address.Pass()); + std::move(local_address)); http_server_->GetPort([this](uint16_t p) { port_ = p; }); EXPECT_TRUE(http_server_.WaitForIncomingResponse()); InterfacePtr<http_server::HttpHandler> http_handler; handler_.reset(new GetHandler(GetProxy(&http_handler).Pass(), port_)); - http_server_->SetHandler(".*", http_handler.Pass(), + http_server_->SetHandler(".*", std::move(http_handler), [](bool result) { EXPECT_TRUE(result); }); EXPECT_TRUE(http_server_.WaitForIncomingResponse()); }
diff --git a/mojo/runner/shell_test_base.h b/mojo/shell/standalone/shell_test_base.h similarity index 86% rename from mojo/runner/shell_test_base.h rename to mojo/shell/standalone/shell_test_base.h index 73343a8..254f2f8 100644 --- a/mojo/runner/shell_test_base.h +++ b/mojo/shell/standalone/shell_test_base.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MOJO_RUNNER_SHELL_TEST_BASE_H_ -#define MOJO_RUNNER_SHELL_TEST_BASE_H_ +#ifndef MOJO_SHELL_STANDALONE_SHELL_TEST_BASE_H_ +#define MOJO_SHELL_STANDALONE_SHELL_TEST_BASE_H_ #include <string> @@ -11,13 +11,13 @@ #include "base/message_loop/message_loop.h" #include "mojo/public/cpp/bindings/interface_ptr_info.h" #include "mojo/public/cpp/system/core.h" -#include "mojo/runner/context.h" +#include "mojo/shell/standalone/context.h" #include "testing/gtest/include/gtest/gtest.h" class GURL; namespace mojo { -namespace runner { +namespace shell { namespace test { class ShellTestBase : public testing::Test { @@ -54,7 +54,7 @@ }; } // namespace test -} // namespace runner +} // namespace shell } // namespace mojo -#endif // MOJO_RUNNER_SHELL_TEST_BASE_H_ +#endif // MOJO_SHELL_STANDALONE_SHELL_TEST_BASE_H_
diff --git a/mojo/runner/shell_test_base_unittest.cc b/mojo/shell/standalone/shell_test_base_unittest.cc similarity index 98% rename from mojo/runner/shell_test_base_unittest.cc rename to mojo/shell/standalone/shell_test_base_unittest.cc index 4be23bc5..a885de17 100644 --- a/mojo/runner/shell_test_base_unittest.cc +++ b/mojo/shell/standalone/shell_test_base_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/shell_test_base.h" +#include "mojo/shell/standalone/shell_test_base.h" #include <stddef.h> #include <stdint.h> @@ -29,7 +29,7 @@ using mojo::test::TestTrackedRequestServicePtr; namespace mojo { -namespace runner { +namespace shell { namespace test { namespace { @@ -293,5 +293,5 @@ } // namespace } // namespace test -} // namespace runner +} // namespace shell } // namespace mojo
diff --git a/mojo/runner/shell_test_main.cc b/mojo/shell/standalone/shell_test_main.cc similarity index 100% rename from mojo/runner/shell_test_main.cc rename to mojo/shell/standalone/shell_test_main.cc
diff --git a/mojo/runner/switches.cc b/mojo/shell/standalone/switches.cc similarity index 96% rename from mojo/runner/switches.cc rename to mojo/shell/standalone/switches.cc index dfb7c88..efe91ed1 100644 --- a/mojo/runner/switches.cc +++ b/mojo/shell/standalone/switches.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/switches.h" +#include "mojo/shell/standalone/switches.h" namespace switches {
diff --git a/mojo/runner/switches.h b/mojo/shell/standalone/switches.h similarity index 82% rename from mojo/runner/switches.h rename to mojo/shell/standalone/switches.h index c5c38ae..a22b120 100644 --- a/mojo/runner/switches.h +++ b/mojo/shell/standalone/switches.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MOJO_RUNNER_SWITCHES_H_ -#define MOJO_RUNNER_SWITCHES_H_ +#ifndef MOJO_SHELL_STANDALONE_SWITCHES_H_ +#define MOJO_SHELL_STANDALONE_SWITCHES_H_ namespace switches { @@ -20,4 +20,4 @@ } // namespace switches -#endif // MOJO_RUNNER_SWITCHES_H_ +#endif // MOJO_SHELL_STANDALONE_SWITCHES_H_
diff --git a/mojo/runner/task_runners.cc b/mojo/shell/standalone/task_runners.cc similarity index 90% rename from mojo/runner/task_runners.cc rename to mojo/shell/standalone/task_runners.cc index 8bb5993..48fac50 100644 --- a/mojo/runner/task_runners.cc +++ b/mojo/shell/standalone/task_runners.cc
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/task_runners.h" +#include "mojo/shell/standalone/task_runners.h" #include <stddef.h> #include "base/threading/sequenced_worker_pool.h" namespace mojo { -namespace runner { +namespace shell { namespace { @@ -30,12 +30,11 @@ : shell_runner_(shell_runner), io_thread_(CreateIOThread("io_thread")), blocking_pool_(new base::SequencedWorkerPool(kMaxBlockingPoolThreads, - "blocking_pool")) { -} + "blocking_pool")) {} TaskRunners::~TaskRunners() { blocking_pool_->Shutdown(); } -} // namespace runner +} // namespace shell } // namespace mojo
diff --git a/mojo/runner/task_runners.h b/mojo/shell/standalone/task_runners.h similarity index 85% rename from mojo/runner/task_runners.h rename to mojo/shell/standalone/task_runners.h index 5a51bb8..c33e722 100644 --- a/mojo/runner/task_runners.h +++ b/mojo/shell/standalone/task_runners.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MOJO_RUNNER_TASK_RUNNERS_H_ -#define MOJO_RUNNER_TASK_RUNNERS_H_ +#ifndef MOJO_SHELL_STANDALONE_TASK_RUNNERS_H_ +#define MOJO_SHELL_STANDALONE_TASK_RUNNERS_H_ #include "base/macros.h" #include "base/memory/ref_counted.h" @@ -15,7 +15,7 @@ } namespace mojo { -namespace runner { +namespace shell { // A context object that contains the common task runners for the shell's main // process. @@ -46,7 +46,7 @@ DISALLOW_COPY_AND_ASSIGN(TaskRunners); }; -} // namespace runner +} // namespace shell } // namespace mojo -#endif // MOJO_RUNNER_TASK_RUNNERS_H_ +#endif // MOJO_SHELL_STANDALONE_TASK_RUNNERS_H_
diff --git a/mojo/runner/test/BUILD.gn b/mojo/shell/standalone/test/BUILD.gn similarity index 100% rename from mojo/runner/test/BUILD.gn rename to mojo/shell/standalone/test/BUILD.gn
diff --git a/mojo/runner/test/pingable_app.cc b/mojo/shell/standalone/test/pingable_app.cc similarity index 90% rename from mojo/runner/test/pingable_app.cc rename to mojo/shell/standalone/test/pingable_app.cc index e53a11c..c8116aaf 100644 --- a/mojo/runner/test/pingable_app.cc +++ b/mojo/shell/standalone/test/pingable_app.cc
@@ -6,11 +6,11 @@ #include "mojo/public/cpp/bindings/callback.h" #include "mojo/public/cpp/bindings/interface_request.h" #include "mojo/public/cpp/bindings/strong_binding.h" -#include "mojo/runner/test/pingable.mojom.h" #include "mojo/shell/public/cpp/application_delegate.h" #include "mojo/shell/public/cpp/application_impl.h" #include "mojo/shell/public/cpp/application_runner.h" #include "mojo/shell/public/cpp/interface_factory.h" +#include "mojo/shell/standalone/test/pingable.mojom.h" namespace mojo { @@ -19,7 +19,7 @@ PingableImpl(InterfaceRequest<Pingable> request, const std::string& app_url, const std::string& connection_url) - : binding_(this, request.Pass()), + : binding_(this, std::move(request)), app_url_(app_url), connection_url_(connection_url) {} @@ -55,7 +55,8 @@ // InterfaceFactory<Pingable>: void Create(mojo::ApplicationConnection* connection, mojo::InterfaceRequest<Pingable> request) override { - new PingableImpl(request.Pass(), app_url_, connection->GetConnectionURL()); + new PingableImpl(std::move(request), app_url_, + connection->GetConnectionURL()); } std::string app_url_;
diff --git a/mojo/runner/tracer.cc b/mojo/shell/standalone/tracer.cc similarity index 98% rename from mojo/runner/tracer.cc rename to mojo/shell/standalone/tracer.cc index a327113..d7aaaf77 100644 --- a/mojo/runner/tracer.cc +++ b/mojo/shell/standalone/tracer.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mojo/runner/tracer.h" +#include "mojo/shell/standalone/tracer.h" #include <stddef.h> #include <stdio.h> @@ -17,7 +17,7 @@ #include "base/trace_event/trace_event.h" namespace mojo { -namespace runner { +namespace shell { Tracer::Tracer() : tracing_(false), first_chunk_written_(false), trace_file_(nullptr) {} @@ -160,5 +160,5 @@ first_chunk_written_ = true; } -} // namespace runner +} // namespace shell } // namespace mojo
diff --git a/mojo/runner/tracer.h b/mojo/shell/standalone/tracer.h similarity index 94% rename from mojo/runner/tracer.h rename to mojo/shell/standalone/tracer.h index bac7914..651a35c2 100644 --- a/mojo/runner/tracer.h +++ b/mojo/shell/standalone/tracer.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MOJO_RUNNER_TRACER_H_ -#define MOJO_RUNNER_TRACER_H_ +#ifndef MOJO_SHELL_STANDALONE_TRACER_H_ +#define MOJO_SHELL_STANDALONE_TRACER_H_ #include <stddef.h> #include <stdio.h> @@ -18,7 +18,7 @@ #include "mojo/services/tracing/public/interfaces/tracing.mojom.h" namespace mojo { -namespace runner { +namespace shell { // Tracer collects tracing data from base/trace_event and from externally // configured sources, aggregates it into a single stream, and writes it out to @@ -96,7 +96,7 @@ DISALLOW_COPY_AND_ASSIGN(Tracer); }; -} // namespace runner +} // namespace shell } // namespace mojo -#endif // MOJO_RUNNER_TRACER_H_ +#endif // MOJO_SHELL_STANDALONE_TRACER_H_
diff --git a/net/BUILD.gn b/net/BUILD.gn index 6203ce4..33d414b 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -180,6 +180,7 @@ "socket/ssl_client_socket_nss.h", "socket/ssl_server_socket_nss.cc", "socket/ssl_server_socket_nss.h", + "ssl/token_binding_nss.cc", ] if (is_ios) { # Always removed for !ios below. @@ -226,6 +227,7 @@ "ssl/ssl_platform_key_task_runner.h", "ssl/threaded_ssl_private_key.cc", "ssl/threaded_ssl_private_key.h", + "ssl/token_binding_openssl.cc", ] }
diff --git a/net/cert/cert_verify_proc_blacklist.inc b/net/cert/cert_verify_proc_blacklist.inc index 3ae8e78..b2bb554 100644 --- a/net/cert/cert_verify_proc_blacklist.inc +++ b/net/cert/cert_verify_proc_blacklist.inc
@@ -5,7 +5,7 @@ // The certificate(s) that were misissued, and which represent these SPKIs, // are stored within net/data/ssl/blacklist. Further details about the // rationale is documented in net/data/ssl/blacklist/README.md -static const size_t kNumBlacklistedSPKIs = 32u; +static const size_t kNumBlacklistedSPKIs = 34u; static const uint8_t kBlacklistedSPKIs[kNumBlacklistedSPKIs][crypto::kSHA256Length] = { // ead610e6e90b439f2ecb51628b0932620f6ef340bd843fca38d3181b8f4ba197.pem @@ -24,6 +24,10 @@ {0x1a, 0xf5, 0x6c, 0x98, 0xff, 0x04, 0x3e, 0xf9, 0x2b, 0xeb, 0xff, 0x54, 0xce, 0xbb, 0x4d, 0xd6, 0x7a, 0x25, 0xba, 0x95, 0x6c, 0x81, 0x7f, 0x3e, 0x6d, 0xd3, 0xc1, 0xe5, 0x2e, 0xb5, 0x84, 0xc1}, + // 2c998e761160c3b06d82faa9fdc7545d9bda9eb60310f992aa510a6280b74245.pem + {0x2c, 0x99, 0x8e, 0x76, 0x11, 0x60, 0xc3, 0xb0, 0x6d, 0x82, 0xfa, + 0xa9, 0xfd, 0xc7, 0x54, 0x5d, 0x9b, 0xda, 0x9e, 0xb6, 0x03, 0x10, + 0xf9, 0x92, 0xaa, 0x51, 0x0a, 0x62, 0x80, 0xb7, 0x42, 0x45}, // 32ecc96f912f96d889e73088cd031c7ded2c651c805016157a23b6f32f798a3b.key {0x32, 0xec, 0xc9, 0x6f, 0x91, 0x2f, 0x96, 0xd8, 0x89, 0xe7, 0x30, 0x88, 0xcd, 0x03, 0x1c, 0x7d, 0xed, 0x2c, 0x65, 0x1c, 0x80, 0x50, @@ -80,6 +84,10 @@ {0xa9, 0x03, 0xaf, 0x8c, 0x07, 0xbb, 0x91, 0xb0, 0xd9, 0xe3, 0xf3, 0xa3, 0x0c, 0x6d, 0x53, 0x33, 0x9f, 0xc5, 0xbd, 0x47, 0xe5, 0xd6, 0xbd, 0xb4, 0x76, 0x59, 0x88, 0x60, 0xc0, 0x68, 0xa0, 0x24}, + // b8c1b957c077ea76e00b0f45bff5ae3acb696f221d2e062164fe37125e5a8d25.pem + {0xb3, 0x18, 0x2e, 0x28, 0x9a, 0xe3, 0x4d, 0xdf, 0x2b, 0xe6, 0x43, + 0xab, 0x79, 0xc2, 0x44, 0x30, 0x16, 0x05, 0xfa, 0x0f, 0x1e, 0xaa, + 0xe6, 0xd1, 0x0f, 0xb9, 0x29, 0x60, 0x0a, 0xf8, 0x4d, 0xf0}, // be144b56fb1163c49c9a0e6b5a458df6b29f7e6449985960c178a4744624b7bc.pem {0xb4, 0xd5, 0xc9, 0x20, 0x41, 0x5e, 0xd0, 0xcc, 0x4f, 0x5d, 0xbc, 0x7f, 0x54, 0x26, 0x36, 0x76, 0x2e, 0x80, 0xda, 0x66, 0x25, 0xf3,
diff --git a/net/cert/ct_serialization.cc b/net/cert/ct_serialization.cc index 235d37e6..2de830872 100644 --- a/net/cert/ct_serialization.cc +++ b/net/cert/ct_serialization.cc
@@ -6,9 +6,11 @@ #include <stdint.h> +#include <algorithm> #include <limits> #include "base/logging.h" +#include "base/numerics/safe_math.h" namespace net { @@ -54,11 +56,15 @@ bool ReadUint(size_t length, base::StringPiece* in, T* out) { if (in->size() < length) return false; + DCHECK_NE(length, 0u); DCHECK_LE(length, sizeof(T)); - T result = 0; - for (size_t i = 0; i < length; ++i) { - result = (result << 8) | static_cast<unsigned char>((*in)[i]); + T result = static_cast<uint8_t>((*in)[0]); + // This loop only executes if sizeof(T) > 1, because the first operation is + // to shift left by 1 byte, which is undefined behaviour if T is a 1 byte + // integer. + for (size_t i = 1; i < length; ++i) { + result = (result << 8) | static_cast<uint8_t>((*in)[i]); } in->remove_prefix(length); *out = result; @@ -66,14 +72,18 @@ } // Reads a TLS-encoded field length from |in|. -// The bytes read from |in| are discarded (i.e. |in|'s prefix removed) -// |prefix_length| indicates the bytes needed to represent the length (e.g. 3) +// The bytes read from |in| are discarded (i.e. |in|'s prefix removed). +// |prefix_length| indicates the bytes needed to represent the length (e.g. 3). +// Max |prefix_length| is 8. // success, returns true and stores the result in |*out|. bool ReadLength(size_t prefix_length, base::StringPiece* in, size_t* out) { - size_t length; + uint64_t length = 0; if (!ReadUint(prefix_length, in, &length)) return false; - *out = length; + base::CheckedNumeric<size_t> checked_length = length; + if (!checked_length.IsValid()) + return false; + *out = checked_length.ValueOrDie(); return true; } @@ -96,7 +106,7 @@ bool ReadVariableBytes(size_t prefix_length, base::StringPiece* in, base::StringPiece* out) { - size_t length; + size_t length = 0; if (!ReadLength(prefix_length, in, &length)) return false; return ReadFixedBytes(length, in, out); @@ -176,15 +186,15 @@ } // Writes a TLS-encoded variable length unsigned integer to |output|. -// |length| indicates the size (in bytes) of the integer. +// |length| indicates the size (in bytes) of the integer. This must be able to +// accomodate |value|. // |value| the value itself to be written. -template <typename T> -void WriteUint(size_t length, T value, std::string* output) { - DCHECK_LE(length, sizeof(T)); - DCHECK(length == sizeof(T) || value >> (length * 8) == 0); +void WriteUint(size_t length, uint64_t value, std::string* output) { + // Check that |value| fits into |length| bytes. + DCHECK(length >= sizeof(value) || value >> (length * 8) == 0); for (; length > 0; --length) { - output->push_back((value >> ((length - 1)* 8)) & 0xFF); + output->push_back((value >> ((length - 1) * 8)) & 0xFF); } } @@ -195,25 +205,33 @@ // length when reading. // If the length of |input| is dynamic and data is expected to follow it, // WriteVariableBytes must be used. -void WriteEncodedBytes(const base::StringPiece& input, std::string* output) { +// Returns the number of bytes written (the length of |input|). +size_t WriteEncodedBytes(const base::StringPiece& input, std::string* output) { input.AppendToString(output); + return input.size(); } // Writes a variable-length array to |output|. -// |prefix_length| indicates the number of bytes needed to represnt the length. +// |prefix_length| indicates the number of bytes needed to represent the length. // |input| is the array itself. -// If the size of |input| is less than 2^|prefix_length| - 1, encode the -// length and data and return true. Otherwise, return false. +// If 1 <= |prefix_length| <= 8 and the size of |input| is less than +// 2^|prefix_length| - 1, encode the length and data and return true. +// Otherwise, return false. bool WriteVariableBytes(size_t prefix_length, const base::StringPiece& input, std::string* output) { - size_t input_size = input.size(); - size_t max_allowed_input_size = - static_cast<size_t>(((1 << (prefix_length * 8)) - 1)); - if (input_size > max_allowed_input_size) + DCHECK_GE(prefix_length, 1u); + DCHECK_LE(prefix_length, 8u); + + uint64_t input_size = input.size(); + uint64_t max_input_size = (prefix_length == 8) + ? UINT64_MAX + : ((UINT64_C(1) << (prefix_length * 8)) - 1); + + if (input_size > max_input_size) return false; - WriteUint(prefix_length, input.size(), output); + WriteUint(prefix_length, input_size, output); WriteEncodedBytes(input, output); return true; @@ -291,6 +309,26 @@ return false; } +static bool ReadTimeSinceEpoch(base::StringPiece* input, base::Time* output) { + uint64_t time_since_epoch = 0; + if (!ReadUint(kTimestampLength, input, &time_since_epoch)) + return false; + + base::CheckedNumeric<int64_t> time_since_epoch_signed = time_since_epoch; + + if (!time_since_epoch_signed.IsValid()) { + DVLOG(1) << "Timestamp value too big to cast to int64_t: " + << time_since_epoch; + return false; + } + + *output = + base::Time::UnixEpoch() + + base::TimeDelta::FromMilliseconds(time_since_epoch_signed.ValueOrDie()); + + return true; +} + static void WriteTimeSinceEpoch(const base::Time& timestamp, std::string* output) { base::TimeDelta time_since_epoch = timestamp - base::Time::UnixEpoch(); @@ -351,28 +389,17 @@ } result->version = SignedCertificateTimestamp::SCT_VERSION_1; - uint64_t timestamp; base::StringPiece log_id; base::StringPiece extensions; if (!ReadFixedBytes(kLogIdLength, input, &log_id) || - !ReadUint(kTimestampLength, input, ×tamp) || - !ReadVariableBytes(kExtensionsLengthBytes, input, - &extensions) || + !ReadTimeSinceEpoch(input, &result->timestamp) || + !ReadVariableBytes(kExtensionsLengthBytes, input, &extensions) || !DecodeDigitallySigned(input, &result->signature)) { return false; } - if (timestamp > static_cast<uint64_t>(std::numeric_limits<int64_t>::max())) { - DVLOG(1) << "Timestamp value too big to cast to int64_t: " << timestamp; - return false; - } - log_id.CopyToString(&result->log_id); extensions.CopyToString(&result->extensions); - result->timestamp = - base::Time::UnixEpoch() + - base::TimeDelta::FromMilliseconds(static_cast<int64_t>(timestamp)); - output->swap(result); return true; } @@ -381,7 +408,7 @@ std::string* output) { std::string encoded_sct; return WriteVariableBytes(kSerializedSCTLengthBytes, sct, &encoded_sct) && - WriteVariableBytes(kSCTListLengthBytes, encoded_sct, output); + WriteVariableBytes(kSCTListLengthBytes, encoded_sct, output); } } // namespace ct
diff --git a/net/cert/multi_log_ct_verifier_unittest.cc b/net/cert/multi_log_ct_verifier_unittest.cc index d5d609a..e9505d7 100644 --- a/net/cert/multi_log_ct_verifier_unittest.cc +++ b/net/cert/multi_log_ct_verifier_unittest.cc
@@ -70,20 +70,6 @@ ASSERT_TRUE(embedded_sct_chain_.get()); } - bool CheckForSingleVerifiedSCTInResult(const ct::CTVerifyResult& result) { - return (result.verified_scts.size() == 1U) && - result.invalid_scts.empty() && - result.unknown_logs_scts.empty() && - result.verified_scts[0]->log_description == kLogDescription; - } - - bool CheckForSCTOrigin( - const ct::CTVerifyResult& result, - ct::SignedCertificateTimestamp::Origin origin) { - return (result.verified_scts.size() > 0) && - (result.verified_scts[0]->origin == origin); - } - bool CheckForEmbeddedSCTInNetLog(TestNetLog& net_log) { TestNetLogEntry::List entries; net_log.GetEntries(&entries); @@ -128,18 +114,6 @@ return true; } - std::string GetSCTListWithInvalidSCT() { - std::string sct(ct::GetTestSignedCertificateTimestamp()); - - // Change a byte inside the Log ID part of the SCT so it does - // not match the log used in the tests - sct[15] = 't'; - - std::string sct_list; - ct::EncodeSCTListForTesting(sct, &sct_list); - return sct_list; - } - bool VerifySinglePrecertificateChain(scoped_refptr<X509Certificate> chain, const BoundNetLog& bound_net_log, ct::CTVerifyResult* result) { @@ -169,9 +143,9 @@ BoundNetLog bound_net_log = BoundNetLog::Make(&net_log, NetLog::SOURCE_CONNECT_JOB); return (VerifySinglePrecertificateChain(chain, bound_net_log, &result) && - CheckForSingleVerifiedSCTInResult(result) && - CheckForSCTOrigin(result, - ct::SignedCertificateTimestamp::SCT_EMBEDDED) && + ct::CheckForSingleVerifiedSCTInResult(result, kLogDescription) && + ct::CheckForSCTOrigin( + result, ct::SignedCertificateTimestamp::SCT_EMBEDDED) && CheckForEmbeddedSCTInNetLog(net_log)); } @@ -241,25 +215,20 @@ ASSERT_TRUE(CheckPrecertificateVerification(chain)); } -TEST_F(MultiLogCTVerifierTest, - VerifiesSCTOverX509Cert) { - std::string sct(ct::GetTestSignedCertificateTimestamp()); - - std::string sct_list; - ASSERT_TRUE(ct::EncodeSCTListForTesting(sct, &sct_list)); +TEST_F(MultiLogCTVerifierTest, VerifiesSCTOverX509Cert) { + std::string sct_list = ct::GetSCTListForTesting(); ct::CTVerifyResult result; EXPECT_EQ(OK, verifier_->Verify( chain_.get(), std::string(), sct_list, &result, BoundNetLog())); - ASSERT_TRUE(CheckForSingleVerifiedSCTInResult(result)); - ASSERT_TRUE(CheckForSCTOrigin( + ASSERT_TRUE(ct::CheckForSingleVerifiedSCTInResult(result, kLogDescription)); + ASSERT_TRUE(ct::CheckForSCTOrigin( result, ct::SignedCertificateTimestamp::SCT_FROM_TLS_EXTENSION)); } -TEST_F(MultiLogCTVerifierTest, - IdentifiesSCTFromUnknownLog) { - std::string sct_list = GetSCTListWithInvalidSCT(); +TEST_F(MultiLogCTVerifierTest, IdentifiesSCTFromUnknownLog) { + std::string sct_list = ct::GetSCTListWithInvalidSCT(); ct::CTVerifyResult result; EXPECT_NE(OK, @@ -278,7 +247,7 @@ } TEST_F(MultiLogCTVerifierTest, CountsInvalidSCTsInStatusHistogram) { - std::string sct_list = GetSCTListWithInvalidSCT(); + std::string sct_list = ct::GetSCTListWithInvalidSCT(); ct::CTVerifyResult result; int num_valid_scts = NumValidSCTsInStatusHistogram(); int num_invalid_scts = GetValueFromHistogram(
diff --git a/net/cert/sha256_legacy_support_win.cc b/net/cert/sha256_legacy_support_win.cc deleted file mode 100644 index a936637..0000000 --- a/net/cert/sha256_legacy_support_win.cc +++ /dev/null
@@ -1,217 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/cert/sha256_legacy_support_win.h" - -#include <openssl/asn1.h> -#include <openssl/bytestring.h> -#include <openssl/evp.h> -#include <openssl/obj.h> -#include <openssl/x509.h> - -#include "base/logging.h" -#include "crypto/scoped_openssl_types.h" - -namespace net { - -namespace sha256_interception { - -namespace { - -using ScopedX509_ALGOR = crypto::ScopedOpenSSL<X509_ALGOR, X509_ALGOR_free>; - -bool IsSupportedSubjectType(DWORD subject_type) { - switch (subject_type) { - case CRYPT_VERIFY_CERT_SIGN_SUBJECT_BLOB: - case CRYPT_VERIFY_CERT_SIGN_SUBJECT_CERT: - case CRYPT_VERIFY_CERT_SIGN_SUBJECT_CRL: - return true; - } - return false; -} - -bool IsSupportedIssuerType(DWORD issuer_type) { - switch (issuer_type) { - case CRYPT_VERIFY_CERT_SIGN_ISSUER_PUBKEY: - case CRYPT_VERIFY_CERT_SIGN_ISSUER_CERT: - case CRYPT_VERIFY_CERT_SIGN_ISSUER_CHAIN: - return true; - } - return false; -} - -base::StringPiece GetSubjectSignature(DWORD subject_type, - void* subject_data) { - switch (subject_type) { - case CRYPT_VERIFY_CERT_SIGN_SUBJECT_BLOB: { - CRYPT_DATA_BLOB* data_blob = - reinterpret_cast<CRYPT_DATA_BLOB*>(subject_data); - return base::StringPiece(reinterpret_cast<char*>(data_blob->pbData), - data_blob->cbData); - } - case CRYPT_VERIFY_CERT_SIGN_SUBJECT_CERT: { - PCCERT_CONTEXT subject_cert = - reinterpret_cast<PCCERT_CONTEXT>(subject_data); - return base::StringPiece( - reinterpret_cast<char*>(subject_cert->pbCertEncoded), - subject_cert->cbCertEncoded); - } - case CRYPT_VERIFY_CERT_SIGN_SUBJECT_CRL: { - PCCRL_CONTEXT subject_crl = - reinterpret_cast<PCCRL_CONTEXT>(subject_data); - return base::StringPiece( - reinterpret_cast<char*>(subject_crl->pbCrlEncoded), - subject_crl->cbCrlEncoded); - } - } - return base::StringPiece(); -} - -PCERT_PUBLIC_KEY_INFO GetIssuerPublicKey(DWORD issuer_type, - void* issuer_data) { - switch (issuer_type) { - case CRYPT_VERIFY_CERT_SIGN_ISSUER_PUBKEY: - return reinterpret_cast<PCERT_PUBLIC_KEY_INFO>(issuer_data); - case CRYPT_VERIFY_CERT_SIGN_ISSUER_CERT: { - PCCERT_CONTEXT cert = reinterpret_cast<PCCERT_CONTEXT>(issuer_data); - return &cert->pCertInfo->SubjectPublicKeyInfo; - } - case CRYPT_VERIFY_CERT_SIGN_ISSUER_CHAIN: { - PCCERT_CHAIN_CONTEXT chain = - reinterpret_cast<PCCERT_CHAIN_CONTEXT>(issuer_data); - PCCERT_CONTEXT cert = chain->rgpChain[0]->rgpElement[0]->pCertContext; - return &cert->pCertInfo->SubjectPublicKeyInfo; - } - } - return NULL; -} - -// Parses |subject_signature| and writes the components into |*out_tbs_data|, -// |*out_algor|, and |*out_signature|. The BIT STRING in the signature must be -// a multiple of 8 bits. |*out_signature| will have the padding byte removed. -// It returns true on success and false on failure. -bool ParseSubjectSignature(const base::StringPiece& subject_signature, - CBS* out_tbs_data, - ScopedX509_ALGOR* out_algor, - CBS* out_signature) { - CBS cbs, sequence, tbs_data, algorithm, signature; - CBS_init(&cbs, reinterpret_cast<const uint8_t*>(subject_signature.data()), - subject_signature.size()); - if (!CBS_get_asn1(&cbs, &sequence, CBS_ASN1_SEQUENCE) || CBS_len(&cbs) != 0 || - !CBS_get_any_asn1_element(&sequence, &tbs_data, nullptr, nullptr) || - !CBS_get_asn1_element(&sequence, &algorithm, CBS_ASN1_SEQUENCE) || - !CBS_get_asn1(&sequence, &signature, CBS_ASN1_BITSTRING) || - CBS_len(&sequence) != 0) { - return false; - } - - // Decode the algorithm. - const uint8_t* ptr = CBS_data(&algorithm); - ScopedX509_ALGOR algor(d2i_X509_ALGOR(NULL, &ptr, CBS_len(&algorithm))); - if (!algor || ptr != CBS_data(&algorithm) + CBS_len(&algorithm)) - return false; - - // An ASN.1 BIT STRING is encoded with a leading byte denoting the number of - // padding bits. All supported signature algorithms output octets, so the - // leading byte must be zero. - uint8_t padding; - if (!CBS_get_u8(&signature, &padding) || padding != 0) - return false; - - *out_tbs_data = tbs_data; - *out_algor = algor.Pass(); - *out_signature = signature; - return true; -} - -} // namespace - -BOOL CryptVerifyCertificateSignatureExHook( - CryptVerifyCertificateSignatureExFunc original_func, - HCRYPTPROV_LEGACY provider, - DWORD encoding_type, - DWORD subject_type, - void* subject_data, - DWORD issuer_type, - void* issuer_data, - DWORD flags, - void* extra) { - CHECK(original_func); - - // Only intercept if the arguments are supported. - if (provider != NULL || (encoding_type != X509_ASN_ENCODING) || - !IsSupportedSubjectType(subject_type) || subject_data == NULL || - !IsSupportedIssuerType(issuer_type) || issuer_data == NULL) { - return original_func(provider, encoding_type, subject_type, subject_data, - issuer_type, issuer_data, flags, extra); - } - - base::StringPiece subject_signature = - GetSubjectSignature(subject_type, subject_data); - bool should_intercept = false; - - // Parse out the data, AlgorithmIdentifier, and signature. - CBS tbs_data, signature; - ScopedX509_ALGOR algor; - if (ParseSubjectSignature(subject_signature, &tbs_data, &algor, &signature)) { - // If the signature algorithm is RSA with one of the SHA-2 algorithms - // supported by BoringSSL (excluding SHA-224, which is pointless), then - // defer to the BoringSSL implementation. Otherwise, fall back and let the - // OS handle it (e.g. in case there are any algorithm policies in effect). - int nid = OBJ_obj2nid(algor->algorithm); - if (nid == NID_sha256WithRSAEncryption || - nid == NID_sha384WithRSAEncryption || - nid == NID_sha512WithRSAEncryption) { - should_intercept = true; - } - } - - if (!should_intercept) { - return original_func(provider, encoding_type, subject_type, subject_data, - issuer_type, issuer_data, flags, extra); - } - - // Rather than attempting to synthesize an EVP_PKEY by hand, just force the - // OS to do an ASN.1 encoding and then decode it back into BoringSSL. This - // is silly for performance, but safest for consistency. - PCERT_PUBLIC_KEY_INFO issuer_public_key = - GetIssuerPublicKey(issuer_type, issuer_data); - if (!issuer_public_key) { - SetLastError(static_cast<DWORD>(NTE_BAD_ALGID)); - return FALSE; - } - - uint8_t* issuer_spki_data = NULL; - DWORD issuer_spki_len = 0; - if (!CryptEncodeObjectEx(X509_ASN_ENCODING, X509_PUBLIC_KEY_INFO, - issuer_public_key, CRYPT_ENCODE_ALLOC_FLAG, NULL, - &issuer_spki_data, &issuer_spki_len)) { - return FALSE; - } - - const uint8_t* ptr = issuer_spki_data; - crypto::ScopedEVP_PKEY pubkey(d2i_PUBKEY(NULL, &ptr, issuer_spki_len)); - if (!pubkey.get() || ptr != issuer_spki_data + issuer_spki_len) { - ::LocalFree(issuer_spki_data); - SetLastError(static_cast<DWORD>(NTE_BAD_ALGID)); - return FALSE; - } - ::LocalFree(issuer_spki_data); - - crypto::ScopedEVP_MD_CTX md_ctx(EVP_MD_CTX_create()); - if (!EVP_DigestVerifyInitFromAlgorithm(md_ctx.get(), algor.get(), - pubkey.get()) || - !EVP_DigestVerifyUpdate(md_ctx.get(), CBS_data(&tbs_data), - CBS_len(&tbs_data)) || - !EVP_DigestVerifyFinal(md_ctx.get(), CBS_data(&signature), - CBS_len(&signature))) { - SetLastError(static_cast<DWORD>(NTE_BAD_SIGNATURE)); - return FALSE; - } - return TRUE; -} - -} // namespace sha256_interception - -} // namespace net
diff --git a/net/cert/sha256_legacy_support_win.h b/net/cert/sha256_legacy_support_win.h deleted file mode 100644 index 472ff60..0000000 --- a/net/cert/sha256_legacy_support_win.h +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef NET_CERT_SHA256_LEGACY_SUPPORT_WIN_H_ -#define NET_CERT_SHA256_LEGACY_SUPPORT_WIN_H_ - -#include <windows.h> - -#include "base/strings/string_piece.h" -#include "crypto/wincrypt_shim.h" -#include "net/base/net_export.h" - -namespace net { - -namespace sha256_interception { - -typedef BOOL (WINAPI* CryptVerifyCertificateSignatureExFunc)( - HCRYPTPROV_LEGACY provider, - DWORD encoding_type, - DWORD subject_type, - void* subject_data, - DWORD issuer_type, - void* issuer_data, - DWORD flags, - void* extra); - -// Interception function meant to be called whenever -// CryptVerifyCertificateSignatureEx is called. Note that the calling -// conventions do not match, as the caller is expected to ensure that their -// interposed function handles the calling conventions and provides a pointer -// to the original CryptVerifyCertificateSignatureEx (e.g. to handle parameters -// and keys that are not supported). -NET_EXPORT BOOL CryptVerifyCertificateSignatureExHook( - CryptVerifyCertificateSignatureExFunc original_func, - HCRYPTPROV_LEGACY provider, - DWORD encoding_type, - DWORD subject_type, - void* subject_data, - DWORD issuer_type, - void* issuer_data, - DWORD flags, - void* extra); - -} // namespace sha256_interception - -} // namespace net - -#endif // NET_CERT_SHA256_LEGACY_SUPPORT_WIN_H_
diff --git a/net/cert/sha256_legacy_support_win_unittest.cc b/net/cert/sha256_legacy_support_win_unittest.cc deleted file mode 100644 index 0496ca30..0000000 --- a/net/cert/sha256_legacy_support_win_unittest.cc +++ /dev/null
@@ -1,52 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/cert/sha256_legacy_support_win.h" - -#include "base/memory/ref_counted.h" -#include "net/base/test_data_directory.h" -#include "net/cert/x509_certificate.h" -#include "net/test/cert_test_util.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace net { - -namespace sha256_interception { - -namespace { - -// Verifies that SHA-256 signatures can be validated through the interception. -// Although this is only needed on legacy platforms, the test is run on all -// Windows platforms to make sure that the CryptoAPI<->NSS integration does not -// regress. -TEST(Sha256Interception, HandlesSHA2) { - base::FilePath certs_dir = GetTestCertsDirectory(); - - scoped_refptr<X509Certificate> server_cert = - ImportCertFromFile(certs_dir, "sha256.pem"); - ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert.get()); - - CryptVerifyCertificateSignatureExFunc cert_verify_signature_ptr = - reinterpret_cast<CryptVerifyCertificateSignatureExFunc>( - ::GetProcAddress(::GetModuleHandle(L"crypt32.dll"), - "CryptVerifyCertificateSignatureEx")); - ASSERT_TRUE(cert_verify_signature_ptr); - - BOOL rv = CryptVerifyCertificateSignatureExHook( - cert_verify_signature_ptr, NULL, X509_ASN_ENCODING, - CRYPT_VERIFY_CERT_SIGN_SUBJECT_CERT, - const_cast<void*>(reinterpret_cast<const void*>( - server_cert->os_cert_handle())), - CRYPT_VERIFY_CERT_SIGN_ISSUER_CERT, - const_cast<void*>(reinterpret_cast<const void*>( - server_cert->os_cert_handle())), - 0, NULL); - EXPECT_EQ(TRUE, rv); -} - -} // namespace - -} // namespace sha256_interception - -} // namespace net \ No newline at end of file
diff --git a/net/data/ssl/blacklist/159ca03a88897c8f13817a212629df84ce824709492b8c9adb8e5437d2fc72be.pem b/net/data/ssl/blacklist/159ca03a88897c8f13817a212629df84ce824709492b8c9adb8e5437d2fc72be.pem new file mode 100644 index 0000000..ce4133c --- /dev/null +++ b/net/data/ssl/blacklist/159ca03a88897c8f13817a212629df84ce824709492b8c9adb8e5437d2fc72be.pem
@@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIEazCCA1OgAwIBAgIEBydxojANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTEyMDYyMDE4MzUxM1oX +DTE5MDkxNDE4MzQwMFowQDELMAkGA1UEBhMCSlAxGDAWBgNVBAoTD0tlaW8gVW5p +dmVyc2l0eTEXMBUGA1UEAxMOS0VJTyBVTklWLkNBIDIwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQC29SQ+EENagPIalA0bYSZQe1gm2reJtuL/VggiVvut +DXhlbQ8TwJaJpwikGRHPlqdUG5zEPIR4O9PLeiu6tswFmA22a2eKqHd5RFl1k13W +gc+I+ovpKS1dFNCr/WxdqBSwQdwrMGacWYtVc8wcWZAyBqPHWNOvgbi6ikeDPdA9 +AjwD553WXZU1zh84Sgz3h/NR1yCGrX39qW8p7mlib4Qg8CWntye97Ni3Ohlqm/m6 +thfpIptjwr8xq6/LJjOcB/f9a0CqNuiZBVMyIp9m3tNlSifCneWX2X/+G1GdOK80 +plltHay6W029QQV67PbW4lqymn5cjtSunMJLbOt6Nhv/AgMBAAGjggFRMIIBTTAS +BgNVHRMBAf8ECDAGAQH/AgEAMFMGA1UdIARMMEowSAYJKwYBBAGxPgEAMDswOQYI +KwYBBQUHAgEWLWh0dHA6Ly9jeWJlcnRydXN0Lm9tbmlyb290LmNvbS9yZXBvc2l0 +b3J5LmNmbTAOBgNVHQ8BAf8EBAMCAQYwbwYDVR0jBGgwZqFepFwwWjELMAkGA1UE +BhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEi +MCAGA1UEAxMZQmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdIIEAgAAuTBCBgNVHR8E +OzA5MDegNaAzhjFodHRwOi8vY2RwMS5wdWJsaWMtdHJ1c3QuY29tL0NSTC9PbW5p +cm9vdDIwMjUuY3JsMB0GA1UdDgQWBBSkzpUuB63HsFQ6Ooir648h34D1qzANBgkq +hkiG9w0BAQUFAAOCAQEAKcQLLMDFhnoR13BZM/8zbQXO2gTrjOWXiz1u0typn8G+ +wI6nzb7xoqNEUsHLqHzMzDLwc7FYQ+PLoRLiKKYcQx2faxfsmOAnkgdA9zr3jczC +Ek10mEI/iXi/7ilrh5qRxI/SarXqLlLv5LFHCtHg5JGa/74ktsEa8SeUllKE2tTX +nsfcl3gSY5H9c3duSZDLRSVrlasar6C7TJOZFWhUD616jcsMyTcpHvS6uedf0bGP +lmVcwmRn5SbZQ4vE+6UPLO5npv+QGmmYJJirJmdHIHoekIAGK19E1Q5edb7duOxa +9s/9NjVxhWsKNTcVh1UiB91lOcxnJrS1GJmvT0gIpg== +-----END CERTIFICATE-----
diff --git a/net/data/ssl/blacklist/README.md b/net/data/ssl/blacklist/README.md index 6df1654..9d45f72 100644 --- a/net/data/ssl/blacklist/README.md +++ b/net/data/ssl/blacklist/README.md
@@ -10,108 +10,108 @@ ### Comodo -For details, see [https://www.comodo.com/Comodo-Fraud-Incident-2011-03-23.html], -[https://blog.mozilla.org/security/2011/03/25/comodo-certificate-issue-follow-up/], -and [https://technet.microsoft.com/en-us/library/security/2524375.aspx]. +For details, see <https://www.comodo.com/Comodo-Fraud-Incident-2011-03-23.html>, +<https://blog.mozilla.org/security/2011/03/25/comodo-certificate-issue-follow-up/>, +and <https://technet.microsoft.com/en-us/library/security/2524375.aspx>. As the result of a compromise of a partner RA of Comodo, nine certificates were misissued, for a variety of online services. - * [2a3699deca1e9fd099ba45de8489e205977c9f2a5e29d5dd747381eec0744d71.pem] - * [4bf6bb839b03b72839329b4ea70bb1b2f0d07e014d9d24aa9cc596114702bee3.pem] - * [79f69a47cfd6c4b4ceae8030d04b49f6171d3b5d6c812f58d040e586f1cb3f14.pem] - * [8290cc3fc1c3aac3239782c141ace8f88aeef4e9576a43d01867cf19d025be66.pem] - * [933f7d8cda9f0d7c8bfd3c22bf4653f4161fd38ccdcf66b22e95a2f49c2650f8.pem] - * [9532e8b504964331c271f3f5f10070131a08bf8ba438978ce394c34feeae246f.pem] - * [be144b56fb1163c49c9a0e6b5a458df6b29f7e6449985960c178a4744624b7bc.pem] - * [ead610e6e90b439f2ecb51628b0932620f6ef340bd843fca38d3181b8f4ba197.pem] - * [f8a5ff189fedbfe34e21103389a68340174439ad12974a4e8d4d784d1f3a0faa.pem] + * <2a3699deca1e9fd099ba45de8489e205977c9f2a5e29d5dd747381eec0744d71.pem> + * <4bf6bb839b03b72839329b4ea70bb1b2f0d07e014d9d24aa9cc596114702bee3.pem> + * <79f69a47cfd6c4b4ceae8030d04b49f6171d3b5d6c812f58d040e586f1cb3f14.pem> + * <8290cc3fc1c3aac3239782c141ace8f88aeef4e9576a43d01867cf19d025be66.pem> + * <933f7d8cda9f0d7c8bfd3c22bf4653f4161fd38ccdcf66b22e95a2f49c2650f8.pem> + * <9532e8b504964331c271f3f5f10070131a08bf8ba438978ce394c34feeae246f.pem> + * <be144b56fb1163c49c9a0e6b5a458df6b29f7e6449985960c178a4744624b7bc.pem> + * <ead610e6e90b439f2ecb51628b0932620f6ef340bd843fca38d3181b8f4ba197.pem> + * <f8a5ff189fedbfe34e21103389a68340174439ad12974a4e8d4d784d1f3a0faa.pem> ### DigiNotar -For details, see [https://googleonlinesecurity.blogspot.com/2011/08/update-on-attempted-man-in-middle.html] -and [https://en.wikipedia.org/wiki/DigiNotar]. +For details, see <https://googleonlinesecurity.blogspot.com/2011/08/update-on-attempted-man-in-middle.html> +and <https://en.wikipedia.org/wiki/DigiNotar>. As a result of a complete CA compromise, the following certificates (and their associated public keypairs) are revoked. - * [0d136e439f0ab6e97f3a02a540da9f0641aa554e1d66ea51ae2920d51b2f7217.pem] - * [294f55ef3bd7244c6ff8a68ab797e9186ec27582751a791515e3292e48372d61.pem] - * [31c8fd37db9b56e708b03d1f01848b068c6da66f36fb5d82c008c6040fa3e133.pem] - * [3946901f46b0071e90d78279e82fababca177231a704be72c5b0e8918566ea66.pem] - * [450f1b421bb05c8609854884559c323319619e8b06b001ea2dcbb74a23aa3be2.pem] - * [4fee0163686ecbd65db968e7494f55d84b25486d438e9de558d629d28cd4d176.pem] - * [8a1bd21661c60015065212cc98b1abb50dfd14c872a208e66bae890f25c448af.pem] - * [9ed8f9b0e8e42a1656b8e1dd18f42ba42dc06fe52686173ba2fc70e756f207dc.pem] - * [a686fee577c88ab664d0787ecdfff035f4806f3de418dc9e4d516324fff02083.pem] - * [b8686723e415534bc0dbd16326f9486f85b0b0799bf6639334e61daae67f36cd.pem] - * [fdedb5bdfcb67411513a61aee5cb5b5d7c52af06028efc996cc1b05b1d6cea2b.pem] + * <0d136e439f0ab6e97f3a02a540da9f0641aa554e1d66ea51ae2920d51b2f7217.pem> + * <294f55ef3bd7244c6ff8a68ab797e9186ec27582751a791515e3292e48372d61.pem> + * <31c8fd37db9b56e708b03d1f01848b068c6da66f36fb5d82c008c6040fa3e133.pem> + * <3946901f46b0071e90d78279e82fababca177231a704be72c5b0e8918566ea66.pem> + * <450f1b421bb05c8609854884559c323319619e8b06b001ea2dcbb74a23aa3be2.pem> + * <4fee0163686ecbd65db968e7494f55d84b25486d438e9de558d629d28cd4d176.pem> + * <8a1bd21661c60015065212cc98b1abb50dfd14c872a208e66bae890f25c448af.pem> + * <9ed8f9b0e8e42a1656b8e1dd18f42ba42dc06fe52686173ba2fc70e756f207dc.pem> + * <a686fee577c88ab664d0787ecdfff035f4806f3de418dc9e4d516324fff02083.pem> + * <b8686723e415534bc0dbd16326f9486f85b0b0799bf6639334e61daae67f36cd.pem> + * <fdedb5bdfcb67411513a61aee5cb5b5d7c52af06028efc996cc1b05b1d6cea2b.pem> ### India CCA -For details, see [https://googleonlinesecurity.blogspot.com/2014/07/maintaining-digital-certificate-security.html] -and [https://technet.microsoft.com/en-us/library/security/2982792.aspx] +For details, see <https://googleonlinesecurity.blogspot.com/2014/07/maintaining-digital-certificate-security.html> +and <https://technet.microsoft.com/en-us/library/security/2982792.aspx> An unknown number of misissued certificates were issued by a sub-CA of India CCA, the India NIC. Due to the scope of the misissuance, the sub-CA was wholly revoked, and India CCA was constrained to a subset of India's ccTLD namespace. - * [67ed4b703d15dc555f8c444b3a05a32579cb7599bd19c9babe10c584ea327ae0.pem] - * [a8e1dfd9cd8e470aa2f443914f931cfd61c323e94d75827affee985241c35ce5.pem] - * [e4f9a3235df7330255f36412bc849fb630f8519961ec3538301deb896c953da5.pem] + * <67ed4b703d15dc555f8c444b3a05a32579cb7599bd19c9babe10c584ea327ae0.pem> + * <a8e1dfd9cd8e470aa2f443914f931cfd61c323e94d75827affee985241c35ce5.pem> + * <e4f9a3235df7330255f36412bc849fb630f8519961ec3538301deb896c953da5.pem> ### Trustwave -For details, see [https://www.trustwave.com/Resources/SpiderLabs-Blog/Clarifying-The-Trustwave-CA-Policy-Update/] -and [https://bugzilla.mozilla.org/show_bug.cgi?id=724929] +For details, see <https://www.trustwave.com/Resources/SpiderLabs-Blog/Clarifying-The-Trustwave-CA-Policy-Update/> +and <https://bugzilla.mozilla.org/show_bug.cgi?id=724929> Two certificates were issued by Trustwave for use in enterprise Man-in-the-Middle. The following public key was used for both certificates, and is revoked. - * [32ecc96f912f96d889e73088cd031c7ded2c651c805016157a23b6f32f798a3b.key] + * <32ecc96f912f96d889e73088cd031c7ded2c651c805016157a23b6f32f798a3b.key> ### TurkTrust -For details, see [https://googleonlinesecurity.blogspot.com/2013/01/enhancing-digital-certificate-security.html] -and [https://web.archive.org/web/20130326152502/http://turktrust.com.tr/kamuoyu-aciklamasi.2.html] +For details, see <https://googleonlinesecurity.blogspot.com/2013/01/enhancing-digital-certificate-security.html> +and <https://web.archive.org/web/20130326152502/http://turktrust.com.tr/kamuoyu-aciklamasi.2.html> As a result of a software configuration issue, two certificates were misissued by Turktrust that failed to properly set the basicConstraints extension. Because these certificates can be used to issue additional certificates, they have been revoked. - * [372447c43185c38edd2ce0e9c853f9ac1576ddd1704c2f54d96076c089cb4227.pem] - * [42187727be39faf667aeb92bf0cc4e268f6e2ead2cefbec575bdc90430024f69.pem] + * <372447c43185c38edd2ce0e9c853f9ac1576ddd1704c2f54d96076c089cb4227.pem> + * <42187727be39faf667aeb92bf0cc4e268f6e2ead2cefbec575bdc90430024f69.pem> ## Private Key Leakages ### Cyberoam -For details, see [https://blog.torproject.org/blog/security-vulnerability-found-cyberoam-dpi-devices-cve-2012-3372] +For details, see <https://blog.torproject.org/blog/security-vulnerability-found-cyberoam-dpi-devices-cve-2012-3372> Device manufacturer Cyberoam used the same private key for all devices by default, which subsequently leaked and is included below. The associated public key is blacklisted. - * [1af56c98ff043ef92bebff54cebb4dd67a25ba956c817f3e6dd3c1e52eb584c1.key] + * <1af56c98ff043ef92bebff54cebb4dd67a25ba956c817f3e6dd3c1e52eb584c1.key> ### Dell -For details, see [http://www.dell.com/support/article/us/en/19/SLN300321] -and [http://en.community.dell.com/dell-blogs/direct2dell/b/direct2dell/archive/2015/11/23/response-to-concerns-regarding-edellroot-certificate] +For details, see <http://www.dell.com/support/article/us/en/19/SLN300321> +and <http://en.community.dell.com/dell-blogs/direct2dell/b/direct2dell/archive/2015/11/23/response-to-concerns-regarding-edellroot-certificate> The private keys for both the eDellRoot and DSDTestProvider certificates were trivially extracted, and thus their associated public keys are blacklisted. - * [0f912fd7be760be25afbc56bdc09cd9e5dcc9c6f6a55a778aefcb6aa30e31554.pem] - * [ec30c9c3065a06bb07dc5b1c6b497f370c1ca65c0f30c08e042ba6bcecc78f2c.pem] + * <0f912fd7be760be25afbc56bdc09cd9e5dcc9c6f6a55a778aefcb6aa30e31554.pem> + * <ec30c9c3065a06bb07dc5b1c6b497f370c1ca65c0f30c08e042ba6bcecc78f2c.pem> ### sslip.io -For details, see [https://blog.pivotal.io/labs/labs/sslip-io-a-valid-ssl-certificate-for-every-ip-address] +For details, see <https://blog.pivotal.io/labs/labs/sslip-io-a-valid-ssl-certificate-for-every-ip-address> A subscriber of Comodo's acquired a wildcard certificate for sslip.io, and then subsequently published the private key, as a means for developers @@ -120,31 +120,42 @@ As the private key could be used to intercept all communications to this domain, the associated public key was blacklisted. - * [f3bae5e9c0adbfbfb6dbf7e04e74be6ead3ca98a5604ffe591cea86c241848ec.pem] + * <f3bae5e9c0adbfbfb6dbf7e04e74be6ead3ca98a5604ffe591cea86c241848ec.pem> ### xs4all.nl -For details, see [https://raymii.org/s/blog/How_I_got_a_valid_SSL_certificate_for_my_ISPs_main_website.html] +For details, see <https://raymii.org/s/blog/How_I_got_a_valid_SSL_certificate_for_my_ISPs_main_website.html> A user of xs4all was able to register a reserved email address that can be used to cause certificate issuance, as described in the CA/Browser Forum's Baseline Requirements, and then subsequently published the private key. - * [83618f932d6947744d5ecca299d4b2820c01483947bd16be814e683f7436be24.pem] + * <83618f932d6947744d5ecca299d4b2820c01483947bd16be814e683f7436be24.pem> ## Miscellaneous +### DigiCert + +For details, see <https://bugzilla.mozilla.org/show_bug.cgi?id=1242758> and +<https://bugzilla.mozilla.org/show_bug.cgi?id=1224104> + +These two intermediates were retired by DigiCert, and blacklisted for +robustness at their request. + + * <159ca03a88897c8f13817a212629df84ce824709492b8c9adb8e5437d2fc72be.pem> + * <b8c1b957c077ea76e00b0f45bff5ae3acb696f221d2e062164fe37125e5a8d25.pem> + ### Hacking Team The following keys were reported as used by Hacking Team to compromise users, and are blacklisted for robustness. - * [c4387d45364a313fbfe79812b35b815d42852ab03b06f11589638021c8f2cb44.key] - * [ea08c8d45d52ca593de524f0513ca6418da9859f7b08ef13ff9dd7bf612d6a37.key] + * <c4387d45364a313fbfe79812b35b815d42852ab03b06f11589638021c8f2cb44.key> + * <ea08c8d45d52ca593de524f0513ca6418da9859f7b08ef13ff9dd7bf612d6a37.key> ### live.fi -For details, see [https://technet.microsoft.com/en-us/library/security/3046310.aspx] +For details, see <https://technet.microsoft.com/en-us/library/security/3046310.aspx> A user of live.fi was able to register a reserved email address that can be used to cause certificate issuance, as described in the CA/Browser Forum's @@ -152,33 +163,33 @@ live.fi, but conformed to the Baseline Requirements. It was blacklisted for robustness. - * [c67d722c1495be02cbf9ef1159f5ca4aa782dc832dc6aa60c9aa076a0ad1e69d.pem] + * <c67d722c1495be02cbf9ef1159f5ca4aa782dc832dc6aa60c9aa076a0ad1e69d.pem> ### SECOM -For details, see [https://bugzilla.mozilla.org/show_bug.cgi?id=1188582] +For details, see <https://bugzilla.mozilla.org/show_bug.cgi?id=1188582> This intermediate certificate was retired by SECOM, and blacklisted for robustness at their request. - * [817d4e05063d5942869c47d8504dc56a5208f7569c3d6d67f3457cfe921b3e29.pem] + * <817d4e05063d5942869c47d8504dc56a5208f7569c3d6d67f3457cfe921b3e29.pem> ### Symantec -For details, see [https://bugzilla.mozilla.org/show_bug.cgi?id=966060] +For details, see <https://bugzilla.mozilla.org/show_bug.cgi?id=966060> These three intermediate certificates were retired by Symantec, and blacklisted for robustness at their request. - * [1f17f2cbb109f01c885c94d9e74a48625ae9659665d6d7e7bc5a10332976370f.pem] - * [3e26492e20b52de79e15766e6cb4251a1d566b0dbfb225aa7d08dda1dcebbf0a.pem] - * [7abd72a323c9d179c722564f4e27a51dd4afd24006b38a40ce918b94960bcf18.pem] + * <1f17f2cbb109f01c885c94d9e74a48625ae9659665d6d7e7bc5a10332976370f.pem> + * <3e26492e20b52de79e15766e6cb4251a1d566b0dbfb225aa7d08dda1dcebbf0a.pem> + * <7abd72a323c9d179c722564f4e27a51dd4afd24006b38a40ce918b94960bcf18.pem> ### T-Systems -For details, see [https://bugzilla.mozilla.org/show_bug.cgi?id=1076940] +For details, see <https://bugzilla.mozilla.org/show_bug.cgi?id=1076940> This intermediate certificate was retired by T-Systems, and blacklisted for robustness at their request. - * [f4a5984324de98bd979ef181a100cf940f2166173319a86a0d9d7c8fac3b0a8f.pem] + * <f4a5984324de98bd979ef181a100cf940f2166173319a86a0d9d7c8fac3b0a8f.pem>
diff --git a/net/data/ssl/blacklist/b8c1b957c077ea76e00b0f45bff5ae3acb696f221d2e062164fe37125e5a8d25.pem b/net/data/ssl/blacklist/b8c1b957c077ea76e00b0f45bff5ae3acb696f221d2e062164fe37125e5a8d25.pem new file mode 100644 index 0000000..5e89ba9 --- /dev/null +++ b/net/data/ssl/blacklist/b8c1b957c077ea76e00b0f45bff5ae3acb696f221d2e062164fe37125e5a8d25.pem
@@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIEKDCCAxCgAwIBAgIEBydr0TANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTEyMDExMTIyMTE1MFoX +DTIyMDExMTIyMTEzMVowXTELMAkGA1UEBhMCQkUxHDAaBgNVBAoTE0NlcnRpcG9z +dCBzLmEuL24udi4xMDAuBgNVBAMTJ0NlcnRpcG9zdCBFLVRydXN0IFByaW1hcnkg +Tm9ybWFsaXNlZCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANWz +qlKEeheTIg+4BBjKyfKCKqwVC6dQcbZMJWv3/wGqV1p3Tl4TFA1V8h7xhc2F14Ic +DNoJK739vJ7+bYlNogIk5lHqN38xRlp7mnazLqBdX+T4mQoHvu6SJhLJe+ddbNCD +Rw7AjKfReVfACxmcm55DxU6RJc6IK2152XmK1mZOIsMaRU7vyLBiJk4mVFCfDG+z +a8x8n3/eDw21j8Nr1OHC+7tWUKqMPY8Aizz8SBdq0lrzdW1lgb1GXZ+iYlOuzvOp +5JErWibDeWbRplNmNRwGcbHumQ7E+1gSrCJGLeIiktvhPL+7/obnkzRzz3hp08ve ++QyyaNrJigpgVMTzVmMCAwEAAaOB8jCB7zASBgNVHRMBAf8ECDAGAQH/AgEBMEUG +A1UdIAQ+MDwwOgYEVR0gADAyMDAGCCsGAQUFBwIBFiRodHRwczovL3d3dy5jZXJ0 +aXBvc3QuY29tL3Nob3dwb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB8GA1UdIwQYMBaA +FOWdWTCCR1jMrPoIVDaGezq1BE3wMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9j +ZHAxLnB1YmxpYy10cnVzdC5jb20vQ1JML09tbmlyb290MjAyNS5jcmwwHQYDVR0O +BBYEFBHyC5bSMziBV1gT/UCkEW9OmfpnMA0GCSqGSIb3DQEBBQUAA4IBAQCDTfzh +Nhln+aiZBvdDKvxd+/MR+HofOwAlvvV9VDNUH5B8fR+vFME4PgDg60zntgZEYg4F +U13K53/2U9m4vvBiLpRLBWIxyXaZ8hwsx8rRcKZvORai3BMDOUxqK0XAl5evbxzc +drpn1ao/fJURK6IBa8jblBrhNynpXChj5+dnNSheflN0mph3QXqNs8jAFxmw45Oq +guO8tEfGpgvGo4hntsA8lWsxerSrtQlJnV3acoauXRProOdTU2+uLD5dJUHEW2QB +/4um+9xTBDtyZ55YgTg2aalnbPet0lUjW3SRNYBEaEWDNsH0vToW7sjTSY0gEWrv +BOUM95u+bb7mIp88 +-----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/README b/net/data/ssl/certificates/README index 493283e1..977535e 100644 --- a/net/data/ssl/certificates/README +++ b/net/data/ssl/certificates/README
@@ -149,8 +149,6 @@ A certificate and private key only valid on 0001-01-01. Windows refuses to parse this certificate. -- sha256.pem: Used to test the handling of SHA-256 certs on Windows. - - spdy_pooling.pem : Used to test the handling of spdy IP connection pooling - subjectAltName_sanity_check.pem : Used to test the handling of various types
diff --git a/net/data/ssl/certificates/sha256.pem b/net/data/ssl/certificates/sha256.pem deleted file mode 100644 index 507ff04..0000000 --- a/net/data/ssl/certificates/sha256.pem +++ /dev/null
@@ -1,70 +0,0 @@ -Certificate: - Data: - Version: 1 (0x0) - Serial Number: - 90:23:b2:54:1d:1a:a1:b4 - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1 - Validity - Not Before: Sep 11 19:19:22 2014 GMT - Not After : Sep 8 19:19:22 2024 GMT - Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public Key: (2048 bit) - Modulus (2048 bit): - 00:d2:41:24:4c:b5:a5:83:ad:b9:64:5b:90:e2:d1: - e5:17:14:fe:ee:d0:6a:d8:d0:74:3c:98:35:d1:6b: - 2a:81:32:9e:e4:a2:77:5b:f2:81:2c:ae:c1:cc:ca: - f0:45:dd:8e:21:d3:4c:a6:7a:69:1b:08:3e:83:31: - 0e:cc:5a:f8:a4:b6:05:10:68:ec:a0:a2:44:b6:95: - e9:c5:e3:7c:a2:fa:a0:72:de:b3:49:e7:ac:cc:dc: - ce:f3:7c:af:9f:05:46:e4:c2:31:54:a4:2b:cc:bf: - ab:c3:e2:a6:9d:30:24:f4:2b:4d:44:eb:63:5f:35: - 0f:c5:ec:e9:77:40:0d:3d:35:6c:88:e7:18:c3:01: - 95:4c:c1:d4:14:96:88:66:98:fd:8e:0f:0e:a1:50: - d3:f9:13:e1:b6:5d:5a:8a:1c:8d:55:e1:43:3d:ca: - c6:31:95:9c:0a:00:68:38:1a:b7:24:ce:cd:34:d6: - 8d:f5:11:79:64:7b:01:b3:0f:76:fd:cf:ca:73:33: - 96:03:e4:1a:2e:98:8b:54:4d:0b:b9:62:27:8f:0d: - 9a:2c:1f:5d:b5:6a:e4:3a:27:33:02:eb:7f:0d:30: - 6a:6f:ea:61:c9:78:fe:7a:9f:08:7b:61:cd:b8:b2: - 04:98:24:37:d5:f7:ce:ec:34:29:b3:bc:26:ca:6f: - 54:53 - Exponent: 65537 (0x10001) - Signature Algorithm: sha256WithRSAEncryption - 73:89:72:15:fa:cf:c9:6a:4d:a5:1a:66:0d:da:03:13:2e:31: - 6b:6f:df:f1:4f:dd:54:8d:bd:87:1e:e9:b1:b2:84:4a:da:8e: - fa:76:b8:66:f0:2d:d6:f4:72:2d:55:ef:99:d4:e1:99:7c:79: - 98:b7:b9:bc:9c:f8:69:47:6d:10:03:4b:41:59:ea:84:7c:04: - 97:67:37:d4:a8:75:53:4a:f3:f9:9a:cb:bb:09:fb:dd:d7:b0: - d5:35:48:04:f3:58:78:bc:fb:26:d7:dc:e2:bf:cb:64:22:3d: - f7:bb:a4:5e:a3:98:5f:aa:29:46:aa:c6:a9:7c:8c:04:ac:21: - 21:97:b1:94:da:eb:ee:49:03:9d:46:e0:a0:22:e4:dd:e4:2b: - 3d:0d:0e:af:1b:59:39:41:e8:47:43:b8:58:36:82:86:c6:0e: - d6:d3:c0:92:da:2b:a4:5a:5a:f8:4f:20:93:32:a7:74:21:13: - 9d:b7:7b:68:20:71:81:4a:1a:32:b7:5e:e7:45:de:f7:e4:04: - dd:c1:7b:89:3e:a2:cb:47:20:fa:36:a6:bc:17:5a:19:56:97: - 1e:3c:fa:a7:fc:1e:d9:ad:dc:62:6b:ef:52:88:c8:d3:09:6c: - 6f:ff:d4:28:4b:7d:1e:9d:bb:0c:08:12:f3:f8:fd:24:35:57: - a2:3a:26:e2 ------BEGIN CERTIFICATE----- -MIIDPDCCAiQCCQCQI7JUHRqhtDANBgkqhkiG9w0BAQsFADBgMQswCQYDVQQGEwJV -UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQ -MA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMB4XDTE0MDkxMTE5 -MTkyMloXDTI0MDkwODE5MTkyMlowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh -bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg -Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBANJBJEy1pYOtuWRbkOLR5RcU/u7QatjQdDyYNdFrKoEynuSid1vygSyu -wczK8EXdjiHTTKZ6aRsIPoMxDsxa+KS2BRBo7KCiRLaV6cXjfKL6oHLes0nnrMzc -zvN8r58FRuTCMVSkK8y/q8Pipp0wJPQrTUTrY181D8Xs6XdADT01bIjnGMMBlUzB -1BSWiGaY/Y4PDqFQ0/kT4bZdWoocjVXhQz3KxjGVnAoAaDgatyTOzTTWjfUReWR7 -AbMPdv3PynMzlgPkGi6Yi1RNC7liJ48NmiwfXbVq5DonMwLrfw0wam/qYcl4/nqf -CHthzbiyBJgkN9X3zuw0KbO8JspvVFMCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA -c4lyFfrPyWpNpRpmDdoDEy4xa2/f8U/dVI29hx7psbKEStqO+na4ZvAt1vRyLVXv -mdThmXx5mLe5vJz4aUdtEANLQVnqhHwEl2c31Kh1U0rz+ZrLuwn73dew1TVIBPNY -eLz7Jtfc4r/LZCI997ukXqOYX6opRqrGqXyMBKwhIZexlNrr7kkDnUbgoCLk3eQr -PQ0OrxtZOUHoR0O4WDaChsYO1tPAktorpFpa+E8gkzKndCETnbd7aCBxgUoaMrde -50Xe9+QE3cF7iT6iy0cg+jamvBdaGVaXHjz6p/we2a3cYmvvUojI0wlsb//UKEt9 -Hp27DAgS8/j9JDVXojom4g== ------END CERTIFICATE-----
diff --git a/net/data/ssl/scripts/generate-test-certs.sh b/net/data/ssl/scripts/generate-test-certs.sh index 1358653..3f9e495 100755 --- a/net/data/ssl/scripts/generate-test-certs.sh +++ b/net/data/ssl/scripts/generate-test-certs.sh
@@ -152,12 +152,6 @@ > ../certificates/bad_validity.pem" # Now generate the one-off certs -## SHA-256 general test cert -try openssl req -x509 -days 3650 \ - -config ../scripts/ee.cnf -newkey rsa:2048 -text \ - -sha256 \ - -out ../certificates/sha256.pem - ## Self-signed cert for SPDY/QUIC/HTTP2 pooling testing try openssl req -x509 -days 3650 -extensions req_spdy_pooling \ -config ../scripts/ee.cnf -newkey rsa:2048 -text \
diff --git a/net/http/disk_based_cert_cache.cc b/net/http/disk_based_cert_cache.cc deleted file mode 100644 index 913e1b7..0000000 --- a/net/http/disk_based_cert_cache.cc +++ /dev/null
@@ -1,598 +0,0 @@ -// Copyright (c) 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/http/disk_based_cert_cache.h" - -#include <vector> - -#include "base/bind.h" -#include "base/callback_helpers.h" -#include "base/memory/ref_counted.h" -#include "base/metrics/histogram_macros.h" -#include "base/stl_util.h" -#include "base/strings/string_number_conversions.h" -#include "net/base/io_buffer.h" -#include "net/base/net_errors.h" -#include "net/disk_cache/disk_cache.h" - -namespace net { - -namespace { - -// TODO(brandonsalmon): change this number to improve performance. -const size_t kMemoryCacheMaxSize = 30; - -// Used to obtain a unique cache key for a certificate in the form of -// "cert:<hash>". -std::string GetCacheKeyForCert( - const X509Certificate::OSCertHandle cert_handle) { - SHA1HashValue fingerprint = - X509Certificate::CalculateFingerprint(cert_handle); - - return "cert:" + - base::HexEncode(fingerprint.data, arraysize(fingerprint.data)); -} - -enum CacheResult { - MEMORY_CACHE_HIT = 0, - DISK_CACHE_HIT, - DISK_CACHE_ENTRY_CORRUPT, - DISK_CACHE_ERROR, - CACHE_RESULT_MAX -}; - -void RecordCacheResult(CacheResult result) { - UMA_HISTOGRAM_ENUMERATION( - "DiskBasedCertCache.CertIoCacheResult", result, CACHE_RESULT_MAX); -} - -} // namespace - -// WriteWorkers represent pending SetCertificate jobs in the DiskBasedCertCache. -// Each certificate requested to be stored is assigned a WriteWorker. -// The same certificate should not have multiple WriteWorkers at the same -// time; instead, add a user callback to the existing WriteWorker. -class DiskBasedCertCache::WriteWorker { - public: - // |backend| is the backend to store |certificate| in, using - // |key| as the key for the disk_cache::Entry. - // |cleanup_callback| is called to clean up this ReadWorker, - // regardless of success or failure. - WriteWorker(disk_cache::Backend* backend, - const std::string& key, - X509Certificate::OSCertHandle cert_handle, - const base::Closure& cleanup_callback); - - ~WriteWorker(); - - // Writes the given certificate to the cache. On completion, will invoke all - // user callbacks. - void Start(); - - // Adds a callback to the set of callbacks to be run when this - // WriteWorker finishes processing. - void AddCallback(const SetCallback& user_callback); - - // Signals the WriteWorker to abort early. The WriteWorker will be destroyed - // upon the completion of any pending callbacks. User callbacks will be - // invoked with an empty string. - void Cancel(); - - private: - enum State { - STATE_OPEN, - STATE_OPEN_COMPLETE, - STATE_CREATE, - STATE_CREATE_COMPLETE, - STATE_WRITE, - STATE_WRITE_COMPLETE, - STATE_NONE - }; - - void OnIOComplete(int rv); - int DoLoop(int rv); - - int DoOpen(); - int DoOpenComplete(int rv); - int DoCreate(); - int DoCreateComplete(int rv); - int DoWrite(); - int DoWriteComplete(int rv); - - void Finish(int rv); - - // Invokes all of the |user_callbacks_| - void RunCallbacks(int rv); - - disk_cache::Backend* backend_; - const X509Certificate::OSCertHandle cert_handle_; - std::string key_; - bool canceled_; - - disk_cache::Entry* entry_; - State next_state_; - scoped_refptr<IOBuffer> buffer_; - int io_buf_len_; - - base::Closure cleanup_callback_; - std::vector<SetCallback> user_callbacks_; - CompletionCallback io_callback_; -}; - -DiskBasedCertCache::WriteWorker::WriteWorker( - disk_cache::Backend* backend, - const std::string& key, - X509Certificate::OSCertHandle cert_handle, - const base::Closure& cleanup_callback) - : backend_(backend), - cert_handle_(X509Certificate::DupOSCertHandle(cert_handle)), - key_(key), - canceled_(false), - entry_(NULL), - next_state_(STATE_NONE), - io_buf_len_(0), - cleanup_callback_(cleanup_callback), - io_callback_( - base::Bind(&WriteWorker::OnIOComplete, base::Unretained(this))) { -} - -DiskBasedCertCache::WriteWorker::~WriteWorker() { - if (cert_handle_) - X509Certificate::FreeOSCertHandle(cert_handle_); - if (entry_) - entry_->Close(); -} - -void DiskBasedCertCache::WriteWorker::Start() { - DCHECK_EQ(STATE_NONE, next_state_); - - next_state_ = STATE_OPEN; - int rv = DoLoop(OK); - - if (rv == ERR_IO_PENDING) - return; - - Finish(rv); -} - -void DiskBasedCertCache::WriteWorker::AddCallback( - const SetCallback& user_callback) { - user_callbacks_.push_back(user_callback); -} - -void DiskBasedCertCache::WriteWorker::Cancel() { - canceled_ = true; -} - -void DiskBasedCertCache::WriteWorker::OnIOComplete(int rv) { - if (canceled_) { - Finish(ERR_FAILED); - return; - } - - rv = DoLoop(rv); - - if (rv == ERR_IO_PENDING) - return; - - Finish(rv); -} - -int DiskBasedCertCache::WriteWorker::DoLoop(int rv) { - do { - State state = next_state_; - next_state_ = STATE_NONE; - switch (state) { - case STATE_OPEN: - rv = DoOpen(); - break; - case STATE_OPEN_COMPLETE: - rv = DoOpenComplete(rv); - break; - case STATE_CREATE: - rv = DoCreate(); - break; - case STATE_CREATE_COMPLETE: - rv = DoCreateComplete(rv); - break; - case STATE_WRITE: - rv = DoWrite(); - break; - case STATE_WRITE_COMPLETE: - rv = DoWriteComplete(rv); - break; - case STATE_NONE: - NOTREACHED(); - break; - } - } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); - - return rv; -} - -int DiskBasedCertCache::WriteWorker::DoOpen() { - next_state_ = STATE_OPEN_COMPLETE; - return backend_->OpenEntry(key_, &entry_, io_callback_); -} - -int DiskBasedCertCache::WriteWorker::DoOpenComplete(int rv) { - // The entry doesn't exist yet, so we should create it. - if (rv < 0) { - next_state_ = STATE_CREATE; - return OK; - } - - next_state_ = STATE_WRITE; - return OK; -} - -int DiskBasedCertCache::WriteWorker::DoCreate() { - next_state_ = STATE_CREATE_COMPLETE; - return backend_->CreateEntry(key_, &entry_, io_callback_); -} - -int DiskBasedCertCache::WriteWorker::DoCreateComplete(int rv) { - if (rv < 0) - return rv; - - next_state_ = STATE_WRITE; - return OK; -} - -int DiskBasedCertCache::WriteWorker::DoWrite() { - std::string write_data; - bool encoded = X509Certificate::GetDEREncoded(cert_handle_, &write_data); - - if (!encoded) - return ERR_FAILED; - - buffer_ = new IOBuffer(write_data.size()); - io_buf_len_ = write_data.size(); - memcpy(buffer_->data(), write_data.data(), io_buf_len_); - - next_state_ = STATE_WRITE_COMPLETE; - - return entry_->WriteData(0 /* index */, - 0 /* offset */, - buffer_.get(), - write_data.size(), - io_callback_, - true /* truncate */); -} - -int DiskBasedCertCache::WriteWorker::DoWriteComplete(int rv) { - if (rv < io_buf_len_) - return ERR_FAILED; - - return OK; -} - -void DiskBasedCertCache::WriteWorker::Finish(int rv) { - cleanup_callback_.Run(); - cleanup_callback_.Reset(); - RunCallbacks(rv); - delete this; -} - -void DiskBasedCertCache::WriteWorker::RunCallbacks(int rv) { - std::string key; - if (rv >= 0) - key = key_; - - for (std::vector<SetCallback>::const_iterator it = user_callbacks_.begin(); - it != user_callbacks_.end(); - ++it) { - it->Run(key); - } - user_callbacks_.clear(); -} - -// ReadWorkers represent pending GetCertificate jobs in the DiskBasedCertCache. -// Each certificate requested to be retrieved from the cache is assigned a -// ReadWorker. The same |key| should not have multiple ReadWorkers at the -// same time; instead, call AddCallback to add a user callback to the -// existing ReadWorker. -class DiskBasedCertCache::ReadWorker { - public: - // |backend| is the backend to read |certificate| from, using - // |key| as the key for the disk_cache::Entry. - // |cleanup_callback| is called to clean up this ReadWorker, - // regardless of success or failure. - ReadWorker(disk_cache::Backend* backend, - const std::string& key, - const GetCallback& cleanup_callback); - - ~ReadWorker(); - - // Reads the given certificate from the cache. On completion, will invoke all - // user callbacks. - void Start(); - - // Adds a callback to the set of callbacks to be run when this - // ReadWorker finishes processing. - void AddCallback(const GetCallback& user_callback); - - // Signals the ReadWorker to abort early. The ReadWorker will be destroyed - // upon the completion of any pending callbacks. User callbacks will be - // invoked with a NULL cert handle. - void Cancel(); - - private: - enum State { - STATE_OPEN, - STATE_OPEN_COMPLETE, - STATE_READ, - STATE_READ_COMPLETE, - STATE_NONE - }; - - void OnIOComplete(int rv); - int DoLoop(int rv); - int DoOpen(); - int DoOpenComplete(int rv); - int DoRead(); - int DoReadComplete(int rv); - void Finish(int rv); - - // Invokes all of |user_callbacks_| - void RunCallbacks(); - - disk_cache::Backend* backend_; - X509Certificate::OSCertHandle cert_handle_; - std::string key_; - bool canceled_; - - disk_cache::Entry* entry_; - - State next_state_; - scoped_refptr<IOBuffer> buffer_; - int io_buf_len_; - - GetCallback cleanup_callback_; - std::vector<GetCallback> user_callbacks_; - CompletionCallback io_callback_; -}; - -DiskBasedCertCache::ReadWorker::ReadWorker(disk_cache::Backend* backend, - const std::string& key, - const GetCallback& cleanup_callback) - : backend_(backend), - cert_handle_(NULL), - key_(key), - canceled_(false), - entry_(NULL), - next_state_(STATE_NONE), - io_buf_len_(0), - cleanup_callback_(cleanup_callback), - io_callback_( - base::Bind(&ReadWorker::OnIOComplete, base::Unretained(this))) { -} - -DiskBasedCertCache::ReadWorker::~ReadWorker() { - if (entry_) - entry_->Close(); - if (cert_handle_) - X509Certificate::FreeOSCertHandle(cert_handle_); -} - -void DiskBasedCertCache::ReadWorker::Start() { - DCHECK_EQ(STATE_NONE, next_state_); - next_state_ = STATE_OPEN; - int rv = DoLoop(OK); - - if (rv == ERR_IO_PENDING) - return; - - Finish(rv); -} - -void DiskBasedCertCache::ReadWorker::AddCallback( - const GetCallback& user_callback) { - user_callbacks_.push_back(user_callback); -} - -void DiskBasedCertCache::ReadWorker::Cancel() { - canceled_ = true; -} - -void DiskBasedCertCache::ReadWorker::OnIOComplete(int rv) { - if (canceled_) { - Finish(ERR_FAILED); - return; - } - - rv = DoLoop(rv); - - if (rv == ERR_IO_PENDING) - return; - - Finish(rv); -} - -int DiskBasedCertCache::ReadWorker::DoLoop(int rv) { - do { - State state = next_state_; - next_state_ = STATE_NONE; - switch (state) { - case STATE_OPEN: - rv = DoOpen(); - break; - case STATE_OPEN_COMPLETE: - rv = DoOpenComplete(rv); - break; - case STATE_READ: - rv = DoRead(); - break; - case STATE_READ_COMPLETE: - rv = DoReadComplete(rv); - break; - case STATE_NONE: - NOTREACHED(); - break; - } - } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); - - return rv; -} - -int DiskBasedCertCache::ReadWorker::DoOpen() { - next_state_ = STATE_OPEN_COMPLETE; - return backend_->OpenEntry(key_, &entry_, io_callback_); -} - -int DiskBasedCertCache::ReadWorker::DoOpenComplete(int rv) { - if (rv < 0) { - RecordCacheResult(DISK_CACHE_ERROR); - return rv; - } - - next_state_ = STATE_READ; - return OK; -} - -int DiskBasedCertCache::ReadWorker::DoRead() { - next_state_ = STATE_READ_COMPLETE; - io_buf_len_ = entry_->GetDataSize(0 /* index */); - buffer_ = new IOBuffer(io_buf_len_); - return entry_->ReadData( - 0 /* index */, 0 /* offset */, buffer_.get(), io_buf_len_, io_callback_); -} - -int DiskBasedCertCache::ReadWorker::DoReadComplete(int rv) { - // The cache should return the entire buffer length. If it does not, - // it is probably indicative of an issue other than corruption. - if (rv < io_buf_len_) { - RecordCacheResult(DISK_CACHE_ERROR); - return ERR_FAILED; - } - cert_handle_ = X509Certificate::CreateOSCertHandleFromBytes(buffer_->data(), - io_buf_len_); - if (!cert_handle_) { - RecordCacheResult(DISK_CACHE_ENTRY_CORRUPT); - return ERR_FAILED; - } - - RecordCacheResult(DISK_CACHE_HIT); - return OK; -} - -void DiskBasedCertCache::ReadWorker::Finish(int rv) { - cleanup_callback_.Run(cert_handle_); - cleanup_callback_.Reset(); - RunCallbacks(); - delete this; -} - -void DiskBasedCertCache::ReadWorker::RunCallbacks() { - for (std::vector<GetCallback>::const_iterator it = user_callbacks_.begin(); - it != user_callbacks_.end(); - ++it) { - it->Run(cert_handle_); - } - user_callbacks_.clear(); -} - -void DiskBasedCertCache::CertFree::operator()( - X509Certificate::OSCertHandle cert_handle) { - X509Certificate::FreeOSCertHandle(cert_handle); -} - -DiskBasedCertCache::DiskBasedCertCache(disk_cache::Backend* backend) - : backend_(backend), - mru_cert_cache_(kMemoryCacheMaxSize), - mem_cache_hits_(0), - mem_cache_misses_(0), - weak_factory_(this) { - DCHECK(backend_); -} - -DiskBasedCertCache::~DiskBasedCertCache() { - for (WriteWorkerMap::iterator it = write_worker_map_.begin(); - it != write_worker_map_.end(); - ++it) { - it->second->Cancel(); - } - for (ReadWorkerMap::iterator it = read_worker_map_.begin(); - it != read_worker_map_.end(); - ++it) { - it->second->Cancel(); - } -} - -void DiskBasedCertCache::GetCertificate(const std::string& key, - const GetCallback& cb) { - DCHECK(!key.empty()); - - // If the handle is already in the MRU cache, just return that (via callback). - // Note, this will also bring the cert_handle to the front of the recency - // list in the MRU cache. - MRUCertCache::iterator mru_it = mru_cert_cache_.Get(key); - if (mru_it != mru_cert_cache_.end()) { - RecordCacheResult(MEMORY_CACHE_HIT); - ++mem_cache_hits_; - cb.Run(mru_it->second); - return; - } - ++mem_cache_misses_; - - ReadWorkerMap::iterator it = read_worker_map_.find(key); - - if (it == read_worker_map_.end()) { - ReadWorker* worker = - new ReadWorker(backend_, - key, - base::Bind(&DiskBasedCertCache::FinishedReadOperation, - weak_factory_.GetWeakPtr(), - key)); - read_worker_map_[key] = worker; - worker->AddCallback(cb); - worker->Start(); - } else { - it->second->AddCallback(cb); - } -} - -void DiskBasedCertCache::SetCertificate( - const X509Certificate::OSCertHandle cert_handle, - const SetCallback& cb) { - DCHECK(!cb.is_null()); - DCHECK(cert_handle); - std::string key = GetCacheKeyForCert(cert_handle); - - WriteWorkerMap::iterator it = write_worker_map_.find(key); - - if (it == write_worker_map_.end()) { - WriteWorker* worker = - new WriteWorker(backend_, - key, - cert_handle, - base::Bind(&DiskBasedCertCache::FinishedWriteOperation, - weak_factory_.GetWeakPtr(), - key, - cert_handle)); - write_worker_map_[key] = worker; - worker->AddCallback(cb); - worker->Start(); - } else { - it->second->AddCallback(cb); - } -} - -void DiskBasedCertCache::FinishedReadOperation( - const std::string& key, - X509Certificate::OSCertHandle cert_handle) { - if (cert_handle) - mru_cert_cache_.Put(key, X509Certificate::DupOSCertHandle(cert_handle)); - read_worker_map_.erase(key); -} - -void DiskBasedCertCache::FinishedWriteOperation( - const std::string& key, - X509Certificate::OSCertHandle cert_handle) { - write_worker_map_.erase(key); - if (!key.empty()) - mru_cert_cache_.Put(key, X509Certificate::DupOSCertHandle(cert_handle)); -} - -} // namespace net
diff --git a/net/http/disk_based_cert_cache.h b/net/http/disk_based_cert_cache.h deleted file mode 100644 index 7c9edec..0000000 --- a/net/http/disk_based_cert_cache.h +++ /dev/null
@@ -1,106 +0,0 @@ -// Copyright (c) 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef NET_HTTP_DISK_BASED_CERT_CACHE_H -#define NET_HTTP_DISK_BASED_CERT_CACHE_H - -#include <stddef.h> - -#include <string> - -#include "base/callback.h" -#include "base/containers/hash_tables.h" -#include "base/containers/mru_cache.h" -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "net/base/net_export.h" -#include "net/cert/x509_certificate.h" - -namespace disk_cache { -class Backend; -} // namespace disk_cache - -namespace net { - -// DiskBasedCertCache is used to store and retrieve X.509 certificates from the -// cache. Each individual certificate is stored separately from its certificate -// chain. No more than one copy (per certificate) will be stored on disk. -class NET_EXPORT_PRIVATE DiskBasedCertCache { - public: - typedef base::Callback<void(const X509Certificate::OSCertHandle cert_handle)> - GetCallback; - typedef base::Callback<void(const std::string&)> SetCallback; - - // Initializes a new DiskBasedCertCache that will access the disk cache via - // |backend|. - explicit DiskBasedCertCache(disk_cache::Backend* backend); - ~DiskBasedCertCache(); - - // Fetches the certificate associated with |key|. If the certificate is - // found within the cache, |cb| will be called with the certificate. - // Otherwise, |cb| will be called with NULL. Callers that wish to store - // a reference to the certificate need to use X509Certificate::DupOSCertHandle - // inside |cb|. - void GetCertificate(const std::string& key, const GetCallback& cb); - - // Stores |cert_handle| in the cache. If |cert_handle| is successfully stored, - // |cb| will be called with the key. If |cb| is called with an empty - // string, then |cert_handle| was not stored. - void SetCertificate(const X509Certificate::OSCertHandle cert_handle, - const SetCallback& cb); - - // Returns the number of in-memory MRU cache hits that have occurred - // on SetCertificate and GetCertificate operations. Intended for test purposes - // only. - size_t mem_cache_hits_for_testing() const { return mem_cache_hits_; } - - // Returns the number of in-memory MRU cache misses that have occurred - // on SetCertificate and GetCertificate operations. Intended for test purposes - // only. - size_t mem_cache_misses_for_testing() const { return mem_cache_misses_; } - - private: - class ReadWorker; - class WriteWorker; - - // A functor used to free an OSCertHandle. Used by the MRUCertCache. - struct CertFree { - void operator()(X509Certificate::OSCertHandle cert_handle); - }; - - // An in-memory cache that is used to prevent redundantly reading - // from disk. - typedef base::MRUCacheBase<std::string, - X509Certificate::OSCertHandle, - CertFree> MRUCertCache; - - // ReadWorkerMap and WriteWorkerMap map cache keys to their - // corresponding Workers. - typedef base::hash_map<std::string, ReadWorker*> ReadWorkerMap; - typedef base::hash_map<std::string, WriteWorker*> WriteWorkerMap; - - // FinishedReadOperation and FinishedWriteOperation are used to remove - // workers from their respective worker maps, and perform other necessary - // cleanup. They are called from the workers via callback. - void FinishedReadOperation(const std::string& key, - X509Certificate::OSCertHandle cert_handle); - void FinishedWriteOperation(const std::string& key, - X509Certificate::OSCertHandle cert_handle); - - disk_cache::Backend* backend_; - - ReadWorkerMap read_worker_map_; - WriteWorkerMap write_worker_map_; - MRUCertCache mru_cert_cache_; - - int mem_cache_hits_; - int mem_cache_misses_; - - base::WeakPtrFactory<DiskBasedCertCache> weak_factory_; - DISALLOW_COPY_AND_ASSIGN(DiskBasedCertCache); -}; - -} // namespace net - -#endif // NET_HTTP_DISK_BASED_CERT_CACHE_H
diff --git a/net/http/disk_based_cert_cache_unittest.cc b/net/http/disk_based_cert_cache_unittest.cc deleted file mode 100644 index b2b640b3..0000000 --- a/net/http/disk_based_cert_cache_unittest.cc +++ /dev/null
@@ -1,535 +0,0 @@ -// Copyright (c) 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/http/disk_based_cert_cache.h" - -#include "base/bind.h" -#include "base/callback_helpers.h" -#include "net/base/completion_callback.h" -#include "net/base/io_buffer.h" -#include "net/base/net_errors.h" -#include "net/base/test_completion_callback.h" -#include "net/base/test_data_directory.h" -#include "net/disk_cache/memory/mem_backend_impl.h" -#include "net/http/mock_http_cache.h" -#include "net/test/cert_test_util.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace net { - -namespace { - -// Testing the DiskBasedCertCache requires constant use of the -// certificates in GetTestCertsDirectory(). The TestCertMetaData -// struct stores metadata relevant to the DiskBasedCertCache for -// each used test certificate. -struct TestCertMetaData { - const char* file_name; - const char* cache_key; -}; - -const TestCertMetaData kCert1 = { - "root_ca_cert.pem", "cert:738D348A8AFCEC4F79C3E4B1845D985AF601AB0F"}; - -const TestCertMetaData kCert2 = { - "ok_cert.pem", "cert:6C9DFD2CFA9885C71BE6DE0EA0CF962AC8F9131B"}; - -// MockTransactions are required to use the MockDiskCache backend. -// |key| is a cache key, and is equivalent to the key that will be -// used to store or retrieve certificates in the cache. |test_mode| -// is an integer that is used to indicate properties of the test -// transaction, mostly whether or not it is synchronous. -// For testing the DiskBasedCertCache, other data members of the struct -// are irrelevant. Only one MockTransaction per certificate can be used -// at a time. -MockTransaction CreateMockTransaction(const char* key, int test_mode) { - MockTransaction transaction = {key, "", base::Time(), "", LOAD_NORMAL, - "", "", base::Time(), "", test_mode, - NULL, 0, OK}; - - return transaction; -} - -// Helper class, for use with DiskBasedCertCache::GetCertificate, that will -// store the returned certificate handle and allow users to WaitForResult of -// DiskBasedCertCache::GetCertificate. -class TestGetCallback { - public: - TestGetCallback() : cert_handle_(NULL) {} - ~TestGetCallback() { - if (cert_handle_) - X509Certificate::FreeOSCertHandle(cert_handle_); - } - - // Blocks until the underlying GetCertificate() operation has succeeded. - void WaitForResult() { cb_.WaitForResult(); } - - // Returns a Callback suitable for use with - // DiskBasedCertCache::GetCertificate(). The returned callback is only valid - // while the TestGetCallback object is still valid. - DiskBasedCertCache::GetCallback callback() { - return base::Bind(&TestGetCallback::OnGetComplete, base::Unretained(this)); - } - - // Returns the associated certificate handle. - const X509Certificate::OSCertHandle& cert_handle() const { - return cert_handle_; - } - - private: - void OnGetComplete(const X509Certificate::OSCertHandle handle) { - if (handle) - cert_handle_ = X509Certificate::DupOSCertHandle(handle); - cb_.callback().Run(OK); - } - - TestCompletionCallback cb_; - X509Certificate::OSCertHandle cert_handle_; -}; - -// Helper class, for use with DiskBasedCertCache::SetCertificate, that will -// store the returned key and allow a user to WaitForResult of -// DiskBasedCertCache::SetCertificate. -class TestSetCallback { - public: - TestSetCallback() {} - ~TestSetCallback() {} - - // Blocks until the underlying SetCertificate() operation has succeeded. - void WaitForResult() { cb_.WaitForResult(); } - - // Returns a Callback suitable for use with - // DiskBasedCertCache::SetCertificate(). The returned callback is only valid - // while the TestSetCallback object is still valid. - DiskBasedCertCache::SetCallback callback() { - return base::Bind(&TestSetCallback::OnSetComplete, base::Unretained(this)); - } - - // Returns the associated certificate handle. - const std::string& key() const { return key_; } - - private: - void OnSetComplete(const std::string& key) { - key_ = key; - cb_.callback().Run(OK); - } - - TestCompletionCallback cb_; - std::string key_; -}; - -// Stores the certificate corresponding to |cert_data| in |backend|. If -// |corrupt_data| is true, the certificate will be imported with errors -// so as to mimic a corrupted file on disk. -void ImportCert(disk_cache::Backend* backend, - const TestCertMetaData& cert_data, - bool corrupt_data) { - disk_cache::Entry* entry; - TestCompletionCallback callback; - int rv = - backend->CreateEntry(cert_data.cache_key, &entry, callback.callback()); - EXPECT_EQ(OK, callback.GetResult(rv)); - scoped_refptr<X509Certificate> cert( - ImportCertFromFile(GetTestCertsDirectory(), cert_data.file_name)); - std::string write_data; - bool encoded = - X509Certificate::GetDEREncoded(cert->os_cert_handle(), &write_data); - ASSERT_TRUE(encoded); - if (corrupt_data) { - for (size_t i = 0; i < write_data.size(); i += 20) - ++write_data[i]; - } - scoped_refptr<IOBuffer> buffer(new IOBuffer(write_data.size())); - memcpy(buffer->data(), write_data.data(), write_data.size()); - rv = entry->WriteData(0 /* index */, - 0 /* offset */, - buffer.get(), - write_data.size(), - callback.callback(), - true /* truncate */); - ASSERT_EQ(static_cast<int>(write_data.size()), callback.GetResult(rv)); - entry->Close(); -} - -// Checks that the the certificate corresponding to |cert_data| is an existing, -// correctly cached entry in |backend|. -void CheckCertCached(disk_cache::Backend* backend, - const TestCertMetaData& cert_data) { - disk_cache::Entry* entry; - TestCompletionCallback callback; - int rv = backend->OpenEntry(cert_data.cache_key, &entry, callback.callback()); - EXPECT_EQ(OK, callback.GetResult(rv)); - scoped_refptr<X509Certificate> cert( - ImportCertFromFile(GetTestCertsDirectory(), cert_data.file_name)); - std::string write_data; - bool encoded = - X509Certificate::GetDEREncoded(cert->os_cert_handle(), &write_data); - ASSERT_TRUE(encoded); - int entry_size = entry->GetDataSize(0 /* index */); - scoped_refptr<IOBuffer> buffer(new IOBuffer(entry_size)); - rv = entry->ReadData(0 /* index */, - 0 /* offset */, - buffer.get(), - entry_size, - callback.callback()); - EXPECT_EQ(entry_size, callback.GetResult(rv)); - entry->Close(); - X509Certificate::OSCertHandle cached_cert_handle = - X509Certificate::CreateOSCertHandleFromBytes(buffer->data(), entry_size); - EXPECT_TRUE(X509Certificate::IsSameOSCert(cached_cert_handle, - cert->os_cert_handle())); - X509Certificate::FreeOSCertHandle(cached_cert_handle); -} - -} // namespace - -// ---------------------------------------------------------------------------- - -// Tests that a certificate can be stored in the cache. -TEST(DiskBasedCertCache, SetCert) { - ScopedMockTransaction trans1( - CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL)); - MockDiskCache backend; - DiskBasedCertCache cache(&backend); - scoped_refptr<X509Certificate> cert( - ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name)); - ASSERT_TRUE(cert.get()); - TestSetCallback set_callback; - - cache.SetCertificate(cert->os_cert_handle(), set_callback.callback()); - set_callback.WaitForResult(); - EXPECT_EQ(kCert1.cache_key, set_callback.key()); - ASSERT_NO_FATAL_FAILURE(CheckCertCached(&backend, kCert1)); -} - -// Tests that a certificate can be retrieved from the cache. -TEST(DiskBasedCertCache, GetCert) { - ScopedMockTransaction trans1( - CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL)); - MockDiskCache backend; - ASSERT_NO_FATAL_FAILURE( - ImportCert(&backend, kCert1, false /* not corrupted */)); - DiskBasedCertCache cache(&backend); - TestGetCallback get_callback; - - cache.GetCertificate(kCert1.cache_key, get_callback.callback()); - get_callback.WaitForResult(); - - scoped_refptr<X509Certificate> cert( - ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name)); - EXPECT_TRUE(X509Certificate::IsSameOSCert(get_callback.cert_handle(), - cert->os_cert_handle())); -} - -// Tests that the DiskBasedCertCache successfully writes to the cache -// if the cache acts synchronously -TEST(DiskBasedCertCache, SyncSet) { - ScopedMockTransaction trans1( - CreateMockTransaction(kCert1.cache_key, TEST_MODE_SYNC_ALL)); - MockDiskCache backend; - DiskBasedCertCache cache(&backend); - scoped_refptr<X509Certificate> cert( - ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name)); - ASSERT_TRUE(cert.get()); - - TestSetCallback set_callback; - cache.SetCertificate(cert->os_cert_handle(), set_callback.callback()); - set_callback.WaitForResult(); - EXPECT_EQ(kCert1.cache_key, set_callback.key()); - ASSERT_NO_FATAL_FAILURE(CheckCertCached(&backend, kCert1)); -} - -// Tests that the DiskBasedCertCache successfully reads from the cache -// if the cache acts synchronously -TEST(DiskBasedCertCache, SyncGet) { - ScopedMockTransaction trans1( - CreateMockTransaction(kCert1.cache_key, TEST_MODE_SYNC_ALL)); - MockDiskCache backend; - ASSERT_NO_FATAL_FAILURE( - (ImportCert(&backend, kCert1, false /* not corrupted */))); - DiskBasedCertCache cache(&backend); - scoped_refptr<X509Certificate> cert( - ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name)); - ASSERT_TRUE(cert.get()); - - TestGetCallback get_callback; - cache.GetCertificate(kCert1.cache_key, get_callback.callback()); - get_callback.WaitForResult(); - EXPECT_TRUE(X509Certificate::IsSameOSCert(get_callback.cert_handle(), - cert->os_cert_handle())); -} - -// Tests that GetCertificate will fail on a corrupted certificate. -TEST(DiskBasedCertCache, GetBrokenCert) { - ScopedMockTransaction trans1( - CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL)); - MockDiskCache backend; - ASSERT_NO_FATAL_FAILURE(ImportCert(&backend, kCert1, true /* corrupted */)); - DiskBasedCertCache cache(&backend); - TestGetCallback get_callback; - - cache.GetCertificate(kCert1.cache_key, get_callback.callback()); - get_callback.WaitForResult(); - - EXPECT_FALSE(get_callback.cert_handle()); -} - -// Tests that attempting to retrieve a cert that is not in the cache will -// return NULL. -TEST(DiskBasedCertCache, GetUncachedCert) { - ScopedMockTransaction trans1( - CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL)); - MockDiskCache backend; - DiskBasedCertCache cache(&backend); - TestGetCallback get_callback; - - cache.GetCertificate(kCert1.cache_key, get_callback.callback()); - get_callback.WaitForResult(); - EXPECT_EQ(NULL, get_callback.cert_handle()); -} - -// Issues two requests to store a certificate in the cache -// (simultaneously), and checks that the DiskBasedCertCache stores the -// certificate to the cache (in one write rather than two). -TEST(DiskBasedCertCache, SetMultiple) { - ScopedMockTransaction trans1( - CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL)); - MockDiskCache backend; - DiskBasedCertCache cache(&backend); - scoped_refptr<X509Certificate> cert( - ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name)); - ASSERT_TRUE(cert.get()); - TestSetCallback set_callback1, set_callback2; - - // Behind the scenes, these two operations will be combined - // into one operation. IgnoreCallbacks guarantees that the - // first SetCertificate operation is not yet complete when the second - // SetCertificate is called, and then IgnoreCallbacks(false) continues the - // (combined) operation in the |cache|. - MockDiskEntry::IgnoreCallbacks(true); - cache.SetCertificate(cert->os_cert_handle(), set_callback1.callback()); - cache.SetCertificate(cert->os_cert_handle(), set_callback2.callback()); - MockDiskEntry::IgnoreCallbacks(false); - - set_callback1.WaitForResult(); - set_callback2.WaitForResult(); - EXPECT_EQ(set_callback1.key(), set_callback2.key()); - ASSERT_NO_FATAL_FAILURE(CheckCertCached(&backend, kCert1)); -} - -// Issues two requests to store a certificate in the cache -// because the first transaction finishes before the second -// one is issued, the first cache write is overwritten. -TEST(DiskBasedCertCache, SetOverwrite) { - ScopedMockTransaction trans1( - CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL)); - MockDiskCache backend; - backend.set_double_create_check(false); - DiskBasedCertCache cache(&backend); - scoped_refptr<X509Certificate> cert( - ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name)); - ASSERT_TRUE(cert.get()); - TestSetCallback set_callback1, set_callback2; - - cache.SetCertificate(cert->os_cert_handle(), set_callback1.callback()); - set_callback1.WaitForResult(); - cache.SetCertificate(cert->os_cert_handle(), set_callback2.callback()); - set_callback2.WaitForResult(); - - EXPECT_EQ(set_callback1.key(), set_callback2.key()); - ASSERT_NO_FATAL_FAILURE(CheckCertCached(&backend, kCert1)); -} - -// Stores a certificate in the DiskBasedCertCache, then retrieves it -// and makes sure it was retrieved successfully. -TEST(DiskBasedCertCache, SimpleSetAndGet) { - ScopedMockTransaction trans1( - CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL)); - MockDiskCache backend; - DiskBasedCertCache cache(&backend); - scoped_refptr<X509Certificate> cert( - ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name)); - ASSERT_TRUE(cert.get()); - TestSetCallback set_callback; - TestGetCallback get_callback; - - cache.SetCertificate(cert->os_cert_handle(), set_callback.callback()); - set_callback.WaitForResult(); - cache.GetCertificate(set_callback.key(), get_callback.callback()); - get_callback.WaitForResult(); - EXPECT_TRUE(X509Certificate::IsSameOSCert(get_callback.cert_handle(), - cert->os_cert_handle())); -} - -// Tests some basic functionality of the DiskBasedCertCache, with multiple -// set and get operations. -TEST(DiskBasedCertCache, BasicUsage) { - ScopedMockTransaction trans1( - CreateMockTransaction(kCert1.cache_key, TEST_MODE_SYNC_CACHE_START)); - ScopedMockTransaction trans2( - CreateMockTransaction(kCert2.cache_key, TEST_MODE_NORMAL)); - MockDiskCache backend; - DiskBasedCertCache cache(&backend); - scoped_refptr<X509Certificate> cert1( - ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name)); - scoped_refptr<X509Certificate> cert2( - ImportCertFromFile(GetTestCertsDirectory(), kCert2.file_name)); - ASSERT_TRUE(cert1.get()); - ASSERT_TRUE(cert2.get()); - ASSERT_FALSE(X509Certificate::IsSameOSCert(cert1->os_cert_handle(), - cert2->os_cert_handle())); - TestSetCallback set_callback1, set_callback2; - - // Callbacks are temporarily ignored here to guarantee the asynchronous - // operations of the DiskBasedCertCache are always executed in the same - // order. - MockDiskEntry::IgnoreCallbacks(true); - cache.SetCertificate(cert1->os_cert_handle(), set_callback1.callback()); - cache.SetCertificate(cert2->os_cert_handle(), set_callback2.callback()); - MockDiskEntry::IgnoreCallbacks(false); - set_callback1.WaitForResult(); - set_callback2.WaitForResult(); - - TestGetCallback get_callback1, get_callback2; - - MockDiskEntry::IgnoreCallbacks(true); - cache.GetCertificate(set_callback1.key(), get_callback1.callback()); - cache.GetCertificate(set_callback2.key(), get_callback2.callback()); - MockDiskEntry::IgnoreCallbacks(false); - get_callback1.WaitForResult(); - get_callback2.WaitForResult(); - - EXPECT_TRUE(X509Certificate::IsSameOSCert(cert1->os_cert_handle(), - get_callback1.cert_handle())); - EXPECT_TRUE(X509Certificate::IsSameOSCert(cert2->os_cert_handle(), - get_callback2.cert_handle())); -} - -// Test the result of simultaneous requests to store and retrieve a -// certificate from the cache, with the get operation attempting to -// open the cache first and therefore failing to open the entry. -TEST(DiskBasedCertCache, SimultaneousGetSet) { - ScopedMockTransaction trans1( - CreateMockTransaction(kCert1.cache_key, TEST_MODE_SYNC_CACHE_START)); - MockDiskCache backend; - DiskBasedCertCache cache(&backend); - scoped_refptr<X509Certificate> cert( - ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name)); - ASSERT_TRUE(cert.get()); - - TestGetCallback get_callback; - TestSetCallback set_callback; - - MockDiskEntry::IgnoreCallbacks(true); - cache.GetCertificate(kCert1.cache_key, get_callback.callback()); - cache.SetCertificate(cert->os_cert_handle(), set_callback.callback()); - MockDiskEntry::IgnoreCallbacks(false); - get_callback.WaitForResult(); - set_callback.WaitForResult(); - - EXPECT_EQ(NULL, get_callback.cert_handle()); - EXPECT_EQ(kCert1.cache_key, set_callback.key()); -} - -// Test the result of simultaneous requests to store and retrieve a -// certificate from the cache, with the get operation opening the cache -// after the set operation, leading to a successful read. -TEST(DiskBasedCertCache, SimultaneousSetGet) { - ScopedMockTransaction trans1( - CreateMockTransaction(kCert1.cache_key, TEST_MODE_SYNC_CACHE_START)); - MockDiskCache backend; - DiskBasedCertCache cache(&backend); - scoped_refptr<X509Certificate> cert( - ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name)); - ASSERT_TRUE(cert.get()); - - TestSetCallback set_callback; - TestGetCallback get_callback; - - MockDiskEntry::IgnoreCallbacks(true); - cache.SetCertificate(cert->os_cert_handle(), set_callback.callback()); - cache.GetCertificate(kCert1.cache_key, get_callback.callback()); - MockDiskEntry::IgnoreCallbacks(false); - set_callback.WaitForResult(); - get_callback.WaitForResult(); - - EXPECT_EQ(kCert1.cache_key, set_callback.key()); - EXPECT_TRUE(X509Certificate::IsSameOSCert(cert->os_cert_handle(), - get_callback.cert_handle())); -} - -// Tests that the DiskBasedCertCache can be deleted without issues when -// there are pending operations in the disk cache. -TEST(DiskBasedCertCache, DeletedCertCache) { - ScopedMockTransaction trans1( - CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL)); - MockDiskCache backend; - scoped_ptr<DiskBasedCertCache> cache(new DiskBasedCertCache(&backend)); - scoped_refptr<X509Certificate> cert( - ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name)); - ASSERT_TRUE(cert.get()); - TestSetCallback set_callback; - - cache->SetCertificate(cert->os_cert_handle(), set_callback.callback()); - cache.reset(); - set_callback.WaitForResult(); - EXPECT_EQ(std::string(), set_callback.key()); -} - -// Issues two successive read requests for a certificate, and then -// checks that the DiskBasedCertCache correctly read and recorded -// reading through the in-memory MRU cache. -TEST(DiskBasedCertCache, MemCacheGet) { - ScopedMockTransaction trans1( - CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL)); - MockDiskCache backend; - ASSERT_NO_FATAL_FAILURE( - ImportCert(&backend, kCert1, false /* not corrupted */)); - DiskBasedCertCache cache(&backend); - - TestGetCallback get_callback1, get_callback2; - cache.GetCertificate(kCert1.cache_key, get_callback1.callback()); - get_callback1.WaitForResult(); - EXPECT_EQ(0U, cache.mem_cache_hits_for_testing()); - cache.GetCertificate(kCert1.cache_key, get_callback2.callback()); - get_callback2.WaitForResult(); - EXPECT_EQ(1U, cache.mem_cache_hits_for_testing()); - EXPECT_TRUE(X509Certificate::IsSameOSCert(get_callback1.cert_handle(), - get_callback2.cert_handle())); -} - -// Reads a corrupted certificate from the disk cache, and then overwrites -// it and checks that the uncorrupted version was stored in the in-memory -// cache. -TEST(DiskBasedCertCache, CorruptOverwrite) { - ScopedMockTransaction trans1( - CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL)); - MockDiskCache backend; - backend.set_double_create_check(false); - ASSERT_NO_FATAL_FAILURE(ImportCert(&backend, kCert1, true /* corrupted */)); - DiskBasedCertCache cache(&backend); - TestGetCallback get_callback1, get_callback2; - - cache.GetCertificate(kCert1.cache_key, get_callback1.callback()); - get_callback1.WaitForResult(); - EXPECT_FALSE(get_callback2.cert_handle()); - - scoped_refptr<X509Certificate> cert( - ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name)); - TestSetCallback set_callback; - - cache.SetCertificate(cert->os_cert_handle(), set_callback.callback()); - set_callback.WaitForResult(); - EXPECT_EQ(kCert1.cache_key, set_callback.key()); - EXPECT_EQ(0U, cache.mem_cache_hits_for_testing()); - - cache.GetCertificate(kCert1.cache_key, get_callback2.callback()); - get_callback2.WaitForResult(); - EXPECT_TRUE(X509Certificate::IsSameOSCert(get_callback2.cert_handle(), - cert->os_cert_handle())); - EXPECT_EQ(1U, cache.mem_cache_hits_for_testing()); - ASSERT_NO_FATAL_FAILURE(CheckCertCached(&backend, kCert1)); -} - -} // namespace net
diff --git a/net/http/http_basic_stream.cc b/net/http/http_basic_stream.cc index 260ad55f2..6b08d13e 100644 --- a/net/http/http_basic_stream.cc +++ b/net/http/http_basic_stream.cc
@@ -111,6 +111,11 @@ return state_.connection()->socket()->GetPeerAddress(endpoint) == OK; } +Error HttpBasicStream::GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) { + return parser()->GetSignedEKMForTokenBinding(key, out); +} + void HttpBasicStream::Drain(HttpNetworkSession* session) { HttpResponseBodyDrainer* drainer = new HttpResponseBodyDrainer(this); drainer->Start(session);
diff --git a/net/http/http_basic_stream.h b/net/http/http_basic_stream.h index 0ca1962..1bb9a0b 100644 --- a/net/http/http_basic_stream.h +++ b/net/http/http_basic_stream.h
@@ -76,6 +76,9 @@ bool GetRemoteEndpoint(IPEndPoint* endpoint) override; + Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) override; + void Drain(HttpNetworkSession* session) override; void PopulateNetErrorDetails(NetErrorDetails* details) override;
diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc index ae678fd..f572c14 100644 --- a/net/http/http_cache.cc +++ b/net/http/http_cache.cc
@@ -34,7 +34,6 @@ #include "net/base/net_errors.h" #include "net/base/upload_data_stream.h" #include "net/disk_cache/disk_cache.h" -#include "net/http/disk_based_cert_cache.h" #include "net/http/disk_cache_based_quic_server_info.h" #include "net/http/http_cache_transaction.h" #include "net/http/http_network_layer.h" @@ -49,15 +48,6 @@ #include <unistd.h> #endif -namespace { - -bool UseCertCache() { - return base::FieldTrialList::FindFullName("CertCacheTrial") == - "ExperimentGroup"; -} - -} // namespace - namespace net { HttpCache::DefaultBackend::DefaultBackend( @@ -354,7 +344,6 @@ // Before deleting pending_ops_, we have to make sure that the disk cache is // done with said operations, or it will attempt to use deleted data. - cert_cache_.reset(); disk_cache_.reset(); PendingOpsMap::iterator pending_it = pending_ops_.begin(); @@ -1144,8 +1133,6 @@ backend_factory_.reset(); // Reclaim memory. if (result == OK) { disk_cache_ = std::move(pending_op->backend); - if (UseCertCache()) - cert_cache_.reset(new DiskBasedCertCache(disk_cache_.get())); } }
diff --git a/net/http/http_cache.h b/net/http/http_cache.h index 618709a..1c9c891 100644 --- a/net/http/http_cache.h +++ b/net/http/http_cache.h
@@ -49,7 +49,6 @@ class CertVerifier; class ChannelIDService; -class DiskBasedCertCache; class HostResolver; class HttpAuthHandlerFactory; class HttpNetworkSession; @@ -149,8 +148,6 @@ HttpTransactionFactory* network_layer() { return network_layer_.get(); } - DiskBasedCertCache* cert_cache() const { return cert_cache_.get(); } - // Retrieves the cache backend for this HttpCache instance. If the backend // is not initialized yet, this method will initialize it. The return value is // a network error code, and it could be ERR_IO_PENDING, in which case the @@ -419,8 +416,6 @@ scoped_ptr<disk_cache::Backend> disk_cache_; - scoped_ptr<DiskBasedCertCache> cert_cache_; - // The set of active entries indexed by cache key. ActiveEntriesMap active_entries_;
diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc index 3b9f28dc..38da8f3b 100644 --- a/net/http/http_cache_transaction.cc +++ b/net/http/http_cache_transaction.cc
@@ -36,7 +36,6 @@ #include "net/cert/cert_status_flags.h" #include "net/cert/x509_certificate.h" #include "net/disk_cache/disk_cache.h" -#include "net/http/disk_based_cert_cache.h" #include "net/http/http_network_session.h" #include "net/http/http_request_info.h" #include "net/http/http_util.h" @@ -54,111 +53,6 @@ // TODO(ricea): Move this to HttpResponseHeaders once it is standardised. static const char kFreshnessHeader[] = "Resource-Freshness"; -// Stores data relevant to the statistics of writing and reading entire -// certificate chains using DiskBasedCertCache. |num_pending_ops| is the number -// of certificates in the chain that have pending operations in the -// DiskBasedCertCache. |start_time| is the time that the read and write -// commands began being issued to the DiskBasedCertCache. -// TODO(brandonsalmon): Remove this when it is no longer necessary to -// collect data. -class SharedChainData : public base::RefCounted<SharedChainData> { - public: - SharedChainData(int num_ops, TimeTicks start) - : num_pending_ops(num_ops), start_time(start) {} - - int num_pending_ops; - TimeTicks start_time; - - private: - friend class base::RefCounted<SharedChainData>; - ~SharedChainData() {} - DISALLOW_COPY_AND_ASSIGN(SharedChainData); -}; - -// Used to obtain a cache entry key for an OSCertHandle. -// TODO(brandonsalmon): Remove this when cache keys are stored -// and no longer have to be recomputed to retrieve the OSCertHandle -// from the disk. -std::string GetCacheKeyForCert(X509Certificate::OSCertHandle cert_handle) { - SHA1HashValue fingerprint = - X509Certificate::CalculateFingerprint(cert_handle); - - return "cert:" + - base::HexEncode(fingerprint.data, arraysize(fingerprint.data)); -} - -// |dist_from_root| indicates the position of the read certificate in the -// certificate chain, 0 indicating it is the root. |is_leaf| indicates -// whether or not the read certificate was the leaf of the chain. -// |shared_chain_data| contains data shared by each certificate in -// the chain. -void OnCertReadIOComplete( - int dist_from_root, - bool is_leaf, - const scoped_refptr<SharedChainData>& shared_chain_data, - X509Certificate::OSCertHandle cert_handle) { - // If |num_pending_ops| is one, this was the last pending read operation - // for this chain of certificates. The total time used to read the chain - // can be calculated by subtracting the starting time from Now(). - shared_chain_data->num_pending_ops--; - if (!shared_chain_data->num_pending_ops) { - const TimeDelta read_chain_wait = - TimeTicks::Now() - shared_chain_data->start_time; - UMA_HISTOGRAM_CUSTOM_TIMES("DiskBasedCertCache.ChainReadTime", - read_chain_wait, - base::TimeDelta::FromMilliseconds(1), - base::TimeDelta::FromMinutes(10), - 50); - } - - bool success = (cert_handle != NULL); - if (is_leaf) - UMA_HISTOGRAM_BOOLEAN("DiskBasedCertCache.CertIoReadSuccessLeaf", success); - - if (success) - UMA_HISTOGRAM_CUSTOM_COUNTS( - "DiskBasedCertCache.CertIoReadSuccess", dist_from_root, 0, 10, 7); - else - UMA_HISTOGRAM_CUSTOM_COUNTS( - "DiskBasedCertCache.CertIoReadFailure", dist_from_root, 0, 10, 7); -} - -// |dist_from_root| indicates the position of the written certificate in the -// certificate chain, 0 indicating it is the root. |is_leaf| indicates -// whether or not the written certificate was the leaf of the chain. -// |shared_chain_data| contains data shared by each certificate in -// the chain. -void OnCertWriteIOComplete( - int dist_from_root, - bool is_leaf, - const scoped_refptr<SharedChainData>& shared_chain_data, - const std::string& key) { - // If |num_pending_ops| is one, this was the last pending write operation - // for this chain of certificates. The total time used to write the chain - // can be calculated by subtracting the starting time from Now(). - shared_chain_data->num_pending_ops--; - if (!shared_chain_data->num_pending_ops) { - const TimeDelta write_chain_wait = - TimeTicks::Now() - shared_chain_data->start_time; - UMA_HISTOGRAM_CUSTOM_TIMES("DiskBasedCertCache.ChainWriteTime", - write_chain_wait, - base::TimeDelta::FromMilliseconds(1), - base::TimeDelta::FromMinutes(10), - 50); - } - - bool success = !key.empty(); - if (is_leaf) - UMA_HISTOGRAM_BOOLEAN("DiskBasedCertCache.CertIoWriteSuccessLeaf", success); - - if (success) - UMA_HISTOGRAM_CUSTOM_COUNTS( - "DiskBasedCertCache.CertIoWriteSuccess", dist_from_root, 0, 10, 7); - else - UMA_HISTOGRAM_CUSTOM_COUNTS( - "DiskBasedCertCache.CertIoWriteFailure", dist_from_root, 0, 10, 7); -} - // From http://tools.ietf.org/html/draft-ietf-httpbis-p6-cache-21#section-6 // a "non-error response" is one with a 2xx (Successful) or 3xx // (Redirection) status code. @@ -1276,10 +1170,6 @@ return OnCacheReadError(result, true); } - // cert_cache() will be null if the CertCacheTrial field trial is disabled. - if (cache_->cert_cache() && response_.ssl_info.is_valid()) - ReadCertChain(); - // Some resources may have slipped in as truncated when they're not. int current_size = entry_->disk_entry->GetDataSize(kResponseContentIndex); if (response_.headers->GetContentLength() == current_size) @@ -1919,63 +1809,6 @@ //----------------------------------------------------------------------------- -void HttpCache::Transaction::ReadCertChain() { - std::string key = - GetCacheKeyForCert(response_.ssl_info.cert->os_cert_handle()); - const X509Certificate::OSCertHandles& intermediates = - response_.ssl_info.cert->GetIntermediateCertificates(); - int dist_from_root = intermediates.size(); - - scoped_refptr<SharedChainData> shared_chain_data( - new SharedChainData(intermediates.size() + 1, TimeTicks::Now())); - cache_->cert_cache()->GetCertificate(key, - base::Bind(&OnCertReadIOComplete, - dist_from_root, - true /* is leaf */, - shared_chain_data)); - - for (X509Certificate::OSCertHandles::const_iterator it = - intermediates.begin(); - it != intermediates.end(); - ++it) { - --dist_from_root; - key = GetCacheKeyForCert(*it); - cache_->cert_cache()->GetCertificate(key, - base::Bind(&OnCertReadIOComplete, - dist_from_root, - false /* is not leaf */, - shared_chain_data)); - } - DCHECK_EQ(0, dist_from_root); -} - -void HttpCache::Transaction::WriteCertChain() { - const X509Certificate::OSCertHandles& intermediates = - response_.ssl_info.cert->GetIntermediateCertificates(); - int dist_from_root = intermediates.size(); - - scoped_refptr<SharedChainData> shared_chain_data( - new SharedChainData(intermediates.size() + 1, TimeTicks::Now())); - cache_->cert_cache()->SetCertificate( - response_.ssl_info.cert->os_cert_handle(), - base::Bind(&OnCertWriteIOComplete, - dist_from_root, - true /* is leaf */, - shared_chain_data)); - for (X509Certificate::OSCertHandles::const_iterator it = - intermediates.begin(); - it != intermediates.end(); - ++it) { - --dist_from_root; - cache_->cert_cache()->SetCertificate(*it, - base::Bind(&OnCertWriteIOComplete, - dist_from_root, - false /* is not leaf */, - shared_chain_data)); - } - DCHECK_EQ(0, dist_from_root); -} - void HttpCache::Transaction::SetRequest(const BoundNetLog& net_log, const HttpRequestInfo* request) { net_log_ = net_log; @@ -2663,10 +2496,6 @@ return OK; } - // cert_cache() will be null if the CertCacheTrial field trial is disabled. - if (cache_->cert_cache() && response_.ssl_info.is_valid()) - WriteCertChain(); - if (truncated) DCHECK_EQ(200, response_.headers->response_code());
diff --git a/net/http/http_cache_transaction.h b/net/http/http_cache_transaction.h index 175e3f9..b3c90e94 100644 --- a/net/http/http_cache_transaction.h +++ b/net/http/http_cache_transaction.h
@@ -299,11 +299,6 @@ int DoCacheWriteTruncatedResponse(); int DoCacheWriteTruncatedResponseComplete(int result); - // These functions are involved in a field trial testing storing certificates - // in seperate entries from the HttpResponseInfo. - void ReadCertChain(); - void WriteCertChain(); - // Sets request_ and fields derived from it. void SetRequest(const BoundNetLog& net_log, const HttpRequestInfo* request);
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc index f528ab1..1836014 100644 --- a/net/http/http_network_session.cc +++ b/net/http/http_network_session.cc
@@ -129,7 +129,8 @@ quic_idle_connection_timeout_seconds(kIdleConnectionTimeoutSeconds), quic_disable_preconnect_if_0rtt(false), quic_migrate_sessions_on_network_change(false), - proxy_delegate(NULL) { + proxy_delegate(NULL), + enable_token_binding(false) { quic_supported_versions.push_back(QUIC_VERSION_25); }
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h index a9c2ac9e..f4455907 100644 --- a/net/http/http_network_session.h +++ b/net/http/http_network_session.h
@@ -191,6 +191,8 @@ // changes. bool quic_migrate_sessions_on_network_change; ProxyDelegate* proxy_delegate; + // Enable support for Token Binding. + bool enable_token_binding; }; enum SocketPoolType {
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc index d6baef14..93b4c30 100644 --- a/net/http/http_network_transaction.cc +++ b/net/http/http_network_transaction.cc
@@ -8,6 +8,7 @@ #include <utility> #include <vector> +#include "base/base64url.h" #include "base/bind.h" #include "base/bind_helpers.h" #include "base/compiler_specific.h" @@ -62,6 +63,7 @@ #include "net/ssl/ssl_cert_request_info.h" #include "net/ssl/ssl_connection_status_flags.h" #include "net/ssl/ssl_private_key.h" +#include "net/ssl/token_binding.h" #include "url/gurl.h" #include "url/url_canon.h" @@ -201,6 +203,11 @@ if (request_->privacy_mode == PRIVACY_MODE_ENABLED) server_ssl_config_.channel_id_enabled = false; + if (session_->params().enable_token_binding && + session_->params().channel_id_service) { + server_ssl_config_.token_binding_params.push_back(TB_PARAM_ECDSAP256); + } + next_state_ = STATE_NOTIFY_BEFORE_CREATE_STREAM; int rv = DoLoop(OK); if (rv == ERR_IO_PENDING) @@ -639,6 +646,42 @@ return request_->url.SchemeIsCryptographic(); } +bool HttpNetworkTransaction::IsTokenBindingEnabled() const { + if (!IsSecureRequest()) + return false; + SSLInfo ssl_info; + stream_->GetSSLInfo(&ssl_info); + return ssl_info.token_binding_negotiated && + ssl_info.token_binding_key_param == TB_PARAM_ECDSAP256 && + session_->params().channel_id_service; +} + +void HttpNetworkTransaction::RecordTokenBindingSupport() const { + // This enum is used for an UMA histogram - do not change or re-use values. + enum { + DISABLED = 0, + CLIENT_ONLY = 1, + CLIENT_AND_SERVER = 2, + CLIENT_NO_CHANNEL_ID_SERVICE = 3, + TOKEN_BINDING_SUPPORT_MAX + } supported; + if (!IsSecureRequest()) + return; + SSLInfo ssl_info; + stream_->GetSSLInfo(&ssl_info); + if (!session_->params().enable_token_binding) { + supported = DISABLED; + } else if (!session_->params().channel_id_service) { + supported = CLIENT_NO_CHANNEL_ID_SERVICE; + } else if (ssl_info.token_binding_negotiated) { + supported = CLIENT_AND_SERVER; + } else { + supported = CLIENT_ONLY; + } + UMA_HISTOGRAM_ENUMERATION("Net.TokenBinding.Support", supported, + TOKEN_BINDING_SUPPORT_MAX); +} + bool HttpNetworkTransaction::UsingHttpProxyWithoutTunnel() const { return (proxy_info_.is_http() || proxy_info_.is_https() || proxy_info_.is_quic()) && @@ -701,6 +744,13 @@ case STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE: rv = DoGenerateServerAuthTokenComplete(rv); break; + case STATE_GET_TOKEN_BINDING_KEY: + DCHECK_EQ(OK, rv); + rv = DoGetTokenBindingKey(); + break; + case STATE_GET_TOKEN_BINDING_KEY_COMPLETE: + rv = DoGetTokenBindingKeyComplete(rv); + break; case STATE_INIT_REQUEST_BODY: DCHECK_EQ(OK, rv); rv = DoInitRequestBody(); @@ -916,11 +966,34 @@ int HttpNetworkTransaction::DoGenerateServerAuthTokenComplete(int rv) { DCHECK_NE(ERR_IO_PENDING, rv); if (rv == OK) - next_state_ = STATE_INIT_REQUEST_BODY; + next_state_ = STATE_GET_TOKEN_BINDING_KEY; return rv; } -void HttpNetworkTransaction::BuildRequestHeaders( +int HttpNetworkTransaction::DoGetTokenBindingKey() { + next_state_ = STATE_GET_TOKEN_BINDING_KEY_COMPLETE; + if (!IsTokenBindingEnabled()) + return OK; + + net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_GET_TOKEN_BINDING_KEY); + ChannelIDService* channel_id_service = session_->params().channel_id_service; + return channel_id_service->GetOrCreateChannelID( + request_->url.host(), &token_binding_key_, io_callback_, + &token_binding_request_); +} + +int HttpNetworkTransaction::DoGetTokenBindingKeyComplete(int rv) { + DCHECK_NE(ERR_IO_PENDING, rv); + next_state_ = STATE_INIT_REQUEST_BODY; + if (!IsTokenBindingEnabled()) + return OK; + + net_log_.EndEventWithNetErrorCode( + NetLog::TYPE_HTTP_TRANSACTION_GET_TOKEN_BINDING_KEY, rv); + return rv; +} + +int HttpNetworkTransaction::BuildRequestHeaders( bool using_http_proxy_without_tunnel) { request_headers_.SetHeader(HttpRequestHeaders::kHost, GetHostAndOptionalPort(request_->url)); @@ -953,6 +1026,16 @@ request_headers_.SetHeader(HttpRequestHeaders::kContentLength, "0"); } + RecordTokenBindingSupport(); + if (token_binding_key_) { + std::string token_binding_header; + int rv = BuildTokenBindingHeader(&token_binding_header); + if (rv != OK) + return rv; + request_headers_.SetHeader(HttpRequestHeaders::kTokenBinding, + token_binding_header); + } + // Honor load flags that impact proxy caches. if (request_->load_flags & LOAD_BYPASS_CACHE) { request_headers_.SetHeader(HttpRequestHeaders::kPragma, "no-cache"); @@ -977,6 +1060,29 @@ response_.did_use_http_auth = request_headers_.HasHeader(HttpRequestHeaders::kAuthorization) || request_headers_.HasHeader(HttpRequestHeaders::kProxyAuthorization); + return OK; +} + +int HttpNetworkTransaction::BuildTokenBindingHeader(std::string* out) { + std::vector<uint8_t> signed_ekm; + int rv = stream_->GetSignedEKMForTokenBinding(token_binding_key_.get(), + &signed_ekm); + if (rv != OK) + return rv; + std::string provided_token_binding; + rv = BuildProvidedTokenBinding(token_binding_key_.get(), signed_ekm, + &provided_token_binding); + if (rv != OK) + return rv; + std::vector<base::StringPiece> token_bindings; + token_bindings.push_back(provided_token_binding); + std::string header; + rv = BuildTokenBindingMessageFromTokenBindings(token_bindings, &header); + if (rv != OK) + return rv; + base::Base64UrlEncode(header, base::Base64UrlEncodePolicy::INCLUDE_PADDING, + out); + return OK; } int HttpNetworkTransaction::DoInitRequestBody() { @@ -1001,7 +1107,7 @@ // we have proxy info available. if (request_headers_.IsEmpty()) { bool using_http_proxy_without_tunnel = UsingHttpProxyWithoutTunnel(); - BuildRequestHeaders(using_http_proxy_without_tunnel); + return BuildRequestHeaders(using_http_proxy_without_tunnel); } return OK; @@ -1486,6 +1592,7 @@ remote_endpoint_ = IPEndPoint(); net_error_details_.quic_broken = false; net_error_details_.quic_connection_error = QUIC_NO_ERROR; + token_binding_key_.reset(); } void HttpNetworkTransaction::CacheNetErrorDetailsAndResetStream() {
diff --git a/net/http/http_network_transaction.h b/net/http/http_network_transaction.h index f8584b8..5b554af 100644 --- a/net/http/http_network_transaction.h +++ b/net/http/http_network_transaction.h
@@ -14,6 +14,7 @@ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/time/time.h" +#include "crypto/ec_private_key.h" #include "net/base/net_error_details.h" #include "net/base/request_priority.h" #include "net/http/http_auth.h" @@ -24,10 +25,15 @@ #include "net/log/net_log.h" #include "net/proxy/proxy_service.h" #include "net/socket/connection_attempts.h" +#include "net/ssl/channel_id_service.h" #include "net/ssl/ssl_config_service.h" #include "net/ssl/ssl_failure_state.h" #include "net/websockets/websocket_handshake_stream_base.h" +namespace crypto { +class ECPrivateKey; +} + namespace net { class BidirectionalStreamJob; @@ -149,6 +155,8 @@ STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE, STATE_GENERATE_SERVER_AUTH_TOKEN, STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE, + STATE_GET_TOKEN_BINDING_KEY, + STATE_GET_TOKEN_BINDING_KEY_COMPLETE, STATE_INIT_REQUEST_BODY, STATE_INIT_REQUEST_BODY_COMPLETE, STATE_BUILD_REQUEST, @@ -165,6 +173,8 @@ }; bool IsSecureRequest() const; + bool IsTokenBindingEnabled() const; + void RecordTokenBindingSupport() const; // Returns true if the request is using an HTTP(S) proxy without being // tunneled via the CONNECT method. @@ -189,6 +199,8 @@ int DoGenerateProxyAuthTokenComplete(int result); int DoGenerateServerAuthToken(); int DoGenerateServerAuthTokenComplete(int result); + int DoGetTokenBindingKey(); + int DoGetTokenBindingKeyComplete(int result); int DoInitRequestBody(); int DoInitRequestBodyComplete(int result); int DoBuildRequest(); @@ -202,7 +214,8 @@ int DoDrainBodyForAuthRestart(); int DoDrainBodyForAuthRestartComplete(int result); - void BuildRequestHeaders(bool using_http_proxy_without_tunnel); + int BuildRequestHeaders(bool using_http_proxy_without_tunnel); + int BuildTokenBindingHeader(std::string* out); // Writes a log message to help debugging in the field when we block a proxy // response to a CONNECT request. @@ -328,6 +341,11 @@ // The SSLFailureState which caused the last TLS version fallback. SSLFailureState fallback_failure_state_; + // Key to use for signing message in Token Binding header. + scoped_ptr<crypto::ECPrivateKey> token_binding_key_; + // Object to manage lookup of |token_binding_key_|. + ChannelIDService::Request token_binding_request_; + HttpRequestHeaders request_headers_; // The size in bytes of the buffer we use to drain the response body that
diff --git a/net/http/http_network_transaction_ssl_unittest.cc b/net/http/http_network_transaction_ssl_unittest.cc index 4aa59a6..51f3406 100644 --- a/net/http/http_network_transaction_ssl_unittest.cc +++ b/net/http/http_network_transaction_ssl_unittest.cc
@@ -18,6 +18,7 @@ #include "net/http/transport_security_state.h" #include "net/proxy/proxy_service.h" #include "net/socket/socket_test_util.h" +#include "net/ssl/default_channel_id_store.h" #include "testing/gtest/include/gtest/gtest.h" namespace net { @@ -54,6 +55,20 @@ SSLConfig ssl_config_; }; +class TokenBindingSSLConfigService : public SSLConfigService { + public: + TokenBindingSSLConfigService() { + ssl_config_.token_binding_params.push_back(TB_PARAM_ECDSAP256); + } + + void GetSSLConfig(SSLConfig* config) override { *config = ssl_config_; } + + private: + ~TokenBindingSSLConfigService() override {} + + SSLConfig ssl_config_; +}; + } // namespace class HttpNetworkTransactionSSLTest : public testing::Test { @@ -148,5 +163,58 @@ EXPECT_TRUE(ssl_config.version_fallback); } +#if !defined(OS_IOS) +TEST_F(HttpNetworkTransactionSSLTest, TokenBinding) { + ssl_config_service_ = new TokenBindingSSLConfigService; + session_params_.ssl_config_service = ssl_config_service_.get(); + ChannelIDService channel_id_service(new DefaultChannelIDStore(NULL), + base::ThreadTaskRunnerHandle::Get()); + session_params_.channel_id_service = &channel_id_service; + + SSLSocketDataProvider ssl_data(ASYNC, OK); + ssl_data.token_binding_negotiated = true; + ssl_data.token_binding_key_param = TB_PARAM_ECDSAP256; + mock_socket_factory_.AddSSLSocketDataProvider(&ssl_data); + MockRead mock_reads[] = {MockRead("HTTP/1.1 200 OK\r\n\r\n"), + MockRead(SYNCHRONOUS, OK)}; + StaticSocketDataProvider data(mock_reads, arraysize(mock_reads), NULL, 0); + mock_socket_factory_.AddSocketDataProvider(&data); + + HttpNetworkSession session(session_params_); + HttpNetworkTransaction trans(DEFAULT_PRIORITY, &session); + + TestCompletionCallback callback; + int rv = + callback.GetResult(trans.Start(GetRequestInfo("https://www.example.com/"), + callback.callback(), BoundNetLog())); + EXPECT_EQ(OK, rv); + + HttpRequestHeaders headers1; + ASSERT_TRUE(trans.GetFullRequestHeaders(&headers1)); + std::string token_binding_header1; + EXPECT_TRUE(headers1.GetHeader(HttpRequestHeaders::kTokenBinding, + &token_binding_header1)); + + // Send a second request and verify that the token binding header is the same + // as in the first request. + mock_socket_factory_.AddSSLSocketDataProvider(&ssl_data); + StaticSocketDataProvider data2(mock_reads, arraysize(mock_reads), NULL, 0); + mock_socket_factory_.AddSocketDataProvider(&data2); + + rv = + callback.GetResult(trans.Start(GetRequestInfo("https://www.example.com/"), + callback.callback(), BoundNetLog())); + EXPECT_EQ(OK, rv); + + HttpRequestHeaders headers2; + ASSERT_TRUE(trans.GetFullRequestHeaders(&headers2)); + std::string token_binding_header2; + EXPECT_TRUE(headers2.GetHeader(HttpRequestHeaders::kTokenBinding, + &token_binding_header2)); + + EXPECT_EQ(token_binding_header1, token_binding_header2); +} +#endif // !defined(OS_IOS) + } // namespace net
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc index ef00344..9bda396 100644 --- a/net/http/http_network_transaction_unittest.cc +++ b/net/http/http_network_transaction_unittest.cc
@@ -75,6 +75,7 @@ #include "net/spdy/spdy_session.h" #include "net/spdy/spdy_session_pool.h" #include "net/spdy/spdy_test_util_common.h" +#include "net/ssl/default_channel_id_store.h" #include "net/ssl/ssl_cert_request_info.h" #include "net/ssl/ssl_config_service.h" #include "net/ssl/ssl_config_service_defaults.h" @@ -14413,6 +14414,12 @@ bool GetRemoteEndpoint(IPEndPoint* endpoint) override { return false; } + Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) override { + ADD_FAILURE(); + return ERR_NOT_IMPLEMENTED; + } + void Drain(HttpNetworkSession* session) override { ADD_FAILURE(); } void PopulateNetErrorDetails(NetErrorDetails* details) override { return; } @@ -14644,6 +14651,12 @@ bool GetRemoteEndpoint(IPEndPoint* endpoint) override { return false; } + Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) override { + ADD_FAILURE(); + return ERR_NOT_IMPLEMENTED; + } + void Drain(HttpNetworkSession* session) override { NOTREACHED(); } void PopulateNetErrorDetails(NetErrorDetails* details) override { return; } @@ -15802,4 +15815,41 @@ EXPECT_TRUE(trans.server_ssl_config_.npn_protos.empty()); } +#if !defined(OS_IOS) +TEST_P(HttpNetworkTransactionTest, TokenBindingSpdy) { + const std::string https_url = "https://www.example.com"; + HttpRequestInfo request; + request.url = GURL(https_url); + request.method = "GET"; + + SSLSocketDataProvider ssl(ASYNC, OK); + ssl.token_binding_negotiated = true; + ssl.token_binding_key_param = TB_PARAM_ECDSAP256; + ssl.SetNextProto(GetProtocol()); + session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); + + scoped_ptr<SpdyFrame> resp( + spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); + scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); + MockRead reads[] = {CreateMockRead(*resp), CreateMockRead(*body), + MockRead(ASYNC, ERR_IO_PENDING)}; + StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); + session_deps_.socket_factory->AddSocketDataProvider(&data); + session_deps_.channel_id_service.reset(new ChannelIDService( + new DefaultChannelIDStore(nullptr), base::ThreadTaskRunnerHandle::Get())); + scoped_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); + + HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); + TestCompletionCallback callback; + EXPECT_EQ(ERR_IO_PENDING, + trans.Start(&request, callback.callback(), BoundNetLog())); + base::MessageLoop::current()->RunUntilIdle(); + + EXPECT_TRUE(trans.GetResponseInfo()->was_fetched_via_spdy); + HttpRequestHeaders headers; + ASSERT_TRUE(trans.GetFullRequestHeaders(&headers)); + EXPECT_TRUE(headers.HasHeader(HttpRequestHeaders::kTokenBinding)); +} +#endif // !defined(OS_IOS) + } // namespace net
diff --git a/net/http/http_request_headers.cc b/net/http/http_request_headers.cc index d3f1401c..4e2ae0e 100644 --- a/net/http/http_request_headers.cc +++ b/net/http/http_request_headers.cc
@@ -36,8 +36,9 @@ const char HttpRequestHeaders::kProxyConnection[] = "Proxy-Connection"; const char HttpRequestHeaders::kRange[] = "Range"; const char HttpRequestHeaders::kReferer[] = "Referer"; -const char HttpRequestHeaders::kUserAgent[] = "User-Agent"; const char HttpRequestHeaders::kTransferEncoding[] = "Transfer-Encoding"; +const char HttpRequestHeaders::kTokenBinding[] = "Token-Binding"; +const char HttpRequestHeaders::kUserAgent[] = "User-Agent"; HttpRequestHeaders::HeaderKeyValuePair::HeaderKeyValuePair() { }
diff --git a/net/http/http_request_headers.h b/net/http/http_request_headers.h index 76bf25e..db70004 100644 --- a/net/http/http_request_headers.h +++ b/net/http/http_request_headers.h
@@ -76,8 +76,9 @@ static const char kProxyConnection[]; static const char kRange[]; static const char kReferer[]; - static const char kUserAgent[]; static const char kTransferEncoding[]; + static const char kTokenBinding[]; + static const char kUserAgent[]; HttpRequestHeaders(); ~HttpRequestHeaders();
diff --git a/net/http/http_response_body_drainer_unittest.cc b/net/http/http_response_body_drainer_unittest.cc index 4568cba..9ee6f84 100644 --- a/net/http/http_response_body_drainer_unittest.cc +++ b/net/http/http_response_body_drainer_unittest.cc
@@ -107,6 +107,11 @@ void GetSSLInfo(SSLInfo* ssl_info) override {} void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override {} bool GetRemoteEndpoint(IPEndPoint* endpoint) override { return false; } + Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) override { + ADD_FAILURE(); + return ERR_NOT_IMPLEMENTED; + } // Mocked API int ReadResponseBody(IOBuffer* buf,
diff --git a/net/http/http_server_properties_manager.cc b/net/http/http_server_properties_manager.cc index f7493ff..79ed4915 100644 --- a/net/http/http_server_properties_manager.cc +++ b/net/http/http_server_properties_manager.cc
@@ -6,7 +6,6 @@ #include "base/bind.h" #include "base/metrics/histogram_macros.h" -#include "base/prefs/pref_service.h" #include "base/single_thread_task_runner.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" @@ -72,23 +71,21 @@ //////////////////////////////////////////////////////////////////////////////// // HttpServerPropertiesManager +HttpServerPropertiesManager::PrefDelegate::~PrefDelegate() {} + HttpServerPropertiesManager::HttpServerPropertiesManager( - PrefService* pref_service, - const char* pref_path, + PrefDelegate* pref_delegate, scoped_refptr<base::SequencedTaskRunner> network_task_runner) : pref_task_runner_(base::ThreadTaskRunnerHandle::Get()), - pref_service_(pref_service), + pref_delegate_(pref_delegate), setting_prefs_(false), - path_(pref_path), network_task_runner_(network_task_runner) { - DCHECK(pref_service); + DCHECK(pref_delegate_); pref_weak_ptr_factory_.reset( new base::WeakPtrFactory<HttpServerPropertiesManager>(this)); pref_weak_ptr_ = pref_weak_ptr_factory_->GetWeakPtr(); pref_cache_update_timer_.reset(new base::OneShotTimer); - pref_change_registrar_.Init(pref_service_); - pref_change_registrar_.Add( - path_, + pref_delegate_->StartListeningForUpdates( base::Bind(&HttpServerPropertiesManager::OnHttpServerPropertiesChanged, base::Unretained(this))); } @@ -117,7 +114,7 @@ // Cancel any pending updates, and stop listening for pref change updates. pref_cache_update_timer_->Stop(); pref_weak_ptr_factory_.reset(); - pref_change_registrar_.RemoveAll(); + pref_delegate_->StopListeningForUpdates(); } // static @@ -445,12 +442,12 @@ // The preferences can only be read on the pref thread. DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); - if (!pref_service_->HasPrefPath(path_)) + if (!pref_delegate_->HasServerProperties()) return; bool detected_corrupted_prefs = false; const base::DictionaryValue& http_server_properties_dict = - *pref_service_->GetDictionary(path_); + pref_delegate_->GetServerProperties(); int version = kMissingVersion; if (!http_server_properties_dict.GetIntegerWithoutPathExpansion(kVersionKey, @@ -1117,7 +1114,7 @@ } } - // Persist properties to the |path_| in the MRU order. + // Persist properties to the prefs in the MRU order. base::DictionaryValue http_server_properties_dict; base::ListValue* servers_list = new base::ListValue; for (ServerPrefMap::const_reverse_iterator map_it = server_pref_map.rbegin(); @@ -1152,7 +1149,7 @@ &http_server_properties_dict); setting_prefs_ = true; - pref_service_->Set(path_, http_server_properties_dict); + pref_delegate_->SetServerProperties(http_server_properties_dict); setting_prefs_ = false; // Note that |completion| will be fired after we have written everything to
diff --git a/net/http/http_server_properties_manager.h b/net/http/http_server_properties_manager.h index b08ae16..39f6ec5 100644 --- a/net/http/http_server_properties_manager.h +++ b/net/http/http_server_properties_manager.h
@@ -15,7 +15,6 @@ #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" -#include "base/prefs/pref_change_registrar.h" #include "base/timer/timer.h" #include "base/values.h" #include "net/base/host_port_pair.h" @@ -54,12 +53,36 @@ // and grab a WeakPtr. class NET_EXPORT HttpServerPropertiesManager : public HttpServerProperties { public: - // Create an instance of the HttpServerPropertiesManager. The lifetime of the - // PrefService objects must be longer than that of the - // HttpServerPropertiesManager object. Must be constructed on the Pref thread. + // Provides an interface to interface with persistent preferences storage + // implemented by the embedder. + class NET_EXPORT PrefDelegate { + public: + virtual ~PrefDelegate(); + + // Returns true if the pref system has data for the server properties. + virtual bool HasServerProperties() = 0; + + // Returns the branch of the preferences system for the server properties. + virtual const base::DictionaryValue& GetServerProperties() const = 0; + + // Sets the server properties to the given value. + virtual void SetServerProperties(const base::DictionaryValue& value) = 0; + + // Start and stop listening for external storage changes. There will only + // be one callback active at a time. + virtual void StartListeningForUpdates(const base::Closure& callback) = 0; + virtual void StopListeningForUpdates() = 0; + }; + + // Create an instance of the HttpServerPropertiesManager. + // + // Ownership of the PrefDelegate pointer is taken by this class. This is + // passed as a raw pointer rather than a scoped_refptr currently because + // the test uses gmock and it doesn't forward move semantics properly. + // + // Must be constructed on the Pref thread. HttpServerPropertiesManager( - PrefService* pref_service, - const char* pref_path, + PrefDelegate* pref_delegate, scoped_refptr<base::SequencedTaskRunner> network_task_runner); ~HttpServerPropertiesManager() override; @@ -277,11 +300,8 @@ // Used to post cache update tasks. scoped_ptr<base::OneShotTimer> pref_cache_update_timer_; - // Used to track the spdy servers changes. - PrefChangeRegistrar pref_change_registrar_; - PrefService* pref_service_; // Weak. + scoped_ptr<PrefDelegate> pref_delegate_; bool setting_prefs_; - const char* path_; // -------------- // Network thread
diff --git a/net/http/http_server_properties_manager_unittest.cc b/net/http/http_server_properties_manager_unittest.cc index 49d19db1..87ddbfa 100644 --- a/net/http/http_server_properties_manager_unittest.cc +++ b/net/http/http_server_properties_manager_unittest.cc
@@ -8,8 +8,6 @@ #include "base/json/json_writer.h" #include "base/macros.h" #include "base/message_loop/message_loop.h" -#include "base/prefs/pref_registry_simple.h" -#include "base/prefs/testing_pref_service.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" @@ -32,15 +30,52 @@ using ::testing::Mock; using ::testing::StrictMock; -const char kTestHttpServerProperties[] = "TestHttpServerProperties"; +class MockPrefDelegate : public net::HttpServerPropertiesManager::PrefDelegate { + public: + MockPrefDelegate() {} + ~MockPrefDelegate() override {} + + // HttpServerPropertiesManager::PrefDelegate implementation. + bool HasServerProperties() override { return true; } + const base::DictionaryValue& GetServerProperties() const override { + return prefs_; + } + void SetServerProperties(const base::DictionaryValue& value) override { + prefs_.Clear(); + prefs_.MergeDictionary(&value); + if (!prefs_changed_callback_.is_null()) + prefs_changed_callback_.Run(); + } + void StartListeningForUpdates(const base::Closure& callback) override { + CHECK(prefs_changed_callback_.is_null()); + prefs_changed_callback_ = callback; + } + void StopListeningForUpdates() override { + CHECK(!prefs_changed_callback_.is_null()); + prefs_changed_callback_ = base::Closure(); + } + + void SetPrefs(const base::DictionaryValue& value) { + // prefs_ = value; + prefs_.Clear(); + prefs_.MergeDictionary(&value); + if (!prefs_changed_callback_.is_null()) + prefs_changed_callback_.Run(); + } + + private: + base::DictionaryValue prefs_; + base::Closure prefs_changed_callback_; + + DISALLOW_COPY_AND_ASSIGN(MockPrefDelegate); +}; class TestingHttpServerPropertiesManager : public HttpServerPropertiesManager { public: TestingHttpServerPropertiesManager( - PrefService* pref_service, - const char* pref_path, + HttpServerPropertiesManager::PrefDelegate* pref_delegate, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner) - : HttpServerPropertiesManager(pref_service, pref_path, io_task_runner) { + : HttpServerPropertiesManager(pref_delegate, io_task_runner) { InitializeOnNetworkThread(); } @@ -116,11 +151,10 @@ void SetUp() override { one_day_from_now_ = base::Time::Now() + base::TimeDelta::FromDays(1); - pref_service_.registry()->RegisterDictionaryPref(kTestHttpServerProperties); + pref_delegate_ = new MockPrefDelegate; http_server_props_manager_.reset( new StrictMock<TestingHttpServerPropertiesManager>( - &pref_service_, kTestHttpServerProperties, - base::ThreadTaskRunnerHandle::Get())); + pref_delegate_, base::ThreadTaskRunnerHandle::Get())); ExpectCacheUpdate(); base::RunLoop().RunUntilIdle(); } @@ -178,8 +212,7 @@ return !alternative_service_vector.empty(); } - //base::RunLoop loop_; - TestingPrefServiceSimple pref_service_; + MockPrefDelegate* pref_delegate_; // Owned by HttpServerPropertiesManager. scoped_ptr<TestingHttpServerPropertiesManager> http_server_props_manager_; base::Time one_day_from_now_; @@ -256,25 +289,24 @@ // Set the server preference for mail.google.com:80. servers_dict->SetWithoutPathExpansion("mail.google.com:80", server_pref_dict1); - base::DictionaryValue* http_server_properties_dict = - new base::DictionaryValue; + base::DictionaryValue http_server_properties_dict; if (GetParam() == 4) { // |servers_list| takes ownership of |servers_dict|. servers_list->AppendIfNotPresent(servers_dict); - HttpServerPropertiesManager::SetVersion(http_server_properties_dict, -1); - http_server_properties_dict->SetWithoutPathExpansion("servers", - servers_list); + HttpServerPropertiesManager::SetVersion(&http_server_properties_dict, -1); + http_server_properties_dict.SetWithoutPathExpansion("servers", + servers_list); } else { - HttpServerPropertiesManager::SetVersion(http_server_properties_dict, + HttpServerPropertiesManager::SetVersion(&http_server_properties_dict, GetParam()); - http_server_properties_dict->SetWithoutPathExpansion("servers", - servers_dict); + http_server_properties_dict.SetWithoutPathExpansion("servers", + servers_dict); } base::DictionaryValue* supports_quic = new base::DictionaryValue; supports_quic->SetBoolean("used_quic", true); supports_quic->SetString("address", "127.0.0.1"); - http_server_properties_dict->SetWithoutPathExpansion("supports_quic", - supports_quic); + http_server_properties_dict.SetWithoutPathExpansion("supports_quic", + supports_quic); // Set quic_server_info for www.google.com:80, mail.google.com:80 and // play.google.com:80 and verify the MRU. @@ -304,16 +336,12 @@ QuicServerId play_quic_server_id("play.google.com", 80); quic_servers_dict->SetWithoutPathExpansion(play_quic_server_id.ToString(), quic_server_pref_dict3); - http_server_properties_dict->SetWithoutPathExpansion("quic_servers", - quic_servers_dict); + http_server_properties_dict.SetWithoutPathExpansion("quic_servers", + quic_servers_dict); // Set the same value for kHttpServerProperties multiple times. - pref_service_.SetManagedPref(kTestHttpServerProperties, - http_server_properties_dict); - base::DictionaryValue* http_server_properties_dict2 = - http_server_properties_dict->DeepCopy(); - pref_service_.SetManagedPref(kTestHttpServerProperties, - http_server_properties_dict2); + pref_delegate_->SetPrefs(http_server_properties_dict); + pref_delegate_->SetPrefs(http_server_properties_dict); base::RunLoop().RunUntilIdle(); Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); @@ -427,20 +455,19 @@ base::DictionaryValue* servers_dict = new base::DictionaryValue; servers_dict->SetWithoutPathExpansion("www.google.com:65536", server_pref_dict); - base::DictionaryValue* http_server_properties_dict = - new base::DictionaryValue; + base::DictionaryValue http_server_properties_dict; if (GetParam() == 4) { base::ListValue* servers_list = new base::ListValue; // |servers_list| takes ownership of |servers_dict|. servers_list->AppendIfNotPresent(servers_dict); - HttpServerPropertiesManager::SetVersion(http_server_properties_dict, -1); - http_server_properties_dict->SetWithoutPathExpansion("servers", - servers_list); + HttpServerPropertiesManager::SetVersion(&http_server_properties_dict, -1); + http_server_properties_dict.SetWithoutPathExpansion("servers", + servers_list); } else { - HttpServerPropertiesManager::SetVersion(http_server_properties_dict, + HttpServerPropertiesManager::SetVersion(&http_server_properties_dict, GetParam()); - http_server_properties_dict->SetWithoutPathExpansion("servers", - servers_dict); + http_server_properties_dict.SetWithoutPathExpansion("servers", + servers_dict); } // Set quic_server_info for www.google.com:65536. @@ -451,12 +478,11 @@ quic_servers_dict->SetWithoutPathExpansion("http://mail.google.com:65536", quic_server_pref_dict1); - http_server_properties_dict->SetWithoutPathExpansion("quic_servers", - quic_servers_dict); + http_server_properties_dict.SetWithoutPathExpansion("quic_servers", + quic_servers_dict); // Set up the pref. - pref_service_.SetManagedPref(kTestHttpServerProperties, - http_server_properties_dict); + pref_delegate_->SetPrefs(http_server_properties_dict); base::RunLoop().RunUntilIdle(); Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); @@ -496,25 +522,23 @@ // Set the server preference for www.google.com:80. base::DictionaryValue* servers_dict = new base::DictionaryValue; servers_dict->SetWithoutPathExpansion("www.google.com:80", server_pref_dict); - base::DictionaryValue* http_server_properties_dict = - new base::DictionaryValue; + base::DictionaryValue http_server_properties_dict; if (GetParam() == 4) { base::ListValue* servers_list = new base::ListValue; // |servers_list| takes ownership of |servers_dict|. servers_list->AppendIfNotPresent(servers_dict); - HttpServerPropertiesManager::SetVersion(http_server_properties_dict, -1); - http_server_properties_dict->SetWithoutPathExpansion("servers", - servers_list); + HttpServerPropertiesManager::SetVersion(&http_server_properties_dict, -1); + http_server_properties_dict.SetWithoutPathExpansion("servers", + servers_list); } else { - HttpServerPropertiesManager::SetVersion(http_server_properties_dict, + HttpServerPropertiesManager::SetVersion(&http_server_properties_dict, GetParam()); - http_server_properties_dict->SetWithoutPathExpansion("servers", - servers_dict); + http_server_properties_dict.SetWithoutPathExpansion("servers", + servers_dict); } // Set up the pref. - pref_service_.SetManagedPref(kTestHttpServerProperties, - http_server_properties_dict); + pref_delegate_->SetPrefs(http_server_properties_dict); base::RunLoop().RunUntilIdle(); Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); @@ -970,31 +994,29 @@ // Set the server preference for mail.google.com:80. servers_dict->SetWithoutPathExpansion("mail.google.com:80", server_pref_dict1); - base::DictionaryValue* http_server_properties_dict = - new base::DictionaryValue; + base::DictionaryValue http_server_properties_dict; if (GetParam() == 4) { // |servers_list| takes ownership of |servers_dict|. servers_list->AppendIfNotPresent(servers_dict); - HttpServerPropertiesManager::SetVersion(http_server_properties_dict, -1); - http_server_properties_dict->SetWithoutPathExpansion("servers", - servers_list); + HttpServerPropertiesManager::SetVersion(&http_server_properties_dict, -1); + http_server_properties_dict.SetWithoutPathExpansion("servers", + servers_list); } else { - HttpServerPropertiesManager::SetVersion(http_server_properties_dict, + HttpServerPropertiesManager::SetVersion(&http_server_properties_dict, GetParam()); - http_server_properties_dict->SetWithoutPathExpansion("servers", - servers_dict); + http_server_properties_dict.SetWithoutPathExpansion("servers", + servers_dict); } // Set up SupportsQuic for 127.0.0.1 base::DictionaryValue* supports_quic = new base::DictionaryValue; supports_quic->SetBoolean("used_quic", true); supports_quic->SetString("address", "127.0.0.1"); - http_server_properties_dict->SetWithoutPathExpansion("supports_quic", - supports_quic); + http_server_properties_dict.SetWithoutPathExpansion("supports_quic", + supports_quic); // Set up the pref. - pref_service_.SetManagedPref(kTestHttpServerProperties, - http_server_properties_dict); + pref_delegate_->SetPrefs(http_server_properties_dict); base::RunLoop().RunUntilIdle(); Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); @@ -1085,8 +1107,7 @@ "\"version\":4}"; const base::Value* http_server_properties = - pref_service_.GetUserPref(kTestHttpServerProperties); - ASSERT_NE(nullptr, http_server_properties); + &pref_delegate_->GetServerProperties(); std::string preferences_json; EXPECT_TRUE( base::JSONWriter::Write(*http_server_properties, &preferences_json)); @@ -1185,15 +1206,11 @@ http_server_props_manager_->ScheduleUpdateCacheOnPrefThread(); base::RunLoop().RunUntilIdle(); - const base::Value* pref_value = - pref_service_.GetUserPref(kTestHttpServerProperties); - ASSERT_NE(nullptr, pref_value); - - const base::DictionaryValue* pref_dict; - ASSERT_TRUE(pref_value->GetAsDictionary(&pref_dict)); + const base::DictionaryValue& pref_dict = + pref_delegate_->GetServerProperties(); const base::ListValue* servers_list = nullptr; - ASSERT_TRUE(pref_dict->GetListWithoutPathExpansion("servers", &servers_list)); + ASSERT_TRUE(pref_dict.GetListWithoutPathExpansion("servers", &servers_list)); base::ListValue::const_iterator it = servers_list->begin(); const base::DictionaryValue* server_pref_dict; ASSERT_TRUE((*it)->GetAsDictionary(&server_pref_dict));
diff --git a/net/http/http_stream.h b/net/http/http_stream.h index b7e7888..096dd46 100644 --- a/net/http/http_stream.h +++ b/net/http/http_stream.h
@@ -13,14 +13,21 @@ #include <stdint.h> +#include <vector> + #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "net/base/completion_callback.h" #include "net/base/net_error_details.h" +#include "net/base/net_errors.h" #include "net/base/net_export.h" #include "net/base/request_priority.h" #include "net/base/upload_progress.h" +namespace crypto { +class ECPrivateKey; +} + namespace net { class BoundNetLog; @@ -151,6 +158,11 @@ // and does not modify |endpoint| if it is unavailable. virtual bool GetRemoteEndpoint(IPEndPoint* endpoint) = 0; + // Signs the EKM value for Token Binding from the TLS layer using |*key| and + // puts the result in |*out|. Returns OK or ERR_FAILED. + virtual Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) = 0; + // In the case of an HTTP error or redirect, flush the response body (usually // a simple error or "this page has moved") so that we can re-use the // underlying connection. This stream is responsible for deleting itself when
diff --git a/net/http/http_stream_factory_impl_unittest.cc b/net/http/http_stream_factory_impl_unittest.cc index 32c20e3..0d89cf1 100644 --- a/net/http/http_stream_factory_impl_unittest.cc +++ b/net/http/http_stream_factory_impl_unittest.cc
@@ -103,6 +103,11 @@ void GetSSLInfo(SSLInfo* ssl_info) override {} void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override {} bool GetRemoteEndpoint(IPEndPoint* endpoint) override { return false; } + Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) override { + ADD_FAILURE(); + return ERR_NOT_IMPLEMENTED; + } void Drain(HttpNetworkSession* session) override {} void PopulateNetErrorDetails(NetErrorDetails* details) override { return; } void SetPriority(RequestPriority priority) override {}
diff --git a/net/http/http_stream_parser.cc b/net/http/http_stream_parser.cc index e4a4207..bc7746da 100644 --- a/net/http/http_stream_parser.cc +++ b/net/http/http_stream_parser.cc
@@ -24,6 +24,7 @@ #include "net/http/http_util.h" #include "net/socket/client_socket_handle.h" #include "net/socket/ssl_client_socket.h" +#include "net/ssl/token_binding.h" namespace net { @@ -1100,6 +1101,17 @@ } } +Error HttpStreamParser::GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) { + if (!request_->url.SchemeIsCryptographic() || !connection_->socket()) { + NOTREACHED(); + return ERR_FAILED; + } + SSLClientSocket* ssl_socket = + static_cast<SSLClientSocket*>(connection_->socket()); + return ssl_socket->GetSignedEKMForTokenBinding(key, out); +} + int HttpStreamParser::EncodeChunk(const base::StringPiece& payload, char* output, size_t output_size) {
diff --git a/net/http/http_stream_parser.h b/net/http/http_stream_parser.h index d51cb91..b8bb23a 100644 --- a/net/http/http_stream_parser.h +++ b/net/http/http_stream_parser.h
@@ -15,7 +15,9 @@ #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/strings/string_piece.h" +#include "crypto/ec_private_key.h" #include "net/base/completion_callback.h" +#include "net/base/net_errors.h" #include "net/base/net_export.h" #include "net/base/upload_progress.h" #include "net/log/net_log.h" @@ -95,6 +97,9 @@ void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info); + Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out); + // Encodes the given |payload| in the chunked format to |output|. // Returns the number of bytes written to |output|. |output_size| should // be large enough to store the encoded chunk, which is payload.size() +
diff --git a/net/http/proxy_connect_redirect_http_stream.cc b/net/http/proxy_connect_redirect_http_stream.cc index 2b26b08..45d74245 100644 --- a/net/http/proxy_connect_redirect_http_stream.cc +++ b/net/http/proxy_connect_redirect_http_stream.cc
@@ -102,6 +102,13 @@ return false; } +Error ProxyConnectRedirectHttpStream::GetSignedEKMForTokenBinding( + crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) { + NOTREACHED(); + return ERR_NOT_IMPLEMENTED; +} + void ProxyConnectRedirectHttpStream::Drain(HttpNetworkSession* session) { NOTREACHED(); }
diff --git a/net/http/proxy_connect_redirect_http_stream.h b/net/http/proxy_connect_redirect_http_stream.h index af3940c..36e595c 100644 --- a/net/http/proxy_connect_redirect_http_stream.h +++ b/net/http/proxy_connect_redirect_http_stream.h
@@ -57,6 +57,8 @@ void GetSSLInfo(SSLInfo* ssl_info) override; void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override; bool GetRemoteEndpoint(IPEndPoint* endpoint) override; + Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) override; void Drain(HttpNetworkSession* session) override; void PopulateNetErrorDetails(NetErrorDetails* details) override;
diff --git a/net/log/net_log_event_type_list.h b/net/log/net_log_event_type_list.h index e323327..23ca1bd 100644 --- a/net/log/net_log_event_type_list.h +++ b/net/log/net_log_event_type_list.h
@@ -1115,6 +1115,9 @@ // restarting for authentication, on keep alive connections. EVENT_TYPE(HTTP_TRANSACTION_DRAIN_BODY_FOR_AUTH_RESTART) +// Measures the time taken to look up the key used for Token Binding. +EVENT_TYPE(HTTP_TRANSACTION_GET_TOKEN_BINDING_KEY) + // This event is sent when we try to restart a transaction after an error. // The following parameters are attached: // {
diff --git a/net/net.gypi b/net/net.gypi index 1cf94e1..c34ae2b7 100644 --- a/net/net.gypi +++ b/net/net.gypi
@@ -111,8 +111,6 @@ 'cert/internal/verify_signed_data.h', 'cert/pem_tokenizer.cc', 'cert/pem_tokenizer.h', - 'cert/sha256_legacy_support_win.cc', - 'cert/sha256_legacy_support_win.h', 'cert/signed_certificate_timestamp.cc', 'cert/signed_certificate_timestamp.h', 'cert/signed_tree_head.h', @@ -827,8 +825,6 @@ 'filter/sdch_filter.h', 'http/des.cc', 'http/des.h', - 'http/disk_based_cert_cache.cc', - 'http/disk_based_cert_cache.h', 'http/disk_cache_based_quic_server_info.cc', 'http/disk_cache_based_quic_server_info.h', 'http/failing_http_transaction_factory.cc', @@ -1188,6 +1184,9 @@ 'ssl/ssl_platform_key_win.cc', 'ssl/threaded_ssl_private_key.cc', 'ssl/threaded_ssl_private_key.h', + 'ssl/token_binding.h', + 'ssl/token_binding_nss.cc', + 'ssl/token_binding_openssl.cc', 'third_party/mozilla_security_manager/nsKeygenHandler.cpp', 'third_party/mozilla_security_manager/nsKeygenHandler.h', 'third_party/mozilla_security_manager/nsNSSCertificateDB.cpp', @@ -1370,7 +1369,6 @@ 'cert/nss_cert_database_unittest.cc', 'cert/nss_profile_filter_chromeos_unittest.cc', 'cert/pem_tokenizer_unittest.cc', - 'cert/sha256_legacy_support_win_unittest.cc', 'cert/signed_certificate_timestamp_unittest.cc', 'cert/test_root_certs_unittest.cc', 'cert/x509_cert_types_unittest.cc', @@ -1444,7 +1442,6 @@ 'ftp/ftp_util_unittest.cc', 'http/bidirectional_stream_unittest.cc', 'http/des_unittest.cc', - 'http/disk_based_cert_cache_unittest.cc', 'http/disk_cache_based_quic_server_info_unittest.cc', 'http/http_auth_cache_unittest.cc', 'http/http_auth_challenge_tokenizer_unittest.cc',
diff --git a/net/net_common.gypi b/net/net_common.gypi index b08beb8..6d7f943 100644 --- a/net/net_common.gypi +++ b/net/net_common.gypi
@@ -136,6 +136,7 @@ 'socket/ssl_client_socket_nss.h', 'socket/ssl_server_socket_nss.cc', 'socket/ssl_server_socket_nss.h', + 'ssl/token_binding_nss.cc', ], 'dependencies': [ '../third_party/boringssl/boringssl.gyp:boringssl', @@ -189,6 +190,7 @@ 'ssl/ssl_platform_key_task_runner.h', 'ssl/threaded_ssl_private_key.cc', 'ssl/threaded_ssl_private_key.h', + 'ssl/token_binding_openssl.cc', ], }, ],
diff --git a/net/quic/crypto/proof_verifier_chromium_test.cc b/net/quic/crypto/proof_verifier_chromium_test.cc index 96c401380..ddd4c94b 100644 --- a/net/quic/crypto/proof_verifier_chromium_test.cc +++ b/net/quic/crypto/proof_verifier_chromium_test.cc
@@ -183,41 +183,15 @@ certs->push_back(der_bytes); } - std::string GetSCTListForTesting() { - const std::string sct = ct::GetTestSignedCertificateTimestamp(); - std::string sct_list; - ct::EncodeSCTListForTesting(sct, &sct_list); - return sct_list; - } - - std::string GetCorruptSCTListForTesting() { - std::string sct = ct::GetTestSignedCertificateTimestamp(); - sct[15] = 't'; // Corrupt a byte inside SCT. - std::string sct_list; - ct::EncodeSCTListForTesting(sct, &sct_list); - return sct_list; - } - - bool CheckForSingleVerifiedSCTInResult(const ct::CTVerifyResult& result) { - return (result.verified_scts.size() == 1U) && result.invalid_scts.empty() && - result.unknown_logs_scts.empty() && - result.verified_scts[0]->log_description == kLogDescription; - } - - bool CheckForSCTOrigin(const ct::CTVerifyResult& result, - ct::SignedCertificateTimestamp::Origin origin) { - return (result.verified_scts.size() > 0) && - (result.verified_scts[0]->origin == origin); - } - void CheckSCT(bool sct_expected_ok) { ProofVerifyDetailsChromium* proof_details = reinterpret_cast<ProofVerifyDetailsChromium*>(details_.get()); const ct::CTVerifyResult& ct_verify_result = proof_details->ct_verify_result; if (sct_expected_ok) { - ASSERT_TRUE(CheckForSingleVerifiedSCTInResult(ct_verify_result)); - ASSERT_TRUE(CheckForSCTOrigin( + ASSERT_TRUE(ct::CheckForSingleVerifiedSCTInResult(ct_verify_result, + kLogDescription)); + ASSERT_TRUE(ct::CheckForSCTOrigin( ct_verify_result, ct::SignedCertificateTimestamp::SCT_FROM_TLS_EXTENSION)); } else { @@ -261,7 +235,7 @@ scoped_ptr<DummyProofVerifierCallback> callback( new DummyProofVerifierCallback); QuicAsyncStatus status = proof_verifier.VerifyProof( - kTestHostname, kTestConfig, certs_, GetSCTListForTesting(), "", + kTestHostname, kTestConfig, certs_, ct::GetSCTListForTesting(), "", verify_context_.get(), &error_details_, &details_, callback.get()); ASSERT_EQ(QUIC_FAILURE, status); CheckSCT(/*sct_expected_ok=*/true); @@ -279,7 +253,7 @@ scoped_ptr<DummyProofVerifierCallback> callback( new DummyProofVerifierCallback); QuicAsyncStatus status = proof_verifier.VerifyProof( - kTestHostname, kTestConfig, certs_, GetCorruptSCTListForTesting(), "", + kTestHostname, kTestConfig, certs_, ct::GetSCTListWithInvalidSCT(), "", verify_context_.get(), &error_details_, &details_, callback.get()); ASSERT_EQ(QUIC_FAILURE, status); CheckSCT(/*sct_expected_ok=*/false);
diff --git a/net/quic/quic_http_stream.cc b/net/quic/quic_http_stream.cc index 81b57f8..7cd89ce 100644 --- a/net/quic/quic_http_stream.cc +++ b/net/quic/quic_http_stream.cc
@@ -281,6 +281,12 @@ return true; } +Error QuicHttpStream::GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) { + NOTREACHED(); + return ERR_NOT_IMPLEMENTED; +} + void QuicHttpStream::Drain(HttpNetworkSession* session) { NOTREACHED(); Close(false);
diff --git a/net/quic/quic_http_stream.h b/net/quic/quic_http_stream.h index 7abdf8b..0b23ea5d 100644 --- a/net/quic/quic_http_stream.h +++ b/net/quic/quic_http_stream.h
@@ -61,6 +61,8 @@ void GetSSLInfo(SSLInfo* ssl_info) override; void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override; bool GetRemoteEndpoint(IPEndPoint* endpoint) override; + Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) override; void Drain(HttpNetworkSession* session) override; void PopulateNetErrorDetails(NetErrorDetails* details) override; void SetPriority(RequestPriority priority) override;
diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc index 04f5151d..095ebe83 100644 --- a/net/socket/socket_test_util.cc +++ b/net/socket/socket_test_util.cc
@@ -287,7 +287,8 @@ client_cert_sent(false), cert_request_info(NULL), channel_id_sent(false), - connection_status(0) { + connection_status(0), + token_binding_negotiated(false) { SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_TLS1_2, &connection_status); // Set to TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 @@ -826,6 +827,12 @@ return NULL; } +Error MockClientSocket::GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) { + NOTREACHED(); + return ERR_NOT_IMPLEMENTED; +} + SSLFailureState MockClientSocket::GetSSLFailureState() const { return IsConnected() ? SSL_FAILURE_NONE : SSL_FAILURE_UNKNOWN; } @@ -1199,6 +1206,8 @@ ssl_info->client_cert_sent = data_->client_cert_sent; ssl_info->channel_id_sent = data_->channel_id_sent; ssl_info->connection_status = data_->connection_status; + ssl_info->token_binding_negotiated = data_->token_binding_negotiated; + ssl_info->token_binding_key_param = data_->token_binding_key_param; return true; } @@ -1224,6 +1233,13 @@ return data_->channel_id_service; } +Error MockSSLClientSocket::GetSignedEKMForTokenBinding( + crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) { + out->push_back('A'); + return OK; +} + void MockSSLClientSocket::OnReadComplete(const MockRead& data) { NOTIMPLEMENTED(); }
diff --git a/net/socket/socket_test_util.h b/net/socket/socket_test_util.h index a3c6df4..90f7fda 100644 --- a/net/socket/socket_test_util.h +++ b/net/socket/socket_test_util.h
@@ -361,6 +361,8 @@ bool channel_id_sent; ChannelIDService* channel_id_service; int connection_status; + bool token_binding_negotiated; + TokenBindingParam token_binding_key_param; }; // Uses the sequence_number field in the mock reads and writes to @@ -577,6 +579,8 @@ int GetTLSUniqueChannelBinding(std::string* out) override; NextProtoStatus GetNextProto(std::string* proto) const override; ChannelIDService* GetChannelIDService() const override; + Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) override; SSLFailureState GetSSLFailureState() const override; protected: @@ -691,6 +695,8 @@ // SSLClientSocket implementation. void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override; + Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) override; NextProtoStatus GetNextProto(std::string* proto) const override; // This MockSocket does not implement the manual async IO feature.
diff --git a/net/socket/ssl_client_socket.h b/net/socket/ssl_client_socket.h index 3a6aa94..9f6551a 100644 --- a/net/socket/ssl_client_socket.h +++ b/net/socket/ssl_client_socket.h
@@ -22,6 +22,10 @@ class SequencedTaskRunner; } +namespace crypto { +class ECPrivateKey; +} + namespace net { class CTPolicyEnforcer; @@ -144,6 +148,11 @@ // channel ids are not supported. virtual ChannelIDService* GetChannelIDService() const = 0; + // Signs the EKM value for Token Binding with |*key| and puts it in |*out|. + // Returns a net error code. + virtual Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) = 0; + // Returns the state of the handshake when it failed, or |SSL_FAILURE_NONE| if // the handshake succeeded. This is used to classify causes of the TLS version // fallback.
diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc index b15d7617..5619247 100644 --- a/net/socket/ssl_client_socket_nss.cc +++ b/net/socket/ssl_client_socket_nss.cc
@@ -3179,6 +3179,13 @@ return channel_id_service_; } +Error SSLClientSocketNSS::GetSignedEKMForTokenBinding( + crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) { + NOTREACHED(); + return ERR_NOT_IMPLEMENTED; +} + SSLFailureState SSLClientSocketNSS::GetSSLFailureState() const { if (completed_handshake_) return SSL_FAILURE_NONE;
diff --git a/net/socket/ssl_client_socket_nss.h b/net/socket/ssl_client_socket_nss.h index 366df1c4..d8a1549 100644 --- a/net/socket/ssl_client_socket_nss.h +++ b/net/socket/ssl_client_socket_nss.h
@@ -99,6 +99,8 @@ // SSLClientSocket implementation. ChannelIDService* GetChannelIDService() const override; + Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) override; SSLFailureState GetSSLFailureState() const override; private:
diff --git a/net/socket/ssl_client_socket_openssl.cc b/net/socket/ssl_client_socket_openssl.cc index 02a3efc..501eaefc 100644 --- a/net/socket/ssl_client_socket_openssl.cc +++ b/net/socket/ssl_client_socket_openssl.cc
@@ -50,10 +50,6 @@ #include "net/ssl/ssl_info.h" #include "net/ssl/ssl_private_key.h" -#if defined(OS_WIN) -#include "base/win/windows_version.h" -#endif - #if !defined(OS_NACL) #include "net/ssl/ssl_key_logger.h" #endif @@ -526,6 +522,7 @@ channel_id_service_(context.channel_id_service), tb_was_negotiated_(false), tb_negotiated_param_(TB_PARAM_ECDSAP256), + tb_signed_ekm_map_(10), ssl_(NULL), transport_bio_(NULL), transport_(std::move(transport_socket)), @@ -577,6 +574,47 @@ return channel_id_service_; } +Error SSLClientSocketOpenSSL::GetSignedEKMForTokenBinding( + crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) { + // The same key will be used across multiple requests to sign the same value, + // so the signature is cached. + std::string raw_public_key; + if (!key->ExportRawPublicKey(&raw_public_key)) + return ERR_FAILED; + SignedEkmMap::iterator it = tb_signed_ekm_map_.Get(raw_public_key); + if (it != tb_signed_ekm_map_.end()) { + *out = it->second; + return OK; + } + + uint8_t tb_ekm_buf[32]; + static const char kTokenBindingExporterLabel[] = "EXPORTER-Token-Binding"; + if (!SSL_export_keying_material(ssl_, tb_ekm_buf, sizeof(tb_ekm_buf), + kTokenBindingExporterLabel, + strlen(kTokenBindingExporterLabel), nullptr, + 0, false /* no context */)) { + return ERR_FAILED; + } + + size_t sig_len; + crypto::ScopedEVP_PKEY_CTX pctx(EVP_PKEY_CTX_new(key->key(), nullptr)); + if (!EVP_PKEY_sign_init(pctx.get()) || + !EVP_PKEY_sign(pctx.get(), nullptr, &sig_len, tb_ekm_buf, + sizeof(tb_ekm_buf))) { + return ERR_FAILED; + } + out->resize(sig_len); + if (!EVP_PKEY_sign(pctx.get(), out->data(), &sig_len, tb_ekm_buf, + sizeof(tb_ekm_buf))) { + return ERR_FAILED; + } + out->resize(sig_len); + + tb_signed_ekm_map_.Put(raw_public_key, *out); + return OK; +} + SSLFailureState SSLClientSocketOpenSSL::GetSSLFailureState() const { return ssl_failure_state_; } @@ -1000,14 +1038,6 @@ } } - // Disable ECDSA cipher suites on platforms that do not support ECDSA - // signed certificates, as servers may use the presence of such - // ciphersuites as a hint to send an ECDSA certificate. -#if defined(OS_WIN) - if (base::win::GetVersion() < base::win::VERSION_VISTA) - command.append(":!ECDSA"); -#endif - int rv = SSL_set_cipher_list(ssl_, command.c_str()); // If this fails (rv = 0) it means there are no ciphers enabled on this SSL. // This will almost certainly result in the socket failing to complete the
diff --git a/net/socket/ssl_client_socket_openssl.h b/net/socket/ssl_client_socket_openssl.h index 178daeb3..6e464d7 100644 --- a/net/socket/ssl_client_socket_openssl.h +++ b/net/socket/ssl_client_socket_openssl.h
@@ -13,6 +13,8 @@ #include <string> #include <vector> +#include "base/compiler_specific.h" +#include "base/containers/mru_cache.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" @@ -42,6 +44,8 @@ class SSLCertRequestInfo; class SSLInfo; +using SignedEkmMap = base::MRUCache<std::string, std::vector<uint8_t>>; + // An SSL client socket implemented with OpenSSL. class SSLClientSocketOpenSSL : public SSLClientSocket { public: @@ -72,6 +76,8 @@ void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override; NextProtoStatus GetNextProto(std::string* proto) const override; ChannelIDService* GetChannelIDService() const override; + Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) override; SSLFailureState GetSSLFailureState() const override; // SSLSocket implementation. @@ -301,6 +307,7 @@ ChannelIDService* channel_id_service_; bool tb_was_negotiated_; TokenBindingParam tb_negotiated_param_; + SignedEkmMap tb_signed_ekm_map_; // OpenSSL stuff SSL* ssl_;
diff --git a/net/socket/tcp_socket_win.cc b/net/socket/tcp_socket_win.cc index a9998e2c..872a560 100644 --- a/net/socket/tcp_socket_win.cc +++ b/net/socket/tcp_socket_win.cc
@@ -13,7 +13,6 @@ #include "base/logging.h" #include "base/macros.h" #include "base/profiler/scoped_tracker.h" -#include "base/win/windows_version.h" #include "net/base/address_list.h" #include "net/base/connection_type_histograms.h" #include "net/base/io_buffer.h" @@ -580,22 +579,6 @@ } void TCPSocketWin::SetDefaultOptionsForClient() { - // Increase the socket buffer sizes from the default sizes for WinXP. In - // performance testing, there is substantial benefit by increasing from 8KB - // to 64KB. - // See also: - // http://support.microsoft.com/kb/823764/EN-US - // On Vista, if we manually set these sizes, Vista turns off its receive - // window auto-tuning feature. - // http://blogs.msdn.com/wndp/archive/2006/05/05/Winhec-blog-tcpip-2.aspx - // Since Vista's auto-tune is better than any static value we can could set, - // only change these on pre-vista machines. - if (base::win::GetVersion() < base::win::VERSION_VISTA) { - const int32_t kSocketBufferSize = 64 * 1024; - SetSocketReceiveBufferSize(socket_, kSocketBufferSize); - SetSocketSendBufferSize(socket_, kSocketBufferSize); - } - DisableNagle(socket_, true); SetTCPKeepAlive(socket_, true, kTCPKeepAliveSeconds); }
diff --git a/net/spdy/spdy_http_stream.cc b/net/spdy/spdy_http_stream.cc index 16e19b2..c6d0a37e 100644 --- a/net/spdy/spdy_http_stream.cc +++ b/net/spdy/spdy_http_stream.cc
@@ -570,6 +570,11 @@ return spdy_session_->GetPeerAddress(endpoint) == OK; } +Error SpdyHttpStream::GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) { + return spdy_session_->GetSignedEKMForTokenBinding(key, out); +} + void SpdyHttpStream::Drain(HttpNetworkSession* session) { NOTREACHED(); Close(false);
diff --git a/net/spdy/spdy_http_stream.h b/net/spdy/spdy_http_stream.h index a79569a..76130d8 100644 --- a/net/spdy/spdy_http_stream.h +++ b/net/spdy/spdy_http_stream.h
@@ -79,6 +79,8 @@ void GetSSLInfo(SSLInfo* ssl_info) override; void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override; bool GetRemoteEndpoint(IPEndPoint* endpoint) override; + Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) override; void Drain(HttpNetworkSession* session) override; void PopulateNetErrorDetails(NetErrorDetails* details) override; void SetPriority(RequestPriority priority) override;
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc index 97b5837..1855231 100644 --- a/net/spdy/spdy_session.cc +++ b/net/spdy/spdy_session.cc
@@ -2044,6 +2044,17 @@ return connection_->socket()->GetSSLInfo(ssl_info); } +Error SpdySession::GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) { + if (!is_secure_) { + NOTREACHED(); + return ERR_FAILED; + } + SSLClientSocket* ssl_socket = + static_cast<SSLClientSocket*>(connection_->socket()); + return ssl_socket->GetSignedEKMForTokenBinding(key, out); +} + void SpdySession::OnError(SpdyFramer::SpdyError error_code) { CHECK(in_io_loop_);
diff --git a/net/spdy/spdy_session.h b/net/spdy/spdy_session.h index efab1b84..491766e 100644 --- a/net/spdy/spdy_session.h +++ b/net/spdy/spdy_session.h
@@ -357,6 +357,11 @@ bool* was_npn_negotiated, NextProto* protocol_negotiated); + // Signs the EKM value for Token Binding from the TLS layer using |*key| and + // puts the result in |*out|. Returns OK or ERR_FAILED. + Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out); + // Send a WINDOW_UPDATE frame for a stream. Called by a stream // whenever receive window size is increased. void SendStreamWindowUpdate(SpdyStreamId stream_id,
diff --git a/net/spdy/spdy_test_util_common.cc b/net/spdy/spdy_test_util_common.cc index 6a287948..f7022f5a 100644 --- a/net/spdy/spdy_test_util_common.cc +++ b/net/spdy/spdy_test_util_common.cc
@@ -337,6 +337,7 @@ SpdySessionDependencies::SpdySessionDependencies(NextProto protocol) : host_resolver(new MockCachingHostResolver), cert_verifier(new MockCertVerifier), + channel_id_service(nullptr), transport_security_state(new TransportSecurityState), proxy_service(ProxyService::CreateDirect()), ssl_config_service(new SSLConfigServiceDefaults), @@ -372,6 +373,7 @@ scoped_ptr<ProxyService> proxy_service) : host_resolver(new MockHostResolver), cert_verifier(new MockCertVerifier), + channel_id_service(nullptr), transport_security_state(new TransportSecurityState), proxy_service(std::move(proxy_service)), ssl_config_service(new SSLConfigServiceDefaults), @@ -416,6 +418,7 @@ HttpNetworkSession::Params params; params.host_resolver = session_deps->host_resolver.get(); params.cert_verifier = session_deps->cert_verifier.get(); + params.channel_id_service = session_deps->channel_id_service.get(); params.transport_security_state = session_deps->transport_security_state.get(); params.proxy_service = session_deps->proxy_service.get();
diff --git a/net/spdy/spdy_test_util_common.h b/net/spdy/spdy_test_util_common.h index 9ef8df5..ebde0516 100644 --- a/net/spdy/spdy_test_util_common.h +++ b/net/spdy/spdy_test_util_common.h
@@ -188,6 +188,7 @@ // NOTE: host_resolver must be ordered before http_auth_handler_factory. scoped_ptr<MockHostResolverBase> host_resolver; scoped_ptr<CertVerifier> cert_verifier; + scoped_ptr<ChannelIDService> channel_id_service; scoped_ptr<TransportSecurityState> transport_security_state; scoped_ptr<ProxyService> proxy_service; scoped_refptr<SSLConfigService> ssl_config_service;
diff --git a/net/ssl/token_binding.h b/net/ssl/token_binding.h new file mode 100644 index 0000000..5ae04c5 --- /dev/null +++ b/net/ssl/token_binding.h
@@ -0,0 +1,94 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_SSL_TOKEN_BINDING_H_ +#define NET_SSL_TOKEN_BINDING_H_ + +#include <string> +#include <vector> + +#include "base/strings/string_piece.h" +#include "crypto/ec_private_key.h" +#include "net/base/net_errors.h" +#include "net/base/net_export.h" + +namespace net { + +// Given a vector of serialized TokenBinding structs (as defined in +// draft-ietf-tokbind-protocol-02), this function combines them to form the +// serialized TokenBindingMessage struct in |*out|. This function returns a net +// error. +// +// struct { +// TokenBinding tokenbindings<0..2^16-1>; +// } TokenBindingMessage; +Error BuildTokenBindingMessageFromTokenBindings( + const std::vector<base::StringPiece>& token_bindings, + std::string* out); + +// Builds a TokenBinding struct with a provided TokenBindingID created from +// |*key| and a signature of |ekm| using |*key| to sign. +// +// enum { +// rsa2048_pkcs1.5(0), rsa2048_pss(1), ecdsap256(2), (255) +// } TokenBindingKeyParameters; +// +// struct { +// opaque modulus<1..2^16-1>; +// opaque publicexponent<1..2^8-1>; +// } RSAPublicKey; +// +// struct { +// opaque point <1..2^8-1>; +// } ECPoint; +// +// enum { +// provided_token_binding(0), referred_token_binding(1), (255) +// } TokenBindingType; +// +// struct { +// TokenBindingType tokenbinding_type; +// TokenBindingKeyParameters key_parameters; +// select (key_parameters) { +// case rsa2048_pkcs1.5: +// case rsa2048_pss: +// RSAPublicKey rsapubkey; +// case ecdsap256: +// ECPoint point; +// } +// } TokenBindingID; +// +// struct { +// TokenBindingID tokenbindingid; +// opaque signature<0..2^16-1>;// Signature over the exported keying +// // material value +// Extension extensions<0..2^16-1>; +// } TokenBinding; +Error BuildProvidedTokenBinding(crypto::ECPrivateKey* key, + const std::vector<uint8_t>& ekm, + std::string* out); + +// Given a TokenBindingMessage, parses the first TokenBinding from it, +// extracts the ECPoint of the TokenBindingID into |*ec_point|, and extracts the +// signature of the EKM value into |*signature|. It also verifies that the first +// TokenBinding is a provided Token Binding, and that the key parameters is +// ecdsap256. This function returns whether the message was able to be parsed +// successfully. +NET_EXPORT_PRIVATE bool ParseTokenBindingMessage( + base::StringPiece token_binding_message, + base::StringPiece* ec_point, + base::StringPiece* signature); + +// Takes an ECPoint |ec_point| from a TokenBindingID and |signature| from a +// TokenBinding and verifies that |signature| is the signature of |ekm| using +// |ec_point| as the public key. Returns true if the signature verifies and +// false if it doesn't or some other error occurs in verification. This function +// is only provided for testing. +NET_EXPORT_PRIVATE bool VerifyEKMSignature(base::StringPiece ec_point, + base::StringPiece signature, + base::StringPiece ekm); + +} // namespace net + +#endif // NET_SSL_TOKEN_BINDING_H_
diff --git a/net/ssl/token_binding_nss.cc b/net/ssl/token_binding_nss.cc new file mode 100644 index 0000000..bb18498 --- /dev/null +++ b/net/ssl/token_binding_nss.cc
@@ -0,0 +1,39 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "token_binding.h" + +#include "net/base/net_errors.h" + +namespace net { + +Error BuildTokenBindingMessageFromTokenBindings( + const std::vector<base::StringPiece>& token_bindings, + std::string* out) { + NOTREACHED(); + return ERR_NOT_IMPLEMENTED; +} + +Error BuildProvidedTokenBinding(crypto::ECPrivateKey* key, + const std::vector<uint8_t>& ekm, + std::string* out) { + NOTREACHED(); + return ERR_NOT_IMPLEMENTED; +} + +bool ParseTokenBindingMessage(base::StringPiece token_binding_message, + base::StringPiece* ec_point, + base::StringPiece* signature) { + NOTREACHED(); + return false; +} + +bool VerifyEKMSignature(base::StringPiece ec_point, + base::StringPiece signature, + base::StringPiece ekm) { + NOTREACHED(); + return false; +} + +} // namespace net
diff --git a/net/ssl/token_binding_openssl.cc b/net/ssl/token_binding_openssl.cc new file mode 100644 index 0000000..0cfc3fe9 --- /dev/null +++ b/net/ssl/token_binding_openssl.cc
@@ -0,0 +1,147 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/ssl/token_binding.h" + +#include <openssl/bytestring.h> +#include <openssl/ec.h> +#include <openssl/evp.h> +#include <openssl/mem.h> + +#include "base/stl_util.h" +#include "crypto/scoped_openssl_types.h" +#include "net/base/net_errors.h" +#include "net/ssl/ssl_config.h" + +namespace net { + +namespace { + +enum TokenBindingType { + TB_TYPE_PROVIDED = 0, + TB_TYPE_REFERRED = 1, +}; + +bool BuildTokenBindingID(TokenBindingType type, + crypto::ECPrivateKey* key, + CBB* out) { + CBB ec_point; + if (!CBB_add_u8(out, type) || !CBB_add_u8(out, TB_PARAM_ECDSAP256) || + !CBB_add_u8_length_prefixed(out, &ec_point)) { + return false; + } + + EVP_PKEY* pkey = key->key(); + static const int kExpectedKeyLength = 65; + uint8_t* buf; + // TODO(nharper): Replace i2o_ECPublicKey with EC_POINT_point2cbb. + if (pkey->type != EVP_PKEY_EC || + i2o_ECPublicKey(pkey->pkey.ec, nullptr) != kExpectedKeyLength || + !CBB_add_space(&ec_point, &buf, kExpectedKeyLength) || + i2o_ECPublicKey(pkey->pkey.ec, &buf) != kExpectedKeyLength || + !CBB_flush(out)) { + return false; + } + return true; +} + +} // namespace + +Error BuildTokenBindingMessageFromTokenBindings( + const std::vector<base::StringPiece>& token_bindings, + std::string* out) { + CBB tb_message, child; + if (!CBB_init(&tb_message, 0) || + !CBB_add_u16_length_prefixed(&tb_message, &child)) { + CBB_cleanup(&tb_message); + return ERR_FAILED; + } + for (const base::StringPiece& token_binding : token_bindings) { + if (!CBB_add_bytes(&child, + reinterpret_cast<const uint8_t*>(token_binding.data()), + token_binding.size())) { + CBB_cleanup(&tb_message); + return ERR_FAILED; + } + } + + uint8_t* out_data; + size_t out_len; + if (!CBB_finish(&tb_message, &out_data, &out_len)) { + CBB_cleanup(&tb_message); + return ERR_FAILED; + } + out->assign(reinterpret_cast<char*>(out_data), out_len); + OPENSSL_free(out_data); + return OK; +} + +Error BuildProvidedTokenBinding(crypto::ECPrivateKey* key, + const std::vector<uint8_t>& signed_ekm, + std::string* out) { + uint8_t* out_data; + size_t out_len; + CBB token_binding; + if (!CBB_init(&token_binding, 0) || + !BuildTokenBindingID(TB_TYPE_PROVIDED, key, &token_binding) || + !CBB_add_u16(&token_binding, signed_ekm.size()) || + !CBB_add_bytes(&token_binding, signed_ekm.data(), signed_ekm.size()) || + // 0-length extensions + !CBB_add_u16(&token_binding, 0) || + !CBB_finish(&token_binding, &out_data, &out_len)) { + CBB_cleanup(&token_binding); + return ERR_FAILED; + } + out->assign(reinterpret_cast<char*>(out_data), out_len); + OPENSSL_free(out_data); + return OK; +} + +bool ParseTokenBindingMessage(base::StringPiece token_binding_message, + base::StringPiece* ec_point_out, + base::StringPiece* signature_out) { + CBS tb_message, tb, ec_point, signature; + uint8_t tb_type, tb_param; + CBS_init(&tb_message, + reinterpret_cast<const uint8_t*>(token_binding_message.data()), + token_binding_message.size()); + if (!CBS_get_u16_length_prefixed(&tb_message, &tb) || + !CBS_get_u8(&tb, &tb_type) || !CBS_get_u8(&tb, &tb_param) || + !CBS_get_u8_length_prefixed(&tb, &ec_point) || + !CBS_get_u16_length_prefixed(&tb, &signature) || + tb_type != TB_TYPE_PROVIDED || tb_param != TB_PARAM_ECDSAP256) { + return false; + } + + *ec_point_out = base::StringPiece( + reinterpret_cast<const char*>(CBS_data(&ec_point)), CBS_len(&ec_point)); + *signature_out = base::StringPiece( + reinterpret_cast<const char*>(CBS_data(&signature)), CBS_len(&signature)); + return true; +} + +bool VerifyEKMSignature(base::StringPiece ec_point, + base::StringPiece signature, + base::StringPiece ekm) { + crypto::ScopedEC_Key key(EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); + EC_KEY* keyp = key.get(); + const uint8_t* ec_point_data = + reinterpret_cast<const uint8_t*>(ec_point.data()); + if (o2i_ECPublicKey(&keyp, &ec_point_data, ec_point.size()) != key.get()) + return false; + crypto::ScopedEVP_PKEY pkey(EVP_PKEY_new()); + if (!EVP_PKEY_assign_EC_KEY(pkey.get(), key.release())) + return false; + crypto::ScopedEVP_PKEY_CTX pctx(EVP_PKEY_CTX_new(pkey.get(), nullptr)); + if (!EVP_PKEY_verify_init(pctx.get()) || + !EVP_PKEY_verify( + pctx.get(), reinterpret_cast<const uint8_t*>(signature.data()), + signature.size(), reinterpret_cast<const uint8_t*>(ekm.data()), + ekm.size())) { + return false; + } + return true; +} + +} // namespace net
diff --git a/net/test/ct_test_util.cc b/net/test/ct_test_util.cc index b36c13d..9bc6f95 100644 --- a/net/test/ct_test_util.cc +++ b/net/test/ct_test_util.cc
@@ -14,7 +14,7 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "net/cert/ct_serialization.h" -#include "net/cert/signed_certificate_timestamp.h" +#include "net/cert/ct_verify_result.h" #include "net/cert/signed_tree_head.h" #include "net/cert/x509_certificate.h" @@ -360,6 +360,38 @@ return consistency_proof_json; } +std::string GetSCTListForTesting() { + const std::string sct = ct::GetTestSignedCertificateTimestamp(); + std::string sct_list; + ct::EncodeSCTListForTesting(sct, &sct_list); + return sct_list; +} + +std::string GetSCTListWithInvalidSCT() { + std::string sct(ct::GetTestSignedCertificateTimestamp()); + + // Change a byte inside the Log ID part of the SCT so it does not match the + // log used in the tests. + sct[15] = 't'; + + std::string sct_list; + ct::EncodeSCTListForTesting(sct, &sct_list); + return sct_list; +} + +bool CheckForSingleVerifiedSCTInResult(const ct::CTVerifyResult& result, + const std::string& log_description) { + return (result.verified_scts.size() == 1U) && result.invalid_scts.empty() && + result.unknown_logs_scts.empty() && + result.verified_scts[0]->log_description == log_description; +} + +bool CheckForSCTOrigin(const ct::CTVerifyResult& result, + ct::SignedCertificateTimestamp::Origin origin) { + return (result.verified_scts.size() > 0) && + (result.verified_scts[0]->origin == origin); +} + } // namespace ct } // namespace net
diff --git a/net/test/ct_test_util.h b/net/test/ct_test_util.h index e1d6cff..d3df6e6 100644 --- a/net/test/ct_test_util.h +++ b/net/test/ct_test_util.h
@@ -12,14 +12,15 @@ #include <vector> #include "base/memory/ref_counted.h" +#include "net/cert/signed_certificate_timestamp.h" namespace net { namespace ct { +struct CTVerifyResult; struct DigitallySigned; struct LogEntry; -struct SignedCertificateTimestamp; struct SignedTreeHead; // Note: unless specified otherwise, all test data is taken from Certificate @@ -102,6 +103,23 @@ // the provided raw nodes (i.e. the raw nodes will be base64-encoded). std::string CreateConsistencyProofJsonString( const std::vector<std::string>& raw_nodes); + +// Returns SCTList for testing. +std::string GetSCTListForTesting(); + +// Returns a corrupted SCTList. This is done by changing a byte inside the +// Log ID part of the SCT so it does not match the log used in the tests. +std::string GetSCTListWithInvalidSCT(); + +// Returns true if |log_description| is in the |result|'s |verified_scts| and +// number of |verified_scts| in |result| is equal to 1. +bool CheckForSingleVerifiedSCTInResult(const CTVerifyResult& result, + const std::string& log_description); + +// Returns true if |origin| is in the |result|'s |verified_scts|. +bool CheckForSCTOrigin(const CTVerifyResult& result, + SignedCertificateTimestamp::Origin origin); + } // namespace ct } // namespace net
diff --git a/net/tools/testserver/testserver.py b/net/tools/testserver/testserver.py index 1531765..fe57a54 100755 --- a/net/tools/testserver/testserver.py +++ b/net/tools/testserver/testserver.py
@@ -340,6 +340,7 @@ self.GetSSLSessionCacheHandler, self.SSLManySmallRecords, self.GetChannelID, + self.GetTokenBindingEKM, self.GetClientCert, self.ClientCipherListHandler, self.CloseSocketHandler, @@ -1516,6 +1517,21 @@ self.wfile.write(hashlib.sha256(channel_id).digest().encode('base64')) return True + def GetTokenBindingEKM(self): + """Send a reply containing the EKM value for token binding from the TLS + layer.""" + + if not self._ShouldHandleRequest('/tokbind-ekm'): + return False + + ekm = self.server.tlsConnection.exportKeyingMaterial( + "EXPORTER-Token-Binding", "", False, 32) + self.send_response(200) + self.send_header('Content-Type', 'application/octet-stream') + self.end_headers() + self.wfile.write(ekm) + return True + def GetClientCert(self): """Send a reply whether a client certificate was provided."""
diff --git a/net/url_request/url_request_http_job_unittest.cc b/net/url_request/url_request_http_job_unittest.cc index 5958487c..dddfd8d 100644 --- a/net/url_request/url_request_http_job_unittest.cc +++ b/net/url_request/url_request_http_job_unittest.cc
@@ -809,6 +809,12 @@ bool GetRemoteEndpoint(IPEndPoint* endpoint) override { return false; } + Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) override { + ADD_FAILURE(); + return ERR_NOT_IMPLEMENTED; + } + void Drain(HttpNetworkSession* session) override {} void PopulateNetErrorDetails(NetErrorDetails* details) override { return; }
diff --git a/net/url_request/url_request_test_util.cc b/net/url_request/url_request_test_util.cc index b3c03c71..60f0f36 100644 --- a/net/url_request/url_request_test_util.cc +++ b/net/url_request/url_request_test_util.cc
@@ -111,6 +111,7 @@ params.network_delegate = network_delegate(); params.http_server_properties = http_server_properties(); params.net_log = net_log(); + params.channel_id_service = channel_id_service(); context_storage_.set_http_network_session( make_scoped_ptr(new HttpNetworkSession(params))); context_storage_.set_http_transaction_factory(make_scoped_ptr(
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc index d0e5d255..78e4eb30 100644 --- a/net/url_request/url_request_unittest.cc +++ b/net/url_request/url_request_unittest.cc
@@ -16,6 +16,7 @@ #include <algorithm> #include <limits> +#include "base/base64url.h" #include "base/bind.h" #include "base/compiler_specific.h" #include "base/files/file_path.h" @@ -79,9 +80,12 @@ #include "net/log/test_net_log_util.h" #include "net/proxy/proxy_service.h" #include "net/socket/ssl_client_socket.h" +#include "net/ssl/channel_id_service.h" +#include "net/ssl/default_channel_id_store.h" #include "net/ssl/ssl_cipher_suite_names.h" #include "net/ssl/ssl_connection_status_flags.h" #include "net/ssl/ssl_server_config.h" +#include "net/ssl/token_binding.h" #include "net/test/cert_test_util.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/http_request.h" @@ -3370,7 +3374,113 @@ } // namespace -// In this unit test, we're using the EmbeddedTestServer as a proxy server and +class TestSSLConfigService : public SSLConfigService { + public: + TestSSLConfigService(bool ev_enabled, + bool online_rev_checking, + bool rev_checking_required_local_anchors, + bool token_binding_enabled) + : ev_enabled_(ev_enabled), + online_rev_checking_(online_rev_checking), + rev_checking_required_local_anchors_( + rev_checking_required_local_anchors), + token_binding_enabled_(token_binding_enabled), + min_version_(kDefaultSSLVersionMin), + fallback_min_version_(kDefaultSSLVersionFallbackMin) {} + + void set_min_version(uint16_t version) { min_version_ = version; } + + void set_fallback_min_version(uint16_t version) { + fallback_min_version_ = version; + } + + // SSLConfigService: + void GetSSLConfig(SSLConfig* config) override { + *config = SSLConfig(); + config->rev_checking_enabled = online_rev_checking_; + config->verify_ev_cert = ev_enabled_; + config->rev_checking_required_local_anchors = + rev_checking_required_local_anchors_; + if (fallback_min_version_) { + config->version_fallback_min = fallback_min_version_; + } + if (min_version_) { + config->version_min = min_version_; + } + if (token_binding_enabled_) { + config->token_binding_params.push_back(TB_PARAM_ECDSAP256); + } + } + + protected: + ~TestSSLConfigService() override {} + + private: + const bool ev_enabled_; + const bool online_rev_checking_; + const bool rev_checking_required_local_anchors_; + const bool token_binding_enabled_; + uint16_t min_version_; + uint16_t fallback_min_version_; +}; + +// TODO(svaldez): Update tests to use EmbeddedTestServer. +#if !defined(OS_IOS) +class TokenBindingURLRequestTest : public URLRequestTestHTTP { + public: + void SetUp() override { + default_context_.set_ssl_config_service( + new TestSSLConfigService(false, false, false, true)); + channel_id_service_.reset(new ChannelIDService( + new DefaultChannelIDStore(NULL), base::ThreadTaskRunnerHandle::Get())); + default_context_.set_channel_id_service(channel_id_service_.get()); + URLRequestTestHTTP::SetUp(); + } + + protected: + scoped_ptr<ChannelIDService> channel_id_service_; +}; + +TEST_F(TokenBindingURLRequestTest, TokenBindingTest) { + SpawnedTestServer::SSLOptions ssl_options; + ssl_options.supported_token_binding_params.push_back(TB_PARAM_ECDSAP256); + SpawnedTestServer https_test_server(SpawnedTestServer::TYPE_HTTPS, + ssl_options, + base::FilePath(kTestFilePath)); + ASSERT_TRUE(https_test_server.Start()); + + TestDelegate d; + { + scoped_ptr<URLRequest> r(default_context_.CreateRequest( + https_test_server.GetURL("tokbind-ekm"), DEFAULT_PRIORITY, &d)); + r->Start(); + EXPECT_TRUE(r->is_pending()); + + base::RunLoop().Run(); + + EXPECT_EQ(URLRequestStatus::SUCCESS, r->status().status()); + + HttpRequestHeaders headers; + std::string token_binding_header, token_binding_message; + EXPECT_TRUE(r->GetFullRequestHeaders(&headers)); + EXPECT_TRUE(headers.GetHeader(HttpRequestHeaders::kTokenBinding, + &token_binding_header)); + EXPECT_TRUE(base::Base64UrlDecode( + token_binding_header, base::Base64UrlDecodePolicy::REQUIRE_PADDING, + &token_binding_message)); + base::StringPiece ec_point, signature; + EXPECT_TRUE( + ParseTokenBindingMessage(token_binding_message, &ec_point, &signature)); + + EXPECT_GT(d.bytes_received(), 0); + std::string ekm = d.data_received(); + + EXPECT_TRUE(VerifyEKMSignature(ec_point, signature, ekm)); + } +} +#endif // !defined(OS_IOS) + +// In this unit test, we're using the HTTPTestServer as a proxy server and // issuing a CONNECT request with the magic host name "www.redirect.com". // The EmbeddedTestServer will return a 302 response, which we should not // follow. @@ -8528,61 +8638,17 @@ #endif // OS_WIN -class TestSSLConfigService : public SSLConfigService { - public: - TestSSLConfigService(bool ev_enabled, - bool online_rev_checking, - bool rev_checking_required_local_anchors) - : ev_enabled_(ev_enabled), - online_rev_checking_(online_rev_checking), - rev_checking_required_local_anchors_( - rev_checking_required_local_anchors), - min_version_(kDefaultSSLVersionMin), - fallback_min_version_(kDefaultSSLVersionFallbackMin) {} - - void set_min_version(uint16_t version) { min_version_ = version; } - - void set_fallback_min_version(uint16_t version) { - fallback_min_version_ = version; - } - - // SSLConfigService: - void GetSSLConfig(SSLConfig* config) override { - *config = SSLConfig(); - config->rev_checking_enabled = online_rev_checking_; - config->verify_ev_cert = ev_enabled_; - config->rev_checking_required_local_anchors = - rev_checking_required_local_anchors_; - if (fallback_min_version_) { - config->version_fallback_min = fallback_min_version_; - } - if (min_version_) { - config->version_min = min_version_; - } - } - - protected: - ~TestSSLConfigService() override {} - - private: - const bool ev_enabled_; - const bool online_rev_checking_; - const bool rev_checking_required_local_anchors_; - uint16_t min_version_; - uint16_t fallback_min_version_; -}; - class FallbackTestURLRequestContext : public TestURLRequestContext { public: explicit FallbackTestURLRequestContext(bool delay_initialization) : TestURLRequestContext(delay_initialization) {} void set_fallback_min_version(uint16_t version) { - TestSSLConfigService *ssl_config_service = - new TestSSLConfigService(true /* check for EV */, - false /* online revocation checking */, - false /* require rev. checking for local - anchors */); + TestSSLConfigService* ssl_config_service = new TestSSLConfigService( + true /* check for EV */, false /* online revocation checking */, + false /* require rev. checking for local + anchors */, + false /* token binding enabled */); ssl_config_service->set_fallback_min_version(version); set_ssl_config_service(ssl_config_service); } @@ -8957,11 +9023,11 @@ // connetions to testserver. This can be overridden in test subclasses for // different behaviour. virtual void SetupContext(URLRequestContext* context) { - context->set_ssl_config_service( - new TestSSLConfigService(true /* check for EV */, - true /* online revocation checking */, - false /* require rev. checking for local - anchors */)); + context->set_ssl_config_service(new TestSSLConfigService( + true /* check for EV */, true /* online revocation checking */, + false /* require rev. checking for local + anchors */, + false /* token binding enabled */)); } scoped_ptr<ScopedTestRoot> test_root_; @@ -9152,11 +9218,11 @@ class HTTPSHardFailTest : public HTTPSOCSPTest { protected: void SetupContext(URLRequestContext* context) override { - context->set_ssl_config_service( - new TestSSLConfigService(false /* check for EV */, - false /* online revocation checking */, - true /* require rev. checking for local - anchors */)); + context->set_ssl_config_service(new TestSSLConfigService( + false /* check for EV */, false /* online revocation checking */, + true /* require rev. checking for local + anchors */, + false /* token binding enabled */)); } }; @@ -9189,11 +9255,11 @@ class HTTPSEVCRLSetTest : public HTTPSOCSPTest { protected: void SetupContext(URLRequestContext* context) override { - context->set_ssl_config_service( - new TestSSLConfigService(true /* check for EV */, - false /* online revocation checking */, - false /* require rev. checking for local - anchors */)); + context->set_ssl_config_service(new TestSSLConfigService( + true /* check for EV */, false /* online revocation checking */, + false /* require rev. checking for local + anchors */, + false /* token binding enabled */)); } }; @@ -9374,11 +9440,11 @@ class HTTPSCRLSetTest : public HTTPSOCSPTest { protected: void SetupContext(URLRequestContext* context) override { - context->set_ssl_config_service( - new TestSSLConfigService(false /* check for EV */, - false /* online revocation checking */, - false /* require rev. checking for local - anchors */)); + context->set_ssl_config_service(new TestSSLConfigService( + false /* check for EV */, false /* online revocation checking */, + false /* require rev. checking for local + anchors */, + false /* token binding enabled */)); } };
diff --git a/net/websockets/websocket_basic_handshake_stream.cc b/net/websockets/websocket_basic_handshake_stream.cc index e26bb99f..aee33673 100644 --- a/net/websockets/websocket_basic_handshake_stream.cc +++ b/net/websockets/websocket_basic_handshake_stream.cc
@@ -444,6 +444,13 @@ return; } +Error WebSocketBasicHandshakeStream::GetSignedEKMForTokenBinding( + crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) { + NOTREACHED(); + return ERR_NOT_IMPLEMENTED; +} + void WebSocketBasicHandshakeStream::Drain(HttpNetworkSession* session) { HttpResponseBodyDrainer* drainer = new HttpResponseBodyDrainer(this); drainer->Start(session);
diff --git a/net/websockets/websocket_basic_handshake_stream.h b/net/websockets/websocket_basic_handshake_stream.h index d84ef22b..d390982 100644 --- a/net/websockets/websocket_basic_handshake_stream.h +++ b/net/websockets/websocket_basic_handshake_stream.h
@@ -64,6 +64,8 @@ void GetSSLInfo(SSLInfo* ssl_info) override; void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override; bool GetRemoteEndpoint(IPEndPoint* endpoint) override; + Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, + std::vector<uint8_t>* out) override; void Drain(HttpNetworkSession* session) override; void SetPriority(RequestPriority priority) override; void PopulateNetErrorDetails(NetErrorDetails* details) override;
diff --git a/remoting/host/desktop_session_agent.cc b/remoting/host/desktop_session_agent.cc index ed788de..538952f 100644 --- a/remoting/host/desktop_session_agent.cc +++ b/remoting/host/desktop_session_agent.cc
@@ -316,9 +316,6 @@ current_size_ = frame->size(); - // Verify that the captured frame was stored in the shared memory buffer. - CHECK(frame->data() == frame->shared_memory()->data()); - // Serialize webrtc::DesktopFrame. SerializedDesktopFrame serialized_frame; serialized_frame.shared_buffer_id = frame->shared_memory()->id();
diff --git a/remoting/host/it2me/it2me_host.cc b/remoting/host/it2me/it2me_host.cc index c7733fe..99f31771 100644 --- a/remoting/host/it2me/it2me_host.cc +++ b/remoting/host/it2me/it2me_host.cc
@@ -243,7 +243,7 @@ network_settings, protocol::TransportRole::SERVER); scoped_ptr<protocol::SessionManager> session_manager( - new protocol::JingleSessionManager(signal_strategy.get())); + new protocol::JingleSessionManager(signal_strategy_.get())); scoped_ptr<protocol::CandidateSessionConfig> protocol_config = protocol::CandidateSessionConfig::CreateDefault();
diff --git a/sandbox/win/src/process_policy_test.cc b/sandbox/win/src/process_policy_test.cc index 47240a05..4dcefd9 100644 --- a/sandbox/win/src/process_policy_test.cc +++ b/sandbox/win/src/process_policy_test.cc
@@ -5,6 +5,7 @@ #include <memory> #include <string> +#include "base/memory/scoped_ptr.h" #include "base/strings/string16.h" #include "base/strings/sys_string_conversions.h" #include "base/win/scoped_handle.h" @@ -18,39 +19,24 @@ namespace { -// While the shell API provides better calls than this home brew function -// we use GetSystemWindowsDirectoryW which does not query the registry so -// it is safe to use after revert. -base::string16 MakeFullPathToSystem32(const wchar_t* name) { - wchar_t windows_path[MAX_PATH] = {0}; - ::GetSystemWindowsDirectoryW(windows_path, MAX_PATH); - base::string16 full_path(windows_path); - if (full_path.empty()) { - return full_path; - } - full_path += L"\\system32\\"; - full_path += name; - return full_path; -} - // Creates a process with the |exe| and |command| parameter using the // unicode and ascii version of the api. sandbox::SboxTestResult CreateProcessHelper(const base::string16& exe, const base::string16& command) { base::win::ScopedProcessInformation pi; STARTUPINFOW si = {sizeof(si)}; - - const wchar_t *exe_name = NULL; + const wchar_t* exe_name = NULL; if (!exe.empty()) exe_name = exe.c_str(); - base::string16 writable_command = command; + scoped_ptr<wchar_t, base::FreeDeleter> writable_command( + _wcsdup(command.c_str())); // Create the process with the unicode version of the API. sandbox::SboxTestResult ret1 = sandbox::SBOX_TEST_FAILED; PROCESS_INFORMATION temp_process_info = {}; if (::CreateProcessW(exe_name, - command.empty() ? NULL : &writable_command[0], + command.empty() ? NULL : writable_command.get(), NULL, NULL, FALSE, @@ -114,7 +100,7 @@ if ((NULL == argv) || (NULL == argv[0])) { return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; } - base::string16 path = MakeFullPathToSystem32(argv[0]); + base::string16 path = MakePathToSys(argv[0], false); // TEST 1: Try with the path in the app_name. return CreateProcessHelper(path, base::string16()); @@ -127,7 +113,7 @@ if ((NULL == argv) || (NULL == argv[0])) { return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; } - base::string16 path = MakeFullPathToSystem32(argv[0]); + base::string16 path = MakePathToSys(argv[0], false); // TEST 2: Try with the path in the cmd_line. base::string16 cmd_line = L"\""; @@ -143,7 +129,6 @@ if ((NULL == argv) || (NULL == argv[0])) { return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; } - // TEST 3: Try file name in the cmd_line. return CreateProcessHelper(base::string16(), argv[0]); } @@ -157,7 +142,7 @@ } // TEST 4: Try file name in the app_name and current directory sets correctly. - base::string16 system32 = MakeFullPathToSystem32(L""); + base::string16 system32 = MakePathToSys(L"", false); wchar_t current_directory[MAX_PATH + 1]; DWORD ret = ::GetCurrentDirectory(MAX_PATH, current_directory); if (!ret) @@ -182,7 +167,7 @@ if ((NULL == argv) || (NULL == argv[0])) { return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; } - base::string16 path = MakeFullPathToSystem32(argv[0]); + base::string16 path = MakePathToSys(argv[0], false); // TEST 5: Try with the path in the cmd_line and arguments. base::string16 cmd_line = L"\""; @@ -213,7 +198,7 @@ if ((NULL == argv) || (NULL == argv[0])) return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; - base::string16 path = MakeFullPathToSystem32(argv[0]); + base::string16 path = MakePathToSys(argv[0], false); STARTUPINFOW si = {sizeof(si)}; @@ -243,6 +228,32 @@ return SBOX_TEST_FAILED; } +// Creates a suspended process using CreateProcessA then kill it. +SBOX_TESTS_COMMAND int Process_CreateProcessA(int argc, wchar_t** argv) { + if (argc != 1) + return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; + + if ((NULL == argv) || (NULL == argv[0])) + return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; + + STARTUPINFOA si = {sizeof(si)}; + + base::string16 path = MakePathToSys(argv[0], false); + + PROCESS_INFORMATION temp_process_info = {}; + // Create suspended to avoid popping calc. + if (!::CreateProcessA(base::SysWideToMultiByte(path, CP_UTF8).c_str(), NULL, + NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, + &temp_process_info)) { + return SBOX_TEST_FAILED; + } + base::win::ScopedProcessInformation pi(temp_process_info); + + if (!::TerminateProcess(pi.process_handle(), 0)) + return SBOX_TEST_FAILED; + + return SBOX_TEST_SUCCEEDED; +} SBOX_TESTS_COMMAND int Process_OpenToken(int argc, wchar_t **argv) { HANDLE token; @@ -281,17 +292,23 @@ TEST(ProcessPolicyTest, CreateProcessAW) { TestRunner runner; - base::string16 exe_path = MakeFullPathToSystem32(L"findstr.exe"); - base::string16 system32 = MakeFullPathToSystem32(L""); - ASSERT_TRUE(!exe_path.empty()); + base::string16 maybe_virtual_exe_path = MakePathToSys(L"findstr.exe", false); + base::string16 non_virtual_exe_path = MakePathToSys32(L"findstr.exe", false); + ASSERT_TRUE(!maybe_virtual_exe_path.empty()); + EXPECT_TRUE(runner.AddRule(TargetPolicy::SUBSYS_PROCESS, TargetPolicy::PROCESS_MIN_EXEC, - exe_path.c_str())); + maybe_virtual_exe_path.c_str())); + + if (non_virtual_exe_path != maybe_virtual_exe_path) { + EXPECT_TRUE(runner.AddRule(TargetPolicy::SUBSYS_PROCESS, + TargetPolicy::PROCESS_MIN_EXEC, + non_virtual_exe_path.c_str())); + } // Need to add directory rules for the directories that we use in // SetCurrentDirectory. - EXPECT_TRUE(runner.AddFsRule(TargetPolicy::FILES_ALLOW_DIR_ANY, - system32.c_str())); + EXPECT_TRUE(runner.AddRuleSys32(TargetPolicy::FILES_ALLOW_DIR_ANY, L"")); wchar_t current_directory[MAX_PATH]; DWORD ret = ::GetCurrentDirectory(MAX_PATH, current_directory); @@ -304,6 +321,7 @@ EXPECT_EQ(SBOX_TEST_DENIED, runner.RunTest(L"Process_RunApp1 calc.exe")); EXPECT_EQ(SBOX_TEST_DENIED, runner.RunTest(L"Process_RunApp2 calc.exe")); EXPECT_EQ(SBOX_TEST_DENIED, runner.RunTest(L"Process_RunApp3 calc.exe")); + EXPECT_EQ(SBOX_TEST_DENIED, runner.RunTest(L"Process_RunApp4 calc.exe")); EXPECT_EQ(SBOX_TEST_DENIED, runner.RunTest(L"Process_RunApp5 calc.exe")); EXPECT_EQ(SBOX_TEST_DENIED, runner.RunTest(L"Process_RunApp6 calc.exe")); @@ -314,21 +332,11 @@ EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"Process_RunApp3 findstr.exe")); EXPECT_EQ(SBOX_TEST_SUCCEEDED, + runner.RunTest(L"Process_RunApp4 findstr.exe")); + EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"Process_RunApp5 findstr.exe")); EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"Process_RunApp6 findstr.exe")); - -#if !defined(_WIN64) - if (base::win::OSInfo::GetInstance()->version() >= base::win::VERSION_VISTA && - base::win::OSInfo::GetInstance()->architecture() != - base::win::OSInfo::X86_ARCHITECTURE) { // http://crbug.com/580800 - // WinXP results are not reliable. - EXPECT_EQ(SBOX_TEST_SECOND_ERROR, - runner.RunTest(L"Process_RunApp4 calc.exe")); - EXPECT_EQ(SBOX_TEST_SECOND_ERROR, - runner.RunTest(L"Process_RunApp4 findstr.exe")); - } -#endif } TEST(ProcessPolicyTest, OpenToken) { @@ -338,7 +346,7 @@ TEST(ProcessPolicyTest, TestGetProcessTokenMinAccess) { TestRunner runner; - base::string16 exe_path = MakeFullPathToSystem32(L"findstr.exe"); + base::string16 exe_path = MakePathToSys(L"findstr.exe", false); ASSERT_TRUE(!exe_path.empty()); EXPECT_TRUE(runner.AddRule(TargetPolicy::SUBSYS_PROCESS, TargetPolicy::PROCESS_MIN_EXEC, @@ -350,7 +358,7 @@ TEST(ProcessPolicyTest, TestGetProcessTokenMaxAccess) { TestRunner runner(JOB_UNPROTECTED, USER_INTERACTIVE, USER_INTERACTIVE); - base::string16 exe_path = MakeFullPathToSystem32(L"findstr.exe"); + base::string16 exe_path = MakePathToSys(L"findstr.exe", false); ASSERT_TRUE(!exe_path.empty()); EXPECT_TRUE(runner.AddRule(TargetPolicy::SUBSYS_PROCESS, TargetPolicy::PROCESS_ALL_EXEC, @@ -362,7 +370,7 @@ TEST(ProcessPolicyTest, TestGetProcessTokenMinAccessNoJob) { TestRunner runner(JOB_NONE, USER_RESTRICTED_SAME_ACCESS, USER_LOCKDOWN); - base::string16 exe_path = MakeFullPathToSystem32(L"findstr.exe"); + base::string16 exe_path = MakePathToSys(L"findstr.exe", false); ASSERT_TRUE(!exe_path.empty()); EXPECT_TRUE(runner.AddRule(TargetPolicy::SUBSYS_PROCESS, TargetPolicy::PROCESS_MIN_EXEC, @@ -374,7 +382,7 @@ TEST(ProcessPolicyTest, TestGetProcessTokenMaxAccessNoJob) { TestRunner runner(JOB_NONE, USER_INTERACTIVE, USER_INTERACTIVE); - base::string16 exe_path = MakeFullPathToSystem32(L"findstr.exe"); + base::string16 exe_path = MakePathToSys(L"findstr.exe", false); ASSERT_TRUE(!exe_path.empty()); EXPECT_TRUE(runner.AddRule(TargetPolicy::SUBSYS_PROCESS, TargetPolicy::PROCESS_ALL_EXEC, @@ -384,4 +392,18 @@ runner.RunTest(L"Process_GetChildProcessToken findstr.exe")); } +TEST(ProcessPolicyTest, TestCreateProcessA) { + TestRunner runner; + sandbox::TargetPolicy* policy = runner.GetPolicy(); + policy->SetJobLevel(JOB_NONE, 0); + policy->SetTokenLevel(USER_UNPROTECTED, USER_UNPROTECTED); + + base::string16 exe_path = MakePathToSys(L"calc.exe", false); + ASSERT_TRUE(!exe_path.empty()); + EXPECT_TRUE(runner.AddRule(TargetPolicy::SUBSYS_PROCESS, + TargetPolicy::PROCESS_ALL_EXEC, exe_path.c_str())); + EXPECT_EQ(SBOX_TEST_SUCCEEDED, + runner.RunTest(L"Process_CreateProcessA calc.exe")); +} + } // namespace sandbox
diff --git a/sandbox/win/src/process_thread_interception.cc b/sandbox/win/src/process_thread_interception.cc index bbf753ea..f8a144f 100644 --- a/sandbox/win/src/process_thread_interception.cc +++ b/sandbox/win/src/process_thread_interception.cc
@@ -331,7 +331,8 @@ LPVOID environment, LPCSTR current_directory, LPSTARTUPINFOA startup_info, LPPROCESS_INFORMATION process_information) { - if (orig_CreateProcessA(application_name, command_line, process_attributes, + if (SandboxFactory::GetTargetServices()->GetState()->IsCsrssConnected() && + orig_CreateProcessA(application_name, command_line, process_attributes, thread_attributes, inherit_handles, flags, environment, current_directory, startup_info, process_information)) {
diff --git a/sandbox/win/tests/common/controller.cc b/sandbox/win/tests/common/controller.cc index 8d3e29dd..9096d1bd 100644 --- a/sandbox/win/tests/common/controller.cc +++ b/sandbox/win/tests/common/controller.cc
@@ -18,6 +18,17 @@ static const int kDefaultTimeout = 60000; +bool IsProcessRunning(HANDLE process) { + DWORD exit_code = 0; + if (::GetExitCodeProcess(process, &exit_code)) + return exit_code == STILL_ACTIVE; + return false; +} + +} // namespace + +namespace sandbox { + // Constructs a full path to a file inside the system32 folder. base::string16 MakePathToSys32(const wchar_t* name, bool is_obj_man_path) { wchar_t windows_path[MAX_PATH] = {0}; @@ -54,17 +65,6 @@ return full_path; } -bool IsProcessRunning(HANDLE process) { - DWORD exit_code = 0; - if (::GetExitCodeProcess(process, &exit_code)) - return exit_code == STILL_ACTIVE; - return false; -} - -} // namespace - -namespace sandbox { - base::string16 MakePathToSys(const wchar_t* name, bool is_obj_man_path) { return (base::win::OSInfo::GetInstance()->wow64_status() == base::win::OSInfo::WOW64_ENABLED) ?
diff --git a/sandbox/win/tests/common/controller.h b/sandbox/win/tests/common/controller.h index a6498ed1..0145255 100644 --- a/sandbox/win/tests/common/controller.h +++ b/sandbox/win/tests/common/controller.h
@@ -148,7 +148,14 @@ // Returns the broker services. BrokerServices* GetBroker(); -// Constructs a full path to a file inside the system32 (or syswow64) folder. +// Constructs a full path to a file inside the system32 folder. +base::string16 MakePathToSys32(const wchar_t* name, bool is_obj_man_path); + +// Constructs a full path to a file inside the syswow64 folder. +base::string16 MakePathToSysWow64(const wchar_t* name, bool is_obj_man_path); + +// Constructs a full path to a file inside the system32 (or syswow64) folder +// depending on whether process is running in wow64 or not. base::string16 MakePathToSys(const wchar_t* name, bool is_obj_man_path); // Runs the given test on the target process.
diff --git a/storage/browser/fileapi/recursive_operation_delegate.cc b/storage/browser/fileapi/recursive_operation_delegate.cc index a1e13fea..415953c6 100644 --- a/storage/browser/fileapi/recursive_operation_delegate.cc +++ b/storage/browser/fileapi/recursive_operation_delegate.cc
@@ -14,15 +14,9 @@ namespace storage { -namespace { -// Don't start too many inflight operations. -const int kMaxInflightOperations = 5; -} - RecursiveOperationDelegate::RecursiveOperationDelegate( FileSystemContext* file_system_context) : file_system_context_(file_system_context), - inflight_operations_(0), canceled_(false), error_behavior_(FileSystemOperation::ERROR_BEHAVIOR_ABORT), failed_some_operations_(false) { @@ -42,7 +36,6 @@ const StatusCallback& callback) { DCHECK(pending_directory_stack_.empty()); DCHECK(pending_files_.empty()); - DCHECK_EQ(0, inflight_operations_); error_behavior_ = error_behavior; callback_ = callback; @@ -51,7 +44,6 @@ } void RecursiveOperationDelegate::TryProcessFile(const FileSystemURL& root) { - ++inflight_operations_; ProcessFile(root, base::Bind(&RecursiveOperationDelegate::DidTryProcessFile, AsWeakPtr(), root)); } @@ -68,9 +60,7 @@ base::File::Error error) { DCHECK(pending_directory_stack_.empty()); DCHECK(pending_files_.empty()); - DCHECK_EQ(1, inflight_operations_); - --inflight_operations_; if (canceled_ || error != base::File::FILE_ERROR_NOT_A_FILE) { Done(error); return; @@ -85,11 +75,9 @@ DCHECK(pending_files_.empty()); DCHECK(!pending_directory_stack_.empty()); DCHECK(!pending_directory_stack_.top().empty()); - DCHECK_EQ(0, inflight_operations_); const FileSystemURL& url = pending_directory_stack_.top().front(); - ++inflight_operations_; ProcessDirectory( url, base::Bind( @@ -101,9 +89,7 @@ DCHECK(pending_files_.empty()); DCHECK(!pending_directory_stack_.empty()); DCHECK(!pending_directory_stack_.top().empty()); - DCHECK_EQ(1, inflight_operations_); - --inflight_operations_; if (canceled_ || error != base::File::FILE_OK) { Done(error); return; @@ -123,7 +109,6 @@ const FileEntryList& entries, bool has_more) { DCHECK(!pending_directory_stack_.empty()); - DCHECK_EQ(0, inflight_operations_); if (canceled_ || error != base::File::FILE_OK) { Done(error); @@ -151,7 +136,7 @@ void RecursiveOperationDelegate::ProcessPendingFiles() { DCHECK(!pending_directory_stack_.empty()); - if ((pending_files_.empty() || canceled_) && inflight_operations_ == 0) { + if (pending_files_.empty() || canceled_) { ProcessSubDirectory(); return; } @@ -160,12 +145,10 @@ if (canceled_) return; - // Run ProcessFile in parallel (upto kMaxInflightOperations). + // Run ProcessFile. scoped_refptr<base::SingleThreadTaskRunner> current_task_runner = base::ThreadTaskRunnerHandle::Get(); - while (!pending_files_.empty() && - inflight_operations_ < kMaxInflightOperations) { - ++inflight_operations_; + if (!pending_files_.empty()) { current_task_runner->PostTask( FROM_HERE, base::Bind(&RecursiveOperationDelegate::ProcessFile, AsWeakPtr(), @@ -178,8 +161,6 @@ void RecursiveOperationDelegate::DidProcessFile(const FileSystemURL& url, base::File::Error error) { - --inflight_operations_; - if (error != base::File::FILE_OK) { if (error_behavior_ == FileSystemOperation::ERROR_BEHAVIOR_ABORT) { // If an error occurs, invoke Done immediately (even if there remain @@ -198,7 +179,6 @@ void RecursiveOperationDelegate::ProcessSubDirectory() { DCHECK(pending_files_.empty()); DCHECK(!pending_directory_stack_.empty()); - DCHECK_EQ(0, inflight_operations_); if (canceled_) { Done(base::File::FILE_ERROR_ABORT); @@ -220,7 +200,6 @@ } DCHECK(!pending_directory_stack_.top().empty()); - ++inflight_operations_; PostProcessDirectory( pending_directory_stack_.top().front(), base::Bind(&RecursiveOperationDelegate::DidPostProcessDirectory, @@ -232,9 +211,7 @@ DCHECK(pending_files_.empty()); DCHECK(!pending_directory_stack_.empty()); DCHECK(!pending_directory_stack_.top().empty()); - DCHECK_EQ(1, inflight_operations_); - --inflight_operations_; pending_directory_stack_.top().pop(); if (canceled_ || error != base::File::FILE_OK) { Done(error);
diff --git a/storage/browser/fileapi/recursive_operation_delegate.h b/storage/browser/fileapi/recursive_operation_delegate.h index 0a3efbf..dc4362e 100644 --- a/storage/browser/fileapi/recursive_operation_delegate.h +++ b/storage/browser/fileapi/recursive_operation_delegate.h
@@ -74,7 +74,7 @@ // ProcessDirectory is called first for the directory. // Then the directory contents are read (to obtain its sub directories and // files in it). - // ProcessFile is called for found files. This may run in parallel. + // ProcessFile is called for found files. // The same step is recursively applied to each subdirectory. // After all files and subdirectories in a directory are processed, // PostProcessDirectory is called for the directory. @@ -91,11 +91,13 @@ // Then traverse order is: // ProcessFile(a_dir) (This should return File::FILE_NOT_A_FILE). // ProcessDirectory(a_dir). - // ProcessFile(b3_file), ProcessFile(b4_file). (in parallel). + // ProcessFile(b3_file). + // ProcessFile(b4_file). // ProcessDirectory(b1_dir). // ProcessFile(c2_file) // ProcessDirectory(c1_dir). - // ProcessFile(d1_file), ProcessFile(d2_file). (in parallel). + // ProcessFile(d1_file). + // ProcessFile(d2_file). // PostProcessDirectory(c1_dir) // PostProcessDirectory(b1_dir). // ProcessDirectory(b2_dir) @@ -146,7 +148,6 @@ std::stack<FileSystemURL> pending_directories_; std::stack<std::queue<FileSystemURL> > pending_directory_stack_; std::queue<FileSystemURL> pending_files_; - int inflight_operations_; bool canceled_; ErrorBehavior error_behavior_; bool failed_some_operations_;
diff --git a/testing/buildbot/chromium.webkit.json b/testing/buildbot/chromium.webkit.json index 9a1efa6b..0df6ae5 100644 --- a/testing/buildbot/chromium.webkit.json +++ b/testing/buildbot/chromium.webkit.json
@@ -1881,43 +1881,5 @@ "script": "webkit_python_tests.py" } ] - }, - "WebKit XP": { - "gtest_tests": [ - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "blink_heap_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "blink_platform_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "webkit_unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "wtf_unittests" - } - ], - "scripts": [ - { - "name": "webkit_lint", - "script": "webkit_lint.py" - }, - { - "name": "webkit_python_tests", - "script": "webkit_python_tests.py" - } - ] } }
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json index a045f83a..e692963 100644 --- a/testing/buildbot/chromium.win.json +++ b/testing/buildbot/chromium.win.json
@@ -1,329 +1,4 @@ { - "Vista Tests (1)": { - "gtest_tests": [ - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "accessibility_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "app_shell_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "aura_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "base_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true, - "shards": 10 - }, - "test": "browser_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "cacheinvalidation_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "cast_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "cc_unittests" - }, - { - "test": "chrome_elf_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "chromedriver_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "components_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "compositor_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "content_browsertests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "content_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "courgette_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "crypto_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "events_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "extensions_browsertests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "extensions_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "gcm_unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "gfx_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "google_apis_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "gpu_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "installer_util_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true, - "shards": 2 - }, - "test": "interactive_ui_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "ipc_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "jingle_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "media_blink_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "media_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "midi_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "mojo_common_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "mojo_public_bindings_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "mojo_public_environment_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "mojo_public_system_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "mojo_public_utility_unittests" - }, - { - "test": "mojo_system_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "nacl_loader_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "net_unittests" - }, - { - "test": "ppapi_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "printing_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "remoting_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sbox_integration_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sbox_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sbox_validation_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "setup_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "skia_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sql_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sync_integration_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sync_unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "ui_base_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "ui_touch_selection_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "url_unittests" - }, - { - "test": "views_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "wm_unittests" - } - ], - "scripts": [] - }, "Win 7 Tests x64 (1)": { "gtest_tests": [ { @@ -1738,323 +1413,5 @@ "views_unittests", "wm_unittests" ] - }, - "XP Tests (1)": { - "gtest_tests": [ - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "accessibility_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "app_shell_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "aura_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "base_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true, - "shards": 10 - }, - "test": "browser_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "cacheinvalidation_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "cast_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "cc_unittests" - }, - { - "test": "chrome_elf_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "chromedriver_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "components_browsertests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "components_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "compositor_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "content_browsertests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "content_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "courgette_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "crypto_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "events_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "extensions_browsertests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "extensions_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "gcm_unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "gfx_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "google_apis_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "gpu_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "installer_util_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true, - "shards": 2 - }, - "test": "interactive_ui_tests" - }, - { - "test": "ipc_mojo_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "ipc_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "jingle_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "media_blink_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "media_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "midi_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "nacl_loader_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "net_unittests" - }, - { - "test": "ppapi_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "printing_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "remoting_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sbox_integration_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sbox_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sbox_validation_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "setup_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "skia_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sql_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sync_integration_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sync_unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "ui_base_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "ui_touch_selection_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "url_unittests" - }, - { - "test": "views_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "wm_unittests" - } - ], - "isolated_scripts": [ - { - "isolate_name": "telemetry_gpu_unittests", - "name": "telemetry_gpu_unittests", - "override_compile_targets": [ - "telemetry_gpu_unittests_run" - ], - "swarming": { - "can_use_on_swarming_builders": true - } - } - ], - "scripts": [ - { - "name": "nacl_integration", - "script": "nacl_integration.py" - } - ] } }
diff --git a/testing/chromoting/app_remoting_integration_tests.isolate b/testing/chromoting/app_remoting_integration_tests.isolate deleted file mode 100644 index aa079ee4..0000000 --- a/testing/chromoting/app_remoting_integration_tests.isolate +++ /dev/null
@@ -1,38 +0,0 @@ -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -{ - 'conditions': [ - ['OS=="linux"', { - 'variables': { - 'command': [ - '../xvfb.py', - '<(PRODUCT_DIR)', - '<(PRODUCT_DIR)/ar_test_driver', - '--username=appremotingtestdriver_chromium_01@lgtestuser.com', - '--refresh-token-file=../../remoting/tools/internal/refresh_tokens.json', - '--show-host-availability', - '--release-hosts-after-tests', - '--verbosity=2', - '--v=2', - ], - 'files': [ - '../xvfb.py', - '../test_env.py', - '<(PRODUCT_DIR)/ar_test_driver', - '../../remoting/tools/internal/refresh_tokens.json', - ], - }, - }], - ['OS=="linux" and use_ozone==0', { - 'variables': { - 'files': [ - '<(PRODUCT_DIR)/xdisplaycheck<(EXECUTABLE_SUFFIX)', - ], - }, - }], - ], - 'includes': [ - '../../base/base.isolate', - ], -}
diff --git a/testing/chromoting/dependencies.gypi b/testing/chromoting/dependencies.gypi index 7a0b9b2..e0180b8 100644 --- a/testing/chromoting/dependencies.gypi +++ b/testing/chromoting/dependencies.gypi
@@ -18,7 +18,6 @@ 'dependencies': [ '../../remoting/remoting.gyp:chromoting_test_driver', '../../remoting/remoting.gyp:remoting_me2me_host_archive', - '../../remoting/internal/app_remoting_all.gyp:ar_test_driver', ], }], # OS=="linux" ],
diff --git a/testing/chromoting/integration_tests.gyp b/testing/chromoting/integration_tests.gyp index 38d4609..3a9ad53 100644 --- a/testing/chromoting/integration_tests.gyp +++ b/testing/chromoting/integration_tests.gyp
@@ -13,15 +13,6 @@ ['OS=="linux"', { 'targets': [ { - 'target_name': 'app_remoting_integration_tests_run', - 'includes': [ - './dependencies.gypi', - ], - 'sources': [ - 'app_remoting_integration_tests.isolate', - ], - }, # target_name: 'app_remoting_integration_tests_run' - { 'target_name': 'chromoting_integration_tests_run', 'includes': [ './dependencies.gypi',
diff --git a/testing/libfuzzer/drfuzz_main.cc b/testing/libfuzzer/drfuzz_main.cc index c8aab47..5a8ba4c3 100644 --- a/testing/libfuzzer/drfuzz_main.cc +++ b/testing/libfuzzer/drfuzz_main.cc
@@ -9,7 +9,7 @@ // Provide main for running fuzzer tests with Dr. Fuzz. int main(int argc, char **argv) { - static const size_t kFuzzInputMaxSize = 1024; + static const size_t kFuzzInputMaxSize = 8; unsigned char* fuzz_input = new unsigned char[kFuzzInputMaxSize](); // The buffer and size arguments can be changed by Dr. Fuzz. int result = LLVMFuzzerTestOneInput(fuzz_input, kFuzzInputMaxSize);
diff --git a/testing/libfuzzer/fuzzers/BUILD.gn b/testing/libfuzzer/fuzzers/BUILD.gn index 94680fe..7da4ea7 100644 --- a/testing/libfuzzer/fuzzers/BUILD.gn +++ b/testing/libfuzzer/fuzzers/BUILD.gn
@@ -282,13 +282,16 @@ ] } -fuzzer_test("libexif_parser_fuzzer") { - sources = [ - "libexif_parser_fuzzer.cc", - ] - deps = [ - "//third_party/libexif:libexif_fuzzers", - ] +if (is_linux) { + # libexif_fuzzer is linux only atm + fuzzer_test("libexif_parser_fuzzer") { + sources = [ + "libexif_parser_fuzzer.cc", + ] + deps = [ + "//third_party/libexif:libexif_fuzzers", + ] + } } fuzzer_test("libpng_read_fuzzer") { @@ -300,3 +303,12 @@ "//third_party/libpng", ] } + +fuzzer_test("icu_uregex_open_fuzzer") { + sources = [ + "icu_uregex_open_fuzzer.cc", + ] + deps = [ + "//third_party/icu", + ] +}
diff --git a/testing/libfuzzer/fuzzers/icu_uregex_open_fuzzer.cc b/testing/libfuzzer/fuzzers/icu_uregex_open_fuzzer.cc new file mode 100644 index 0000000..0d9d051 --- /dev/null +++ b/testing/libfuzzer/fuzzers/icu_uregex_open_fuzzer.cc
@@ -0,0 +1,20 @@ +// Copyright (c) 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <stdint.h> + +#include "third_party/icu/source/i18n/unicode/regex.h" + +// Entry point for LibFuzzer. +extern "C" int LLVMFuzzerTestOneInput(const unsigned char* data, size_t size) { + UParseError pe = { 0 }; + UErrorCode status = U_ZERO_ERROR; + URegularExpression* re = uregex_open(reinterpret_cast<const UChar*>(data), + size / sizeof(UChar), + 0, &pe, &status); + if (re) + uregex_close(re); + + return 0; +}
diff --git a/testing/libfuzzer/fuzzers/zlib_uncompress_fuzzer.cc b/testing/libfuzzer/fuzzers/zlib_uncompress_fuzzer.cc index 952fe24..ccf3571 100644 --- a/testing/libfuzzer/fuzzers/zlib_uncompress_fuzzer.cc +++ b/testing/libfuzzer/fuzzers/zlib_uncompress_fuzzer.cc
@@ -3,16 +3,22 @@ // found in the LICENSE file. #include <stdint.h> +#include <string.h> #include "third_party/zlib/zlib.h" // Entry point for LibFuzzer. extern "C" int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size) { - uint8_t buffer[1024 * 1024] = { 0 }; - size_t buffer_length = sizeof(buffer); - if (Z_OK != uncompress(buffer, &buffer_length, data, size)) { - return 0; - } + const int NUM_ITEMS = 1024 * 1024; + const int BUF_SIZE = NUM_ITEMS * sizeof(uint8_t); + uint8_t *buffer = new uint8_t[NUM_ITEMS]; + uLongf buffer_length = (uLongf)BUF_SIZE; + memset(buffer, 0, BUF_SIZE); - return 0; + if (Z_OK != uncompress(buffer, &buffer_length, data, size)) { + delete[] buffer; + return 0; + } + delete[] buffer; + return 0; }
diff --git a/third_party/WebKit/LayoutTests/LeakExpectations b/third_party/WebKit/LayoutTests/LeakExpectations index 5d1126cd..3127c73 100644 --- a/third_party/WebKit/LayoutTests/LeakExpectations +++ b/third_party/WebKit/LayoutTests/LeakExpectations
@@ -151,3 +151,8 @@ crbug.com/578297 [ Linux ] media/video-autoplay-experiment-modes.html [ Slow ] crbug.com/578297 [ Linux ] virtual/threaded/printing/webgl-oversized-printing.html [ Slow ] crbug.com/578297 [ Linux ] http/tests/media/media-source/mediasource-appendstream-quota-exceeded.html [ Slow ] + +# ----------------------------------------------------------------- +# Temmporary leaks that must be fixed in a reasonable timeline. +# ----------------------------------------------------------------- +crbug.com/581210 editing/execCommand/outdent-collapse-table-crash.html [ Leak ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index db7d8f3c9..bba2a07 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -29,17 +29,17 @@ crbug.com/420008 inspector/tracing/worker-js-frames.html [ Pass Timeout Failure ] crbug.com/572723 inspector/sources/debugger/debugger-autocontinue-on-syntax-error.html [ Pass Failure ] -crbug.com/569901 crbug.com/24182 [ Debug ] jquery/manipulation.html [ Timeout Pass ] -crbug.com/569901 [ Debug ] imported/web-platform-tests/html/syntax/parsing/html5lib_tests16.html [ Timeout ] -crbug.com/569901 [ Debug ] fast/dom/minor-dom-gc.html [ Timeout ] -crbug.com/569901 [ Debug ] imported/web-platform-tests/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-object-auto.html [ Timeout ] -crbug.com/569901 [ Debug ] imported/web-platform-tests/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-iframe-percentage.html [ Timeout ] -crbug.com/569901 [ Debug ] virtual/pointerevent/fast/events/touch/gesture/pad-gesture-fling.html [ Timeout ] -crbug.com/569901 [ Debug ] imported/web-platform-tests/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-object-fixed.html [ Timeout ] -crbug.com/569901 [ Debug ] imported/web-platform-tests/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-iframe-auto.html [ Timeout ] -crbug.com/569901 [ Debug ] imported/web-platform-tests/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-object-percentage.html [ Timeout ] -crbug.com/569901 [ Debug ] imported/web-platform-tests/html/syntax/parsing/html5lib_template.html [ Timeout ] -crbug.com/569901 [ Debug ] imported/web-platform-tests/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-iframe-fixed.html [ Timeout ] +crbug.com/569901 crbug.com/24182 [ Debug ] jquery/manipulation.html [ Timeout Failure Pass ] +crbug.com/569901 [ Debug ] imported/web-platform-tests/html/syntax/parsing/html5lib_tests16.html [ Timeout Failure ] +crbug.com/569901 [ Debug ] fast/dom/minor-dom-gc.html [ Timeout Failure ] +crbug.com/569901 [ Debug ] imported/web-platform-tests/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-object-auto.html [ Timeout Failure ] +crbug.com/569901 [ Debug ] imported/web-platform-tests/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-iframe-percentage.html [ Timeout Failure ] +crbug.com/569901 [ Debug ] virtual/pointerevent/fast/events/touch/gesture/pad-gesture-fling.html [ Timeout Failure ] +crbug.com/569901 [ Debug ] imported/web-platform-tests/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-object-fixed.html [ Timeout Failure ] +crbug.com/569901 [ Debug ] imported/web-platform-tests/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-iframe-auto.html [ Timeout Failure ] +crbug.com/569901 [ Debug ] imported/web-platform-tests/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-object-percentage.html [ Timeout Failure ] +crbug.com/569901 [ Debug ] imported/web-platform-tests/html/syntax/parsing/html5lib_template.html [ Timeout Failure ] +crbug.com/569901 [ Debug ] imported/web-platform-tests/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-iframe-fixed.html [ Timeout Failure ] # ====== Oilpan-only failures until here ====== @@ -55,15 +55,15 @@ crbug.com/563265 editing/spelling/spellcheck-editable-on-focus-sync.html [ Skip ] crbug.com/563265 editing/spelling/spelling-unified-emulation.html [ Skip ] -crbug.com/231612 fast/parser/changing-attrbutes-crash.html [ NeedsRebaseline ] -crbug.com/231612 svg/custom/viewbox-syntax.svg [ NeedsRebaseline ] -crbug.com/231612 svg/custom/poly-parsing-error.html [ NeedsRebaseline ] -crbug.com/231612 svg/custom/polyline-invalid-points.svg [ NeedsRebaseline ] -crbug.com/231612 svg/custom/polyline-setattribute-points-null.svg [ NeedsRebaseline ] -crbug.com/231612 svg/custom/use-property-synchronization-crash.svg [ NeedsRebaseline ] -crbug.com/231612 svg/dom/points-parser.html [ NeedsRebaseline ] -crbug.com/231612 svg/hixie/error/010.xml [ NeedsRebaseline ] -crbug.com/231612 svg/hixie/error/011.xml [ NeedsRebaseline ] +crbug.com/231612 [ XP ] fast/parser/changing-attrbutes-crash.html [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/custom/viewbox-syntax.svg [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/custom/poly-parsing-error.html [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/custom/polyline-invalid-points.svg [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/custom/polyline-setattribute-points-null.svg [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/custom/use-property-synchronization-crash.svg [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/dom/points-parser.html [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/hixie/error/010.xml [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/hixie/error/011.xml [ NeedsRebaseline ] # TODO(wangxianzhu): Triage the failures crbug.com/524134 virtual/spv2/paint/invalidation/invalidate-after-composited-scroll.html [ Failure ] @@ -131,7 +131,8 @@ crbug.com/463358 [ Mac Linux Debug ] css3/masking/clip-path-polygon-nonzero.html [ Failure ] crbug.com/463358 [ Mac Linux ] fast/transforms/transformed-caret.html [ Pass Failure ] crbug.com/463358 [ Mac Linux Debug ] fast/backgrounds/transformed-body-background.html [ Failure ] -crbug.com/463358 [ Mac Linux Debug ] svg/W3C-SVG-1.1/paths-data-02-t.svg [ Failure ] +# TODO(fmalita): Re-enable after https://codereview.chromium.org/1623073003/ +# crbug.com/463358 [ Mac Linux Debug ] svg/W3C-SVG-1.1/paths-data-02-t.svg [ Failure ] crbug.com/463358 [ Mac Linux Debug ] css3/masking/clip-path-polygon.html [ Failure ] crbug.com/267206 [ Mac ] virtual/rootlayerscrolls/fast/scrolling/scrollbar-tickmarks-hittest.html [ Timeout ] @@ -146,7 +147,7 @@ crbug.com/563650 inspector/elements/css-rule-hover-highlights-selectors.html [ Pass Failure ] -crbug.com/568345 paint/invalidation/invalidate-box-shadow-currentColor.html [ NeedsRebaseline ] +crbug.com/568345 [ XP ] paint/invalidation/invalidate-box-shadow-currentColor.html [ NeedsRebaseline ] crbug.com/522641 inspector/elements/styles-4/styles-update-links.html [ Pass Timeout ] crbug.com/522645 [ Linux ] virtual/android/fullscreen/video-fixed-background.html [ Failure Pass ] @@ -193,6 +194,23 @@ crbug.com/339597 http/tests/navigation/back-to-redirect-with-frame.php [ Pass Timeout ] crbug.com/473718 http/tests/navigation/beacon-cross-origin-redirect.html [ Failure Pass ] +crbug.com/231612 [ XP ] css3/filters/effect-reference-composite-hw.html [ NeedsRebaseline ] +crbug.com/231612 [ XP ] css3/filters/effect-reference-composite.html [ NeedsRebaseline ] +crbug.com/231612 [ XP ] fast/svg/whitespace-length.html [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/css/parse-length.html [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/custom/disallow-non-lengths-in-attrs.html [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/custom/invalid-length-units.html [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/custom/invalid-lengthlist.svg [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/custom/svg-length-rem-crash.html [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/custom/svg-parse-overflow-1.html [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/custom/svg-parse-overflow-2.html [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/custom/svg-parse-overflow-3.html [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/custom/svg-parse-overflow-4.html [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/custom/svg-parse-overflow-5.html [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/hixie/error/001.xml [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/parser/whitespace-length-invalid-1.html [ NeedsRebaseline ] +crbug.com/231612 [ XP ] svg/parser/whitespace-length-invalid-2.html [ NeedsRebaseline ] + crbug.com/410974 fast/scroll-behavior/scroll-customization/scrollstate-basic.html [ Pass Failure ] crbug.com/410974 fast/scroll-behavior/scroll-customization/scrollstate-consume-deltas.html [ Pass Failure ] crbug.com/410974 fast/scroll-behavior/scroll-customization/scrollstate-consume-deltas-throw.html [ Pass Failure ] @@ -205,7 +223,7 @@ crbug.com/410974 virtual/threaded/fast/scroll-behavior/scroll-customization/scrollstate-distribute-to-scroll-chain-descendant.html [ Pass Failure ] crbug.com/410974 virtual/threaded/fast/scroll-behavior/scroll-customization/touch-scroll-customization.html [ Pass Failure ] -crbug.com/580442 fast/js/mozilla/strict/15.4.5.1.html [ NeedsRebaseline ] +crbug.com/580442 [ XP ] fast/js/mozilla/strict/15.4.5.1.html [ NeedsRebaseline ] crbug.com/518972 [ Linux XP ] http/tests/navigation/navigation-redirect-schedule-crash.html [ Failure Pass ] crbug.com/381730 http/tests/navigation/pending-location-change-assert.html [ Failure Pass ] crbug.com/518974 http/tests/navigatorconnect/postmessage.html [ Failure Pass Timeout ] @@ -300,18 +318,15 @@ crbug.com/569139 fast/js/string-replace-2.html [ NeedsManualRebaseline ] crbug.com/569139 fast/js/regexp-caching.html [ NeedsManualRebaseline ] -crbug.com/576589 editing/selection/select-across-readonly-input-3.html [ NeedsRebaseline ] -crbug.com/576589 fast/forms/search/search-vertical-alignment.html [ NeedsRebaseline ] -crbug.com/576589 fast/forms/text/textfield-overflow-by-value-update.html [ NeedsRebaseline ] -crbug.com/576589 fast/forms/text/textfield-overflow.html [ NeedsRebaseline ] -crbug.com/576589 fast/repaint/change-text-content-and-background-color.html [ NeedsRebaseline ] -crbug.com/576589 fast/repaint/multi-layout-one-frame.html [ NeedsRebaseline ] -crbug.com/576589 fast/repaint/subtree-root-skipped.html [ NeedsRebaseline ] -crbug.com/576589 fast/text/international/mixed-directionality-selection.html [ NeedsRebaseline ] -crbug.com/576589 [ Mac10.10 ] tables/mozilla/bugs/bug46368-1.html [ NeedsRebaseline ] -crbug.com/576589 [ Mac10.10 ] tables/mozilla/bugs/bug46368-2.html [ NeedsRebaseline ] -crbug.com/576589 [ Mac10.10 ] tables/mozilla/dom/tableDom.html [ NeedsRebaseline ] -crbug.com/579381 fast/forms/text/input-placeholder-paint-order.html [ NeedsRebaseline ] +crbug.com/576589 [ XP ] editing/selection/select-across-readonly-input-3.html [ NeedsRebaseline ] +crbug.com/576589 [ XP ] fast/forms/search/search-vertical-alignment.html [ NeedsRebaseline ] +crbug.com/576589 [ XP ] fast/forms/text/textfield-overflow-by-value-update.html [ NeedsRebaseline ] +crbug.com/576589 [ XP ] fast/forms/text/textfield-overflow.html [ NeedsRebaseline ] +crbug.com/576589 [ XP ] fast/repaint/change-text-content-and-background-color.html [ NeedsRebaseline ] +crbug.com/576589 [ XP ] fast/repaint/multi-layout-one-frame.html [ NeedsRebaseline ] +crbug.com/576589 [ XP ] fast/repaint/subtree-root-skipped.html [ NeedsRebaseline ] +crbug.com/576589 [ XP ] fast/text/international/mixed-directionality-selection.html [ NeedsRebaseline ] +crbug.com/579381 [ XP ] fast/forms/text/input-placeholder-paint-order.html [ NeedsRebaseline ] crbug.com/498539 http/tests/inspector/elements/styles/selector-line.html [ Pass Timeout ] crbug.com/498539 http/tests/inspector/network/network-datareceived.html [ Pass Timeout ] @@ -401,15 +416,15 @@ crbug.com/240374 compositing/overlap-blending/children-opacity-huge.html [ Failure ] crbug.com/240374 compositing/overlap-blending/children-opacity-no-overlap.html [ Failure ] -crbug.com/579492 [ Win7 XP ] fast/forms/datetimelocal/datetimelocal-appearance-l10n.html [ NeedsRebaseline ] -crbug.com/579492 [ Win7 XP ] fast/forms/month/month-appearance-l10n.html [ NeedsRebaseline ] -crbug.com/579492 [ Win7 XP ] fast/ruby/nested-ruby.html [ NeedsRebaseline ] -crbug.com/579492 [ Win7 XP ] fast/text/international/002.html [ NeedsRebaseline ] -crbug.com/579492 [ Win7 XP ] fast/text/international/lang-glyph-cache-separation.html [ NeedsRebaseline ] -crbug.com/579492 [ Win7 XP ] fast/writing-mode/japanese-ruby-vertical-lr.html [ NeedsRebaseline ] -crbug.com/579492 [ Win7 XP ] fast/writing-mode/japanese-ruby-vertical-rl.html [ NeedsRebaseline ] -crbug.com/579492 inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang.html [ NeedsRebaseline ] -crbug.com/579492 [ Win ] inspector-protocol/layout-fonts/languages-emoji-rare-glyphs.html [ NeedsRebaseline ] +crbug.com/579492 [ XP ] fast/forms/datetimelocal/datetimelocal-appearance-l10n.html [ NeedsRebaseline ] +crbug.com/579492 [ XP ] fast/forms/month/month-appearance-l10n.html [ NeedsRebaseline ] +crbug.com/579492 [ XP ] fast/ruby/nested-ruby.html [ NeedsRebaseline ] +crbug.com/579492 [ XP ] fast/text/international/002.html [ NeedsRebaseline ] +crbug.com/579492 [ XP ] fast/text/international/lang-glyph-cache-separation.html [ NeedsRebaseline ] +crbug.com/579492 [ XP ] fast/writing-mode/japanese-ruby-vertical-lr.html [ NeedsRebaseline ] +crbug.com/579492 [ XP ] fast/writing-mode/japanese-ruby-vertical-rl.html [ NeedsRebaseline ] +crbug.com/579492 [ XP ] inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang.html [ NeedsRebaseline ] +crbug.com/579492 [ XP ] inspector-protocol/layout-fonts/languages-emoji-rare-glyphs.html [ NeedsRebaseline ] crbug.com/410145 [ Win ] fast/table/column-in-inline.html [ Failure ] @@ -433,6 +448,7 @@ crbug.com/563667 virtual/spv2/fast/block/basic/001.html [ Pass ] crbug.com/563667 virtual/spv2/fast/block/positioning/static-distance-with-positioned-ancestor.html [ Pass ] crbug.com/563667 virtual/spv2/fast/block/float/clamped-right-float.html [ Pass ] +crbug.com/577995 virtual/spv2/fast/block/basic/013.html [ Pass ] # In imported/web-platform-tests/html/, we prefer checking in failure # expectation files. The following tests with [ Failure ] don't have failure @@ -811,20 +827,6 @@ crbug.com/524160 [ Debug ] http/tests/media/media-source/mediasource-appendbuffer-quota-exceeded.html [ Timeout ] crbug.com/524160 [ Debug ] http/tests/media/media-source/mediasource-appendstream-quota-exceeded.html [ Timeout ] -crbug.com/580101 [ Android ] css1/cascade/important.html [ NeedsRebaseline ] -crbug.com/580101 [ Android ] css1/classification/list_style.html [ NeedsRebaseline ] -crbug.com/580101 [ Android ] css1/classification/list_style_image.html [ NeedsRebaseline ] -crbug.com/580101 [ Android ] css1/classification/list_style_position.html [ NeedsRebaseline ] -crbug.com/580101 [ Android ] css1/color_and_background/background_color.html [ NeedsRebaseline ] -crbug.com/580101 [ Android ] css1/color_and_background/color.html [ NeedsRebaseline ] -crbug.com/580101 [ Android ] css1/font_properties/font_style.html [ NeedsRebaseline ] -crbug.com/580101 [ Android ] css1/font_properties/font_variant.html [ NeedsRebaseline ] -crbug.com/580101 [ Android ] css1/formatting_model/canvas.html [ NeedsRebaseline ] -crbug.com/580101 [ Android ] css1/text_properties/text_align.html [ NeedsRebaseline ] -crbug.com/580101 [ Android ] fast/compact/002.html [ NeedsRebaseline ] -crbug.com/580101 [ Android ] fast/text/chromium-linux-fontconfig-renderstyle.html [ NeedsRebaseline ] -crbug.com/580101 [ Android ] svg/canvas/canvas-pattern-svg.html [ NeedsRebaseline ] - crbug.com/568827 [ Android ] http/tests/media/media-source/mediasource-config-change-mp4-av-audio-bitrate.html [ Failure ] crbug.com/555703 [ Android ] http/tests/media/media-source/mediasource-config-change-mp4-av-framesize.html [ Failure ] crbug.com/555703 [ Android ] http/tests/media/media-source/mediasource-config-change-mp4-av-video-bitrate.html [ Failure ] @@ -874,9 +876,9 @@ crbug.com/441559 virtual/stable/web-animations-api/partial-keyframes-unsupported.html [ Pass ] crbug.com/437696 virtual/stable/web-animations-api/additive-animations-unsupported.html [ Pass ] -crbug.com/578663 fast/canvas/canvas-imageSmoothingQuality-pixel.html [ NeedsRebaseline ] -crbug.com/578663 fast/images/exif-orientation-height-image-document.html [ NeedsRebaseline ] -crbug.com/578663 virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel.html [ NeedsRebaseline ] +crbug.com/578663 [ XP ] fast/canvas/canvas-imageSmoothingQuality-pixel.html [ NeedsRebaseline ] +crbug.com/578663 [ XP ] fast/images/exif-orientation-height-image-document.html [ NeedsRebaseline ] +crbug.com/578663 [ XP ] virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel.html [ NeedsRebaseline ] # switching to apache-win32: needs triaging. crbug.com/528062 [ Win ] http/tests/css/missing-repaint-after-slow-style-sheet.pl [ Failure ] @@ -910,14 +912,14 @@ crbug.com/425345 [ Mac ] fast/text/line-break-after-question-mark.html [ Failure ] -crbug.com/579816 fast/borders/border-image-outset-in-shorthand.html [ NeedsRebaseline ] -crbug.com/579816 fast/borders/border-image-outset-split-inline.html [ NeedsRebaseline ] -crbug.com/579816 fast/borders/border-image-outset.html [ NeedsRebaseline ] -crbug.com/579816 fast/borders/border-image-slice-constrained.html [ NeedsRebaseline ] -crbug.com/579816 fast/gradients/border-image-gradient-sides-and-corners.html [ NeedsRebaseline ] -crbug.com/579816 fast/writing-mode/border-image-vertical-lr.html [ NeedsRebaseline ] -crbug.com/579816 fast/writing-mode/border-image-vertical-rl.html [ NeedsRebaseline ] -crbug.com/579816 svg/W3C-SVG-1.1/coords-units-01-b.svg [ NeedsRebaseline ] +crbug.com/579816 [ XP ] fast/borders/border-image-outset-in-shorthand.html [ NeedsRebaseline ] +crbug.com/579816 [ XP ] fast/borders/border-image-outset-split-inline.html [ NeedsRebaseline ] +crbug.com/579816 [ XP ] fast/borders/border-image-outset.html [ NeedsRebaseline ] +crbug.com/579816 [ XP ] fast/borders/border-image-slice-constrained.html [ NeedsRebaseline ] +crbug.com/579816 [ XP ] fast/gradients/border-image-gradient-sides-and-corners.html [ NeedsRebaseline ] +crbug.com/579816 [ XP ] fast/writing-mode/border-image-vertical-lr.html [ NeedsRebaseline ] +crbug.com/579816 [ XP ] fast/writing-mode/border-image-vertical-rl.html [ NeedsRebaseline ] +crbug.com/579816 [ XP ] svg/W3C-SVG-1.1/coords-units-01-b.svg [ NeedsRebaseline ] # When drawing subpixel smoothed glyphs, CoreGraphics will fake bold the glyphs. # In this configuration, the pixel smoothed glyphs will be created from subpixel smoothed glyphs. @@ -1034,8 +1036,8 @@ crbug.com/478109 [ Mac10.6 ] fast/text/bidi-embedding-pop-and-push-same-2.html [ Failure ] -crbug.com/369979 fast/table/table-display-types-vertical.html [ NeedsRebaseline ] -crbug.com/369979 fast/table/table-display-types.html [ NeedsRebaseline ] +crbug.com/369979 [ XP ] fast/table/table-display-types-vertical.html [ NeedsRebaseline ] +crbug.com/369979 [ XP ] fast/table/table-display-types.html [ NeedsRebaseline ] # These need a rebaseline due crbug.com/504745 on Windows when they are activated again. crbug.com/521124 crbug.com/410145 [ Win ] fast/text/international/vertical-text-glyph-test.html [ Pass Failure ] @@ -1232,8 +1234,6 @@ crbug.com/521730 [ Win10 ] fast/css/line-height-determined-by-primary-font.html [ Failure ] crbug.com/521730 [ Win10 ] fast/forms/month/month-appearance-l10n.html [ Failure ] crbug.com/521730 [ Win10 ] fast/forms/month/month-appearance-pseudo-elements.html [ Failure ] -# TODO(fmalita): re-enable after http://crrev.com/1410733003 -# crbug.com/521730 [ Win10 ] fast/forms/search/search-appearance-basic.html [ Failure ] crbug.com/521730 [ Win10 ] fast/inline/justify-emphasis-inline-box.html [ Failure ] crbug.com/521730 [ Win10 ] fast/ruby/nested-ruby.html [ Failure ] crbug.com/521730 [ Win10 ] fast/text-autosizing/display-type-change.html [ Failure ] @@ -1292,27 +1292,27 @@ crbug.com/521730 [ Win10 ] svg/css/text-shadow-multiple.xhtml [ Failure ] crbug.com/521730 [ Win10 ] svg/custom/textPath-change-id2-pattern.svg [ Failure ] -crbug.com/390040 css3/filters/nested-filter.html [ NeedsRebaseline ] -crbug.com/390040 fast/borders/border-radius-percent.html [ NeedsRebaseline ] -crbug.com/390040 fast/css/resize-corner-tracking-transformed.html [ NeedsRebaseline ] -crbug.com/390040 fast/forms/select-popup/popup-menu-appearance-transform.html [ NeedsRebaseline ] -crbug.com/390040 fast/frames/frame-set-scaling-rotate.html [ NeedsRebaseline ] -crbug.com/390040 fast/frames/frame-set-scaling-skew.html [ NeedsRebaseline ] -crbug.com/390040 fast/overflow/overflow-update-transform.html [ NeedsRebaseline ] -crbug.com/390040 fast/replaced/selection-rect-transform.html [ NeedsRebaseline ] -crbug.com/390040 fast/transforms/transformed-focused-text-input.html [ NeedsRebaseline ] -crbug.com/390040 inspector/layers/layer-canvas-log.html [ NeedsRebaseline ] -crbug.com/390040 media/audio-repaint.html [ NeedsRebaseline ] -crbug.com/390040 printing/iframe-print.html [ NeedsRebaseline ] -crbug.com/390040 svg/dynamic-updates/SVG-dynamic-css-transform.html [ NeedsRebaseline ] -crbug.com/390040 virtual/threaded/printing/iframe-print.html [ NeedsRebaseline ] -crbug.com/390040 fast/forms/placeholder-position.html [ NeedsRebaseline ] -crbug.com/390040 svg/transforms/animated-path-inside-transformed-html.xhtml [ NeedsRebaseline ] -crbug.com/390040 svg/transforms/text-with-pattern-inside-transformed-html.xhtml [ NeedsRebaseline ] -crbug.com/390040 virtual/threaded/printing/ellipsis-printing-style.html [ NeedsRebaseline ] -crbug.com/390040 printing/ellipsis-printing-style.html [ NeedsRebaseline ] -crbug.com/390040 fast/forms/select/listbox-appearance-basic.html [ NeedsRebaseline ] -crbug.com/390040 fast/frames/iframe-scaling-with-scroll.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] css3/filters/nested-filter.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] fast/borders/border-radius-percent.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] fast/css/resize-corner-tracking-transformed.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] fast/forms/select-popup/popup-menu-appearance-transform.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] fast/frames/frame-set-scaling-rotate.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] fast/frames/frame-set-scaling-skew.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] fast/overflow/overflow-update-transform.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] fast/replaced/selection-rect-transform.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] fast/transforms/transformed-focused-text-input.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] inspector/layers/layer-canvas-log.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] media/audio-repaint.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] printing/iframe-print.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] svg/dynamic-updates/SVG-dynamic-css-transform.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] virtual/threaded/printing/iframe-print.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] fast/forms/placeholder-position.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] svg/transforms/animated-path-inside-transformed-html.xhtml [ NeedsRebaseline ] +crbug.com/390040 [ XP ] svg/transforms/text-with-pattern-inside-transformed-html.xhtml [ NeedsRebaseline ] +crbug.com/390040 [ XP ] virtual/threaded/printing/ellipsis-printing-style.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] printing/ellipsis-printing-style.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] fast/forms/select/listbox-appearance-basic.html [ NeedsRebaseline ] +crbug.com/390040 [ XP ] fast/frames/iframe-scaling-with-scroll.html [ NeedsRebaseline ] crbug.com/571233 compositing/background-color/background-color-outside-document.html [ Skip ] @@ -1359,33 +1359,33 @@ crbug.com/543369 [ Linux ] fast/forms/select-popup/popup-menu-appearance-tall.html [ Failure ] # SK_SUPPORT_LEGACY_PATH_MEASURE_TVALUE -crbug.com/438390 svg/W3C-SVG-1.1/animate-elem-33-t.svg [ NeedsRebaseline ] -crbug.com/438390 svg/W3C-SVG-1.1/text-align-04-b.svg [ NeedsRebaseline ] -crbug.com/438390 svg/W3C-SVG-1.1/text-path-01-b.svg [ NeedsRebaseline ] -crbug.com/438390 svg/animations/animate-elem-06-t-drt.html [ NeedsRebaseline ] -crbug.com/438390 svg/animations/animate-elem-07-t-drt.html [ NeedsRebaseline ] -crbug.com/438390 svg/animations/animate-elem-08-t-drt.html [ NeedsRebaseline ] -crbug.com/438390 svg/animations/animate-text-nested-transforms.html [ NeedsRebaseline ] -crbug.com/438390 svg/animations/animateMotion-accumulate-1c.svg [ NeedsRebaseline ] -crbug.com/438390 svg/animations/animateMotion-accumulate-2a.svg [ NeedsRebaseline ] -crbug.com/438390 svg/animations/animateMotion-accumulate-2b.svg [ NeedsRebaseline ] -crbug.com/438390 svg/batik/text/longTextOnPath.svg [ NeedsRebaseline ] -crbug.com/438390 svg/batik/text/textGlyphOrientationHorizontal.svg [ NeedsRebaseline ] -crbug.com/438390 svg/batik/text/textOnPath.svg [ NeedsRebaseline ] -crbug.com/438390 svg/batik/text/textOnPath2.svg [ NeedsRebaseline ] -crbug.com/438390 svg/batik/text/textOnPath3.svg [ NeedsRebaseline ] -crbug.com/438390 svg/batik/text/textOnPathSpaces.svg [ NeedsRebaseline ] -crbug.com/438390 svg/batik/text/verticalText.svg [ NeedsRebaseline ] -crbug.com/438390 svg/batik/text/verticalTextOnPath.svg [ NeedsRebaseline ] -crbug.com/438390 svg/custom/text-match-highlight.html [ NeedsRebaseline ] -crbug.com/438390 svg/filters/subRegion-one-effect.svg [ NeedsRebaseline ] -crbug.com/438390 svg/filters/subRegion-two-effects.svg [ NeedsRebaseline ] -crbug.com/438390 svg/text/bbox-with-glyph-overflow-on-path.html [ NeedsRebaseline ] -crbug.com/438390 svg/text/text-selection-align-04-b.svg [ NeedsRebaseline ] -crbug.com/438390 svg/text/text-selection-path-01-b.svg [ NeedsRebaseline ] -crbug.com/438390 svg/text/textPathBoundsBug.svg [ NeedsRebaseline ] -crbug.com/438390 svg/transforms/svg-css-transforms.xhtml [ NeedsRebaseline ] -crbug.com/438390 transforms/svg-vs-css.xhtml [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/W3C-SVG-1.1/animate-elem-33-t.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/W3C-SVG-1.1/text-align-04-b.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/W3C-SVG-1.1/text-path-01-b.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/animations/animate-elem-06-t-drt.html [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/animations/animate-elem-07-t-drt.html [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/animations/animate-elem-08-t-drt.html [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/animations/animate-text-nested-transforms.html [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/animations/animateMotion-accumulate-1c.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/animations/animateMotion-accumulate-2a.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/animations/animateMotion-accumulate-2b.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/batik/text/longTextOnPath.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/batik/text/textGlyphOrientationHorizontal.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/batik/text/textOnPath.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/batik/text/textOnPath2.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/batik/text/textOnPath3.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/batik/text/textOnPathSpaces.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/batik/text/verticalText.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/batik/text/verticalTextOnPath.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/custom/text-match-highlight.html [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/filters/subRegion-one-effect.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/filters/subRegion-two-effects.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/text/bbox-with-glyph-overflow-on-path.html [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/text/text-selection-align-04-b.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/text/text-selection-path-01-b.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/text/textPathBoundsBug.svg [ NeedsRebaseline ] +crbug.com/438390 [ XP ] svg/transforms/svg-css-transforms.xhtml [ NeedsRebaseline ] +crbug.com/438390 [ XP ] transforms/svg-vs-css.xhtml [ NeedsRebaseline ] crbug.com/575917 fast/js/const.html [ NeedsManualRebaseline ] crbug.com/575917 fast/js/inc-const-valueOf.html [ NeedsManualRebaseline ] @@ -1424,7 +1424,6 @@ crbug.com/568778 [ XP ] media/video-transformed.html [ Failure ] crbug.com/568778 [ XP ] svg/wicd/test-rightsizing-a.xhtml [ Failure ] crbug.com/568778 [ XP ] svg/zoom/page/zoom-hixie-mixed-009.xml [ Failure ] -crbug.com/568778 [ XP ] svg/zoom/page/zoom-img-preserveAspectRatio-support-1.html [ Failure ] crbug.com/568778 [ XP ] svg/zoom/page/zoom-replaced-intrinsic-ratio-001.htm [ Failure ] crbug.com/568778 [ XP ] svg/zoom/page/zoom-svg-through-object-with-auto-size.html [ Failure ] crbug.com/568778 [ XP ] svg/zoom/page/zoom-svg-through-object-with-huge-size.xhtml [ Failure ] @@ -1443,9 +1442,9 @@ crbug.com/568559 [ Android Linux Win ] compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/select/select-disabled-appearance.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] editing/selection/caret-before-select.html [ NeedsRebaseline ] -crbug.com/568559 [ Android Linux Win ] fast/forms/select-popup/popup-menu-appearance-styled.html [ NeedsRebaseline ] +crbug.com/568559 [ XP ] fast/forms/select-popup/popup-menu-appearance-styled.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/control-restrict-line-height.html [ NeedsRebaseline ] -crbug.com/568559 [ Android Linux Win ] fast/forms/select-popup/popup-menu-appearance-empty.html [ NeedsRebaseline ] +crbug.com/568559 [ XP ] fast/forms/select-popup/popup-menu-appearance-empty.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/select/select-style.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/select/menulist-deselect-update.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] tables/mozilla/bugs/bug2479-3.html [ NeedsRebaseline ] @@ -1463,7 +1462,7 @@ crbug.com/568559 [ Android Linux Win ] fast/forms/form-radio-img-node-list.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/select/menulist-no-overflow.html [ NeedsRebaseline ] crbug.com/568559 fast/forms/select/menulist-appearance-basic.html [ NeedsRebaseline ] -crbug.com/568559 [ Android Linux Win ] fast/forms/select-popup/popup-menu-appearance-single-option.html [ NeedsRebaseline ] +crbug.com/568559 [ XP ] fast/forms/select-popup/popup-menu-appearance-single-option.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/select/select-size-invalid.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] tables/mozilla/bugs/bug4382.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] virtual/prefer_compositing_to_lcd_text/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers.html [ NeedsRebaseline ] @@ -1473,7 +1472,7 @@ crbug.com/568559 [ Android Linux Win ] fast/forms/select/select-dirty-parent-pref-widths.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/select/select-initial-position.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] tables/mozilla/bugs/bug1188.html [ NeedsRebaseline ] -crbug.com/568559 [ Android Linux Win ] fast/forms/select-popup/popup-menu-appearance-zoom090.html [ NeedsRebaseline ] +crbug.com/568559 [ XP ] fast/forms/select-popup/popup-menu-appearance-zoom090.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] editing/selection/select-element-paragraph-boundary.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/form-element-geometry.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] tables/mozilla_expected_failures/bugs/bug2479-5.html [ NeedsRebaseline ] @@ -1486,14 +1485,14 @@ crbug.com/568559 [ Android Linux Win ] tables/mozilla/bugs/bug29326.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/select/HTMLOptionElement_label06.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/parser/document-write-option.html [ NeedsRebaseline ] -crbug.com/568559 fast/forms/text/text-font-height-mismatch.html [ NeedsRebaseline ] +crbug.com/568559 [ XP ] fast/forms/text/text-font-height-mismatch.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] editing/selection/select-box.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/001.html [ NeedsRebaseline ] -crbug.com/568559 [ Android Linux Win ] fast/forms/select-popup/popup-menu-appearance.html [ NeedsRebaseline ] +crbug.com/568559 [ XP ] fast/forms/select-popup/popup-menu-appearance.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/text/emphasis-vertical.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/html/keygen.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/replaced/three-selects-break.html [ NeedsRebaseline ] -crbug.com/568559 [ Android Linux Win ] tables/mozilla/dom/tableDom.html [ NeedsRebaseline ] +crbug.com/568559 [ XP ] tables/mozilla/dom/tableDom.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] css3/selectors3/xml/css3-modsel-161.xml [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/writing-mode/english-lr-text.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] tables/mozilla/bugs/bug2479-4.html [ NeedsRebaseline ] @@ -1503,7 +1502,7 @@ crbug.com/568559 [ Android Linux Win ] fast/forms/select/option-script.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/select/HTMLOptionElement_label01.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] css3/selectors3/html/css3-modsel-161.html [ NeedsRebaseline ] -crbug.com/568559 [ Android Linux Win ] fast/forms/select-popup/popup-menu-appearance-zoom.html [ NeedsRebaseline ] +crbug.com/568559 [ XP ] fast/forms/select-popup/popup-menu-appearance-zoom.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/select/option-text-clip.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/text/international/menulist-width-rtl.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/replaced/replaced-breaking-mixture.html [ NeedsRebaseline ] @@ -1518,7 +1517,7 @@ crbug.com/568559 [ Android Linux Win ] editing/pasteboard/4641033.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] css3/selectors3/xhtml/css3-modsel-161.xml [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] tables/mozilla/bugs/bug33855.html [ NeedsRebaseline ] -crbug.com/568559 [ Android Linux Win ] fast/forms/select-popup/popup-menu-appearance-many.html [ NeedsRebaseline ] +crbug.com/568559 [ XP ] fast/forms/select-popup/popup-menu-appearance-many.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/block/float/float-avoidance.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/block/margin-collapse/103.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/color/color-suggestion-picker-appearance-zoom125.html [ NeedsRebaseline ] @@ -1527,13 +1526,36 @@ crbug.com/568559 [ Android Linux Win ] fast/forms/color/color-suggestion-picker-one-row-appearance.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/color/color-suggestion-picker-two-row-appearance.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/color/color-suggestion-picker-with-scrollbar-appearance.html [ NeedsRebaseline ] -crbug.com/568559 [ Android Linux Win ] fast/forms/select-popup/popup-menu-appearance-long.html [ NeedsRebaseline ] -crbug.com/568559 [ Android Win ] fast/forms/select-popup/popup-menu-appearance-tall.html [ NeedsRebaseline ] +crbug.com/568559 [ XP ] fast/forms/select-popup/popup-menu-appearance-long.html [ NeedsRebaseline ] +crbug.com/568559 [ XP ] fast/forms/select-popup/popup-menu-appearance-tall.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/select/select-align.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/forms/select/select-writing-direction-natural.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/text/international/bidi-menulist.html [ NeedsRebaseline ] crbug.com/568559 [ Android Linux Win ] fast/text/international/pop-up-button-text-alignment-and-direction.html [ NeedsRebaseline ] -crbug.com/568559 [ Android Linux Win ] fast/forms/select-popup/popup-menu-appearance-texttransform.html [ NeedsRebaseline ] +crbug.com/568559 [ XP ] fast/forms/select-popup/popup-menu-appearance-texttransform.html [ NeedsRebaseline ] + +# https://codereview.chromium.org/1623073003/ +crbug.com/453040 svg/W3C-SVG-1.1/animate-elem-37-t.svg [ NeedsRebaseline ] +crbug.com/453040 svg/W3C-SVG-1.1/animate-elem-40-t.svg [ NeedsRebaseline ] +crbug.com/453040 svg/W3C-SVG-1.1/animate-elem-83-t.svg [ NeedsRebaseline ] +crbug.com/453040 svg/W3C-SVG-1.1/coords-viewattr-03-b.svg [ NeedsRebaseline ] +crbug.com/453040 svg/W3C-SVG-1.1/extend-namespace-01-f.svg [ NeedsRebaseline ] +crbug.com/453040 svg/W3C-SVG-1.1/fonts-elem-03-b.svg [ NeedsRebaseline ] +crbug.com/453040 svg/W3C-SVG-1.1/fonts-elem-04-b.svg [ NeedsRebaseline ] +crbug.com/453040 svg/W3C-SVG-1.1/fonts-elem-07-b.svg [ NeedsRebaseline ] +crbug.com/453040 svg/W3C-SVG-1.1/painting-marker-03-f.svg [ NeedsRebaseline ] +crbug.com/453040 svg/W3C-SVG-1.1/paths-data-02-t.svg [ NeedsRebaseline ] +crbug.com/453040 svg/W3C-SVG-1.1/paths-data-03-f.svg [ NeedsRebaseline ] +crbug.com/453040 svg/as-background-image/background-image-preserveaspectRatio-support.html [ NeedsRebaseline ] +crbug.com/453040 svg/as-background-image/svg-as-background-6.html [ NeedsRebaseline ] +crbug.com/453040 svg/as-image/img-preserveAspectRatio-support-1.html [ NeedsRebaseline ] +crbug.com/453040 svg/carto.net/tabgroup.svg [ NeedsRebaseline ] +crbug.com/453040 svg/custom/control-points-for-S-and-T.svg [ NeedsRebaseline ] +crbug.com/453040 svg/custom/relative-sized-inner-svg.xhtml [ NeedsRebaseline ] +crbug.com/453040 svg/custom/relative-sized-use-on-symbol.xhtml [ NeedsRebaseline ] +crbug.com/453040 svg/custom/relative-sized-use-without-attributes-on-symbol.xhtml [ NeedsRebaseline ] +crbug.com/453040 svg/custom/use-on-symbol-inside-pattern.svg [ NeedsRebaseline ] +crbug.com/453040 svg/zoom/page/zoom-img-preserveAspectRatio-support-1.html [ NeedsRebaseline ] crbug.com/569950 svg/batik/filters/feTile.svg [ NeedsRebaseline ] crbug.com/569950 svg/filters/feTile.svg [ NeedsRebaseline ] @@ -1636,3 +1658,5 @@ crbug.com/579151 editing/inserting/insert-div-018.html [ NeedsRebaseline ] crbug.com/581038 fast/text/first-letter-bad-line-boxes-crash.html [ Crash Pass ] + +crbug.com/581203 [ Linux ] web-animations-api/player-finish-sample-only.html [ Failure Pass ] \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/bluetooth/requestDevice.html b/third_party/WebKit/LayoutTests/bluetooth/requestDevice.html index de7ffc36..c65b3fd3 100644 --- a/third_party/WebKit/LayoutTests/bluetooth/requestDevice.html +++ b/third_party/WebKit/LayoutTests/bluetooth/requestDevice.html
@@ -17,7 +17,7 @@ return getBluetoothManualChooserEvents(3) .then(events => { assert_array_equals(events, - ['chooser-opened(file:///)', + ['chooser-opened(file://)', 'discovering', 'discovery-failed-to-start'], events); @@ -46,7 +46,7 @@ return getBluetoothManualChooserEvents(2) .then(events => { assert_array_equals(events, - ['chooser-opened(file:///)', + ['chooser-opened(file://)', 'adapter-disabled'], events); testRunner.sendBluetoothManualChooserEvent('cancelled', ''); @@ -139,7 +139,7 @@ return getBluetoothManualChooserEvents(5) .then(events => { assert_equals(events.length, 5, events); - assert_equals(events[0], 'chooser-opened(file:///)', 'events[0]'); + assert_equals(events[0], 'chooser-opened(file://)', 'events[0]'); let idsByName = new AddDeviceEventSet(); for (let addedDevice of [events[1], events[2]]) { idsByName.assert_add_device_event(addedDevice); @@ -197,7 +197,7 @@ // The adapter finds nothing, so we just see discovery start and stop. return getBluetoothManualChooserEvents(3).then(events => { assert_array_equals(events, - ['chooser-opened(file:///)', + ['chooser-opened(file://)', 'discovering', 'discovery-idle', ]);
diff --git a/third_party/WebKit/LayoutTests/css3/filters/nested-filter-expected.png b/third_party/WebKit/LayoutTests/css3/filters/nested-filter-expected.png index e611045..3d72344f 100644 --- a/third_party/WebKit/LayoutTests/css3/filters/nested-filter-expected.png +++ b/third_party/WebKit/LayoutTests/css3/filters/nested-filter-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/cssom/serialize-namespaced-type-selectors.html b/third_party/WebKit/LayoutTests/cssom/serialize-namespaced-type-selectors.html new file mode 100644 index 0000000..84e82828 --- /dev/null +++ b/third_party/WebKit/LayoutTests/cssom/serialize-namespaced-type-selectors.html
@@ -0,0 +1,92 @@ +<!DOCTYPE html> +<script src="../resources/testharness.js"></script> +<script src="../resources/testharnessreport.js"></script> +<style id="teststyles"> +</style> +<script> + var ns_rule = "@namespace ns url(ns);"; + var default_ns_rules = "@namespace url(default_ns); @namespace nsdefault url(default_ns);" + ns_rule; + + function assert_selector_serializes_to(source, expected_result) { + var style_element = document.getElementById("teststyles"); + style_element.firstChild.data = source + "{ font-size: 1em; }"; + var sheet = style_element.sheet; + assert_equals(sheet.cssRules[sheet.cssRules.length - 1].selectorText, expected_result); + } + test(function() { + assert_selector_serializes_to(ns_rule + "e", "e"); + assert_selector_serializes_to(default_ns_rules + "e", "e"); + }, "Simple type selector"); + test(function() { + assert_selector_serializes_to(ns_rule + "|e", "|e"); + assert_selector_serializes_to(default_ns_rules + "|e", "|e"); + }, "Type selector without a namespace"); + test(function() { + assert_selector_serializes_to(ns_rule + "*|e", "e"); + assert_selector_serializes_to(default_ns_rules + "*|e", "*|e"); + }, "Type selector with any namespace"); + test(function() { + assert_selector_serializes_to(ns_rule + "*", "*"); + assert_selector_serializes_to(default_ns_rules + "*", "*"); + }, "Universal selector"); + test(function() { + assert_selector_serializes_to(ns_rule + "|*", "|*"); + assert_selector_serializes_to(default_ns_rules + "|*", "|*"); + }, "Universal selector without a namespace"); + test(function() { + assert_selector_serializes_to(ns_rule + "*|*", "*"); + assert_selector_serializes_to(default_ns_rules + "*|*", "*|*"); + }, "Universal selector in any namespace"); + test(function() { + assert_selector_serializes_to(ns_rule + "ns|e", "ns|e"); + assert_selector_serializes_to(default_ns_rules + "ns|e", "ns|e"); + }, "Type selector with namespace"); + test(function() { + assert_selector_serializes_to(ns_rule + "ns|*", "ns|*"); + assert_selector_serializes_to(default_ns_rules + "ns|*", "ns|*"); + }, "Universal selector with namespace"); + test(function() { + assert_selector_serializes_to(ns_rule + "e.c", "e.c"); + assert_selector_serializes_to(default_ns_rules + "e.c", "e.c"); + }, "Simple type selector followed by class"); + test(function() { + assert_selector_serializes_to(ns_rule + "|e.c", "|e.c"); + assert_selector_serializes_to(default_ns_rules + "|e.c", "|e.c"); + }, "Type selector without a namespace followed by class"); + test(function() { + assert_selector_serializes_to(ns_rule + "*|e.c", "e.c"); + assert_selector_serializes_to(default_ns_rules + "*|e.c", "*|e.c"); + }, "Type selector with any namespace followed by class"); + test(function() { + assert_selector_serializes_to(ns_rule + "*.c", ".c"); + assert_selector_serializes_to(default_ns_rules + "*.c", ".c"); + }, "Universal selector followed by class"); + test(function() { + assert_selector_serializes_to(ns_rule + "|*.c", "|*.c"); + assert_selector_serializes_to(default_ns_rules + "|*.c", "|*.c"); + }, "Universal selector without a namespace followed by class"); + test(function() { + assert_selector_serializes_to(ns_rule + "*|*.c", ".c"); + assert_selector_serializes_to(default_ns_rules + "*|*.c", "*|*.c"); + }, "Universal selector in any namespace followed by class"); + test(function() { + assert_selector_serializes_to(ns_rule + "ns|e.c", "ns|e.c"); + assert_selector_serializes_to(default_ns_rules + "ns|e.c", "ns|e.c"); + }, "Type selector with namespace followed by class"); + test(function() { + assert_selector_serializes_to(ns_rule + "ns|*.c", "ns|*.c"); + assert_selector_serializes_to(default_ns_rules + "ns|*.c", "ns|*.c"); + }, "Universal selector with namespace followed by class"); + test(function() { + assert_selector_serializes_to(default_ns_rules + "nsdefault|e", "e"); + }, "Type selector with namespace equal to default namespace"); + test(function() { + assert_selector_serializes_to(default_ns_rules + "nsdefault|*", "*"); + }, "Universal selector with namespace equal to default namespace"); + test(function() { + assert_selector_serializes_to(default_ns_rules + "nsdefault|e.c", "e.c"); + }, "Type selector with namespace equal to default namespace followed by class"); + test(function() { + assert_selector_serializes_to(default_ns_rules + "nsdefault|*.c", ".c"); + }, "Universal selector with namespace equal to default namespace followed by class"); +</script>
diff --git a/third_party/WebKit/LayoutTests/fast/borders/border-image-outset-expected.png b/third_party/WebKit/LayoutTests/fast/borders/border-image-outset-expected.png index 476b85f..e4db49c 100644 --- a/third_party/WebKit/LayoutTests/fast/borders/border-image-outset-expected.png +++ b/third_party/WebKit/LayoutTests/fast/borders/border-image-outset-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/fast/borders/border-image-outset-in-shorthand-expected.png b/third_party/WebKit/LayoutTests/fast/borders/border-image-outset-in-shorthand-expected.png index 476b85f..e4db49c 100644 --- a/third_party/WebKit/LayoutTests/fast/borders/border-image-outset-in-shorthand-expected.png +++ b/third_party/WebKit/LayoutTests/fast/borders/border-image-outset-in-shorthand-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/fast/borders/border-image-slice-constrained-expected.png b/third_party/WebKit/LayoutTests/fast/borders/border-image-slice-constrained-expected.png index 2f3f5c8..6a0eb444 100644 --- a/third_party/WebKit/LayoutTests/fast/borders/border-image-slice-constrained-expected.png +++ b/third_party/WebKit/LayoutTests/fast/borders/border-image-slice-constrained-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/fast/css/css-selector-text-expected.txt b/third_party/WebKit/LayoutTests/fast/css/css-selector-text-expected.txt index d4f460d..254aa5f 100644 --- a/third_party/WebKit/LayoutTests/fast/css/css-selector-text-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/css/css-selector-text-expected.txt
@@ -16,9 +16,9 @@ PASS parseThenSerializeRule('[a$="b"] { }') is '[a$="b"] { }' PASS parseThenSerializeRule('[a*="b"] { }') is '[a*="b"] { }' -PASS parseThenSerializeRule('*|a { }') is '*|a { }' +PASS parseThenSerializeRule('*|a { }') is 'a { }' PASS parseThenSerializeRule('n|a { }') is 'n|a { }' -PASS parseThenSerializeRule('*|* { }') is '*|* { }' +PASS parseThenSerializeRule('*|* { }') is '* { }' PASS parseThenSerializeRule('n|* { }') is 'n|* { }' PASS parseThenSerializeRule('[*|a] { }') is '[*|a] { }' PASS parseThenSerializeRule('[n|a] { }') is '[n|a] { }'
diff --git a/third_party/WebKit/LayoutTests/fast/css/css-selector-text.html b/third_party/WebKit/LayoutTests/fast/css/css-selector-text.html index 5478107..20bdcedf7 100644 --- a/third_party/WebKit/LayoutTests/fast/css/css-selector-text.html +++ b/third_party/WebKit/LayoutTests/fast/css/css-selector-text.html
@@ -44,9 +44,9 @@ debug(''); -testSelectorRoundTrip('*|a'); +shouldBe("parseThenSerializeRule('*|a { }')", "'a { }'"); testSelectorRoundTrip('n|a'); -testSelectorRoundTrip('*|*'); +shouldBe("parseThenSerializeRule('*|* { }')", "'* { }'"); testSelectorRoundTrip('n|*'); testSelectorRoundTrip('[*|a]'); testSelectorRoundTrip('[n|a]');
diff --git a/third_party/WebKit/LayoutTests/fast/css/css-set-selector-text-expected.txt b/third_party/WebKit/LayoutTests/fast/css/css-set-selector-text-expected.txt index 359c80c8..66e84bb5 100644 --- a/third_party/WebKit/LayoutTests/fast/css/css-set-selector-text-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/css/css-set-selector-text-expected.txt
@@ -26,12 +26,15 @@ PASS setThenReadSelectorText('[a$="b"]') is '[a$="b"]' PASS setThenReadSelectorText('[a*="b"]') is '[a*="b"]' -PASS setThenReadSelectorText('*|a') is '*|a' +PASS setThenReadSelectorText('*|a') is 'a' PASS setThenReadSelectorText('n|a') is 'n|a' -PASS setThenReadSelectorText('*|*') is '*|*' +PASS setThenReadSelectorText('*|*') is '*' PASS setThenReadSelectorText('n|*') is 'n|*' PASS setThenReadSelectorText('[*|a]') is '[*|a]' PASS setThenReadSelectorText('[n|a]') is '[n|a]' +PASS setThenReadSelectorText('unresolved|a') is '_foo' +PASS setThenReadSelectorText('unresolved|*') is '_foo' +PASS setThenReadSelectorText('[unresolved|a]') is '_foo' PASS setThenReadSelectorText('a:active') is 'a:active' PASS setThenReadSelectorText('a b') is 'a b'
diff --git a/third_party/WebKit/LayoutTests/fast/css/css-set-selector-text.html b/third_party/WebKit/LayoutTests/fast/css/css-set-selector-text.html index b209f9c..8df5518 100644 --- a/third_party/WebKit/LayoutTests/fast/css/css-set-selector-text.html +++ b/third_party/WebKit/LayoutTests/fast/css/css-set-selector-text.html
@@ -22,10 +22,10 @@ head.appendChild(styleElement); // First, create a rule with a bogus selector. - styleElement.appendChild(document.createTextNode(bogusSelector + " { }")); + styleElement.appendChild(document.createTextNode("@namespace n url(test); " + bogusSelector + " { }")); // Now, set the desired selector text. - styleElement.sheet.cssRules[0].selectorText = selector; - return styleElement.sheet.cssRules[0].selectorText; + styleElement.sheet.cssRules[1].selectorText = selector; + return styleElement.sheet.cssRules[1].selectorText; } function testSelectorRoundTrip(selector, expectFailure) @@ -60,12 +60,15 @@ debug(''); -testSelectorRoundTrip('*|a'); +shouldBe("setThenReadSelectorText('*|a')", "'a'"); testSelectorRoundTrip('n|a'); -testSelectorRoundTrip('*|*'); +shouldBe("setThenReadSelectorText('*|*')", "'*'"); testSelectorRoundTrip('n|*'); testSelectorRoundTrip('[*|a]'); testSelectorRoundTrip('[n|a]'); +testSelectorRoundTrip('unresolved|a', true); +testSelectorRoundTrip('unresolved|*', true); +testSelectorRoundTrip('[unresolved|a]', true); debug('');
diff --git a/third_party/WebKit/LayoutTests/fast/css/stylerule-set-selectortext-ns-expected.txt b/third_party/WebKit/LayoutTests/fast/css/stylerule-set-selectortext-ns-expected.txt new file mode 100644 index 0000000..a4ecad1e --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/css/stylerule-set-selectortext-ns-expected.txt
@@ -0,0 +1,12 @@ +Should not be allowed to set selectorText with unknown namespace + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS getComputedStyle(p).color is green +PASS sheet.cssRules[1].selectorText is ".nomatch" +PASS getComputedStyle(p).color is green +PASS successfullyParsed is true + +TEST COMPLETE +This text should be green
diff --git a/third_party/WebKit/LayoutTests/fast/css/stylerule-set-selectortext-ns.html b/third_party/WebKit/LayoutTests/fast/css/stylerule-set-selectortext-ns.html new file mode 100644 index 0000000..baf0b8e --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/css/stylerule-set-selectortext-ns.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<script src="../../resources/js-test.js"></script> +<style id="testsheet"> + p { color: green } + .nomatch { color: red } +</style> +<p>This text should be green</p> +<script> +description("Should not be allowed to set selectorText with unknown namespace"); + +var green = "rgb(0, 128, 0)"; +var p = document.querySelector("p"); +var sheet = document.querySelector("#testsheet").sheet; +shouldBe("getComputedStyle(p).color", "green"); + +sheet.cssRules[1].selectorText = "bogus|p"; + +shouldBeEqualToString("sheet.cssRules[1].selectorText", ".nomatch"); +shouldBe("getComputedStyle(p).color", "green"); +</script>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/SelectorAPI/not-supported-namespace-in-selector-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/SelectorAPI/not-supported-namespace-in-selector-expected.txt index d7124ae..5bed579 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/SelectorAPI/not-supported-namespace-in-selector-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/SelectorAPI/not-supported-namespace-in-selector-expected.txt
@@ -1,36 +1,36 @@ This tests that we throw a NAMESPACE_ERR when parsing a selector string for querySelector and querySelectorAll that contains a namespace. -PASS: document.querySelector('bbb|pre') throws: NamespaceError: Failed to execute 'querySelector' on 'Document': 'bbb|pre' contains namespaces, which are not supported. -PASS: document.querySelectorAll('bbb|pre') throws: NamespaceError: Failed to execute 'querySelectorAll' on 'Document': 'bbb|pre' contains namespaces, which are not supported. -PASS: document.body.webkitMatchesSelector('bbb|pre') throws: NamespaceError: Failed to execute 'webkitMatchesSelector' on 'Element': 'bbb|pre' contains namespaces, which are not supported. +PASS: document.querySelector('bbb|pre') throws: SyntaxError: Failed to execute 'querySelector' on 'Document': 'bbb|pre' is not a valid selector. +PASS: document.querySelectorAll('bbb|pre') throws: SyntaxError: Failed to execute 'querySelectorAll' on 'Document': 'bbb|pre' is not a valid selector. +PASS: document.body.webkitMatchesSelector('bbb|pre') throws: SyntaxError: Failed to execute 'webkitMatchesSelector' on 'Element': 'bbb|pre' is not a valid selector. PASS: document.querySelector('*|pre') did not throw PASS: document.querySelectorAll('*|pre') did not throw PASS: document.body.webkitMatchesSelector('*|pre') did not throw PASS: document.querySelector('|pre') did not throw PASS: document.querySelectorAll('|pre') did not throw PASS: document.body.webkitMatchesSelector('|pre') did not throw -PASS: document.querySelector('div bbb|pre') throws: NamespaceError: Failed to execute 'querySelector' on 'Document': 'div bbb|pre' contains namespaces, which are not supported. -PASS: document.querySelectorAll('div bbb|pre') throws: NamespaceError: Failed to execute 'querySelectorAll' on 'Document': 'div bbb|pre' contains namespaces, which are not supported. -PASS: document.body.webkitMatchesSelector('div bbb|pre') throws: NamespaceError: Failed to execute 'webkitMatchesSelector' on 'Element': 'div bbb|pre' contains namespaces, which are not supported. +PASS: document.querySelector('div bbb|pre') throws: SyntaxError: Failed to execute 'querySelector' on 'Document': 'div bbb|pre' is not a valid selector. +PASS: document.querySelectorAll('div bbb|pre') throws: SyntaxError: Failed to execute 'querySelectorAll' on 'Document': 'div bbb|pre' is not a valid selector. +PASS: document.body.webkitMatchesSelector('div bbb|pre') throws: SyntaxError: Failed to execute 'webkitMatchesSelector' on 'Element': 'div bbb|pre' is not a valid selector. PASS: document.querySelector('div *|pre') did not throw PASS: document.querySelectorAll('div *|pre') did not throw PASS: document.body.webkitMatchesSelector('div *|pre') did not throw PASS: document.querySelector('div |pre') did not throw PASS: document.querySelectorAll('div |pre') did not throw PASS: document.body.webkitMatchesSelector('div |pre') did not throw -PASS: document.querySelector('[bbb|name=value]') throws: NamespaceError: Failed to execute 'querySelector' on 'Document': '[bbb|name=value]' contains namespaces, which are not supported. -PASS: document.querySelectorAll('[bbb|name=value]') throws: NamespaceError: Failed to execute 'querySelectorAll' on 'Document': '[bbb|name=value]' contains namespaces, which are not supported. -PASS: document.body.webkitMatchesSelector('[bbb|name=value]') throws: NamespaceError: Failed to execute 'webkitMatchesSelector' on 'Element': '[bbb|name=value]' contains namespaces, which are not supported. +PASS: document.querySelector('[bbb|name=value]') throws: SyntaxError: Failed to execute 'querySelector' on 'Document': '[bbb|name=value]' is not a valid selector. +PASS: document.querySelectorAll('[bbb|name=value]') throws: SyntaxError: Failed to execute 'querySelectorAll' on 'Document': '[bbb|name=value]' is not a valid selector. +PASS: document.body.webkitMatchesSelector('[bbb|name=value]') throws: SyntaxError: Failed to execute 'webkitMatchesSelector' on 'Element': '[bbb|name=value]' is not a valid selector. PASS: document.querySelector('[*|name=value]') did not throw PASS: document.querySelectorAll('[*|name=value]') did not throw PASS: document.body.webkitMatchesSelector('[*|name=value]') did not throw PASS: document.querySelector('[|name=value]') did not throw PASS: document.querySelectorAll('[|name=value]') did not throw PASS: document.body.webkitMatchesSelector('[|name=value]') did not throw -PASS: document.querySelector(':-webkit-any(bbb|pre)') throws: NamespaceError: Failed to execute 'querySelector' on 'Document': ':-webkit-any(bbb|pre)' contains namespaces, which are not supported. -PASS: document.querySelector('div [bbb|name=value]') throws: NamespaceError: Failed to execute 'querySelector' on 'Document': 'div [bbb|name=value]' contains namespaces, which are not supported. -PASS: document.querySelectorAll('div [bbb|name=value]') throws: NamespaceError: Failed to execute 'querySelectorAll' on 'Document': 'div [bbb|name=value]' contains namespaces, which are not supported. -PASS: document.body.webkitMatchesSelector('div [bbb|name=value]') throws: NamespaceError: Failed to execute 'webkitMatchesSelector' on 'Element': 'div [bbb|name=value]' contains namespaces, which are not supported. +PASS: document.querySelector(':-webkit-any(bbb|pre)') throws: SyntaxError: Failed to execute 'querySelector' on 'Document': ':-webkit-any(bbb|pre)' is not a valid selector. +PASS: document.querySelector('div [bbb|name=value]') throws: SyntaxError: Failed to execute 'querySelector' on 'Document': 'div [bbb|name=value]' is not a valid selector. +PASS: document.querySelectorAll('div [bbb|name=value]') throws: SyntaxError: Failed to execute 'querySelectorAll' on 'Document': 'div [bbb|name=value]' is not a valid selector. +PASS: document.body.webkitMatchesSelector('div [bbb|name=value]') throws: SyntaxError: Failed to execute 'webkitMatchesSelector' on 'Element': 'div [bbb|name=value]' is not a valid selector. PASS: document.querySelector('div [*|name=value]') did not throw PASS: document.querySelectorAll('div [*|name=value]') did not throw PASS: document.body.webkitMatchesSelector('div [*|name=value]') did not throw
diff --git a/third_party/WebKit/LayoutTests/fast/dom/shadow/content-element-select-namespace-expected.html b/third_party/WebKit/LayoutTests/fast/dom/shadow/content-element-select-namespace-expected.html new file mode 100644 index 0000000..2a6c5db --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/dom/shadow/content-element-select-namespace-expected.html
@@ -0,0 +1,3 @@ +<!DOCTYPE html> +<p>You should see the word PASS below.</p> +<span>PASS</span>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/shadow/content-element-select-namespace.html b/third_party/WebKit/LayoutTests/fast/dom/shadow/content-element-select-namespace.html new file mode 100644 index 0000000..6cbdf3b --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/dom/shadow/content-element-select-namespace.html
@@ -0,0 +1,11 @@ +<!DOCTYPE html> +<p>You should see the word PASS below.</p> +<host> + <span id="s1">FAIL</span> + <span id="s2">PASS</span> +</host> +<script> + var h = document.querySelector("host"); + var r = h.createShadowRoot(); + r.innerHTML = '<content select="bogus|span#s1"></content><content select="*|span#s2"></content>'; +</script>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/shadow/content-selector-query-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/shadow/content-selector-query-expected.txt index 87b56aa..ec171fe 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/shadow/content-selector-query-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/shadow/content-selector-query-expected.txt
@@ -4,16 +4,12 @@ PASS internals.isValidContentSelect(content) is true PASS internals.isValidContentSelect(content) is true -ns|div -PASS internals.isValidContentSelect(content) is true *|div PASS internals.isValidContentSelect(content) is true |div PASS internals.isValidContentSelect(content) is true div PASS internals.isValidContentSelect(content) is true -ns|* -PASS internals.isValidContentSelect(content) is true *|* PASS internals.isValidContentSelect(content) is true |* @@ -64,6 +60,10 @@ PASS internals.isValidContentSelect(content) is false div ~ div PASS internals.isValidContentSelect(content) is false +ns|div +PASS internals.isValidContentSelect(content) is false +ns|* +PASS internals.isValidContentSelect(content) is false div:root PASS internals.isValidContentSelect(content) is false div:lang(en)
diff --git a/third_party/WebKit/LayoutTests/fast/dom/shadow/content-selector-query.html b/third_party/WebKit/LayoutTests/fast/dom/shadow/content-selector-query.html index 69fdb32a..927720c 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/shadow/content-selector-query.html +++ b/third_party/WebKit/LayoutTests/fast/dom/shadow/content-selector-query.html
@@ -25,9 +25,7 @@ } var dataOfValidCases = [ - null, '', - 'ns|div', '*|div', '|div', 'div', - 'ns|*', '*|*', '|*', '*', + null, '', '*|div', '|div', 'div', '*|*', '|*', '*', '.elem', 'p.elem', 'foo.elem', '*.right', '#elem', 'p#elem', 'foo#elem', '*#something', 'div[title]', 'div[class="example"]', 'div[hello="Cleveland"][goodbye="Columbus"]', @@ -39,7 +37,7 @@ var dataOfInvalidCases = [ 'div div', 'div > div', 'div + div', 'div ~ div', - 'div:root', 'div:lang(en)', + 'ns|div', 'ns|*', 'div:root', 'div:lang(en)', 'div::before', 'div::after', 'div::first-line', 'div::first-letter', 'div:active', 'div:hover', 'div:focus', 'div div:not(div)', 'div:not(div) div', 'div span div',
diff --git a/third_party/WebKit/LayoutTests/fast/dom/shadow/slotted-pseudo-element-css-text.html b/third_party/WebKit/LayoutTests/fast/dom/shadow/slotted-pseudo-element-css-text.html index d0a0147..4e7e8ab 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/shadow/slotted-pseudo-element-css-text.html +++ b/third_party/WebKit/LayoutTests/fast/dom/shadow/slotted-pseudo-element-css-text.html
@@ -40,7 +40,7 @@ var expectedCSSTexts = [ "::slotted(*) { display: block; }", - "*::slotted(*) { display: block; }", + "::slotted(*) { display: block; }", "::slotted(div) { display: block; }", "::slotted(div) { display: block; }", "::slotted(div) { display: block; }",
diff --git a/third_party/WebKit/LayoutTests/fast/forms/radio/radio-group-remove-required-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/radio/radio-group-remove-required-expected.txt new file mode 100644 index 0000000..52c9b1623 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/forms/radio/radio-group-remove-required-expected.txt
@@ -0,0 +1,12 @@ +Removing a named required radio button shouldn't assert + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS document.getElementsByName("requiredRadio")[0].required is true +PASS radio.required is true +PASS radio.required is true +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/fast/forms/radio/radio-group-remove-required.html b/third_party/WebKit/LayoutTests/fast/forms/radio/radio-group-remove-required.html new file mode 100644 index 0000000..1dc7e53 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/forms/radio/radio-group-remove-required.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> +<head> +<script src="../../../resources/js-test.js"></script> +</head> +<body> +<form> +<input type=radio name=requiredRadio id=rbutton required> +</form> +<script> +description('Removing a named required radio button shouldn\'t assert'); + +var radio = document.getElementById('rbutton'); +shouldBeTrue('document.getElementsByName("requiredRadio")[0].required'); +shouldBeTrue('radio.required'); +radio.parentElement.removeChild(radio); +shouldBeTrue('radio.required'); +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/fast/frames/frame-set-scaling-rotate-expected.png b/third_party/WebKit/LayoutTests/fast/frames/frame-set-scaling-rotate-expected.png index 7996b28..bc42108 100644 --- a/third_party/WebKit/LayoutTests/fast/frames/frame-set-scaling-rotate-expected.png +++ b/third_party/WebKit/LayoutTests/fast/frames/frame-set-scaling-rotate-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/fast/frames/frame-set-scaling-skew-expected.png b/third_party/WebKit/LayoutTests/fast/frames/frame-set-scaling-skew-expected.png index 95c96695..24373b2e8a 100644 --- a/third_party/WebKit/LayoutTests/fast/frames/frame-set-scaling-skew-expected.png +++ b/third_party/WebKit/LayoutTests/fast/frames/frame-set-scaling-skew-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/fast/gradients/border-image-gradient-sides-and-corners-expected.png b/third_party/WebKit/LayoutTests/fast/gradients/border-image-gradient-sides-and-corners-expected.png index 8408d50..8ae12299 100644 --- a/third_party/WebKit/LayoutTests/fast/gradients/border-image-gradient-sides-and-corners-expected.png +++ b/third_party/WebKit/LayoutTests/fast/gradients/border-image-gradient-sides-and-corners-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/fast/html/area-processing-expected.txt b/third_party/WebKit/LayoutTests/fast/html/area-processing-expected.txt index 72806b9..49a7d6e4 100644 --- a/third_party/WebKit/LayoutTests/fast/html/area-processing-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/html/area-processing-expected.txt
@@ -13,6 +13,6 @@ PASS zero radius: "20,40,0" (circle) PASS too few numbers: "100,100,120,100,100" (poly) PASS one too many numbers: "100,100,120,100,100,120,300" (poly) -FAIL even-odd rule: "100,100,200,100,100,200,150,50,200,200" (poly) assert_equals: elementFromPoint(150, 125) expected Element node <img src="resources/images/blue-border.png" usemap="#x" i... but got Element node <area id="area" shape="poly" coords="100,100,200,100,100,... +PASS even-odd rule: "100,100,200,100,100,200,150,50,200,200" (poly) Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/fast/images/exif-orientation-height-image-document-expected.png b/third_party/WebKit/LayoutTests/fast/images/exif-orientation-height-image-document-expected.png index 3ca1fc7..a88421f 100644 --- a/third_party/WebKit/LayoutTests/fast/images/exif-orientation-height-image-document-expected.png +++ b/third_party/WebKit/LayoutTests/fast/images/exif-orientation-height-image-document-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/fast/js/mozilla/strict/15.4.5.1-expected.txt b/third_party/WebKit/LayoutTests/fast/js/mozilla/strict/15.4.5.1-expected.txt index d2fac60..734831e 100644 --- a/third_party/WebKit/LayoutTests/fast/js/mozilla/strict/15.4.5.1-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/js/mozilla/strict/15.4.5.1-expected.txt
@@ -1,6 +1,6 @@ -FAIL 'use strict'; var a = arr(); a.length = 2; a should throw an instance of TypeError +PASS 'use strict'; var a = arr(); a.length = 2; a threw exception of type TypeError. PASS true === true -FAIL 'use strict'; var a = addx(arr()); a.length = 2; a should throw an instance of TypeError +PASS 'use strict'; var a = addx(arr()); a.length = 2; a threw exception of type TypeError. PASS true === true PASSED! PASS successfullyParsed is true
diff --git a/third_party/WebKit/LayoutTests/fast/parser/changing-attrbutes-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/parser/changing-attrbutes-crash-expected.txt index 551c6d5..96727fdc 100644 --- a/third_party/WebKit/LayoutTests/fast/parser/changing-attrbutes-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/parser/changing-attrbutes-crash-expected.txt
@@ -1,2 +1,2 @@ -CONSOLE ERROR: line 1: Error: Invalid value for <polygon> attribute points="foo" +CONSOLE ERROR: line 1: Error: <polygon> attribute points: Expected number, "foo". This test passes if it doesn't crash.
diff --git a/third_party/WebKit/LayoutTests/fast/svg/whitespace-length-expected.txt b/third_party/WebKit/LayoutTests/fast/svg/whitespace-length-expected.txt index 53a75af..7fac867 100644 --- a/third_party/WebKit/LayoutTests/fast/svg/whitespace-length-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/svg/whitespace-length-expected.txt
@@ -1,395 +1,395 @@ -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -47a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .1a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 0.35a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 1e-10a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +32a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +17E-1a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 17e+2a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -47e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .1e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 0.35e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 1e-10e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +32e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +17E-1e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 17e+2e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -47foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .1foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 0.35foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 1e-10foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +32foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +17E-1foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 17e+2foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -47)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .1)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 0.35)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 1e-10)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +32)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +17E-1)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 17e+2)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -47a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .1a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 0.35a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 1e-10a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +32a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +17E-1a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 17e+2a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -47e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .1e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 0.35e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 1e-10e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +32e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +17E-1e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 17e+2e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -47foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .1foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 0.35foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 1e-10foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +32foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +17E-1foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 17e+2foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -47)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .1)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 0.35)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 1e-10)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +32)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +17E-1)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 17e+2)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t %" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -47a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .1a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 0.35a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 1e-10a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +32a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +17E-1a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 17e+2a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -47e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .1e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 0.35e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 1e-10e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +32e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +17E-1e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 17e+2e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -47foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .1foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 0.35foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 1e-10foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +32foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +17E-1foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 17e+2foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -47)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .1)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 0.35)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 1e-10)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +32)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +17E-1)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 17e+2)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\fem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\fem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\fem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\fem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\fem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\fem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\fem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\fex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\fex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\fex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\fex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\fex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\fex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\fex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\fpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\fpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\fpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\fpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\fpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\fpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\fpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\fin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\fin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\fin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\fin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\fin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\fin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\fin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\fcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\fcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\fcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\fcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\fcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\fcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\fcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\fmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\fmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\fmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\fmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\fmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\fmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\fmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\fpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\fpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\fpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\fpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\fpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\fpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\fpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\fpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\fpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\fpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\fpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\fpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\fpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\fpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\f%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\f%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\f%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\f%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\f%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\f%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\f%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-47a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.1a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f0.35a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f1e-10a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+32a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+17E-1a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f17e+2a" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-47e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.1e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f0.35e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f1e-10e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+32e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+17E-1e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f17e+2e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-47foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.1foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f0.35foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f1e-10foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+32foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+17E-1foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f17e+2foo" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-47)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.1)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f0.35)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f1e-10)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+32)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+17E-1)90" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f17e+2)90" +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -47a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .1a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 0.35a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 1e-10a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +32a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +17E-1a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 17e+2a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -47e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .1e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 0.35e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 1e-10e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +32e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +17E-1e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 17e+2e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -47foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .1foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 0.35foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 1e-10foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +32foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +17E-1foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 17e+2foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -47)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .1)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 0.35)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 1e-10)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +32)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +17E-1)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 17e+2)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47 %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1 %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35 %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10 %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32 %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1 %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2 %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -47a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .1a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 0.35a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 1e-10a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +32a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +17E-1a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 17e+2a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -47e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .1e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 0.35e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 1e-10e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +32e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +17E-1e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 17e+2e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -47foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .1foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 0.35foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 1e-10foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +32foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +17E-1foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 17e+2foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -47)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .1)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 0.35)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 1e-10)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +32)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +17E-1)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " 17e+2)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\r\n\t em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\r\n\t em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\r\n\t em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\r\n\t em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\r\n\t em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\r\n\t em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\r\n\t em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\r\n\t ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\r\n\t ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\r\n\t ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\r\n\t ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\r\n\t ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\r\n\t ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\r\n\t ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\r\n\t px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\r\n\t px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\r\n\t px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\r\n\t px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\r\n\t px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\r\n\t px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\r\n\t px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\r\n\t in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\r\n\t in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\r\n\t in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\r\n\t in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\r\n\t in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\r\n\t in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\r\n\t in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\r\n\t cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\r\n\t cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\r\n\t cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\r\n\t cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\r\n\t cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\r\n\t cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\r\n\t cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\r\n\t mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\r\n\t mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\r\n\t mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\r\n\t mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\r\n\t mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\r\n\t mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\r\n\t mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\r\n\t pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\r\n\t pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\r\n\t pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\r\n\t pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\r\n\t pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\r\n\t pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\r\n\t pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\r\n\t pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\r\n\t pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\r\n\t pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\r\n\t pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\r\n\t pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\r\n\t pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\r\n\t pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\r\n\t %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\r\n\t %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\r\n\t %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\r\n\t %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\r\n\t %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\r\n\t %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\r\n\t %". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -47a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .1a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t 0.35a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t 1e-10a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +32a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +17E-1a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t 17e+2a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -47e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .1e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t 0.35e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t 1e-10e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +32e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +17E-1e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t 17e+2e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -47foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .1foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t 0.35foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t 1e-10foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +32foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +17E-1foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t 17e+2foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -47)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .1)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t 0.35)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t 1e-10)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +32)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +17E-1)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t 17e+2)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\fem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\fem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\fem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\fem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\fem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\fem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\fem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\fex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\fex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\fex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\fex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\fex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\fex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\fex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\fpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\fpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\fpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\fpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\fpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\fpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\fpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\fin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\fin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\fin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\fin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\fin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\fin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\fin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\fcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\fcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\fcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\fcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\fcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\fcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\fcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\fmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\fmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\fmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\fmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\fmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\fmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\fmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\fpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\fpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\fpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\fpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\fpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\fpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\fpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\fpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\fpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\fpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\fpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\fpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\fpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\fpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-47\f%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".1\f%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "0.35\f%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "1e-10\f%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+32\f%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+17E-1\f%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "17e+2\f%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-47a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.1a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f0.35a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f1e-10a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+32a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+17E-1a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f17e+2a". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-47e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.1e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f0.35e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f1e-10e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+32e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+17E-1e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f17e+2e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-47foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.1foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f0.35foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f1e-10foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+32foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+17E-1foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f17e+2foo". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-47)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.1)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f0.35)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f1e-10)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+32)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+17E-1)90". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f17e+2)90". This is a testharness.js-based test. PASS Test <length> valid value: -47 PASS Test <length> valid value: -47em
diff --git a/third_party/WebKit/LayoutTests/harness-tests/mojo-helpers.html b/third_party/WebKit/LayoutTests/harness-tests/mojo-helpers.html new file mode 100644 index 0000000..c16f63c --- /dev/null +++ b/third_party/WebKit/LayoutTests/harness-tests/mojo-helpers.html
@@ -0,0 +1,16 @@ +<!DOCTYPE html> +<script src="../resources/testharness.js"></script> +<script src="../resources/testharnessreport.js"></script> +<script src="../resources/mojo-helpers.js"></script> +<script> +'use strict'; + +// Verify that the mojo_test helper functions properly and Mojo bindings +// are available. +mojo_test(mojo => { + assert_true(mojo instanceof Object); + assert_true(mojo.core instanceof Object); + assert_true(mojo.router instanceof Object); + assert_true(mojo.serviceRegistry instanceof Object); +}, 'Mojo system APIs should be available to layout tests.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-valid-names-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-valid-names-expected.txt index 1a10ee5..41ab95fd 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-valid-names-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-valid-names-expected.txt
@@ -3,4 +3,7 @@ ALERT: SecurityError: Blocked a frame with origin "http://127.0.0.1:8000" from accessing a cross-origin frame. ALERT: SecurityError: Blocked a frame with origin "http://127.0.0.1:8000" from accessing a cross-origin frame. ALERT: SecurityError: Blocked a frame with origin "http://127.0.0.1:8000" from accessing a cross-origin frame. +ALERT: SecurityError: Blocked a frame with origin "http://127.0.0.1:8000" from accessing a cross-origin frame. +ALERT: SecurityError: Blocked a frame with origin "http://127.0.0.1:8000" from accessing a cross-origin frame. +ALERT: SecurityError: Blocked a frame with origin "http://127.0.0.1:8000" from accessing a cross-origin frame.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-valid-names.html b/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-valid-names.html index 2ed3d47..3180058 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-valid-names.html +++ b/third_party/WebKit/LayoutTests/http/tests/security/suborigins/suborigin-valid-names.html
@@ -21,6 +21,9 @@ "Foobar", "FOOBAR", "42", + "foo-bar", + "-foobar", + "foobar-" ]; var iframe;
diff --git a/third_party/WebKit/LayoutTests/inspector/layers/layer-canvas-log-expected.txt b/third_party/WebKit/LayoutTests/inspector/layers/layer-canvas-log-expected.txt index cf83f08..7ecd11a 100644 --- a/third_party/WebKit/LayoutTests/inspector/layers/layer-canvas-log-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/layers/layer-canvas-log-expected.txt
@@ -106,7 +106,7 @@ right : 300 top : 71 } - softClipEdgeStyle : false + softClipEdgeStyle : true } } 5 : {
diff --git a/third_party/WebKit/LayoutTests/paint/overflow/fixed-background-on-scroller-scroll-expected.html b/third_party/WebKit/LayoutTests/paint/overflow/fixed-background-on-scroller-scroll-expected.html new file mode 100644 index 0000000..4612456 --- /dev/null +++ b/third_party/WebKit/LayoutTests/paint/overflow/fixed-background-on-scroller-scroll-expected.html
@@ -0,0 +1,11 @@ +<!DOCTYPE html> +<style> +::-webkit-scrollbar { + display: none; +} +</style> +Tests painting of scrolled container with fixed background. +Passes if the background doesn't scroll. +<div style="width: 200px; height: 200px; overflow: scroll; background: linear-gradient(red, blue); background-attachment: fixed"> + <div style="height: 2000px"></div> +</div>
diff --git a/third_party/WebKit/LayoutTests/paint/overflow/fixed-background-on-scroller-scroll.html b/third_party/WebKit/LayoutTests/paint/overflow/fixed-background-on-scroller-scroll.html new file mode 100644 index 0000000..df70dcf --- /dev/null +++ b/third_party/WebKit/LayoutTests/paint/overflow/fixed-background-on-scroller-scroll.html
@@ -0,0 +1,16 @@ +<!DOCTYPE html> +<style> +::-webkit-scrollbar { + display: none; +} +</style> +Tests painting of scrolled container with fixed background. +Passes if the background doesn't scroll. +<div id="container" style="width: 200px; height: 200px; overflow: scroll; background: linear-gradient(red, blue); background-attachment: fixed"> + <div style="height: 2000px"></div> +</div> +<script> +onload = function() { + container.scrollTop = 1000; +}; +</script>
diff --git a/third_party/WebKit/LayoutTests/platform/android/css3/filters/effect-reference-composite-expected.txt b/third_party/WebKit/LayoutTests/platform/android/css3/filters/effect-reference-composite-expected.txt new file mode 100644 index 0000000..ff45b3943 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/css3/filters/effect-reference-composite-expected.txt
@@ -0,0 +1,142 @@ +CONSOLE ERROR: line 61: Error: Invalid value for <feComposite> attribute y="20\"" +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutBlockFlow {HTML} at (0,0) size 800x600 + LayoutBlockFlow {BODY} at (8,8) size 784x584 + LayoutSVGRoot {svg} at (8,118) size 0x0 + LayoutSVGHiddenContainer {defs} at (0,0) size 0x0 + LayoutSVGResourceFilter {filter} [id="over"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="OVER"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="in"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="IN"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="out"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="OUT"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="atop"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="ATOP"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="xor"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="XOR"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="arithmetic"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="ARITHMETIC" k1="0.00" k2="1.00" k3="1.00" k4="0.00"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="over-subregion"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="OVER"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="in-subregion"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="IN"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="out-subregion"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="OUT"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="atop-subregion"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="ATOP"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="xor-subregion"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="XOR"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="arithmetic-subregion"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="ARITHMETIC" k1="0.00" k2="1.00" k3="1.00" k4="0.00"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutText {#text} at (0,95) size 4x19 + text run at (0,95) width 4: " " + LayoutText {#text} at (0,0) size 0x0 + LayoutText {#text} at (184,95) size 4x19 + text run at (184,95) width 4: " " + LayoutText {#text} at (368,95) size 4x19 + text run at (368,95) width 4: " " + LayoutText {#text} at (552,95) size 4x19 + text run at (552,95) width 4: " " + LayoutText {#text} at (736,95) size 4x19 + text run at (736,95) width 4: " " + LayoutText {#text} at (180,210) size 4x19 + text run at (180,210) width 4: " " + LayoutText {#text} at (364,210) size 4x19 + text run at (364,210) width 4: " " + LayoutText {#text} at (548,210) size 4x19 + text run at (548,210) width 4: " " + LayoutText {#text} at (732,210) size 4x19 + text run at (732,210) width 4: " " + LayoutText {#text} at (180,325) size 4x19 + text run at (180,325) width 4: " " + LayoutText {#text} at (364,325) size 4x19 + text run at (364,325) width 4: " " + LayoutText {#text} at (548,325) size 4x19 + text run at (548,325) width 4: " " + LayoutText {#text} at (0,0) size 0x0 +layer at (22,18) size 160x90 + LayoutImage {IMG} at (14,10) size 160x90 +layer at (206,18) size 160x90 + LayoutImage {IMG} at (198,10) size 160x90 +layer at (390,18) size 160x90 + LayoutImage {IMG} at (382,10) size 160x90 +layer at (574,18) size 160x90 + LayoutImage {IMG} at (566,10) size 160x90 +layer at (18,133) size 160x90 + LayoutImage {IMG} at (10,125) size 160x90 +layer at (202,133) size 160x90 + LayoutImage {IMG} at (194,125) size 160x90 +layer at (386,133) size 160x90 + LayoutImage {IMG} at (378,125) size 160x90 +layer at (570,133) size 160x90 + LayoutImage {IMG} at (562,125) size 160x90 +layer at (18,248) size 160x90 + LayoutImage {IMG} at (10,240) size 160x90 +layer at (202,248) size 160x90 + LayoutImage {IMG} at (194,240) size 160x90 +layer at (386,248) size 160x90 + LayoutImage {IMG} at (378,240) size 160x90 +layer at (570,248) size 160x90 + LayoutImage {IMG} at (562,240) size 160x90
diff --git a/third_party/WebKit/LayoutTests/platform/android/css3/filters/effect-reference-composite-hw-expected.txt b/third_party/WebKit/LayoutTests/platform/android/css3/filters/effect-reference-composite-hw-expected.txt new file mode 100644 index 0000000..ff45b3943 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/css3/filters/effect-reference-composite-hw-expected.txt
@@ -0,0 +1,142 @@ +CONSOLE ERROR: line 61: Error: Invalid value for <feComposite> attribute y="20\"" +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutBlockFlow {HTML} at (0,0) size 800x600 + LayoutBlockFlow {BODY} at (8,8) size 784x584 + LayoutSVGRoot {svg} at (8,118) size 0x0 + LayoutSVGHiddenContainer {defs} at (0,0) size 0x0 + LayoutSVGResourceFilter {filter} [id="over"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="OVER"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="in"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="IN"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="out"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="OUT"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="atop"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="ATOP"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="xor"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="XOR"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="arithmetic"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="ARITHMETIC" k1="0.00" k2="1.00" k3="1.00" k4="0.00"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="over-subregion"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="OVER"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="in-subregion"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="IN"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="out-subregion"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="OUT"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="atop-subregion"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="ATOP"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="xor-subregion"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="XOR"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutSVGResourceFilter {filter} [id="arithmetic-subregion"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] + [feComposite operation="ARITHMETIC" k1="0.00" k2="1.00" k3="1.00" k4="0.00"] + [feOffset dx="10.00" dy="10.00"] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00"] + [SourceGraphic] + LayoutText {#text} at (0,95) size 4x19 + text run at (0,95) width 4: " " + LayoutText {#text} at (0,0) size 0x0 + LayoutText {#text} at (184,95) size 4x19 + text run at (184,95) width 4: " " + LayoutText {#text} at (368,95) size 4x19 + text run at (368,95) width 4: " " + LayoutText {#text} at (552,95) size 4x19 + text run at (552,95) width 4: " " + LayoutText {#text} at (736,95) size 4x19 + text run at (736,95) width 4: " " + LayoutText {#text} at (180,210) size 4x19 + text run at (180,210) width 4: " " + LayoutText {#text} at (364,210) size 4x19 + text run at (364,210) width 4: " " + LayoutText {#text} at (548,210) size 4x19 + text run at (548,210) width 4: " " + LayoutText {#text} at (732,210) size 4x19 + text run at (732,210) width 4: " " + LayoutText {#text} at (180,325) size 4x19 + text run at (180,325) width 4: " " + LayoutText {#text} at (364,325) size 4x19 + text run at (364,325) width 4: " " + LayoutText {#text} at (548,325) size 4x19 + text run at (548,325) width 4: " " + LayoutText {#text} at (0,0) size 0x0 +layer at (22,18) size 160x90 + LayoutImage {IMG} at (14,10) size 160x90 +layer at (206,18) size 160x90 + LayoutImage {IMG} at (198,10) size 160x90 +layer at (390,18) size 160x90 + LayoutImage {IMG} at (382,10) size 160x90 +layer at (574,18) size 160x90 + LayoutImage {IMG} at (566,10) size 160x90 +layer at (18,133) size 160x90 + LayoutImage {IMG} at (10,125) size 160x90 +layer at (202,133) size 160x90 + LayoutImage {IMG} at (194,125) size 160x90 +layer at (386,133) size 160x90 + LayoutImage {IMG} at (378,125) size 160x90 +layer at (570,133) size 160x90 + LayoutImage {IMG} at (562,125) size 160x90 +layer at (18,248) size 160x90 + LayoutImage {IMG} at (10,240) size 160x90 +layer at (202,248) size 160x90 + LayoutImage {IMG} at (194,240) size 160x90 +layer at (386,248) size 160x90 + LayoutImage {IMG} at (378,240) size 160x90 +layer at (570,248) size 160x90 + LayoutImage {IMG} at (562,240) size 160x90
diff --git a/third_party/WebKit/LayoutTests/platform/android/css3/filters/nested-filter-expected.png b/third_party/WebKit/LayoutTests/platform/android/css3/filters/nested-filter-expected.png new file mode 100644 index 0000000..e611045 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/css3/filters/nested-filter-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/borders/border-image-outset-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/borders/border-image-outset-expected.png new file mode 100644 index 0000000..c15d766f --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/borders/border-image-outset-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/borders/border-image-outset-in-shorthand-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/borders/border-image-outset-in-shorthand-expected.png new file mode 100644 index 0000000..c15d766f --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/borders/border-image-outset-in-shorthand-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/borders/border-image-outset-split-inline-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/borders/border-image-outset-split-inline-expected.png new file mode 100644 index 0000000..017be59 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/borders/border-image-outset-split-inline-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/borders/border-image-slice-constrained-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/borders/border-image-slice-constrained-expected.png new file mode 100644 index 0000000..2f3f5c8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/borders/border-image-slice-constrained-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/borders/border-radius-percent-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/borders/border-radius-percent-expected.png new file mode 100644 index 0000000..059ce8e6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/borders/border-radius-percent-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux-x86/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png similarity index 100% copy from third_party/WebKit/LayoutTests/platform/linux-x86/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png copy to third_party/WebKit/LayoutTests/platform/android/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/css/resize-corner-tracking-transformed-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/css/resize-corner-tracking-transformed-expected.png new file mode 100644 index 0000000..d1b107a --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/css/resize-corner-tracking-transformed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/forms/placeholder-position-expected.png new file mode 100644 index 0000000..810b08c4 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/forms/placeholder-position-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/forms/placeholder-position-expected.txt b/third_party/WebKit/LayoutTests/platform/android/fast/forms/placeholder-position-expected.txt new file mode 100644 index 0000000..2cf28e6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/forms/placeholder-position-expected.txt
@@ -0,0 +1,134 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutBlockFlow {HTML} at (0,0) size 800x600 + LayoutBlockFlow {BODY} at (8,8) size 784x584 + LayoutTextControl {INPUT} at (0,0) size 156x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutFlexibleBox {DIV} at (3,3) size 150x16 + LayoutBlockFlow {DIV} at (0,2.50) size 1x11 + LayoutBlockFlow {DIV} at (1,0) size 136x16 + LayoutBR {BR} at (156,16) size 0x0 + LayoutTextControl {INPUT} at (0,22) size 154x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutBR {BR} at (154,38) size 0x0 + LayoutTextControl {INPUT} at (0,44) size 156x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutFlexibleBox {DIV} at (3,3) size 150x16 + LayoutBlockFlow {DIV} at (0,2.50) size 1x11 + LayoutBlockFlow {DIV} at (1,0) size 136x16 + LayoutBR {BR} at (156,60) size 0x0 + LayoutTextControl {INPUT} at (0,66) size 156x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutFlexibleBox {DIV} at (3,3) size 150x16 + LayoutBlockFlow {DIV} at (2,1.50) size 13x13 + LayoutBlockFlow {DIV} at (18,0) size 119x16 + LayoutBR {BR} at (156,82) size 0x0 + LayoutBR {BR} at (179,124) size 0x0 + LayoutTextControl {INPUT} at (0,124) size 154x36 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutBR {BR} at (154,140) size 0x0 + LayoutBR {BR} at (179,209) size 0x0 + LayoutTextControl {INPUT} at (5,214) size 183x29 [bgcolor=#FFFFFF] [border: (5px solid #000000)] + LayoutBR {BR} at (193,234) size 0x0 + LayoutTextControl {INPUT} at (0,248) size 154x31 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (154,253) size 4x19 + text run at (154,253) width 4: " " + LayoutTextControl {INPUT} at (158,248) size 154x31 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (312,253) size 4x19 + text run at (312,253) width 4: " " + LayoutBR {BR} at (316,268) size 0x0 + LayoutTextControl {INPUT} at (0,279) size 154x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (154,280) size 4x19 + text run at (154,280) width 4: " " + LayoutTextControl {INPUT} at (158,279) size 154x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (312,280) size 4x19 + text run at (312,280) width 4: " " + LayoutTextControl {INPUT} at (316,279) size 154x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (470,280) size 4x19 + text run at (470,280) width 4: " " + LayoutBR {BR} at (474,295) size 0x0 + LayoutBR {BR} at (154,331) size 0x0 +layer at (12,11) size 136x16 + LayoutBlockFlow {DIV} at (4,3) size 136x16 [color=#A9A9A9] + LayoutText {#text} at (0,0) size 66x16 + text run at (0,0) width 66: "placeholder" +layer at (12,11) size 136x16 + LayoutBlockFlow {DIV} at (0,0) size 136x16 +layer at (10,33) size 150x16 + LayoutBlockFlow {DIV} at (2,3) size 150x16 [color=#A9A9A9] + LayoutText {#text} at (0,0) size 66x16 + text run at (0,0) width 66: "placeholder" +layer at (10,33) size 150x16 + LayoutBlockFlow {DIV} at (2,3) size 150x16 +layer at (12,55) size 136x16 + LayoutBlockFlow {DIV} at (4,3) size 136x16 [color=#A9A9A9] + LayoutText {#text} at (70,0) size 66x16 + text run at (70,0) width 66: "placeholder" +layer at (12,55) size 136x16 + LayoutBlockFlow {DIV} at (0,0) size 136x16 +layer at (29,77) size 119x16 + LayoutBlockFlow {DIV} at (21,3) size 119x16 [color=#A9A9A9] + LayoutText {#text} at (0,0) size 66x16 + text run at (0,0) width 66: "placeholder" +layer at (29,77) size 119x16 + LayoutBlockFlow {DIV} at (0,0) size 119x16 +layer at (8,96) size 179x36 clip at (9,97) size 177x34 + LayoutTextControl {TEXTAREA} at (0,88) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 175x16 [color=#A9A9A9] + LayoutText {#text} at (0,0) size 88x16 + text run at (0,0) width 88: "placeholder" + LayoutBlockFlow {DIV} at (3,3) size 175x16 +layer at (10,135) size 150x16 + LayoutBlockFlow {DIV} at (2,3) size 150x16 [color=#A9A9A9] + LayoutText {#text} at (0,0) size 66x16 + text run at (0,0) width 66: "placeholder" +layer at (10,135) size 150x16 + LayoutBlockFlow {DIV} at (2,3) size 150x16 +layer at (8,168) size 179x49 clip at (9,169) size 177x47 + LayoutTextControl {TEXTAREA} at (0,160) size 179x49 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,16) size 175x16 [color=#A9A9A9] + LayoutText {#text} at (0,0) size 88x16 + text run at (0,0) width 88: "placeholder" + LayoutBlockFlow {DIV} at (3,16) size 175x16 +layer at (18,228) size 173x17 + LayoutBlockFlow {DIV} at (5,6) size 173x17 [color=#A9A9A9] + LayoutText {#text} at (0,0) size 75x17 + text run at (0,0) width 75: "placeholder" +layer at (18,228) size 173x17 + LayoutBlockFlow {DIV} at (5,6) size 173x17 +layer at (10,259) size 150x25 + LayoutBlockFlow {DIV} at (2,3) size 150x25 + LayoutText {#text} at (0,4) size 32x16 + text run at (0,4) width 32: "Value" +layer at (168,259) size 150x25 + LayoutBlockFlow {DIV} at (2,3) size 150x25 [color=#A9A9A9] + LayoutText {#text} at (0,4) size 66x16 + text run at (0,4) width 66: "placeholder" +layer at (168,259) size 150x25 + LayoutBlockFlow {DIV} at (2,3) size 150x25 +layer at (10,290) size 150x16 + LayoutBlockFlow {DIV} at (2,3) size 150x16 + LayoutText {#text} at (59,0) size 32x16 + text run at (59,0) width 32: "Value" +layer at (168,290) size 150x16 + LayoutBlockFlow {DIV} at (2,3) size 150x16 [color=#A9A9A9] + LayoutText {#text} at (42,0) size 66x16 + text run at (42,0) width 66: "placeholder" +layer at (168,290) size 150x16 + LayoutBlockFlow {DIV} at (2,3) size 150x16 +layer at (326,290) size 150x16 + LayoutBlockFlow {DIV} at (2,3) size 150x16 [color=#A9A9A9] + LayoutText {#text} at (42,0) size 66x16 + text run at (42,0) width 66: "placeholder" +layer at (326,290) size 150x16 + LayoutBlockFlow {DIV} at (2,3) size 150x16 +layer at (149,15) size 9x9 transparent + LayoutBlockFlow {DIV} at (138,3.50) size 9x9 +layer at (149,59) size 9x9 transparent + LayoutBlockFlow {DIV} at (138,3.50) size 9x9 +layer at (149,81) size 9x9 transparent + LayoutBlockFlow {DIV} at (138,3.50) size 9x9 +layer at (8,309) size 154x36 + LayoutTextControl {INPUT} at (0,301) size 154x36 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] +layer at (10,326) size 150x16 + LayoutBlockFlow {DIV} at (2,17) size 150x16 [color=#A9A9A9] + LayoutText {#text} at (0,0) size 66x16 + text run at (0,0) width 66: "placeholder" +layer at (10,326) size 150x16 + LayoutBlockFlow {DIV} at (2,17) size 150x16
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/forms/search/search-vertical-alignment-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/forms/search/search-vertical-alignment-expected.png new file mode 100644 index 0000000..d3494c8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/forms/search/search-vertical-alignment-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/forms/search/search-vertical-alignment-expected.txt b/third_party/WebKit/LayoutTests/platform/android/fast/forms/search/search-vertical-alignment-expected.txt new file mode 100644 index 0000000..029445bb --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/forms/search/search-vertical-alignment-expected.txt
@@ -0,0 +1,69 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutBlockFlow {HTML} at (0,0) size 800x600 + LayoutBlockFlow {BODY} at (8,8) size 784x576 + LayoutBlockFlow {P} at (0,0) size 784x40 + LayoutText {#text} at (0,0) size 783x39 + text run at (0,0) width 397: "Test that search field text is vertically centered if the search field is " + text run at (396,0) width 387: "taller than the text. In each of the following pairs of a search field" + text run at (0,20) width 26: "and " + text run at (26,20) width 338: "a text field, the vertical position of the text should be the " + text run at (364,20) width 115: "same in both fields." + LayoutBlockFlow {P} at (0,56) size 784x45 + LayoutTextControl {INPUT} at (0,0) size 156x45 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutFlexibleBox {DIV} at (3,3) size 150x39 + LayoutBlockFlow {DIV} at (2,13) size 13x13 + LayoutBlockFlow {DIV} at (18,11.50) size 119x16 + LayoutText {#text} at (156,12) size 4x19 + text run at (156,12) width 4: " " + LayoutTextControl {INPUT} at (160,0) size 154x45 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (0,0) size 0x0 + LayoutBlockFlow {P} at (0,117) size 784x20 + LayoutTextControl {INPUT} at (0,2) size 156x16 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutFlexibleBox {DIV} at (3,0) size 150x16 + LayoutBlockFlow {DIV} at (2,1.50) size 13x13 + LayoutBlockFlow {DIV} at (18,0) size 119x16 + LayoutText {#text} at (156,0) size 4x19 + text run at (156,0) width 4: " " + LayoutTextControl {INPUT} at (160,2) size 154x16 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (0,0) size 0x0 + LayoutBlockFlow {P} at (0,153) size 784x21 + LayoutTextControl {INPUT} at (0,0) size 156x12 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutFlexibleBox {DIV} at (3,0) size 150x12 + LayoutBlockFlow {DIV} at (2,0) size 13x13 + LayoutBlockFlow {DIV} at (18,3) size 119x6 + LayoutText {#text} at (156,1) size 4x19 + text run at (156,1) width 4: " " + LayoutTextControl {INPUT} at (160,0) size 154x12 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (0,0) size 0x0 +layer at (29,79) size 119x16 + LayoutBlockFlow {DIV} at (0,0) size 119x16 + LayoutText {#text} at (0,0) size 24x16 + text run at (0,0) width 24: "Text" +layer at (170,79) size 150x16 + LayoutBlockFlow {DIV} at (2,14.50) size 150x16 + LayoutText {#text} at (0,0) size 24x16 + text run at (0,0) width 24: "Text" +layer at (29,127) size 119x16 + LayoutBlockFlow {DIV} at (0,0) size 119x16 + LayoutText {#text} at (0,0) size 24x16 + text run at (0,0) width 24: "Text" +layer at (170,127) size 150x16 + LayoutBlockFlow {DIV} at (2,0) size 150x16 + LayoutText {#text} at (0,0) size 24x16 + text run at (0,0) width 24: "Text" +layer at (29,164) size 119x6 scrollHeight 16 + LayoutBlockFlow {DIV} at (0,0) size 119x6 + LayoutText {#text} at (0,0) size 24x16 + text run at (0,0) width 24: "Text" +layer at (170,164) size 150x6 scrollHeight 16 + LayoutBlockFlow {DIV} at (2,3) size 150x6 + LayoutText {#text} at (0,0) size 24x16 + text run at (0,0) width 24: "Text" +layer at (149,82) size 9x9 transparent + LayoutBlockFlow {DIV} at (138,15) size 9x9 +layer at (149,131) size 9x9 transparent + LayoutBlockFlow {DIV} at (138,3.50) size 9x9 +layer at (149,163) size 9x9 transparent + LayoutBlockFlow {DIV} at (138,1.50) size 9x9
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/forms/text/input-placeholder-paint-order-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/forms/text/input-placeholder-paint-order-expected.png new file mode 100644 index 0000000..eaa69d4 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/forms/text/input-placeholder-paint-order-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/forms/text/textfield-overflow-by-value-update-expected.txt b/third_party/WebKit/LayoutTests/platform/android/fast/forms/text/textfield-overflow-by-value-update-expected.txt new file mode 100644 index 0000000..082875d5 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/forms/text/textfield-overflow-by-value-update-expected.txt
@@ -0,0 +1,12 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x51 + LayoutBlockFlow {HTML} at (0,0) size 800x51 + LayoutBlockFlow {BODY} at (8,8) size 784x35 + LayoutTextControl {INPUT} at (0,0) size 100x2 [bgcolor=#FFFFFF] + LayoutText {#text} at (0,0) size 0x0 + LayoutText {#text} at (0,0) size 0x0 +layer at (8,9) size 100x0 scrollHeight 37 + LayoutBlockFlow {DIV} at (0,1) size 100x0 + LayoutText {#text} at (0,0) size 67x36 + text run at (0,0) width 67: "FAIL"
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/forms/text/textfield-overflow-expected.txt b/third_party/WebKit/LayoutTests/platform/android/fast/forms/text/textfield-overflow-expected.txt new file mode 100644 index 0000000..f19c150 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/forms/text/textfield-overflow-expected.txt
@@ -0,0 +1,11 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutBlockFlow {HTML} at (0,0) size 800x600 + LayoutBlockFlow {BODY} at (8,8) size 784x584 + LayoutTextControl {INPUT} at (0,0) size 154x10 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (0,0) size 0x0 + LayoutText {#text} at (0,0) size 0x0 +layer at (10,11) size 150x4 scrollHeight 16 + LayoutBlockFlow {DIV} at (2,3) size 150x4 +caret: position 0 of child 0 {DIV} of {#document-fragment} of child 1 {INPUT} of body
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/frames/frame-set-scaling-rotate-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/frames/frame-set-scaling-rotate-expected.png new file mode 100644 index 0000000..7996b28 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/frames/frame-set-scaling-rotate-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/frames/frame-set-scaling-skew-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/frames/frame-set-scaling-skew-expected.png new file mode 100644 index 0000000..95c96695 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/frames/frame-set-scaling-skew-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/images/exif-orientation-height-image-document-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/images/exif-orientation-height-image-document-expected.png new file mode 100644 index 0000000..3ca1fc7 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/images/exif-orientation-height-image-document-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/js/mozilla/strict/15.4.5.1-expected.txt b/third_party/WebKit/LayoutTests/platform/android/fast/js/mozilla/strict/15.4.5.1-expected.txt new file mode 100644 index 0000000..d2fac60 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/js/mozilla/strict/15.4.5.1-expected.txt
@@ -0,0 +1,9 @@ +FAIL 'use strict'; var a = arr(); a.length = 2; a should throw an instance of TypeError +PASS true === true +FAIL 'use strict'; var a = addx(arr()); a.length = 2; a should throw an instance of TypeError +PASS true === true + PASSED! +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/overflow/overflow-update-transform-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/overflow/overflow-update-transform-expected.png new file mode 100644 index 0000000..3ff86449 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/overflow/overflow-update-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/parser/changing-attrbutes-crash-expected.txt b/third_party/WebKit/LayoutTests/platform/android/fast/parser/changing-attrbutes-crash-expected.txt new file mode 100644 index 0000000..551c6d5 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/parser/changing-attrbutes-crash-expected.txt
@@ -0,0 +1,2 @@ +CONSOLE ERROR: line 1: Error: Invalid value for <polygon> attribute points="foo" +This test passes if it doesn't crash.
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/repaint/change-text-content-and-background-color-expected.txt b/third_party/WebKit/LayoutTests/platform/android/fast/repaint/change-text-content-and-background-color-expected.txt new file mode 100644 index 0000000..61e7d0f --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/repaint/change-text-content-and-background-color-expected.txt
@@ -0,0 +1,26 @@ +{ + "bounds": [800, 600], + "children": [ + { + "bounds": [800, 600], + "contentsOpaque": true, + "drawsContent": true, + "repaintRects": [ + [30, 30, 200, 24], + [30, 30, 45, 23], + [30, 30, 41, 23], + [8, 8, 244, 68] + ], + "paintInvalidationClients": [ + "RootInlineBox", + "InlineTextBox ''", + "LayoutTextControl (positioned) INPUT id='input'", + "LayoutBlockFlow DIV id='inner-editor'", + "RootInlineBox", + "LayoutText #text", + "InlineTextBox 'NEW'" + ] + } + ] +} +
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/repaint/multi-layout-one-frame-expected.txt b/third_party/WebKit/LayoutTests/platform/android/fast/repaint/multi-layout-one-frame-expected.txt new file mode 100644 index 0000000..fd9c099 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/repaint/multi-layout-one-frame-expected.txt
@@ -0,0 +1,33 @@ +{ + "bounds": [800, 600], + "children": [ + { + "bounds": [800, 600], + "contentsOpaque": true, + "drawsContent": true, + "repaintRects": [ + [168, 11, 150, 16], + [168, 11, 53, 16], + [168, 11, 45, 16], + [10, 11, 150, 16], + [10, 11, 53, 16], + [10, 11, 45, 16] + ], + "paintInvalidationClients": [ + "RootInlineBox", + "InlineTextBox ''", + "RootInlineBox", + "InlineTextBox ''", + "LayoutBlockFlow DIV id='inner-editor'", + "RootInlineBox", + "LayoutText #text", + "InlineTextBox 'PASSED'", + "LayoutBlockFlow DIV id='inner-editor'", + "RootInlineBox", + "LayoutText #text", + "InlineTextBox 'PASSED'" + ] + } + ] +} +
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/repaint/subtree-root-skipped-expected.txt b/third_party/WebKit/LayoutTests/platform/android/fast/repaint/subtree-root-skipped-expected.txt new file mode 100644 index 0000000..aa5ec32 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/repaint/subtree-root-skipped-expected.txt
@@ -0,0 +1,27 @@ +{ + "bounds": [800, 600], + "children": [ + { + "bounds": [800, 600], + "contentsOpaque": true, + "drawsContent": true, + "repaintRects": [ + [10, 11, 150, 16], + [10, 11, 35, 16], + [10, 11, 27, 16], + [8, 298, 10, 10], + [8, 288, 10, 20] + ], + "paintInvalidationClients": [ + "RootInlineBox", + "InlineTextBox ''", + "LayoutBlockFlow DIV id='inner-editor'", + "RootInlineBox", + "LayoutText #text", + "InlineTextBox 'PASS'", + "LayoutBlockFlow (positioned) DIV id='div'" + ] + } + ] +} +
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/replaced/selection-rect-transform-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/replaced/selection-rect-transform-expected.png new file mode 100644 index 0000000..d169599 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/replaced/selection-rect-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/svg/whitespace-length-expected.txt b/third_party/WebKit/LayoutTests/platform/android/fast/svg/whitespace-length-expected.txt new file mode 100644 index 0000000..53a75af --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/svg/whitespace-length-expected.txt
@@ -0,0 +1,2537 @@ +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -47a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .1a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 0.35a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 1e-10a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +32a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +17E-1a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 17e+2a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -47e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .1e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 0.35e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 1e-10e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +32e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +17E-1e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 17e+2e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -47foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .1foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 0.35foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 1e-10foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +32foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +17E-1foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 17e+2foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -47)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .1)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 0.35)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 1e-10)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +32)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +17E-1)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 17e+2)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47 %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1 %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35 %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10 %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32 %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1 %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2 %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -47a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .1a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 0.35a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 1e-10a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +32a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +17E-1a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 17e+2a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -47e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .1e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 0.35e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 1e-10e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +32e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +17E-1e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 17e+2e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -47foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .1foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 0.35foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 1e-10foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +32foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +17E-1foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 17e+2foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -47)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .1)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 0.35)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 1e-10)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +32)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +17E-1)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" 17e+2)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\r\n\t %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\r\n\t %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\r\n\t %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\r\n\t %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\r\n\t %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\r\n\t %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\r\n\t %" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -47a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .1a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 0.35a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 1e-10a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +32a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +17E-1a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 17e+2a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -47e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .1e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 0.35e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 1e-10e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +32e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +17E-1e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 17e+2e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -47foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .1foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 0.35foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 1e-10foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +32foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +17E-1foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 17e+2foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -47)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .1)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 0.35)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 1e-10)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +32)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +17E-1)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t 17e+2)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\fem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\fem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\fem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\fem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\fem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\fem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\fem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\fex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\fex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\fex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\fex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\fex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\fex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\fex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\fpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\fpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\fpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\fpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\fpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\fpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\fpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\fin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\fin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\fin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\fin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\fin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\fin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\fin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\fcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\fcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\fcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\fcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\fcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\fcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\fcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\fmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\fmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\fmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\fmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\fmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\fmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\fmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\fpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\fpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\fpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\fpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\fpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\fpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\fpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\fpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\fpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\fpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\fpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\fpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\fpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\fpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-47\f%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".1\f%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="0.35\f%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="1e-10\f%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+32\f%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+17E-1\f%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="17e+2\f%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-47a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.1a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f0.35a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f1e-10a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+32a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+17E-1a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f17e+2a" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-47e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.1e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f0.35e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f1e-10e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+32e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+17E-1e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f17e+2e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-47foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.1foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f0.35foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f1e-10foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+32foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+17E-1foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f17e+2foo" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-47)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.1)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f0.35)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f1e-10)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+32)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+17E-1)90" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f17e+2)90" +This is a testharness.js-based test. +PASS Test <length> valid value: -47 +PASS Test <length> valid value: -47em +PASS Test <length> valid value: -47ex +PASS Test <length> valid value: -47px +PASS Test <length> valid value: -47in +PASS Test <length> valid value: -47cm +PASS Test <length> valid value: -47mm +PASS Test <length> valid value: -47pt +PASS Test <length> valid value: -47pc +PASS Test <length> valid value: -47% +PASS Test <length> valid value: .1 +PASS Test <length> valid value: .1em +PASS Test <length> valid value: .1ex +PASS Test <length> valid value: .1px +PASS Test <length> valid value: .1in +PASS Test <length> valid value: .1cm +PASS Test <length> valid value: .1mm +PASS Test <length> valid value: .1pt +PASS Test <length> valid value: .1pc +PASS Test <length> valid value: .1% +PASS Test <length> valid value: 0.35 +PASS Test <length> valid value: 0.35em +PASS Test <length> valid value: 0.35ex +PASS Test <length> valid value: 0.35px +PASS Test <length> valid value: 0.35in +PASS Test <length> valid value: 0.35cm +PASS Test <length> valid value: 0.35mm +PASS Test <length> valid value: 0.35pt +PASS Test <length> valid value: 0.35pc +PASS Test <length> valid value: 0.35% +PASS Test <length> valid value: 1e-10 +PASS Test <length> valid value: 1e-10em +PASS Test <length> valid value: 1e-10ex +PASS Test <length> valid value: 1e-10px +PASS Test <length> valid value: 1e-10in +PASS Test <length> valid value: 1e-10cm +PASS Test <length> valid value: 1e-10mm +PASS Test <length> valid value: 1e-10pt +PASS Test <length> valid value: 1e-10pc +PASS Test <length> valid value: 1e-10% +PASS Test <length> valid value: +32 +PASS Test <length> valid value: +32em +PASS Test <length> valid value: +32ex +PASS Test <length> valid value: +32px +PASS Test <length> valid value: +32in +PASS Test <length> valid value: +32cm +PASS Test <length> valid value: +32mm +PASS Test <length> valid value: +32pt +PASS Test <length> valid value: +32pc +PASS Test <length> valid value: +32% +PASS Test <length> valid value: +17E-1 +PASS Test <length> valid value: +17E-1em +PASS Test <length> valid value: +17E-1ex +PASS Test <length> valid value: +17E-1px +PASS Test <length> valid value: +17E-1in +PASS Test <length> valid value: +17E-1cm +PASS Test <length> valid value: +17E-1mm +PASS Test <length> valid value: +17E-1pt +PASS Test <length> valid value: +17E-1pc +PASS Test <length> valid value: +17E-1% +PASS Test <length> valid value: 17e+2 +PASS Test <length> valid value: 17e+2em +PASS Test <length> valid value: 17e+2ex +PASS Test <length> valid value: 17e+2px +PASS Test <length> valid value: 17e+2in +PASS Test <length> valid value: 17e+2cm +PASS Test <length> valid value: 17e+2mm +PASS Test <length> valid value: 17e+2pt +PASS Test <length> valid value: 17e+2pc +PASS Test <length> valid value: 17e+2% +PASS Test <length> valid value: -47 +PASS Test <length> valid value: -47em +PASS Test <length> valid value: -47ex +PASS Test <length> valid value: -47px +PASS Test <length> valid value: -47in +PASS Test <length> valid value: -47cm +PASS Test <length> valid value: -47mm +PASS Test <length> valid value: -47pt +PASS Test <length> valid value: -47pc +PASS Test <length> valid value: -47% +PASS Test <length> valid value: .1 +PASS Test <length> valid value: .1em +PASS Test <length> valid value: .1ex +PASS Test <length> valid value: .1px +PASS Test <length> valid value: .1in +PASS Test <length> valid value: .1cm +PASS Test <length> valid value: .1mm +PASS Test <length> valid value: .1pt +PASS Test <length> valid value: .1pc +PASS Test <length> valid value: .1% +PASS Test <length> valid value: 0.35 +PASS Test <length> valid value: 0.35em +PASS Test <length> valid value: 0.35ex +PASS Test <length> valid value: 0.35px +PASS Test <length> valid value: 0.35in +PASS Test <length> valid value: 0.35cm +PASS Test <length> valid value: 0.35mm +PASS Test <length> valid value: 0.35pt +PASS Test <length> valid value: 0.35pc +PASS Test <length> valid value: 0.35% +PASS Test <length> valid value: 1e-10 +PASS Test <length> valid value: 1e-10em +PASS Test <length> valid value: 1e-10ex +PASS Test <length> valid value: 1e-10px +PASS Test <length> valid value: 1e-10in +PASS Test <length> valid value: 1e-10cm +PASS Test <length> valid value: 1e-10mm +PASS Test <length> valid value: 1e-10pt +PASS Test <length> valid value: 1e-10pc +PASS Test <length> valid value: 1e-10% +PASS Test <length> valid value: +32 +PASS Test <length> valid value: +32em +PASS Test <length> valid value: +32ex +PASS Test <length> valid value: +32px +PASS Test <length> valid value: +32in +PASS Test <length> valid value: +32cm +PASS Test <length> valid value: +32mm +PASS Test <length> valid value: +32pt +PASS Test <length> valid value: +32pc +PASS Test <length> valid value: +32% +PASS Test <length> valid value: +17E-1 +PASS Test <length> valid value: +17E-1em +PASS Test <length> valid value: +17E-1ex +PASS Test <length> valid value: +17E-1px +PASS Test <length> valid value: +17E-1in +PASS Test <length> valid value: +17E-1cm +PASS Test <length> valid value: +17E-1mm +PASS Test <length> valid value: +17E-1pt +PASS Test <length> valid value: +17E-1pc +PASS Test <length> valid value: +17E-1% +PASS Test <length> valid value: 17e+2 +PASS Test <length> valid value: 17e+2em +PASS Test <length> valid value: 17e+2ex +PASS Test <length> valid value: 17e+2px +PASS Test <length> valid value: 17e+2in +PASS Test <length> valid value: 17e+2cm +PASS Test <length> valid value: 17e+2mm +PASS Test <length> valid value: 17e+2pt +PASS Test <length> valid value: 17e+2pc +PASS Test <length> valid value: 17e+2% +PASS Test <length> valid value: -47 +PASS Test <length> valid value: -47em +PASS Test <length> valid value: -47ex +PASS Test <length> valid value: -47px +PASS Test <length> valid value: -47in +PASS Test <length> valid value: -47cm +PASS Test <length> valid value: -47mm +PASS Test <length> valid value: -47pt +PASS Test <length> valid value: -47pc +PASS Test <length> valid value: -47% +PASS Test <length> valid value: .1 +PASS Test <length> valid value: .1em +PASS Test <length> valid value: .1ex +PASS Test <length> valid value: .1px +PASS Test <length> valid value: .1in +PASS Test <length> valid value: .1cm +PASS Test <length> valid value: .1mm +PASS Test <length> valid value: .1pt +PASS Test <length> valid value: .1pc +PASS Test <length> valid value: .1% +PASS Test <length> valid value: 0.35 +PASS Test <length> valid value: 0.35em +PASS Test <length> valid value: 0.35ex +PASS Test <length> valid value: 0.35px +PASS Test <length> valid value: 0.35in +PASS Test <length> valid value: 0.35cm +PASS Test <length> valid value: 0.35mm +PASS Test <length> valid value: 0.35pt +PASS Test <length> valid value: 0.35pc +PASS Test <length> valid value: 0.35% +PASS Test <length> valid value: 1e-10 +PASS Test <length> valid value: 1e-10em +PASS Test <length> valid value: 1e-10ex +PASS Test <length> valid value: 1e-10px +PASS Test <length> valid value: 1e-10in +PASS Test <length> valid value: 1e-10cm +PASS Test <length> valid value: 1e-10mm +PASS Test <length> valid value: 1e-10pt +PASS Test <length> valid value: 1e-10pc +PASS Test <length> valid value: 1e-10% +PASS Test <length> valid value: +32 +PASS Test <length> valid value: +32em +PASS Test <length> valid value: +32ex +PASS Test <length> valid value: +32px +PASS Test <length> valid value: +32in +PASS Test <length> valid value: +32cm +PASS Test <length> valid value: +32mm +PASS Test <length> valid value: +32pt +PASS Test <length> valid value: +32pc +PASS Test <length> valid value: +32% +PASS Test <length> valid value: +17E-1 +PASS Test <length> valid value: +17E-1em +PASS Test <length> valid value: +17E-1ex +PASS Test <length> valid value: +17E-1px +PASS Test <length> valid value: +17E-1in +PASS Test <length> valid value: +17E-1cm +PASS Test <length> valid value: +17E-1mm +PASS Test <length> valid value: +17E-1pt +PASS Test <length> valid value: +17E-1pc +PASS Test <length> valid value: +17E-1% +PASS Test <length> valid value: 17e+2 +PASS Test <length> valid value: 17e+2em +PASS Test <length> valid value: 17e+2ex +PASS Test <length> valid value: 17e+2px +PASS Test <length> valid value: 17e+2in +PASS Test <length> valid value: 17e+2cm +PASS Test <length> valid value: 17e+2mm +PASS Test <length> valid value: 17e+2pt +PASS Test <length> valid value: 17e+2pc +PASS Test <length> valid value: 17e+2% +PASS Test <length> valid value: -47\r\n\t +PASS Test <length> valid value: -47em\r\n\t +PASS Test <length> valid value: -47ex\r\n\t +PASS Test <length> valid value: -47px\r\n\t +PASS Test <length> valid value: -47in\r\n\t +PASS Test <length> valid value: -47cm\r\n\t +PASS Test <length> valid value: -47mm\r\n\t +PASS Test <length> valid value: -47pt\r\n\t +PASS Test <length> valid value: -47pc\r\n\t +PASS Test <length> valid value: -47%\r\n\t +PASS Test <length> valid value: .1\r\n\t +PASS Test <length> valid value: .1em\r\n\t +PASS Test <length> valid value: .1ex\r\n\t +PASS Test <length> valid value: .1px\r\n\t +PASS Test <length> valid value: .1in\r\n\t +PASS Test <length> valid value: .1cm\r\n\t +PASS Test <length> valid value: .1mm\r\n\t +PASS Test <length> valid value: .1pt\r\n\t +PASS Test <length> valid value: .1pc\r\n\t +PASS Test <length> valid value: .1%\r\n\t +PASS Test <length> valid value: 0.35\r\n\t +PASS Test <length> valid value: 0.35em\r\n\t +PASS Test <length> valid value: 0.35ex\r\n\t +PASS Test <length> valid value: 0.35px\r\n\t +PASS Test <length> valid value: 0.35in\r\n\t +PASS Test <length> valid value: 0.35cm\r\n\t +PASS Test <length> valid value: 0.35mm\r\n\t +PASS Test <length> valid value: 0.35pt\r\n\t +PASS Test <length> valid value: 0.35pc\r\n\t +PASS Test <length> valid value: 0.35%\r\n\t +PASS Test <length> valid value: 1e-10\r\n\t +PASS Test <length> valid value: 1e-10em\r\n\t +PASS Test <length> valid value: 1e-10ex\r\n\t +PASS Test <length> valid value: 1e-10px\r\n\t +PASS Test <length> valid value: 1e-10in\r\n\t +PASS Test <length> valid value: 1e-10cm\r\n\t +PASS Test <length> valid value: 1e-10mm\r\n\t +PASS Test <length> valid value: 1e-10pt\r\n\t +PASS Test <length> valid value: 1e-10pc\r\n\t +PASS Test <length> valid value: 1e-10%\r\n\t +PASS Test <length> valid value: +32\r\n\t +PASS Test <length> valid value: +32em\r\n\t +PASS Test <length> valid value: +32ex\r\n\t +PASS Test <length> valid value: +32px\r\n\t +PASS Test <length> valid value: +32in\r\n\t +PASS Test <length> valid value: +32cm\r\n\t +PASS Test <length> valid value: +32mm\r\n\t +PASS Test <length> valid value: +32pt\r\n\t +PASS Test <length> valid value: +32pc\r\n\t +PASS Test <length> valid value: +32%\r\n\t +PASS Test <length> valid value: +17E-1\r\n\t +PASS Test <length> valid value: +17E-1em\r\n\t +PASS Test <length> valid value: +17E-1ex\r\n\t +PASS Test <length> valid value: +17E-1px\r\n\t +PASS Test <length> valid value: +17E-1in\r\n\t +PASS Test <length> valid value: +17E-1cm\r\n\t +PASS Test <length> valid value: +17E-1mm\r\n\t +PASS Test <length> valid value: +17E-1pt\r\n\t +PASS Test <length> valid value: +17E-1pc\r\n\t +PASS Test <length> valid value: +17E-1%\r\n\t +PASS Test <length> valid value: 17e+2\r\n\t +PASS Test <length> valid value: 17e+2em\r\n\t +PASS Test <length> valid value: 17e+2ex\r\n\t +PASS Test <length> valid value: 17e+2px\r\n\t +PASS Test <length> valid value: 17e+2in\r\n\t +PASS Test <length> valid value: 17e+2cm\r\n\t +PASS Test <length> valid value: 17e+2mm\r\n\t +PASS Test <length> valid value: 17e+2pt\r\n\t +PASS Test <length> valid value: 17e+2pc\r\n\t +PASS Test <length> valid value: 17e+2%\r\n\t +PASS Test <length> valid value: -47\f +PASS Test <length> valid value: -47em\f +PASS Test <length> valid value: -47ex\f +PASS Test <length> valid value: -47px\f +PASS Test <length> valid value: -47in\f +PASS Test <length> valid value: -47cm\f +PASS Test <length> valid value: -47mm\f +PASS Test <length> valid value: -47pt\f +PASS Test <length> valid value: -47pc\f +PASS Test <length> valid value: -47%\f +PASS Test <length> valid value: .1\f +PASS Test <length> valid value: .1em\f +PASS Test <length> valid value: .1ex\f +PASS Test <length> valid value: .1px\f +PASS Test <length> valid value: .1in\f +PASS Test <length> valid value: .1cm\f +PASS Test <length> valid value: .1mm\f +PASS Test <length> valid value: .1pt\f +PASS Test <length> valid value: .1pc\f +PASS Test <length> valid value: .1%\f +PASS Test <length> valid value: 0.35\f +PASS Test <length> valid value: 0.35em\f +PASS Test <length> valid value: 0.35ex\f +PASS Test <length> valid value: 0.35px\f +PASS Test <length> valid value: 0.35in\f +PASS Test <length> valid value: 0.35cm\f +PASS Test <length> valid value: 0.35mm\f +PASS Test <length> valid value: 0.35pt\f +PASS Test <length> valid value: 0.35pc\f +PASS Test <length> valid value: 0.35%\f +PASS Test <length> valid value: 1e-10\f +PASS Test <length> valid value: 1e-10em\f +PASS Test <length> valid value: 1e-10ex\f +PASS Test <length> valid value: 1e-10px\f +PASS Test <length> valid value: 1e-10in\f +PASS Test <length> valid value: 1e-10cm\f +PASS Test <length> valid value: 1e-10mm\f +PASS Test <length> valid value: 1e-10pt\f +PASS Test <length> valid value: 1e-10pc\f +PASS Test <length> valid value: 1e-10%\f +PASS Test <length> valid value: +32\f +PASS Test <length> valid value: +32em\f +PASS Test <length> valid value: +32ex\f +PASS Test <length> valid value: +32px\f +PASS Test <length> valid value: +32in\f +PASS Test <length> valid value: +32cm\f +PASS Test <length> valid value: +32mm\f +PASS Test <length> valid value: +32pt\f +PASS Test <length> valid value: +32pc\f +PASS Test <length> valid value: +32%\f +PASS Test <length> valid value: +17E-1\f +PASS Test <length> valid value: +17E-1em\f +PASS Test <length> valid value: +17E-1ex\f +PASS Test <length> valid value: +17E-1px\f +PASS Test <length> valid value: +17E-1in\f +PASS Test <length> valid value: +17E-1cm\f +PASS Test <length> valid value: +17E-1mm\f +PASS Test <length> valid value: +17E-1pt\f +PASS Test <length> valid value: +17E-1pc\f +PASS Test <length> valid value: +17E-1%\f +PASS Test <length> valid value: 17e+2\f +PASS Test <length> valid value: 17e+2em\f +PASS Test <length> valid value: 17e+2ex\f +PASS Test <length> valid value: 17e+2px\f +PASS Test <length> valid value: 17e+2in\f +PASS Test <length> valid value: 17e+2cm\f +PASS Test <length> valid value: 17e+2mm\f +PASS Test <length> valid value: 17e+2pt\f +PASS Test <length> valid value: 17e+2pc\f +PASS Test <length> valid value: 17e+2%\f +PASS Test <length> trailing garbage, value: -47a +PASS Test <length> trailing garbage, value: .1a +PASS Test <length> trailing garbage, value: 0.35a +PASS Test <length> trailing garbage, value: 1e-10a +PASS Test <length> trailing garbage, value: +32a +PASS Test <length> trailing garbage, value: +17E-1a +PASS Test <length> trailing garbage, value: 17e+2a +PASS Test <length> trailing garbage, value: -47e +PASS Test <length> trailing garbage, value: .1e +PASS Test <length> trailing garbage, value: 0.35e +PASS Test <length> trailing garbage, value: 1e-10e +PASS Test <length> trailing garbage, value: +32e +PASS Test <length> trailing garbage, value: +17E-1e +PASS Test <length> trailing garbage, value: 17e+2e +PASS Test <length> trailing garbage, value: -47foo +PASS Test <length> trailing garbage, value: .1foo +PASS Test <length> trailing garbage, value: 0.35foo +PASS Test <length> trailing garbage, value: 1e-10foo +PASS Test <length> trailing garbage, value: +32foo +PASS Test <length> trailing garbage, value: +17E-1foo +PASS Test <length> trailing garbage, value: 17e+2foo +PASS Test <length> trailing garbage, value: -47)90 +PASS Test <length> trailing garbage, value: .1)90 +PASS Test <length> trailing garbage, value: 0.35)90 +PASS Test <length> trailing garbage, value: 1e-10)90 +PASS Test <length> trailing garbage, value: +32)90 +PASS Test <length> trailing garbage, value: +17E-1)90 +PASS Test <length> trailing garbage, value: 17e+2)90 +PASS Test <length> valid value: -47 +PASS Test <length> valid value: -47em +PASS Test <length> valid value: -47ex +PASS Test <length> valid value: -47px +PASS Test <length> valid value: -47in +PASS Test <length> valid value: -47cm +PASS Test <length> valid value: -47mm +PASS Test <length> valid value: -47pt +PASS Test <length> valid value: -47pc +PASS Test <length> valid value: -47% +PASS Test <length> valid value: .1 +PASS Test <length> valid value: .1em +PASS Test <length> valid value: .1ex +PASS Test <length> valid value: .1px +PASS Test <length> valid value: .1in +PASS Test <length> valid value: .1cm +PASS Test <length> valid value: .1mm +PASS Test <length> valid value: .1pt +PASS Test <length> valid value: .1pc +PASS Test <length> valid value: .1% +PASS Test <length> valid value: 0.35 +PASS Test <length> valid value: 0.35em +PASS Test <length> valid value: 0.35ex +PASS Test <length> valid value: 0.35px +PASS Test <length> valid value: 0.35in +PASS Test <length> valid value: 0.35cm +PASS Test <length> valid value: 0.35mm +PASS Test <length> valid value: 0.35pt +PASS Test <length> valid value: 0.35pc +PASS Test <length> valid value: 0.35% +PASS Test <length> valid value: 1e-10 +PASS Test <length> valid value: 1e-10em +PASS Test <length> valid value: 1e-10ex +PASS Test <length> valid value: 1e-10px +PASS Test <length> valid value: 1e-10in +PASS Test <length> valid value: 1e-10cm +PASS Test <length> valid value: 1e-10mm +PASS Test <length> valid value: 1e-10pt +PASS Test <length> valid value: 1e-10pc +PASS Test <length> valid value: 1e-10% +PASS Test <length> valid value: +32 +PASS Test <length> valid value: +32em +PASS Test <length> valid value: +32ex +PASS Test <length> valid value: +32px +PASS Test <length> valid value: +32in +PASS Test <length> valid value: +32cm +PASS Test <length> valid value: +32mm +PASS Test <length> valid value: +32pt +PASS Test <length> valid value: +32pc +PASS Test <length> valid value: +32% +PASS Test <length> valid value: +17E-1 +PASS Test <length> valid value: +17E-1em +PASS Test <length> valid value: +17E-1ex +PASS Test <length> valid value: +17E-1px +PASS Test <length> valid value: +17E-1in +PASS Test <length> valid value: +17E-1cm +PASS Test <length> valid value: +17E-1mm +PASS Test <length> valid value: +17E-1pt +PASS Test <length> valid value: +17E-1pc +PASS Test <length> valid value: +17E-1% +PASS Test <length> valid value: 17e+2 +PASS Test <length> valid value: 17e+2em +PASS Test <length> valid value: 17e+2ex +PASS Test <length> valid value: 17e+2px +PASS Test <length> valid value: 17e+2in +PASS Test <length> valid value: 17e+2cm +PASS Test <length> valid value: 17e+2mm +PASS Test <length> valid value: 17e+2pt +PASS Test <length> valid value: 17e+2pc +PASS Test <length> valid value: 17e+2% +PASS Test <length> valid value: -47 +PASS Test <length> valid value: -47em +PASS Test <length> valid value: -47ex +PASS Test <length> valid value: -47px +PASS Test <length> valid value: -47in +PASS Test <length> valid value: -47cm +PASS Test <length> valid value: -47mm +PASS Test <length> valid value: -47pt +PASS Test <length> valid value: -47pc +PASS Test <length> valid value: -47% +PASS Test <length> valid value: .1 +PASS Test <length> valid value: .1em +PASS Test <length> valid value: .1ex +PASS Test <length> valid value: .1px +PASS Test <length> valid value: .1in +PASS Test <length> valid value: .1cm +PASS Test <length> valid value: .1mm +PASS Test <length> valid value: .1pt +PASS Test <length> valid value: .1pc +PASS Test <length> valid value: .1% +PASS Test <length> valid value: 0.35 +PASS Test <length> valid value: 0.35em +PASS Test <length> valid value: 0.35ex +PASS Test <length> valid value: 0.35px +PASS Test <length> valid value: 0.35in +PASS Test <length> valid value: 0.35cm +PASS Test <length> valid value: 0.35mm +PASS Test <length> valid value: 0.35pt +PASS Test <length> valid value: 0.35pc +PASS Test <length> valid value: 0.35% +PASS Test <length> valid value: 1e-10 +PASS Test <length> valid value: 1e-10em +PASS Test <length> valid value: 1e-10ex +PASS Test <length> valid value: 1e-10px +PASS Test <length> valid value: 1e-10in +PASS Test <length> valid value: 1e-10cm +PASS Test <length> valid value: 1e-10mm +PASS Test <length> valid value: 1e-10pt +PASS Test <length> valid value: 1e-10pc +PASS Test <length> valid value: 1e-10% +PASS Test <length> valid value: +32 +PASS Test <length> valid value: +32em +PASS Test <length> valid value: +32ex +PASS Test <length> valid value: +32px +PASS Test <length> valid value: +32in +PASS Test <length> valid value: +32cm +PASS Test <length> valid value: +32mm +PASS Test <length> valid value: +32pt +PASS Test <length> valid value: +32pc +PASS Test <length> valid value: +32% +PASS Test <length> valid value: +17E-1 +PASS Test <length> valid value: +17E-1em +PASS Test <length> valid value: +17E-1ex +PASS Test <length> valid value: +17E-1px +PASS Test <length> valid value: +17E-1in +PASS Test <length> valid value: +17E-1cm +PASS Test <length> valid value: +17E-1mm +PASS Test <length> valid value: +17E-1pt +PASS Test <length> valid value: +17E-1pc +PASS Test <length> valid value: +17E-1% +PASS Test <length> valid value: 17e+2 +PASS Test <length> valid value: 17e+2em +PASS Test <length> valid value: 17e+2ex +PASS Test <length> valid value: 17e+2px +PASS Test <length> valid value: 17e+2in +PASS Test <length> valid value: 17e+2cm +PASS Test <length> valid value: 17e+2mm +PASS Test <length> valid value: 17e+2pt +PASS Test <length> valid value: 17e+2pc +PASS Test <length> valid value: 17e+2% +PASS Test <length> valid value: -47 +PASS Test <length> valid value: -47em +PASS Test <length> valid value: -47ex +PASS Test <length> valid value: -47px +PASS Test <length> valid value: -47in +PASS Test <length> valid value: -47cm +PASS Test <length> valid value: -47mm +PASS Test <length> valid value: -47pt +PASS Test <length> valid value: -47pc +PASS Test <length> valid value: -47% +PASS Test <length> valid value: .1 +PASS Test <length> valid value: .1em +PASS Test <length> valid value: .1ex +PASS Test <length> valid value: .1px +PASS Test <length> valid value: .1in +PASS Test <length> valid value: .1cm +PASS Test <length> valid value: .1mm +PASS Test <length> valid value: .1pt +PASS Test <length> valid value: .1pc +PASS Test <length> valid value: .1% +PASS Test <length> valid value: 0.35 +PASS Test <length> valid value: 0.35em +PASS Test <length> valid value: 0.35ex +PASS Test <length> valid value: 0.35px +PASS Test <length> valid value: 0.35in +PASS Test <length> valid value: 0.35cm +PASS Test <length> valid value: 0.35mm +PASS Test <length> valid value: 0.35pt +PASS Test <length> valid value: 0.35pc +PASS Test <length> valid value: 0.35% +PASS Test <length> valid value: 1e-10 +PASS Test <length> valid value: 1e-10em +PASS Test <length> valid value: 1e-10ex +PASS Test <length> valid value: 1e-10px +PASS Test <length> valid value: 1e-10in +PASS Test <length> valid value: 1e-10cm +PASS Test <length> valid value: 1e-10mm +PASS Test <length> valid value: 1e-10pt +PASS Test <length> valid value: 1e-10pc +PASS Test <length> valid value: 1e-10% +PASS Test <length> valid value: +32 +PASS Test <length> valid value: +32em +PASS Test <length> valid value: +32ex +PASS Test <length> valid value: +32px +PASS Test <length> valid value: +32in +PASS Test <length> valid value: +32cm +PASS Test <length> valid value: +32mm +PASS Test <length> valid value: +32pt +PASS Test <length> valid value: +32pc +PASS Test <length> valid value: +32% +PASS Test <length> valid value: +17E-1 +PASS Test <length> valid value: +17E-1em +PASS Test <length> valid value: +17E-1ex +PASS Test <length> valid value: +17E-1px +PASS Test <length> valid value: +17E-1in +PASS Test <length> valid value: +17E-1cm +PASS Test <length> valid value: +17E-1mm +PASS Test <length> valid value: +17E-1pt +PASS Test <length> valid value: +17E-1pc +PASS Test <length> valid value: +17E-1% +PASS Test <length> valid value: 17e+2 +PASS Test <length> valid value: 17e+2em +PASS Test <length> valid value: 17e+2ex +PASS Test <length> valid value: 17e+2px +PASS Test <length> valid value: 17e+2in +PASS Test <length> valid value: 17e+2cm +PASS Test <length> valid value: 17e+2mm +PASS Test <length> valid value: 17e+2pt +PASS Test <length> valid value: 17e+2pc +PASS Test <length> valid value: 17e+2% +PASS Test <length> valid value: -47\r\n\t +PASS Test <length> valid value: -47em\r\n\t +PASS Test <length> valid value: -47ex\r\n\t +PASS Test <length> valid value: -47px\r\n\t +PASS Test <length> valid value: -47in\r\n\t +PASS Test <length> valid value: -47cm\r\n\t +PASS Test <length> valid value: -47mm\r\n\t +PASS Test <length> valid value: -47pt\r\n\t +PASS Test <length> valid value: -47pc\r\n\t +PASS Test <length> valid value: -47%\r\n\t +PASS Test <length> valid value: .1\r\n\t +PASS Test <length> valid value: .1em\r\n\t +PASS Test <length> valid value: .1ex\r\n\t +PASS Test <length> valid value: .1px\r\n\t +PASS Test <length> valid value: .1in\r\n\t +PASS Test <length> valid value: .1cm\r\n\t +PASS Test <length> valid value: .1mm\r\n\t +PASS Test <length> valid value: .1pt\r\n\t +PASS Test <length> valid value: .1pc\r\n\t +PASS Test <length> valid value: .1%\r\n\t +PASS Test <length> valid value: 0.35\r\n\t +PASS Test <length> valid value: 0.35em\r\n\t +PASS Test <length> valid value: 0.35ex\r\n\t +PASS Test <length> valid value: 0.35px\r\n\t +PASS Test <length> valid value: 0.35in\r\n\t +PASS Test <length> valid value: 0.35cm\r\n\t +PASS Test <length> valid value: 0.35mm\r\n\t +PASS Test <length> valid value: 0.35pt\r\n\t +PASS Test <length> valid value: 0.35pc\r\n\t +PASS Test <length> valid value: 0.35%\r\n\t +PASS Test <length> valid value: 1e-10\r\n\t +PASS Test <length> valid value: 1e-10em\r\n\t +PASS Test <length> valid value: 1e-10ex\r\n\t +PASS Test <length> valid value: 1e-10px\r\n\t +PASS Test <length> valid value: 1e-10in\r\n\t +PASS Test <length> valid value: 1e-10cm\r\n\t +PASS Test <length> valid value: 1e-10mm\r\n\t +PASS Test <length> valid value: 1e-10pt\r\n\t +PASS Test <length> valid value: 1e-10pc\r\n\t +PASS Test <length> valid value: 1e-10%\r\n\t +PASS Test <length> valid value: +32\r\n\t +PASS Test <length> valid value: +32em\r\n\t +PASS Test <length> valid value: +32ex\r\n\t +PASS Test <length> valid value: +32px\r\n\t +PASS Test <length> valid value: +32in\r\n\t +PASS Test <length> valid value: +32cm\r\n\t +PASS Test <length> valid value: +32mm\r\n\t +PASS Test <length> valid value: +32pt\r\n\t +PASS Test <length> valid value: +32pc\r\n\t +PASS Test <length> valid value: +32%\r\n\t +PASS Test <length> valid value: +17E-1\r\n\t +PASS Test <length> valid value: +17E-1em\r\n\t +PASS Test <length> valid value: +17E-1ex\r\n\t +PASS Test <length> valid value: +17E-1px\r\n\t +PASS Test <length> valid value: +17E-1in\r\n\t +PASS Test <length> valid value: +17E-1cm\r\n\t +PASS Test <length> valid value: +17E-1mm\r\n\t +PASS Test <length> valid value: +17E-1pt\r\n\t +PASS Test <length> valid value: +17E-1pc\r\n\t +PASS Test <length> valid value: +17E-1%\r\n\t +PASS Test <length> valid value: 17e+2\r\n\t +PASS Test <length> valid value: 17e+2em\r\n\t +PASS Test <length> valid value: 17e+2ex\r\n\t +PASS Test <length> valid value: 17e+2px\r\n\t +PASS Test <length> valid value: 17e+2in\r\n\t +PASS Test <length> valid value: 17e+2cm\r\n\t +PASS Test <length> valid value: 17e+2mm\r\n\t +PASS Test <length> valid value: 17e+2pt\r\n\t +PASS Test <length> valid value: 17e+2pc\r\n\t +PASS Test <length> valid value: 17e+2%\r\n\t +PASS Test <length> valid value: -47\f +PASS Test <length> valid value: -47em\f +PASS Test <length> valid value: -47ex\f +PASS Test <length> valid value: -47px\f +PASS Test <length> valid value: -47in\f +PASS Test <length> valid value: -47cm\f +PASS Test <length> valid value: -47mm\f +PASS Test <length> valid value: -47pt\f +PASS Test <length> valid value: -47pc\f +PASS Test <length> valid value: -47%\f +PASS Test <length> valid value: .1\f +PASS Test <length> valid value: .1em\f +PASS Test <length> valid value: .1ex\f +PASS Test <length> valid value: .1px\f +PASS Test <length> valid value: .1in\f +PASS Test <length> valid value: .1cm\f +PASS Test <length> valid value: .1mm\f +PASS Test <length> valid value: .1pt\f +PASS Test <length> valid value: .1pc\f +PASS Test <length> valid value: .1%\f +PASS Test <length> valid value: 0.35\f +PASS Test <length> valid value: 0.35em\f +PASS Test <length> valid value: 0.35ex\f +PASS Test <length> valid value: 0.35px\f +PASS Test <length> valid value: 0.35in\f +PASS Test <length> valid value: 0.35cm\f +PASS Test <length> valid value: 0.35mm\f +PASS Test <length> valid value: 0.35pt\f +PASS Test <length> valid value: 0.35pc\f +PASS Test <length> valid value: 0.35%\f +PASS Test <length> valid value: 1e-10\f +PASS Test <length> valid value: 1e-10em\f +PASS Test <length> valid value: 1e-10ex\f +PASS Test <length> valid value: 1e-10px\f +PASS Test <length> valid value: 1e-10in\f +PASS Test <length> valid value: 1e-10cm\f +PASS Test <length> valid value: 1e-10mm\f +PASS Test <length> valid value: 1e-10pt\f +PASS Test <length> valid value: 1e-10pc\f +PASS Test <length> valid value: 1e-10%\f +PASS Test <length> valid value: +32\f +PASS Test <length> valid value: +32em\f +PASS Test <length> valid value: +32ex\f +PASS Test <length> valid value: +32px\f +PASS Test <length> valid value: +32in\f +PASS Test <length> valid value: +32cm\f +PASS Test <length> valid value: +32mm\f +PASS Test <length> valid value: +32pt\f +PASS Test <length> valid value: +32pc\f +PASS Test <length> valid value: +32%\f +PASS Test <length> valid value: +17E-1\f +PASS Test <length> valid value: +17E-1em\f +PASS Test <length> valid value: +17E-1ex\f +PASS Test <length> valid value: +17E-1px\f +PASS Test <length> valid value: +17E-1in\f +PASS Test <length> valid value: +17E-1cm\f +PASS Test <length> valid value: +17E-1mm\f +PASS Test <length> valid value: +17E-1pt\f +PASS Test <length> valid value: +17E-1pc\f +PASS Test <length> valid value: +17E-1%\f +PASS Test <length> valid value: 17e+2\f +PASS Test <length> valid value: 17e+2em\f +PASS Test <length> valid value: 17e+2ex\f +PASS Test <length> valid value: 17e+2px\f +PASS Test <length> valid value: 17e+2in\f +PASS Test <length> valid value: 17e+2cm\f +PASS Test <length> valid value: 17e+2mm\f +PASS Test <length> valid value: 17e+2pt\f +PASS Test <length> valid value: 17e+2pc\f +PASS Test <length> valid value: 17e+2%\f +PASS Test <length> WS invalid value: -47 em +PASS Test <length> WS invalid value: .1 em +PASS Test <length> WS invalid value: 0.35 em +PASS Test <length> WS invalid value: 1e-10 em +PASS Test <length> WS invalid value: +32 em +PASS Test <length> WS invalid value: +17E-1 em +PASS Test <length> WS invalid value: 17e+2 em +PASS Test <length> WS invalid value: -47 ex +PASS Test <length> WS invalid value: .1 ex +PASS Test <length> WS invalid value: 0.35 ex +PASS Test <length> WS invalid value: 1e-10 ex +PASS Test <length> WS invalid value: +32 ex +PASS Test <length> WS invalid value: +17E-1 ex +PASS Test <length> WS invalid value: 17e+2 ex +PASS Test <length> WS invalid value: -47 px +PASS Test <length> WS invalid value: .1 px +PASS Test <length> WS invalid value: 0.35 px +PASS Test <length> WS invalid value: 1e-10 px +PASS Test <length> WS invalid value: +32 px +PASS Test <length> WS invalid value: +17E-1 px +PASS Test <length> WS invalid value: 17e+2 px +PASS Test <length> WS invalid value: -47 in +PASS Test <length> WS invalid value: .1 in +PASS Test <length> WS invalid value: 0.35 in +PASS Test <length> WS invalid value: 1e-10 in +PASS Test <length> WS invalid value: +32 in +PASS Test <length> WS invalid value: +17E-1 in +PASS Test <length> WS invalid value: 17e+2 in +PASS Test <length> WS invalid value: -47 cm +PASS Test <length> WS invalid value: .1 cm +PASS Test <length> WS invalid value: 0.35 cm +PASS Test <length> WS invalid value: 1e-10 cm +PASS Test <length> WS invalid value: +32 cm +PASS Test <length> WS invalid value: +17E-1 cm +PASS Test <length> WS invalid value: 17e+2 cm +PASS Test <length> WS invalid value: -47 mm +PASS Test <length> WS invalid value: .1 mm +PASS Test <length> WS invalid value: 0.35 mm +PASS Test <length> WS invalid value: 1e-10 mm +PASS Test <length> WS invalid value: +32 mm +PASS Test <length> WS invalid value: +17E-1 mm +PASS Test <length> WS invalid value: 17e+2 mm +PASS Test <length> WS invalid value: -47 pt +PASS Test <length> WS invalid value: .1 pt +PASS Test <length> WS invalid value: 0.35 pt +PASS Test <length> WS invalid value: 1e-10 pt +PASS Test <length> WS invalid value: +32 pt +PASS Test <length> WS invalid value: +17E-1 pt +PASS Test <length> WS invalid value: 17e+2 pt +PASS Test <length> WS invalid value: -47 pc +PASS Test <length> WS invalid value: .1 pc +PASS Test <length> WS invalid value: 0.35 pc +PASS Test <length> WS invalid value: 1e-10 pc +PASS Test <length> WS invalid value: +32 pc +PASS Test <length> WS invalid value: +17E-1 pc +PASS Test <length> WS invalid value: 17e+2 pc +PASS Test <length> WS invalid value: -47 % +PASS Test <length> WS invalid value: .1 % +PASS Test <length> WS invalid value: 0.35 % +PASS Test <length> WS invalid value: 1e-10 % +PASS Test <length> WS invalid value: +32 % +PASS Test <length> WS invalid value: +17E-1 % +PASS Test <length> WS invalid value: 17e+2 % +PASS Test <length> trailing garbage, value: -47a +PASS Test <length> trailing garbage, value: .1a +PASS Test <length> trailing garbage, value: 0.35a +PASS Test <length> trailing garbage, value: 1e-10a +PASS Test <length> trailing garbage, value: +32a +PASS Test <length> trailing garbage, value: +17E-1a +PASS Test <length> trailing garbage, value: 17e+2a +PASS Test <length> trailing garbage, value: -47e +PASS Test <length> trailing garbage, value: .1e +PASS Test <length> trailing garbage, value: 0.35e +PASS Test <length> trailing garbage, value: 1e-10e +PASS Test <length> trailing garbage, value: +32e +PASS Test <length> trailing garbage, value: +17E-1e +PASS Test <length> trailing garbage, value: 17e+2e +PASS Test <length> trailing garbage, value: -47foo +PASS Test <length> trailing garbage, value: .1foo +PASS Test <length> trailing garbage, value: 0.35foo +PASS Test <length> trailing garbage, value: 1e-10foo +PASS Test <length> trailing garbage, value: +32foo +PASS Test <length> trailing garbage, value: +17E-1foo +PASS Test <length> trailing garbage, value: 17e+2foo +PASS Test <length> trailing garbage, value: -47)90 +PASS Test <length> trailing garbage, value: .1)90 +PASS Test <length> trailing garbage, value: 0.35)90 +PASS Test <length> trailing garbage, value: 1e-10)90 +PASS Test <length> trailing garbage, value: +32)90 +PASS Test <length> trailing garbage, value: +17E-1)90 +PASS Test <length> trailing garbage, value: 17e+2)90 +PASS Test <length> valid value: -47 +PASS Test <length> valid value: -47em +PASS Test <length> valid value: -47ex +PASS Test <length> valid value: -47px +PASS Test <length> valid value: -47in +PASS Test <length> valid value: -47cm +PASS Test <length> valid value: -47mm +PASS Test <length> valid value: -47pt +PASS Test <length> valid value: -47pc +PASS Test <length> valid value: -47% +PASS Test <length> valid value: .1 +PASS Test <length> valid value: .1em +PASS Test <length> valid value: .1ex +PASS Test <length> valid value: .1px +PASS Test <length> valid value: .1in +PASS Test <length> valid value: .1cm +PASS Test <length> valid value: .1mm +PASS Test <length> valid value: .1pt +PASS Test <length> valid value: .1pc +PASS Test <length> valid value: .1% +PASS Test <length> valid value: 0.35 +PASS Test <length> valid value: 0.35em +PASS Test <length> valid value: 0.35ex +PASS Test <length> valid value: 0.35px +PASS Test <length> valid value: 0.35in +PASS Test <length> valid value: 0.35cm +PASS Test <length> valid value: 0.35mm +PASS Test <length> valid value: 0.35pt +PASS Test <length> valid value: 0.35pc +PASS Test <length> valid value: 0.35% +PASS Test <length> valid value: 1e-10 +PASS Test <length> valid value: 1e-10em +PASS Test <length> valid value: 1e-10ex +PASS Test <length> valid value: 1e-10px +PASS Test <length> valid value: 1e-10in +PASS Test <length> valid value: 1e-10cm +PASS Test <length> valid value: 1e-10mm +PASS Test <length> valid value: 1e-10pt +PASS Test <length> valid value: 1e-10pc +PASS Test <length> valid value: 1e-10% +PASS Test <length> valid value: +32 +PASS Test <length> valid value: +32em +PASS Test <length> valid value: +32ex +PASS Test <length> valid value: +32px +PASS Test <length> valid value: +32in +PASS Test <length> valid value: +32cm +PASS Test <length> valid value: +32mm +PASS Test <length> valid value: +32pt +PASS Test <length> valid value: +32pc +PASS Test <length> valid value: +32% +PASS Test <length> valid value: +17E-1 +PASS Test <length> valid value: +17E-1em +PASS Test <length> valid value: +17E-1ex +PASS Test <length> valid value: +17E-1px +PASS Test <length> valid value: +17E-1in +PASS Test <length> valid value: +17E-1cm +PASS Test <length> valid value: +17E-1mm +PASS Test <length> valid value: +17E-1pt +PASS Test <length> valid value: +17E-1pc +PASS Test <length> valid value: +17E-1% +PASS Test <length> valid value: 17e+2 +PASS Test <length> valid value: 17e+2em +PASS Test <length> valid value: 17e+2ex +PASS Test <length> valid value: 17e+2px +PASS Test <length> valid value: 17e+2in +PASS Test <length> valid value: 17e+2cm +PASS Test <length> valid value: 17e+2mm +PASS Test <length> valid value: 17e+2pt +PASS Test <length> valid value: 17e+2pc +PASS Test <length> valid value: 17e+2% +PASS Test <length> valid value: -47 +PASS Test <length> valid value: -47em +PASS Test <length> valid value: -47ex +PASS Test <length> valid value: -47px +PASS Test <length> valid value: -47in +PASS Test <length> valid value: -47cm +PASS Test <length> valid value: -47mm +PASS Test <length> valid value: -47pt +PASS Test <length> valid value: -47pc +PASS Test <length> valid value: -47% +PASS Test <length> valid value: .1 +PASS Test <length> valid value: .1em +PASS Test <length> valid value: .1ex +PASS Test <length> valid value: .1px +PASS Test <length> valid value: .1in +PASS Test <length> valid value: .1cm +PASS Test <length> valid value: .1mm +PASS Test <length> valid value: .1pt +PASS Test <length> valid value: .1pc +PASS Test <length> valid value: .1% +PASS Test <length> valid value: 0.35 +PASS Test <length> valid value: 0.35em +PASS Test <length> valid value: 0.35ex +PASS Test <length> valid value: 0.35px +PASS Test <length> valid value: 0.35in +PASS Test <length> valid value: 0.35cm +PASS Test <length> valid value: 0.35mm +PASS Test <length> valid value: 0.35pt +PASS Test <length> valid value: 0.35pc +PASS Test <length> valid value: 0.35% +PASS Test <length> valid value: 1e-10 +PASS Test <length> valid value: 1e-10em +PASS Test <length> valid value: 1e-10ex +PASS Test <length> valid value: 1e-10px +PASS Test <length> valid value: 1e-10in +PASS Test <length> valid value: 1e-10cm +PASS Test <length> valid value: 1e-10mm +PASS Test <length> valid value: 1e-10pt +PASS Test <length> valid value: 1e-10pc +PASS Test <length> valid value: 1e-10% +PASS Test <length> valid value: +32 +PASS Test <length> valid value: +32em +PASS Test <length> valid value: +32ex +PASS Test <length> valid value: +32px +PASS Test <length> valid value: +32in +PASS Test <length> valid value: +32cm +PASS Test <length> valid value: +32mm +PASS Test <length> valid value: +32pt +PASS Test <length> valid value: +32pc +PASS Test <length> valid value: +32% +PASS Test <length> valid value: +17E-1 +PASS Test <length> valid value: +17E-1em +PASS Test <length> valid value: +17E-1ex +PASS Test <length> valid value: +17E-1px +PASS Test <length> valid value: +17E-1in +PASS Test <length> valid value: +17E-1cm +PASS Test <length> valid value: +17E-1mm +PASS Test <length> valid value: +17E-1pt +PASS Test <length> valid value: +17E-1pc +PASS Test <length> valid value: +17E-1% +PASS Test <length> valid value: 17e+2 +PASS Test <length> valid value: 17e+2em +PASS Test <length> valid value: 17e+2ex +PASS Test <length> valid value: 17e+2px +PASS Test <length> valid value: 17e+2in +PASS Test <length> valid value: 17e+2cm +PASS Test <length> valid value: 17e+2mm +PASS Test <length> valid value: 17e+2pt +PASS Test <length> valid value: 17e+2pc +PASS Test <length> valid value: 17e+2% +PASS Test <length> valid value: -47 +PASS Test <length> valid value: -47em +PASS Test <length> valid value: -47ex +PASS Test <length> valid value: -47px +PASS Test <length> valid value: -47in +PASS Test <length> valid value: -47cm +PASS Test <length> valid value: -47mm +PASS Test <length> valid value: -47pt +PASS Test <length> valid value: -47pc +PASS Test <length> valid value: -47% +PASS Test <length> valid value: .1 +PASS Test <length> valid value: .1em +PASS Test <length> valid value: .1ex +PASS Test <length> valid value: .1px +PASS Test <length> valid value: .1in +PASS Test <length> valid value: .1cm +PASS Test <length> valid value: .1mm +PASS Test <length> valid value: .1pt +PASS Test <length> valid value: .1pc +PASS Test <length> valid value: .1% +PASS Test <length> valid value: 0.35 +PASS Test <length> valid value: 0.35em +PASS Test <length> valid value: 0.35ex +PASS Test <length> valid value: 0.35px +PASS Test <length> valid value: 0.35in +PASS Test <length> valid value: 0.35cm +PASS Test <length> valid value: 0.35mm +PASS Test <length> valid value: 0.35pt +PASS Test <length> valid value: 0.35pc +PASS Test <length> valid value: 0.35% +PASS Test <length> valid value: 1e-10 +PASS Test <length> valid value: 1e-10em +PASS Test <length> valid value: 1e-10ex +PASS Test <length> valid value: 1e-10px +PASS Test <length> valid value: 1e-10in +PASS Test <length> valid value: 1e-10cm +PASS Test <length> valid value: 1e-10mm +PASS Test <length> valid value: 1e-10pt +PASS Test <length> valid value: 1e-10pc +PASS Test <length> valid value: 1e-10% +PASS Test <length> valid value: +32 +PASS Test <length> valid value: +32em +PASS Test <length> valid value: +32ex +PASS Test <length> valid value: +32px +PASS Test <length> valid value: +32in +PASS Test <length> valid value: +32cm +PASS Test <length> valid value: +32mm +PASS Test <length> valid value: +32pt +PASS Test <length> valid value: +32pc +PASS Test <length> valid value: +32% +PASS Test <length> valid value: +17E-1 +PASS Test <length> valid value: +17E-1em +PASS Test <length> valid value: +17E-1ex +PASS Test <length> valid value: +17E-1px +PASS Test <length> valid value: +17E-1in +PASS Test <length> valid value: +17E-1cm +PASS Test <length> valid value: +17E-1mm +PASS Test <length> valid value: +17E-1pt +PASS Test <length> valid value: +17E-1pc +PASS Test <length> valid value: +17E-1% +PASS Test <length> valid value: 17e+2 +PASS Test <length> valid value: 17e+2em +PASS Test <length> valid value: 17e+2ex +PASS Test <length> valid value: 17e+2px +PASS Test <length> valid value: 17e+2in +PASS Test <length> valid value: 17e+2cm +PASS Test <length> valid value: 17e+2mm +PASS Test <length> valid value: 17e+2pt +PASS Test <length> valid value: 17e+2pc +PASS Test <length> valid value: 17e+2% +PASS Test <length> valid value: -47\r\n\t +PASS Test <length> valid value: -47em\r\n\t +PASS Test <length> valid value: -47ex\r\n\t +PASS Test <length> valid value: -47px\r\n\t +PASS Test <length> valid value: -47in\r\n\t +PASS Test <length> valid value: -47cm\r\n\t +PASS Test <length> valid value: -47mm\r\n\t +PASS Test <length> valid value: -47pt\r\n\t +PASS Test <length> valid value: -47pc\r\n\t +PASS Test <length> valid value: -47%\r\n\t +PASS Test <length> valid value: .1\r\n\t +PASS Test <length> valid value: .1em\r\n\t +PASS Test <length> valid value: .1ex\r\n\t +PASS Test <length> valid value: .1px\r\n\t +PASS Test <length> valid value: .1in\r\n\t +PASS Test <length> valid value: .1cm\r\n\t +PASS Test <length> valid value: .1mm\r\n\t +PASS Test <length> valid value: .1pt\r\n\t +PASS Test <length> valid value: .1pc\r\n\t +PASS Test <length> valid value: .1%\r\n\t +PASS Test <length> valid value: 0.35\r\n\t +PASS Test <length> valid value: 0.35em\r\n\t +PASS Test <length> valid value: 0.35ex\r\n\t +PASS Test <length> valid value: 0.35px\r\n\t +PASS Test <length> valid value: 0.35in\r\n\t +PASS Test <length> valid value: 0.35cm\r\n\t +PASS Test <length> valid value: 0.35mm\r\n\t +PASS Test <length> valid value: 0.35pt\r\n\t +PASS Test <length> valid value: 0.35pc\r\n\t +PASS Test <length> valid value: 0.35%\r\n\t +PASS Test <length> valid value: 1e-10\r\n\t +PASS Test <length> valid value: 1e-10em\r\n\t +PASS Test <length> valid value: 1e-10ex\r\n\t +PASS Test <length> valid value: 1e-10px\r\n\t +PASS Test <length> valid value: 1e-10in\r\n\t +PASS Test <length> valid value: 1e-10cm\r\n\t +PASS Test <length> valid value: 1e-10mm\r\n\t +PASS Test <length> valid value: 1e-10pt\r\n\t +PASS Test <length> valid value: 1e-10pc\r\n\t +PASS Test <length> valid value: 1e-10%\r\n\t +PASS Test <length> valid value: +32\r\n\t +PASS Test <length> valid value: +32em\r\n\t +PASS Test <length> valid value: +32ex\r\n\t +PASS Test <length> valid value: +32px\r\n\t +PASS Test <length> valid value: +32in\r\n\t +PASS Test <length> valid value: +32cm\r\n\t +PASS Test <length> valid value: +32mm\r\n\t +PASS Test <length> valid value: +32pt\r\n\t +PASS Test <length> valid value: +32pc\r\n\t +PASS Test <length> valid value: +32%\r\n\t +PASS Test <length> valid value: +17E-1\r\n\t +PASS Test <length> valid value: +17E-1em\r\n\t +PASS Test <length> valid value: +17E-1ex\r\n\t +PASS Test <length> valid value: +17E-1px\r\n\t +PASS Test <length> valid value: +17E-1in\r\n\t +PASS Test <length> valid value: +17E-1cm\r\n\t +PASS Test <length> valid value: +17E-1mm\r\n\t +PASS Test <length> valid value: +17E-1pt\r\n\t +PASS Test <length> valid value: +17E-1pc\r\n\t +PASS Test <length> valid value: +17E-1%\r\n\t +PASS Test <length> valid value: 17e+2\r\n\t +PASS Test <length> valid value: 17e+2em\r\n\t +PASS Test <length> valid value: 17e+2ex\r\n\t +PASS Test <length> valid value: 17e+2px\r\n\t +PASS Test <length> valid value: 17e+2in\r\n\t +PASS Test <length> valid value: 17e+2cm\r\n\t +PASS Test <length> valid value: 17e+2mm\r\n\t +PASS Test <length> valid value: 17e+2pt\r\n\t +PASS Test <length> valid value: 17e+2pc\r\n\t +PASS Test <length> valid value: 17e+2%\r\n\t +PASS Test <length> valid value: -47\f +PASS Test <length> valid value: -47em\f +PASS Test <length> valid value: -47ex\f +PASS Test <length> valid value: -47px\f +PASS Test <length> valid value: -47in\f +PASS Test <length> valid value: -47cm\f +PASS Test <length> valid value: -47mm\f +PASS Test <length> valid value: -47pt\f +PASS Test <length> valid value: -47pc\f +PASS Test <length> valid value: -47%\f +PASS Test <length> valid value: .1\f +PASS Test <length> valid value: .1em\f +PASS Test <length> valid value: .1ex\f +PASS Test <length> valid value: .1px\f +PASS Test <length> valid value: .1in\f +PASS Test <length> valid value: .1cm\f +PASS Test <length> valid value: .1mm\f +PASS Test <length> valid value: .1pt\f +PASS Test <length> valid value: .1pc\f +PASS Test <length> valid value: .1%\f +PASS Test <length> valid value: 0.35\f +PASS Test <length> valid value: 0.35em\f +PASS Test <length> valid value: 0.35ex\f +PASS Test <length> valid value: 0.35px\f +PASS Test <length> valid value: 0.35in\f +PASS Test <length> valid value: 0.35cm\f +PASS Test <length> valid value: 0.35mm\f +PASS Test <length> valid value: 0.35pt\f +PASS Test <length> valid value: 0.35pc\f +PASS Test <length> valid value: 0.35%\f +PASS Test <length> valid value: 1e-10\f +PASS Test <length> valid value: 1e-10em\f +PASS Test <length> valid value: 1e-10ex\f +PASS Test <length> valid value: 1e-10px\f +PASS Test <length> valid value: 1e-10in\f +PASS Test <length> valid value: 1e-10cm\f +PASS Test <length> valid value: 1e-10mm\f +PASS Test <length> valid value: 1e-10pt\f +PASS Test <length> valid value: 1e-10pc\f +PASS Test <length> valid value: 1e-10%\f +PASS Test <length> valid value: +32\f +PASS Test <length> valid value: +32em\f +PASS Test <length> valid value: +32ex\f +PASS Test <length> valid value: +32px\f +PASS Test <length> valid value: +32in\f +PASS Test <length> valid value: +32cm\f +PASS Test <length> valid value: +32mm\f +PASS Test <length> valid value: +32pt\f +PASS Test <length> valid value: +32pc\f +PASS Test <length> valid value: +32%\f +PASS Test <length> valid value: +17E-1\f +PASS Test <length> valid value: +17E-1em\f +PASS Test <length> valid value: +17E-1ex\f +PASS Test <length> valid value: +17E-1px\f +PASS Test <length> valid value: +17E-1in\f +PASS Test <length> valid value: +17E-1cm\f +PASS Test <length> valid value: +17E-1mm\f +PASS Test <length> valid value: +17E-1pt\f +PASS Test <length> valid value: +17E-1pc\f +PASS Test <length> valid value: +17E-1%\f +PASS Test <length> valid value: 17e+2\f +PASS Test <length> valid value: 17e+2em\f +PASS Test <length> valid value: 17e+2ex\f +PASS Test <length> valid value: 17e+2px\f +PASS Test <length> valid value: 17e+2in\f +PASS Test <length> valid value: 17e+2cm\f +PASS Test <length> valid value: 17e+2mm\f +PASS Test <length> valid value: 17e+2pt\f +PASS Test <length> valid value: 17e+2pc\f +PASS Test <length> valid value: 17e+2%\f +PASS Test <length> WS invalid value: -47 em +PASS Test <length> WS invalid value: .1 em +PASS Test <length> WS invalid value: 0.35 em +PASS Test <length> WS invalid value: 1e-10 em +PASS Test <length> WS invalid value: +32 em +PASS Test <length> WS invalid value: +17E-1 em +PASS Test <length> WS invalid value: 17e+2 em +PASS Test <length> WS invalid value: -47 ex +PASS Test <length> WS invalid value: .1 ex +PASS Test <length> WS invalid value: 0.35 ex +PASS Test <length> WS invalid value: 1e-10 ex +PASS Test <length> WS invalid value: +32 ex +PASS Test <length> WS invalid value: +17E-1 ex +PASS Test <length> WS invalid value: 17e+2 ex +PASS Test <length> WS invalid value: -47 px +PASS Test <length> WS invalid value: .1 px +PASS Test <length> WS invalid value: 0.35 px +PASS Test <length> WS invalid value: 1e-10 px +PASS Test <length> WS invalid value: +32 px +PASS Test <length> WS invalid value: +17E-1 px +PASS Test <length> WS invalid value: 17e+2 px +PASS Test <length> WS invalid value: -47 in +PASS Test <length> WS invalid value: .1 in +PASS Test <length> WS invalid value: 0.35 in +PASS Test <length> WS invalid value: 1e-10 in +PASS Test <length> WS invalid value: +32 in +PASS Test <length> WS invalid value: +17E-1 in +PASS Test <length> WS invalid value: 17e+2 in +PASS Test <length> WS invalid value: -47 cm +PASS Test <length> WS invalid value: .1 cm +PASS Test <length> WS invalid value: 0.35 cm +PASS Test <length> WS invalid value: 1e-10 cm +PASS Test <length> WS invalid value: +32 cm +PASS Test <length> WS invalid value: +17E-1 cm +PASS Test <length> WS invalid value: 17e+2 cm +PASS Test <length> WS invalid value: -47 mm +PASS Test <length> WS invalid value: .1 mm +PASS Test <length> WS invalid value: 0.35 mm +PASS Test <length> WS invalid value: 1e-10 mm +PASS Test <length> WS invalid value: +32 mm +PASS Test <length> WS invalid value: +17E-1 mm +PASS Test <length> WS invalid value: 17e+2 mm +PASS Test <length> WS invalid value: -47 pt +PASS Test <length> WS invalid value: .1 pt +PASS Test <length> WS invalid value: 0.35 pt +PASS Test <length> WS invalid value: 1e-10 pt +PASS Test <length> WS invalid value: +32 pt +PASS Test <length> WS invalid value: +17E-1 pt +PASS Test <length> WS invalid value: 17e+2 pt +PASS Test <length> WS invalid value: -47 pc +PASS Test <length> WS invalid value: .1 pc +PASS Test <length> WS invalid value: 0.35 pc +PASS Test <length> WS invalid value: 1e-10 pc +PASS Test <length> WS invalid value: +32 pc +PASS Test <length> WS invalid value: +17E-1 pc +PASS Test <length> WS invalid value: 17e+2 pc +PASS Test <length> WS invalid value: -47 % +PASS Test <length> WS invalid value: .1 % +PASS Test <length> WS invalid value: 0.35 % +PASS Test <length> WS invalid value: 1e-10 % +PASS Test <length> WS invalid value: +32 % +PASS Test <length> WS invalid value: +17E-1 % +PASS Test <length> WS invalid value: 17e+2 % +PASS Test <length> trailing garbage, value: -47a +PASS Test <length> trailing garbage, value: .1a +PASS Test <length> trailing garbage, value: 0.35a +PASS Test <length> trailing garbage, value: 1e-10a +PASS Test <length> trailing garbage, value: +32a +PASS Test <length> trailing garbage, value: +17E-1a +PASS Test <length> trailing garbage, value: 17e+2a +PASS Test <length> trailing garbage, value: -47e +PASS Test <length> trailing garbage, value: .1e +PASS Test <length> trailing garbage, value: 0.35e +PASS Test <length> trailing garbage, value: 1e-10e +PASS Test <length> trailing garbage, value: +32e +PASS Test <length> trailing garbage, value: +17E-1e +PASS Test <length> trailing garbage, value: 17e+2e +PASS Test <length> trailing garbage, value: -47foo +PASS Test <length> trailing garbage, value: .1foo +PASS Test <length> trailing garbage, value: 0.35foo +PASS Test <length> trailing garbage, value: 1e-10foo +PASS Test <length> trailing garbage, value: +32foo +PASS Test <length> trailing garbage, value: +17E-1foo +PASS Test <length> trailing garbage, value: 17e+2foo +PASS Test <length> trailing garbage, value: -47)90 +PASS Test <length> trailing garbage, value: .1)90 +PASS Test <length> trailing garbage, value: 0.35)90 +PASS Test <length> trailing garbage, value: 1e-10)90 +PASS Test <length> trailing garbage, value: +32)90 +PASS Test <length> trailing garbage, value: +17E-1)90 +PASS Test <length> trailing garbage, value: 17e+2)90 +PASS Test <length> valid value: \r\n\t -47 +PASS Test <length> valid value: \r\n\t -47em +PASS Test <length> valid value: \r\n\t -47ex +PASS Test <length> valid value: \r\n\t -47px +PASS Test <length> valid value: \r\n\t -47in +PASS Test <length> valid value: \r\n\t -47cm +PASS Test <length> valid value: \r\n\t -47mm +PASS Test <length> valid value: \r\n\t -47pt +PASS Test <length> valid value: \r\n\t -47pc +PASS Test <length> valid value: \r\n\t -47% +PASS Test <length> valid value: \r\n\t .1 +PASS Test <length> valid value: \r\n\t .1em +PASS Test <length> valid value: \r\n\t .1ex +PASS Test <length> valid value: \r\n\t .1px +PASS Test <length> valid value: \r\n\t .1in +PASS Test <length> valid value: \r\n\t .1cm +PASS Test <length> valid value: \r\n\t .1mm +PASS Test <length> valid value: \r\n\t .1pt +PASS Test <length> valid value: \r\n\t .1pc +PASS Test <length> valid value: \r\n\t .1% +PASS Test <length> valid value: \r\n\t 0.35 +PASS Test <length> valid value: \r\n\t 0.35em +PASS Test <length> valid value: \r\n\t 0.35ex +PASS Test <length> valid value: \r\n\t 0.35px +PASS Test <length> valid value: \r\n\t 0.35in +PASS Test <length> valid value: \r\n\t 0.35cm +PASS Test <length> valid value: \r\n\t 0.35mm +PASS Test <length> valid value: \r\n\t 0.35pt +PASS Test <length> valid value: \r\n\t 0.35pc +PASS Test <length> valid value: \r\n\t 0.35% +PASS Test <length> valid value: \r\n\t 1e-10 +PASS Test <length> valid value: \r\n\t 1e-10em +PASS Test <length> valid value: \r\n\t 1e-10ex +PASS Test <length> valid value: \r\n\t 1e-10px +PASS Test <length> valid value: \r\n\t 1e-10in +PASS Test <length> valid value: \r\n\t 1e-10cm +PASS Test <length> valid value: \r\n\t 1e-10mm +PASS Test <length> valid value: \r\n\t 1e-10pt +PASS Test <length> valid value: \r\n\t 1e-10pc +PASS Test <length> valid value: \r\n\t 1e-10% +PASS Test <length> valid value: \r\n\t +32 +PASS Test <length> valid value: \r\n\t +32em +PASS Test <length> valid value: \r\n\t +32ex +PASS Test <length> valid value: \r\n\t +32px +PASS Test <length> valid value: \r\n\t +32in +PASS Test <length> valid value: \r\n\t +32cm +PASS Test <length> valid value: \r\n\t +32mm +PASS Test <length> valid value: \r\n\t +32pt +PASS Test <length> valid value: \r\n\t +32pc +PASS Test <length> valid value: \r\n\t +32% +PASS Test <length> valid value: \r\n\t +17E-1 +PASS Test <length> valid value: \r\n\t +17E-1em +PASS Test <length> valid value: \r\n\t +17E-1ex +PASS Test <length> valid value: \r\n\t +17E-1px +PASS Test <length> valid value: \r\n\t +17E-1in +PASS Test <length> valid value: \r\n\t +17E-1cm +PASS Test <length> valid value: \r\n\t +17E-1mm +PASS Test <length> valid value: \r\n\t +17E-1pt +PASS Test <length> valid value: \r\n\t +17E-1pc +PASS Test <length> valid value: \r\n\t +17E-1% +PASS Test <length> valid value: \r\n\t 17e+2 +PASS Test <length> valid value: \r\n\t 17e+2em +PASS Test <length> valid value: \r\n\t 17e+2ex +PASS Test <length> valid value: \r\n\t 17e+2px +PASS Test <length> valid value: \r\n\t 17e+2in +PASS Test <length> valid value: \r\n\t 17e+2cm +PASS Test <length> valid value: \r\n\t 17e+2mm +PASS Test <length> valid value: \r\n\t 17e+2pt +PASS Test <length> valid value: \r\n\t 17e+2pc +PASS Test <length> valid value: \r\n\t 17e+2% +PASS Test <length> valid value: \r\n\t -47 +PASS Test <length> valid value: \r\n\t -47em +PASS Test <length> valid value: \r\n\t -47ex +PASS Test <length> valid value: \r\n\t -47px +PASS Test <length> valid value: \r\n\t -47in +PASS Test <length> valid value: \r\n\t -47cm +PASS Test <length> valid value: \r\n\t -47mm +PASS Test <length> valid value: \r\n\t -47pt +PASS Test <length> valid value: \r\n\t -47pc +PASS Test <length> valid value: \r\n\t -47% +PASS Test <length> valid value: \r\n\t .1 +PASS Test <length> valid value: \r\n\t .1em +PASS Test <length> valid value: \r\n\t .1ex +PASS Test <length> valid value: \r\n\t .1px +PASS Test <length> valid value: \r\n\t .1in +PASS Test <length> valid value: \r\n\t .1cm +PASS Test <length> valid value: \r\n\t .1mm +PASS Test <length> valid value: \r\n\t .1pt +PASS Test <length> valid value: \r\n\t .1pc +PASS Test <length> valid value: \r\n\t .1% +PASS Test <length> valid value: \r\n\t 0.35 +PASS Test <length> valid value: \r\n\t 0.35em +PASS Test <length> valid value: \r\n\t 0.35ex +PASS Test <length> valid value: \r\n\t 0.35px +PASS Test <length> valid value: \r\n\t 0.35in +PASS Test <length> valid value: \r\n\t 0.35cm +PASS Test <length> valid value: \r\n\t 0.35mm +PASS Test <length> valid value: \r\n\t 0.35pt +PASS Test <length> valid value: \r\n\t 0.35pc +PASS Test <length> valid value: \r\n\t 0.35% +PASS Test <length> valid value: \r\n\t 1e-10 +PASS Test <length> valid value: \r\n\t 1e-10em +PASS Test <length> valid value: \r\n\t 1e-10ex +PASS Test <length> valid value: \r\n\t 1e-10px +PASS Test <length> valid value: \r\n\t 1e-10in +PASS Test <length> valid value: \r\n\t 1e-10cm +PASS Test <length> valid value: \r\n\t 1e-10mm +PASS Test <length> valid value: \r\n\t 1e-10pt +PASS Test <length> valid value: \r\n\t 1e-10pc +PASS Test <length> valid value: \r\n\t 1e-10% +PASS Test <length> valid value: \r\n\t +32 +PASS Test <length> valid value: \r\n\t +32em +PASS Test <length> valid value: \r\n\t +32ex +PASS Test <length> valid value: \r\n\t +32px +PASS Test <length> valid value: \r\n\t +32in +PASS Test <length> valid value: \r\n\t +32cm +PASS Test <length> valid value: \r\n\t +32mm +PASS Test <length> valid value: \r\n\t +32pt +PASS Test <length> valid value: \r\n\t +32pc +PASS Test <length> valid value: \r\n\t +32% +PASS Test <length> valid value: \r\n\t +17E-1 +PASS Test <length> valid value: \r\n\t +17E-1em +PASS Test <length> valid value: \r\n\t +17E-1ex +PASS Test <length> valid value: \r\n\t +17E-1px +PASS Test <length> valid value: \r\n\t +17E-1in +PASS Test <length> valid value: \r\n\t +17E-1cm +PASS Test <length> valid value: \r\n\t +17E-1mm +PASS Test <length> valid value: \r\n\t +17E-1pt +PASS Test <length> valid value: \r\n\t +17E-1pc +PASS Test <length> valid value: \r\n\t +17E-1% +PASS Test <length> valid value: \r\n\t 17e+2 +PASS Test <length> valid value: \r\n\t 17e+2em +PASS Test <length> valid value: \r\n\t 17e+2ex +PASS Test <length> valid value: \r\n\t 17e+2px +PASS Test <length> valid value: \r\n\t 17e+2in +PASS Test <length> valid value: \r\n\t 17e+2cm +PASS Test <length> valid value: \r\n\t 17e+2mm +PASS Test <length> valid value: \r\n\t 17e+2pt +PASS Test <length> valid value: \r\n\t 17e+2pc +PASS Test <length> valid value: \r\n\t 17e+2% +PASS Test <length> valid value: \r\n\t -47 +PASS Test <length> valid value: \r\n\t -47em +PASS Test <length> valid value: \r\n\t -47ex +PASS Test <length> valid value: \r\n\t -47px +PASS Test <length> valid value: \r\n\t -47in +PASS Test <length> valid value: \r\n\t -47cm +PASS Test <length> valid value: \r\n\t -47mm +PASS Test <length> valid value: \r\n\t -47pt +PASS Test <length> valid value: \r\n\t -47pc +PASS Test <length> valid value: \r\n\t -47% +PASS Test <length> valid value: \r\n\t .1 +PASS Test <length> valid value: \r\n\t .1em +PASS Test <length> valid value: \r\n\t .1ex +PASS Test <length> valid value: \r\n\t .1px +PASS Test <length> valid value: \r\n\t .1in +PASS Test <length> valid value: \r\n\t .1cm +PASS Test <length> valid value: \r\n\t .1mm +PASS Test <length> valid value: \r\n\t .1pt +PASS Test <length> valid value: \r\n\t .1pc +PASS Test <length> valid value: \r\n\t .1% +PASS Test <length> valid value: \r\n\t 0.35 +PASS Test <length> valid value: \r\n\t 0.35em +PASS Test <length> valid value: \r\n\t 0.35ex +PASS Test <length> valid value: \r\n\t 0.35px +PASS Test <length> valid value: \r\n\t 0.35in +PASS Test <length> valid value: \r\n\t 0.35cm +PASS Test <length> valid value: \r\n\t 0.35mm +PASS Test <length> valid value: \r\n\t 0.35pt +PASS Test <length> valid value: \r\n\t 0.35pc +PASS Test <length> valid value: \r\n\t 0.35% +PASS Test <length> valid value: \r\n\t 1e-10 +PASS Test <length> valid value: \r\n\t 1e-10em +PASS Test <length> valid value: \r\n\t 1e-10ex +PASS Test <length> valid value: \r\n\t 1e-10px +PASS Test <length> valid value: \r\n\t 1e-10in +PASS Test <length> valid value: \r\n\t 1e-10cm +PASS Test <length> valid value: \r\n\t 1e-10mm +PASS Test <length> valid value: \r\n\t 1e-10pt +PASS Test <length> valid value: \r\n\t 1e-10pc +PASS Test <length> valid value: \r\n\t 1e-10% +PASS Test <length> valid value: \r\n\t +32 +PASS Test <length> valid value: \r\n\t +32em +PASS Test <length> valid value: \r\n\t +32ex +PASS Test <length> valid value: \r\n\t +32px +PASS Test <length> valid value: \r\n\t +32in +PASS Test <length> valid value: \r\n\t +32cm +PASS Test <length> valid value: \r\n\t +32mm +PASS Test <length> valid value: \r\n\t +32pt +PASS Test <length> valid value: \r\n\t +32pc +PASS Test <length> valid value: \r\n\t +32% +PASS Test <length> valid value: \r\n\t +17E-1 +PASS Test <length> valid value: \r\n\t +17E-1em +PASS Test <length> valid value: \r\n\t +17E-1ex +PASS Test <length> valid value: \r\n\t +17E-1px +PASS Test <length> valid value: \r\n\t +17E-1in +PASS Test <length> valid value: \r\n\t +17E-1cm +PASS Test <length> valid value: \r\n\t +17E-1mm +PASS Test <length> valid value: \r\n\t +17E-1pt +PASS Test <length> valid value: \r\n\t +17E-1pc +PASS Test <length> valid value: \r\n\t +17E-1% +PASS Test <length> valid value: \r\n\t 17e+2 +PASS Test <length> valid value: \r\n\t 17e+2em +PASS Test <length> valid value: \r\n\t 17e+2ex +PASS Test <length> valid value: \r\n\t 17e+2px +PASS Test <length> valid value: \r\n\t 17e+2in +PASS Test <length> valid value: \r\n\t 17e+2cm +PASS Test <length> valid value: \r\n\t 17e+2mm +PASS Test <length> valid value: \r\n\t 17e+2pt +PASS Test <length> valid value: \r\n\t 17e+2pc +PASS Test <length> valid value: \r\n\t 17e+2% +PASS Test <length> valid value: \r\n\t -47\r\n\t +PASS Test <length> valid value: \r\n\t -47em\r\n\t +PASS Test <length> valid value: \r\n\t -47ex\r\n\t +PASS Test <length> valid value: \r\n\t -47px\r\n\t +PASS Test <length> valid value: \r\n\t -47in\r\n\t +PASS Test <length> valid value: \r\n\t -47cm\r\n\t +PASS Test <length> valid value: \r\n\t -47mm\r\n\t +PASS Test <length> valid value: \r\n\t -47pt\r\n\t +PASS Test <length> valid value: \r\n\t -47pc\r\n\t +PASS Test <length> valid value: \r\n\t -47%\r\n\t +PASS Test <length> valid value: \r\n\t .1\r\n\t +PASS Test <length> valid value: \r\n\t .1em\r\n\t +PASS Test <length> valid value: \r\n\t .1ex\r\n\t +PASS Test <length> valid value: \r\n\t .1px\r\n\t +PASS Test <length> valid value: \r\n\t .1in\r\n\t +PASS Test <length> valid value: \r\n\t .1cm\r\n\t +PASS Test <length> valid value: \r\n\t .1mm\r\n\t +PASS Test <length> valid value: \r\n\t .1pt\r\n\t +PASS Test <length> valid value: \r\n\t .1pc\r\n\t +PASS Test <length> valid value: \r\n\t .1%\r\n\t +PASS Test <length> valid value: \r\n\t 0.35\r\n\t +PASS Test <length> valid value: \r\n\t 0.35em\r\n\t +PASS Test <length> valid value: \r\n\t 0.35ex\r\n\t +PASS Test <length> valid value: \r\n\t 0.35px\r\n\t +PASS Test <length> valid value: \r\n\t 0.35in\r\n\t +PASS Test <length> valid value: \r\n\t 0.35cm\r\n\t +PASS Test <length> valid value: \r\n\t 0.35mm\r\n\t +PASS Test <length> valid value: \r\n\t 0.35pt\r\n\t +PASS Test <length> valid value: \r\n\t 0.35pc\r\n\t +PASS Test <length> valid value: \r\n\t 0.35%\r\n\t +PASS Test <length> valid value: \r\n\t 1e-10\r\n\t +PASS Test <length> valid value: \r\n\t 1e-10em\r\n\t +PASS Test <length> valid value: \r\n\t 1e-10ex\r\n\t +PASS Test <length> valid value: \r\n\t 1e-10px\r\n\t +PASS Test <length> valid value: \r\n\t 1e-10in\r\n\t +PASS Test <length> valid value: \r\n\t 1e-10cm\r\n\t +PASS Test <length> valid value: \r\n\t 1e-10mm\r\n\t +PASS Test <length> valid value: \r\n\t 1e-10pt\r\n\t +PASS Test <length> valid value: \r\n\t 1e-10pc\r\n\t +PASS Test <length> valid value: \r\n\t 1e-10%\r\n\t +PASS Test <length> valid value: \r\n\t +32\r\n\t +PASS Test <length> valid value: \r\n\t +32em\r\n\t +PASS Test <length> valid value: \r\n\t +32ex\r\n\t +PASS Test <length> valid value: \r\n\t +32px\r\n\t +PASS Test <length> valid value: \r\n\t +32in\r\n\t +PASS Test <length> valid value: \r\n\t +32cm\r\n\t +PASS Test <length> valid value: \r\n\t +32mm\r\n\t +PASS Test <length> valid value: \r\n\t +32pt\r\n\t +PASS Test <length> valid value: \r\n\t +32pc\r\n\t +PASS Test <length> valid value: \r\n\t +32%\r\n\t +PASS Test <length> valid value: \r\n\t +17E-1\r\n\t +PASS Test <length> valid value: \r\n\t +17E-1em\r\n\t +PASS Test <length> valid value: \r\n\t +17E-1ex\r\n\t +PASS Test <length> valid value: \r\n\t +17E-1px\r\n\t +PASS Test <length> valid value: \r\n\t +17E-1in\r\n\t +PASS Test <length> valid value: \r\n\t +17E-1cm\r\n\t +PASS Test <length> valid value: \r\n\t +17E-1mm\r\n\t +PASS Test <length> valid value: \r\n\t +17E-1pt\r\n\t +PASS Test <length> valid value: \r\n\t +17E-1pc\r\n\t +PASS Test <length> valid value: \r\n\t +17E-1%\r\n\t +PASS Test <length> valid value: \r\n\t 17e+2\r\n\t +PASS Test <length> valid value: \r\n\t 17e+2em\r\n\t +PASS Test <length> valid value: \r\n\t 17e+2ex\r\n\t +PASS Test <length> valid value: \r\n\t 17e+2px\r\n\t +PASS Test <length> valid value: \r\n\t 17e+2in\r\n\t +PASS Test <length> valid value: \r\n\t 17e+2cm\r\n\t +PASS Test <length> valid value: \r\n\t 17e+2mm\r\n\t +PASS Test <length> valid value: \r\n\t 17e+2pt\r\n\t +PASS Test <length> valid value: \r\n\t 17e+2pc\r\n\t +PASS Test <length> valid value: \r\n\t 17e+2%\r\n\t +PASS Test <length> valid value: \r\n\t -47\f +PASS Test <length> valid value: \r\n\t -47em\f +PASS Test <length> valid value: \r\n\t -47ex\f +PASS Test <length> valid value: \r\n\t -47px\f +PASS Test <length> valid value: \r\n\t -47in\f +PASS Test <length> valid value: \r\n\t -47cm\f +PASS Test <length> valid value: \r\n\t -47mm\f +PASS Test <length> valid value: \r\n\t -47pt\f +PASS Test <length> valid value: \r\n\t -47pc\f +PASS Test <length> valid value: \r\n\t -47%\f +PASS Test <length> valid value: \r\n\t .1\f +PASS Test <length> valid value: \r\n\t .1em\f +PASS Test <length> valid value: \r\n\t .1ex\f +PASS Test <length> valid value: \r\n\t .1px\f +PASS Test <length> valid value: \r\n\t .1in\f +PASS Test <length> valid value: \r\n\t .1cm\f +PASS Test <length> valid value: \r\n\t .1mm\f +PASS Test <length> valid value: \r\n\t .1pt\f +PASS Test <length> valid value: \r\n\t .1pc\f +PASS Test <length> valid value: \r\n\t .1%\f +PASS Test <length> valid value: \r\n\t 0.35\f +PASS Test <length> valid value: \r\n\t 0.35em\f +PASS Test <length> valid value: \r\n\t 0.35ex\f +PASS Test <length> valid value: \r\n\t 0.35px\f +PASS Test <length> valid value: \r\n\t 0.35in\f +PASS Test <length> valid value: \r\n\t 0.35cm\f +PASS Test <length> valid value: \r\n\t 0.35mm\f +PASS Test <length> valid value: \r\n\t 0.35pt\f +PASS Test <length> valid value: \r\n\t 0.35pc\f +PASS Test <length> valid value: \r\n\t 0.35%\f +PASS Test <length> valid value: \r\n\t 1e-10\f +PASS Test <length> valid value: \r\n\t 1e-10em\f +PASS Test <length> valid value: \r\n\t 1e-10ex\f +PASS Test <length> valid value: \r\n\t 1e-10px\f +PASS Test <length> valid value: \r\n\t 1e-10in\f +PASS Test <length> valid value: \r\n\t 1e-10cm\f +PASS Test <length> valid value: \r\n\t 1e-10mm\f +PASS Test <length> valid value: \r\n\t 1e-10pt\f +PASS Test <length> valid value: \r\n\t 1e-10pc\f +PASS Test <length> valid value: \r\n\t 1e-10%\f +PASS Test <length> valid value: \r\n\t +32\f +PASS Test <length> valid value: \r\n\t +32em\f +PASS Test <length> valid value: \r\n\t +32ex\f +PASS Test <length> valid value: \r\n\t +32px\f +PASS Test <length> valid value: \r\n\t +32in\f +PASS Test <length> valid value: \r\n\t +32cm\f +PASS Test <length> valid value: \r\n\t +32mm\f +PASS Test <length> valid value: \r\n\t +32pt\f +PASS Test <length> valid value: \r\n\t +32pc\f +PASS Test <length> valid value: \r\n\t +32%\f +PASS Test <length> valid value: \r\n\t +17E-1\f +PASS Test <length> valid value: \r\n\t +17E-1em\f +PASS Test <length> valid value: \r\n\t +17E-1ex\f +PASS Test <length> valid value: \r\n\t +17E-1px\f +PASS Test <length> valid value: \r\n\t +17E-1in\f +PASS Test <length> valid value: \r\n\t +17E-1cm\f +PASS Test <length> valid value: \r\n\t +17E-1mm\f +PASS Test <length> valid value: \r\n\t +17E-1pt\f +PASS Test <length> valid value: \r\n\t +17E-1pc\f +PASS Test <length> valid value: \r\n\t +17E-1%\f +PASS Test <length> valid value: \r\n\t 17e+2\f +PASS Test <length> valid value: \r\n\t 17e+2em\f +PASS Test <length> valid value: \r\n\t 17e+2ex\f +PASS Test <length> valid value: \r\n\t 17e+2px\f +PASS Test <length> valid value: \r\n\t 17e+2in\f +PASS Test <length> valid value: \r\n\t 17e+2cm\f +PASS Test <length> valid value: \r\n\t 17e+2mm\f +PASS Test <length> valid value: \r\n\t 17e+2pt\f +PASS Test <length> valid value: \r\n\t 17e+2pc\f +PASS Test <length> valid value: \r\n\t 17e+2%\f +PASS Test <length> WS invalid value: -47\r\n\t em +PASS Test <length> WS invalid value: .1\r\n\t em +PASS Test <length> WS invalid value: 0.35\r\n\t em +PASS Test <length> WS invalid value: 1e-10\r\n\t em +PASS Test <length> WS invalid value: +32\r\n\t em +PASS Test <length> WS invalid value: +17E-1\r\n\t em +PASS Test <length> WS invalid value: 17e+2\r\n\t em +PASS Test <length> WS invalid value: -47\r\n\t ex +PASS Test <length> WS invalid value: .1\r\n\t ex +PASS Test <length> WS invalid value: 0.35\r\n\t ex +PASS Test <length> WS invalid value: 1e-10\r\n\t ex +PASS Test <length> WS invalid value: +32\r\n\t ex +PASS Test <length> WS invalid value: +17E-1\r\n\t ex +PASS Test <length> WS invalid value: 17e+2\r\n\t ex +PASS Test <length> WS invalid value: -47\r\n\t px +PASS Test <length> WS invalid value: .1\r\n\t px +PASS Test <length> WS invalid value: 0.35\r\n\t px +PASS Test <length> WS invalid value: 1e-10\r\n\t px +PASS Test <length> WS invalid value: +32\r\n\t px +PASS Test <length> WS invalid value: +17E-1\r\n\t px +PASS Test <length> WS invalid value: 17e+2\r\n\t px +PASS Test <length> WS invalid value: -47\r\n\t in +PASS Test <length> WS invalid value: .1\r\n\t in +PASS Test <length> WS invalid value: 0.35\r\n\t in +PASS Test <length> WS invalid value: 1e-10\r\n\t in +PASS Test <length> WS invalid value: +32\r\n\t in +PASS Test <length> WS invalid value: +17E-1\r\n\t in +PASS Test <length> WS invalid value: 17e+2\r\n\t in +PASS Test <length> WS invalid value: -47\r\n\t cm +PASS Test <length> WS invalid value: .1\r\n\t cm +PASS Test <length> WS invalid value: 0.35\r\n\t cm +PASS Test <length> WS invalid value: 1e-10\r\n\t cm +PASS Test <length> WS invalid value: +32\r\n\t cm +PASS Test <length> WS invalid value: +17E-1\r\n\t cm +PASS Test <length> WS invalid value: 17e+2\r\n\t cm +PASS Test <length> WS invalid value: -47\r\n\t mm +PASS Test <length> WS invalid value: .1\r\n\t mm +PASS Test <length> WS invalid value: 0.35\r\n\t mm +PASS Test <length> WS invalid value: 1e-10\r\n\t mm +PASS Test <length> WS invalid value: +32\r\n\t mm +PASS Test <length> WS invalid value: +17E-1\r\n\t mm +PASS Test <length> WS invalid value: 17e+2\r\n\t mm +PASS Test <length> WS invalid value: -47\r\n\t pt +PASS Test <length> WS invalid value: .1\r\n\t pt +PASS Test <length> WS invalid value: 0.35\r\n\t pt +PASS Test <length> WS invalid value: 1e-10\r\n\t pt +PASS Test <length> WS invalid value: +32\r\n\t pt +PASS Test <length> WS invalid value: +17E-1\r\n\t pt +PASS Test <length> WS invalid value: 17e+2\r\n\t pt +PASS Test <length> WS invalid value: -47\r\n\t pc +PASS Test <length> WS invalid value: .1\r\n\t pc +PASS Test <length> WS invalid value: 0.35\r\n\t pc +PASS Test <length> WS invalid value: 1e-10\r\n\t pc +PASS Test <length> WS invalid value: +32\r\n\t pc +PASS Test <length> WS invalid value: +17E-1\r\n\t pc +PASS Test <length> WS invalid value: 17e+2\r\n\t pc +PASS Test <length> WS invalid value: -47\r\n\t % +PASS Test <length> WS invalid value: .1\r\n\t % +PASS Test <length> WS invalid value: 0.35\r\n\t % +PASS Test <length> WS invalid value: 1e-10\r\n\t % +PASS Test <length> WS invalid value: +32\r\n\t % +PASS Test <length> WS invalid value: +17E-1\r\n\t % +PASS Test <length> WS invalid value: 17e+2\r\n\t % +PASS Test <length> trailing garbage, value: \r\n\t -47a +PASS Test <length> trailing garbage, value: \r\n\t .1a +PASS Test <length> trailing garbage, value: \r\n\t 0.35a +PASS Test <length> trailing garbage, value: \r\n\t 1e-10a +PASS Test <length> trailing garbage, value: \r\n\t +32a +PASS Test <length> trailing garbage, value: \r\n\t +17E-1a +PASS Test <length> trailing garbage, value: \r\n\t 17e+2a +PASS Test <length> trailing garbage, value: \r\n\t -47e +PASS Test <length> trailing garbage, value: \r\n\t .1e +PASS Test <length> trailing garbage, value: \r\n\t 0.35e +PASS Test <length> trailing garbage, value: \r\n\t 1e-10e +PASS Test <length> trailing garbage, value: \r\n\t +32e +PASS Test <length> trailing garbage, value: \r\n\t +17E-1e +PASS Test <length> trailing garbage, value: \r\n\t 17e+2e +PASS Test <length> trailing garbage, value: \r\n\t -47foo +PASS Test <length> trailing garbage, value: \r\n\t .1foo +PASS Test <length> trailing garbage, value: \r\n\t 0.35foo +PASS Test <length> trailing garbage, value: \r\n\t 1e-10foo +PASS Test <length> trailing garbage, value: \r\n\t +32foo +PASS Test <length> trailing garbage, value: \r\n\t +17E-1foo +PASS Test <length> trailing garbage, value: \r\n\t 17e+2foo +PASS Test <length> trailing garbage, value: \r\n\t -47)90 +PASS Test <length> trailing garbage, value: \r\n\t .1)90 +PASS Test <length> trailing garbage, value: \r\n\t 0.35)90 +PASS Test <length> trailing garbage, value: \r\n\t 1e-10)90 +PASS Test <length> trailing garbage, value: \r\n\t +32)90 +PASS Test <length> trailing garbage, value: \r\n\t +17E-1)90 +PASS Test <length> trailing garbage, value: \r\n\t 17e+2)90 +PASS Test <length> valid value: \f-47 +PASS Test <length> valid value: \f-47em +PASS Test <length> valid value: \f-47ex +PASS Test <length> valid value: \f-47px +PASS Test <length> valid value: \f-47in +PASS Test <length> valid value: \f-47cm +PASS Test <length> valid value: \f-47mm +PASS Test <length> valid value: \f-47pt +PASS Test <length> valid value: \f-47pc +PASS Test <length> valid value: \f-47% +PASS Test <length> valid value: \f.1 +PASS Test <length> valid value: \f.1em +PASS Test <length> valid value: \f.1ex +PASS Test <length> valid value: \f.1px +PASS Test <length> valid value: \f.1in +PASS Test <length> valid value: \f.1cm +PASS Test <length> valid value: \f.1mm +PASS Test <length> valid value: \f.1pt +PASS Test <length> valid value: \f.1pc +PASS Test <length> valid value: \f.1% +PASS Test <length> valid value: \f0.35 +PASS Test <length> valid value: \f0.35em +PASS Test <length> valid value: \f0.35ex +PASS Test <length> valid value: \f0.35px +PASS Test <length> valid value: \f0.35in +PASS Test <length> valid value: \f0.35cm +PASS Test <length> valid value: \f0.35mm +PASS Test <length> valid value: \f0.35pt +PASS Test <length> valid value: \f0.35pc +PASS Test <length> valid value: \f0.35% +PASS Test <length> valid value: \f1e-10 +PASS Test <length> valid value: \f1e-10em +PASS Test <length> valid value: \f1e-10ex +PASS Test <length> valid value: \f1e-10px +PASS Test <length> valid value: \f1e-10in +PASS Test <length> valid value: \f1e-10cm +PASS Test <length> valid value: \f1e-10mm +PASS Test <length> valid value: \f1e-10pt +PASS Test <length> valid value: \f1e-10pc +PASS Test <length> valid value: \f1e-10% +PASS Test <length> valid value: \f+32 +PASS Test <length> valid value: \f+32em +PASS Test <length> valid value: \f+32ex +PASS Test <length> valid value: \f+32px +PASS Test <length> valid value: \f+32in +PASS Test <length> valid value: \f+32cm +PASS Test <length> valid value: \f+32mm +PASS Test <length> valid value: \f+32pt +PASS Test <length> valid value: \f+32pc +PASS Test <length> valid value: \f+32% +PASS Test <length> valid value: \f+17E-1 +PASS Test <length> valid value: \f+17E-1em +PASS Test <length> valid value: \f+17E-1ex +PASS Test <length> valid value: \f+17E-1px +PASS Test <length> valid value: \f+17E-1in +PASS Test <length> valid value: \f+17E-1cm +PASS Test <length> valid value: \f+17E-1mm +PASS Test <length> valid value: \f+17E-1pt +PASS Test <length> valid value: \f+17E-1pc +PASS Test <length> valid value: \f+17E-1% +PASS Test <length> valid value: \f17e+2 +PASS Test <length> valid value: \f17e+2em +PASS Test <length> valid value: \f17e+2ex +PASS Test <length> valid value: \f17e+2px +PASS Test <length> valid value: \f17e+2in +PASS Test <length> valid value: \f17e+2cm +PASS Test <length> valid value: \f17e+2mm +PASS Test <length> valid value: \f17e+2pt +PASS Test <length> valid value: \f17e+2pc +PASS Test <length> valid value: \f17e+2% +PASS Test <length> valid value: \f-47 +PASS Test <length> valid value: \f-47em +PASS Test <length> valid value: \f-47ex +PASS Test <length> valid value: \f-47px +PASS Test <length> valid value: \f-47in +PASS Test <length> valid value: \f-47cm +PASS Test <length> valid value: \f-47mm +PASS Test <length> valid value: \f-47pt +PASS Test <length> valid value: \f-47pc +PASS Test <length> valid value: \f-47% +PASS Test <length> valid value: \f.1 +PASS Test <length> valid value: \f.1em +PASS Test <length> valid value: \f.1ex +PASS Test <length> valid value: \f.1px +PASS Test <length> valid value: \f.1in +PASS Test <length> valid value: \f.1cm +PASS Test <length> valid value: \f.1mm +PASS Test <length> valid value: \f.1pt +PASS Test <length> valid value: \f.1pc +PASS Test <length> valid value: \f.1% +PASS Test <length> valid value: \f0.35 +PASS Test <length> valid value: \f0.35em +PASS Test <length> valid value: \f0.35ex +PASS Test <length> valid value: \f0.35px +PASS Test <length> valid value: \f0.35in +PASS Test <length> valid value: \f0.35cm +PASS Test <length> valid value: \f0.35mm +PASS Test <length> valid value: \f0.35pt +PASS Test <length> valid value: \f0.35pc +PASS Test <length> valid value: \f0.35% +PASS Test <length> valid value: \f1e-10 +PASS Test <length> valid value: \f1e-10em +PASS Test <length> valid value: \f1e-10ex +PASS Test <length> valid value: \f1e-10px +PASS Test <length> valid value: \f1e-10in +PASS Test <length> valid value: \f1e-10cm +PASS Test <length> valid value: \f1e-10mm +PASS Test <length> valid value: \f1e-10pt +PASS Test <length> valid value: \f1e-10pc +PASS Test <length> valid value: \f1e-10% +PASS Test <length> valid value: \f+32 +PASS Test <length> valid value: \f+32em +PASS Test <length> valid value: \f+32ex +PASS Test <length> valid value: \f+32px +PASS Test <length> valid value: \f+32in +PASS Test <length> valid value: \f+32cm +PASS Test <length> valid value: \f+32mm +PASS Test <length> valid value: \f+32pt +PASS Test <length> valid value: \f+32pc +PASS Test <length> valid value: \f+32% +PASS Test <length> valid value: \f+17E-1 +PASS Test <length> valid value: \f+17E-1em +PASS Test <length> valid value: \f+17E-1ex +PASS Test <length> valid value: \f+17E-1px +PASS Test <length> valid value: \f+17E-1in +PASS Test <length> valid value: \f+17E-1cm +PASS Test <length> valid value: \f+17E-1mm +PASS Test <length> valid value: \f+17E-1pt +PASS Test <length> valid value: \f+17E-1pc +PASS Test <length> valid value: \f+17E-1% +PASS Test <length> valid value: \f17e+2 +PASS Test <length> valid value: \f17e+2em +PASS Test <length> valid value: \f17e+2ex +PASS Test <length> valid value: \f17e+2px +PASS Test <length> valid value: \f17e+2in +PASS Test <length> valid value: \f17e+2cm +PASS Test <length> valid value: \f17e+2mm +PASS Test <length> valid value: \f17e+2pt +PASS Test <length> valid value: \f17e+2pc +PASS Test <length> valid value: \f17e+2% +PASS Test <length> valid value: \f-47 +PASS Test <length> valid value: \f-47em +PASS Test <length> valid value: \f-47ex +PASS Test <length> valid value: \f-47px +PASS Test <length> valid value: \f-47in +PASS Test <length> valid value: \f-47cm +PASS Test <length> valid value: \f-47mm +PASS Test <length> valid value: \f-47pt +PASS Test <length> valid value: \f-47pc +PASS Test <length> valid value: \f-47% +PASS Test <length> valid value: \f.1 +PASS Test <length> valid value: \f.1em +PASS Test <length> valid value: \f.1ex +PASS Test <length> valid value: \f.1px +PASS Test <length> valid value: \f.1in +PASS Test <length> valid value: \f.1cm +PASS Test <length> valid value: \f.1mm +PASS Test <length> valid value: \f.1pt +PASS Test <length> valid value: \f.1pc +PASS Test <length> valid value: \f.1% +PASS Test <length> valid value: \f0.35 +PASS Test <length> valid value: \f0.35em +PASS Test <length> valid value: \f0.35ex +PASS Test <length> valid value: \f0.35px +PASS Test <length> valid value: \f0.35in +PASS Test <length> valid value: \f0.35cm +PASS Test <length> valid value: \f0.35mm +PASS Test <length> valid value: \f0.35pt +PASS Test <length> valid value: \f0.35pc +PASS Test <length> valid value: \f0.35% +PASS Test <length> valid value: \f1e-10 +PASS Test <length> valid value: \f1e-10em +PASS Test <length> valid value: \f1e-10ex +PASS Test <length> valid value: \f1e-10px +PASS Test <length> valid value: \f1e-10in +PASS Test <length> valid value: \f1e-10cm +PASS Test <length> valid value: \f1e-10mm +PASS Test <length> valid value: \f1e-10pt +PASS Test <length> valid value: \f1e-10pc +PASS Test <length> valid value: \f1e-10% +PASS Test <length> valid value: \f+32 +PASS Test <length> valid value: \f+32em +PASS Test <length> valid value: \f+32ex +PASS Test <length> valid value: \f+32px +PASS Test <length> valid value: \f+32in +PASS Test <length> valid value: \f+32cm +PASS Test <length> valid value: \f+32mm +PASS Test <length> valid value: \f+32pt +PASS Test <length> valid value: \f+32pc +PASS Test <length> valid value: \f+32% +PASS Test <length> valid value: \f+17E-1 +PASS Test <length> valid value: \f+17E-1em +PASS Test <length> valid value: \f+17E-1ex +PASS Test <length> valid value: \f+17E-1px +PASS Test <length> valid value: \f+17E-1in +PASS Test <length> valid value: \f+17E-1cm +PASS Test <length> valid value: \f+17E-1mm +PASS Test <length> valid value: \f+17E-1pt +PASS Test <length> valid value: \f+17E-1pc +PASS Test <length> valid value: \f+17E-1% +PASS Test <length> valid value: \f17e+2 +PASS Test <length> valid value: \f17e+2em +PASS Test <length> valid value: \f17e+2ex +PASS Test <length> valid value: \f17e+2px +PASS Test <length> valid value: \f17e+2in +PASS Test <length> valid value: \f17e+2cm +PASS Test <length> valid value: \f17e+2mm +PASS Test <length> valid value: \f17e+2pt +PASS Test <length> valid value: \f17e+2pc +PASS Test <length> valid value: \f17e+2% +PASS Test <length> valid value: \f-47\r\n\t +PASS Test <length> valid value: \f-47em\r\n\t +PASS Test <length> valid value: \f-47ex\r\n\t +PASS Test <length> valid value: \f-47px\r\n\t +PASS Test <length> valid value: \f-47in\r\n\t +PASS Test <length> valid value: \f-47cm\r\n\t +PASS Test <length> valid value: \f-47mm\r\n\t +PASS Test <length> valid value: \f-47pt\r\n\t +PASS Test <length> valid value: \f-47pc\r\n\t +PASS Test <length> valid value: \f-47%\r\n\t +PASS Test <length> valid value: \f.1\r\n\t +PASS Test <length> valid value: \f.1em\r\n\t +PASS Test <length> valid value: \f.1ex\r\n\t +PASS Test <length> valid value: \f.1px\r\n\t +PASS Test <length> valid value: \f.1in\r\n\t +PASS Test <length> valid value: \f.1cm\r\n\t +PASS Test <length> valid value: \f.1mm\r\n\t +PASS Test <length> valid value: \f.1pt\r\n\t +PASS Test <length> valid value: \f.1pc\r\n\t +PASS Test <length> valid value: \f.1%\r\n\t +PASS Test <length> valid value: \f0.35\r\n\t +PASS Test <length> valid value: \f0.35em\r\n\t +PASS Test <length> valid value: \f0.35ex\r\n\t +PASS Test <length> valid value: \f0.35px\r\n\t +PASS Test <length> valid value: \f0.35in\r\n\t +PASS Test <length> valid value: \f0.35cm\r\n\t +PASS Test <length> valid value: \f0.35mm\r\n\t +PASS Test <length> valid value: \f0.35pt\r\n\t +PASS Test <length> valid value: \f0.35pc\r\n\t +PASS Test <length> valid value: \f0.35%\r\n\t +PASS Test <length> valid value: \f1e-10\r\n\t +PASS Test <length> valid value: \f1e-10em\r\n\t +PASS Test <length> valid value: \f1e-10ex\r\n\t +PASS Test <length> valid value: \f1e-10px\r\n\t +PASS Test <length> valid value: \f1e-10in\r\n\t +PASS Test <length> valid value: \f1e-10cm\r\n\t +PASS Test <length> valid value: \f1e-10mm\r\n\t +PASS Test <length> valid value: \f1e-10pt\r\n\t +PASS Test <length> valid value: \f1e-10pc\r\n\t +PASS Test <length> valid value: \f1e-10%\r\n\t +PASS Test <length> valid value: \f+32\r\n\t +PASS Test <length> valid value: \f+32em\r\n\t +PASS Test <length> valid value: \f+32ex\r\n\t +PASS Test <length> valid value: \f+32px\r\n\t +PASS Test <length> valid value: \f+32in\r\n\t +PASS Test <length> valid value: \f+32cm\r\n\t +PASS Test <length> valid value: \f+32mm\r\n\t +PASS Test <length> valid value: \f+32pt\r\n\t +PASS Test <length> valid value: \f+32pc\r\n\t +PASS Test <length> valid value: \f+32%\r\n\t +PASS Test <length> valid value: \f+17E-1\r\n\t +PASS Test <length> valid value: \f+17E-1em\r\n\t +PASS Test <length> valid value: \f+17E-1ex\r\n\t +PASS Test <length> valid value: \f+17E-1px\r\n\t +PASS Test <length> valid value: \f+17E-1in\r\n\t +PASS Test <length> valid value: \f+17E-1cm\r\n\t +PASS Test <length> valid value: \f+17E-1mm\r\n\t +PASS Test <length> valid value: \f+17E-1pt\r\n\t +PASS Test <length> valid value: \f+17E-1pc\r\n\t +PASS Test <length> valid value: \f+17E-1%\r\n\t +PASS Test <length> valid value: \f17e+2\r\n\t +PASS Test <length> valid value: \f17e+2em\r\n\t +PASS Test <length> valid value: \f17e+2ex\r\n\t +PASS Test <length> valid value: \f17e+2px\r\n\t +PASS Test <length> valid value: \f17e+2in\r\n\t +PASS Test <length> valid value: \f17e+2cm\r\n\t +PASS Test <length> valid value: \f17e+2mm\r\n\t +PASS Test <length> valid value: \f17e+2pt\r\n\t +PASS Test <length> valid value: \f17e+2pc\r\n\t +PASS Test <length> valid value: \f17e+2%\r\n\t +PASS Test <length> valid value: \f-47\f +PASS Test <length> valid value: \f-47em\f +PASS Test <length> valid value: \f-47ex\f +PASS Test <length> valid value: \f-47px\f +PASS Test <length> valid value: \f-47in\f +PASS Test <length> valid value: \f-47cm\f +PASS Test <length> valid value: \f-47mm\f +PASS Test <length> valid value: \f-47pt\f +PASS Test <length> valid value: \f-47pc\f +PASS Test <length> valid value: \f-47%\f +PASS Test <length> valid value: \f.1\f +PASS Test <length> valid value: \f.1em\f +PASS Test <length> valid value: \f.1ex\f +PASS Test <length> valid value: \f.1px\f +PASS Test <length> valid value: \f.1in\f +PASS Test <length> valid value: \f.1cm\f +PASS Test <length> valid value: \f.1mm\f +PASS Test <length> valid value: \f.1pt\f +PASS Test <length> valid value: \f.1pc\f +PASS Test <length> valid value: \f.1%\f +PASS Test <length> valid value: \f0.35\f +PASS Test <length> valid value: \f0.35em\f +PASS Test <length> valid value: \f0.35ex\f +PASS Test <length> valid value: \f0.35px\f +PASS Test <length> valid value: \f0.35in\f +PASS Test <length> valid value: \f0.35cm\f +PASS Test <length> valid value: \f0.35mm\f +PASS Test <length> valid value: \f0.35pt\f +PASS Test <length> valid value: \f0.35pc\f +PASS Test <length> valid value: \f0.35%\f +PASS Test <length> valid value: \f1e-10\f +PASS Test <length> valid value: \f1e-10em\f +PASS Test <length> valid value: \f1e-10ex\f +PASS Test <length> valid value: \f1e-10px\f +PASS Test <length> valid value: \f1e-10in\f +PASS Test <length> valid value: \f1e-10cm\f +PASS Test <length> valid value: \f1e-10mm\f +PASS Test <length> valid value: \f1e-10pt\f +PASS Test <length> valid value: \f1e-10pc\f +PASS Test <length> valid value: \f1e-10%\f +PASS Test <length> valid value: \f+32\f +PASS Test <length> valid value: \f+32em\f +PASS Test <length> valid value: \f+32ex\f +PASS Test <length> valid value: \f+32px\f +PASS Test <length> valid value: \f+32in\f +PASS Test <length> valid value: \f+32cm\f +PASS Test <length> valid value: \f+32mm\f +PASS Test <length> valid value: \f+32pt\f +PASS Test <length> valid value: \f+32pc\f +PASS Test <length> valid value: \f+32%\f +PASS Test <length> valid value: \f+17E-1\f +PASS Test <length> valid value: \f+17E-1em\f +PASS Test <length> valid value: \f+17E-1ex\f +PASS Test <length> valid value: \f+17E-1px\f +PASS Test <length> valid value: \f+17E-1in\f +PASS Test <length> valid value: \f+17E-1cm\f +PASS Test <length> valid value: \f+17E-1mm\f +PASS Test <length> valid value: \f+17E-1pt\f +PASS Test <length> valid value: \f+17E-1pc\f +PASS Test <length> valid value: \f+17E-1%\f +PASS Test <length> valid value: \f17e+2\f +PASS Test <length> valid value: \f17e+2em\f +PASS Test <length> valid value: \f17e+2ex\f +PASS Test <length> valid value: \f17e+2px\f +PASS Test <length> valid value: \f17e+2in\f +PASS Test <length> valid value: \f17e+2cm\f +PASS Test <length> valid value: \f17e+2mm\f +PASS Test <length> valid value: \f17e+2pt\f +PASS Test <length> valid value: \f17e+2pc\f +PASS Test <length> valid value: \f17e+2%\f +PASS Test <length> WS invalid value: -47\fem +PASS Test <length> WS invalid value: .1\fem +PASS Test <length> WS invalid value: 0.35\fem +PASS Test <length> WS invalid value: 1e-10\fem +PASS Test <length> WS invalid value: +32\fem +PASS Test <length> WS invalid value: +17E-1\fem +PASS Test <length> WS invalid value: 17e+2\fem +PASS Test <length> WS invalid value: -47\fex +PASS Test <length> WS invalid value: .1\fex +PASS Test <length> WS invalid value: 0.35\fex +PASS Test <length> WS invalid value: 1e-10\fex +PASS Test <length> WS invalid value: +32\fex +PASS Test <length> WS invalid value: +17E-1\fex +PASS Test <length> WS invalid value: 17e+2\fex +PASS Test <length> WS invalid value: -47\fpx +PASS Test <length> WS invalid value: .1\fpx +PASS Test <length> WS invalid value: 0.35\fpx +PASS Test <length> WS invalid value: 1e-10\fpx +PASS Test <length> WS invalid value: +32\fpx +PASS Test <length> WS invalid value: +17E-1\fpx +PASS Test <length> WS invalid value: 17e+2\fpx +PASS Test <length> WS invalid value: -47\fin +PASS Test <length> WS invalid value: .1\fin +PASS Test <length> WS invalid value: 0.35\fin +PASS Test <length> WS invalid value: 1e-10\fin +PASS Test <length> WS invalid value: +32\fin +PASS Test <length> WS invalid value: +17E-1\fin +PASS Test <length> WS invalid value: 17e+2\fin +PASS Test <length> WS invalid value: -47\fcm +PASS Test <length> WS invalid value: .1\fcm +PASS Test <length> WS invalid value: 0.35\fcm +PASS Test <length> WS invalid value: 1e-10\fcm +PASS Test <length> WS invalid value: +32\fcm +PASS Test <length> WS invalid value: +17E-1\fcm +PASS Test <length> WS invalid value: 17e+2\fcm +PASS Test <length> WS invalid value: -47\fmm +PASS Test <length> WS invalid value: .1\fmm +PASS Test <length> WS invalid value: 0.35\fmm +PASS Test <length> WS invalid value: 1e-10\fmm +PASS Test <length> WS invalid value: +32\fmm +PASS Test <length> WS invalid value: +17E-1\fmm +PASS Test <length> WS invalid value: 17e+2\fmm +PASS Test <length> WS invalid value: -47\fpt +PASS Test <length> WS invalid value: .1\fpt +PASS Test <length> WS invalid value: 0.35\fpt +PASS Test <length> WS invalid value: 1e-10\fpt +PASS Test <length> WS invalid value: +32\fpt +PASS Test <length> WS invalid value: +17E-1\fpt +PASS Test <length> WS invalid value: 17e+2\fpt +PASS Test <length> WS invalid value: -47\fpc +PASS Test <length> WS invalid value: .1\fpc +PASS Test <length> WS invalid value: 0.35\fpc +PASS Test <length> WS invalid value: 1e-10\fpc +PASS Test <length> WS invalid value: +32\fpc +PASS Test <length> WS invalid value: +17E-1\fpc +PASS Test <length> WS invalid value: 17e+2\fpc +PASS Test <length> WS invalid value: -47\f% +PASS Test <length> WS invalid value: .1\f% +PASS Test <length> WS invalid value: 0.35\f% +PASS Test <length> WS invalid value: 1e-10\f% +PASS Test <length> WS invalid value: +32\f% +PASS Test <length> WS invalid value: +17E-1\f% +PASS Test <length> WS invalid value: 17e+2\f% +PASS Test <length> trailing garbage, value: \f-47a +PASS Test <length> trailing garbage, value: \f.1a +PASS Test <length> trailing garbage, value: \f0.35a +PASS Test <length> trailing garbage, value: \f1e-10a +PASS Test <length> trailing garbage, value: \f+32a +PASS Test <length> trailing garbage, value: \f+17E-1a +PASS Test <length> trailing garbage, value: \f17e+2a +PASS Test <length> trailing garbage, value: \f-47e +PASS Test <length> trailing garbage, value: \f.1e +PASS Test <length> trailing garbage, value: \f0.35e +PASS Test <length> trailing garbage, value: \f1e-10e +PASS Test <length> trailing garbage, value: \f+32e +PASS Test <length> trailing garbage, value: \f+17E-1e +PASS Test <length> trailing garbage, value: \f17e+2e +PASS Test <length> trailing garbage, value: \f-47foo +PASS Test <length> trailing garbage, value: \f.1foo +PASS Test <length> trailing garbage, value: \f0.35foo +PASS Test <length> trailing garbage, value: \f1e-10foo +PASS Test <length> trailing garbage, value: \f+32foo +PASS Test <length> trailing garbage, value: \f+17E-1foo +PASS Test <length> trailing garbage, value: \f17e+2foo +PASS Test <length> trailing garbage, value: \f-47)90 +PASS Test <length> trailing garbage, value: \f.1)90 +PASS Test <length> trailing garbage, value: \f0.35)90 +PASS Test <length> trailing garbage, value: \f1e-10)90 +PASS Test <length> trailing garbage, value: \f+32)90 +PASS Test <length> trailing garbage, value: \f+17E-1)90 +PASS Test <length> trailing garbage, value: \f17e+2)90 +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/table/table-display-types-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/table/table-display-types-expected.png new file mode 100644 index 0000000..432a978 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/table/table-display-types-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/table/table-display-types-expected.txt b/third_party/WebKit/LayoutTests/platform/android/fast/table/table-display-types-expected.txt new file mode 100644 index 0000000..c010bee --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/table/table-display-types-expected.txt
@@ -0,0 +1,160 @@ +layer at (0,0) size 800x600 scrollHeight 610 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x610 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600 + LayoutBlockFlow {HTML} at (0,0) size 800x610 + LayoutBlockFlow {BODY} at (8,10) size 784x592 + LayoutTable {TABLE} at (10,0) size 118x100 [border: (1px solid #000000)] + LayoutTableSection {THEAD} at (1,1) size 116x26 + LayoutTableRow {TR} at (0,2) size 116x22 + LayoutTableCell {TD} at (2,2) size 55x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 45x19 + text run at (1,1) width 45: "Head 1" + LayoutTableCell {TD} at (59,2) size 55x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 45x19 + text run at (1,1) width 45: "Head 2" + LayoutTableSection {TFOOT} at (1,75) size 116x24 + LayoutTableRow {TR} at (0,0) size 116x22 + LayoutTableCell {TD} at (2,0) size 55x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 53x19 + text run at (1,1) width 53: "Footer 1" + LayoutTableCell {TD} at (59,0) size 55x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 53x19 + text run at (1,1) width 53: "Footer 2" + LayoutTableSection {TBODY} at (1,27) size 116x48 + LayoutTableRow {TR} at (0,0) size 116x22 + LayoutTableCell {TD} at (2,0) size 55x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 1" + LayoutTableCell {TD} at (59,0) size 55x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 2" + LayoutTableRow {TR} at (0,24) size 116x22 + LayoutTableCell {TD} at (2,24) size 55x22 [r=1 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 3" + LayoutTableCell {TD} at (59,24) size 55x22 [r=1 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 4" + LayoutBlockFlow {P} at (0,116) size 784x20 + LayoutText {#text} at (0,0) size 210x19 + text run at (0,0) width 210: "Row groups have display:table-cell" + LayoutTable {TABLE} at (10,152) size 232x64 [border: (1px solid #000000)] + LayoutTableSection (anonymous) at (1,1) size 230x34 + LayoutTableRow (anonymous) at (0,2) size 230x30 + LayoutTableCell {THEAD} at (2,2) size 104x30 [r=0 c=0 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 104x30 + LayoutTableSection (anonymous) at (0,0) size 104x30 + LayoutTableRow (anonymous) at (0,2) size 104x26 + LayoutTableCell {TR} at (2,2) size 100x26 [r=0 c=0 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 100x26 + LayoutTableSection (anonymous) at (0,0) size 100x26 + LayoutTableRow (anonymous) at (0,2) size 100x22 + LayoutTableCell {TD} at (2,2) size 47x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 45x19 + text run at (1,1) width 45: "Head 1" + LayoutTableCell {TD} at (51,2) size 47x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 45x19 + text run at (1,1) width 45: "Head 2" + LayoutTableCell {TFOOT} at (108,2) size 120x30 [r=0 c=1 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 120x30 + LayoutTableSection (anonymous) at (0,0) size 120x30 + LayoutTableRow (anonymous) at (0,2) size 120x26 + LayoutTableCell {TR} at (2,2) size 116x26 [r=0 c=0 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 116x26 + LayoutTableSection (anonymous) at (0,0) size 116x26 + LayoutTableRow (anonymous) at (0,2) size 116x22 + LayoutTableCell {TD} at (2,2) size 55x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 53x19 + text run at (1,1) width 53: "Footer 1" + LayoutTableCell {TD} at (59,2) size 55x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 53x19 + text run at (1,1) width 53: "Footer 2" + LayoutTableSection {TBODY} at (1,35) size 230x28 + LayoutTableRow (anonymous) at (0,0) size 230x26 + LayoutTableCell {TR} at (2,0) size 104x26 [r=0 c=0 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 82x26 + LayoutTableSection (anonymous) at (0,0) size 82x26 + LayoutTableRow (anonymous) at (0,2) size 82x22 + LayoutTableCell {TD} at (2,2) size 38x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 1" + LayoutTableCell {TD} at (42,2) size 38x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 2" + LayoutTableCell {TR} at (108,0) size 120x26 [r=0 c=1 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 82x26 + LayoutTableSection (anonymous) at (0,0) size 82x26 + LayoutTableRow (anonymous) at (0,2) size 82x22 + LayoutTableCell {TD} at (2,2) size 38x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 3" + LayoutTableCell {TD} at (42,2) size 38x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 4" + LayoutBlockFlow {P} at (0,232) size 784x20 + LayoutText {#text} at (0,0) size 189x19 + text run at (0,0) width 189: "Row groups have display:block" + LayoutTable {TABLE} at (10,268) size 122x112 [border: (1px solid #000000)] + LayoutTableSection (anonymous) at (1,1) size 120x56 + LayoutTableRow (anonymous) at (0,2) size 120x52 + LayoutTableCell (anonymous) at (2,2) size 116x52 [r=0 c=0 rs=1 cs=1] + LayoutBlockFlow {THEAD} at (0,0) size 116x26 + LayoutBlockFlow {TR} at (0,0) size 116x26 + LayoutTable (anonymous) at (0,0) size 100x26 + LayoutTableSection (anonymous) at (0,0) size 100x26 + LayoutTableRow (anonymous) at (0,2) size 100x22 + LayoutTableCell {TD} at (2,2) size 47x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 45x19 + text run at (1,1) width 45: "Head 1" + LayoutTableCell {TD} at (51,2) size 47x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 45x19 + text run at (1,1) width 45: "Head 2" + LayoutBlockFlow {TFOOT} at (0,26) size 116x26 + LayoutBlockFlow {TR} at (0,0) size 116x26 + LayoutTable (anonymous) at (0,0) size 116x26 + LayoutTableSection (anonymous) at (0,0) size 116x26 + LayoutTableRow (anonymous) at (0,2) size 116x22 + LayoutTableCell {TD} at (2,2) size 55x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 53x19 + text run at (1,1) width 53: "Footer 1" + LayoutTableCell {TD} at (59,2) size 55x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 53x19 + text run at (1,1) width 53: "Footer 2" + LayoutTableSection {TBODY} at (1,57) size 120x54 + LayoutTableRow (anonymous) at (0,0) size 120x52 + LayoutTableCell (anonymous) at (2,0) size 116x52 [r=0 c=0 rs=1 cs=1] + LayoutBlockFlow {TR} at (0,0) size 116x26 + LayoutTable (anonymous) at (0,0) size 82x26 + LayoutTableSection (anonymous) at (0,0) size 82x26 + LayoutTableRow (anonymous) at (0,2) size 82x22 + LayoutTableCell {TD} at (2,2) size 38x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 1" + LayoutTableCell {TD} at (42,2) size 38x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 2" + LayoutBlockFlow {TR} at (0,26) size 116x26 + LayoutTable (anonymous) at (0,0) size 82x26 + LayoutTableSection (anonymous) at (0,0) size 82x26 + LayoutTableRow (anonymous) at (0,2) size 82x22 + LayoutTableCell {TD} at (2,2) size 38x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 3" + LayoutTableCell {TD} at (42,2) size 38x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 4" + LayoutTable (anonymous) at (0,390) size 302x202 + LayoutTableSection (anonymous) at (0,0) size 302x202 + LayoutTableRow (anonymous) at (0,0) size 302x202 + LayoutTableCell {P} at (0,0) size 302x202 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 295x199 + text run at (1,1) width 242: "Lorem ipsum dolor sit amet, consectetur" + text run at (1,21) width 294: "adipisicing elit, sed do eiusmod tempor incididunt" + text run at (1,41) width 267: "ut labore et dolore magna aliqua. Ut enim ad" + text run at (1,61) width 285: "minim veniam, quis nostrud exercitation ullamco" + text run at (1,81) width 291: "laboris nisi ut aliquip ex ea commodo consequat." + text run at (1,101) width 294: "Duis aute irure dolor in reprehenderit in voluptate" + text run at (1,121) width 274: "velit esse cillum dolore eu fugiat nulla pariatur." + text run at (1,141) width 286: "Excepteur sint occaecat cupidatat non proident," + text run at (1,161) width 295: "sunt in culpa qui officia deserunt mollit anim id est" + text run at (1,181) width 53: "laborum."
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/table/table-display-types-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/table/table-display-types-vertical-expected.png new file mode 100644 index 0000000..59961f2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/table/table-display-types-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/table/table-display-types-vertical-expected.txt b/third_party/WebKit/LayoutTests/platform/android/fast/table/table-display-types-vertical-expected.txt new file mode 100644 index 0000000..dae83f92 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/table/table-display-types-vertical-expected.txt
@@ -0,0 +1,181 @@ +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 1226 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 785x1226 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow {HTML} at (0,0) size 785x1226 + LayoutBlockFlow {BODY} at (8,10) size 769x1208 + LayoutTable {TABLE} at (10,0) size 100x118 [border: (1px solid #000000)] + LayoutTableSection {THEAD} at (1,1) size 26x116 + LayoutTableRow {TR} at (0,2) size 22x116 + LayoutTableCell {TD} at (2,2) size 22x55 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x45 + text run at (1,1) width 45: "Head 1" + LayoutTableCell {TD} at (2,59) size 22x55 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x45 + text run at (1,1) width 45: "Head 2" + LayoutTableSection {TFOOT} at (75,1) size 24x116 + LayoutTableRow {TR} at (0,0) size 22x116 + LayoutTableCell {TD} at (0,2) size 22x55 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x53 + text run at (1,1) width 53: "Footer 1" + LayoutTableCell {TD} at (0,59) size 22x55 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x53 + text run at (1,1) width 53: "Footer 2" + LayoutTableSection {TBODY} at (27,1) size 48x116 + LayoutTableRow {TR} at (0,0) size 22x116 + LayoutTableCell {TD} at (0,2) size 22x55 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 1" + LayoutTableCell {TD} at (0,59) size 22x55 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 2" + LayoutTableRow {TR} at (0,24) size 22x116 + LayoutTableCell {TD} at (24,2) size 22x55 [r=1 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 3" + LayoutTableCell {TD} at (24,59) size 22x55 [r=1 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 4" + LayoutBlockFlow {P} at (0,134) size 769x20 + LayoutText {#text} at (0,0) size 210x19 + text run at (0,0) width 210: "Row groups have display:table-cell" + LayoutTable {TABLE} at (10,170) size 64x232 [border: (1px solid #000000)] + LayoutTableSection (anonymous) at (1,1) size 34x230 + LayoutTableRow (anonymous) at (0,2) size 30x230 + LayoutTableCell {THEAD} at (2,2) size 30x104 [r=0 c=0 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 30x104 + LayoutTableSection (anonymous) at (0,0) size 30x104 + LayoutTableRow (anonymous) at (0,2) size 26x104 + LayoutTableCell {TR} at (2,2) size 26x100 [r=0 c=0 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 26x100 + LayoutTableSection (anonymous) at (0,0) size 26x100 + LayoutTableRow (anonymous) at (0,2) size 22x100 + LayoutTableCell {TD} at (2,2) size 22x47 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x45 + text run at (1,1) width 45: "Head 1" + LayoutTableCell {TD} at (2,51) size 22x47 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x45 + text run at (1,1) width 45: "Head 2" + LayoutTableCell {TFOOT} at (2,108) size 30x120 [r=0 c=1 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 30x120 + LayoutTableSection (anonymous) at (0,0) size 30x120 + LayoutTableRow (anonymous) at (0,2) size 26x120 + LayoutTableCell {TR} at (2,2) size 26x116 [r=0 c=0 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 26x116 + LayoutTableSection (anonymous) at (0,0) size 26x116 + LayoutTableRow (anonymous) at (0,2) size 22x116 + LayoutTableCell {TD} at (2,2) size 22x55 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x53 + text run at (1,1) width 53: "Footer 1" + LayoutTableCell {TD} at (2,59) size 22x55 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x53 + text run at (1,1) width 53: "Footer 2" + LayoutTableSection {TBODY} at (35,1) size 28x230 + LayoutTableRow (anonymous) at (0,0) size 26x230 + LayoutTableCell {TR} at (0,2) size 26x104 [r=0 c=0 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 26x82 + LayoutTableSection (anonymous) at (0,0) size 26x82 + LayoutTableRow (anonymous) at (0,2) size 22x82 + LayoutTableCell {TD} at (2,2) size 22x38 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 1" + LayoutTableCell {TD} at (2,42) size 22x38 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 2" + LayoutTableCell {TR} at (0,108) size 26x120 [r=0 c=1 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 26x82 + LayoutTableSection (anonymous) at (0,0) size 26x82 + LayoutTableRow (anonymous) at (0,2) size 22x82 + LayoutTableCell {TD} at (2,2) size 22x38 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 3" + LayoutTableCell {TD} at (2,42) size 22x38 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 4" + LayoutBlockFlow {P} at (0,418) size 769x20 + LayoutText {#text} at (0,0) size 189x19 + text run at (0,0) width 189: "Row groups have display:block" + LayoutTable {TABLE} at (10,454) size 112x122 [border: (1px solid #000000)] + LayoutTableSection (anonymous) at (1,1) size 56x120 + LayoutTableRow (anonymous) at (0,2) size 52x120 + LayoutTableCell (anonymous) at (2,2) size 52x116 [r=0 c=0 rs=1 cs=1] + LayoutBlockFlow {THEAD} at (0,0) size 26x116 + LayoutBlockFlow {TR} at (0,0) size 26x116 + LayoutTable (anonymous) at (0,0) size 26x100 + LayoutTableSection (anonymous) at (0,0) size 26x100 + LayoutTableRow (anonymous) at (0,2) size 22x100 + LayoutTableCell {TD} at (2,2) size 22x47 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x45 + text run at (1,1) width 45: "Head 1" + LayoutTableCell {TD} at (2,51) size 22x47 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x45 + text run at (1,1) width 45: "Head 2" + LayoutBlockFlow {TFOOT} at (26,0) size 26x116 + LayoutBlockFlow {TR} at (0,0) size 26x116 + LayoutTable (anonymous) at (0,0) size 26x116 + LayoutTableSection (anonymous) at (0,0) size 26x116 + LayoutTableRow (anonymous) at (0,2) size 22x116 + LayoutTableCell {TD} at (2,2) size 22x55 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x53 + text run at (1,1) width 53: "Footer 1" + LayoutTableCell {TD} at (2,59) size 22x55 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x53 + text run at (1,1) width 53: "Footer 2" + LayoutTableSection {TBODY} at (57,1) size 54x120 + LayoutTableRow (anonymous) at (0,0) size 52x120 + LayoutTableCell (anonymous) at (0,2) size 52x116 [r=0 c=0 rs=1 cs=1] + LayoutBlockFlow {TR} at (0,0) size 26x116 + LayoutTable (anonymous) at (0,0) size 26x82 + LayoutTableSection (anonymous) at (0,0) size 26x82 + LayoutTableRow (anonymous) at (0,2) size 22x82 + LayoutTableCell {TD} at (2,2) size 22x38 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 1" + LayoutTableCell {TD} at (2,42) size 22x38 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 2" + LayoutBlockFlow {TR} at (26,0) size 26x116 + LayoutTable (anonymous) at (0,0) size 26x82 + LayoutTableSection (anonymous) at (0,0) size 26x82 + LayoutTableRow (anonymous) at (0,2) size 22x82 + LayoutTableCell {TD} at (2,2) size 22x38 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 3" + LayoutTableCell {TD} at (2,42) size 22x38 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 4" + LayoutTable (anonymous) at (0,586) size 102x622 + LayoutTableSection (anonymous) at (0,0) size 102x622 + LayoutTableRow (anonymous) at (0,0) size 102x622 + LayoutTableCell {P} at (0,0) size 102x622 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 97x619 + text run at (1,1) width 79: "Lorem ipsum" + text run at (1,21) width 86: "dolor sit amet," + text run at (1,41) width 69: "consectetur" + text run at (1,61) width 87: "adipisicing elit," + text run at (1,81) width 95: "sed do eiusmod" + text run at (1,101) width 43: "tempor" + text run at (1,121) width 72: "incididunt ut" + text run at (1,141) width 96: "labore et dolore" + text run at (1,161) width 82: "magna aliqua." + text run at (1,181) width 66: "Ut enim ad" + text run at (1,201) width 85: "minim veniam," + text run at (1,221) width 73: "quis nostrud" + text run at (1,241) width 69: "exercitation" + text run at (1,261) width 90: "ullamco laboris" + text run at (1,281) width 95: "nisi ut aliquip ex" + text run at (1,301) width 79: "ea commodo" + text run at (1,321) width 96: "consequat. Duis" + text run at (1,341) width 92: "aute irure dolor" + text run at (1,361) width 94: "in reprehenderit" + text run at (1,381) width 97: "in voluptate velit" + text run at (1,401) width 64: "esse cillum" + text run at (1,421) width 93: "dolore eu fugiat" + text run at (1,441) width 81: "nulla pariatur." + text run at (1,461) width 85: "Excepteur sint" + text run at (1,481) width 54: "occaecat" + text run at (1,501) width 81: "cupidatat non" + text run at (1,521) width 96: "proident, sunt in" + text run at (1,541) width 94: "culpa qui officia" + text run at (1,561) width 87: "deserunt mollit" + text run at (1,581) width 64: "anim id est" + text run at (1,601) width 53: "laborum."
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/transforms/transformed-focused-text-input-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/transforms/transformed-focused-text-input-expected.png new file mode 100644 index 0000000..1c77173 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/transforms/transformed-focused-text-input-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/writing-mode/border-image-vertical-lr-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/writing-mode/border-image-vertical-lr-expected.png new file mode 100644 index 0000000..fbd7bcc --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/writing-mode/border-image-vertical-lr-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/writing-mode/border-image-vertical-rl-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/writing-mode/border-image-vertical-rl-expected.png new file mode 100644 index 0000000..21e70dc --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/writing-mode/border-image-vertical-rl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt b/third_party/WebKit/LayoutTests/platform/android/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt new file mode 100644 index 0000000..997f411 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt
@@ -0,0 +1,71 @@ +zh-CN: 誤過骨 +#zh-CN: +"Times New Roman" : 7, +"SimSun" : 3 + +zh-TW: 誤過骨 +#zh-TW: +"Times New Roman" : 7, +"PMingLiU" : 3 + +zh-HK: 誤過骨 +#zh-HK: +"Times New Roman" : 7, +"PMingLiU" : 3 + +ja: 誤過骨 +#ja: +"Times New Roman" : 4, +"MS PGothic" : 3 + +ko: 誤過骨 +#ko: +"Times New Roman" : 4, +"Gulim" : 3 + +en-CN: 誤過骨 +#en-CN: +"Times New Roman" : 7, +"SimSun" : 3 + +en-JP: 誤過骨 +#en-JP: +"Times New Roman" : 7, +"MS PGothic" : 3 + +en-KR: 誤過骨 +#en-KR: +"Times New Roman" : 7, +"Gulim" : 3 + +en-TW: 誤過骨 +#en-TW: +"Times New Roman" : 7, +"PMingLiU" : 3 + +en-HanS: 誤過骨 +#en-HanS: +"Times New Roman" : 9, +"SimSun" : 3 + +en-HanT: 誤過骨 +#en-HanT: +"Times New Roman" : 9, +"PMingLiU" : 3 + +en-HanS-JP: 誤過骨 +#en-HanS-JP: +"Times New Roman" : 12, +"SimSun" : 3 + +en-HanT-JP: 誤過骨 +#en-HanT-JP: +"Times New Roman" : 12, +"PMingLiU" : 3 + +en-US: 誤過骨 +#en-US: +"Times New Roman" : 7, +"MS PGothic" : 3 + +
diff --git a/third_party/WebKit/LayoutTests/platform/android/printing/iframe-print-expected.png b/third_party/WebKit/LayoutTests/platform/android/printing/iframe-print-expected.png new file mode 100644 index 0000000..a80552a5 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/printing/iframe-print-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png new file mode 100644 index 0000000..d5021e1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/W3C-SVG-1.1/text-path-01-b-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/W3C-SVG-1.1/text-path-01-b-expected.txt new file mode 100644 index 0000000..9b9af15 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/W3C-SVG-1.1/text-path-01-b-expected.txt
@@ -0,0 +1,96 @@ +layer at (0,0) size 480x360 + LayoutView at (0,0) size 480x360 +layer at (0,0) size 480x360 + LayoutSVGRoot {svg} at (0,0) size 480x360 + LayoutSVGContainer {g} at (0,0) size 419x292 + LayoutSVGHiddenContainer {defs} at (0,0) size 0x0 + LayoutSVGPath {path} at (198,13) size 221x99 [stroke={[type=SOLID] [color=#0000FF]}] [data="M 199 89.3 C 206.6 66.6 235.8 13.2 270 30.3 C 286.6 38.6 298.9 59.4 310 73.3 C 321.7 87.9 338.6 99 356 103.3 C 387.3 111.1 396.6 90.4 418 74.3"] + LayoutSVGPath {path} at (33,69) size 220x99 [stroke={[type=SOLID] [color=#0000FF]}] [data="M 33.5 145.8 C 41 123 70.3 69.7 104.5 86.8 C 121 95 133 116 144.5 129.8 C 156.2 144.4 173 155.5 190.5 159.8 C 221.8 167.6 231 146.9 252.5 130.8"] + LayoutSVGPath {path} at (113,231) size 300x4 [stroke={[type=SOLID] [color=#0000FF] [stroke width=4.00]}] [data="M 113 233 L 413 233"] + LayoutSVGContainer {g} at (168,0) size 251x114 + LayoutSVGContainer {use} at (198,13) size 221x99 + LayoutSVGPath {path} at (198,13) size 221x99 [stroke={[type=SOLID] [color=#0000FF]}] [data="M 199 89.3 C 206.6 66.6 235.8 13.2 270 30.3 C 286.6 38.6 298.9 59.4 310 73.3 C 321.7 87.9 338.6 99 356 103.3 C 387.3 111.1 396.6 90.4 418 74.3"] + LayoutSVGText {text} at (168,-7) size 205x121 contains 1 chunk(s) + LayoutSVGTextPath {textPath} at (0,0) size 205x120 + LayoutSVGInlineText {#text} at (0,0) size 205x120 + chunk 1 text run 1 at (203.03,79.11) startOffset 0 endOffset 1 width 22.00: "T" + chunk 1 text run 2 at (212.08,61.90) startOffset 1 endOffset 2 width 17.00: "e" + chunk 1 text run 3 at (222.25,47.53) startOffset 2 endOffset 3 width 18.00: "x" + chunk 1 text run 4 at (232.81,36.82) startOffset 3 endOffset 4 width 12.00: "t" + chunk 1 text run 5 at (241.47,30.97) startOffset 4 endOffset 5 width 9.00: " " + chunk 1 text run 6 at (254.78,27.04) startOffset 5 endOffset 6 width 19.00: "o" + chunk 1 text run 7 at (273.71,32.40) startOffset 6 endOffset 7 width 21.00: "n" + chunk 1 text run 8 at (285.19,41.95) startOffset 7 endOffset 8 width 9.00: " " + chunk 1 text run 9 at (294.10,52.23) startOffset 8 endOffset 9 width 18.00: "a" + chunk 1 text run 10 at (302.25,63.04) startOffset 9 endOffset 10 width 9.00: " " + chunk 1 text run 11 at (311.32,74.90) startOffset 10 endOffset 11 width 21.00: "p" + chunk 1 text run 12 at (325.45,88.34) startOffset 11 endOffset 12 width 18.00: "a" + chunk 1 text run 13 at (338.11,96.42) startOffset 12 endOffset 13 width 12.00: "t" + chunk 1 text run 14 at (353.40,102.61) startOffset 13 endOffset 14 width 21.00: "h" + LayoutSVGInlineText {#text} at (0,0) size 0x0 + LayoutSVGContainer {g} at (0,49) size 292x162 + LayoutSVGContainer {use} at (33,69) size 220x99 + LayoutSVGPath {path} at (33,69) size 220x99 [stroke={[type=SOLID] [color=#0000FF]}] [data="M 33.5 145.8 C 41 123 70.3 69.7 104.5 86.8 C 121 95 133 116 144.5 129.8 C 156.2 144.4 173 155.5 190.5 159.8 C 221.8 167.6 231 146.9 252.5 130.8"] + LayoutSVGText {text} at (-9,49) size 217x121 contains 1 chunk(s) + LayoutSVGTextPath {textPath} at (0,0) size 216x120 + LayoutSVGTSpan {tspan} at (0,0) size 56x58 + LayoutSVGInlineText {#text} at (0,37) size 56x57 + chunk 1 text run 1 at (37.49,135.59) startOffset 0 endOffset 1 width 22.00: "T" + chunk 1 text run 2 at (46.52,118.38) startOffset 1 endOffset 2 width 17.00: "e" + LayoutSVGTSpan {tspan} at (0,0) size 44x41 + LayoutSVGInlineText {#text} at (33,26) size 44x41 + chunk 1 text run 1 at (56.69,104.00) startOffset 0 endOffset 1 width 18.00: "x" + LayoutSVGInlineText {#text} at (49,0) size 166x120 + chunk 1 text run 1 at (67.26,93.31) startOffset 0 endOffset 1 width 12.00: "t" + chunk 1 text run 2 at (75.93,87.46) startOffset 1 endOffset 2 width 9.00: " " + chunk 1 text run 3 at (89.24,83.53) startOffset 2 endOffset 3 width 19.00: "o" + chunk 1 text run 4 at (108.18,88.88) startOffset 3 endOffset 4 width 21.00: "n" + chunk 1 text run 5 at (119.60,98.48) startOffset 4 endOffset 5 width 9.00: " " + chunk 1 text run 6 at (128.46,108.81) startOffset 5 endOffset 6 width 18.00: "a" + chunk 1 text run 7 at (136.62,119.62) startOffset 6 endOffset 7 width 9.00: " " + chunk 1 text run 8 at (145.81,131.39) startOffset 7 endOffset 8 width 21.00: "p" + chunk 1 text run 9 at (159.92,144.84) startOffset 8 endOffset 9 width 18.00: "a" + chunk 1 text run 10 at (172.57,152.93) startOffset 9 endOffset 10 width 12.00: "t" + chunk 1 text run 11 at (187.87,159.10) startOffset 10 endOffset 11 width 21.00: "h" + LayoutSVGInlineText {#text} at (0,0) size 0x0 + LayoutSVGRect {rect} at (16,168) size 276x43 [stroke={[type=SOLID] [color=#000000]}] [x=17.00] [y=169.00] [width=274.00] [height=41.00] + LayoutSVGText {text} at (19,166) size 218x23 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (0,0) size 218x23 + chunk 1 text run 1 at (19.00,185.00) startOffset 0 endOffset 25 width 218.00: "'tspan' subelement inside" + LayoutSVGText {text} at (19,188) size 194x23 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (0,0) size 194x23 + chunk 1 text run 1 at (19.00,207.00) startOffset 0 endOffset 23 width 194.00: "the 'textPath' element." + LayoutSVGContainer {g} at (113,212) size 300x80 + LayoutSVGContainer {use} at (113,231) size 300x4 + LayoutSVGPath {path} at (113,231) size 300x4 [stroke={[type=SOLID] [color=#0000FF] [stroke width=4.00]}] [data="M 113 233 L 413 233"] + LayoutSVGText {text} at (211,212) size 181x27 contains 1 chunk(s) + LayoutSVGTextPath {textPath} at (0,0) size 180x27 + LayoutSVGInlineText {#text} at (0,0) size 180x27 + chunk 1 text run 1 at (219.00,233.00) startOffset 0 endOffset 1 width 14.00: "T" + chunk 1 text run 2 at (233.00,233.00) startOffset 1 endOffset 2 width 14.00: "h" + chunk 1 text run 3 at (246.50,233.00) startOffset 2 endOffset 3 width 13.00: "e" + chunk 1 text run 4 at (256.50,233.00) startOffset 3 endOffset 4 width 7.00: " " + chunk 1 text run 5 at (267.00,233.00) startOffset 4 endOffset 5 width 14.00: "T" + chunk 1 text run 6 at (279.17,233.00) startOffset 5 endOffset 6 width 10.34: "e" + chunk 1 text run 7 at (289.84,233.00) startOffset 6 endOffset 7 width 11.00: "x" + chunk 1 text run 8 at (298.84,233.00) startOffset 7 endOffset 8 width 7.00: "t" + chunk 1 text run 9 at (305.84,233.00) startOffset 8 endOffset 9 width 7.00: " " + chunk 1 text run 10 at (315.84,233.00) startOffset 9 endOffset 10 width 13.00: "o" + chunk 1 text run 11 at (329.34,233.00) startOffset 10 endOffset 11 width 14.00: "n" + chunk 1 text run 12 at (339.84,233.00) startOffset 11 endOffset 12 width 7.00: " " + chunk 1 text run 13 at (350.34,233.00) startOffset 12 endOffset 13 width 14.00: "p" + chunk 1 text run 14 at (363.84,233.00) startOffset 13 endOffset 14 width 13.00: "a" + chunk 1 text run 15 at (373.84,233.00) startOffset 14 endOffset 15 width 7.00: "t" + chunk 1 text run 16 at (384.34,233.00) startOffset 15 endOffset 16 width 14.00: "h" + LayoutSVGInlineText {#text} at (0,0) size 0x0 + LayoutSVGRect {rect} at (117,249) size 262x43 [stroke={[type=SOLID] [color=#000000]}] [x=118.00] [y=250.00] [width=260.00] [height=41.00] + LayoutSVGText {text} at (120,248) size 237x23 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (0,0) size 237x23 + chunk 1 text run 1 at (120.00,267.00) startOffset 0 endOffset 30 width 236.64: "'startOffset' attribute of the" + LayoutSVGText {text} at (120,268) size 161x23 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (0,0) size 161x23 + chunk 1 text run 1 at (120.00,287.00) startOffset 0 endOffset 19 width 161.00: "'textPath' element." + LayoutSVGText {text} at (10,304) size 261x46 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (0,0) size 261x46 + chunk 1 text run 1 at (10.00,340.00) startOffset 0 endOffset 16 width 261.00: "$Revision: 1.9 $" + LayoutSVGRect {rect} at (0,0) size 480x360 [stroke={[type=SOLID] [color=#000000]}] [x=1.00] [y=1.00] [width=478.00] [height=358.00]
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/animations/animate-elem-06-t-drt-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/animations/animate-elem-06-t-drt-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/linux/svg/animations/animate-elem-06-t-drt-expected.txt rename to third_party/WebKit/LayoutTests/platform/android/svg/animations/animate-elem-06-t-drt-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/animations/animate-elem-06-t-drt-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/animations/animate-elem-07-t-drt-expected.txt similarity index 100% copy from third_party/WebKit/LayoutTests/platform/linux/svg/animations/animate-elem-06-t-drt-expected.txt copy to third_party/WebKit/LayoutTests/platform/android/svg/animations/animate-elem-07-t-drt-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/animations/animate-elem-08-t-drt-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/animations/animate-elem-08-t-drt-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/win/svg/animations/animate-elem-08-t-drt-expected.txt rename to third_party/WebKit/LayoutTests/platform/android/svg/animations/animate-elem-08-t-drt-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/animations/animate-text-nested-transforms-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/animations/animate-text-nested-transforms-expected.txt new file mode 100644 index 0000000..92258fa --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/animations/animate-text-nested-transforms-expected.txt
@@ -0,0 +1,17 @@ +CONSOLE WARNING: SVG's SMIL animations (<animate>, <set>, etc.) are deprecated and will be removed. Please use CSS animations or Web animations instead. +SVG 1.1 dynamic animation tests + +This is some text. +test to determine whether auto-rotate animateMotion path animations pre-muliply or post-multiply animation transform matrix + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +FAIL rootSVGElement.getBBox().x should be close to 117. Was 115.01837921142578. +FAIL rootSVGElement.getBBox().y should be close to -160. Was -154.0113525390625. +PASS rootSVGElement.getBBox().x is 367 +PASS rootSVGElement.getBBox().y is 550 +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/animations/animateMotion-accumulate-2a-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/animations/animateMotion-accumulate-2a-expected.png new file mode 100644 index 0000000..6d155091 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/animations/animateMotion-accumulate-2a-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/animations/animateMotion-accumulate-2b-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/animations/animateMotion-accumulate-2b-expected.png new file mode 100644 index 0000000..b5bd4b1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/animations/animateMotion-accumulate-2b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/textOnPath-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/textOnPath-expected.png new file mode 100644 index 0000000..597871c --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/textOnPath-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/textOnPath2-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/textOnPath2-expected.png new file mode 100644 index 0000000..9432fe59 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/textOnPath2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/textOnPath3-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/textOnPath3-expected.png new file mode 100644 index 0000000..078ab8cd --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/textOnPath3-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/textOnPathSpaces-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/textOnPathSpaces-expected.png new file mode 100644 index 0000000..d676e36 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/textOnPathSpaces-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/verticalText-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/verticalText-expected.png new file mode 100644 index 0000000..15da7710 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/verticalText-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/verticalTextOnPath-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/verticalTextOnPath-expected.png new file mode 100644 index 0000000..d408231bc --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/batik/text/verticalTextOnPath-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/custom/disallow-non-lengths-in-attrs-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/custom/disallow-non-lengths-in-attrs-expected.txt new file mode 100644 index 0000000..be10764 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/custom/disallow-non-lengths-in-attrs-expected.txt
@@ -0,0 +1,20 @@ +CONSOLE ERROR: Error: Invalid value for <svg> attribute width="auto" +CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute width="auto" +CONSOLE ERROR: Error: Invalid value for <svg> attribute width="initial" +CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute width="initial" +CONSOLE ERROR: Error: Invalid value for <svg> attribute width="inherit" +CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute width="inherit" +CONSOLE ERROR: Error: Invalid value for <svg> attribute width="foo" +CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute width="foo" + + This is a testharness.js-based test. +PASS Test width 'auto' on SVGSVGElement +PASS Test width 'auto' on SVGForeignObject +PASS Test width 'initial' on SVGSVGElement +PASS Test width 'initial' on SVGForeignObject +PASS Test width 'inherit' on SVGSVGElement +PASS Test width 'inherit' on SVGForeignObject +PASS Test width 'foo' on SVGSVGElement +PASS Test width 'foo' on SVGForeignObject +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/custom/invalid-length-units-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/custom/invalid-length-units-expected.txt new file mode 100644 index 0000000..dff7a6f --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/custom/invalid-length-units-expected.txt
@@ -0,0 +1,37 @@ +CONSOLE ERROR: Error: Invalid value for <rect> attribute x=" " +CONSOLE ERROR: Error: Invalid value for <rect> attribute x="foo" +CONSOLE ERROR: Error: Invalid value for <rect> attribute x="10foo" +CONSOLE ERROR: Error: Invalid value for <rect> attribute x="px" +CONSOLE ERROR: Error: Invalid value for <rect> attribute x="10 % " +CONSOLE ERROR: Error: Invalid value for <rect> attribute x="10 %" +CONSOLE ERROR: Error: Invalid value for <rect> attribute x="10 px " +CONSOLE ERROR: Error: Invalid value for <rect> attribute x="10 px" +Tests handling of invalid SVG length units. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS rect.setAttribute('x', ''); rect.x.baseVal.valueAsString is '0' +PASS rect.setAttribute('x', ' '); rect.x.baseVal.valueAsString is '0' +PASS rect.setAttribute('x', 'foo'); rect.x.baseVal.valueAsString is '0' +PASS rect.setAttribute('x', '10foo'); rect.x.baseVal.valueAsString is '0' +PASS rect.setAttribute('x', 'px'); rect.x.baseVal.valueAsString is '0' +PASS rect.setAttribute('x', '10px '); rect.x.baseVal.valueAsString is '10px' +PASS rect.setAttribute('x', '10% '); rect.x.baseVal.valueAsString is '10%' +PASS rect.setAttribute('x', '10 % '); rect.x.baseVal.valueAsString is '0' +PASS rect.setAttribute('x', '10 %'); rect.x.baseVal.valueAsString is '0' +PASS rect.setAttribute('x', '10 px '); rect.x.baseVal.valueAsString is '0' +PASS rect.setAttribute('x', '10 px'); rect.x.baseVal.valueAsString is '0' +PASS rect.setAttribute('x', '10'); rect.x.baseVal.valueAsString is '10' +PASS rect.setAttribute('x', '10%'); rect.x.baseVal.valueAsString is '10%' +PASS rect.setAttribute('x', '10em'); rect.x.baseVal.valueAsString is '10em' +PASS rect.setAttribute('x', '10ex'); rect.x.baseVal.valueAsString is '10ex' +PASS rect.setAttribute('x', '10px'); rect.x.baseVal.valueAsString is '10px' +PASS rect.setAttribute('x', '10cm'); rect.x.baseVal.valueAsString is '10cm' +PASS rect.setAttribute('x', '10mm'); rect.x.baseVal.valueAsString is '10mm' +PASS rect.setAttribute('x', '10pt'); rect.x.baseVal.valueAsString is '10pt' +PASS rect.setAttribute('x', '10pc'); rect.x.baseVal.valueAsString is '10pc' +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/custom/invalid-lengthlist-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/custom/invalid-lengthlist-expected.txt new file mode 100644 index 0000000..1b0035f0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/custom/invalid-lengthlist-expected.txt
@@ -0,0 +1,14 @@ +CONSOLE ERROR: line 13: Error: Invalid value for <text> attribute x="1.2.3" +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutSVGRoot {svg} at (0,0) size 359x154 + LayoutSVGContainer {g} at (0,0) size 359x154 + LayoutSVGText {text} + LayoutSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00] + LayoutSVGText {text} at (0,115) size 274x19 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (0,0) size 274x19 + chunk 1 text run 1 at (0.00,130.00) startOffset 0 endOffset 44 width 274.00: "Above a green rectangle should be displayed." + LayoutSVGText {text} at (0,135) size 359x19 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (0,0) size 359x19 + chunk 1 text run 1 at (0.00,150.00) startOffset 0 endOffset 61 width 359.00: "It tests that x=\"1.2.3\" as length is not accepted. Bug 15464."
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/custom/poly-parsing-error-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/custom/poly-parsing-error-expected.txt new file mode 100644 index 0000000..6082962 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/custom/poly-parsing-error-expected.txt
@@ -0,0 +1,21 @@ +CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="80,200 80,300 150,250 80,200 250" +CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="180,200 180,300 250,250 180,200 250" +CONSOLE ERROR: Error: Invalid value for <polygon> attribute points="80,60 80,160 150,110 80" +CONSOLE ERROR: Error: Invalid value for <polygon> attribute points="180,60 180,160 250,110 180" +Tests whether polygons render up to first parsing error. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS poly1.points.numberOfItems is 4 +PASS poly2.points.numberOfItems is 4 +PASS poly3.points.numberOfItems is 4 +PASS poly4.points.numberOfItems is 4 +PASS poly5.points.numberOfItems is 3 +PASS poly6.points.numberOfItems is 3 +PASS poly7.points.numberOfItems is 3 +PASS poly8.points.numberOfItems is 3 +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/custom/polyline-invalid-points-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/custom/polyline-invalid-points-expected.txt new file mode 100644 index 0000000..985406f --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/custom/polyline-invalid-points-expected.txt
@@ -0,0 +1,7 @@ +CONSOLE ERROR: line 4: Error: Invalid value for <polyline> attribute points="0, 0 100,0 100, 100 0, 100 INF INF" +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutSVGRoot {svg} at (0,0) size 100x100 + LayoutSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#FF0000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00] + LayoutSVGPath {polyline} at (0,0) size 100x100 [fill={[type=SOLID] [color=#008000]}] [points="0 0 100 0 100 100 0 100"]
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/custom/polyline-setattribute-points-null-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/custom/polyline-setattribute-points-null-expected.txt new file mode 100644 index 0000000..05f57f1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/custom/polyline-setattribute-points-null-expected.txt
@@ -0,0 +1,8 @@ +CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="undefined" +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutSVGRoot {svg} at (0,0) size 100x100 + LayoutSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00] + LayoutSVGContainer {g} at (0,0) size 0x0 + LayoutSVGPath {polyline} at (0,0) size 0x0 [fill={[type=SOLID] [color=#000000]}] [points=""]
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-length-rem-crash-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-length-rem-crash-expected.txt new file mode 100644 index 0000000..9388ebd --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-length-rem-crash-expected.txt
@@ -0,0 +1,2 @@ +CONSOLE ERROR: line 2: Error: Invalid value for <svg> attribute width="1re" +This test passes if it doesn't crash in ASAN.
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-parse-overflow-1-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-parse-overflow-1-expected.txt new file mode 100644 index 0000000..e87dff4 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-parse-overflow-1-expected.txt
@@ -0,0 +1,2 @@ +CONSOLE ERROR: line 9: Error: Invalid value for <foreignObject> attribute y="105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-parse-overflow-2-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-parse-overflow-2-expected.txt new file mode 100644 index 0000000..0f0ed25 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-parse-overflow-2-expected.txt
@@ -0,0 +1,2 @@ +CONSOLE ERROR: line 9: Error: Invalid value for <rect> attribute height="-105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-parse-overflow-3-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-parse-overflow-3-expected.txt new file mode 100644 index 0000000..6aa637c --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-parse-overflow-3-expected.txt
@@ -0,0 +1,2 @@ +CONSOLE ERROR: line 14: Error: Invalid value for <rect> attribute height="105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-parse-overflow-4-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-parse-overflow-4-expected.txt new file mode 100644 index 0000000..c534597 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-parse-overflow-4-expected.txt
@@ -0,0 +1,2 @@ +CONSOLE ERROR: line 9: Error: Invalid value for <foreignObject> attribute y="105.0e50" +
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-parse-overflow-5-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-parse-overflow-5-expected.txt new file mode 100644 index 0000000..9477f6e7 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/custom/svg-parse-overflow-5-expected.txt
@@ -0,0 +1,2 @@ +CONSOLE ERROR: line 9: Error: Invalid value for <foreignObject> attribute y="105.0e5000000000000000000000000000000000000000000000000000" +
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/custom/text-match-highlight-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/custom/text-match-highlight-expected.png new file mode 100644 index 0000000..beeb8bb --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/custom/text-match-highlight-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/custom/text-match-highlight-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/custom/text-match-highlight-expected.txt new file mode 100644 index 0000000..6036db8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/custom/text-match-highlight-expected.txt
@@ -0,0 +1,87 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x401 + LayoutBlockFlow {HTML} at (0,0) size 800x401 + LayoutBlockFlow {BODY} at (8,8) size 784x385 + LayoutText {#text} at (0,0) size 424x19 + text run at (0,0) width 424: "Test for crbug.com/56580: There should be 9 highlighted instances of \"" + LayoutInline {SPAN} at (0,0) size 41x19 + LayoutText {#text} at (423,0) size 41x19 + text run at (423,0) width 41: "findme" + LayoutText {#text} at (463,0) size 277x19 + text run at (463,0) width 124: "\". The 6th higlighted " + text run at (586,0) width 154: "instance should be active." + LayoutBR {BR} at (739,0) size 1x19 + LayoutBR {BR} at (0,20) size 0x19 + LayoutText {#text} at (0,40) size 83x19 + text run at (0,40) width 83: "Lorum ipsum " + LayoutInline {SPAN} at (0,0) size 40x19 + LayoutText {#text} at (83,40) size 40x19 + text run at (83,40) width 40: "findme" + LayoutText {#text} at (123,40) size 81x19 + text run at (123,40) width 81: " lorum ipsum " + LayoutInline {SPAN} at (0,0) size 40x19 + LayoutText {#text} at (204,40) size 40x19 + text run at (204,40) width 40: "findme" + LayoutInline {SPAN} at (0,0) size 40x19 + LayoutText {#text} at (244,40) size 40x19 + text run at (244,40) width 40: "findme" + LayoutText {#text} at (284,40) size 42x19 + text run at (284,40) width 42: " lorum." + LayoutBR {BR} at (326,40) size 0x19 + LayoutText {#text} at (0,60) size 47x19 + text run at (0,60) width 47: "longtext" + LayoutInline {SPAN} at (0,0) size 40x19 + LayoutText {#text} at (47,60) size 40x19 + text run at (47,60) width 40: "findme" + LayoutText {#text} at (87,60) size 41x19 + text run at (87,60) width 41: "noyou." + LayoutBR {BR} at (128,60) size 0x19 + LayoutSVGRoot {svg} at (17,122) size 218x162 + LayoutSVGHiddenContainer {defs} at (0,0) size 0x0 + LayoutSVGPath {path} at (108,88) size 350x300 [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"] + LayoutSVGText {text} at (10,35) size 216x19 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (0,0) size 216x19 + chunk 1 text run 1 at (10.00,50.00) startOffset 0 endOffset 36 width 216.00: "Can you findme in this stroked text?" + LayoutSVGText {text} at (10,91) size 138x12 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (0,0) size 138x12 + chunk 1 text run 1 at (10.00,100.00) startOffset 0 endOffset 23 width 138.00: "Findme in a typewriter!" + LayoutSVGContainer {g} at (28,212) size 202x72 [transform={m=((0.30,0.00)(0.00,0.30)) t=(0.00,120.00)}] + LayoutSVGText {text} at (69,14) size 669x239 contains 1 chunk(s) + LayoutSVGTextPath {textPath} at (0,0) size 668x238 + LayoutSVGInlineText {#text} at (0,0) size 668x238 + chunk 1 text run 1 at (109.48,190.53) startOffset 0 endOffset 1 width 26.67: "F" + chunk 1 text run 2 at (122.50,177.58) startOffset 1 endOffset 2 width 10.00: "i" + chunk 1 text run 3 at (135.53,164.80) startOffset 2 endOffset 3 width 26.67: "n" + chunk 1 text run 4 at (154.82,146.40) startOffset 3 endOffset 4 width 26.67: "d" + chunk 1 text run 5 at (178.39,125.18) startOffset 4 endOffset 5 width 36.67: "m" + chunk 1 text run 6 at (202.97,105.12) startOffset 5 endOffset 6 width 26.67: "e" + chunk 1 text run 7 at (220.54,92.43) startOffset 6 endOffset 7 width 16.67: " " + chunk 1 text run 8 at (238.91,80.94) startOffset 7 endOffset 8 width 26.67: "o" + chunk 1 text run 9 at (262.80,69.16) startOffset 8 endOffset 9 width 26.67: "n" + chunk 1 text run 10 at (283.31,62.32) startOffset 9 endOffset 10 width 16.67: " " + chunk 1 text run 11 at (304.62,58.84) startOffset 10 endOffset 11 width 26.67: "a" + chunk 1 text run 12 at (326.23,59.54) startOffset 11 endOffset 12 width 16.67: " " + chunk 1 text run 13 at (347.21,64.70) startOffset 12 endOffset 13 width 26.67: "p" + chunk 1 text run 14 at (371.10,76.49) startOffset 13 endOffset 14 width 26.67: "a" + chunk 1 text run 15 at (389.76,90.45) startOffset 14 endOffset 15 width 20.00: "t" + chunk 1 text run 16 at (406.65,106.65) startOffset 15 endOffset 16 width 26.67: "h" + chunk 1 text run 17 at (422.05,121.97) startOffset 16 endOffset 17 width 16.67: "!" + chunk 1 text run 18 at (433.90,133.61) startOffset 17 endOffset 18 width 16.67: " " + chunk 1 text run 19 at (450.74,149.77) startOffset 18 endOffset 19 width 30.00: "D" + chunk 1 text run 20 at (465.45,163.37) startOffset 19 endOffset 20 width 10.00: "i" + chunk 1 text run 21 at (479.18,175.50) startOffset 20 endOffset 21 width 26.67: "d" + chunk 1 text run 22 at (495.84,189.32) startOffset 21 endOffset 22 width 16.67: " " + chunk 1 text run 23 at (513.09,202.37) startOffset 22 endOffset 23 width 26.67: "y" + chunk 1 text run 24 at (535.29,216.95) startOffset 23 endOffset 24 width 26.29: "o" + chunk 1 text run 25 at (558.82,229.15) startOffset 24 endOffset 25 width 26.67: "u" + chunk 1 text run 26 at (579.15,236.56) startOffset 25 endOffset 26 width 16.67: " " + chunk 1 text run 27 at (595.34,240.13) startOffset 26 endOffset 27 width 16.67: "f" + chunk 1 text run 28 at (608.60,241.36) startOffset 27 endOffset 28 width 10.00: "i" + chunk 1 text run 29 at (626.88,240.37) startOffset 28 endOffset 29 width 26.67: "n" + chunk 1 text run 30 at (652.51,233.25) startOffset 29 endOffset 30 width 26.67: "d" + chunk 1 text run 31 at (679.87,217.49) startOffset 30 endOffset 31 width 36.67: "m" + chunk 1 text run 32 at (703.66,196.38) startOffset 31 endOffset 32 width 26.67: "e" + chunk 1 text run 33 at (722.06,179.49) startOffset 32 endOffset 33 width 23.33: "?" + LayoutSVGInlineText {#text} at (0,0) size 0x0 + LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/custom/use-property-synchronization-crash-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/custom/use-property-synchronization-crash-expected.txt new file mode 100644 index 0000000..6788ca02 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/custom/use-property-synchronization-crash-expected.txt
@@ -0,0 +1,13 @@ +CONSOLE ERROR: line 5: Error: Invalid value for <polyline> attribute points="0" +CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="0" +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutSVGRoot {svg} at (0,0) size 0x0 + LayoutSVGContainer {g} at (0,0) size 0x0 + LayoutSVGContainer {g} at (0,0) size 0x0 + LayoutSVGPath {polyline} at (0,0) size 0x0 [fill={[type=SOLID] [color=#000000]}] [points=""] + LayoutSVGContainer {use} at (0,0) size 0x0 + LayoutSVGContainer {g} at (0,0) size 0x0 + LayoutSVGPath {polyline} at (0,0) size 0x0 [fill={[type=SOLID] [color=#000000]}] [points=""] + LayoutSVGContainer {g} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/dom/points-parser-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/dom/points-parser-expected.txt new file mode 100644 index 0000000..50752656 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/dom/points-parser-expected.txt
@@ -0,0 +1,130 @@ +CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="a" +CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="10" +CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="10," +CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="10,," +CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="10,,10" +CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="10,10," +CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="10,10a" +CONSOLE ERROR: Error: Invalid value for <polyline> attribute points=",10" +CONSOLE ERROR: Error: Invalid value for <polyline> attribute points=",10," +CONSOLE ERROR: Error: Invalid value for <polyline> attribute points=",10,," +CONSOLE ERROR: Error: Invalid value for <polyline> attribute points=",10,10" +This tests the parser for points attribute values. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +Test string: ' ' +PASS '' is '' + +Test string: '10 10' +PASS '10 10' is '10 10' + +Test string: '10,10' +PASS '10 10' is '10 10' + +Test string: '10, 10' +PASS '10 10' is '10 10' + +Test string: '10 10 20 20' +PASS '10 10 20 20' is '10 10 20 20' + +Test string: '10, 10 20 20' +PASS '10 10 20 20' is '10 10 20 20' + +Test string: '10, 10, 20 20' +PASS '10 10 20 20' is '10 10 20 20' + +Test string: '10, 10, 20, 20' +PASS '10 10 20 20' is '10 10 20 20' + +Test string: '10, 10 20, 20' +PASS '10 10 20 20' is '10 10 20 20' + +Test string: '10 10, 20, 20' +PASS '10 10 20 20' is '10 10 20 20' + +Test string: '10 10 20, 20' +PASS '10 10 20 20' is '10 10 20 20' + +Test string: '10+10' +PASS '10 10' is '10 10' + +Test string: '10-10' +PASS '10 -10' is '10 -10' + +Test string: '10,+10' +PASS '10 10' is '10 10' + +Test string: '10,-10' +PASS '10 -10' is '10 -10' + +Test string: ' 10,10' +PASS '10 10' is '10 10' + +Test string: '10,10 ' +PASS '10 10' is '10 10' + +Test string: '10, 10' +PASS '10 10' is '10 10' + +Test string: '10 ,10' +PASS '10 10' is '10 10' + +Test string: '10 , 10' +PASS '10 10' is '10 10' + +Test string: ' 10,10' +PASS '10 10' is '10 10' + +Test string: '10,10 ' +PASS '10 10' is '10 10' + +Test string: '10, 10' +PASS '10 10' is '10 10' + +Test string: '10 ,10' +PASS '10 10' is '10 10' + +Test string: '10 , 10' +PASS '10 10' is '10 10' + +Strings that fail to parse, and hence parse as "". + +Test string: 'a' +PASS '' is '' + +Test string: '10' +PASS '' is '' + +Test string: '10,' +PASS '' is '' + +Test string: '10,,' +PASS '' is '' + +Test string: '10,,10' +PASS '' is '' + +Test string: '10,10,' +PASS '10 10' is '10 10' + +Test string: '10,10a' +PASS '10 10' is '10 10' + +Test string: ',10' +PASS '' is '' + +Test string: ',10,' +PASS '' is '' + +Test string: ',10,,' +PASS '' is '' + +Test string: ',10,10' +PASS '' is '' + +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/dynamic-updates/SVG-dynamic-css-transform-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/dynamic-updates/SVG-dynamic-css-transform-expected.png new file mode 100644 index 0000000..529b842 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/dynamic-updates/SVG-dynamic-css-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/filters/subRegion-one-effect-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/filters/subRegion-one-effect-expected.png new file mode 100644 index 0000000..50451baf --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/filters/subRegion-one-effect-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/filters/subRegion-two-effects-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/filters/subRegion-two-effects-expected.png new file mode 100644 index 0000000..f2ffa5a --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/filters/subRegion-two-effects-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/hixie/error/001-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/hixie/error/001-expected.txt new file mode 100644 index 0000000..b42e8eec --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/hixie/error/001-expected.txt
@@ -0,0 +1,8 @@ +CONSOLE ERROR: line 3: Error: Invalid value for <circle> attribute r="r" +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutSVGRoot {svg} at (100,100) size 200x200 + LayoutSVGRect {rect} at (100,100) size 200x200 [fill={[type=SOLID] [color=#FF0000]}] [x=100.00] [y=100.00] [width=200.00] [height=200.00] + LayoutSVGEllipse {circle} at (0,0) size 0x0 [fill={[type=SOLID] [color=#FF0000]}] [cx=1.00] [cy=1.00] [r=0.00] + LayoutSVGRect {rect} at (100,100) size 200x200 [fill={[type=SOLID] [color=#008000]}] [x=100.00] [y=100.00] [width=200.00] [height=200.00]
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/hixie/error/010-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/hixie/error/010-expected.txt new file mode 100644 index 0000000..b1136d42 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/hixie/error/010-expected.txt
@@ -0,0 +1,9 @@ +CONSOLE ERROR: line 1: Error: Invalid value for <svg> attribute viewBox="0 0 1 1 1" +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutSVGRoot {svg} at (0,0) size 296x35 + LayoutSVGRect {rect} at (0,0) size 1x1 [fill={[type=SOLID] [color=#FF0000]}] [x=0.00] [y=0.00] [width=1.00] [height=1.00] + LayoutSVGText {text} at (10,13) size 286x22 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (0,0) size 286x22 + chunk 1 text run 1 at (10.00,30.00) startOffset 0 endOffset 36 width 286.00: "There should be no red on this page."
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/hixie/error/011-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/hixie/error/011-expected.txt new file mode 100644 index 0000000..db215eb --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/hixie/error/011-expected.txt
@@ -0,0 +1,9 @@ +CONSOLE ERROR: line 1: Error: Invalid value for <svg> attribute viewBox="0 0,, 1 1" +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutSVGRoot {svg} at (0,0) size 296x35 + LayoutSVGRect {rect} at (0,0) size 1x1 [fill={[type=SOLID] [color=#FF0000]}] [x=0.00] [y=0.00] [width=1.00] [height=1.00] + LayoutSVGText {text} at (10,13) size 286x22 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (0,0) size 286x22 + chunk 1 text run 1 at (10.00,30.00) startOffset 0 endOffset 36 width 286.00: "There should be no red on this page."
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/parser/whitespace-length-invalid-1-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/parser/whitespace-length-invalid-1-expected.txt new file mode 100644 index 0000000..6f0500a --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/parser/whitespace-length-invalid-1-expected.txt
@@ -0,0 +1,3003 @@ +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitycm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitymm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitycm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitymm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ein" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ecm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Emm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ept" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ein" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ecm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="emm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ept" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Emm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="emm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Emm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="emm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNcm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNmm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitycm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitymm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitycm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitymm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordcm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordmm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ein\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ecm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Emm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ept\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ein\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ecm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="emm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ept\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNcm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNmm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitycm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitymm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitycm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitymm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordcm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordmm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ein\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ecm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Emm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ept\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ein\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ecm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="emm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ept\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitycm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitymm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitycm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitymm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ein" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ecm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Emm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ept" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ein" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ecm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t emm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ept" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Emm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t emm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Emm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t emm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNcm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNmm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitycm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitymm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitycm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitymm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordcm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordmm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ein\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ecm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Emm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ept\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ein\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ecm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t emm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ept\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNcm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNmm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitycm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitymm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitycm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitymm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordcm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordmm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ein\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ecm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Emm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ept\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ein\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ecm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t emm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ept\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitycm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitymm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitycm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitymm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEin" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEcm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEmm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feem" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepx" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fein" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fecm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\femm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fept" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\femm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitycm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitymm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEin " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEcm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEmm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feem " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepx " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fein " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fecm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\femm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fept " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNcm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNmm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitycm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitymm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitycm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitymm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordcm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordmm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEin\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEcm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEmm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feem\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepx\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fein\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fecm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\femm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fept\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNcm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNmm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitycm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitymm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitycm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitymm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordcm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordmm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEin\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEcm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEmm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feem\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepx\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fein\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fecm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\femm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fept\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe%\f" +This is a testharness.js-based test. +PASS Test <length> invalid value: NaN +PASS Test <length> invalid value: NaNem +PASS Test <length> invalid value: NaNex +PASS Test <length> invalid value: NaNpx +PASS Test <length> invalid value: NaNin +PASS Test <length> invalid value: NaNcm +PASS Test <length> invalid value: NaNmm +PASS Test <length> invalid value: NaNpt +PASS Test <length> invalid value: NaNpc +PASS Test <length> invalid value: NaN% +PASS Test <length> invalid value: Infinity +PASS Test <length> invalid value: Infinityem +PASS Test <length> invalid value: Infinityex +PASS Test <length> invalid value: Infinitypx +PASS Test <length> invalid value: Infinityin +PASS Test <length> invalid value: Infinitycm +PASS Test <length> invalid value: Infinitymm +PASS Test <length> invalid value: Infinitypt +PASS Test <length> invalid value: Infinitypc +PASS Test <length> invalid value: Infinity% +PASS Test <length> invalid value: -Infinity +PASS Test <length> invalid value: -Infinityem +PASS Test <length> invalid value: -Infinityex +PASS Test <length> invalid value: -Infinitypx +PASS Test <length> invalid value: -Infinityin +PASS Test <length> invalid value: -Infinitycm +PASS Test <length> invalid value: -Infinitymm +PASS Test <length> invalid value: -Infinitypt +PASS Test <length> invalid value: -Infinitypc +PASS Test <length> invalid value: -Infinity% +PASS Test <length> invalid value: fnord +PASS Test <length> invalid value: fnordem +PASS Test <length> invalid value: fnordex +PASS Test <length> invalid value: fnordpx +PASS Test <length> invalid value: fnordin +PASS Test <length> invalid value: fnordcm +PASS Test <length> invalid value: fnordmm +PASS Test <length> invalid value: fnordpt +PASS Test <length> invalid value: fnordpc +PASS Test <length> invalid value: fnord% +PASS Test <length> invalid value: E +PASS Test <length> invalid value: Eem +PASS Test <length> invalid value: Eex +PASS Test <length> invalid value: Epx +PASS Test <length> invalid value: Ein +PASS Test <length> invalid value: Ecm +PASS Test <length> invalid value: Emm +PASS Test <length> invalid value: Ept +PASS Test <length> invalid value: Epc +PASS Test <length> invalid value: E% +PASS Test <length> invalid value: e +PASS Test <length> invalid value: eem +PASS Test <length> invalid value: eex +PASS Test <length> invalid value: epx +PASS Test <length> invalid value: ein +PASS Test <length> invalid value: ecm +PASS Test <length> invalid value: emm +PASS Test <length> invalid value: ept +PASS Test <length> invalid value: epc +PASS Test <length> invalid value: e% +PASS Test <length> invalid value: NaN +PASS Test <length> invalid value: NaNem +PASS Test <length> invalid value: NaNex +PASS Test <length> invalid value: NaNpx +PASS Test <length> invalid value: NaNin +PASS Test <length> invalid value: NaNcm +PASS Test <length> invalid value: NaNmm +PASS Test <length> invalid value: NaNpt +PASS Test <length> invalid value: NaNpc +PASS Test <length> invalid value: NaN% +PASS Test <length> invalid value: Infinity +PASS Test <length> invalid value: Infinityem +PASS Test <length> invalid value: Infinityex +PASS Test <length> invalid value: Infinitypx +PASS Test <length> invalid value: Infinityin +PASS Test <length> invalid value: Infinitycm +PASS Test <length> invalid value: Infinitymm +PASS Test <length> invalid value: Infinitypt +PASS Test <length> invalid value: Infinitypc +PASS Test <length> invalid value: Infinity% +PASS Test <length> invalid value: -Infinity +PASS Test <length> invalid value: -Infinityem +PASS Test <length> invalid value: -Infinityex +PASS Test <length> invalid value: -Infinitypx +PASS Test <length> invalid value: -Infinityin +PASS Test <length> invalid value: -Infinitycm +PASS Test <length> invalid value: -Infinitymm +PASS Test <length> invalid value: -Infinitypt +PASS Test <length> invalid value: -Infinitypc +PASS Test <length> invalid value: -Infinity% +PASS Test <length> invalid value: fnord +PASS Test <length> invalid value: fnordem +PASS Test <length> invalid value: fnordex +PASS Test <length> invalid value: fnordpx +PASS Test <length> invalid value: fnordin +PASS Test <length> invalid value: fnordcm +PASS Test <length> invalid value: fnordmm +PASS Test <length> invalid value: fnordpt +PASS Test <length> invalid value: fnordpc +PASS Test <length> invalid value: fnord% +PASS Test <length> invalid value: E +PASS Test <length> invalid value: Eem +PASS Test <length> invalid value: Eex +PASS Test <length> invalid value: Epx +PASS Test <length> invalid value: Ein +PASS Test <length> invalid value: Ecm +PASS Test <length> invalid value: Emm +PASS Test <length> invalid value: Ept +PASS Test <length> invalid value: Epc +PASS Test <length> invalid value: E% +PASS Test <length> invalid value: e +PASS Test <length> invalid value: eem +PASS Test <length> invalid value: eex +PASS Test <length> invalid value: epx +PASS Test <length> invalid value: ein +PASS Test <length> invalid value: ecm +PASS Test <length> invalid value: emm +PASS Test <length> invalid value: ept +PASS Test <length> invalid value: epc +PASS Test <length> invalid value: e% +PASS Test <length> invalid value: NaN +PASS Test <length> invalid value: NaNem +PASS Test <length> invalid value: NaNex +PASS Test <length> invalid value: NaNpx +PASS Test <length> invalid value: NaNin +PASS Test <length> invalid value: NaNcm +PASS Test <length> invalid value: NaNmm +PASS Test <length> invalid value: NaNpt +PASS Test <length> invalid value: NaNpc +PASS Test <length> invalid value: NaN% +PASS Test <length> invalid value: Infinity +PASS Test <length> invalid value: Infinityem +PASS Test <length> invalid value: Infinityex +PASS Test <length> invalid value: Infinitypx +PASS Test <length> invalid value: Infinityin +PASS Test <length> invalid value: Infinitycm +PASS Test <length> invalid value: Infinitymm +PASS Test <length> invalid value: Infinitypt +PASS Test <length> invalid value: Infinitypc +PASS Test <length> invalid value: Infinity% +PASS Test <length> invalid value: -Infinity +PASS Test <length> invalid value: -Infinityem +PASS Test <length> invalid value: -Infinityex +PASS Test <length> invalid value: -Infinitypx +PASS Test <length> invalid value: -Infinityin +PASS Test <length> invalid value: -Infinitycm +PASS Test <length> invalid value: -Infinitymm +PASS Test <length> invalid value: -Infinitypt +PASS Test <length> invalid value: -Infinitypc +PASS Test <length> invalid value: -Infinity% +PASS Test <length> invalid value: fnord +PASS Test <length> invalid value: fnordem +PASS Test <length> invalid value: fnordex +PASS Test <length> invalid value: fnordpx +PASS Test <length> invalid value: fnordin +PASS Test <length> invalid value: fnordcm +PASS Test <length> invalid value: fnordmm +PASS Test <length> invalid value: fnordpt +PASS Test <length> invalid value: fnordpc +PASS Test <length> invalid value: fnord% +PASS Test <length> invalid value: E +PASS Test <length> invalid value: Eem +PASS Test <length> invalid value: Eex +PASS Test <length> invalid value: Epx +PASS Test <length> invalid value: Ein +PASS Test <length> invalid value: Ecm +PASS Test <length> invalid value: Emm +PASS Test <length> invalid value: Ept +PASS Test <length> invalid value: Epc +PASS Test <length> invalid value: E% +PASS Test <length> invalid value: e +PASS Test <length> invalid value: eem +PASS Test <length> invalid value: eex +PASS Test <length> invalid value: epx +PASS Test <length> invalid value: ein +PASS Test <length> invalid value: ecm +PASS Test <length> invalid value: emm +PASS Test <length> invalid value: ept +PASS Test <length> invalid value: epc +PASS Test <length> invalid value: e% +PASS Test <length> invalid value: NaN\r\n\t +PASS Test <length> invalid value: NaNem\r\n\t +PASS Test <length> invalid value: NaNex\r\n\t +PASS Test <length> invalid value: NaNpx\r\n\t +PASS Test <length> invalid value: NaNin\r\n\t +PASS Test <length> invalid value: NaNcm\r\n\t +PASS Test <length> invalid value: NaNmm\r\n\t +PASS Test <length> invalid value: NaNpt\r\n\t +PASS Test <length> invalid value: NaNpc\r\n\t +PASS Test <length> invalid value: NaN%\r\n\t +PASS Test <length> invalid value: Infinity\r\n\t +PASS Test <length> invalid value: Infinityem\r\n\t +PASS Test <length> invalid value: Infinityex\r\n\t +PASS Test <length> invalid value: Infinitypx\r\n\t +PASS Test <length> invalid value: Infinityin\r\n\t +PASS Test <length> invalid value: Infinitycm\r\n\t +PASS Test <length> invalid value: Infinitymm\r\n\t +PASS Test <length> invalid value: Infinitypt\r\n\t +PASS Test <length> invalid value: Infinitypc\r\n\t +PASS Test <length> invalid value: Infinity%\r\n\t +PASS Test <length> invalid value: -Infinity\r\n\t +PASS Test <length> invalid value: -Infinityem\r\n\t +PASS Test <length> invalid value: -Infinityex\r\n\t +PASS Test <length> invalid value: -Infinitypx\r\n\t +PASS Test <length> invalid value: -Infinityin\r\n\t +PASS Test <length> invalid value: -Infinitycm\r\n\t +PASS Test <length> invalid value: -Infinitymm\r\n\t +PASS Test <length> invalid value: -Infinitypt\r\n\t +PASS Test <length> invalid value: -Infinitypc\r\n\t +PASS Test <length> invalid value: -Infinity%\r\n\t +PASS Test <length> invalid value: fnord\r\n\t +PASS Test <length> invalid value: fnordem\r\n\t +PASS Test <length> invalid value: fnordex\r\n\t +PASS Test <length> invalid value: fnordpx\r\n\t +PASS Test <length> invalid value: fnordin\r\n\t +PASS Test <length> invalid value: fnordcm\r\n\t +PASS Test <length> invalid value: fnordmm\r\n\t +PASS Test <length> invalid value: fnordpt\r\n\t +PASS Test <length> invalid value: fnordpc\r\n\t +PASS Test <length> invalid value: fnord%\r\n\t +PASS Test <length> invalid value: E\r\n\t +PASS Test <length> invalid value: Eem\r\n\t +PASS Test <length> invalid value: Eex\r\n\t +PASS Test <length> invalid value: Epx\r\n\t +PASS Test <length> invalid value: Ein\r\n\t +PASS Test <length> invalid value: Ecm\r\n\t +PASS Test <length> invalid value: Emm\r\n\t +PASS Test <length> invalid value: Ept\r\n\t +PASS Test <length> invalid value: Epc\r\n\t +PASS Test <length> invalid value: E%\r\n\t +PASS Test <length> invalid value: e\r\n\t +PASS Test <length> invalid value: eem\r\n\t +PASS Test <length> invalid value: eex\r\n\t +PASS Test <length> invalid value: epx\r\n\t +PASS Test <length> invalid value: ein\r\n\t +PASS Test <length> invalid value: ecm\r\n\t +PASS Test <length> invalid value: emm\r\n\t +PASS Test <length> invalid value: ept\r\n\t +PASS Test <length> invalid value: epc\r\n\t +PASS Test <length> invalid value: e%\r\n\t +PASS Test <length> invalid value: NaN\f +PASS Test <length> invalid value: NaNem\f +PASS Test <length> invalid value: NaNex\f +PASS Test <length> invalid value: NaNpx\f +PASS Test <length> invalid value: NaNin\f +PASS Test <length> invalid value: NaNcm\f +PASS Test <length> invalid value: NaNmm\f +PASS Test <length> invalid value: NaNpt\f +PASS Test <length> invalid value: NaNpc\f +PASS Test <length> invalid value: NaN%\f +PASS Test <length> invalid value: Infinity\f +PASS Test <length> invalid value: Infinityem\f +PASS Test <length> invalid value: Infinityex\f +PASS Test <length> invalid value: Infinitypx\f +PASS Test <length> invalid value: Infinityin\f +PASS Test <length> invalid value: Infinitycm\f +PASS Test <length> invalid value: Infinitymm\f +PASS Test <length> invalid value: Infinitypt\f +PASS Test <length> invalid value: Infinitypc\f +PASS Test <length> invalid value: Infinity%\f +PASS Test <length> invalid value: -Infinity\f +PASS Test <length> invalid value: -Infinityem\f +PASS Test <length> invalid value: -Infinityex\f +PASS Test <length> invalid value: -Infinitypx\f +PASS Test <length> invalid value: -Infinityin\f +PASS Test <length> invalid value: -Infinitycm\f +PASS Test <length> invalid value: -Infinitymm\f +PASS Test <length> invalid value: -Infinitypt\f +PASS Test <length> invalid value: -Infinitypc\f +PASS Test <length> invalid value: -Infinity%\f +PASS Test <length> invalid value: fnord\f +PASS Test <length> invalid value: fnordem\f +PASS Test <length> invalid value: fnordex\f +PASS Test <length> invalid value: fnordpx\f +PASS Test <length> invalid value: fnordin\f +PASS Test <length> invalid value: fnordcm\f +PASS Test <length> invalid value: fnordmm\f +PASS Test <length> invalid value: fnordpt\f +PASS Test <length> invalid value: fnordpc\f +PASS Test <length> invalid value: fnord%\f +PASS Test <length> invalid value: E\f +PASS Test <length> invalid value: Eem\f +PASS Test <length> invalid value: Eex\f +PASS Test <length> invalid value: Epx\f +PASS Test <length> invalid value: Ein\f +PASS Test <length> invalid value: Ecm\f +PASS Test <length> invalid value: Emm\f +PASS Test <length> invalid value: Ept\f +PASS Test <length> invalid value: Epc\f +PASS Test <length> invalid value: E%\f +PASS Test <length> invalid value: e\f +PASS Test <length> invalid value: eem\f +PASS Test <length> invalid value: eex\f +PASS Test <length> invalid value: epx\f +PASS Test <length> invalid value: ein\f +PASS Test <length> invalid value: ecm\f +PASS Test <length> invalid value: emm\f +PASS Test <length> invalid value: ept\f +PASS Test <length> invalid value: epc\f +PASS Test <length> invalid value: e%\f +PASS Test <length> invalid value: NaN +PASS Test <length> invalid value: NaNem +PASS Test <length> invalid value: NaNex +PASS Test <length> invalid value: NaNpx +PASS Test <length> invalid value: NaNin +PASS Test <length> invalid value: NaNcm +PASS Test <length> invalid value: NaNmm +PASS Test <length> invalid value: NaNpt +PASS Test <length> invalid value: NaNpc +PASS Test <length> invalid value: NaN% +PASS Test <length> invalid value: Infinity +PASS Test <length> invalid value: Infinityem +PASS Test <length> invalid value: Infinityex +PASS Test <length> invalid value: Infinitypx +PASS Test <length> invalid value: Infinityin +PASS Test <length> invalid value: Infinitycm +PASS Test <length> invalid value: Infinitymm +PASS Test <length> invalid value: Infinitypt +PASS Test <length> invalid value: Infinitypc +PASS Test <length> invalid value: Infinity% +PASS Test <length> invalid value: -Infinity +PASS Test <length> invalid value: -Infinityem +PASS Test <length> invalid value: -Infinityex +PASS Test <length> invalid value: -Infinitypx +PASS Test <length> invalid value: -Infinityin +PASS Test <length> invalid value: -Infinitycm +PASS Test <length> invalid value: -Infinitymm +PASS Test <length> invalid value: -Infinitypt +PASS Test <length> invalid value: -Infinitypc +PASS Test <length> invalid value: -Infinity% +PASS Test <length> invalid value: fnord +PASS Test <length> invalid value: fnordem +PASS Test <length> invalid value: fnordex +PASS Test <length> invalid value: fnordpx +PASS Test <length> invalid value: fnordin +PASS Test <length> invalid value: fnordcm +PASS Test <length> invalid value: fnordmm +PASS Test <length> invalid value: fnordpt +PASS Test <length> invalid value: fnordpc +PASS Test <length> invalid value: fnord% +PASS Test <length> invalid value: E +PASS Test <length> invalid value: Eem +PASS Test <length> invalid value: Eex +PASS Test <length> invalid value: Epx +PASS Test <length> invalid value: Ein +PASS Test <length> invalid value: Ecm +PASS Test <length> invalid value: Emm +PASS Test <length> invalid value: Ept +PASS Test <length> invalid value: Epc +PASS Test <length> invalid value: E% +PASS Test <length> invalid value: e +PASS Test <length> invalid value: eem +PASS Test <length> invalid value: eex +PASS Test <length> invalid value: epx +PASS Test <length> invalid value: ein +PASS Test <length> invalid value: ecm +PASS Test <length> invalid value: emm +PASS Test <length> invalid value: ept +PASS Test <length> invalid value: epc +PASS Test <length> invalid value: e% +PASS Test <length> invalid value: NaN +PASS Test <length> invalid value: NaNem +PASS Test <length> invalid value: NaNex +PASS Test <length> invalid value: NaNpx +PASS Test <length> invalid value: NaNin +PASS Test <length> invalid value: NaNcm +PASS Test <length> invalid value: NaNmm +PASS Test <length> invalid value: NaNpt +PASS Test <length> invalid value: NaNpc +PASS Test <length> invalid value: NaN% +PASS Test <length> invalid value: Infinity +PASS Test <length> invalid value: Infinityem +PASS Test <length> invalid value: Infinityex +PASS Test <length> invalid value: Infinitypx +PASS Test <length> invalid value: Infinityin +PASS Test <length> invalid value: Infinitycm +PASS Test <length> invalid value: Infinitymm +PASS Test <length> invalid value: Infinitypt +PASS Test <length> invalid value: Infinitypc +PASS Test <length> invalid value: Infinity% +PASS Test <length> invalid value: -Infinity +PASS Test <length> invalid value: -Infinityem +PASS Test <length> invalid value: -Infinityex +PASS Test <length> invalid value: -Infinitypx +PASS Test <length> invalid value: -Infinityin +PASS Test <length> invalid value: -Infinitycm +PASS Test <length> invalid value: -Infinitymm +PASS Test <length> invalid value: -Infinitypt +PASS Test <length> invalid value: -Infinitypc +PASS Test <length> invalid value: -Infinity% +PASS Test <length> invalid value: fnord +PASS Test <length> invalid value: fnordem +PASS Test <length> invalid value: fnordex +PASS Test <length> invalid value: fnordpx +PASS Test <length> invalid value: fnordin +PASS Test <length> invalid value: fnordcm +PASS Test <length> invalid value: fnordmm +PASS Test <length> invalid value: fnordpt +PASS Test <length> invalid value: fnordpc +PASS Test <length> invalid value: fnord% +PASS Test <length> invalid value: E +PASS Test <length> invalid value: Eem +PASS Test <length> invalid value: Eex +PASS Test <length> invalid value: Epx +PASS Test <length> invalid value: Ein +PASS Test <length> invalid value: Ecm +PASS Test <length> invalid value: Emm +PASS Test <length> invalid value: Ept +PASS Test <length> invalid value: Epc +PASS Test <length> invalid value: E% +PASS Test <length> invalid value: e +PASS Test <length> invalid value: eem +PASS Test <length> invalid value: eex +PASS Test <length> invalid value: epx +PASS Test <length> invalid value: ein +PASS Test <length> invalid value: ecm +PASS Test <length> invalid value: emm +PASS Test <length> invalid value: ept +PASS Test <length> invalid value: epc +PASS Test <length> invalid value: e% +PASS Test <length> invalid value: NaN +PASS Test <length> invalid value: NaNem +PASS Test <length> invalid value: NaNex +PASS Test <length> invalid value: NaNpx +PASS Test <length> invalid value: NaNin +PASS Test <length> invalid value: NaNcm +PASS Test <length> invalid value: NaNmm +PASS Test <length> invalid value: NaNpt +PASS Test <length> invalid value: NaNpc +PASS Test <length> invalid value: NaN% +PASS Test <length> invalid value: Infinity +PASS Test <length> invalid value: Infinityem +PASS Test <length> invalid value: Infinityex +PASS Test <length> invalid value: Infinitypx +PASS Test <length> invalid value: Infinityin +PASS Test <length> invalid value: Infinitycm +PASS Test <length> invalid value: Infinitymm +PASS Test <length> invalid value: Infinitypt +PASS Test <length> invalid value: Infinitypc +PASS Test <length> invalid value: Infinity% +PASS Test <length> invalid value: -Infinity +PASS Test <length> invalid value: -Infinityem +PASS Test <length> invalid value: -Infinityex +PASS Test <length> invalid value: -Infinitypx +PASS Test <length> invalid value: -Infinityin +PASS Test <length> invalid value: -Infinitycm +PASS Test <length> invalid value: -Infinitymm +PASS Test <length> invalid value: -Infinitypt +PASS Test <length> invalid value: -Infinitypc +PASS Test <length> invalid value: -Infinity% +PASS Test <length> invalid value: fnord +PASS Test <length> invalid value: fnordem +PASS Test <length> invalid value: fnordex +PASS Test <length> invalid value: fnordpx +PASS Test <length> invalid value: fnordin +PASS Test <length> invalid value: fnordcm +PASS Test <length> invalid value: fnordmm +PASS Test <length> invalid value: fnordpt +PASS Test <length> invalid value: fnordpc +PASS Test <length> invalid value: fnord% +PASS Test <length> invalid value: E +PASS Test <length> invalid value: Eem +PASS Test <length> invalid value: Eex +PASS Test <length> invalid value: Epx +PASS Test <length> invalid value: Ein +PASS Test <length> invalid value: Ecm +PASS Test <length> invalid value: Emm +PASS Test <length> invalid value: Ept +PASS Test <length> invalid value: Epc +PASS Test <length> invalid value: E% +PASS Test <length> invalid value: e +PASS Test <length> invalid value: eem +PASS Test <length> invalid value: eex +PASS Test <length> invalid value: epx +PASS Test <length> invalid value: ein +PASS Test <length> invalid value: ecm +PASS Test <length> invalid value: emm +PASS Test <length> invalid value: ept +PASS Test <length> invalid value: epc +PASS Test <length> invalid value: e% +PASS Test <length> invalid value: NaN\r\n\t +PASS Test <length> invalid value: NaNem\r\n\t +PASS Test <length> invalid value: NaNex\r\n\t +PASS Test <length> invalid value: NaNpx\r\n\t +PASS Test <length> invalid value: NaNin\r\n\t +PASS Test <length> invalid value: NaNcm\r\n\t +PASS Test <length> invalid value: NaNmm\r\n\t +PASS Test <length> invalid value: NaNpt\r\n\t +PASS Test <length> invalid value: NaNpc\r\n\t +PASS Test <length> invalid value: NaN%\r\n\t +PASS Test <length> invalid value: Infinity\r\n\t +PASS Test <length> invalid value: Infinityem\r\n\t +PASS Test <length> invalid value: Infinityex\r\n\t +PASS Test <length> invalid value: Infinitypx\r\n\t +PASS Test <length> invalid value: Infinityin\r\n\t +PASS Test <length> invalid value: Infinitycm\r\n\t +PASS Test <length> invalid value: Infinitymm\r\n\t +PASS Test <length> invalid value: Infinitypt\r\n\t +PASS Test <length> invalid value: Infinitypc\r\n\t +PASS Test <length> invalid value: Infinity%\r\n\t +PASS Test <length> invalid value: -Infinity\r\n\t +PASS Test <length> invalid value: -Infinityem\r\n\t +PASS Test <length> invalid value: -Infinityex\r\n\t +PASS Test <length> invalid value: -Infinitypx\r\n\t +PASS Test <length> invalid value: -Infinityin\r\n\t +PASS Test <length> invalid value: -Infinitycm\r\n\t +PASS Test <length> invalid value: -Infinitymm\r\n\t +PASS Test <length> invalid value: -Infinitypt\r\n\t +PASS Test <length> invalid value: -Infinitypc\r\n\t +PASS Test <length> invalid value: -Infinity%\r\n\t +PASS Test <length> invalid value: fnord\r\n\t +PASS Test <length> invalid value: fnordem\r\n\t +PASS Test <length> invalid value: fnordex\r\n\t +PASS Test <length> invalid value: fnordpx\r\n\t +PASS Test <length> invalid value: fnordin\r\n\t +PASS Test <length> invalid value: fnordcm\r\n\t +PASS Test <length> invalid value: fnordmm\r\n\t +PASS Test <length> invalid value: fnordpt\r\n\t +PASS Test <length> invalid value: fnordpc\r\n\t +PASS Test <length> invalid value: fnord%\r\n\t +PASS Test <length> invalid value: E\r\n\t +PASS Test <length> invalid value: Eem\r\n\t +PASS Test <length> invalid value: Eex\r\n\t +PASS Test <length> invalid value: Epx\r\n\t +PASS Test <length> invalid value: Ein\r\n\t +PASS Test <length> invalid value: Ecm\r\n\t +PASS Test <length> invalid value: Emm\r\n\t +PASS Test <length> invalid value: Ept\r\n\t +PASS Test <length> invalid value: Epc\r\n\t +PASS Test <length> invalid value: E%\r\n\t +PASS Test <length> invalid value: e\r\n\t +PASS Test <length> invalid value: eem\r\n\t +PASS Test <length> invalid value: eex\r\n\t +PASS Test <length> invalid value: epx\r\n\t +PASS Test <length> invalid value: ein\r\n\t +PASS Test <length> invalid value: ecm\r\n\t +PASS Test <length> invalid value: emm\r\n\t +PASS Test <length> invalid value: ept\r\n\t +PASS Test <length> invalid value: epc\r\n\t +PASS Test <length> invalid value: e%\r\n\t +PASS Test <length> invalid value: NaN\f +PASS Test <length> invalid value: NaNem\f +PASS Test <length> invalid value: NaNex\f +PASS Test <length> invalid value: NaNpx\f +PASS Test <length> invalid value: NaNin\f +PASS Test <length> invalid value: NaNcm\f +PASS Test <length> invalid value: NaNmm\f +PASS Test <length> invalid value: NaNpt\f +PASS Test <length> invalid value: NaNpc\f +PASS Test <length> invalid value: NaN%\f +PASS Test <length> invalid value: Infinity\f +PASS Test <length> invalid value: Infinityem\f +PASS Test <length> invalid value: Infinityex\f +PASS Test <length> invalid value: Infinitypx\f +PASS Test <length> invalid value: Infinityin\f +PASS Test <length> invalid value: Infinitycm\f +PASS Test <length> invalid value: Infinitymm\f +PASS Test <length> invalid value: Infinitypt\f +PASS Test <length> invalid value: Infinitypc\f +PASS Test <length> invalid value: Infinity%\f +PASS Test <length> invalid value: -Infinity\f +PASS Test <length> invalid value: -Infinityem\f +PASS Test <length> invalid value: -Infinityex\f +PASS Test <length> invalid value: -Infinitypx\f +PASS Test <length> invalid value: -Infinityin\f +PASS Test <length> invalid value: -Infinitycm\f +PASS Test <length> invalid value: -Infinitymm\f +PASS Test <length> invalid value: -Infinitypt\f +PASS Test <length> invalid value: -Infinitypc\f +PASS Test <length> invalid value: -Infinity%\f +PASS Test <length> invalid value: fnord\f +PASS Test <length> invalid value: fnordem\f +PASS Test <length> invalid value: fnordex\f +PASS Test <length> invalid value: fnordpx\f +PASS Test <length> invalid value: fnordin\f +PASS Test <length> invalid value: fnordcm\f +PASS Test <length> invalid value: fnordmm\f +PASS Test <length> invalid value: fnordpt\f +PASS Test <length> invalid value: fnordpc\f +PASS Test <length> invalid value: fnord%\f +PASS Test <length> invalid value: E\f +PASS Test <length> invalid value: Eem\f +PASS Test <length> invalid value: Eex\f +PASS Test <length> invalid value: Epx\f +PASS Test <length> invalid value: Ein\f +PASS Test <length> invalid value: Ecm\f +PASS Test <length> invalid value: Emm\f +PASS Test <length> invalid value: Ept\f +PASS Test <length> invalid value: Epc\f +PASS Test <length> invalid value: E%\f +PASS Test <length> invalid value: e\f +PASS Test <length> invalid value: eem\f +PASS Test <length> invalid value: eex\f +PASS Test <length> invalid value: epx\f +PASS Test <length> invalid value: ein\f +PASS Test <length> invalid value: ecm\f +PASS Test <length> invalid value: emm\f +PASS Test <length> invalid value: ept\f +PASS Test <length> invalid value: epc\f +PASS Test <length> invalid value: e%\f +PASS Test <length> invalid value: NaN +PASS Test <length> invalid value: NaNem +PASS Test <length> invalid value: NaNex +PASS Test <length> invalid value: NaNpx +PASS Test <length> invalid value: NaNin +PASS Test <length> invalid value: NaNcm +PASS Test <length> invalid value: NaNmm +PASS Test <length> invalid value: NaNpt +PASS Test <length> invalid value: NaNpc +PASS Test <length> invalid value: NaN% +PASS Test <length> invalid value: Infinity +PASS Test <length> invalid value: Infinityem +PASS Test <length> invalid value: Infinityex +PASS Test <length> invalid value: Infinitypx +PASS Test <length> invalid value: Infinityin +PASS Test <length> invalid value: Infinitycm +PASS Test <length> invalid value: Infinitymm +PASS Test <length> invalid value: Infinitypt +PASS Test <length> invalid value: Infinitypc +PASS Test <length> invalid value: Infinity% +PASS Test <length> invalid value: -Infinity +PASS Test <length> invalid value: -Infinityem +PASS Test <length> invalid value: -Infinityex +PASS Test <length> invalid value: -Infinitypx +PASS Test <length> invalid value: -Infinityin +PASS Test <length> invalid value: -Infinitycm +PASS Test <length> invalid value: -Infinitymm +PASS Test <length> invalid value: -Infinitypt +PASS Test <length> invalid value: -Infinitypc +PASS Test <length> invalid value: -Infinity% +PASS Test <length> invalid value: fnord +PASS Test <length> invalid value: fnordem +PASS Test <length> invalid value: fnordex +PASS Test <length> invalid value: fnordpx +PASS Test <length> invalid value: fnordin +PASS Test <length> invalid value: fnordcm +PASS Test <length> invalid value: fnordmm +PASS Test <length> invalid value: fnordpt +PASS Test <length> invalid value: fnordpc +PASS Test <length> invalid value: fnord% +PASS Test <length> invalid value: E +PASS Test <length> invalid value: Eem +PASS Test <length> invalid value: Eex +PASS Test <length> invalid value: Epx +PASS Test <length> invalid value: Ein +PASS Test <length> invalid value: Ecm +PASS Test <length> invalid value: Emm +PASS Test <length> invalid value: Ept +PASS Test <length> invalid value: Epc +PASS Test <length> invalid value: E% +PASS Test <length> invalid value: e +PASS Test <length> invalid value: eem +PASS Test <length> invalid value: eex +PASS Test <length> invalid value: epx +PASS Test <length> invalid value: ein +PASS Test <length> invalid value: ecm +PASS Test <length> invalid value: emm +PASS Test <length> invalid value: ept +PASS Test <length> invalid value: epc +PASS Test <length> invalid value: e% +PASS Test <length> invalid value: NaN +PASS Test <length> invalid value: NaNem +PASS Test <length> invalid value: NaNex +PASS Test <length> invalid value: NaNpx +PASS Test <length> invalid value: NaNin +PASS Test <length> invalid value: NaNcm +PASS Test <length> invalid value: NaNmm +PASS Test <length> invalid value: NaNpt +PASS Test <length> invalid value: NaNpc +PASS Test <length> invalid value: NaN% +PASS Test <length> invalid value: Infinity +PASS Test <length> invalid value: Infinityem +PASS Test <length> invalid value: Infinityex +PASS Test <length> invalid value: Infinitypx +PASS Test <length> invalid value: Infinityin +PASS Test <length> invalid value: Infinitycm +PASS Test <length> invalid value: Infinitymm +PASS Test <length> invalid value: Infinitypt +PASS Test <length> invalid value: Infinitypc +PASS Test <length> invalid value: Infinity% +PASS Test <length> invalid value: -Infinity +PASS Test <length> invalid value: -Infinityem +PASS Test <length> invalid value: -Infinityex +PASS Test <length> invalid value: -Infinitypx +PASS Test <length> invalid value: -Infinityin +PASS Test <length> invalid value: -Infinitycm +PASS Test <length> invalid value: -Infinitymm +PASS Test <length> invalid value: -Infinitypt +PASS Test <length> invalid value: -Infinitypc +PASS Test <length> invalid value: -Infinity% +PASS Test <length> invalid value: fnord +PASS Test <length> invalid value: fnordem +PASS Test <length> invalid value: fnordex +PASS Test <length> invalid value: fnordpx +PASS Test <length> invalid value: fnordin +PASS Test <length> invalid value: fnordcm +PASS Test <length> invalid value: fnordmm +PASS Test <length> invalid value: fnordpt +PASS Test <length> invalid value: fnordpc +PASS Test <length> invalid value: fnord% +PASS Test <length> invalid value: E +PASS Test <length> invalid value: Eem +PASS Test <length> invalid value: Eex +PASS Test <length> invalid value: Epx +PASS Test <length> invalid value: Ein +PASS Test <length> invalid value: Ecm +PASS Test <length> invalid value: Emm +PASS Test <length> invalid value: Ept +PASS Test <length> invalid value: Epc +PASS Test <length> invalid value: E% +PASS Test <length> invalid value: e +PASS Test <length> invalid value: eem +PASS Test <length> invalid value: eex +PASS Test <length> invalid value: epx +PASS Test <length> invalid value: ein +PASS Test <length> invalid value: ecm +PASS Test <length> invalid value: emm +PASS Test <length> invalid value: ept +PASS Test <length> invalid value: epc +PASS Test <length> invalid value: e% +PASS Test <length> invalid value: NaN +PASS Test <length> invalid value: NaNem +PASS Test <length> invalid value: NaNex +PASS Test <length> invalid value: NaNpx +PASS Test <length> invalid value: NaNin +PASS Test <length> invalid value: NaNcm +PASS Test <length> invalid value: NaNmm +PASS Test <length> invalid value: NaNpt +PASS Test <length> invalid value: NaNpc +PASS Test <length> invalid value: NaN% +PASS Test <length> invalid value: Infinity +PASS Test <length> invalid value: Infinityem +PASS Test <length> invalid value: Infinityex +PASS Test <length> invalid value: Infinitypx +PASS Test <length> invalid value: Infinityin +PASS Test <length> invalid value: Infinitycm +PASS Test <length> invalid value: Infinitymm +PASS Test <length> invalid value: Infinitypt +PASS Test <length> invalid value: Infinitypc +PASS Test <length> invalid value: Infinity% +PASS Test <length> invalid value: -Infinity +PASS Test <length> invalid value: -Infinityem +PASS Test <length> invalid value: -Infinityex +PASS Test <length> invalid value: -Infinitypx +PASS Test <length> invalid value: -Infinityin +PASS Test <length> invalid value: -Infinitycm +PASS Test <length> invalid value: -Infinitymm +PASS Test <length> invalid value: -Infinitypt +PASS Test <length> invalid value: -Infinitypc +PASS Test <length> invalid value: -Infinity% +PASS Test <length> invalid value: fnord +PASS Test <length> invalid value: fnordem +PASS Test <length> invalid value: fnordex +PASS Test <length> invalid value: fnordpx +PASS Test <length> invalid value: fnordin +PASS Test <length> invalid value: fnordcm +PASS Test <length> invalid value: fnordmm +PASS Test <length> invalid value: fnordpt +PASS Test <length> invalid value: fnordpc +PASS Test <length> invalid value: fnord% +PASS Test <length> invalid value: E +PASS Test <length> invalid value: Eem +PASS Test <length> invalid value: Eex +PASS Test <length> invalid value: Epx +PASS Test <length> invalid value: Ein +PASS Test <length> invalid value: Ecm +PASS Test <length> invalid value: Emm +PASS Test <length> invalid value: Ept +PASS Test <length> invalid value: Epc +PASS Test <length> invalid value: E% +PASS Test <length> invalid value: e +PASS Test <length> invalid value: eem +PASS Test <length> invalid value: eex +PASS Test <length> invalid value: epx +PASS Test <length> invalid value: ein +PASS Test <length> invalid value: ecm +PASS Test <length> invalid value: emm +PASS Test <length> invalid value: ept +PASS Test <length> invalid value: epc +PASS Test <length> invalid value: e% +PASS Test <length> invalid value: NaN\r\n\t +PASS Test <length> invalid value: NaNem\r\n\t +PASS Test <length> invalid value: NaNex\r\n\t +PASS Test <length> invalid value: NaNpx\r\n\t +PASS Test <length> invalid value: NaNin\r\n\t +PASS Test <length> invalid value: NaNcm\r\n\t +PASS Test <length> invalid value: NaNmm\r\n\t +PASS Test <length> invalid value: NaNpt\r\n\t +PASS Test <length> invalid value: NaNpc\r\n\t +PASS Test <length> invalid value: NaN%\r\n\t +PASS Test <length> invalid value: Infinity\r\n\t +PASS Test <length> invalid value: Infinityem\r\n\t +PASS Test <length> invalid value: Infinityex\r\n\t +PASS Test <length> invalid value: Infinitypx\r\n\t +PASS Test <length> invalid value: Infinityin\r\n\t +PASS Test <length> invalid value: Infinitycm\r\n\t +PASS Test <length> invalid value: Infinitymm\r\n\t +PASS Test <length> invalid value: Infinitypt\r\n\t +PASS Test <length> invalid value: Infinitypc\r\n\t +PASS Test <length> invalid value: Infinity%\r\n\t +PASS Test <length> invalid value: -Infinity\r\n\t +PASS Test <length> invalid value: -Infinityem\r\n\t +PASS Test <length> invalid value: -Infinityex\r\n\t +PASS Test <length> invalid value: -Infinitypx\r\n\t +PASS Test <length> invalid value: -Infinityin\r\n\t +PASS Test <length> invalid value: -Infinitycm\r\n\t +PASS Test <length> invalid value: -Infinitymm\r\n\t +PASS Test <length> invalid value: -Infinitypt\r\n\t +PASS Test <length> invalid value: -Infinitypc\r\n\t +PASS Test <length> invalid value: -Infinity%\r\n\t +PASS Test <length> invalid value: fnord\r\n\t +PASS Test <length> invalid value: fnordem\r\n\t +PASS Test <length> invalid value: fnordex\r\n\t +PASS Test <length> invalid value: fnordpx\r\n\t +PASS Test <length> invalid value: fnordin\r\n\t +PASS Test <length> invalid value: fnordcm\r\n\t +PASS Test <length> invalid value: fnordmm\r\n\t +PASS Test <length> invalid value: fnordpt\r\n\t +PASS Test <length> invalid value: fnordpc\r\n\t +PASS Test <length> invalid value: fnord%\r\n\t +PASS Test <length> invalid value: E\r\n\t +PASS Test <length> invalid value: Eem\r\n\t +PASS Test <length> invalid value: Eex\r\n\t +PASS Test <length> invalid value: Epx\r\n\t +PASS Test <length> invalid value: Ein\r\n\t +PASS Test <length> invalid value: Ecm\r\n\t +PASS Test <length> invalid value: Emm\r\n\t +PASS Test <length> invalid value: Ept\r\n\t +PASS Test <length> invalid value: Epc\r\n\t +PASS Test <length> invalid value: E%\r\n\t +PASS Test <length> invalid value: e\r\n\t +PASS Test <length> invalid value: eem\r\n\t +PASS Test <length> invalid value: eex\r\n\t +PASS Test <length> invalid value: epx\r\n\t +PASS Test <length> invalid value: ein\r\n\t +PASS Test <length> invalid value: ecm\r\n\t +PASS Test <length> invalid value: emm\r\n\t +PASS Test <length> invalid value: ept\r\n\t +PASS Test <length> invalid value: epc\r\n\t +PASS Test <length> invalid value: e%\r\n\t +PASS Test <length> invalid value: NaN\f +PASS Test <length> invalid value: NaNem\f +PASS Test <length> invalid value: NaNex\f +PASS Test <length> invalid value: NaNpx\f +PASS Test <length> invalid value: NaNin\f +PASS Test <length> invalid value: NaNcm\f +PASS Test <length> invalid value: NaNmm\f +PASS Test <length> invalid value: NaNpt\f +PASS Test <length> invalid value: NaNpc\f +PASS Test <length> invalid value: NaN%\f +PASS Test <length> invalid value: Infinity\f +PASS Test <length> invalid value: Infinityem\f +PASS Test <length> invalid value: Infinityex\f +PASS Test <length> invalid value: Infinitypx\f +PASS Test <length> invalid value: Infinityin\f +PASS Test <length> invalid value: Infinitycm\f +PASS Test <length> invalid value: Infinitymm\f +PASS Test <length> invalid value: Infinitypt\f +PASS Test <length> invalid value: Infinitypc\f +PASS Test <length> invalid value: Infinity%\f +PASS Test <length> invalid value: -Infinity\f +PASS Test <length> invalid value: -Infinityem\f +PASS Test <length> invalid value: -Infinityex\f +PASS Test <length> invalid value: -Infinitypx\f +PASS Test <length> invalid value: -Infinityin\f +PASS Test <length> invalid value: -Infinitycm\f +PASS Test <length> invalid value: -Infinitymm\f +PASS Test <length> invalid value: -Infinitypt\f +PASS Test <length> invalid value: -Infinitypc\f +PASS Test <length> invalid value: -Infinity%\f +PASS Test <length> invalid value: fnord\f +PASS Test <length> invalid value: fnordem\f +PASS Test <length> invalid value: fnordex\f +PASS Test <length> invalid value: fnordpx\f +PASS Test <length> invalid value: fnordin\f +PASS Test <length> invalid value: fnordcm\f +PASS Test <length> invalid value: fnordmm\f +PASS Test <length> invalid value: fnordpt\f +PASS Test <length> invalid value: fnordpc\f +PASS Test <length> invalid value: fnord%\f +PASS Test <length> invalid value: E\f +PASS Test <length> invalid value: Eem\f +PASS Test <length> invalid value: Eex\f +PASS Test <length> invalid value: Epx\f +PASS Test <length> invalid value: Ein\f +PASS Test <length> invalid value: Ecm\f +PASS Test <length> invalid value: Emm\f +PASS Test <length> invalid value: Ept\f +PASS Test <length> invalid value: Epc\f +PASS Test <length> invalid value: E%\f +PASS Test <length> invalid value: e\f +PASS Test <length> invalid value: eem\f +PASS Test <length> invalid value: eex\f +PASS Test <length> invalid value: epx\f +PASS Test <length> invalid value: ein\f +PASS Test <length> invalid value: ecm\f +PASS Test <length> invalid value: emm\f +PASS Test <length> invalid value: ept\f +PASS Test <length> invalid value: epc\f +PASS Test <length> invalid value: e%\f +PASS Test <length> invalid value: \r\n\t NaN +PASS Test <length> invalid value: \r\n\t NaNem +PASS Test <length> invalid value: \r\n\t NaNex +PASS Test <length> invalid value: \r\n\t NaNpx +PASS Test <length> invalid value: \r\n\t NaNin +PASS Test <length> invalid value: \r\n\t NaNcm +PASS Test <length> invalid value: \r\n\t NaNmm +PASS Test <length> invalid value: \r\n\t NaNpt +PASS Test <length> invalid value: \r\n\t NaNpc +PASS Test <length> invalid value: \r\n\t NaN% +PASS Test <length> invalid value: \r\n\t Infinity +PASS Test <length> invalid value: \r\n\t Infinityem +PASS Test <length> invalid value: \r\n\t Infinityex +PASS Test <length> invalid value: \r\n\t Infinitypx +PASS Test <length> invalid value: \r\n\t Infinityin +PASS Test <length> invalid value: \r\n\t Infinitycm +PASS Test <length> invalid value: \r\n\t Infinitymm +PASS Test <length> invalid value: \r\n\t Infinitypt +PASS Test <length> invalid value: \r\n\t Infinitypc +PASS Test <length> invalid value: \r\n\t Infinity% +PASS Test <length> invalid value: \r\n\t -Infinity +PASS Test <length> invalid value: \r\n\t -Infinityem +PASS Test <length> invalid value: \r\n\t -Infinityex +PASS Test <length> invalid value: \r\n\t -Infinitypx +PASS Test <length> invalid value: \r\n\t -Infinityin +PASS Test <length> invalid value: \r\n\t -Infinitycm +PASS Test <length> invalid value: \r\n\t -Infinitymm +PASS Test <length> invalid value: \r\n\t -Infinitypt +PASS Test <length> invalid value: \r\n\t -Infinitypc +PASS Test <length> invalid value: \r\n\t -Infinity% +PASS Test <length> invalid value: \r\n\t fnord +PASS Test <length> invalid value: \r\n\t fnordem +PASS Test <length> invalid value: \r\n\t fnordex +PASS Test <length> invalid value: \r\n\t fnordpx +PASS Test <length> invalid value: \r\n\t fnordin +PASS Test <length> invalid value: \r\n\t fnordcm +PASS Test <length> invalid value: \r\n\t fnordmm +PASS Test <length> invalid value: \r\n\t fnordpt +PASS Test <length> invalid value: \r\n\t fnordpc +PASS Test <length> invalid value: \r\n\t fnord% +PASS Test <length> invalid value: \r\n\t E +PASS Test <length> invalid value: \r\n\t Eem +PASS Test <length> invalid value: \r\n\t Eex +PASS Test <length> invalid value: \r\n\t Epx +PASS Test <length> invalid value: \r\n\t Ein +PASS Test <length> invalid value: \r\n\t Ecm +PASS Test <length> invalid value: \r\n\t Emm +PASS Test <length> invalid value: \r\n\t Ept +PASS Test <length> invalid value: \r\n\t Epc +PASS Test <length> invalid value: \r\n\t E% +PASS Test <length> invalid value: \r\n\t e +PASS Test <length> invalid value: \r\n\t eem +PASS Test <length> invalid value: \r\n\t eex +PASS Test <length> invalid value: \r\n\t epx +PASS Test <length> invalid value: \r\n\t ein +PASS Test <length> invalid value: \r\n\t ecm +PASS Test <length> invalid value: \r\n\t emm +PASS Test <length> invalid value: \r\n\t ept +PASS Test <length> invalid value: \r\n\t epc +PASS Test <length> invalid value: \r\n\t e% +PASS Test <length> invalid value: \r\n\t NaN +PASS Test <length> invalid value: \r\n\t NaNem +PASS Test <length> invalid value: \r\n\t NaNex +PASS Test <length> invalid value: \r\n\t NaNpx +PASS Test <length> invalid value: \r\n\t NaNin +PASS Test <length> invalid value: \r\n\t NaNcm +PASS Test <length> invalid value: \r\n\t NaNmm +PASS Test <length> invalid value: \r\n\t NaNpt +PASS Test <length> invalid value: \r\n\t NaNpc +PASS Test <length> invalid value: \r\n\t NaN% +PASS Test <length> invalid value: \r\n\t Infinity +PASS Test <length> invalid value: \r\n\t Infinityem +PASS Test <length> invalid value: \r\n\t Infinityex +PASS Test <length> invalid value: \r\n\t Infinitypx +PASS Test <length> invalid value: \r\n\t Infinityin +PASS Test <length> invalid value: \r\n\t Infinitycm +PASS Test <length> invalid value: \r\n\t Infinitymm +PASS Test <length> invalid value: \r\n\t Infinitypt +PASS Test <length> invalid value: \r\n\t Infinitypc +PASS Test <length> invalid value: \r\n\t Infinity% +PASS Test <length> invalid value: \r\n\t -Infinity +PASS Test <length> invalid value: \r\n\t -Infinityem +PASS Test <length> invalid value: \r\n\t -Infinityex +PASS Test <length> invalid value: \r\n\t -Infinitypx +PASS Test <length> invalid value: \r\n\t -Infinityin +PASS Test <length> invalid value: \r\n\t -Infinitycm +PASS Test <length> invalid value: \r\n\t -Infinitymm +PASS Test <length> invalid value: \r\n\t -Infinitypt +PASS Test <length> invalid value: \r\n\t -Infinitypc +PASS Test <length> invalid value: \r\n\t -Infinity% +PASS Test <length> invalid value: \r\n\t fnord +PASS Test <length> invalid value: \r\n\t fnordem +PASS Test <length> invalid value: \r\n\t fnordex +PASS Test <length> invalid value: \r\n\t fnordpx +PASS Test <length> invalid value: \r\n\t fnordin +PASS Test <length> invalid value: \r\n\t fnordcm +PASS Test <length> invalid value: \r\n\t fnordmm +PASS Test <length> invalid value: \r\n\t fnordpt +PASS Test <length> invalid value: \r\n\t fnordpc +PASS Test <length> invalid value: \r\n\t fnord% +PASS Test <length> invalid value: \r\n\t E +PASS Test <length> invalid value: \r\n\t Eem +PASS Test <length> invalid value: \r\n\t Eex +PASS Test <length> invalid value: \r\n\t Epx +PASS Test <length> invalid value: \r\n\t Ein +PASS Test <length> invalid value: \r\n\t Ecm +PASS Test <length> invalid value: \r\n\t Emm +PASS Test <length> invalid value: \r\n\t Ept +PASS Test <length> invalid value: \r\n\t Epc +PASS Test <length> invalid value: \r\n\t E% +PASS Test <length> invalid value: \r\n\t e +PASS Test <length> invalid value: \r\n\t eem +PASS Test <length> invalid value: \r\n\t eex +PASS Test <length> invalid value: \r\n\t epx +PASS Test <length> invalid value: \r\n\t ein +PASS Test <length> invalid value: \r\n\t ecm +PASS Test <length> invalid value: \r\n\t emm +PASS Test <length> invalid value: \r\n\t ept +PASS Test <length> invalid value: \r\n\t epc +PASS Test <length> invalid value: \r\n\t e% +PASS Test <length> invalid value: \r\n\t NaN +PASS Test <length> invalid value: \r\n\t NaNem +PASS Test <length> invalid value: \r\n\t NaNex +PASS Test <length> invalid value: \r\n\t NaNpx +PASS Test <length> invalid value: \r\n\t NaNin +PASS Test <length> invalid value: \r\n\t NaNcm +PASS Test <length> invalid value: \r\n\t NaNmm +PASS Test <length> invalid value: \r\n\t NaNpt +PASS Test <length> invalid value: \r\n\t NaNpc +PASS Test <length> invalid value: \r\n\t NaN% +PASS Test <length> invalid value: \r\n\t Infinity +PASS Test <length> invalid value: \r\n\t Infinityem +PASS Test <length> invalid value: \r\n\t Infinityex +PASS Test <length> invalid value: \r\n\t Infinitypx +PASS Test <length> invalid value: \r\n\t Infinityin +PASS Test <length> invalid value: \r\n\t Infinitycm +PASS Test <length> invalid value: \r\n\t Infinitymm +PASS Test <length> invalid value: \r\n\t Infinitypt +PASS Test <length> invalid value: \r\n\t Infinitypc +PASS Test <length> invalid value: \r\n\t Infinity% +PASS Test <length> invalid value: \r\n\t -Infinity +PASS Test <length> invalid value: \r\n\t -Infinityem +PASS Test <length> invalid value: \r\n\t -Infinityex +PASS Test <length> invalid value: \r\n\t -Infinitypx +PASS Test <length> invalid value: \r\n\t -Infinityin +PASS Test <length> invalid value: \r\n\t -Infinitycm +PASS Test <length> invalid value: \r\n\t -Infinitymm +PASS Test <length> invalid value: \r\n\t -Infinitypt +PASS Test <length> invalid value: \r\n\t -Infinitypc +PASS Test <length> invalid value: \r\n\t -Infinity% +PASS Test <length> invalid value: \r\n\t fnord +PASS Test <length> invalid value: \r\n\t fnordem +PASS Test <length> invalid value: \r\n\t fnordex +PASS Test <length> invalid value: \r\n\t fnordpx +PASS Test <length> invalid value: \r\n\t fnordin +PASS Test <length> invalid value: \r\n\t fnordcm +PASS Test <length> invalid value: \r\n\t fnordmm +PASS Test <length> invalid value: \r\n\t fnordpt +PASS Test <length> invalid value: \r\n\t fnordpc +PASS Test <length> invalid value: \r\n\t fnord% +PASS Test <length> invalid value: \r\n\t E +PASS Test <length> invalid value: \r\n\t Eem +PASS Test <length> invalid value: \r\n\t Eex +PASS Test <length> invalid value: \r\n\t Epx +PASS Test <length> invalid value: \r\n\t Ein +PASS Test <length> invalid value: \r\n\t Ecm +PASS Test <length> invalid value: \r\n\t Emm +PASS Test <length> invalid value: \r\n\t Ept +PASS Test <length> invalid value: \r\n\t Epc +PASS Test <length> invalid value: \r\n\t E% +PASS Test <length> invalid value: \r\n\t e +PASS Test <length> invalid value: \r\n\t eem +PASS Test <length> invalid value: \r\n\t eex +PASS Test <length> invalid value: \r\n\t epx +PASS Test <length> invalid value: \r\n\t ein +PASS Test <length> invalid value: \r\n\t ecm +PASS Test <length> invalid value: \r\n\t emm +PASS Test <length> invalid value: \r\n\t ept +PASS Test <length> invalid value: \r\n\t epc +PASS Test <length> invalid value: \r\n\t e% +PASS Test <length> invalid value: \r\n\t NaN\r\n\t +PASS Test <length> invalid value: \r\n\t NaNem\r\n\t +PASS Test <length> invalid value: \r\n\t NaNex\r\n\t +PASS Test <length> invalid value: \r\n\t NaNpx\r\n\t +PASS Test <length> invalid value: \r\n\t NaNin\r\n\t +PASS Test <length> invalid value: \r\n\t NaNcm\r\n\t +PASS Test <length> invalid value: \r\n\t NaNmm\r\n\t +PASS Test <length> invalid value: \r\n\t NaNpt\r\n\t +PASS Test <length> invalid value: \r\n\t NaNpc\r\n\t +PASS Test <length> invalid value: \r\n\t NaN%\r\n\t +PASS Test <length> invalid value: \r\n\t Infinity\r\n\t +PASS Test <length> invalid value: \r\n\t Infinityem\r\n\t +PASS Test <length> invalid value: \r\n\t Infinityex\r\n\t +PASS Test <length> invalid value: \r\n\t Infinitypx\r\n\t +PASS Test <length> invalid value: \r\n\t Infinityin\r\n\t +PASS Test <length> invalid value: \r\n\t Infinitycm\r\n\t +PASS Test <length> invalid value: \r\n\t Infinitymm\r\n\t +PASS Test <length> invalid value: \r\n\t Infinitypt\r\n\t +PASS Test <length> invalid value: \r\n\t Infinitypc\r\n\t +PASS Test <length> invalid value: \r\n\t Infinity%\r\n\t +PASS Test <length> invalid value: \r\n\t -Infinity\r\n\t +PASS Test <length> invalid value: \r\n\t -Infinityem\r\n\t +PASS Test <length> invalid value: \r\n\t -Infinityex\r\n\t +PASS Test <length> invalid value: \r\n\t -Infinitypx\r\n\t +PASS Test <length> invalid value: \r\n\t -Infinityin\r\n\t +PASS Test <length> invalid value: \r\n\t -Infinitycm\r\n\t +PASS Test <length> invalid value: \r\n\t -Infinitymm\r\n\t +PASS Test <length> invalid value: \r\n\t -Infinitypt\r\n\t +PASS Test <length> invalid value: \r\n\t -Infinitypc\r\n\t +PASS Test <length> invalid value: \r\n\t -Infinity%\r\n\t +PASS Test <length> invalid value: \r\n\t fnord\r\n\t +PASS Test <length> invalid value: \r\n\t fnordem\r\n\t +PASS Test <length> invalid value: \r\n\t fnordex\r\n\t +PASS Test <length> invalid value: \r\n\t fnordpx\r\n\t +PASS Test <length> invalid value: \r\n\t fnordin\r\n\t +PASS Test <length> invalid value: \r\n\t fnordcm\r\n\t +PASS Test <length> invalid value: \r\n\t fnordmm\r\n\t +PASS Test <length> invalid value: \r\n\t fnordpt\r\n\t +PASS Test <length> invalid value: \r\n\t fnordpc\r\n\t +PASS Test <length> invalid value: \r\n\t fnord%\r\n\t +PASS Test <length> invalid value: \r\n\t E\r\n\t +PASS Test <length> invalid value: \r\n\t Eem\r\n\t +PASS Test <length> invalid value: \r\n\t Eex\r\n\t +PASS Test <length> invalid value: \r\n\t Epx\r\n\t +PASS Test <length> invalid value: \r\n\t Ein\r\n\t +PASS Test <length> invalid value: \r\n\t Ecm\r\n\t +PASS Test <length> invalid value: \r\n\t Emm\r\n\t +PASS Test <length> invalid value: \r\n\t Ept\r\n\t +PASS Test <length> invalid value: \r\n\t Epc\r\n\t +PASS Test <length> invalid value: \r\n\t E%\r\n\t +PASS Test <length> invalid value: \r\n\t e\r\n\t +PASS Test <length> invalid value: \r\n\t eem\r\n\t +PASS Test <length> invalid value: \r\n\t eex\r\n\t +PASS Test <length> invalid value: \r\n\t epx\r\n\t +PASS Test <length> invalid value: \r\n\t ein\r\n\t +PASS Test <length> invalid value: \r\n\t ecm\r\n\t +PASS Test <length> invalid value: \r\n\t emm\r\n\t +PASS Test <length> invalid value: \r\n\t ept\r\n\t +PASS Test <length> invalid value: \r\n\t epc\r\n\t +PASS Test <length> invalid value: \r\n\t e%\r\n\t +PASS Test <length> invalid value: \r\n\t NaN\f +PASS Test <length> invalid value: \r\n\t NaNem\f +PASS Test <length> invalid value: \r\n\t NaNex\f +PASS Test <length> invalid value: \r\n\t NaNpx\f +PASS Test <length> invalid value: \r\n\t NaNin\f +PASS Test <length> invalid value: \r\n\t NaNcm\f +PASS Test <length> invalid value: \r\n\t NaNmm\f +PASS Test <length> invalid value: \r\n\t NaNpt\f +PASS Test <length> invalid value: \r\n\t NaNpc\f +PASS Test <length> invalid value: \r\n\t NaN%\f +PASS Test <length> invalid value: \r\n\t Infinity\f +PASS Test <length> invalid value: \r\n\t Infinityem\f +PASS Test <length> invalid value: \r\n\t Infinityex\f +PASS Test <length> invalid value: \r\n\t Infinitypx\f +PASS Test <length> invalid value: \r\n\t Infinityin\f +PASS Test <length> invalid value: \r\n\t Infinitycm\f +PASS Test <length> invalid value: \r\n\t Infinitymm\f +PASS Test <length> invalid value: \r\n\t Infinitypt\f +PASS Test <length> invalid value: \r\n\t Infinitypc\f +PASS Test <length> invalid value: \r\n\t Infinity%\f +PASS Test <length> invalid value: \r\n\t -Infinity\f +PASS Test <length> invalid value: \r\n\t -Infinityem\f +PASS Test <length> invalid value: \r\n\t -Infinityex\f +PASS Test <length> invalid value: \r\n\t -Infinitypx\f +PASS Test <length> invalid value: \r\n\t -Infinityin\f +PASS Test <length> invalid value: \r\n\t -Infinitycm\f +PASS Test <length> invalid value: \r\n\t -Infinitymm\f +PASS Test <length> invalid value: \r\n\t -Infinitypt\f +PASS Test <length> invalid value: \r\n\t -Infinitypc\f +PASS Test <length> invalid value: \r\n\t -Infinity%\f +PASS Test <length> invalid value: \r\n\t fnord\f +PASS Test <length> invalid value: \r\n\t fnordem\f +PASS Test <length> invalid value: \r\n\t fnordex\f +PASS Test <length> invalid value: \r\n\t fnordpx\f +PASS Test <length> invalid value: \r\n\t fnordin\f +PASS Test <length> invalid value: \r\n\t fnordcm\f +PASS Test <length> invalid value: \r\n\t fnordmm\f +PASS Test <length> invalid value: \r\n\t fnordpt\f +PASS Test <length> invalid value: \r\n\t fnordpc\f +PASS Test <length> invalid value: \r\n\t fnord%\f +PASS Test <length> invalid value: \r\n\t E\f +PASS Test <length> invalid value: \r\n\t Eem\f +PASS Test <length> invalid value: \r\n\t Eex\f +PASS Test <length> invalid value: \r\n\t Epx\f +PASS Test <length> invalid value: \r\n\t Ein\f +PASS Test <length> invalid value: \r\n\t Ecm\f +PASS Test <length> invalid value: \r\n\t Emm\f +PASS Test <length> invalid value: \r\n\t Ept\f +PASS Test <length> invalid value: \r\n\t Epc\f +PASS Test <length> invalid value: \r\n\t E%\f +PASS Test <length> invalid value: \r\n\t e\f +PASS Test <length> invalid value: \r\n\t eem\f +PASS Test <length> invalid value: \r\n\t eex\f +PASS Test <length> invalid value: \r\n\t epx\f +PASS Test <length> invalid value: \r\n\t ein\f +PASS Test <length> invalid value: \r\n\t ecm\f +PASS Test <length> invalid value: \r\n\t emm\f +PASS Test <length> invalid value: \r\n\t ept\f +PASS Test <length> invalid value: \r\n\t epc\f +PASS Test <length> invalid value: \r\n\t e%\f +PASS Test <length> invalid value: \fNaN +PASS Test <length> invalid value: \fNaNem +PASS Test <length> invalid value: \fNaNex +PASS Test <length> invalid value: \fNaNpx +PASS Test <length> invalid value: \fNaNin +PASS Test <length> invalid value: \fNaNcm +PASS Test <length> invalid value: \fNaNmm +PASS Test <length> invalid value: \fNaNpt +PASS Test <length> invalid value: \fNaNpc +PASS Test <length> invalid value: \fNaN% +PASS Test <length> invalid value: \fInfinity +PASS Test <length> invalid value: \fInfinityem +PASS Test <length> invalid value: \fInfinityex +PASS Test <length> invalid value: \fInfinitypx +PASS Test <length> invalid value: \fInfinityin +PASS Test <length> invalid value: \fInfinitycm +PASS Test <length> invalid value: \fInfinitymm +PASS Test <length> invalid value: \fInfinitypt +PASS Test <length> invalid value: \fInfinitypc +PASS Test <length> invalid value: \fInfinity% +PASS Test <length> invalid value: \f-Infinity +PASS Test <length> invalid value: \f-Infinityem +PASS Test <length> invalid value: \f-Infinityex +PASS Test <length> invalid value: \f-Infinitypx +PASS Test <length> invalid value: \f-Infinityin +PASS Test <length> invalid value: \f-Infinitycm +PASS Test <length> invalid value: \f-Infinitymm +PASS Test <length> invalid value: \f-Infinitypt +PASS Test <length> invalid value: \f-Infinitypc +PASS Test <length> invalid value: \f-Infinity% +PASS Test <length> invalid value: \ffnord +PASS Test <length> invalid value: \ffnordem +PASS Test <length> invalid value: \ffnordex +PASS Test <length> invalid value: \ffnordpx +PASS Test <length> invalid value: \ffnordin +PASS Test <length> invalid value: \ffnordcm +PASS Test <length> invalid value: \ffnordmm +PASS Test <length> invalid value: \ffnordpt +PASS Test <length> invalid value: \ffnordpc +PASS Test <length> invalid value: \ffnord% +PASS Test <length> invalid value: \fE +PASS Test <length> invalid value: \fEem +PASS Test <length> invalid value: \fEex +PASS Test <length> invalid value: \fEpx +PASS Test <length> invalid value: \fEin +PASS Test <length> invalid value: \fEcm +PASS Test <length> invalid value: \fEmm +PASS Test <length> invalid value: \fEpt +PASS Test <length> invalid value: \fEpc +PASS Test <length> invalid value: \fE% +PASS Test <length> invalid value: \fe +PASS Test <length> invalid value: \feem +PASS Test <length> invalid value: \feex +PASS Test <length> invalid value: \fepx +PASS Test <length> invalid value: \fein +PASS Test <length> invalid value: \fecm +PASS Test <length> invalid value: \femm +PASS Test <length> invalid value: \fept +PASS Test <length> invalid value: \fepc +PASS Test <length> invalid value: \fe% +PASS Test <length> invalid value: \fNaN +PASS Test <length> invalid value: \fNaNem +PASS Test <length> invalid value: \fNaNex +PASS Test <length> invalid value: \fNaNpx +PASS Test <length> invalid value: \fNaNin +PASS Test <length> invalid value: \fNaNcm +PASS Test <length> invalid value: \fNaNmm +PASS Test <length> invalid value: \fNaNpt +PASS Test <length> invalid value: \fNaNpc +PASS Test <length> invalid value: \fNaN% +PASS Test <length> invalid value: \fInfinity +PASS Test <length> invalid value: \fInfinityem +PASS Test <length> invalid value: \fInfinityex +PASS Test <length> invalid value: \fInfinitypx +PASS Test <length> invalid value: \fInfinityin +PASS Test <length> invalid value: \fInfinitycm +PASS Test <length> invalid value: \fInfinitymm +PASS Test <length> invalid value: \fInfinitypt +PASS Test <length> invalid value: \fInfinitypc +PASS Test <length> invalid value: \fInfinity% +PASS Test <length> invalid value: \f-Infinity +PASS Test <length> invalid value: \f-Infinityem +PASS Test <length> invalid value: \f-Infinityex +PASS Test <length> invalid value: \f-Infinitypx +PASS Test <length> invalid value: \f-Infinityin +PASS Test <length> invalid value: \f-Infinitycm +PASS Test <length> invalid value: \f-Infinitymm +PASS Test <length> invalid value: \f-Infinitypt +PASS Test <length> invalid value: \f-Infinitypc +PASS Test <length> invalid value: \f-Infinity% +PASS Test <length> invalid value: \ffnord +PASS Test <length> invalid value: \ffnordem +PASS Test <length> invalid value: \ffnordex +PASS Test <length> invalid value: \ffnordpx +PASS Test <length> invalid value: \ffnordin +PASS Test <length> invalid value: \ffnordcm +PASS Test <length> invalid value: \ffnordmm +PASS Test <length> invalid value: \ffnordpt +PASS Test <length> invalid value: \ffnordpc +PASS Test <length> invalid value: \ffnord% +PASS Test <length> invalid value: \fE +PASS Test <length> invalid value: \fEem +PASS Test <length> invalid value: \fEex +PASS Test <length> invalid value: \fEpx +PASS Test <length> invalid value: \fEin +PASS Test <length> invalid value: \fEcm +PASS Test <length> invalid value: \fEmm +PASS Test <length> invalid value: \fEpt +PASS Test <length> invalid value: \fEpc +PASS Test <length> invalid value: \fE% +PASS Test <length> invalid value: \fe +PASS Test <length> invalid value: \feem +PASS Test <length> invalid value: \feex +PASS Test <length> invalid value: \fepx +PASS Test <length> invalid value: \fein +PASS Test <length> invalid value: \fecm +PASS Test <length> invalid value: \femm +PASS Test <length> invalid value: \fept +PASS Test <length> invalid value: \fepc +PASS Test <length> invalid value: \fe% +PASS Test <length> invalid value: \fNaN +PASS Test <length> invalid value: \fNaNem +PASS Test <length> invalid value: \fNaNex +PASS Test <length> invalid value: \fNaNpx +PASS Test <length> invalid value: \fNaNin +PASS Test <length> invalid value: \fNaNcm +PASS Test <length> invalid value: \fNaNmm +PASS Test <length> invalid value: \fNaNpt +PASS Test <length> invalid value: \fNaNpc +PASS Test <length> invalid value: \fNaN% +PASS Test <length> invalid value: \fInfinity +PASS Test <length> invalid value: \fInfinityem +PASS Test <length> invalid value: \fInfinityex +PASS Test <length> invalid value: \fInfinitypx +PASS Test <length> invalid value: \fInfinityin +PASS Test <length> invalid value: \fInfinitycm +PASS Test <length> invalid value: \fInfinitymm +PASS Test <length> invalid value: \fInfinitypt +PASS Test <length> invalid value: \fInfinitypc +PASS Test <length> invalid value: \fInfinity% +PASS Test <length> invalid value: \f-Infinity +PASS Test <length> invalid value: \f-Infinityem +PASS Test <length> invalid value: \f-Infinityex +PASS Test <length> invalid value: \f-Infinitypx +PASS Test <length> invalid value: \f-Infinityin +PASS Test <length> invalid value: \f-Infinitycm +PASS Test <length> invalid value: \f-Infinitymm +PASS Test <length> invalid value: \f-Infinitypt +PASS Test <length> invalid value: \f-Infinitypc +PASS Test <length> invalid value: \f-Infinity% +PASS Test <length> invalid value: \ffnord +PASS Test <length> invalid value: \ffnordem +PASS Test <length> invalid value: \ffnordex +PASS Test <length> invalid value: \ffnordpx +PASS Test <length> invalid value: \ffnordin +PASS Test <length> invalid value: \ffnordcm +PASS Test <length> invalid value: \ffnordmm +PASS Test <length> invalid value: \ffnordpt +PASS Test <length> invalid value: \ffnordpc +PASS Test <length> invalid value: \ffnord% +PASS Test <length> invalid value: \fE +PASS Test <length> invalid value: \fEem +PASS Test <length> invalid value: \fEex +PASS Test <length> invalid value: \fEpx +PASS Test <length> invalid value: \fEin +PASS Test <length> invalid value: \fEcm +PASS Test <length> invalid value: \fEmm +PASS Test <length> invalid value: \fEpt +PASS Test <length> invalid value: \fEpc +PASS Test <length> invalid value: \fE% +PASS Test <length> invalid value: \fe +PASS Test <length> invalid value: \feem +PASS Test <length> invalid value: \feex +PASS Test <length> invalid value: \fepx +PASS Test <length> invalid value: \fein +PASS Test <length> invalid value: \fecm +PASS Test <length> invalid value: \femm +PASS Test <length> invalid value: \fept +PASS Test <length> invalid value: \fepc +PASS Test <length> invalid value: \fe% +PASS Test <length> invalid value: \fNaN\r\n\t +PASS Test <length> invalid value: \fNaNem\r\n\t +PASS Test <length> invalid value: \fNaNex\r\n\t +PASS Test <length> invalid value: \fNaNpx\r\n\t +PASS Test <length> invalid value: \fNaNin\r\n\t +PASS Test <length> invalid value: \fNaNcm\r\n\t +PASS Test <length> invalid value: \fNaNmm\r\n\t +PASS Test <length> invalid value: \fNaNpt\r\n\t +PASS Test <length> invalid value: \fNaNpc\r\n\t +PASS Test <length> invalid value: \fNaN%\r\n\t +PASS Test <length> invalid value: \fInfinity\r\n\t +PASS Test <length> invalid value: \fInfinityem\r\n\t +PASS Test <length> invalid value: \fInfinityex\r\n\t +PASS Test <length> invalid value: \fInfinitypx\r\n\t +PASS Test <length> invalid value: \fInfinityin\r\n\t +PASS Test <length> invalid value: \fInfinitycm\r\n\t +PASS Test <length> invalid value: \fInfinitymm\r\n\t +PASS Test <length> invalid value: \fInfinitypt\r\n\t +PASS Test <length> invalid value: \fInfinitypc\r\n\t +PASS Test <length> invalid value: \fInfinity%\r\n\t +PASS Test <length> invalid value: \f-Infinity\r\n\t +PASS Test <length> invalid value: \f-Infinityem\r\n\t +PASS Test <length> invalid value: \f-Infinityex\r\n\t +PASS Test <length> invalid value: \f-Infinitypx\r\n\t +PASS Test <length> invalid value: \f-Infinityin\r\n\t +PASS Test <length> invalid value: \f-Infinitycm\r\n\t +PASS Test <length> invalid value: \f-Infinitymm\r\n\t +PASS Test <length> invalid value: \f-Infinitypt\r\n\t +PASS Test <length> invalid value: \f-Infinitypc\r\n\t +PASS Test <length> invalid value: \f-Infinity%\r\n\t +PASS Test <length> invalid value: \ffnord\r\n\t +PASS Test <length> invalid value: \ffnordem\r\n\t +PASS Test <length> invalid value: \ffnordex\r\n\t +PASS Test <length> invalid value: \ffnordpx\r\n\t +PASS Test <length> invalid value: \ffnordin\r\n\t +PASS Test <length> invalid value: \ffnordcm\r\n\t +PASS Test <length> invalid value: \ffnordmm\r\n\t +PASS Test <length> invalid value: \ffnordpt\r\n\t +PASS Test <length> invalid value: \ffnordpc\r\n\t +PASS Test <length> invalid value: \ffnord%\r\n\t +PASS Test <length> invalid value: \fE\r\n\t +PASS Test <length> invalid value: \fEem\r\n\t +PASS Test <length> invalid value: \fEex\r\n\t +PASS Test <length> invalid value: \fEpx\r\n\t +PASS Test <length> invalid value: \fEin\r\n\t +PASS Test <length> invalid value: \fEcm\r\n\t +PASS Test <length> invalid value: \fEmm\r\n\t +PASS Test <length> invalid value: \fEpt\r\n\t +PASS Test <length> invalid value: \fEpc\r\n\t +PASS Test <length> invalid value: \fE%\r\n\t +PASS Test <length> invalid value: \fe\r\n\t +PASS Test <length> invalid value: \feem\r\n\t +PASS Test <length> invalid value: \feex\r\n\t +PASS Test <length> invalid value: \fepx\r\n\t +PASS Test <length> invalid value: \fein\r\n\t +PASS Test <length> invalid value: \fecm\r\n\t +PASS Test <length> invalid value: \femm\r\n\t +PASS Test <length> invalid value: \fept\r\n\t +PASS Test <length> invalid value: \fepc\r\n\t +PASS Test <length> invalid value: \fe%\r\n\t +PASS Test <length> invalid value: \fNaN\f +PASS Test <length> invalid value: \fNaNem\f +PASS Test <length> invalid value: \fNaNex\f +PASS Test <length> invalid value: \fNaNpx\f +PASS Test <length> invalid value: \fNaNin\f +PASS Test <length> invalid value: \fNaNcm\f +PASS Test <length> invalid value: \fNaNmm\f +PASS Test <length> invalid value: \fNaNpt\f +PASS Test <length> invalid value: \fNaNpc\f +PASS Test <length> invalid value: \fNaN%\f +PASS Test <length> invalid value: \fInfinity\f +PASS Test <length> invalid value: \fInfinityem\f +PASS Test <length> invalid value: \fInfinityex\f +PASS Test <length> invalid value: \fInfinitypx\f +PASS Test <length> invalid value: \fInfinityin\f +PASS Test <length> invalid value: \fInfinitycm\f +PASS Test <length> invalid value: \fInfinitymm\f +PASS Test <length> invalid value: \fInfinitypt\f +PASS Test <length> invalid value: \fInfinitypc\f +PASS Test <length> invalid value: \fInfinity%\f +PASS Test <length> invalid value: \f-Infinity\f +PASS Test <length> invalid value: \f-Infinityem\f +PASS Test <length> invalid value: \f-Infinityex\f +PASS Test <length> invalid value: \f-Infinitypx\f +PASS Test <length> invalid value: \f-Infinityin\f +PASS Test <length> invalid value: \f-Infinitycm\f +PASS Test <length> invalid value: \f-Infinitymm\f +PASS Test <length> invalid value: \f-Infinitypt\f +PASS Test <length> invalid value: \f-Infinitypc\f +PASS Test <length> invalid value: \f-Infinity%\f +PASS Test <length> invalid value: \ffnord\f +PASS Test <length> invalid value: \ffnordem\f +PASS Test <length> invalid value: \ffnordex\f +PASS Test <length> invalid value: \ffnordpx\f +PASS Test <length> invalid value: \ffnordin\f +PASS Test <length> invalid value: \ffnordcm\f +PASS Test <length> invalid value: \ffnordmm\f +PASS Test <length> invalid value: \ffnordpt\f +PASS Test <length> invalid value: \ffnordpc\f +PASS Test <length> invalid value: \ffnord%\f +PASS Test <length> invalid value: \fE\f +PASS Test <length> invalid value: \fEem\f +PASS Test <length> invalid value: \fEex\f +PASS Test <length> invalid value: \fEpx\f +PASS Test <length> invalid value: \fEin\f +PASS Test <length> invalid value: \fEcm\f +PASS Test <length> invalid value: \fEmm\f +PASS Test <length> invalid value: \fEpt\f +PASS Test <length> invalid value: \fEpc\f +PASS Test <length> invalid value: \fE%\f +PASS Test <length> invalid value: \fe\f +PASS Test <length> invalid value: \feem\f +PASS Test <length> invalid value: \feex\f +PASS Test <length> invalid value: \fepx\f +PASS Test <length> invalid value: \fein\f +PASS Test <length> invalid value: \fecm\f +PASS Test <length> invalid value: \femm\f +PASS Test <length> invalid value: \fept\f +PASS Test <length> invalid value: \fepc\f +PASS Test <length> invalid value: \fe%\f +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/parser/whitespace-length-invalid-2-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/parser/whitespace-length-invalid-2-expected.txt new file mode 100644 index 0000000..04011ca --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/parser/whitespace-length-invalid-2-expected.txt
@@ -0,0 +1,5003 @@ +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-." +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="." +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+." +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+ " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+ " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=". " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+ " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+ " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=". " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -." +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ." +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +." +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" - " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" + " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" . " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" - " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" + " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" . " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -." +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ." +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +." +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" - " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" + " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" . " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" - " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" + " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" . " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -." +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ." +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +." +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+ " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t - " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t + " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t . " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+ " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t - " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t + " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t . " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-." +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f." +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+." +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1em" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1ex" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1px" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1in" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1cm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1mm" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pt" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pc" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1%" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+ " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+ " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+ " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+ " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.- " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+. " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1 " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1em " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1ex " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1px " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1in " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1cm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1mm " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pt " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pc " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1% " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1em\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1ex\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1px\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1in\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1cm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1mm\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pt\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pc\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1%\r\n\t " +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0%\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1em\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1ex\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1px\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1in\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1cm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1mm\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pt\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pc\f" +CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1%\f" +This is a testharness.js-based test. +PASS Test <length> invalid value: e+ +PASS Test <length> invalid value: e+em +PASS Test <length> invalid value: e+ex +PASS Test <length> invalid value: e+px +PASS Test <length> invalid value: e+in +PASS Test <length> invalid value: e+cm +PASS Test <length> invalid value: e+mm +PASS Test <length> invalid value: e+pt +PASS Test <length> invalid value: e+pc +PASS Test <length> invalid value: e+% +PASS Test <length> invalid value: E- +PASS Test <length> invalid value: E-em +PASS Test <length> invalid value: E-ex +PASS Test <length> invalid value: E-px +PASS Test <length> invalid value: E-in +PASS Test <length> invalid value: E-cm +PASS Test <length> invalid value: E-mm +PASS Test <length> invalid value: E-pt +PASS Test <length> invalid value: E-pc +PASS Test <length> invalid value: E-% +PASS Test <length> invalid value: - +PASS Test <length> invalid value: -em +PASS Test <length> invalid value: -ex +PASS Test <length> invalid value: -px +PASS Test <length> invalid value: -in +PASS Test <length> invalid value: -cm +PASS Test <length> invalid value: -mm +PASS Test <length> invalid value: -pt +PASS Test <length> invalid value: -pc +PASS Test <length> invalid value: -% +PASS Test <length> invalid value: + +PASS Test <length> invalid value: +em +PASS Test <length> invalid value: +ex +PASS Test <length> invalid value: +px +PASS Test <length> invalid value: +in +PASS Test <length> invalid value: +cm +PASS Test <length> invalid value: +mm +PASS Test <length> invalid value: +pt +PASS Test <length> invalid value: +pc +PASS Test <length> invalid value: +% +PASS Test <length> invalid value: -. +PASS Test <length> invalid value: -.em +PASS Test <length> invalid value: -.ex +PASS Test <length> invalid value: -.px +PASS Test <length> invalid value: -.in +PASS Test <length> invalid value: -.cm +PASS Test <length> invalid value: -.mm +PASS Test <length> invalid value: -.pt +PASS Test <length> invalid value: -.pc +PASS Test <length> invalid value: -.% +PASS Test <length> invalid value: .- +PASS Test <length> invalid value: .-em +PASS Test <length> invalid value: .-ex +PASS Test <length> invalid value: .-px +PASS Test <length> invalid value: .-in +PASS Test <length> invalid value: .-cm +PASS Test <length> invalid value: .-mm +PASS Test <length> invalid value: .-pt +PASS Test <length> invalid value: .-pc +PASS Test <length> invalid value: .-% +PASS Test <length> invalid value: . +PASS Test <length> invalid value: .em +PASS Test <length> invalid value: .ex +PASS Test <length> invalid value: .px +PASS Test <length> invalid value: .in +PASS Test <length> invalid value: .cm +PASS Test <length> invalid value: .mm +PASS Test <length> invalid value: .pt +PASS Test <length> invalid value: .pc +PASS Test <length> invalid value: .% +PASS Test <length> invalid value: +. +PASS Test <length> invalid value: +.em +PASS Test <length> invalid value: +.ex +PASS Test <length> invalid value: +.px +PASS Test <length> invalid value: +.in +PASS Test <length> invalid value: +.cm +PASS Test <length> invalid value: +.mm +PASS Test <length> invalid value: +.pt +PASS Test <length> invalid value: +.pc +PASS Test <length> invalid value: +.% +PASS Test <length> invalid value: .E0 +PASS Test <length> invalid value: .E0em +PASS Test <length> invalid value: .E0ex +PASS Test <length> invalid value: .E0px +PASS Test <length> invalid value: .E0in +PASS Test <length> invalid value: .E0cm +PASS Test <length> invalid value: .E0mm +PASS Test <length> invalid value: .E0pt +PASS Test <length> invalid value: .E0pc +PASS Test <length> invalid value: .E0% +PASS Test <length> invalid value: e1 +PASS Test <length> invalid value: e1em +PASS Test <length> invalid value: e1ex +PASS Test <length> invalid value: e1px +PASS Test <length> invalid value: e1in +PASS Test <length> invalid value: e1cm +PASS Test <length> invalid value: e1mm +PASS Test <length> invalid value: e1pt +PASS Test <length> invalid value: e1pc +PASS Test <length> invalid value: e1% +PASS Test <length> invalid value: e+ +PASS Test <length> invalid value: e+em +PASS Test <length> invalid value: e+ex +PASS Test <length> invalid value: e+px +PASS Test <length> invalid value: e+in +PASS Test <length> invalid value: e+cm +PASS Test <length> invalid value: e+mm +PASS Test <length> invalid value: e+pt +PASS Test <length> invalid value: e+pc +PASS Test <length> invalid value: e+% +PASS Test <length> invalid value: E- +PASS Test <length> invalid value: E-em +PASS Test <length> invalid value: E-ex +PASS Test <length> invalid value: E-px +PASS Test <length> invalid value: E-in +PASS Test <length> invalid value: E-cm +PASS Test <length> invalid value: E-mm +PASS Test <length> invalid value: E-pt +PASS Test <length> invalid value: E-pc +PASS Test <length> invalid value: E-% +PASS Test <length> invalid value: - +PASS Test <length> invalid value: -em +PASS Test <length> invalid value: -ex +PASS Test <length> invalid value: -px +PASS Test <length> invalid value: -in +PASS Test <length> invalid value: -cm +PASS Test <length> invalid value: -mm +PASS Test <length> invalid value: -pt +PASS Test <length> invalid value: -pc +PASS Test <length> invalid value: -% +PASS Test <length> invalid value: + +PASS Test <length> invalid value: +em +PASS Test <length> invalid value: +ex +PASS Test <length> invalid value: +px +PASS Test <length> invalid value: +in +PASS Test <length> invalid value: +cm +PASS Test <length> invalid value: +mm +PASS Test <length> invalid value: +pt +PASS Test <length> invalid value: +pc +PASS Test <length> invalid value: +% +PASS Test <length> invalid value: -. +PASS Test <length> invalid value: -.em +PASS Test <length> invalid value: -.ex +PASS Test <length> invalid value: -.px +PASS Test <length> invalid value: -.in +PASS Test <length> invalid value: -.cm +PASS Test <length> invalid value: -.mm +PASS Test <length> invalid value: -.pt +PASS Test <length> invalid value: -.pc +PASS Test <length> invalid value: -.% +PASS Test <length> invalid value: .- +PASS Test <length> invalid value: .-em +PASS Test <length> invalid value: .-ex +PASS Test <length> invalid value: .-px +PASS Test <length> invalid value: .-in +PASS Test <length> invalid value: .-cm +PASS Test <length> invalid value: .-mm +PASS Test <length> invalid value: .-pt +PASS Test <length> invalid value: .-pc +PASS Test <length> invalid value: .-% +PASS Test <length> invalid value: . +PASS Test <length> invalid value: .em +PASS Test <length> invalid value: .ex +PASS Test <length> invalid value: .px +PASS Test <length> invalid value: .in +PASS Test <length> invalid value: .cm +PASS Test <length> invalid value: .mm +PASS Test <length> invalid value: .pt +PASS Test <length> invalid value: .pc +PASS Test <length> invalid value: .% +PASS Test <length> invalid value: +. +PASS Test <length> invalid value: +.em +PASS Test <length> invalid value: +.ex +PASS Test <length> invalid value: +.px +PASS Test <length> invalid value: +.in +PASS Test <length> invalid value: +.cm +PASS Test <length> invalid value: +.mm +PASS Test <length> invalid value: +.pt +PASS Test <length> invalid value: +.pc +PASS Test <length> invalid value: +.% +PASS Test <length> invalid value: .E0 +PASS Test <length> invalid value: .E0em +PASS Test <length> invalid value: .E0ex +PASS Test <length> invalid value: .E0px +PASS Test <length> invalid value: .E0in +PASS Test <length> invalid value: .E0cm +PASS Test <length> invalid value: .E0mm +PASS Test <length> invalid value: .E0pt +PASS Test <length> invalid value: .E0pc +PASS Test <length> invalid value: .E0% +PASS Test <length> invalid value: e1 +PASS Test <length> invalid value: e1em +PASS Test <length> invalid value: e1ex +PASS Test <length> invalid value: e1px +PASS Test <length> invalid value: e1in +PASS Test <length> invalid value: e1cm +PASS Test <length> invalid value: e1mm +PASS Test <length> invalid value: e1pt +PASS Test <length> invalid value: e1pc +PASS Test <length> invalid value: e1% +PASS Test <length> invalid value: e+ +PASS Test <length> invalid value: e+em +PASS Test <length> invalid value: e+ex +PASS Test <length> invalid value: e+px +PASS Test <length> invalid value: e+in +PASS Test <length> invalid value: e+cm +PASS Test <length> invalid value: e+mm +PASS Test <length> invalid value: e+pt +PASS Test <length> invalid value: e+pc +PASS Test <length> invalid value: e+% +PASS Test <length> invalid value: E- +PASS Test <length> invalid value: E-em +PASS Test <length> invalid value: E-ex +PASS Test <length> invalid value: E-px +PASS Test <length> invalid value: E-in +PASS Test <length> invalid value: E-cm +PASS Test <length> invalid value: E-mm +PASS Test <length> invalid value: E-pt +PASS Test <length> invalid value: E-pc +PASS Test <length> invalid value: E-% +PASS Test <length> invalid value: - +PASS Test <length> invalid value: -em +PASS Test <length> invalid value: -ex +PASS Test <length> invalid value: -px +PASS Test <length> invalid value: -in +PASS Test <length> invalid value: -cm +PASS Test <length> invalid value: -mm +PASS Test <length> invalid value: -pt +PASS Test <length> invalid value: -pc +PASS Test <length> invalid value: -% +PASS Test <length> invalid value: + +PASS Test <length> invalid value: +em +PASS Test <length> invalid value: +ex +PASS Test <length> invalid value: +px +PASS Test <length> invalid value: +in +PASS Test <length> invalid value: +cm +PASS Test <length> invalid value: +mm +PASS Test <length> invalid value: +pt +PASS Test <length> invalid value: +pc +PASS Test <length> invalid value: +% +PASS Test <length> invalid value: -. +PASS Test <length> invalid value: -.em +PASS Test <length> invalid value: -.ex +PASS Test <length> invalid value: -.px +PASS Test <length> invalid value: -.in +PASS Test <length> invalid value: -.cm +PASS Test <length> invalid value: -.mm +PASS Test <length> invalid value: -.pt +PASS Test <length> invalid value: -.pc +PASS Test <length> invalid value: -.% +PASS Test <length> invalid value: .- +PASS Test <length> invalid value: .-em +PASS Test <length> invalid value: .-ex +PASS Test <length> invalid value: .-px +PASS Test <length> invalid value: .-in +PASS Test <length> invalid value: .-cm +PASS Test <length> invalid value: .-mm +PASS Test <length> invalid value: .-pt +PASS Test <length> invalid value: .-pc +PASS Test <length> invalid value: .-% +PASS Test <length> invalid value: . +PASS Test <length> invalid value: .em +PASS Test <length> invalid value: .ex +PASS Test <length> invalid value: .px +PASS Test <length> invalid value: .in +PASS Test <length> invalid value: .cm +PASS Test <length> invalid value: .mm +PASS Test <length> invalid value: .pt +PASS Test <length> invalid value: .pc +PASS Test <length> invalid value: .% +PASS Test <length> invalid value: +. +PASS Test <length> invalid value: +.em +PASS Test <length> invalid value: +.ex +PASS Test <length> invalid value: +.px +PASS Test <length> invalid value: +.in +PASS Test <length> invalid value: +.cm +PASS Test <length> invalid value: +.mm +PASS Test <length> invalid value: +.pt +PASS Test <length> invalid value: +.pc +PASS Test <length> invalid value: +.% +PASS Test <length> invalid value: .E0 +PASS Test <length> invalid value: .E0em +PASS Test <length> invalid value: .E0ex +PASS Test <length> invalid value: .E0px +PASS Test <length> invalid value: .E0in +PASS Test <length> invalid value: .E0cm +PASS Test <length> invalid value: .E0mm +PASS Test <length> invalid value: .E0pt +PASS Test <length> invalid value: .E0pc +PASS Test <length> invalid value: .E0% +PASS Test <length> invalid value: e1 +PASS Test <length> invalid value: e1em +PASS Test <length> invalid value: e1ex +PASS Test <length> invalid value: e1px +PASS Test <length> invalid value: e1in +PASS Test <length> invalid value: e1cm +PASS Test <length> invalid value: e1mm +PASS Test <length> invalid value: e1pt +PASS Test <length> invalid value: e1pc +PASS Test <length> invalid value: e1% +PASS Test <length> invalid value: e+\r\n\t +PASS Test <length> invalid value: e+em\r\n\t +PASS Test <length> invalid value: e+ex\r\n\t +PASS Test <length> invalid value: e+px\r\n\t +PASS Test <length> invalid value: e+in\r\n\t +PASS Test <length> invalid value: e+cm\r\n\t +PASS Test <length> invalid value: e+mm\r\n\t +PASS Test <length> invalid value: e+pt\r\n\t +PASS Test <length> invalid value: e+pc\r\n\t +PASS Test <length> invalid value: e+%\r\n\t +PASS Test <length> invalid value: E-\r\n\t +PASS Test <length> invalid value: E-em\r\n\t +PASS Test <length> invalid value: E-ex\r\n\t +PASS Test <length> invalid value: E-px\r\n\t +PASS Test <length> invalid value: E-in\r\n\t +PASS Test <length> invalid value: E-cm\r\n\t +PASS Test <length> invalid value: E-mm\r\n\t +PASS Test <length> invalid value: E-pt\r\n\t +PASS Test <length> invalid value: E-pc\r\n\t +PASS Test <length> invalid value: E-%\r\n\t +PASS Test <length> invalid value: -\r\n\t +PASS Test <length> invalid value: -em\r\n\t +PASS Test <length> invalid value: -ex\r\n\t +PASS Test <length> invalid value: -px\r\n\t +PASS Test <length> invalid value: -in\r\n\t +PASS Test <length> invalid value: -cm\r\n\t +PASS Test <length> invalid value: -mm\r\n\t +PASS Test <length> invalid value: -pt\r\n\t +PASS Test <length> invalid value: -pc\r\n\t +PASS Test <length> invalid value: -%\r\n\t +PASS Test <length> invalid value: +\r\n\t +PASS Test <length> invalid value: +em\r\n\t +PASS Test <length> invalid value: +ex\r\n\t +PASS Test <length> invalid value: +px\r\n\t +PASS Test <length> invalid value: +in\r\n\t +PASS Test <length> invalid value: +cm\r\n\t +PASS Test <length> invalid value: +mm\r\n\t +PASS Test <length> invalid value: +pt\r\n\t +PASS Test <length> invalid value: +pc\r\n\t +PASS Test <length> invalid value: +%\r\n\t +PASS Test <length> invalid value: -.\r\n\t +PASS Test <length> invalid value: -.em\r\n\t +PASS Test <length> invalid value: -.ex\r\n\t +PASS Test <length> invalid value: -.px\r\n\t +PASS Test <length> invalid value: -.in\r\n\t +PASS Test <length> invalid value: -.cm\r\n\t +PASS Test <length> invalid value: -.mm\r\n\t +PASS Test <length> invalid value: -.pt\r\n\t +PASS Test <length> invalid value: -.pc\r\n\t +PASS Test <length> invalid value: -.%\r\n\t +PASS Test <length> invalid value: .-\r\n\t +PASS Test <length> invalid value: .-em\r\n\t +PASS Test <length> invalid value: .-ex\r\n\t +PASS Test <length> invalid value: .-px\r\n\t +PASS Test <length> invalid value: .-in\r\n\t +PASS Test <length> invalid value: .-cm\r\n\t +PASS Test <length> invalid value: .-mm\r\n\t +PASS Test <length> invalid value: .-pt\r\n\t +PASS Test <length> invalid value: .-pc\r\n\t +PASS Test <length> invalid value: .-%\r\n\t +PASS Test <length> invalid value: .\r\n\t +PASS Test <length> invalid value: .em\r\n\t +PASS Test <length> invalid value: .ex\r\n\t +PASS Test <length> invalid value: .px\r\n\t +PASS Test <length> invalid value: .in\r\n\t +PASS Test <length> invalid value: .cm\r\n\t +PASS Test <length> invalid value: .mm\r\n\t +PASS Test <length> invalid value: .pt\r\n\t +PASS Test <length> invalid value: .pc\r\n\t +PASS Test <length> invalid value: .%\r\n\t +PASS Test <length> invalid value: +.\r\n\t +PASS Test <length> invalid value: +.em\r\n\t +PASS Test <length> invalid value: +.ex\r\n\t +PASS Test <length> invalid value: +.px\r\n\t +PASS Test <length> invalid value: +.in\r\n\t +PASS Test <length> invalid value: +.cm\r\n\t +PASS Test <length> invalid value: +.mm\r\n\t +PASS Test <length> invalid value: +.pt\r\n\t +PASS Test <length> invalid value: +.pc\r\n\t +PASS Test <length> invalid value: +.%\r\n\t +PASS Test <length> invalid value: .E0\r\n\t +PASS Test <length> invalid value: .E0em\r\n\t +PASS Test <length> invalid value: .E0ex\r\n\t +PASS Test <length> invalid value: .E0px\r\n\t +PASS Test <length> invalid value: .E0in\r\n\t +PASS Test <length> invalid value: .E0cm\r\n\t +PASS Test <length> invalid value: .E0mm\r\n\t +PASS Test <length> invalid value: .E0pt\r\n\t +PASS Test <length> invalid value: .E0pc\r\n\t +PASS Test <length> invalid value: .E0%\r\n\t +PASS Test <length> invalid value: e1\r\n\t +PASS Test <length> invalid value: e1em\r\n\t +PASS Test <length> invalid value: e1ex\r\n\t +PASS Test <length> invalid value: e1px\r\n\t +PASS Test <length> invalid value: e1in\r\n\t +PASS Test <length> invalid value: e1cm\r\n\t +PASS Test <length> invalid value: e1mm\r\n\t +PASS Test <length> invalid value: e1pt\r\n\t +PASS Test <length> invalid value: e1pc\r\n\t +PASS Test <length> invalid value: e1%\r\n\t +PASS Test <length> invalid value: e+\f +PASS Test <length> invalid value: e+em\f +PASS Test <length> invalid value: e+ex\f +PASS Test <length> invalid value: e+px\f +PASS Test <length> invalid value: e+in\f +PASS Test <length> invalid value: e+cm\f +PASS Test <length> invalid value: e+mm\f +PASS Test <length> invalid value: e+pt\f +PASS Test <length> invalid value: e+pc\f +PASS Test <length> invalid value: e+%\f +PASS Test <length> invalid value: E-\f +PASS Test <length> invalid value: E-em\f +PASS Test <length> invalid value: E-ex\f +PASS Test <length> invalid value: E-px\f +PASS Test <length> invalid value: E-in\f +PASS Test <length> invalid value: E-cm\f +PASS Test <length> invalid value: E-mm\f +PASS Test <length> invalid value: E-pt\f +PASS Test <length> invalid value: E-pc\f +PASS Test <length> invalid value: E-%\f +PASS Test <length> invalid value: -\f +PASS Test <length> invalid value: -em\f +PASS Test <length> invalid value: -ex\f +PASS Test <length> invalid value: -px\f +PASS Test <length> invalid value: -in\f +PASS Test <length> invalid value: -cm\f +PASS Test <length> invalid value: -mm\f +PASS Test <length> invalid value: -pt\f +PASS Test <length> invalid value: -pc\f +PASS Test <length> invalid value: -%\f +PASS Test <length> invalid value: +\f +PASS Test <length> invalid value: +em\f +PASS Test <length> invalid value: +ex\f +PASS Test <length> invalid value: +px\f +PASS Test <length> invalid value: +in\f +PASS Test <length> invalid value: +cm\f +PASS Test <length> invalid value: +mm\f +PASS Test <length> invalid value: +pt\f +PASS Test <length> invalid value: +pc\f +PASS Test <length> invalid value: +%\f +PASS Test <length> invalid value: -.\f +PASS Test <length> invalid value: -.em\f +PASS Test <length> invalid value: -.ex\f +PASS Test <length> invalid value: -.px\f +PASS Test <length> invalid value: -.in\f +PASS Test <length> invalid value: -.cm\f +PASS Test <length> invalid value: -.mm\f +PASS Test <length> invalid value: -.pt\f +PASS Test <length> invalid value: -.pc\f +PASS Test <length> invalid value: -.%\f +PASS Test <length> invalid value: .-\f +PASS Test <length> invalid value: .-em\f +PASS Test <length> invalid value: .-ex\f +PASS Test <length> invalid value: .-px\f +PASS Test <length> invalid value: .-in\f +PASS Test <length> invalid value: .-cm\f +PASS Test <length> invalid value: .-mm\f +PASS Test <length> invalid value: .-pt\f +PASS Test <length> invalid value: .-pc\f +PASS Test <length> invalid value: .-%\f +PASS Test <length> invalid value: .\f +PASS Test <length> invalid value: .em\f +PASS Test <length> invalid value: .ex\f +PASS Test <length> invalid value: .px\f +PASS Test <length> invalid value: .in\f +PASS Test <length> invalid value: .cm\f +PASS Test <length> invalid value: .mm\f +PASS Test <length> invalid value: .pt\f +PASS Test <length> invalid value: .pc\f +PASS Test <length> invalid value: .%\f +PASS Test <length> invalid value: +.\f +PASS Test <length> invalid value: +.em\f +PASS Test <length> invalid value: +.ex\f +PASS Test <length> invalid value: +.px\f +PASS Test <length> invalid value: +.in\f +PASS Test <length> invalid value: +.cm\f +PASS Test <length> invalid value: +.mm\f +PASS Test <length> invalid value: +.pt\f +PASS Test <length> invalid value: +.pc\f +PASS Test <length> invalid value: +.%\f +PASS Test <length> invalid value: .E0\f +PASS Test <length> invalid value: .E0em\f +PASS Test <length> invalid value: .E0ex\f +PASS Test <length> invalid value: .E0px\f +PASS Test <length> invalid value: .E0in\f +PASS Test <length> invalid value: .E0cm\f +PASS Test <length> invalid value: .E0mm\f +PASS Test <length> invalid value: .E0pt\f +PASS Test <length> invalid value: .E0pc\f +PASS Test <length> invalid value: .E0%\f +PASS Test <length> invalid value: e1\f +PASS Test <length> invalid value: e1em\f +PASS Test <length> invalid value: e1ex\f +PASS Test <length> invalid value: e1px\f +PASS Test <length> invalid value: e1in\f +PASS Test <length> invalid value: e1cm\f +PASS Test <length> invalid value: e1mm\f +PASS Test <length> invalid value: e1pt\f +PASS Test <length> invalid value: e1pc\f +PASS Test <length> invalid value: e1%\f +PASS Test <length> invalid value: e+ +PASS Test <length> invalid value: e+em +PASS Test <length> invalid value: e+ex +PASS Test <length> invalid value: e+px +PASS Test <length> invalid value: e+in +PASS Test <length> invalid value: e+cm +PASS Test <length> invalid value: e+mm +PASS Test <length> invalid value: e+pt +PASS Test <length> invalid value: e+pc +PASS Test <length> invalid value: e+% +PASS Test <length> invalid value: E- +PASS Test <length> invalid value: E-em +PASS Test <length> invalid value: E-ex +PASS Test <length> invalid value: E-px +PASS Test <length> invalid value: E-in +PASS Test <length> invalid value: E-cm +PASS Test <length> invalid value: E-mm +PASS Test <length> invalid value: E-pt +PASS Test <length> invalid value: E-pc +PASS Test <length> invalid value: E-% +PASS Test <length> invalid value: - +PASS Test <length> invalid value: -em +PASS Test <length> invalid value: -ex +PASS Test <length> invalid value: -px +PASS Test <length> invalid value: -in +PASS Test <length> invalid value: -cm +PASS Test <length> invalid value: -mm +PASS Test <length> invalid value: -pt +PASS Test <length> invalid value: -pc +PASS Test <length> invalid value: -% +PASS Test <length> invalid value: + +PASS Test <length> invalid value: +em +PASS Test <length> invalid value: +ex +PASS Test <length> invalid value: +px +PASS Test <length> invalid value: +in +PASS Test <length> invalid value: +cm +PASS Test <length> invalid value: +mm +PASS Test <length> invalid value: +pt +PASS Test <length> invalid value: +pc +PASS Test <length> invalid value: +% +PASS Test <length> invalid value: -. +PASS Test <length> invalid value: -.em +PASS Test <length> invalid value: -.ex +PASS Test <length> invalid value: -.px +PASS Test <length> invalid value: -.in +PASS Test <length> invalid value: -.cm +PASS Test <length> invalid value: -.mm +PASS Test <length> invalid value: -.pt +PASS Test <length> invalid value: -.pc +PASS Test <length> invalid value: -.% +PASS Test <length> invalid value: .- +PASS Test <length> invalid value: .-em +PASS Test <length> invalid value: .-ex +PASS Test <length> invalid value: .-px +PASS Test <length> invalid value: .-in +PASS Test <length> invalid value: .-cm +PASS Test <length> invalid value: .-mm +PASS Test <length> invalid value: .-pt +PASS Test <length> invalid value: .-pc +PASS Test <length> invalid value: .-% +PASS Test <length> invalid value: . +PASS Test <length> invalid value: .em +PASS Test <length> invalid value: .ex +PASS Test <length> invalid value: .px +PASS Test <length> invalid value: .in +PASS Test <length> invalid value: .cm +PASS Test <length> invalid value: .mm +PASS Test <length> invalid value: .pt +PASS Test <length> invalid value: .pc +PASS Test <length> invalid value: .% +PASS Test <length> invalid value: +. +PASS Test <length> invalid value: +.em +PASS Test <length> invalid value: +.ex +PASS Test <length> invalid value: +.px +PASS Test <length> invalid value: +.in +PASS Test <length> invalid value: +.cm +PASS Test <length> invalid value: +.mm +PASS Test <length> invalid value: +.pt +PASS Test <length> invalid value: +.pc +PASS Test <length> invalid value: +.% +PASS Test <length> invalid value: .E0 +PASS Test <length> invalid value: .E0em +PASS Test <length> invalid value: .E0ex +PASS Test <length> invalid value: .E0px +PASS Test <length> invalid value: .E0in +PASS Test <length> invalid value: .E0cm +PASS Test <length> invalid value: .E0mm +PASS Test <length> invalid value: .E0pt +PASS Test <length> invalid value: .E0pc +PASS Test <length> invalid value: .E0% +PASS Test <length> invalid value: e1 +PASS Test <length> invalid value: e1em +PASS Test <length> invalid value: e1ex +PASS Test <length> invalid value: e1px +PASS Test <length> invalid value: e1in +PASS Test <length> invalid value: e1cm +PASS Test <length> invalid value: e1mm +PASS Test <length> invalid value: e1pt +PASS Test <length> invalid value: e1pc +PASS Test <length> invalid value: e1% +PASS Test <length> invalid value: e+ +PASS Test <length> invalid value: e+em +PASS Test <length> invalid value: e+ex +PASS Test <length> invalid value: e+px +PASS Test <length> invalid value: e+in +PASS Test <length> invalid value: e+cm +PASS Test <length> invalid value: e+mm +PASS Test <length> invalid value: e+pt +PASS Test <length> invalid value: e+pc +PASS Test <length> invalid value: e+% +PASS Test <length> invalid value: E- +PASS Test <length> invalid value: E-em +PASS Test <length> invalid value: E-ex +PASS Test <length> invalid value: E-px +PASS Test <length> invalid value: E-in +PASS Test <length> invalid value: E-cm +PASS Test <length> invalid value: E-mm +PASS Test <length> invalid value: E-pt +PASS Test <length> invalid value: E-pc +PASS Test <length> invalid value: E-% +PASS Test <length> invalid value: - +PASS Test <length> invalid value: -em +PASS Test <length> invalid value: -ex +PASS Test <length> invalid value: -px +PASS Test <length> invalid value: -in +PASS Test <length> invalid value: -cm +PASS Test <length> invalid value: -mm +PASS Test <length> invalid value: -pt +PASS Test <length> invalid value: -pc +PASS Test <length> invalid value: -% +PASS Test <length> invalid value: + +PASS Test <length> invalid value: +em +PASS Test <length> invalid value: +ex +PASS Test <length> invalid value: +px +PASS Test <length> invalid value: +in +PASS Test <length> invalid value: +cm +PASS Test <length> invalid value: +mm +PASS Test <length> invalid value: +pt +PASS Test <length> invalid value: +pc +PASS Test <length> invalid value: +% +PASS Test <length> invalid value: -. +PASS Test <length> invalid value: -.em +PASS Test <length> invalid value: -.ex +PASS Test <length> invalid value: -.px +PASS Test <length> invalid value: -.in +PASS Test <length> invalid value: -.cm +PASS Test <length> invalid value: -.mm +PASS Test <length> invalid value: -.pt +PASS Test <length> invalid value: -.pc +PASS Test <length> invalid value: -.% +PASS Test <length> invalid value: .- +PASS Test <length> invalid value: .-em +PASS Test <length> invalid value: .-ex +PASS Test <length> invalid value: .-px +PASS Test <length> invalid value: .-in +PASS Test <length> invalid value: .-cm +PASS Test <length> invalid value: .-mm +PASS Test <length> invalid value: .-pt +PASS Test <length> invalid value: .-pc +PASS Test <length> invalid value: .-% +PASS Test <length> invalid value: . +PASS Test <length> invalid value: .em +PASS Test <length> invalid value: .ex +PASS Test <length> invalid value: .px +PASS Test <length> invalid value: .in +PASS Test <length> invalid value: .cm +PASS Test <length> invalid value: .mm +PASS Test <length> invalid value: .pt +PASS Test <length> invalid value: .pc +PASS Test <length> invalid value: .% +PASS Test <length> invalid value: +. +PASS Test <length> invalid value: +.em +PASS Test <length> invalid value: +.ex +PASS Test <length> invalid value: +.px +PASS Test <length> invalid value: +.in +PASS Test <length> invalid value: +.cm +PASS Test <length> invalid value: +.mm +PASS Test <length> invalid value: +.pt +PASS Test <length> invalid value: +.pc +PASS Test <length> invalid value: +.% +PASS Test <length> invalid value: .E0 +PASS Test <length> invalid value: .E0em +PASS Test <length> invalid value: .E0ex +PASS Test <length> invalid value: .E0px +PASS Test <length> invalid value: .E0in +PASS Test <length> invalid value: .E0cm +PASS Test <length> invalid value: .E0mm +PASS Test <length> invalid value: .E0pt +PASS Test <length> invalid value: .E0pc +PASS Test <length> invalid value: .E0% +PASS Test <length> invalid value: e1 +PASS Test <length> invalid value: e1em +PASS Test <length> invalid value: e1ex +PASS Test <length> invalid value: e1px +PASS Test <length> invalid value: e1in +PASS Test <length> invalid value: e1cm +PASS Test <length> invalid value: e1mm +PASS Test <length> invalid value: e1pt +PASS Test <length> invalid value: e1pc +PASS Test <length> invalid value: e1% +PASS Test <length> invalid value: e+ +PASS Test <length> invalid value: e+em +PASS Test <length> invalid value: e+ex +PASS Test <length> invalid value: e+px +PASS Test <length> invalid value: e+in +PASS Test <length> invalid value: e+cm +PASS Test <length> invalid value: e+mm +PASS Test <length> invalid value: e+pt +PASS Test <length> invalid value: e+pc +PASS Test <length> invalid value: e+% +PASS Test <length> invalid value: E- +PASS Test <length> invalid value: E-em +PASS Test <length> invalid value: E-ex +PASS Test <length> invalid value: E-px +PASS Test <length> invalid value: E-in +PASS Test <length> invalid value: E-cm +PASS Test <length> invalid value: E-mm +PASS Test <length> invalid value: E-pt +PASS Test <length> invalid value: E-pc +PASS Test <length> invalid value: E-% +PASS Test <length> invalid value: - +PASS Test <length> invalid value: -em +PASS Test <length> invalid value: -ex +PASS Test <length> invalid value: -px +PASS Test <length> invalid value: -in +PASS Test <length> invalid value: -cm +PASS Test <length> invalid value: -mm +PASS Test <length> invalid value: -pt +PASS Test <length> invalid value: -pc +PASS Test <length> invalid value: -% +PASS Test <length> invalid value: + +PASS Test <length> invalid value: +em +PASS Test <length> invalid value: +ex +PASS Test <length> invalid value: +px +PASS Test <length> invalid value: +in +PASS Test <length> invalid value: +cm +PASS Test <length> invalid value: +mm +PASS Test <length> invalid value: +pt +PASS Test <length> invalid value: +pc +PASS Test <length> invalid value: +% +PASS Test <length> invalid value: -. +PASS Test <length> invalid value: -.em +PASS Test <length> invalid value: -.ex +PASS Test <length> invalid value: -.px +PASS Test <length> invalid value: -.in +PASS Test <length> invalid value: -.cm +PASS Test <length> invalid value: -.mm +PASS Test <length> invalid value: -.pt +PASS Test <length> invalid value: -.pc +PASS Test <length> invalid value: -.% +PASS Test <length> invalid value: .- +PASS Test <length> invalid value: .-em +PASS Test <length> invalid value: .-ex +PASS Test <length> invalid value: .-px +PASS Test <length> invalid value: .-in +PASS Test <length> invalid value: .-cm +PASS Test <length> invalid value: .-mm +PASS Test <length> invalid value: .-pt +PASS Test <length> invalid value: .-pc +PASS Test <length> invalid value: .-% +PASS Test <length> invalid value: . +PASS Test <length> invalid value: .em +PASS Test <length> invalid value: .ex +PASS Test <length> invalid value: .px +PASS Test <length> invalid value: .in +PASS Test <length> invalid value: .cm +PASS Test <length> invalid value: .mm +PASS Test <length> invalid value: .pt +PASS Test <length> invalid value: .pc +PASS Test <length> invalid value: .% +PASS Test <length> invalid value: +. +PASS Test <length> invalid value: +.em +PASS Test <length> invalid value: +.ex +PASS Test <length> invalid value: +.px +PASS Test <length> invalid value: +.in +PASS Test <length> invalid value: +.cm +PASS Test <length> invalid value: +.mm +PASS Test <length> invalid value: +.pt +PASS Test <length> invalid value: +.pc +PASS Test <length> invalid value: +.% +PASS Test <length> invalid value: .E0 +PASS Test <length> invalid value: .E0em +PASS Test <length> invalid value: .E0ex +PASS Test <length> invalid value: .E0px +PASS Test <length> invalid value: .E0in +PASS Test <length> invalid value: .E0cm +PASS Test <length> invalid value: .E0mm +PASS Test <length> invalid value: .E0pt +PASS Test <length> invalid value: .E0pc +PASS Test <length> invalid value: .E0% +PASS Test <length> invalid value: e1 +PASS Test <length> invalid value: e1em +PASS Test <length> invalid value: e1ex +PASS Test <length> invalid value: e1px +PASS Test <length> invalid value: e1in +PASS Test <length> invalid value: e1cm +PASS Test <length> invalid value: e1mm +PASS Test <length> invalid value: e1pt +PASS Test <length> invalid value: e1pc +PASS Test <length> invalid value: e1% +PASS Test <length> invalid value: e+\r\n\t +PASS Test <length> invalid value: e+em\r\n\t +PASS Test <length> invalid value: e+ex\r\n\t +PASS Test <length> invalid value: e+px\r\n\t +PASS Test <length> invalid value: e+in\r\n\t +PASS Test <length> invalid value: e+cm\r\n\t +PASS Test <length> invalid value: e+mm\r\n\t +PASS Test <length> invalid value: e+pt\r\n\t +PASS Test <length> invalid value: e+pc\r\n\t +PASS Test <length> invalid value: e+%\r\n\t +PASS Test <length> invalid value: E-\r\n\t +PASS Test <length> invalid value: E-em\r\n\t +PASS Test <length> invalid value: E-ex\r\n\t +PASS Test <length> invalid value: E-px\r\n\t +PASS Test <length> invalid value: E-in\r\n\t +PASS Test <length> invalid value: E-cm\r\n\t +PASS Test <length> invalid value: E-mm\r\n\t +PASS Test <length> invalid value: E-pt\r\n\t +PASS Test <length> invalid value: E-pc\r\n\t +PASS Test <length> invalid value: E-%\r\n\t +PASS Test <length> invalid value: -\r\n\t +PASS Test <length> invalid value: -em\r\n\t +PASS Test <length> invalid value: -ex\r\n\t +PASS Test <length> invalid value: -px\r\n\t +PASS Test <length> invalid value: -in\r\n\t +PASS Test <length> invalid value: -cm\r\n\t +PASS Test <length> invalid value: -mm\r\n\t +PASS Test <length> invalid value: -pt\r\n\t +PASS Test <length> invalid value: -pc\r\n\t +PASS Test <length> invalid value: -%\r\n\t +PASS Test <length> invalid value: +\r\n\t +PASS Test <length> invalid value: +em\r\n\t +PASS Test <length> invalid value: +ex\r\n\t +PASS Test <length> invalid value: +px\r\n\t +PASS Test <length> invalid value: +in\r\n\t +PASS Test <length> invalid value: +cm\r\n\t +PASS Test <length> invalid value: +mm\r\n\t +PASS Test <length> invalid value: +pt\r\n\t +PASS Test <length> invalid value: +pc\r\n\t +PASS Test <length> invalid value: +%\r\n\t +PASS Test <length> invalid value: -.\r\n\t +PASS Test <length> invalid value: -.em\r\n\t +PASS Test <length> invalid value: -.ex\r\n\t +PASS Test <length> invalid value: -.px\r\n\t +PASS Test <length> invalid value: -.in\r\n\t +PASS Test <length> invalid value: -.cm\r\n\t +PASS Test <length> invalid value: -.mm\r\n\t +PASS Test <length> invalid value: -.pt\r\n\t +PASS Test <length> invalid value: -.pc\r\n\t +PASS Test <length> invalid value: -.%\r\n\t +PASS Test <length> invalid value: .-\r\n\t +PASS Test <length> invalid value: .-em\r\n\t +PASS Test <length> invalid value: .-ex\r\n\t +PASS Test <length> invalid value: .-px\r\n\t +PASS Test <length> invalid value: .-in\r\n\t +PASS Test <length> invalid value: .-cm\r\n\t +PASS Test <length> invalid value: .-mm\r\n\t +PASS Test <length> invalid value: .-pt\r\n\t +PASS Test <length> invalid value: .-pc\r\n\t +PASS Test <length> invalid value: .-%\r\n\t +PASS Test <length> invalid value: .\r\n\t +PASS Test <length> invalid value: .em\r\n\t +PASS Test <length> invalid value: .ex\r\n\t +PASS Test <length> invalid value: .px\r\n\t +PASS Test <length> invalid value: .in\r\n\t +PASS Test <length> invalid value: .cm\r\n\t +PASS Test <length> invalid value: .mm\r\n\t +PASS Test <length> invalid value: .pt\r\n\t +PASS Test <length> invalid value: .pc\r\n\t +PASS Test <length> invalid value: .%\r\n\t +PASS Test <length> invalid value: +.\r\n\t +PASS Test <length> invalid value: +.em\r\n\t +PASS Test <length> invalid value: +.ex\r\n\t +PASS Test <length> invalid value: +.px\r\n\t +PASS Test <length> invalid value: +.in\r\n\t +PASS Test <length> invalid value: +.cm\r\n\t +PASS Test <length> invalid value: +.mm\r\n\t +PASS Test <length> invalid value: +.pt\r\n\t +PASS Test <length> invalid value: +.pc\r\n\t +PASS Test <length> invalid value: +.%\r\n\t +PASS Test <length> invalid value: .E0\r\n\t +PASS Test <length> invalid value: .E0em\r\n\t +PASS Test <length> invalid value: .E0ex\r\n\t +PASS Test <length> invalid value: .E0px\r\n\t +PASS Test <length> invalid value: .E0in\r\n\t +PASS Test <length> invalid value: .E0cm\r\n\t +PASS Test <length> invalid value: .E0mm\r\n\t +PASS Test <length> invalid value: .E0pt\r\n\t +PASS Test <length> invalid value: .E0pc\r\n\t +PASS Test <length> invalid value: .E0%\r\n\t +PASS Test <length> invalid value: e1\r\n\t +PASS Test <length> invalid value: e1em\r\n\t +PASS Test <length> invalid value: e1ex\r\n\t +PASS Test <length> invalid value: e1px\r\n\t +PASS Test <length> invalid value: e1in\r\n\t +PASS Test <length> invalid value: e1cm\r\n\t +PASS Test <length> invalid value: e1mm\r\n\t +PASS Test <length> invalid value: e1pt\r\n\t +PASS Test <length> invalid value: e1pc\r\n\t +PASS Test <length> invalid value: e1%\r\n\t +PASS Test <length> invalid value: e+\f +PASS Test <length> invalid value: e+em\f +PASS Test <length> invalid value: e+ex\f +PASS Test <length> invalid value: e+px\f +PASS Test <length> invalid value: e+in\f +PASS Test <length> invalid value: e+cm\f +PASS Test <length> invalid value: e+mm\f +PASS Test <length> invalid value: e+pt\f +PASS Test <length> invalid value: e+pc\f +PASS Test <length> invalid value: e+%\f +PASS Test <length> invalid value: E-\f +PASS Test <length> invalid value: E-em\f +PASS Test <length> invalid value: E-ex\f +PASS Test <length> invalid value: E-px\f +PASS Test <length> invalid value: E-in\f +PASS Test <length> invalid value: E-cm\f +PASS Test <length> invalid value: E-mm\f +PASS Test <length> invalid value: E-pt\f +PASS Test <length> invalid value: E-pc\f +PASS Test <length> invalid value: E-%\f +PASS Test <length> invalid value: -\f +PASS Test <length> invalid value: -em\f +PASS Test <length> invalid value: -ex\f +PASS Test <length> invalid value: -px\f +PASS Test <length> invalid value: -in\f +PASS Test <length> invalid value: -cm\f +PASS Test <length> invalid value: -mm\f +PASS Test <length> invalid value: -pt\f +PASS Test <length> invalid value: -pc\f +PASS Test <length> invalid value: -%\f +PASS Test <length> invalid value: +\f +PASS Test <length> invalid value: +em\f +PASS Test <length> invalid value: +ex\f +PASS Test <length> invalid value: +px\f +PASS Test <length> invalid value: +in\f +PASS Test <length> invalid value: +cm\f +PASS Test <length> invalid value: +mm\f +PASS Test <length> invalid value: +pt\f +PASS Test <length> invalid value: +pc\f +PASS Test <length> invalid value: +%\f +PASS Test <length> invalid value: -.\f +PASS Test <length> invalid value: -.em\f +PASS Test <length> invalid value: -.ex\f +PASS Test <length> invalid value: -.px\f +PASS Test <length> invalid value: -.in\f +PASS Test <length> invalid value: -.cm\f +PASS Test <length> invalid value: -.mm\f +PASS Test <length> invalid value: -.pt\f +PASS Test <length> invalid value: -.pc\f +PASS Test <length> invalid value: -.%\f +PASS Test <length> invalid value: .-\f +PASS Test <length> invalid value: .-em\f +PASS Test <length> invalid value: .-ex\f +PASS Test <length> invalid value: .-px\f +PASS Test <length> invalid value: .-in\f +PASS Test <length> invalid value: .-cm\f +PASS Test <length> invalid value: .-mm\f +PASS Test <length> invalid value: .-pt\f +PASS Test <length> invalid value: .-pc\f +PASS Test <length> invalid value: .-%\f +PASS Test <length> invalid value: .\f +PASS Test <length> invalid value: .em\f +PASS Test <length> invalid value: .ex\f +PASS Test <length> invalid value: .px\f +PASS Test <length> invalid value: .in\f +PASS Test <length> invalid value: .cm\f +PASS Test <length> invalid value: .mm\f +PASS Test <length> invalid value: .pt\f +PASS Test <length> invalid value: .pc\f +PASS Test <length> invalid value: .%\f +PASS Test <length> invalid value: +.\f +PASS Test <length> invalid value: +.em\f +PASS Test <length> invalid value: +.ex\f +PASS Test <length> invalid value: +.px\f +PASS Test <length> invalid value: +.in\f +PASS Test <length> invalid value: +.cm\f +PASS Test <length> invalid value: +.mm\f +PASS Test <length> invalid value: +.pt\f +PASS Test <length> invalid value: +.pc\f +PASS Test <length> invalid value: +.%\f +PASS Test <length> invalid value: .E0\f +PASS Test <length> invalid value: .E0em\f +PASS Test <length> invalid value: .E0ex\f +PASS Test <length> invalid value: .E0px\f +PASS Test <length> invalid value: .E0in\f +PASS Test <length> invalid value: .E0cm\f +PASS Test <length> invalid value: .E0mm\f +PASS Test <length> invalid value: .E0pt\f +PASS Test <length> invalid value: .E0pc\f +PASS Test <length> invalid value: .E0%\f +PASS Test <length> invalid value: e1\f +PASS Test <length> invalid value: e1em\f +PASS Test <length> invalid value: e1ex\f +PASS Test <length> invalid value: e1px\f +PASS Test <length> invalid value: e1in\f +PASS Test <length> invalid value: e1cm\f +PASS Test <length> invalid value: e1mm\f +PASS Test <length> invalid value: e1pt\f +PASS Test <length> invalid value: e1pc\f +PASS Test <length> invalid value: e1%\f +PASS Test <length> invalid value: e+ +PASS Test <length> invalid value: e+em +PASS Test <length> invalid value: e+ex +PASS Test <length> invalid value: e+px +PASS Test <length> invalid value: e+in +PASS Test <length> invalid value: e+cm +PASS Test <length> invalid value: e+mm +PASS Test <length> invalid value: e+pt +PASS Test <length> invalid value: e+pc +PASS Test <length> invalid value: e+% +PASS Test <length> invalid value: E- +PASS Test <length> invalid value: E-em +PASS Test <length> invalid value: E-ex +PASS Test <length> invalid value: E-px +PASS Test <length> invalid value: E-in +PASS Test <length> invalid value: E-cm +PASS Test <length> invalid value: E-mm +PASS Test <length> invalid value: E-pt +PASS Test <length> invalid value: E-pc +PASS Test <length> invalid value: E-% +PASS Test <length> invalid value: - +PASS Test <length> invalid value: -em +PASS Test <length> invalid value: -ex +PASS Test <length> invalid value: -px +PASS Test <length> invalid value: -in +PASS Test <length> invalid value: -cm +PASS Test <length> invalid value: -mm +PASS Test <length> invalid value: -pt +PASS Test <length> invalid value: -pc +PASS Test <length> invalid value: -% +PASS Test <length> invalid value: + +PASS Test <length> invalid value: +em +PASS Test <length> invalid value: +ex +PASS Test <length> invalid value: +px +PASS Test <length> invalid value: +in +PASS Test <length> invalid value: +cm +PASS Test <length> invalid value: +mm +PASS Test <length> invalid value: +pt +PASS Test <length> invalid value: +pc +PASS Test <length> invalid value: +% +PASS Test <length> invalid value: -. +PASS Test <length> invalid value: -.em +PASS Test <length> invalid value: -.ex +PASS Test <length> invalid value: -.px +PASS Test <length> invalid value: -.in +PASS Test <length> invalid value: -.cm +PASS Test <length> invalid value: -.mm +PASS Test <length> invalid value: -.pt +PASS Test <length> invalid value: -.pc +PASS Test <length> invalid value: -.% +PASS Test <length> invalid value: .- +PASS Test <length> invalid value: .-em +PASS Test <length> invalid value: .-ex +PASS Test <length> invalid value: .-px +PASS Test <length> invalid value: .-in +PASS Test <length> invalid value: .-cm +PASS Test <length> invalid value: .-mm +PASS Test <length> invalid value: .-pt +PASS Test <length> invalid value: .-pc +PASS Test <length> invalid value: .-% +PASS Test <length> invalid value: . +PASS Test <length> invalid value: .em +PASS Test <length> invalid value: .ex +PASS Test <length> invalid value: .px +PASS Test <length> invalid value: .in +PASS Test <length> invalid value: .cm +PASS Test <length> invalid value: .mm +PASS Test <length> invalid value: .pt +PASS Test <length> invalid value: .pc +PASS Test <length> invalid value: .% +PASS Test <length> invalid value: +. +PASS Test <length> invalid value: +.em +PASS Test <length> invalid value: +.ex +PASS Test <length> invalid value: +.px +PASS Test <length> invalid value: +.in +PASS Test <length> invalid value: +.cm +PASS Test <length> invalid value: +.mm +PASS Test <length> invalid value: +.pt +PASS Test <length> invalid value: +.pc +PASS Test <length> invalid value: +.% +PASS Test <length> invalid value: .E0 +PASS Test <length> invalid value: .E0em +PASS Test <length> invalid value: .E0ex +PASS Test <length> invalid value: .E0px +PASS Test <length> invalid value: .E0in +PASS Test <length> invalid value: .E0cm +PASS Test <length> invalid value: .E0mm +PASS Test <length> invalid value: .E0pt +PASS Test <length> invalid value: .E0pc +PASS Test <length> invalid value: .E0% +PASS Test <length> invalid value: e1 +PASS Test <length> invalid value: e1em +PASS Test <length> invalid value: e1ex +PASS Test <length> invalid value: e1px +PASS Test <length> invalid value: e1in +PASS Test <length> invalid value: e1cm +PASS Test <length> invalid value: e1mm +PASS Test <length> invalid value: e1pt +PASS Test <length> invalid value: e1pc +PASS Test <length> invalid value: e1% +PASS Test <length> invalid value: e+ +PASS Test <length> invalid value: e+em +PASS Test <length> invalid value: e+ex +PASS Test <length> invalid value: e+px +PASS Test <length> invalid value: e+in +PASS Test <length> invalid value: e+cm +PASS Test <length> invalid value: e+mm +PASS Test <length> invalid value: e+pt +PASS Test <length> invalid value: e+pc +PASS Test <length> invalid value: e+% +PASS Test <length> invalid value: E- +PASS Test <length> invalid value: E-em +PASS Test <length> invalid value: E-ex +PASS Test <length> invalid value: E-px +PASS Test <length> invalid value: E-in +PASS Test <length> invalid value: E-cm +PASS Test <length> invalid value: E-mm +PASS Test <length> invalid value: E-pt +PASS Test <length> invalid value: E-pc +PASS Test <length> invalid value: E-% +PASS Test <length> invalid value: - +PASS Test <length> invalid value: -em +PASS Test <length> invalid value: -ex +PASS Test <length> invalid value: -px +PASS Test <length> invalid value: -in +PASS Test <length> invalid value: -cm +PASS Test <length> invalid value: -mm +PASS Test <length> invalid value: -pt +PASS Test <length> invalid value: -pc +PASS Test <length> invalid value: -% +PASS Test <length> invalid value: + +PASS Test <length> invalid value: +em +PASS Test <length> invalid value: +ex +PASS Test <length> invalid value: +px +PASS Test <length> invalid value: +in +PASS Test <length> invalid value: +cm +PASS Test <length> invalid value: +mm +PASS Test <length> invalid value: +pt +PASS Test <length> invalid value: +pc +PASS Test <length> invalid value: +% +PASS Test <length> invalid value: -. +PASS Test <length> invalid value: -.em +PASS Test <length> invalid value: -.ex +PASS Test <length> invalid value: -.px +PASS Test <length> invalid value: -.in +PASS Test <length> invalid value: -.cm +PASS Test <length> invalid value: -.mm +PASS Test <length> invalid value: -.pt +PASS Test <length> invalid value: -.pc +PASS Test <length> invalid value: -.% +PASS Test <length> invalid value: .- +PASS Test <length> invalid value: .-em +PASS Test <length> invalid value: .-ex +PASS Test <length> invalid value: .-px +PASS Test <length> invalid value: .-in +PASS Test <length> invalid value: .-cm +PASS Test <length> invalid value: .-mm +PASS Test <length> invalid value: .-pt +PASS Test <length> invalid value: .-pc +PASS Test <length> invalid value: .-% +PASS Test <length> invalid value: . +PASS Test <length> invalid value: .em +PASS Test <length> invalid value: .ex +PASS Test <length> invalid value: .px +PASS Test <length> invalid value: .in +PASS Test <length> invalid value: .cm +PASS Test <length> invalid value: .mm +PASS Test <length> invalid value: .pt +PASS Test <length> invalid value: .pc +PASS Test <length> invalid value: .% +PASS Test <length> invalid value: +. +PASS Test <length> invalid value: +.em +PASS Test <length> invalid value: +.ex +PASS Test <length> invalid value: +.px +PASS Test <length> invalid value: +.in +PASS Test <length> invalid value: +.cm +PASS Test <length> invalid value: +.mm +PASS Test <length> invalid value: +.pt +PASS Test <length> invalid value: +.pc +PASS Test <length> invalid value: +.% +PASS Test <length> invalid value: .E0 +PASS Test <length> invalid value: .E0em +PASS Test <length> invalid value: .E0ex +PASS Test <length> invalid value: .E0px +PASS Test <length> invalid value: .E0in +PASS Test <length> invalid value: .E0cm +PASS Test <length> invalid value: .E0mm +PASS Test <length> invalid value: .E0pt +PASS Test <length> invalid value: .E0pc +PASS Test <length> invalid value: .E0% +PASS Test <length> invalid value: e1 +PASS Test <length> invalid value: e1em +PASS Test <length> invalid value: e1ex +PASS Test <length> invalid value: e1px +PASS Test <length> invalid value: e1in +PASS Test <length> invalid value: e1cm +PASS Test <length> invalid value: e1mm +PASS Test <length> invalid value: e1pt +PASS Test <length> invalid value: e1pc +PASS Test <length> invalid value: e1% +PASS Test <length> invalid value: e+ +PASS Test <length> invalid value: e+em +PASS Test <length> invalid value: e+ex +PASS Test <length> invalid value: e+px +PASS Test <length> invalid value: e+in +PASS Test <length> invalid value: e+cm +PASS Test <length> invalid value: e+mm +PASS Test <length> invalid value: e+pt +PASS Test <length> invalid value: e+pc +PASS Test <length> invalid value: e+% +PASS Test <length> invalid value: E- +PASS Test <length> invalid value: E-em +PASS Test <length> invalid value: E-ex +PASS Test <length> invalid value: E-px +PASS Test <length> invalid value: E-in +PASS Test <length> invalid value: E-cm +PASS Test <length> invalid value: E-mm +PASS Test <length> invalid value: E-pt +PASS Test <length> invalid value: E-pc +PASS Test <length> invalid value: E-% +PASS Test <length> invalid value: - +PASS Test <length> invalid value: -em +PASS Test <length> invalid value: -ex +PASS Test <length> invalid value: -px +PASS Test <length> invalid value: -in +PASS Test <length> invalid value: -cm +PASS Test <length> invalid value: -mm +PASS Test <length> invalid value: -pt +PASS Test <length> invalid value: -pc +PASS Test <length> invalid value: -% +PASS Test <length> invalid value: + +PASS Test <length> invalid value: +em +PASS Test <length> invalid value: +ex +PASS Test <length> invalid value: +px +PASS Test <length> invalid value: +in +PASS Test <length> invalid value: +cm +PASS Test <length> invalid value: +mm +PASS Test <length> invalid value: +pt +PASS Test <length> invalid value: +pc +PASS Test <length> invalid value: +% +PASS Test <length> invalid value: -. +PASS Test <length> invalid value: -.em +PASS Test <length> invalid value: -.ex +PASS Test <length> invalid value: -.px +PASS Test <length> invalid value: -.in +PASS Test <length> invalid value: -.cm +PASS Test <length> invalid value: -.mm +PASS Test <length> invalid value: -.pt +PASS Test <length> invalid value: -.pc +PASS Test <length> invalid value: -.% +PASS Test <length> invalid value: .- +PASS Test <length> invalid value: .-em +PASS Test <length> invalid value: .-ex +PASS Test <length> invalid value: .-px +PASS Test <length> invalid value: .-in +PASS Test <length> invalid value: .-cm +PASS Test <length> invalid value: .-mm +PASS Test <length> invalid value: .-pt +PASS Test <length> invalid value: .-pc +PASS Test <length> invalid value: .-% +PASS Test <length> invalid value: . +PASS Test <length> invalid value: .em +PASS Test <length> invalid value: .ex +PASS Test <length> invalid value: .px +PASS Test <length> invalid value: .in +PASS Test <length> invalid value: .cm +PASS Test <length> invalid value: .mm +PASS Test <length> invalid value: .pt +PASS Test <length> invalid value: .pc +PASS Test <length> invalid value: .% +PASS Test <length> invalid value: +. +PASS Test <length> invalid value: +.em +PASS Test <length> invalid value: +.ex +PASS Test <length> invalid value: +.px +PASS Test <length> invalid value: +.in +PASS Test <length> invalid value: +.cm +PASS Test <length> invalid value: +.mm +PASS Test <length> invalid value: +.pt +PASS Test <length> invalid value: +.pc +PASS Test <length> invalid value: +.% +PASS Test <length> invalid value: .E0 +PASS Test <length> invalid value: .E0em +PASS Test <length> invalid value: .E0ex +PASS Test <length> invalid value: .E0px +PASS Test <length> invalid value: .E0in +PASS Test <length> invalid value: .E0cm +PASS Test <length> invalid value: .E0mm +PASS Test <length> invalid value: .E0pt +PASS Test <length> invalid value: .E0pc +PASS Test <length> invalid value: .E0% +PASS Test <length> invalid value: e1 +PASS Test <length> invalid value: e1em +PASS Test <length> invalid value: e1ex +PASS Test <length> invalid value: e1px +PASS Test <length> invalid value: e1in +PASS Test <length> invalid value: e1cm +PASS Test <length> invalid value: e1mm +PASS Test <length> invalid value: e1pt +PASS Test <length> invalid value: e1pc +PASS Test <length> invalid value: e1% +PASS Test <length> invalid value: e+\r\n\t +PASS Test <length> invalid value: e+em\r\n\t +PASS Test <length> invalid value: e+ex\r\n\t +PASS Test <length> invalid value: e+px\r\n\t +PASS Test <length> invalid value: e+in\r\n\t +PASS Test <length> invalid value: e+cm\r\n\t +PASS Test <length> invalid value: e+mm\r\n\t +PASS Test <length> invalid value: e+pt\r\n\t +PASS Test <length> invalid value: e+pc\r\n\t +PASS Test <length> invalid value: e+%\r\n\t +PASS Test <length> invalid value: E-\r\n\t +PASS Test <length> invalid value: E-em\r\n\t +PASS Test <length> invalid value: E-ex\r\n\t +PASS Test <length> invalid value: E-px\r\n\t +PASS Test <length> invalid value: E-in\r\n\t +PASS Test <length> invalid value: E-cm\r\n\t +PASS Test <length> invalid value: E-mm\r\n\t +PASS Test <length> invalid value: E-pt\r\n\t +PASS Test <length> invalid value: E-pc\r\n\t +PASS Test <length> invalid value: E-%\r\n\t +PASS Test <length> invalid value: -\r\n\t +PASS Test <length> invalid value: -em\r\n\t +PASS Test <length> invalid value: -ex\r\n\t +PASS Test <length> invalid value: -px\r\n\t +PASS Test <length> invalid value: -in\r\n\t +PASS Test <length> invalid value: -cm\r\n\t +PASS Test <length> invalid value: -mm\r\n\t +PASS Test <length> invalid value: -pt\r\n\t +PASS Test <length> invalid value: -pc\r\n\t +PASS Test <length> invalid value: -%\r\n\t +PASS Test <length> invalid value: +\r\n\t +PASS Test <length> invalid value: +em\r\n\t +PASS Test <length> invalid value: +ex\r\n\t +PASS Test <length> invalid value: +px\r\n\t +PASS Test <length> invalid value: +in\r\n\t +PASS Test <length> invalid value: +cm\r\n\t +PASS Test <length> invalid value: +mm\r\n\t +PASS Test <length> invalid value: +pt\r\n\t +PASS Test <length> invalid value: +pc\r\n\t +PASS Test <length> invalid value: +%\r\n\t +PASS Test <length> invalid value: -.\r\n\t +PASS Test <length> invalid value: -.em\r\n\t +PASS Test <length> invalid value: -.ex\r\n\t +PASS Test <length> invalid value: -.px\r\n\t +PASS Test <length> invalid value: -.in\r\n\t +PASS Test <length> invalid value: -.cm\r\n\t +PASS Test <length> invalid value: -.mm\r\n\t +PASS Test <length> invalid value: -.pt\r\n\t +PASS Test <length> invalid value: -.pc\r\n\t +PASS Test <length> invalid value: -.%\r\n\t +PASS Test <length> invalid value: .-\r\n\t +PASS Test <length> invalid value: .-em\r\n\t +PASS Test <length> invalid value: .-ex\r\n\t +PASS Test <length> invalid value: .-px\r\n\t +PASS Test <length> invalid value: .-in\r\n\t +PASS Test <length> invalid value: .-cm\r\n\t +PASS Test <length> invalid value: .-mm\r\n\t +PASS Test <length> invalid value: .-pt\r\n\t +PASS Test <length> invalid value: .-pc\r\n\t +PASS Test <length> invalid value: .-%\r\n\t +PASS Test <length> invalid value: .\r\n\t +PASS Test <length> invalid value: .em\r\n\t +PASS Test <length> invalid value: .ex\r\n\t +PASS Test <length> invalid value: .px\r\n\t +PASS Test <length> invalid value: .in\r\n\t +PASS Test <length> invalid value: .cm\r\n\t +PASS Test <length> invalid value: .mm\r\n\t +PASS Test <length> invalid value: .pt\r\n\t +PASS Test <length> invalid value: .pc\r\n\t +PASS Test <length> invalid value: .%\r\n\t +PASS Test <length> invalid value: +.\r\n\t +PASS Test <length> invalid value: +.em\r\n\t +PASS Test <length> invalid value: +.ex\r\n\t +PASS Test <length> invalid value: +.px\r\n\t +PASS Test <length> invalid value: +.in\r\n\t +PASS Test <length> invalid value: +.cm\r\n\t +PASS Test <length> invalid value: +.mm\r\n\t +PASS Test <length> invalid value: +.pt\r\n\t +PASS Test <length> invalid value: +.pc\r\n\t +PASS Test <length> invalid value: +.%\r\n\t +PASS Test <length> invalid value: .E0\r\n\t +PASS Test <length> invalid value: .E0em\r\n\t +PASS Test <length> invalid value: .E0ex\r\n\t +PASS Test <length> invalid value: .E0px\r\n\t +PASS Test <length> invalid value: .E0in\r\n\t +PASS Test <length> invalid value: .E0cm\r\n\t +PASS Test <length> invalid value: .E0mm\r\n\t +PASS Test <length> invalid value: .E0pt\r\n\t +PASS Test <length> invalid value: .E0pc\r\n\t +PASS Test <length> invalid value: .E0%\r\n\t +PASS Test <length> invalid value: e1\r\n\t +PASS Test <length> invalid value: e1em\r\n\t +PASS Test <length> invalid value: e1ex\r\n\t +PASS Test <length> invalid value: e1px\r\n\t +PASS Test <length> invalid value: e1in\r\n\t +PASS Test <length> invalid value: e1cm\r\n\t +PASS Test <length> invalid value: e1mm\r\n\t +PASS Test <length> invalid value: e1pt\r\n\t +PASS Test <length> invalid value: e1pc\r\n\t +PASS Test <length> invalid value: e1%\r\n\t +PASS Test <length> invalid value: e+\f +PASS Test <length> invalid value: e+em\f +PASS Test <length> invalid value: e+ex\f +PASS Test <length> invalid value: e+px\f +PASS Test <length> invalid value: e+in\f +PASS Test <length> invalid value: e+cm\f +PASS Test <length> invalid value: e+mm\f +PASS Test <length> invalid value: e+pt\f +PASS Test <length> invalid value: e+pc\f +PASS Test <length> invalid value: e+%\f +PASS Test <length> invalid value: E-\f +PASS Test <length> invalid value: E-em\f +PASS Test <length> invalid value: E-ex\f +PASS Test <length> invalid value: E-px\f +PASS Test <length> invalid value: E-in\f +PASS Test <length> invalid value: E-cm\f +PASS Test <length> invalid value: E-mm\f +PASS Test <length> invalid value: E-pt\f +PASS Test <length> invalid value: E-pc\f +PASS Test <length> invalid value: E-%\f +PASS Test <length> invalid value: -\f +PASS Test <length> invalid value: -em\f +PASS Test <length> invalid value: -ex\f +PASS Test <length> invalid value: -px\f +PASS Test <length> invalid value: -in\f +PASS Test <length> invalid value: -cm\f +PASS Test <length> invalid value: -mm\f +PASS Test <length> invalid value: -pt\f +PASS Test <length> invalid value: -pc\f +PASS Test <length> invalid value: -%\f +PASS Test <length> invalid value: +\f +PASS Test <length> invalid value: +em\f +PASS Test <length> invalid value: +ex\f +PASS Test <length> invalid value: +px\f +PASS Test <length> invalid value: +in\f +PASS Test <length> invalid value: +cm\f +PASS Test <length> invalid value: +mm\f +PASS Test <length> invalid value: +pt\f +PASS Test <length> invalid value: +pc\f +PASS Test <length> invalid value: +%\f +PASS Test <length> invalid value: -.\f +PASS Test <length> invalid value: -.em\f +PASS Test <length> invalid value: -.ex\f +PASS Test <length> invalid value: -.px\f +PASS Test <length> invalid value: -.in\f +PASS Test <length> invalid value: -.cm\f +PASS Test <length> invalid value: -.mm\f +PASS Test <length> invalid value: -.pt\f +PASS Test <length> invalid value: -.pc\f +PASS Test <length> invalid value: -.%\f +PASS Test <length> invalid value: .-\f +PASS Test <length> invalid value: .-em\f +PASS Test <length> invalid value: .-ex\f +PASS Test <length> invalid value: .-px\f +PASS Test <length> invalid value: .-in\f +PASS Test <length> invalid value: .-cm\f +PASS Test <length> invalid value: .-mm\f +PASS Test <length> invalid value: .-pt\f +PASS Test <length> invalid value: .-pc\f +PASS Test <length> invalid value: .-%\f +PASS Test <length> invalid value: .\f +PASS Test <length> invalid value: .em\f +PASS Test <length> invalid value: .ex\f +PASS Test <length> invalid value: .px\f +PASS Test <length> invalid value: .in\f +PASS Test <length> invalid value: .cm\f +PASS Test <length> invalid value: .mm\f +PASS Test <length> invalid value: .pt\f +PASS Test <length> invalid value: .pc\f +PASS Test <length> invalid value: .%\f +PASS Test <length> invalid value: +.\f +PASS Test <length> invalid value: +.em\f +PASS Test <length> invalid value: +.ex\f +PASS Test <length> invalid value: +.px\f +PASS Test <length> invalid value: +.in\f +PASS Test <length> invalid value: +.cm\f +PASS Test <length> invalid value: +.mm\f +PASS Test <length> invalid value: +.pt\f +PASS Test <length> invalid value: +.pc\f +PASS Test <length> invalid value: +.%\f +PASS Test <length> invalid value: .E0\f +PASS Test <length> invalid value: .E0em\f +PASS Test <length> invalid value: .E0ex\f +PASS Test <length> invalid value: .E0px\f +PASS Test <length> invalid value: .E0in\f +PASS Test <length> invalid value: .E0cm\f +PASS Test <length> invalid value: .E0mm\f +PASS Test <length> invalid value: .E0pt\f +PASS Test <length> invalid value: .E0pc\f +PASS Test <length> invalid value: .E0%\f +PASS Test <length> invalid value: e1\f +PASS Test <length> invalid value: e1em\f +PASS Test <length> invalid value: e1ex\f +PASS Test <length> invalid value: e1px\f +PASS Test <length> invalid value: e1in\f +PASS Test <length> invalid value: e1cm\f +PASS Test <length> invalid value: e1mm\f +PASS Test <length> invalid value: e1pt\f +PASS Test <length> invalid value: e1pc\f +PASS Test <length> invalid value: e1%\f +PASS Test <length> invalid value: \r\n\t e+ +PASS Test <length> invalid value: \r\n\t e+em +PASS Test <length> invalid value: \r\n\t e+ex +PASS Test <length> invalid value: \r\n\t e+px +PASS Test <length> invalid value: \r\n\t e+in +PASS Test <length> invalid value: \r\n\t e+cm +PASS Test <length> invalid value: \r\n\t e+mm +PASS Test <length> invalid value: \r\n\t e+pt +PASS Test <length> invalid value: \r\n\t e+pc +PASS Test <length> invalid value: \r\n\t e+% +PASS Test <length> invalid value: \r\n\t E- +PASS Test <length> invalid value: \r\n\t E-em +PASS Test <length> invalid value: \r\n\t E-ex +PASS Test <length> invalid value: \r\n\t E-px +PASS Test <length> invalid value: \r\n\t E-in +PASS Test <length> invalid value: \r\n\t E-cm +PASS Test <length> invalid value: \r\n\t E-mm +PASS Test <length> invalid value: \r\n\t E-pt +PASS Test <length> invalid value: \r\n\t E-pc +PASS Test <length> invalid value: \r\n\t E-% +PASS Test <length> invalid value: \r\n\t - +PASS Test <length> invalid value: \r\n\t -em +PASS Test <length> invalid value: \r\n\t -ex +PASS Test <length> invalid value: \r\n\t -px +PASS Test <length> invalid value: \r\n\t -in +PASS Test <length> invalid value: \r\n\t -cm +PASS Test <length> invalid value: \r\n\t -mm +PASS Test <length> invalid value: \r\n\t -pt +PASS Test <length> invalid value: \r\n\t -pc +PASS Test <length> invalid value: \r\n\t -% +PASS Test <length> invalid value: \r\n\t + +PASS Test <length> invalid value: \r\n\t +em +PASS Test <length> invalid value: \r\n\t +ex +PASS Test <length> invalid value: \r\n\t +px +PASS Test <length> invalid value: \r\n\t +in +PASS Test <length> invalid value: \r\n\t +cm +PASS Test <length> invalid value: \r\n\t +mm +PASS Test <length> invalid value: \r\n\t +pt +PASS Test <length> invalid value: \r\n\t +pc +PASS Test <length> invalid value: \r\n\t +% +PASS Test <length> invalid value: \r\n\t -. +PASS Test <length> invalid value: \r\n\t -.em +PASS Test <length> invalid value: \r\n\t -.ex +PASS Test <length> invalid value: \r\n\t -.px +PASS Test <length> invalid value: \r\n\t -.in +PASS Test <length> invalid value: \r\n\t -.cm +PASS Test <length> invalid value: \r\n\t -.mm +PASS Test <length> invalid value: \r\n\t -.pt +PASS Test <length> invalid value: \r\n\t -.pc +PASS Test <length> invalid value: \r\n\t -.% +PASS Test <length> invalid value: \r\n\t .- +PASS Test <length> invalid value: \r\n\t .-em +PASS Test <length> invalid value: \r\n\t .-ex +PASS Test <length> invalid value: \r\n\t .-px +PASS Test <length> invalid value: \r\n\t .-in +PASS Test <length> invalid value: \r\n\t .-cm +PASS Test <length> invalid value: \r\n\t .-mm +PASS Test <length> invalid value: \r\n\t .-pt +PASS Test <length> invalid value: \r\n\t .-pc +PASS Test <length> invalid value: \r\n\t .-% +PASS Test <length> invalid value: \r\n\t . +PASS Test <length> invalid value: \r\n\t .em +PASS Test <length> invalid value: \r\n\t .ex +PASS Test <length> invalid value: \r\n\t .px +PASS Test <length> invalid value: \r\n\t .in +PASS Test <length> invalid value: \r\n\t .cm +PASS Test <length> invalid value: \r\n\t .mm +PASS Test <length> invalid value: \r\n\t .pt +PASS Test <length> invalid value: \r\n\t .pc +PASS Test <length> invalid value: \r\n\t .% +PASS Test <length> invalid value: \r\n\t +. +PASS Test <length> invalid value: \r\n\t +.em +PASS Test <length> invalid value: \r\n\t +.ex +PASS Test <length> invalid value: \r\n\t +.px +PASS Test <length> invalid value: \r\n\t +.in +PASS Test <length> invalid value: \r\n\t +.cm +PASS Test <length> invalid value: \r\n\t +.mm +PASS Test <length> invalid value: \r\n\t +.pt +PASS Test <length> invalid value: \r\n\t +.pc +PASS Test <length> invalid value: \r\n\t +.% +PASS Test <length> invalid value: \r\n\t .E0 +PASS Test <length> invalid value: \r\n\t .E0em +PASS Test <length> invalid value: \r\n\t .E0ex +PASS Test <length> invalid value: \r\n\t .E0px +PASS Test <length> invalid value: \r\n\t .E0in +PASS Test <length> invalid value: \r\n\t .E0cm +PASS Test <length> invalid value: \r\n\t .E0mm +PASS Test <length> invalid value: \r\n\t .E0pt +PASS Test <length> invalid value: \r\n\t .E0pc +PASS Test <length> invalid value: \r\n\t .E0% +PASS Test <length> invalid value: \r\n\t e1 +PASS Test <length> invalid value: \r\n\t e1em +PASS Test <length> invalid value: \r\n\t e1ex +PASS Test <length> invalid value: \r\n\t e1px +PASS Test <length> invalid value: \r\n\t e1in +PASS Test <length> invalid value: \r\n\t e1cm +PASS Test <length> invalid value: \r\n\t e1mm +PASS Test <length> invalid value: \r\n\t e1pt +PASS Test <length> invalid value: \r\n\t e1pc +PASS Test <length> invalid value: \r\n\t e1% +PASS Test <length> invalid value: \r\n\t e+ +PASS Test <length> invalid value: \r\n\t e+em +PASS Test <length> invalid value: \r\n\t e+ex +PASS Test <length> invalid value: \r\n\t e+px +PASS Test <length> invalid value: \r\n\t e+in +PASS Test <length> invalid value: \r\n\t e+cm +PASS Test <length> invalid value: \r\n\t e+mm +PASS Test <length> invalid value: \r\n\t e+pt +PASS Test <length> invalid value: \r\n\t e+pc +PASS Test <length> invalid value: \r\n\t e+% +PASS Test <length> invalid value: \r\n\t E- +PASS Test <length> invalid value: \r\n\t E-em +PASS Test <length> invalid value: \r\n\t E-ex +PASS Test <length> invalid value: \r\n\t E-px +PASS Test <length> invalid value: \r\n\t E-in +PASS Test <length> invalid value: \r\n\t E-cm +PASS Test <length> invalid value: \r\n\t E-mm +PASS Test <length> invalid value: \r\n\t E-pt +PASS Test <length> invalid value: \r\n\t E-pc +PASS Test <length> invalid value: \r\n\t E-% +PASS Test <length> invalid value: \r\n\t - +PASS Test <length> invalid value: \r\n\t -em +PASS Test <length> invalid value: \r\n\t -ex +PASS Test <length> invalid value: \r\n\t -px +PASS Test <length> invalid value: \r\n\t -in +PASS Test <length> invalid value: \r\n\t -cm +PASS Test <length> invalid value: \r\n\t -mm +PASS Test <length> invalid value: \r\n\t -pt +PASS Test <length> invalid value: \r\n\t -pc +PASS Test <length> invalid value: \r\n\t -% +PASS Test <length> invalid value: \r\n\t + +PASS Test <length> invalid value: \r\n\t +em +PASS Test <length> invalid value: \r\n\t +ex +PASS Test <length> invalid value: \r\n\t +px +PASS Test <length> invalid value: \r\n\t +in +PASS Test <length> invalid value: \r\n\t +cm +PASS Test <length> invalid value: \r\n\t +mm +PASS Test <length> invalid value: \r\n\t +pt +PASS Test <length> invalid value: \r\n\t +pc +PASS Test <length> invalid value: \r\n\t +% +PASS Test <length> invalid value: \r\n\t -. +PASS Test <length> invalid value: \r\n\t -.em +PASS Test <length> invalid value: \r\n\t -.ex +PASS Test <length> invalid value: \r\n\t -.px +PASS Test <length> invalid value: \r\n\t -.in +PASS Test <length> invalid value: \r\n\t -.cm +PASS Test <length> invalid value: \r\n\t -.mm +PASS Test <length> invalid value: \r\n\t -.pt +PASS Test <length> invalid value: \r\n\t -.pc +PASS Test <length> invalid value: \r\n\t -.% +PASS Test <length> invalid value: \r\n\t .- +PASS Test <length> invalid value: \r\n\t .-em +PASS Test <length> invalid value: \r\n\t .-ex +PASS Test <length> invalid value: \r\n\t .-px +PASS Test <length> invalid value: \r\n\t .-in +PASS Test <length> invalid value: \r\n\t .-cm +PASS Test <length> invalid value: \r\n\t .-mm +PASS Test <length> invalid value: \r\n\t .-pt +PASS Test <length> invalid value: \r\n\t .-pc +PASS Test <length> invalid value: \r\n\t .-% +PASS Test <length> invalid value: \r\n\t . +PASS Test <length> invalid value: \r\n\t .em +PASS Test <length> invalid value: \r\n\t .ex +PASS Test <length> invalid value: \r\n\t .px +PASS Test <length> invalid value: \r\n\t .in +PASS Test <length> invalid value: \r\n\t .cm +PASS Test <length> invalid value: \r\n\t .mm +PASS Test <length> invalid value: \r\n\t .pt +PASS Test <length> invalid value: \r\n\t .pc +PASS Test <length> invalid value: \r\n\t .% +PASS Test <length> invalid value: \r\n\t +. +PASS Test <length> invalid value: \r\n\t +.em +PASS Test <length> invalid value: \r\n\t +.ex +PASS Test <length> invalid value: \r\n\t +.px +PASS Test <length> invalid value: \r\n\t +.in +PASS Test <length> invalid value: \r\n\t +.cm +PASS Test <length> invalid value: \r\n\t +.mm +PASS Test <length> invalid value: \r\n\t +.pt +PASS Test <length> invalid value: \r\n\t +.pc +PASS Test <length> invalid value: \r\n\t +.% +PASS Test <length> invalid value: \r\n\t .E0 +PASS Test <length> invalid value: \r\n\t .E0em +PASS Test <length> invalid value: \r\n\t .E0ex +PASS Test <length> invalid value: \r\n\t .E0px +PASS Test <length> invalid value: \r\n\t .E0in +PASS Test <length> invalid value: \r\n\t .E0cm +PASS Test <length> invalid value: \r\n\t .E0mm +PASS Test <length> invalid value: \r\n\t .E0pt +PASS Test <length> invalid value: \r\n\t .E0pc +PASS Test <length> invalid value: \r\n\t .E0% +PASS Test <length> invalid value: \r\n\t e1 +PASS Test <length> invalid value: \r\n\t e1em +PASS Test <length> invalid value: \r\n\t e1ex +PASS Test <length> invalid value: \r\n\t e1px +PASS Test <length> invalid value: \r\n\t e1in +PASS Test <length> invalid value: \r\n\t e1cm +PASS Test <length> invalid value: \r\n\t e1mm +PASS Test <length> invalid value: \r\n\t e1pt +PASS Test <length> invalid value: \r\n\t e1pc +PASS Test <length> invalid value: \r\n\t e1% +PASS Test <length> invalid value: \r\n\t e+ +PASS Test <length> invalid value: \r\n\t e+em +PASS Test <length> invalid value: \r\n\t e+ex +PASS Test <length> invalid value: \r\n\t e+px +PASS Test <length> invalid value: \r\n\t e+in +PASS Test <length> invalid value: \r\n\t e+cm +PASS Test <length> invalid value: \r\n\t e+mm +PASS Test <length> invalid value: \r\n\t e+pt +PASS Test <length> invalid value: \r\n\t e+pc +PASS Test <length> invalid value: \r\n\t e+% +PASS Test <length> invalid value: \r\n\t E- +PASS Test <length> invalid value: \r\n\t E-em +PASS Test <length> invalid value: \r\n\t E-ex +PASS Test <length> invalid value: \r\n\t E-px +PASS Test <length> invalid value: \r\n\t E-in +PASS Test <length> invalid value: \r\n\t E-cm +PASS Test <length> invalid value: \r\n\t E-mm +PASS Test <length> invalid value: \r\n\t E-pt +PASS Test <length> invalid value: \r\n\t E-pc +PASS Test <length> invalid value: \r\n\t E-% +PASS Test <length> invalid value: \r\n\t - +PASS Test <length> invalid value: \r\n\t -em +PASS Test <length> invalid value: \r\n\t -ex +PASS Test <length> invalid value: \r\n\t -px +PASS Test <length> invalid value: \r\n\t -in +PASS Test <length> invalid value: \r\n\t -cm +PASS Test <length> invalid value: \r\n\t -mm +PASS Test <length> invalid value: \r\n\t -pt +PASS Test <length> invalid value: \r\n\t -pc +PASS Test <length> invalid value: \r\n\t -% +PASS Test <length> invalid value: \r\n\t + +PASS Test <length> invalid value: \r\n\t +em +PASS Test <length> invalid value: \r\n\t +ex +PASS Test <length> invalid value: \r\n\t +px +PASS Test <length> invalid value: \r\n\t +in +PASS Test <length> invalid value: \r\n\t +cm +PASS Test <length> invalid value: \r\n\t +mm +PASS Test <length> invalid value: \r\n\t +pt +PASS Test <length> invalid value: \r\n\t +pc +PASS Test <length> invalid value: \r\n\t +% +PASS Test <length> invalid value: \r\n\t -. +PASS Test <length> invalid value: \r\n\t -.em +PASS Test <length> invalid value: \r\n\t -.ex +PASS Test <length> invalid value: \r\n\t -.px +PASS Test <length> invalid value: \r\n\t -.in +PASS Test <length> invalid value: \r\n\t -.cm +PASS Test <length> invalid value: \r\n\t -.mm +PASS Test <length> invalid value: \r\n\t -.pt +PASS Test <length> invalid value: \r\n\t -.pc +PASS Test <length> invalid value: \r\n\t -.% +PASS Test <length> invalid value: \r\n\t .- +PASS Test <length> invalid value: \r\n\t .-em +PASS Test <length> invalid value: \r\n\t .-ex +PASS Test <length> invalid value: \r\n\t .-px +PASS Test <length> invalid value: \r\n\t .-in +PASS Test <length> invalid value: \r\n\t .-cm +PASS Test <length> invalid value: \r\n\t .-mm +PASS Test <length> invalid value: \r\n\t .-pt +PASS Test <length> invalid value: \r\n\t .-pc +PASS Test <length> invalid value: \r\n\t .-% +PASS Test <length> invalid value: \r\n\t . +PASS Test <length> invalid value: \r\n\t .em +PASS Test <length> invalid value: \r\n\t .ex +PASS Test <length> invalid value: \r\n\t .px +PASS Test <length> invalid value: \r\n\t .in +PASS Test <length> invalid value: \r\n\t .cm +PASS Test <length> invalid value: \r\n\t .mm +PASS Test <length> invalid value: \r\n\t .pt +PASS Test <length> invalid value: \r\n\t .pc +PASS Test <length> invalid value: \r\n\t .% +PASS Test <length> invalid value: \r\n\t +. +PASS Test <length> invalid value: \r\n\t +.em +PASS Test <length> invalid value: \r\n\t +.ex +PASS Test <length> invalid value: \r\n\t +.px +PASS Test <length> invalid value: \r\n\t +.in +PASS Test <length> invalid value: \r\n\t +.cm +PASS Test <length> invalid value: \r\n\t +.mm +PASS Test <length> invalid value: \r\n\t +.pt +PASS Test <length> invalid value: \r\n\t +.pc +PASS Test <length> invalid value: \r\n\t +.% +PASS Test <length> invalid value: \r\n\t .E0 +PASS Test <length> invalid value: \r\n\t .E0em +PASS Test <length> invalid value: \r\n\t .E0ex +PASS Test <length> invalid value: \r\n\t .E0px +PASS Test <length> invalid value: \r\n\t .E0in +PASS Test <length> invalid value: \r\n\t .E0cm +PASS Test <length> invalid value: \r\n\t .E0mm +PASS Test <length> invalid value: \r\n\t .E0pt +PASS Test <length> invalid value: \r\n\t .E0pc +PASS Test <length> invalid value: \r\n\t .E0% +PASS Test <length> invalid value: \r\n\t e1 +PASS Test <length> invalid value: \r\n\t e1em +PASS Test <length> invalid value: \r\n\t e1ex +PASS Test <length> invalid value: \r\n\t e1px +PASS Test <length> invalid value: \r\n\t e1in +PASS Test <length> invalid value: \r\n\t e1cm +PASS Test <length> invalid value: \r\n\t e1mm +PASS Test <length> invalid value: \r\n\t e1pt +PASS Test <length> invalid value: \r\n\t e1pc +PASS Test <length> invalid value: \r\n\t e1% +PASS Test <length> invalid value: \r\n\t e+\r\n\t +PASS Test <length> invalid value: \r\n\t e+em\r\n\t +PASS Test <length> invalid value: \r\n\t e+ex\r\n\t +PASS Test <length> invalid value: \r\n\t e+px\r\n\t +PASS Test <length> invalid value: \r\n\t e+in\r\n\t +PASS Test <length> invalid value: \r\n\t e+cm\r\n\t +PASS Test <length> invalid value: \r\n\t e+mm\r\n\t +PASS Test <length> invalid value: \r\n\t e+pt\r\n\t +PASS Test <length> invalid value: \r\n\t e+pc\r\n\t +PASS Test <length> invalid value: \r\n\t e+%\r\n\t +PASS Test <length> invalid value: \r\n\t E-\r\n\t +PASS Test <length> invalid value: \r\n\t E-em\r\n\t +PASS Test <length> invalid value: \r\n\t E-ex\r\n\t +PASS Test <length> invalid value: \r\n\t E-px\r\n\t +PASS Test <length> invalid value: \r\n\t E-in\r\n\t +PASS Test <length> invalid value: \r\n\t E-cm\r\n\t +PASS Test <length> invalid value: \r\n\t E-mm\r\n\t +PASS Test <length> invalid value: \r\n\t E-pt\r\n\t +PASS Test <length> invalid value: \r\n\t E-pc\r\n\t +PASS Test <length> invalid value: \r\n\t E-%\r\n\t +PASS Test <length> invalid value: \r\n\t -\r\n\t +PASS Test <length> invalid value: \r\n\t -em\r\n\t +PASS Test <length> invalid value: \r\n\t -ex\r\n\t +PASS Test <length> invalid value: \r\n\t -px\r\n\t +PASS Test <length> invalid value: \r\n\t -in\r\n\t +PASS Test <length> invalid value: \r\n\t -cm\r\n\t +PASS Test <length> invalid value: \r\n\t -mm\r\n\t +PASS Test <length> invalid value: \r\n\t -pt\r\n\t +PASS Test <length> invalid value: \r\n\t -pc\r\n\t +PASS Test <length> invalid value: \r\n\t -%\r\n\t +PASS Test <length> invalid value: \r\n\t +\r\n\t +PASS Test <length> invalid value: \r\n\t +em\r\n\t +PASS Test <length> invalid value: \r\n\t +ex\r\n\t +PASS Test <length> invalid value: \r\n\t +px\r\n\t +PASS Test <length> invalid value: \r\n\t +in\r\n\t +PASS Test <length> invalid value: \r\n\t +cm\r\n\t +PASS Test <length> invalid value: \r\n\t +mm\r\n\t +PASS Test <length> invalid value: \r\n\t +pt\r\n\t +PASS Test <length> invalid value: \r\n\t +pc\r\n\t +PASS Test <length> invalid value: \r\n\t +%\r\n\t +PASS Test <length> invalid value: \r\n\t -.\r\n\t +PASS Test <length> invalid value: \r\n\t -.em\r\n\t +PASS Test <length> invalid value: \r\n\t -.ex\r\n\t +PASS Test <length> invalid value: \r\n\t -.px\r\n\t +PASS Test <length> invalid value: \r\n\t -.in\r\n\t +PASS Test <length> invalid value: \r\n\t -.cm\r\n\t +PASS Test <length> invalid value: \r\n\t -.mm\r\n\t +PASS Test <length> invalid value: \r\n\t -.pt\r\n\t +PASS Test <length> invalid value: \r\n\t -.pc\r\n\t +PASS Test <length> invalid value: \r\n\t -.%\r\n\t +PASS Test <length> invalid value: \r\n\t .-\r\n\t +PASS Test <length> invalid value: \r\n\t .-em\r\n\t +PASS Test <length> invalid value: \r\n\t .-ex\r\n\t +PASS Test <length> invalid value: \r\n\t .-px\r\n\t +PASS Test <length> invalid value: \r\n\t .-in\r\n\t +PASS Test <length> invalid value: \r\n\t .-cm\r\n\t +PASS Test <length> invalid value: \r\n\t .-mm\r\n\t +PASS Test <length> invalid value: \r\n\t .-pt\r\n\t +PASS Test <length> invalid value: \r\n\t .-pc\r\n\t +PASS Test <length> invalid value: \r\n\t .-%\r\n\t +PASS Test <length> invalid value: \r\n\t .\r\n\t +PASS Test <length> invalid value: \r\n\t .em\r\n\t +PASS Test <length> invalid value: \r\n\t .ex\r\n\t +PASS Test <length> invalid value: \r\n\t .px\r\n\t +PASS Test <length> invalid value: \r\n\t .in\r\n\t +PASS Test <length> invalid value: \r\n\t .cm\r\n\t +PASS Test <length> invalid value: \r\n\t .mm\r\n\t +PASS Test <length> invalid value: \r\n\t .pt\r\n\t +PASS Test <length> invalid value: \r\n\t .pc\r\n\t +PASS Test <length> invalid value: \r\n\t .%\r\n\t +PASS Test <length> invalid value: \r\n\t +.\r\n\t +PASS Test <length> invalid value: \r\n\t +.em\r\n\t +PASS Test <length> invalid value: \r\n\t +.ex\r\n\t +PASS Test <length> invalid value: \r\n\t +.px\r\n\t +PASS Test <length> invalid value: \r\n\t +.in\r\n\t +PASS Test <length> invalid value: \r\n\t +.cm\r\n\t +PASS Test <length> invalid value: \r\n\t +.mm\r\n\t +PASS Test <length> invalid value: \r\n\t +.pt\r\n\t +PASS Test <length> invalid value: \r\n\t +.pc\r\n\t +PASS Test <length> invalid value: \r\n\t +.%\r\n\t +PASS Test <length> invalid value: \r\n\t .E0\r\n\t +PASS Test <length> invalid value: \r\n\t .E0em\r\n\t +PASS Test <length> invalid value: \r\n\t .E0ex\r\n\t +PASS Test <length> invalid value: \r\n\t .E0px\r\n\t +PASS Test <length> invalid value: \r\n\t .E0in\r\n\t +PASS Test <length> invalid value: \r\n\t .E0cm\r\n\t +PASS Test <length> invalid value: \r\n\t .E0mm\r\n\t +PASS Test <length> invalid value: \r\n\t .E0pt\r\n\t +PASS Test <length> invalid value: \r\n\t .E0pc\r\n\t +PASS Test <length> invalid value: \r\n\t .E0%\r\n\t +PASS Test <length> invalid value: \r\n\t e1\r\n\t +PASS Test <length> invalid value: \r\n\t e1em\r\n\t +PASS Test <length> invalid value: \r\n\t e1ex\r\n\t +PASS Test <length> invalid value: \r\n\t e1px\r\n\t +PASS Test <length> invalid value: \r\n\t e1in\r\n\t +PASS Test <length> invalid value: \r\n\t e1cm\r\n\t +PASS Test <length> invalid value: \r\n\t e1mm\r\n\t +PASS Test <length> invalid value: \r\n\t e1pt\r\n\t +PASS Test <length> invalid value: \r\n\t e1pc\r\n\t +PASS Test <length> invalid value: \r\n\t e1%\r\n\t +PASS Test <length> invalid value: \r\n\t e+\f +PASS Test <length> invalid value: \r\n\t e+em\f +PASS Test <length> invalid value: \r\n\t e+ex\f +PASS Test <length> invalid value: \r\n\t e+px\f +PASS Test <length> invalid value: \r\n\t e+in\f +PASS Test <length> invalid value: \r\n\t e+cm\f +PASS Test <length> invalid value: \r\n\t e+mm\f +PASS Test <length> invalid value: \r\n\t e+pt\f +PASS Test <length> invalid value: \r\n\t e+pc\f +PASS Test <length> invalid value: \r\n\t e+%\f +PASS Test <length> invalid value: \r\n\t E-\f +PASS Test <length> invalid value: \r\n\t E-em\f +PASS Test <length> invalid value: \r\n\t E-ex\f +PASS Test <length> invalid value: \r\n\t E-px\f +PASS Test <length> invalid value: \r\n\t E-in\f +PASS Test <length> invalid value: \r\n\t E-cm\f +PASS Test <length> invalid value: \r\n\t E-mm\f +PASS Test <length> invalid value: \r\n\t E-pt\f +PASS Test <length> invalid value: \r\n\t E-pc\f +PASS Test <length> invalid value: \r\n\t E-%\f +PASS Test <length> invalid value: \r\n\t -\f +PASS Test <length> invalid value: \r\n\t -em\f +PASS Test <length> invalid value: \r\n\t -ex\f +PASS Test <length> invalid value: \r\n\t -px\f +PASS Test <length> invalid value: \r\n\t -in\f +PASS Test <length> invalid value: \r\n\t -cm\f +PASS Test <length> invalid value: \r\n\t -mm\f +PASS Test <length> invalid value: \r\n\t -pt\f +PASS Test <length> invalid value: \r\n\t -pc\f +PASS Test <length> invalid value: \r\n\t -%\f +PASS Test <length> invalid value: \r\n\t +\f +PASS Test <length> invalid value: \r\n\t +em\f +PASS Test <length> invalid value: \r\n\t +ex\f +PASS Test <length> invalid value: \r\n\t +px\f +PASS Test <length> invalid value: \r\n\t +in\f +PASS Test <length> invalid value: \r\n\t +cm\f +PASS Test <length> invalid value: \r\n\t +mm\f +PASS Test <length> invalid value: \r\n\t +pt\f +PASS Test <length> invalid value: \r\n\t +pc\f +PASS Test <length> invalid value: \r\n\t +%\f +PASS Test <length> invalid value: \r\n\t -.\f +PASS Test <length> invalid value: \r\n\t -.em\f +PASS Test <length> invalid value: \r\n\t -.ex\f +PASS Test <length> invalid value: \r\n\t -.px\f +PASS Test <length> invalid value: \r\n\t -.in\f +PASS Test <length> invalid value: \r\n\t -.cm\f +PASS Test <length> invalid value: \r\n\t -.mm\f +PASS Test <length> invalid value: \r\n\t -.pt\f +PASS Test <length> invalid value: \r\n\t -.pc\f +PASS Test <length> invalid value: \r\n\t -.%\f +PASS Test <length> invalid value: \r\n\t .-\f +PASS Test <length> invalid value: \r\n\t .-em\f +PASS Test <length> invalid value: \r\n\t .-ex\f +PASS Test <length> invalid value: \r\n\t .-px\f +PASS Test <length> invalid value: \r\n\t .-in\f +PASS Test <length> invalid value: \r\n\t .-cm\f +PASS Test <length> invalid value: \r\n\t .-mm\f +PASS Test <length> invalid value: \r\n\t .-pt\f +PASS Test <length> invalid value: \r\n\t .-pc\f +PASS Test <length> invalid value: \r\n\t .-%\f +PASS Test <length> invalid value: \r\n\t .\f +PASS Test <length> invalid value: \r\n\t .em\f +PASS Test <length> invalid value: \r\n\t .ex\f +PASS Test <length> invalid value: \r\n\t .px\f +PASS Test <length> invalid value: \r\n\t .in\f +PASS Test <length> invalid value: \r\n\t .cm\f +PASS Test <length> invalid value: \r\n\t .mm\f +PASS Test <length> invalid value: \r\n\t .pt\f +PASS Test <length> invalid value: \r\n\t .pc\f +PASS Test <length> invalid value: \r\n\t .%\f +PASS Test <length> invalid value: \r\n\t +.\f +PASS Test <length> invalid value: \r\n\t +.em\f +PASS Test <length> invalid value: \r\n\t +.ex\f +PASS Test <length> invalid value: \r\n\t +.px\f +PASS Test <length> invalid value: \r\n\t +.in\f +PASS Test <length> invalid value: \r\n\t +.cm\f +PASS Test <length> invalid value: \r\n\t +.mm\f +PASS Test <length> invalid value: \r\n\t +.pt\f +PASS Test <length> invalid value: \r\n\t +.pc\f +PASS Test <length> invalid value: \r\n\t +.%\f +PASS Test <length> invalid value: \r\n\t .E0\f +PASS Test <length> invalid value: \r\n\t .E0em\f +PASS Test <length> invalid value: \r\n\t .E0ex\f +PASS Test <length> invalid value: \r\n\t .E0px\f +PASS Test <length> invalid value: \r\n\t .E0in\f +PASS Test <length> invalid value: \r\n\t .E0cm\f +PASS Test <length> invalid value: \r\n\t .E0mm\f +PASS Test <length> invalid value: \r\n\t .E0pt\f +PASS Test <length> invalid value: \r\n\t .E0pc\f +PASS Test <length> invalid value: \r\n\t .E0%\f +PASS Test <length> invalid value: \r\n\t e1\f +PASS Test <length> invalid value: \r\n\t e1em\f +PASS Test <length> invalid value: \r\n\t e1ex\f +PASS Test <length> invalid value: \r\n\t e1px\f +PASS Test <length> invalid value: \r\n\t e1in\f +PASS Test <length> invalid value: \r\n\t e1cm\f +PASS Test <length> invalid value: \r\n\t e1mm\f +PASS Test <length> invalid value: \r\n\t e1pt\f +PASS Test <length> invalid value: \r\n\t e1pc\f +PASS Test <length> invalid value: \r\n\t e1%\f +PASS Test <length> invalid value: \fe+ +PASS Test <length> invalid value: \fe+em +PASS Test <length> invalid value: \fe+ex +PASS Test <length> invalid value: \fe+px +PASS Test <length> invalid value: \fe+in +PASS Test <length> invalid value: \fe+cm +PASS Test <length> invalid value: \fe+mm +PASS Test <length> invalid value: \fe+pt +PASS Test <length> invalid value: \fe+pc +PASS Test <length> invalid value: \fe+% +PASS Test <length> invalid value: \fE- +PASS Test <length> invalid value: \fE-em +PASS Test <length> invalid value: \fE-ex +PASS Test <length> invalid value: \fE-px +PASS Test <length> invalid value: \fE-in +PASS Test <length> invalid value: \fE-cm +PASS Test <length> invalid value: \fE-mm +PASS Test <length> invalid value: \fE-pt +PASS Test <length> invalid value: \fE-pc +PASS Test <length> invalid value: \fE-% +PASS Test <length> invalid value: \f- +PASS Test <length> invalid value: \f-em +PASS Test <length> invalid value: \f-ex +PASS Test <length> invalid value: \f-px +PASS Test <length> invalid value: \f-in +PASS Test <length> invalid value: \f-cm +PASS Test <length> invalid value: \f-mm +PASS Test <length> invalid value: \f-pt +PASS Test <length> invalid value: \f-pc +PASS Test <length> invalid value: \f-% +PASS Test <length> invalid value: \f+ +PASS Test <length> invalid value: \f+em +PASS Test <length> invalid value: \f+ex +PASS Test <length> invalid value: \f+px +PASS Test <length> invalid value: \f+in +PASS Test <length> invalid value: \f+cm +PASS Test <length> invalid value: \f+mm +PASS Test <length> invalid value: \f+pt +PASS Test <length> invalid value: \f+pc +PASS Test <length> invalid value: \f+% +PASS Test <length> invalid value: \f-. +PASS Test <length> invalid value: \f-.em +PASS Test <length> invalid value: \f-.ex +PASS Test <length> invalid value: \f-.px +PASS Test <length> invalid value: \f-.in +PASS Test <length> invalid value: \f-.cm +PASS Test <length> invalid value: \f-.mm +PASS Test <length> invalid value: \f-.pt +PASS Test <length> invalid value: \f-.pc +PASS Test <length> invalid value: \f-.% +PASS Test <length> invalid value: \f.- +PASS Test <length> invalid value: \f.-em +PASS Test <length> invalid value: \f.-ex +PASS Test <length> invalid value: \f.-px +PASS Test <length> invalid value: \f.-in +PASS Test <length> invalid value: \f.-cm +PASS Test <length> invalid value: \f.-mm +PASS Test <length> invalid value: \f.-pt +PASS Test <length> invalid value: \f.-pc +PASS Test <length> invalid value: \f.-% +PASS Test <length> invalid value: \f. +PASS Test <length> invalid value: \f.em +PASS Test <length> invalid value: \f.ex +PASS Test <length> invalid value: \f.px +PASS Test <length> invalid value: \f.in +PASS Test <length> invalid value: \f.cm +PASS Test <length> invalid value: \f.mm +PASS Test <length> invalid value: \f.pt +PASS Test <length> invalid value: \f.pc +PASS Test <length> invalid value: \f.% +PASS Test <length> invalid value: \f+. +PASS Test <length> invalid value: \f+.em +PASS Test <length> invalid value: \f+.ex +PASS Test <length> invalid value: \f+.px +PASS Test <length> invalid value: \f+.in +PASS Test <length> invalid value: \f+.cm +PASS Test <length> invalid value: \f+.mm +PASS Test <length> invalid value: \f+.pt +PASS Test <length> invalid value: \f+.pc +PASS Test <length> invalid value: \f+.% +PASS Test <length> invalid value: \f.E0 +PASS Test <length> invalid value: \f.E0em +PASS Test <length> invalid value: \f.E0ex +PASS Test <length> invalid value: \f.E0px +PASS Test <length> invalid value: \f.E0in +PASS Test <length> invalid value: \f.E0cm +PASS Test <length> invalid value: \f.E0mm +PASS Test <length> invalid value: \f.E0pt +PASS Test <length> invalid value: \f.E0pc +PASS Test <length> invalid value: \f.E0% +PASS Test <length> invalid value: \fe1 +PASS Test <length> invalid value: \fe1em +PASS Test <length> invalid value: \fe1ex +PASS Test <length> invalid value: \fe1px +PASS Test <length> invalid value: \fe1in +PASS Test <length> invalid value: \fe1cm +PASS Test <length> invalid value: \fe1mm +PASS Test <length> invalid value: \fe1pt +PASS Test <length> invalid value: \fe1pc +PASS Test <length> invalid value: \fe1% +PASS Test <length> invalid value: \fe+ +PASS Test <length> invalid value: \fe+em +PASS Test <length> invalid value: \fe+ex +PASS Test <length> invalid value: \fe+px +PASS Test <length> invalid value: \fe+in +PASS Test <length> invalid value: \fe+cm +PASS Test <length> invalid value: \fe+mm +PASS Test <length> invalid value: \fe+pt +PASS Test <length> invalid value: \fe+pc +PASS Test <length> invalid value: \fe+% +PASS Test <length> invalid value: \fE- +PASS Test <length> invalid value: \fE-em +PASS Test <length> invalid value: \fE-ex +PASS Test <length> invalid value: \fE-px +PASS Test <length> invalid value: \fE-in +PASS Test <length> invalid value: \fE-cm +PASS Test <length> invalid value: \fE-mm +PASS Test <length> invalid value: \fE-pt +PASS Test <length> invalid value: \fE-pc +PASS Test <length> invalid value: \fE-% +PASS Test <length> invalid value: \f- +PASS Test <length> invalid value: \f-em +PASS Test <length> invalid value: \f-ex +PASS Test <length> invalid value: \f-px +PASS Test <length> invalid value: \f-in +PASS Test <length> invalid value: \f-cm +PASS Test <length> invalid value: \f-mm +PASS Test <length> invalid value: \f-pt +PASS Test <length> invalid value: \f-pc +PASS Test <length> invalid value: \f-% +PASS Test <length> invalid value: \f+ +PASS Test <length> invalid value: \f+em +PASS Test <length> invalid value: \f+ex +PASS Test <length> invalid value: \f+px +PASS Test <length> invalid value: \f+in +PASS Test <length> invalid value: \f+cm +PASS Test <length> invalid value: \f+mm +PASS Test <length> invalid value: \f+pt +PASS Test <length> invalid value: \f+pc +PASS Test <length> invalid value: \f+% +PASS Test <length> invalid value: \f-. +PASS Test <length> invalid value: \f-.em +PASS Test <length> invalid value: \f-.ex +PASS Test <length> invalid value: \f-.px +PASS Test <length> invalid value: \f-.in +PASS Test <length> invalid value: \f-.cm +PASS Test <length> invalid value: \f-.mm +PASS Test <length> invalid value: \f-.pt +PASS Test <length> invalid value: \f-.pc +PASS Test <length> invalid value: \f-.% +PASS Test <length> invalid value: \f.- +PASS Test <length> invalid value: \f.-em +PASS Test <length> invalid value: \f.-ex +PASS Test <length> invalid value: \f.-px +PASS Test <length> invalid value: \f.-in +PASS Test <length> invalid value: \f.-cm +PASS Test <length> invalid value: \f.-mm +PASS Test <length> invalid value: \f.-pt +PASS Test <length> invalid value: \f.-pc +PASS Test <length> invalid value: \f.-% +PASS Test <length> invalid value: \f. +PASS Test <length> invalid value: \f.em +PASS Test <length> invalid value: \f.ex +PASS Test <length> invalid value: \f.px +PASS Test <length> invalid value: \f.in +PASS Test <length> invalid value: \f.cm +PASS Test <length> invalid value: \f.mm +PASS Test <length> invalid value: \f.pt +PASS Test <length> invalid value: \f.pc +PASS Test <length> invalid value: \f.% +PASS Test <length> invalid value: \f+. +PASS Test <length> invalid value: \f+.em +PASS Test <length> invalid value: \f+.ex +PASS Test <length> invalid value: \f+.px +PASS Test <length> invalid value: \f+.in +PASS Test <length> invalid value: \f+.cm +PASS Test <length> invalid value: \f+.mm +PASS Test <length> invalid value: \f+.pt +PASS Test <length> invalid value: \f+.pc +PASS Test <length> invalid value: \f+.% +PASS Test <length> invalid value: \f.E0 +PASS Test <length> invalid value: \f.E0em +PASS Test <length> invalid value: \f.E0ex +PASS Test <length> invalid value: \f.E0px +PASS Test <length> invalid value: \f.E0in +PASS Test <length> invalid value: \f.E0cm +PASS Test <length> invalid value: \f.E0mm +PASS Test <length> invalid value: \f.E0pt +PASS Test <length> invalid value: \f.E0pc +PASS Test <length> invalid value: \f.E0% +PASS Test <length> invalid value: \fe1 +PASS Test <length> invalid value: \fe1em +PASS Test <length> invalid value: \fe1ex +PASS Test <length> invalid value: \fe1px +PASS Test <length> invalid value: \fe1in +PASS Test <length> invalid value: \fe1cm +PASS Test <length> invalid value: \fe1mm +PASS Test <length> invalid value: \fe1pt +PASS Test <length> invalid value: \fe1pc +PASS Test <length> invalid value: \fe1% +PASS Test <length> invalid value: \fe+ +PASS Test <length> invalid value: \fe+em +PASS Test <length> invalid value: \fe+ex +PASS Test <length> invalid value: \fe+px +PASS Test <length> invalid value: \fe+in +PASS Test <length> invalid value: \fe+cm +PASS Test <length> invalid value: \fe+mm +PASS Test <length> invalid value: \fe+pt +PASS Test <length> invalid value: \fe+pc +PASS Test <length> invalid value: \fe+% +PASS Test <length> invalid value: \fE- +PASS Test <length> invalid value: \fE-em +PASS Test <length> invalid value: \fE-ex +PASS Test <length> invalid value: \fE-px +PASS Test <length> invalid value: \fE-in +PASS Test <length> invalid value: \fE-cm +PASS Test <length> invalid value: \fE-mm +PASS Test <length> invalid value: \fE-pt +PASS Test <length> invalid value: \fE-pc +PASS Test <length> invalid value: \fE-% +PASS Test <length> invalid value: \f- +PASS Test <length> invalid value: \f-em +PASS Test <length> invalid value: \f-ex +PASS Test <length> invalid value: \f-px +PASS Test <length> invalid value: \f-in +PASS Test <length> invalid value: \f-cm +PASS Test <length> invalid value: \f-mm +PASS Test <length> invalid value: \f-pt +PASS Test <length> invalid value: \f-pc +PASS Test <length> invalid value: \f-% +PASS Test <length> invalid value: \f+ +PASS Test <length> invalid value: \f+em +PASS Test <length> invalid value: \f+ex +PASS Test <length> invalid value: \f+px +PASS Test <length> invalid value: \f+in +PASS Test <length> invalid value: \f+cm +PASS Test <length> invalid value: \f+mm +PASS Test <length> invalid value: \f+pt +PASS Test <length> invalid value: \f+pc +PASS Test <length> invalid value: \f+% +PASS Test <length> invalid value: \f-. +PASS Test <length> invalid value: \f-.em +PASS Test <length> invalid value: \f-.ex +PASS Test <length> invalid value: \f-.px +PASS Test <length> invalid value: \f-.in +PASS Test <length> invalid value: \f-.cm +PASS Test <length> invalid value: \f-.mm +PASS Test <length> invalid value: \f-.pt +PASS Test <length> invalid value: \f-.pc +PASS Test <length> invalid value: \f-.% +PASS Test <length> invalid value: \f.- +PASS Test <length> invalid value: \f.-em +PASS Test <length> invalid value: \f.-ex +PASS Test <length> invalid value: \f.-px +PASS Test <length> invalid value: \f.-in +PASS Test <length> invalid value: \f.-cm +PASS Test <length> invalid value: \f.-mm +PASS Test <length> invalid value: \f.-pt +PASS Test <length> invalid value: \f.-pc +PASS Test <length> invalid value: \f.-% +PASS Test <length> invalid value: \f. +PASS Test <length> invalid value: \f.em +PASS Test <length> invalid value: \f.ex +PASS Test <length> invalid value: \f.px +PASS Test <length> invalid value: \f.in +PASS Test <length> invalid value: \f.cm +PASS Test <length> invalid value: \f.mm +PASS Test <length> invalid value: \f.pt +PASS Test <length> invalid value: \f.pc +PASS Test <length> invalid value: \f.% +PASS Test <length> invalid value: \f+. +PASS Test <length> invalid value: \f+.em +PASS Test <length> invalid value: \f+.ex +PASS Test <length> invalid value: \f+.px +PASS Test <length> invalid value: \f+.in +PASS Test <length> invalid value: \f+.cm +PASS Test <length> invalid value: \f+.mm +PASS Test <length> invalid value: \f+.pt +PASS Test <length> invalid value: \f+.pc +PASS Test <length> invalid value: \f+.% +PASS Test <length> invalid value: \f.E0 +PASS Test <length> invalid value: \f.E0em +PASS Test <length> invalid value: \f.E0ex +PASS Test <length> invalid value: \f.E0px +PASS Test <length> invalid value: \f.E0in +PASS Test <length> invalid value: \f.E0cm +PASS Test <length> invalid value: \f.E0mm +PASS Test <length> invalid value: \f.E0pt +PASS Test <length> invalid value: \f.E0pc +PASS Test <length> invalid value: \f.E0% +PASS Test <length> invalid value: \fe1 +PASS Test <length> invalid value: \fe1em +PASS Test <length> invalid value: \fe1ex +PASS Test <length> invalid value: \fe1px +PASS Test <length> invalid value: \fe1in +PASS Test <length> invalid value: \fe1cm +PASS Test <length> invalid value: \fe1mm +PASS Test <length> invalid value: \fe1pt +PASS Test <length> invalid value: \fe1pc +PASS Test <length> invalid value: \fe1% +PASS Test <length> invalid value: \fe+\r\n\t +PASS Test <length> invalid value: \fe+em\r\n\t +PASS Test <length> invalid value: \fe+ex\r\n\t +PASS Test <length> invalid value: \fe+px\r\n\t +PASS Test <length> invalid value: \fe+in\r\n\t +PASS Test <length> invalid value: \fe+cm\r\n\t +PASS Test <length> invalid value: \fe+mm\r\n\t +PASS Test <length> invalid value: \fe+pt\r\n\t +PASS Test <length> invalid value: \fe+pc\r\n\t +PASS Test <length> invalid value: \fe+%\r\n\t +PASS Test <length> invalid value: \fE-\r\n\t +PASS Test <length> invalid value: \fE-em\r\n\t +PASS Test <length> invalid value: \fE-ex\r\n\t +PASS Test <length> invalid value: \fE-px\r\n\t +PASS Test <length> invalid value: \fE-in\r\n\t +PASS Test <length> invalid value: \fE-cm\r\n\t +PASS Test <length> invalid value: \fE-mm\r\n\t +PASS Test <length> invalid value: \fE-pt\r\n\t +PASS Test <length> invalid value: \fE-pc\r\n\t +PASS Test <length> invalid value: \fE-%\r\n\t +PASS Test <length> invalid value: \f-\r\n\t +PASS Test <length> invalid value: \f-em\r\n\t +PASS Test <length> invalid value: \f-ex\r\n\t +PASS Test <length> invalid value: \f-px\r\n\t +PASS Test <length> invalid value: \f-in\r\n\t +PASS Test <length> invalid value: \f-cm\r\n\t +PASS Test <length> invalid value: \f-mm\r\n\t +PASS Test <length> invalid value: \f-pt\r\n\t +PASS Test <length> invalid value: \f-pc\r\n\t +PASS Test <length> invalid value: \f-%\r\n\t +PASS Test <length> invalid value: \f+\r\n\t +PASS Test <length> invalid value: \f+em\r\n\t +PASS Test <length> invalid value: \f+ex\r\n\t +PASS Test <length> invalid value: \f+px\r\n\t +PASS Test <length> invalid value: \f+in\r\n\t +PASS Test <length> invalid value: \f+cm\r\n\t +PASS Test <length> invalid value: \f+mm\r\n\t +PASS Test <length> invalid value: \f+pt\r\n\t +PASS Test <length> invalid value: \f+pc\r\n\t +PASS Test <length> invalid value: \f+%\r\n\t +PASS Test <length> invalid value: \f-.\r\n\t +PASS Test <length> invalid value: \f-.em\r\n\t +PASS Test <length> invalid value: \f-.ex\r\n\t +PASS Test <length> invalid value: \f-.px\r\n\t +PASS Test <length> invalid value: \f-.in\r\n\t +PASS Test <length> invalid value: \f-.cm\r\n\t +PASS Test <length> invalid value: \f-.mm\r\n\t +PASS Test <length> invalid value: \f-.pt\r\n\t +PASS Test <length> invalid value: \f-.pc\r\n\t +PASS Test <length> invalid value: \f-.%\r\n\t +PASS Test <length> invalid value: \f.-\r\n\t +PASS Test <length> invalid value: \f.-em\r\n\t +PASS Test <length> invalid value: \f.-ex\r\n\t +PASS Test <length> invalid value: \f.-px\r\n\t +PASS Test <length> invalid value: \f.-in\r\n\t +PASS Test <length> invalid value: \f.-cm\r\n\t +PASS Test <length> invalid value: \f.-mm\r\n\t +PASS Test <length> invalid value: \f.-pt\r\n\t +PASS Test <length> invalid value: \f.-pc\r\n\t +PASS Test <length> invalid value: \f.-%\r\n\t +PASS Test <length> invalid value: \f.\r\n\t +PASS Test <length> invalid value: \f.em\r\n\t +PASS Test <length> invalid value: \f.ex\r\n\t +PASS Test <length> invalid value: \f.px\r\n\t +PASS Test <length> invalid value: \f.in\r\n\t +PASS Test <length> invalid value: \f.cm\r\n\t +PASS Test <length> invalid value: \f.mm\r\n\t +PASS Test <length> invalid value: \f.pt\r\n\t +PASS Test <length> invalid value: \f.pc\r\n\t +PASS Test <length> invalid value: \f.%\r\n\t +PASS Test <length> invalid value: \f+.\r\n\t +PASS Test <length> invalid value: \f+.em\r\n\t +PASS Test <length> invalid value: \f+.ex\r\n\t +PASS Test <length> invalid value: \f+.px\r\n\t +PASS Test <length> invalid value: \f+.in\r\n\t +PASS Test <length> invalid value: \f+.cm\r\n\t +PASS Test <length> invalid value: \f+.mm\r\n\t +PASS Test <length> invalid value: \f+.pt\r\n\t +PASS Test <length> invalid value: \f+.pc\r\n\t +PASS Test <length> invalid value: \f+.%\r\n\t +PASS Test <length> invalid value: \f.E0\r\n\t +PASS Test <length> invalid value: \f.E0em\r\n\t +PASS Test <length> invalid value: \f.E0ex\r\n\t +PASS Test <length> invalid value: \f.E0px\r\n\t +PASS Test <length> invalid value: \f.E0in\r\n\t +PASS Test <length> invalid value: \f.E0cm\r\n\t +PASS Test <length> invalid value: \f.E0mm\r\n\t +PASS Test <length> invalid value: \f.E0pt\r\n\t +PASS Test <length> invalid value: \f.E0pc\r\n\t +PASS Test <length> invalid value: \f.E0%\r\n\t +PASS Test <length> invalid value: \fe1\r\n\t +PASS Test <length> invalid value: \fe1em\r\n\t +PASS Test <length> invalid value: \fe1ex\r\n\t +PASS Test <length> invalid value: \fe1px\r\n\t +PASS Test <length> invalid value: \fe1in\r\n\t +PASS Test <length> invalid value: \fe1cm\r\n\t +PASS Test <length> invalid value: \fe1mm\r\n\t +PASS Test <length> invalid value: \fe1pt\r\n\t +PASS Test <length> invalid value: \fe1pc\r\n\t +PASS Test <length> invalid value: \fe1%\r\n\t +PASS Test <length> invalid value: \fe+\f +PASS Test <length> invalid value: \fe+em\f +PASS Test <length> invalid value: \fe+ex\f +PASS Test <length> invalid value: \fe+px\f +PASS Test <length> invalid value: \fe+in\f +PASS Test <length> invalid value: \fe+cm\f +PASS Test <length> invalid value: \fe+mm\f +PASS Test <length> invalid value: \fe+pt\f +PASS Test <length> invalid value: \fe+pc\f +PASS Test <length> invalid value: \fe+%\f +PASS Test <length> invalid value: \fE-\f +PASS Test <length> invalid value: \fE-em\f +PASS Test <length> invalid value: \fE-ex\f +PASS Test <length> invalid value: \fE-px\f +PASS Test <length> invalid value: \fE-in\f +PASS Test <length> invalid value: \fE-cm\f +PASS Test <length> invalid value: \fE-mm\f +PASS Test <length> invalid value: \fE-pt\f +PASS Test <length> invalid value: \fE-pc\f +PASS Test <length> invalid value: \fE-%\f +PASS Test <length> invalid value: \f-\f +PASS Test <length> invalid value: \f-em\f +PASS Test <length> invalid value: \f-ex\f +PASS Test <length> invalid value: \f-px\f +PASS Test <length> invalid value: \f-in\f +PASS Test <length> invalid value: \f-cm\f +PASS Test <length> invalid value: \f-mm\f +PASS Test <length> invalid value: \f-pt\f +PASS Test <length> invalid value: \f-pc\f +PASS Test <length> invalid value: \f-%\f +PASS Test <length> invalid value: \f+\f +PASS Test <length> invalid value: \f+em\f +PASS Test <length> invalid value: \f+ex\f +PASS Test <length> invalid value: \f+px\f +PASS Test <length> invalid value: \f+in\f +PASS Test <length> invalid value: \f+cm\f +PASS Test <length> invalid value: \f+mm\f +PASS Test <length> invalid value: \f+pt\f +PASS Test <length> invalid value: \f+pc\f +PASS Test <length> invalid value: \f+%\f +PASS Test <length> invalid value: \f-.\f +PASS Test <length> invalid value: \f-.em\f +PASS Test <length> invalid value: \f-.ex\f +PASS Test <length> invalid value: \f-.px\f +PASS Test <length> invalid value: \f-.in\f +PASS Test <length> invalid value: \f-.cm\f +PASS Test <length> invalid value: \f-.mm\f +PASS Test <length> invalid value: \f-.pt\f +PASS Test <length> invalid value: \f-.pc\f +PASS Test <length> invalid value: \f-.%\f +PASS Test <length> invalid value: \f.-\f +PASS Test <length> invalid value: \f.-em\f +PASS Test <length> invalid value: \f.-ex\f +PASS Test <length> invalid value: \f.-px\f +PASS Test <length> invalid value: \f.-in\f +PASS Test <length> invalid value: \f.-cm\f +PASS Test <length> invalid value: \f.-mm\f +PASS Test <length> invalid value: \f.-pt\f +PASS Test <length> invalid value: \f.-pc\f +PASS Test <length> invalid value: \f.-%\f +PASS Test <length> invalid value: \f.\f +PASS Test <length> invalid value: \f.em\f +PASS Test <length> invalid value: \f.ex\f +PASS Test <length> invalid value: \f.px\f +PASS Test <length> invalid value: \f.in\f +PASS Test <length> invalid value: \f.cm\f +PASS Test <length> invalid value: \f.mm\f +PASS Test <length> invalid value: \f.pt\f +PASS Test <length> invalid value: \f.pc\f +PASS Test <length> invalid value: \f.%\f +PASS Test <length> invalid value: \f+.\f +PASS Test <length> invalid value: \f+.em\f +PASS Test <length> invalid value: \f+.ex\f +PASS Test <length> invalid value: \f+.px\f +PASS Test <length> invalid value: \f+.in\f +PASS Test <length> invalid value: \f+.cm\f +PASS Test <length> invalid value: \f+.mm\f +PASS Test <length> invalid value: \f+.pt\f +PASS Test <length> invalid value: \f+.pc\f +PASS Test <length> invalid value: \f+.%\f +PASS Test <length> invalid value: \f.E0\f +PASS Test <length> invalid value: \f.E0em\f +PASS Test <length> invalid value: \f.E0ex\f +PASS Test <length> invalid value: \f.E0px\f +PASS Test <length> invalid value: \f.E0in\f +PASS Test <length> invalid value: \f.E0cm\f +PASS Test <length> invalid value: \f.E0mm\f +PASS Test <length> invalid value: \f.E0pt\f +PASS Test <length> invalid value: \f.E0pc\f +PASS Test <length> invalid value: \f.E0%\f +PASS Test <length> invalid value: \fe1\f +PASS Test <length> invalid value: \fe1em\f +PASS Test <length> invalid value: \fe1ex\f +PASS Test <length> invalid value: \fe1px\f +PASS Test <length> invalid value: \fe1in\f +PASS Test <length> invalid value: \fe1cm\f +PASS Test <length> invalid value: \fe1mm\f +PASS Test <length> invalid value: \fe1pt\f +PASS Test <length> invalid value: \fe1pc\f +PASS Test <length> invalid value: \fe1%\f +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/text/bbox-with-glyph-overflow-on-path-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/text/bbox-with-glyph-overflow-on-path-expected.png new file mode 100644 index 0000000..8447ebb --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/text/bbox-with-glyph-overflow-on-path-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/text/bbox-with-glyph-overflow-on-path-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/text/bbox-with-glyph-overflow-on-path-expected.txt new file mode 100644 index 0000000..ed5576d5 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/text/bbox-with-glyph-overflow-on-path-expected.txt
@@ -0,0 +1,111 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x541 + LayoutBlockFlow {HTML} at (0,0) size 800x541 + LayoutBlockFlow {BODY} at (8,8) size 784x525 + LayoutText {#text} at (0,0) size 255x19 + text run at (0,0) width 255: "No glyphs should extend outside the rects." + LayoutBR {BR} at (255,0) size 0x19 + LayoutSVGRoot {svg} at (45,82) size 381x412 + LayoutSVGHiddenContainer {defs} at (0,0) size 0x0 + LayoutSVGPath {path} at (8,28) size 0x0 [fill={[type=SOLID] [color=#000000]}] [data="M 50 100 L 400 100"] + LayoutSVGPath {path} at (8,28) size 0x0 [fill={[type=SOLID] [color=#000000]}] [data="M 400 150 L 50 150"] + LayoutSVGPath {path} at (58,278) size 350x100 [fill={[type=SOLID] [color=#000000]}] [data="M 50 250 L 400 350"] + LayoutSVGPath {path} at (8,28) size 0x0 [fill={[type=SOLID] [color=#000000]}] [data="M 50 450 L 400 450"] + LayoutSVGText {text} at (40,55) size 364x57 contains 1 chunk(s) + LayoutSVGTextPath {textPath} at (0,0) size 363x57 + LayoutSVGInlineText {#text} at (0,0) size 363x57 + chunk 1 text run 1 at (57.50,100.00) startOffset 0 endOffset 1 width 15.00: "f" + chunk 1 text run 2 at (72.50,100.00) startOffset 1 endOffset 2 width 15.00: "f" + chunk 1 text run 3 at (87.50,100.00) startOffset 2 endOffset 3 width 15.00: "f" + chunk 1 text run 4 at (102.50,100.00) startOffset 3 endOffset 4 width 15.00: "f" + chunk 1 text run 5 at (117.50,100.00) startOffset 4 endOffset 5 width 15.00: "f" + chunk 1 text run 6 at (132.50,100.00) startOffset 5 endOffset 6 width 15.00: "f" + chunk 1 text run 7 at (147.50,100.00) startOffset 6 endOffset 7 width 15.00: "f" + chunk 1 text run 8 at (162.50,100.00) startOffset 7 endOffset 8 width 15.00: "f" + chunk 1 text run 9 at (177.50,100.00) startOffset 8 endOffset 9 width 15.00: "f" + chunk 1 text run 10 at (192.50,100.00) startOffset 9 endOffset 10 width 15.00: "f" + chunk 1 text run 11 at (207.50,100.00) startOffset 10 endOffset 11 width 15.00: "f" + chunk 1 text run 12 at (222.50,100.00) startOffset 11 endOffset 12 width 15.00: "f" + chunk 1 text run 13 at (237.50,100.00) startOffset 12 endOffset 13 width 15.00: "f" + chunk 1 text run 14 at (252.50,100.00) startOffset 13 endOffset 14 width 15.00: "f" + chunk 1 text run 15 at (267.50,100.00) startOffset 14 endOffset 15 width 15.00: "f" + chunk 1 text run 16 at (282.50,100.00) startOffset 15 endOffset 16 width 15.00: "f" + chunk 1 text run 17 at (297.50,100.00) startOffset 16 endOffset 17 width 15.00: "f" + chunk 1 text run 18 at (312.50,100.00) startOffset 17 endOffset 18 width 15.00: "f" + chunk 1 text run 19 at (327.50,100.00) startOffset 18 endOffset 19 width 15.00: "f" + chunk 1 text run 20 at (342.50,100.00) startOffset 19 endOffset 20 width 15.00: "f" + chunk 1 text run 21 at (357.50,100.00) startOffset 20 endOffset 21 width 15.00: "f" + chunk 1 text run 22 at (372.50,100.00) startOffset 21 endOffset 22 width 15.00: "f" + chunk 1 text run 23 at (387.50,100.00) startOffset 22 endOffset 23 width 15.00: "f" + LayoutSVGInlineText {#text} at (0,0) size 0x0 + LayoutSVGText {text} at (46,138) size 363x57 contains 1 chunk(s) + LayoutSVGTextPath {textPath} at (0,0) size 363x57 + LayoutSVGInlineText {#text} at (0,0) size 363x57 + chunk 1 text run 1 at (392.50,150.00) startOffset 0 endOffset 1 width 15.00: "f" + chunk 1 text run 2 at (377.50,150.00) startOffset 1 endOffset 2 width 15.00: "f" + chunk 1 text run 3 at (362.50,150.00) startOffset 2 endOffset 3 width 15.00: "f" + chunk 1 text run 4 at (347.50,150.00) startOffset 3 endOffset 4 width 15.00: "f" + chunk 1 text run 5 at (332.50,150.00) startOffset 4 endOffset 5 width 15.00: "f" + chunk 1 text run 6 at (317.50,150.00) startOffset 5 endOffset 6 width 15.00: "f" + chunk 1 text run 7 at (302.50,150.00) startOffset 6 endOffset 7 width 15.00: "f" + chunk 1 text run 8 at (287.50,150.00) startOffset 7 endOffset 8 width 15.00: "f" + chunk 1 text run 9 at (272.50,150.00) startOffset 8 endOffset 9 width 15.00: "f" + chunk 1 text run 10 at (257.50,150.00) startOffset 9 endOffset 10 width 15.00: "f" + chunk 1 text run 11 at (242.50,150.00) startOffset 10 endOffset 11 width 15.00: "f" + chunk 1 text run 12 at (227.50,150.00) startOffset 11 endOffset 12 width 15.00: "f" + chunk 1 text run 13 at (212.50,150.00) startOffset 12 endOffset 13 width 15.00: "f" + chunk 1 text run 14 at (197.50,150.00) startOffset 13 endOffset 14 width 15.00: "f" + chunk 1 text run 15 at (182.50,150.00) startOffset 14 endOffset 15 width 15.00: "f" + chunk 1 text run 16 at (167.50,150.00) startOffset 15 endOffset 16 width 15.00: "f" + chunk 1 text run 17 at (152.50,150.00) startOffset 16 endOffset 17 width 15.00: "f" + chunk 1 text run 18 at (137.50,150.00) startOffset 17 endOffset 18 width 15.00: "f" + chunk 1 text run 19 at (122.50,150.00) startOffset 18 endOffset 19 width 15.00: "f" + chunk 1 text run 20 at (107.50,150.00) startOffset 19 endOffset 20 width 15.00: "f" + chunk 1 text run 21 at (92.50,150.00) startOffset 20 endOffset 21 width 15.00: "f" + chunk 1 text run 22 at (77.50,150.00) startOffset 21 endOffset 22 width 15.00: "f" + chunk 1 text run 23 at (62.50,150.00) startOffset 22 endOffset 23 width 15.00: "f" + LayoutSVGInlineText {#text} at (0,0) size 0x0 + LayoutSVGText {text} at (38,204) size 380x159 contains 1 chunk(s) + LayoutSVGTextPath {textPath} at (0,0) size 380x159 + LayoutSVGInlineText {#text} at (0,0) size 380x159 + chunk 1 text run 1 at (57.21,252.06) startOffset 0 endOffset 1 width 15.00: "f" + chunk 1 text run 2 at (71.63,256.18) startOffset 1 endOffset 2 width 15.00: "f" + chunk 1 text run 3 at (86.06,260.30) startOffset 2 endOffset 3 width 15.00: "f" + chunk 1 text run 4 at (100.48,264.42) startOffset 3 endOffset 4 width 15.00: "f" + chunk 1 text run 5 at (114.90,268.54) startOffset 4 endOffset 5 width 15.00: "f" + chunk 1 text run 6 at (129.33,272.66) startOffset 5 endOffset 6 width 15.00: "f" + chunk 1 text run 7 at (143.75,276.79) startOffset 6 endOffset 7 width 15.00: "f" + chunk 1 text run 8 at (158.17,280.91) startOffset 7 endOffset 8 width 15.00: "f" + chunk 1 text run 9 at (172.59,285.03) startOffset 8 endOffset 9 width 15.00: "f" + chunk 1 text run 10 at (187.02,289.15) startOffset 9 endOffset 10 width 15.00: "f" + chunk 1 text run 11 at (201.44,293.27) startOffset 10 endOffset 11 width 15.00: "f" + chunk 1 text run 12 at (215.86,297.39) startOffset 11 endOffset 12 width 15.00: "f" + chunk 1 text run 13 at (230.29,301.51) startOffset 12 endOffset 13 width 15.00: "f" + chunk 1 text run 14 at (244.71,305.63) startOffset 13 endOffset 14 width 15.00: "f" + chunk 1 text run 15 at (259.13,309.75) startOffset 14 endOffset 15 width 15.00: "f" + chunk 1 text run 16 at (273.55,313.87) startOffset 15 endOffset 16 width 15.00: "f" + chunk 1 text run 17 at (287.98,317.99) startOffset 16 endOffset 17 width 15.00: "f" + chunk 1 text run 18 at (302.40,322.11) startOffset 17 endOffset 18 width 15.00: "f" + chunk 1 text run 19 at (316.82,326.24) startOffset 18 endOffset 19 width 15.00: "f" + chunk 1 text run 20 at (331.25,330.36) startOffset 19 endOffset 20 width 15.00: "f" + chunk 1 text run 21 at (345.67,334.48) startOffset 20 endOffset 21 width 15.00: "f" + chunk 1 text run 22 at (360.09,338.60) startOffset 21 endOffset 22 width 15.00: "f" + chunk 1 text run 23 at (374.51,342.72) startOffset 22 endOffset 23 width 15.00: "f" + chunk 1 text run 24 at (388.94,346.84) startOffset 23 endOffset 24 width 15.00: "f" + LayoutSVGInlineText {#text} at (0,0) size 0x0 + LayoutSVGText {text} at (49,394) size 136x71 contains 1 chunk(s) + LayoutSVGTextPath {textPath} at (0,0) size 135x71 + LayoutSVGInlineText {#text} at (0,0) size 135x71 + chunk 1 text run 1 at (59.50,450.00) startOffset 0 endOffset 1 width 19.00: "'" + chunk 1 text run 2 at (81.50,450.00) startOffset 1 endOffset 2 width 25.00: "f" + chunk 1 text run 3 at (107.00,450.00) startOffset 2 endOffset 3 width 26.00: "a" + chunk 1 text run 4 at (142.00,450.00) startOffset 3 endOffset 4 width 44.00: "Q" + chunk 1 text run 5 at (173.50,450.00) startOffset 4 endOffset 5 width 19.00: "'" + LayoutSVGInlineText {#text} at (0,0) size 0x0 + LayoutSVGRect {rect} at (48,82) size 365x59 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=40.98] [y=55.00] [width=363.00] [height=57.00] + LayoutSVGRect {rect} at (53,165) size 365x59 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=46.00] [y=138.00] [width=363.00] [height=57.00] + LayoutSVGRect {rect} at (45,231) size 381x161 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=38.05] [y=204.25] [width=379.09] [height=158.64] + LayoutSVGRect {rect} at (57,421) size 137x73 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=49.98] [y=394.00] [width=135.00] [height=71.00] + LayoutText {#text} at (0,0) size 0x0 + LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/text/text-selection-path-01-b-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/text/text-selection-path-01-b-expected.png new file mode 100644 index 0000000..fa00a29 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/text/text-selection-path-01-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/text/text-selection-path-01-b-expected.txt b/third_party/WebKit/LayoutTests/platform/android/svg/text/text-selection-path-01-b-expected.txt new file mode 100644 index 0000000..8703b94 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/text/text-selection-path-01-b-expected.txt
@@ -0,0 +1,98 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutSVGRoot {svg} at (0,0) size 800x600 + LayoutSVGContainer {g} at (0,0) size 698x486 + LayoutSVGHiddenContainer {defs} at (0,0) size 0x0 + LayoutSVGPath {path} at (330,22) size 368x164 [stroke={[type=SOLID] [color=#0000FF]}] [data="M 199 89.3 C 206.6 66.6 235.8 13.2 270 30.3 C 286.6 38.6 298.9 59.4 310 73.3 C 321.7 87.9 338.6 99 356 103.3 C 387.3 111.1 396.6 90.4 418 74.3"] + LayoutSVGPath {path} at (55,116) size 367x164 [stroke={[type=SOLID] [color=#0000FF]}] [data="M 33.5 145.8 C 41 123 70.3 69.7 104.5 86.8 C 121 95 133 116 144.5 129.8 C 156.2 144.4 173 155.5 190.5 159.8 C 221.8 167.6 231 146.9 252.5 130.8"] + LayoutSVGPath {path} at (188,385) size 501x7 [stroke={[type=SOLID] [color=#0000FF] [stroke width=4.00]}] [data="M 113 233 L 413 233"] + LayoutSVGContainer {g} at (279,0) size 419x189 + LayoutSVGContainer {use} at (330,22) size 368x164 + LayoutSVGPath {path} at (330,22) size 368x164 [stroke={[type=SOLID] [color=#0000FF]}] [data="M 199 89.3 C 206.6 66.6 235.8 13.2 270 30.3 C 286.6 38.6 298.9 59.4 310 73.3 C 321.7 87.9 338.6 99 356 103.3 C 387.3 111.1 396.6 90.4 418 74.3"] + LayoutSVGText {text} at (167,-7) size 206x120 contains 1 chunk(s) + LayoutSVGTextPath {textPath} at (0,0) size 205x120 + LayoutSVGInlineText {#text} at (0,0) size 205x120 + chunk 1 text run 1 at (203.06,79.02) startOffset 0 endOffset 1 width 22.20: "T" + chunk 1 text run 2 at (212.29,61.56) startOffset 1 endOffset 2 width 17.40: "e" + chunk 1 text run 3 at (222.63,47.07) startOffset 2 endOffset 3 width 18.00: "x" + chunk 1 text run 4 at (233.49,36.27) startOffset 3 endOffset 4 width 12.60: "t" + chunk 1 text run 5 at (242.28,30.56) startOffset 4 endOffset 5 width 8.40: " " + chunk 1 text run 6 at (255.48,27.00) startOffset 5 endOffset 6 width 19.20: "o" + chunk 1 text run 7 at (274.39,32.84) startOffset 6 endOffset 7 width 21.00: "n" + chunk 1 text run 8 at (285.54,42.31) startOffset 7 endOffset 8 width 8.40: " " + chunk 1 text run 9 at (294.22,52.39) startOffset 8 endOffset 9 width 18.00: "a" + chunk 1 text run 10 at (302.19,62.96) startOffset 9 endOffset 10 width 8.40: " " + chunk 1 text run 11 at (310.87,74.37) startOffset 10 endOffset 11 width 20.40: "p" + chunk 1 text run 12 at (324.66,87.72) startOffset 11 endOffset 12 width 18.00: "a" + chunk 1 text run 13 at (337.49,96.09) startOffset 12 endOffset 13 width 12.60: "t" + chunk 1 text run 14 at (353.02,102.49) startOffset 13 endOffset 14 width 21.00: "h" + LayoutSVGInlineText {#text} at (0,0) size 0x0 + LayoutSVGContainer {g} at (0,82) size 486x271 + LayoutSVGContainer {use} at (55,116) size 367x164 + LayoutSVGPath {path} at (55,116) size 367x164 [stroke={[type=SOLID] [color=#0000FF]}] [data="M 33.5 145.8 C 41 123 70.3 69.7 104.5 86.8 C 121 95 133 116 144.5 129.8 C 156.2 144.4 173 155.5 190.5 159.8 C 221.8 167.6 231 146.9 252.5 130.8"] + LayoutSVGText {text} at (-9,49) size 216x121 contains 1 chunk(s) + LayoutSVGTextPath {textPath} at (0,0) size 216x120 + LayoutSVGTSpan {tspan} at (0,0) size 57x58 + LayoutSVGInlineText {#text} at (0,37) size 57x58 + chunk 1 text run 1 at (37.53,135.51) startOffset 0 endOffset 1 width 22.20: "T" + chunk 1 text run 2 at (46.73,118.03) startOffset 1 endOffset 2 width 17.40: "e" + LayoutSVGTSpan {tspan} at (0,0) size 44x41 + LayoutSVGInlineText {#text} at (34,25) size 44x41 + chunk 1 text run 1 at (57.08,103.54) startOffset 0 endOffset 1 width 18.00: "x" + LayoutSVGInlineText {#text} at (50,0) size 165x120 + chunk 1 text run 1 at (67.95,92.75) startOffset 0 endOffset 1 width 12.60: "t" + chunk 1 text run 2 at (76.74,87.05) startOffset 1 endOffset 2 width 8.40: " " + chunk 1 text run 3 at (89.94,83.50) startOffset 2 endOffset 3 width 19.20: "o" + chunk 1 text run 4 at (108.86,89.32) startOffset 3 endOffset 4 width 21.00: "n" + chunk 1 text run 5 at (119.95,98.84) startOffset 4 endOffset 5 width 8.40: " " + chunk 1 text run 6 at (128.58,108.97) startOffset 5 endOffset 6 width 18.00: "a" + chunk 1 text run 7 at (136.56,119.54) startOffset 6 endOffset 7 width 8.40: " " + chunk 1 text run 8 at (145.36,130.85) startOffset 7 endOffset 8 width 20.40: "p" + chunk 1 text run 9 at (159.13,144.22) startOffset 8 endOffset 9 width 18.00: "a" + chunk 1 text run 10 at (171.95,152.60) startOffset 9 endOffset 10 width 12.60: "t" + chunk 1 text run 11 at (187.48,158.99) startOffset 10 endOffset 11 width 21.00: "h" + LayoutSVGInlineText {#text} at (0,0) size 0x0 + LayoutSVGRect {rect} at (27,280) size 459x71 [stroke={[type=SOLID] [color=#000000]}] [x=17.00] [y=169.00] [width=274.00] [height=41.00] + LayoutSVGText {text} at (19,166) size 215x24 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (0,0) size 215x23 + chunk 1 text run 1 at (19.00,185.00) startOffset 0 endOffset 25 width 214.80: "'tspan' subelement inside" + LayoutSVGText {text} at (19,188) size 187x24 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (0,0) size 187x23 + chunk 1 text run 1 at (19.00,207.00) startOffset 0 endOffset 23 width 186.60: "the 'textPath' element." + LayoutSVGContainer {g} at (188,352) size 501x134 + LayoutSVGContainer {use} at (188,385) size 501x7 + LayoutSVGPath {path} at (188,385) size 501x7 [stroke={[type=SOLID] [color=#0000FF] [stroke width=4.00]}] [data="M 113 233 L 413 233"] + LayoutSVGText {text} at (211,211) size 175x28 contains 1 chunk(s) + LayoutSVGTextPath {textPath} at (0,0) size 174x27 + LayoutSVGInlineText {#text} at (0,0) size 174x27 + chunk 1 text run 1 at (219.20,233.00) startOffset 0 endOffset 1 width 14.40: "T" + chunk 1 text run 2 at (232.70,233.00) startOffset 1 endOffset 2 width 12.60: "h" + chunk 1 text run 3 at (245.60,233.00) startOffset 2 endOffset 3 width 13.20: "e" + chunk 1 text run 4 at (255.50,233.00) startOffset 3 endOffset 4 width 6.60: " " + chunk 1 text run 5 at (266.00,233.00) startOffset 4 endOffset 5 width 14.40: "T" + chunk 1 text run 6 at (278.47,233.00) startOffset 5 endOffset 6 width 10.54: "e" + chunk 1 text run 7 at (289.14,233.00) startOffset 6 endOffset 7 width 10.80: "x" + chunk 1 text run 8 at (297.84,233.00) startOffset 7 endOffset 8 width 6.60: "t" + chunk 1 text run 9 at (304.44,233.00) startOffset 8 endOffset 9 width 6.60: " " + chunk 1 text run 10 at (314.34,233.00) startOffset 9 endOffset 10 width 13.20: "o" + chunk 1 text run 11 at (327.24,233.00) startOffset 10 endOffset 11 width 12.60: "n" + chunk 1 text run 12 at (336.84,233.00) startOffset 11 endOffset 12 width 6.60: " " + chunk 1 text run 13 at (346.74,233.00) startOffset 12 endOffset 13 width 13.20: "p" + chunk 1 text run 14 at (359.94,233.00) startOffset 13 endOffset 14 width 13.20: "a" + chunk 1 text run 15 at (369.84,233.00) startOffset 14 endOffset 15 width 6.60: "t" + chunk 1 text run 16 at (379.44,233.00) startOffset 15 endOffset 16 width 12.60: "h" + LayoutSVGInlineText {#text} at (0,0) size 0x0 + LayoutSVGRect {rect} at (195,415) size 436x71 [stroke={[type=SOLID] [color=#000000]}] [x=118.00] [y=250.00] [width=260.00] [height=41.00] + LayoutSVGText {text} at (120,248) size 226x24 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (0,0) size 226x23 + chunk 1 text run 1 at (120.00,267.00) startOffset 0 endOffset 30 width 225.84: "'startOffset' attribute of the" + LayoutSVGText {text} at (120,268) size 155x24 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (0,0) size 155x23 + chunk 1 text run 1 at (120.00,287.00) startOffset 0 endOffset 19 width 154.80: "'textPath' element." + LayoutSVGText {text} at (10,304) size 266x46 contains 1 chunk(s) + LayoutSVGInlineText {#text} at (0,0) size 266x46 + chunk 1 text run 1 at (10.00,340.00) startOffset 0 endOffset 16 width 265.80: "$Revision: 1.9 $" + LayoutSVGRect {rect} at (0,0) size 800x600 [stroke={[type=SOLID] [color=#000000]}] [x=1.00] [y=1.00] [width=478.00] [height=358.00] +selection start: position 0 of child 0 {#text} of child 1 {textPath} of child 3 {text} of child 3 {g} of child 13 {g} of child 30 {svg} of document +selection end: position 16 of child 0 {#text} of child 15 {text} of child 30 {svg} of document
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/text/textPathBoundsBug-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/text/textPathBoundsBug-expected.png new file mode 100644 index 0000000..ee10195e --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/text/textPathBoundsBug-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/transforms/svg-css-transforms-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/transforms/svg-css-transforms-expected.png new file mode 100644 index 0000000..aaf844c --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/svg/transforms/svg-css-transforms-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/tables/mozilla/dom/tableDom-expected.png b/third_party/WebKit/LayoutTests/platform/android/tables/mozilla/dom/tableDom-expected.png new file mode 100644 index 0000000..23b1f77 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/tables/mozilla/dom/tableDom-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/tables/mozilla/dom/tableDom-expected.txt b/third_party/WebKit/LayoutTests/platform/android/tables/mozilla/dom/tableDom-expected.txt new file mode 100644 index 0000000..b682f96 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/tables/mozilla/dom/tableDom-expected.txt
@@ -0,0 +1,69 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutBlockFlow {HTML} at (0,0) size 800x600 + LayoutBlockFlow {BODY} at (8,8) size 784x584 + LayoutBlockFlow {FORM} at (0,0) size 784x22 + LayoutMenuList {SELECT} at (0,1) size 91x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] + LayoutBlockFlow (anonymous) at (1,1) size 89x18 + LayoutText (anonymous) at (4,1) size 66x16 + text run at (4,1) width 66: "append cell" + LayoutText {#text} at (91,1) size 51x19 + text run at (91,1) width 51: " tbody " + LayoutTextControl {INPUT} at (142,0) size 64x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (206,1) size 40x19 + text run at (206,1) width 40: " row " + LayoutTextControl {INPUT} at (246,0) size 64x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (310,1) size 34x19 + text run at (310,1) width 34: " col " + LayoutTextControl {INPUT} at (344,0) size 64x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (408,1) size 72x19 + text run at (408,1) width 72: " row span " + LayoutTextControl {INPUT} at (480,0) size 64x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (544,1) size 66x19 + text run at (544,1) width 66: " col span " + LayoutTextControl {INPUT} at (610,0) size 64x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (674,1) size 20x19 + text run at (674,1) width 20: " " + LayoutButton {INPUT} at (694,0) size 43x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] + LayoutBlockFlow (anonymous) at (8,3) size 27x16 + LayoutText {#text} at (0,0) size 27x16 + text run at (0,0) width 27: "Do It" + LayoutText {#text} at (0,0) size 0x0 + LayoutBlockFlow (anonymous) at (0,38) size 784x20 + LayoutBR {BR} at (0,0) size 0x19 + LayoutTable {TABLE} at (0,58) size 62x56 [bgcolor=#FFA500] [border: (1px outset #808080)] + LayoutTableSection {TBODY} at (1,1) size 60x54 + LayoutTableRow {TR} at (0,2) size 60x24 + LayoutTableCell {TD} at (2,2) size 27x24 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (2,2) size 23x19 + text run at (2,2) width 23: "c11" + LayoutTableRow {TR} at (0,28) size 60x24 + LayoutTableCell {TD} at (2,28) size 27x24 [border: (1px inset #808080)] [r=1 c=0 rs=1 cs=1] + LayoutText {#text} at (2,2) size 23x19 + text run at (2,2) width 23: "c21" + LayoutTableCell {TD} at (31,28) size 27x24 [border: (1px inset #808080)] [r=1 c=1 rs=1 cs=1] + LayoutText {#text} at (2,2) size 23x19 + text run at (2,2) width 23: "c22" + LayoutBlockFlow (anonymous) at (0,114) size 784x20 + LayoutBR {BR} at (0,0) size 0x19 +layer at (152,11) size 60x16 + LayoutBlockFlow {DIV} at (2,3) size 60x16 + LayoutText {#text} at (0,0) size 7x16 + text run at (0,0) width 7: "0" +layer at (256,11) size 60x16 + LayoutBlockFlow {DIV} at (2,3) size 60x16 + LayoutText {#text} at (0,0) size 7x16 + text run at (0,0) width 7: "0" +layer at (354,11) size 60x16 + LayoutBlockFlow {DIV} at (2,3) size 60x16 + LayoutText {#text} at (0,0) size 7x16 + text run at (0,0) width 7: "0" +layer at (490,11) size 60x16 + LayoutBlockFlow {DIV} at (2,3) size 60x16 + LayoutText {#text} at (0,0) size 7x16 + text run at (0,0) width 7: "1" +layer at (620,11) size 60x16 + LayoutBlockFlow {DIV} at (2,3) size 60x16 + LayoutText {#text} at (0,0) size 7x16 + text run at (0,0) width 7: "1"
diff --git a/third_party/WebKit/LayoutTests/platform/android/transforms/svg-vs-css-expected.png b/third_party/WebKit/LayoutTests/platform/android/transforms/svg-vs-css-expected.png new file mode 100644 index 0000000..a0f8298 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/transforms/svg-vs-css-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux-x86/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png b/third_party/WebKit/LayoutTests/platform/android/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/linux-x86/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png rename to third_party/WebKit/LayoutTests/platform/android/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/virtual/threaded/printing/iframe-print-expected.png b/third_party/WebKit/LayoutTests/platform/android/virtual/threaded/printing/iframe-print-expected.png new file mode 100644 index 0000000..a80552a5 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/virtual/threaded/printing/iframe-print-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux-precise/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png b/third_party/WebKit/LayoutTests/platform/linux-precise/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png deleted file mode 100644 index f5737bf..0000000 --- a/third_party/WebKit/LayoutTests/platform/linux-precise/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/animations/animate-elem-08-t-drt-expected.txt b/third_party/WebKit/LayoutTests/platform/linux-x86/svg/animations/animate-elem-08-t-drt-expected.txt similarity index 89% copy from third_party/WebKit/LayoutTests/platform/mac/svg/animations/animate-elem-08-t-drt-expected.txt copy to third_party/WebKit/LayoutTests/platform/linux-x86/svg/animations/animate-elem-08-t-drt-expected.txt index b222eaf7..10c8c56 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/animations/animate-elem-08-t-drt-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux-x86/svg/animations/animate-elem-08-t-drt-expected.txt
@@ -23,38 +23,38 @@ PASS getTransformToElement(rootSVGElement, path1).b is 0.1 PASS getTransformToElement(rootSVGElement, path1).c is -0.1 PASS getTransformToElement(rootSVGElement, path1).d is 1 -FAIL getTransformToElement(rootSVGElement, path1).e should be close to -70.3. Was -70.87814895357428. -FAIL getTransformToElement(rootSVGElement, path1).f should be close to -182.8. Was -182.60109333201257. +FAIL getTransformToElement(rootSVGElement, path1).e should be close to -70.3. Was -70.88506734438292. +FAIL getTransformToElement(rootSVGElement, path1).f should be close to -182.8. Was -182.59945510934625. PASS getTransformToElement(rootSVGElement, path2).a is -1 PASS getTransformToElement(rootSVGElement, path2).b is -0.1 PASS getTransformToElement(rootSVGElement, path2).c is 0.1 PASS getTransformToElement(rootSVGElement, path2).d is -1 -FAIL getTransformToElement(rootSVGElement, path2).e should be close to 318.6. Was 319.29822182153924. -FAIL getTransformToElement(rootSVGElement, path2).f should be close to 211.6. Was 210.66313575977358. +FAIL getTransformToElement(rootSVGElement, path2).e should be close to 318.6. Was 319.3057494247923. +FAIL getTransformToElement(rootSVGElement, path2).f should be close to 211.6. Was 210.65582089693936. PASS getTransformToElement(rootSVGElement, path1).a is 0.7 PASS getTransformToElement(rootSVGElement, path1).b is -0.7 PASS getTransformToElement(rootSVGElement, path1).c is 0.7 PASS getTransformToElement(rootSVGElement, path1).d is 0.7 PASS getTransformToElement(rootSVGElement, path1).e is -265.1 -FAIL getTransformToElement(rootSVGElement, path1).f should be close to -18.9. Was -17.677916691624326. +FAIL getTransformToElement(rootSVGElement, path1).f should be close to -18.9. Was -17.677669529663703. PASS getTransformToElement(rootSVGElement, path2).a is -0.7 PASS getTransformToElement(rootSVGElement, path2).b is 0.7 PASS getTransformToElement(rootSVGElement, path2).c is -0.7 PASS getTransformToElement(rootSVGElement, path2).d is -0.7 -FAIL getTransformToElement(rootSVGElement, path2).e should be close to 442.7. Was 441.941810617502. -FAIL getTransformToElement(rootSVGElement, path2).f should be close to -156.9. Was -159.09852261339003. +FAIL getTransformToElement(rootSVGElement, path2).e should be close to 442.7. Was 441.94173824159213. +FAIL getTransformToElement(rootSVGElement, path2).f should be close to -156.9. Was -159.09902576697306. PASS getTransformToElement(rootSVGElement, path1).a is 0.7 PASS getTransformToElement(rootSVGElement, path1).b is -0.7 PASS getTransformToElement(rootSVGElement, path1).c is 0.7 PASS getTransformToElement(rootSVGElement, path1).d is 0.7 PASS getTransformToElement(rootSVGElement, path1).e is -265.1 -FAIL getTransformToElement(rootSVGElement, path1).f should be close to -18.9. Was -17.677916691624326. +FAIL getTransformToElement(rootSVGElement, path1).f should be close to -18.9. Was -17.677669529663703. PASS getTransformToElement(rootSVGElement, path2).a is -0.7 PASS getTransformToElement(rootSVGElement, path2).b is 0.7 PASS getTransformToElement(rootSVGElement, path2).c is -0.7 PASS getTransformToElement(rootSVGElement, path2).d is -0.7 -FAIL getTransformToElement(rootSVGElement, path2).e should be close to 442.7. Was 441.941810617502. -FAIL getTransformToElement(rootSVGElement, path2).f should be close to -156.9. Was -159.09852261339003. +FAIL getTransformToElement(rootSVGElement, path2).e should be close to 442.7. Was 441.94173824159213. +FAIL getTransformToElement(rootSVGElement, path2).f should be close to -156.9. Was -159.09902576697306. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/filters/effect-reference-composite-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/css3/filters/effect-reference-composite-expected.txt index ff45b3943..cdfcb84 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/css3/filters/effect-reference-composite-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/css3/filters/effect-reference-composite-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 61: Error: Invalid value for <feComposite> attribute y="20\"" +CONSOLE ERROR: line 61: Error: <feComposite> attribute y: Expected length, "20\"". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/filters/effect-reference-composite-hw-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/css3/filters/effect-reference-composite-hw-expected.txt index ff45b3943..cdfcb84 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/css3/filters/effect-reference-composite-hw-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/css3/filters/effect-reference-composite-hw-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 61: Error: Invalid value for <feComposite> attribute y="20\"" +CONSOLE ERROR: line 61: Error: <feComposite> attribute y: Expected length, "20\"". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-image-outset-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-image-outset-expected.png index c15d766f..7ef6191 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-image-outset-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-image-outset-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-image-outset-in-shorthand-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-image-outset-in-shorthand-expected.png index c15d766f..7ef6191 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-image-outset-in-shorthand-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-image-outset-in-shorthand-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-image-outset-split-inline-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-image-outset-split-inline-expected.png index 017be59..a3f1b1d 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-image-outset-split-inline-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-image-outset-split-inline-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-percent-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-percent-expected.png index 059ce8e6..343a0941 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-percent-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-radius-percent-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png index f5737bf..44044a12 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/css/resize-corner-tracking-transformed-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/css/resize-corner-tracking-transformed-expected.png index d1b107a..00c4176f 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/css/resize-corner-tracking-transformed-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/css/resize-corner-tracking-transformed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/placeholder-position-expected.png index 810b08c4..4f3098e6 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/placeholder-position-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/placeholder-position-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/placeholder-position-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/placeholder-position-expected.txt index 2cf28e6..328e4f9 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/placeholder-position-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/placeholder-position-expected.txt
@@ -7,9 +7,19 @@ LayoutFlexibleBox {DIV} at (3,3) size 150x16 LayoutBlockFlow {DIV} at (0,2.50) size 1x11 LayoutBlockFlow {DIV} at (1,0) size 136x16 - LayoutBR {BR} at (156,16) size 0x0 - LayoutTextControl {INPUT} at (0,22) size 154x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (154,38) size 0x0 + LayoutText {#text} at (156,1) size 4x19 + text run at (156,1) width 4: " " + LayoutBR {BR} at (160,16) size 0x0 + LayoutTextControl {INPUT} at (0,22) size 94x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (94,23) size 4x19 + text run at (94,23) width 4: " " + LayoutTextControl {INPUT} at (98,22) size 94x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (192,23) size 4x19 + text run at (192,23) width 4: " " + LayoutTextControl {INPUT} at (196,22) size 154x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (350,23) size 4x19 + text run at (350,23) width 4: " " + LayoutBR {BR} at (354,38) size 0x0 LayoutTextControl {INPUT} at (0,44) size 156x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (3,3) size 150x16 LayoutBlockFlow {DIV} at (0,2.50) size 1x11 @@ -32,7 +42,13 @@ LayoutTextControl {INPUT} at (158,248) size 154x31 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (312,253) size 4x19 text run at (312,253) width 4: " " - LayoutBR {BR} at (316,268) size 0x0 + LayoutTextControl {INPUT} at (316,251) size 154x25 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (470,253) size 4x19 + text run at (470,253) width 4: " " + LayoutTextControl {INPUT} at (474,251) size 154x25 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (628,253) size 4x19 + text run at (628,253) width 4: " " + LayoutBR {BR} at (0,0) size 0x0 LayoutTextControl {INPUT} at (0,279) size 154x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (154,280) size 4x19 text run at (154,280) width 4: " " @@ -50,11 +66,23 @@ text run at (0,0) width 66: "placeholder" layer at (12,11) size 136x16 LayoutBlockFlow {DIV} at (0,0) size 136x16 -layer at (10,33) size 150x16 - LayoutBlockFlow {DIV} at (2,3) size 150x16 [color=#A9A9A9] +layer at (10,33) size 90x16 + LayoutBlockFlow {DIV} at (2,3) size 90x16 [color=#A9A9A9] LayoutText {#text} at (0,0) size 66x16 text run at (0,0) width 66: "placeholder" -layer at (10,33) size 150x16 +layer at (10,33) size 90x16 + LayoutBlockFlow {DIV} at (2,3) size 90x16 +layer at (108,35) size 90x13 scrollHeight 14 + LayoutBlockFlow {DIV} at (2,5) size 90x13 [color=#A9A9A9] + LayoutText {#text} at (0,-2) size 66x16 + text run at (0,-2) width 66: "placeholder" +layer at (108,33) size 90x16 + LayoutBlockFlow {DIV} at (2,3) size 90x16 +layer at (206,33) size 150x16 + LayoutBlockFlow {DIV} at (2,3) size 150x16 [color=#A9A9A9] + LayoutText {#text} at (0,0) size 105x16 + text run at (0,0) width 105: "\x{65E5}\x{672C}\x{8A9E}placeholder" +layer at (206,33) size 150x16 LayoutBlockFlow {DIV} at (2,3) size 150x16 layer at (12,55) size 136x16 LayoutBlockFlow {DIV} at (4,3) size 136x16 [color=#A9A9A9] @@ -102,6 +130,18 @@ text run at (0,4) width 66: "placeholder" layer at (168,259) size 150x25 LayoutBlockFlow {DIV} at (2,3) size 150x25 +layer at (326,264) size 150x16 + LayoutBlockFlow {DIV} at (2,4.50) size 150x16 [color=#A9A9A9] + LayoutText {#text} at (0,0) size 66x16 + text run at (0,0) width 66: "placeholder" +layer at (326,264) size 150x16 + LayoutBlockFlow {DIV} at (2,4.50) size 150x16 +layer at (484,260) size 150x25 + LayoutBlockFlow {DIV} at (2,0.50) size 150x25 [color=#A9A9A9] + LayoutText {#text} at (0,4) size 66x16 + text run at (0,4) width 66: "placeholder" +layer at (484,264) size 150x16 + LayoutBlockFlow {DIV} at (2,4.50) size 150x16 layer at (10,290) size 150x16 LayoutBlockFlow {DIV} at (2,3) size 150x16 LayoutText {#text} at (59,0) size 32x16
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/search/search-vertical-alignment-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/search/search-vertical-alignment-expected.png index d3494c8..fac296a 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/search/search-vertical-alignment-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/search/search-vertical-alignment-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/search/search-vertical-alignment-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/search/search-vertical-alignment-expected.txt index 029445bb..fdabc71 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/search/search-vertical-alignment-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/search/search-vertical-alignment-expected.txt
@@ -28,14 +28,14 @@ text run at (156,0) width 4: " " LayoutTextControl {INPUT} at (160,2) size 154x16 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 - LayoutBlockFlow {P} at (0,153) size 784x21 - LayoutTextControl {INPUT} at (0,0) size 156x12 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutBlockFlow {P} at (0,153) size 784x20 + LayoutTextControl {INPUT} at (0,4) size 156x12 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (3,0) size 150x12 LayoutBlockFlow {DIV} at (2,0) size 13x13 - LayoutBlockFlow {DIV} at (18,3) size 119x6 - LayoutText {#text} at (156,1) size 4x19 - text run at (156,1) width 4: " " - LayoutTextControl {INPUT} at (160,0) size 154x12 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutBlockFlow {DIV} at (18,-2) size 119x16 + LayoutText {#text} at (156,0) size 4x19 + text run at (156,0) width 4: " " + LayoutTextControl {INPUT} at (160,4) size 154x12 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (29,79) size 119x16 LayoutBlockFlow {DIV} at (0,0) size 119x16 @@ -53,17 +53,17 @@ LayoutBlockFlow {DIV} at (2,0) size 150x16 LayoutText {#text} at (0,0) size 24x16 text run at (0,0) width 24: "Text" -layer at (29,164) size 119x6 scrollHeight 16 - LayoutBlockFlow {DIV} at (0,0) size 119x6 +layer at (29,163) size 119x16 + LayoutBlockFlow {DIV} at (0,0) size 119x16 LayoutText {#text} at (0,0) size 24x16 text run at (0,0) width 24: "Text" -layer at (170,164) size 150x6 scrollHeight 16 - LayoutBlockFlow {DIV} at (2,3) size 150x6 +layer at (170,163) size 150x16 + LayoutBlockFlow {DIV} at (2,-2) size 150x16 LayoutText {#text} at (0,0) size 24x16 text run at (0,0) width 24: "Text" layer at (149,82) size 9x9 transparent LayoutBlockFlow {DIV} at (138,15) size 9x9 layer at (149,131) size 9x9 transparent LayoutBlockFlow {DIV} at (138,3.50) size 9x9 -layer at (149,163) size 9x9 transparent +layer at (149,167) size 9x9 transparent LayoutBlockFlow {DIV} at (138,1.50) size 9x9
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-empty-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-empty-expected.png index afdcb10..c51a4ac 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-empty-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-empty-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-expected.png index 791c170..03f26d6 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-long-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-long-expected.png index ea6dac3..2ef1815 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-long-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-long-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-many-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-many-expected.png index 8050f08..52a5459 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-many-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-many-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-single-option-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-single-option-expected.png index e51d1d22..795e838 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-single-option-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-single-option-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-styled-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-styled-expected.png index c3012bbd..3b5590d 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-styled-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-styled-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-texttransform-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-texttransform-expected.png index 936541f..c1120b6 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-texttransform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-texttransform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-transform-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-transform-expected.png index 6197a0f..a02e4d9 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-zoom-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-zoom-expected.png index 9e29b06..74f59d1 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-zoom-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-zoom-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-zoom090-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-zoom090-expected.png index 58713069..d40ebf8 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-zoom090-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/select-popup/popup-menu-appearance-zoom090-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/input-placeholder-paint-order-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/input-placeholder-paint-order-expected.png index eaa69d4..40d061fd 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/input-placeholder-paint-order-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/input-placeholder-paint-order-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/text-font-height-mismatch-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/text-font-height-mismatch-expected.png index 7b4f45d..fc2b931 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/text-font-height-mismatch-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/text-font-height-mismatch-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/text-font-height-mismatch-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/text-font-height-mismatch-expected.txt index 5ec5400..63e235e 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/text-font-height-mismatch-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/text-font-height-mismatch-expected.txt
@@ -8,6 +8,7 @@ text run at (0,0) width 253: "Editable text should be centered vertically." LayoutBlockFlow {DIV} at (0,36) size 784x28 LayoutTextControl {INPUT} at (0,0) size 369x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)] + LayoutTextControl {INPUT} at (369,0) size 369x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (0,64) size 784x28 LayoutTextControl {INPUT} at (0,0) size 276x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (0,92) size 784x28 @@ -16,6 +17,10 @@ LayoutBlockFlow {DIV} at (1,2) size 367x24 LayoutText {#text} at (0,0) size 70x24 text run at (0,0) width 70: "\x{3075} ABCgjy" +layer at (378,54) size 367x24 + LayoutBlockFlow {DIV} at (1,2) size 367x24 + LayoutText {#text} at (0,0) size 70x24 + text run at (0,0) width 70: "\x{3075} ABCgjy" layer at (9,80) size 274x28 LayoutBlockFlow {DIV} at (1,0) size 274x28 LayoutText {#text} at (0,0) size 80x27
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/textfield-overflow-by-value-update-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/textfield-overflow-by-value-update-expected.txt index 082875d5..0f6b1fa 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/textfield-overflow-by-value-update-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/textfield-overflow-by-value-update-expected.txt
@@ -1,12 +1,12 @@ layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x51 - LayoutBlockFlow {HTML} at (0,0) size 800x51 - LayoutBlockFlow {BODY} at (8,8) size 784x35 - LayoutTextControl {INPUT} at (0,0) size 100x2 [bgcolor=#FFFFFF] +layer at (0,0) size 800x36 + LayoutBlockFlow {HTML} at (0,0) size 800x36 + LayoutBlockFlow {BODY} at (8,8) size 784x20 + LayoutTextControl {INPUT} at (0,4) size 100x2 [bgcolor=#FFFFFF] LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 -layer at (8,9) size 100x0 scrollHeight 37 - LayoutBlockFlow {DIV} at (0,1) size 100x0 +layer at (8,-5) size 100x37 backgroundClip at (8,0) size 100x32 clip at (8,0) size 100x32 + LayoutBlockFlow {DIV} at (0,-17.50) size 100x37 LayoutText {#text} at (0,0) size 67x36 text run at (0,0) width 67: "FAIL"
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/textfield-overflow-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/textfield-overflow-expected.txt index f19c150..ac23334 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/textfield-overflow-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/text/textfield-overflow-expected.txt
@@ -6,6 +6,6 @@ LayoutTextControl {INPUT} at (0,0) size 154x10 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 -layer at (10,11) size 150x4 scrollHeight 16 - LayoutBlockFlow {DIV} at (2,3) size 150x4 +layer at (10,5) size 150x16 + LayoutBlockFlow {DIV} at (2,-3) size 150x16 caret: position 0 of child 0 {DIV} of {#document-fragment} of child 1 {INPUT} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/repaint/change-text-content-and-background-color-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/repaint/change-text-content-and-background-color-expected.txt index 61e7d0f..fd98e29 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/repaint/change-text-content-and-background-color-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/repaint/change-text-content-and-background-color-expected.txt
@@ -6,17 +6,16 @@ "contentsOpaque": true, "drawsContent": true, "repaintRects": [ - [30, 30, 200, 24], + [30, 30, 200, 23], [30, 30, 45, 23], [30, 30, 41, 23], [8, 8, 244, 68] ], "paintInvalidationClients": [ - "RootInlineBox", "InlineTextBox ''", + "RootInlineBox", "LayoutTextControl (positioned) INPUT id='input'", "LayoutBlockFlow DIV id='inner-editor'", - "RootInlineBox", "LayoutText #text", "InlineTextBox 'NEW'" ]
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/repaint/multi-layout-one-frame-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/repaint/multi-layout-one-frame-expected.txt index fd9c099..346aab1 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/repaint/multi-layout-one-frame-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/repaint/multi-layout-one-frame-expected.txt
@@ -14,16 +14,14 @@ [10, 11, 45, 16] ], "paintInvalidationClients": [ - "RootInlineBox", "InlineTextBox ''", "RootInlineBox", "InlineTextBox ''", + "RootInlineBox", "LayoutBlockFlow DIV id='inner-editor'", - "RootInlineBox", "LayoutText #text", "InlineTextBox 'PASSED'", "LayoutBlockFlow DIV id='inner-editor'", - "RootInlineBox", "LayoutText #text", "InlineTextBox 'PASSED'" ]
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/repaint/subtree-root-skipped-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/repaint/subtree-root-skipped-expected.txt index aa5ec32..d3ffcb7 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/repaint/subtree-root-skipped-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/repaint/subtree-root-skipped-expected.txt
@@ -13,10 +13,9 @@ [8, 288, 10, 20] ], "paintInvalidationClients": [ - "RootInlineBox", "InlineTextBox ''", - "LayoutBlockFlow DIV id='inner-editor'", "RootInlineBox", + "LayoutBlockFlow DIV id='inner-editor'", "LayoutText #text", "InlineTextBox 'PASS'", "LayoutBlockFlow (positioned) DIV id='div'"
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/replaced/selection-rect-transform-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/replaced/selection-rect-transform-expected.png index d169599..9c4faf54 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/replaced/selection-rect-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/replaced/selection-rect-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/table/table-display-types-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/table/table-display-types-expected.png index 432a978..811f1ab 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/table/table-display-types-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/table/table-display-types-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/table/table-display-types-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/table/table-display-types-expected.txt index c010bee..36c4cd6c 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/table/table-display-types-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/table/table-display-types-expected.txt
@@ -1,149 +1,137 @@ -layer at (0,0) size 800x600 scrollHeight 610 +layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x610 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x610 - LayoutBlockFlow {BODY} at (8,10) size 784x592 - LayoutTable {TABLE} at (10,0) size 118x100 [border: (1px solid #000000)] - LayoutTableSection {THEAD} at (1,1) size 116x26 - LayoutTableRow {TR} at (0,2) size 116x22 - LayoutTableCell {TD} at (2,2) size 55x22 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 45x19 - text run at (1,1) width 45: "Head 1" - LayoutTableCell {TD} at (59,2) size 55x22 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 45x19 - text run at (1,1) width 45: "Head 2" - LayoutTableSection {TFOOT} at (1,75) size 116x24 - LayoutTableRow {TR} at (0,0) size 116x22 - LayoutTableCell {TD} at (2,0) size 55x22 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 53x19 - text run at (1,1) width 53: "Footer 1" - LayoutTableCell {TD} at (59,0) size 55x22 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 53x19 - text run at (1,1) width 53: "Footer 2" - LayoutTableSection {TBODY} at (1,27) size 116x48 - LayoutTableRow {TR} at (0,0) size 116x22 - LayoutTableCell {TD} at (2,0) size 55x22 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 36x19 - text run at (1,1) width 36: "Cell 1" - LayoutTableCell {TD} at (59,0) size 55x22 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 36x19 - text run at (1,1) width 36: "Cell 2" - LayoutTableRow {TR} at (0,24) size 116x22 - LayoutTableCell {TD} at (2,24) size 55x22 [r=1 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 36x19 - text run at (1,1) width 36: "Cell 3" - LayoutTableCell {TD} at (59,24) size 55x22 [r=1 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 36x19 - text run at (1,1) width 36: "Cell 4" +layer at (0,0) size 800x600 + LayoutBlockFlow {HTML} at (0,0) size 800x600 + LayoutBlockFlow {BODY} at (8,10) size 784x582 + LayoutBlockFlow {TABLE} at (10,0) size 764x100 [border: (1px solid #000000)] + LayoutTable (anonymous) at (1,1) size 116x98 + LayoutTableSection {THEAD} at (0,0) size 116x26 + LayoutTableRow {TR} at (0,2) size 116x22 + LayoutTableCell {TD} at (2,2) size 55x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 45x19 + text run at (1,1) width 45: "Head 1" + LayoutTableCell {TD} at (59,2) size 55x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 45x19 + text run at (1,1) width 45: "Head 2" + LayoutTableSection {TFOOT} at (0,74) size 116x24 + LayoutTableRow {TR} at (0,0) size 116x22 + LayoutTableCell {TD} at (2,0) size 55x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 53x19 + text run at (1,1) width 53: "Footer 1" + LayoutTableCell {TD} at (59,0) size 55x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 53x19 + text run at (1,1) width 53: "Footer 2" + LayoutTableSection {TBODY} at (0,26) size 116x48 + LayoutTableRow {TR} at (0,0) size 116x22 + LayoutTableCell {TD} at (2,0) size 55x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 1" + LayoutTableCell {TD} at (59,0) size 55x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 2" + LayoutTableRow {TR} at (0,24) size 116x22 + LayoutTableCell {TD} at (2,24) size 55x22 [r=1 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 3" + LayoutTableCell {TD} at (59,24) size 55x22 [r=1 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 4" LayoutBlockFlow {P} at (0,116) size 784x20 LayoutText {#text} at (0,0) size 210x19 text run at (0,0) width 210: "Row groups have display:table-cell" - LayoutTable {TABLE} at (10,152) size 232x64 [border: (1px solid #000000)] - LayoutTableSection (anonymous) at (1,1) size 230x34 - LayoutTableRow (anonymous) at (0,2) size 230x30 - LayoutTableCell {THEAD} at (2,2) size 104x30 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 104x30 - LayoutTableSection (anonymous) at (0,0) size 104x30 - LayoutTableRow (anonymous) at (0,2) size 104x26 - LayoutTableCell {TR} at (2,2) size 100x26 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 100x26 - LayoutTableSection (anonymous) at (0,0) size 100x26 - LayoutTableRow (anonymous) at (0,2) size 100x22 - LayoutTableCell {TD} at (2,2) size 47x22 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 45x19 - text run at (1,1) width 45: "Head 1" - LayoutTableCell {TD} at (51,2) size 47x22 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 45x19 - text run at (1,1) width 45: "Head 2" - LayoutTableCell {TFOOT} at (108,2) size 120x30 [r=0 c=1 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 120x30 - LayoutTableSection (anonymous) at (0,0) size 120x30 - LayoutTableRow (anonymous) at (0,2) size 120x26 - LayoutTableCell {TR} at (2,2) size 116x26 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 116x26 - LayoutTableSection (anonymous) at (0,0) size 116x26 - LayoutTableRow (anonymous) at (0,2) size 116x22 - LayoutTableCell {TD} at (2,2) size 55x22 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 53x19 - text run at (1,1) width 53: "Footer 1" - LayoutTableCell {TD} at (59,2) size 55x22 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 53x19 - text run at (1,1) width 53: "Footer 2" - LayoutTableSection {TBODY} at (1,35) size 230x28 - LayoutTableRow (anonymous) at (0,0) size 230x26 - LayoutTableCell {TR} at (2,0) size 104x26 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 82x26 - LayoutTableSection (anonymous) at (0,0) size 82x26 - LayoutTableRow (anonymous) at (0,2) size 82x22 - LayoutTableCell {TD} at (2,2) size 38x22 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 36x19 - text run at (1,1) width 36: "Cell 1" - LayoutTableCell {TD} at (42,2) size 38x22 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 36x19 - text run at (1,1) width 36: "Cell 2" - LayoutTableCell {TR} at (108,0) size 120x26 [r=0 c=1 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 82x26 - LayoutTableSection (anonymous) at (0,0) size 82x26 - LayoutTableRow (anonymous) at (0,2) size 82x22 - LayoutTableCell {TD} at (2,2) size 38x22 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 36x19 - text run at (1,1) width 36: "Cell 3" - LayoutTableCell {TD} at (42,2) size 38x22 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 36x19 - text run at (1,1) width 36: "Cell 4" - LayoutBlockFlow {P} at (0,232) size 784x20 + LayoutBlockFlow {TABLE} at (10,152) size 764x52 [border: (1px solid #000000)] + LayoutTable (anonymous) at (1,1) size 218x50 + LayoutTableSection (anonymous) at (0,0) size 218x28 + LayoutTableRow (anonymous) at (0,2) size 218x24 + LayoutTableCell {THEAD} at (2,2) size 98x24 [r=0 c=0 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 98x24 + LayoutTableSection (anonymous) at (0,0) size 98x24 + LayoutTableRow (anonymous) at (0,2) size 98x20 + LayoutTableCell {TR} at (2,2) size 94x20 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 47x21 + LayoutText {#text} at (1,0) size 45x19 + text run at (1,0) width 45: "Head 1" + LayoutInline {TD} at (0,0) size 47x21 + LayoutText {#text} at (48,0) size 45x19 + text run at (48,0) width 45: "Head 2" + LayoutTableCell {TFOOT} at (102,2) size 114x24 [r=0 c=1 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 114x24 + LayoutTableSection (anonymous) at (0,0) size 114x24 + LayoutTableRow (anonymous) at (0,2) size 114x20 + LayoutTableCell {TR} at (2,2) size 110x20 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 55x21 + LayoutText {#text} at (1,0) size 53x19 + text run at (1,0) width 53: "Footer 1" + LayoutInline {TD} at (0,0) size 55x21 + LayoutText {#text} at (56,0) size 53x19 + text run at (56,0) width 53: "Footer 2" + LayoutTableSection {TBODY} at (0,28) size 218x22 + LayoutTableRow (anonymous) at (0,0) size 218x20 + LayoutTableCell {TR} at (2,0) size 98x20 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 38x21 + LayoutText {#text} at (1,0) size 36x19 + text run at (1,0) width 36: "Cell 1" + LayoutInline {TD} at (0,0) size 38x21 + LayoutText {#text} at (39,0) size 36x19 + text run at (39,0) width 36: "Cell 2" + LayoutTableCell {TR} at (102,0) size 114x20 [r=0 c=1 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 38x21 + LayoutText {#text} at (1,0) size 36x19 + text run at (1,0) width 36: "Cell 3" + LayoutInline {TD} at (0,0) size 38x21 + LayoutText {#text} at (39,0) size 36x19 + text run at (39,0) width 36: "Cell 4" + LayoutBlockFlow {P} at (0,220) size 784x20 LayoutText {#text} at (0,0) size 189x19 text run at (0,0) width 189: "Row groups have display:block" - LayoutTable {TABLE} at (10,268) size 122x112 [border: (1px solid #000000)] - LayoutTableSection (anonymous) at (1,1) size 120x56 - LayoutTableRow (anonymous) at (0,2) size 120x52 - LayoutTableCell (anonymous) at (2,2) size 116x52 [r=0 c=0 rs=1 cs=1] - LayoutBlockFlow {THEAD} at (0,0) size 116x26 - LayoutBlockFlow {TR} at (0,0) size 116x26 - LayoutTable (anonymous) at (0,0) size 100x26 - LayoutTableSection (anonymous) at (0,0) size 100x26 - LayoutTableRow (anonymous) at (0,2) size 100x22 - LayoutTableCell {TD} at (2,2) size 47x22 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 45x19 - text run at (1,1) width 45: "Head 1" - LayoutTableCell {TD} at (51,2) size 47x22 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 45x19 - text run at (1,1) width 45: "Head 2" - LayoutBlockFlow {TFOOT} at (0,26) size 116x26 - LayoutBlockFlow {TR} at (0,0) size 116x26 - LayoutTable (anonymous) at (0,0) size 116x26 - LayoutTableSection (anonymous) at (0,0) size 116x26 - LayoutTableRow (anonymous) at (0,2) size 116x22 - LayoutTableCell {TD} at (2,2) size 55x22 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 53x19 - text run at (1,1) width 53: "Footer 1" - LayoutTableCell {TD} at (59,2) size 55x22 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 53x19 - text run at (1,1) width 53: "Footer 2" - LayoutTableSection {TBODY} at (1,57) size 120x54 - LayoutTableRow (anonymous) at (0,0) size 120x52 - LayoutTableCell (anonymous) at (2,0) size 116x52 [r=0 c=0 rs=1 cs=1] - LayoutBlockFlow {TR} at (0,0) size 116x26 - LayoutTable (anonymous) at (0,0) size 82x26 - LayoutTableSection (anonymous) at (0,0) size 82x26 - LayoutTableRow (anonymous) at (0,2) size 82x22 - LayoutTableCell {TD} at (2,2) size 38x22 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 36x19 - text run at (1,1) width 36: "Cell 1" - LayoutTableCell {TD} at (42,2) size 38x22 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 36x19 - text run at (1,1) width 36: "Cell 2" - LayoutBlockFlow {TR} at (0,26) size 116x26 - LayoutTable (anonymous) at (0,0) size 82x26 - LayoutTableSection (anonymous) at (0,0) size 82x26 - LayoutTableRow (anonymous) at (0,2) size 82x22 - LayoutTableCell {TD} at (2,2) size 38x22 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 36x19 - text run at (1,1) width 36: "Cell 3" - LayoutTableCell {TD} at (42,2) size 38x22 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 36x19 - text run at (1,1) width 36: "Cell 4" - LayoutTable (anonymous) at (0,390) size 302x202 + LayoutBlockFlow {TABLE} at (10,256) size 764x110 [border: (1px solid #000000)] + LayoutBlockFlow {THEAD} at (1,1) size 762x26 + LayoutBlockFlow {TR} at (0,0) size 762x26 + LayoutTable (anonymous) at (0,0) size 100x26 + LayoutTableSection (anonymous) at (0,0) size 100x26 + LayoutTableRow (anonymous) at (0,2) size 100x22 + LayoutTableCell {TD} at (2,2) size 47x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 45x19 + text run at (1,1) width 45: "Head 1" + LayoutTableCell {TD} at (51,2) size 47x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 45x19 + text run at (1,1) width 45: "Head 2" + LayoutBlockFlow {TFOOT} at (1,27) size 762x26 + LayoutBlockFlow {TR} at (0,0) size 762x26 + LayoutTable (anonymous) at (0,0) size 116x26 + LayoutTableSection (anonymous) at (0,0) size 116x26 + LayoutTableRow (anonymous) at (0,2) size 116x22 + LayoutTableCell {TD} at (2,2) size 55x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 53x19 + text run at (1,1) width 53: "Footer 1" + LayoutTableCell {TD} at (59,2) size 55x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 53x19 + text run at (1,1) width 53: "Footer 2" + LayoutTable (anonymous) at (1,53) size 86x56 + LayoutTableSection {TBODY} at (0,0) size 86x56 + LayoutTableRow (anonymous) at (0,2) size 86x52 + LayoutTableCell (anonymous) at (2,2) size 82x52 [r=0 c=0 rs=1 cs=1] + LayoutBlockFlow {TR} at (0,0) size 82x26 + LayoutTable (anonymous) at (0,0) size 82x26 + LayoutTableSection (anonymous) at (0,0) size 82x26 + LayoutTableRow (anonymous) at (0,2) size 82x22 + LayoutTableCell {TD} at (2,2) size 38x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 1" + LayoutTableCell {TD} at (42,2) size 38x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 2" + LayoutBlockFlow {TR} at (0,26) size 82x26 + LayoutTable (anonymous) at (0,0) size 82x26 + LayoutTableSection (anonymous) at (0,0) size 82x26 + LayoutTableRow (anonymous) at (0,2) size 82x22 + LayoutTableCell {TD} at (2,2) size 38x22 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 3" + LayoutTableCell {TD} at (42,2) size 38x22 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 36x19 + text run at (1,1) width 36: "Cell 4" + LayoutTable (anonymous) at (0,376) size 302x202 LayoutTableSection (anonymous) at (0,0) size 302x202 LayoutTableRow (anonymous) at (0,0) size 302x202 LayoutTableCell {P} at (0,0) size 302x202 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1]
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/table/table-display-types-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/table/table-display-types-vertical-expected.png index 59961f2..3f45d32d 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/table/table-display-types-vertical-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/table/table-display-types-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/table/table-display-types-vertical-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/table/table-display-types-vertical-expected.txt index dae83f92..f31beaf 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/table/table-display-types-vertical-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/table/table-display-types-vertical-expected.txt
@@ -1,149 +1,137 @@ -layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 1226 +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 1210 LayoutView at (0,0) size 800x600 -layer at (0,0) size 785x1226 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 - LayoutBlockFlow {HTML} at (0,0) size 785x1226 - LayoutBlockFlow {BODY} at (8,10) size 769x1208 - LayoutTable {TABLE} at (10,0) size 100x118 [border: (1px solid #000000)] - LayoutTableSection {THEAD} at (1,1) size 26x116 - LayoutTableRow {TR} at (0,2) size 22x116 - LayoutTableCell {TD} at (2,2) size 22x55 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x45 - text run at (1,1) width 45: "Head 1" - LayoutTableCell {TD} at (2,59) size 22x55 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x45 - text run at (1,1) width 45: "Head 2" - LayoutTableSection {TFOOT} at (75,1) size 24x116 - LayoutTableRow {TR} at (0,0) size 22x116 - LayoutTableCell {TD} at (0,2) size 22x55 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x53 - text run at (1,1) width 53: "Footer 1" - LayoutTableCell {TD} at (0,59) size 22x55 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x53 - text run at (1,1) width 53: "Footer 2" - LayoutTableSection {TBODY} at (27,1) size 48x116 - LayoutTableRow {TR} at (0,0) size 22x116 - LayoutTableCell {TD} at (0,2) size 22x55 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x36 - text run at (1,1) width 36: "Cell 1" - LayoutTableCell {TD} at (0,59) size 22x55 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x36 - text run at (1,1) width 36: "Cell 2" - LayoutTableRow {TR} at (0,24) size 22x116 - LayoutTableCell {TD} at (24,2) size 22x55 [r=1 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x36 - text run at (1,1) width 36: "Cell 3" - LayoutTableCell {TD} at (24,59) size 22x55 [r=1 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x36 - text run at (1,1) width 36: "Cell 4" +layer at (0,0) size 785x1210 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow {HTML} at (0,0) size 785x1210 + LayoutBlockFlow {BODY} at (8,10) size 769x1192 + LayoutBlockFlow {TABLE} at (10,0) size 100x118 [border: (1px solid #000000)] + LayoutTable (anonymous) at (1,1) size 98x116 + LayoutTableSection {THEAD} at (0,0) size 26x116 + LayoutTableRow {TR} at (0,2) size 22x116 + LayoutTableCell {TD} at (2,2) size 22x55 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x45 + text run at (1,1) width 45: "Head 1" + LayoutTableCell {TD} at (2,59) size 22x55 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x45 + text run at (1,1) width 45: "Head 2" + LayoutTableSection {TFOOT} at (74,0) size 24x116 + LayoutTableRow {TR} at (0,0) size 22x116 + LayoutTableCell {TD} at (0,2) size 22x55 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x53 + text run at (1,1) width 53: "Footer 1" + LayoutTableCell {TD} at (0,59) size 22x55 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x53 + text run at (1,1) width 53: "Footer 2" + LayoutTableSection {TBODY} at (26,0) size 48x116 + LayoutTableRow {TR} at (0,0) size 22x116 + LayoutTableCell {TD} at (0,2) size 22x55 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 1" + LayoutTableCell {TD} at (0,59) size 22x55 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 2" + LayoutTableRow {TR} at (0,24) size 22x116 + LayoutTableCell {TD} at (24,2) size 22x55 [r=1 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 3" + LayoutTableCell {TD} at (24,59) size 22x55 [r=1 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 4" LayoutBlockFlow {P} at (0,134) size 769x20 LayoutText {#text} at (0,0) size 210x19 text run at (0,0) width 210: "Row groups have display:table-cell" - LayoutTable {TABLE} at (10,170) size 64x232 [border: (1px solid #000000)] - LayoutTableSection (anonymous) at (1,1) size 34x230 - LayoutTableRow (anonymous) at (0,2) size 30x230 - LayoutTableCell {THEAD} at (2,2) size 30x104 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 30x104 - LayoutTableSection (anonymous) at (0,0) size 30x104 - LayoutTableRow (anonymous) at (0,2) size 26x104 - LayoutTableCell {TR} at (2,2) size 26x100 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 26x100 - LayoutTableSection (anonymous) at (0,0) size 26x100 - LayoutTableRow (anonymous) at (0,2) size 22x100 - LayoutTableCell {TD} at (2,2) size 22x47 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x45 - text run at (1,1) width 45: "Head 1" - LayoutTableCell {TD} at (2,51) size 22x47 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x45 - text run at (1,1) width 45: "Head 2" - LayoutTableCell {TFOOT} at (2,108) size 30x120 [r=0 c=1 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 30x120 - LayoutTableSection (anonymous) at (0,0) size 30x120 - LayoutTableRow (anonymous) at (0,2) size 26x120 - LayoutTableCell {TR} at (2,2) size 26x116 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 26x116 - LayoutTableSection (anonymous) at (0,0) size 26x116 - LayoutTableRow (anonymous) at (0,2) size 22x116 - LayoutTableCell {TD} at (2,2) size 22x55 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x53 - text run at (1,1) width 53: "Footer 1" - LayoutTableCell {TD} at (2,59) size 22x55 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x53 - text run at (1,1) width 53: "Footer 2" - LayoutTableSection {TBODY} at (35,1) size 28x230 - LayoutTableRow (anonymous) at (0,0) size 26x230 - LayoutTableCell {TR} at (0,2) size 26x104 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 26x82 - LayoutTableSection (anonymous) at (0,0) size 26x82 - LayoutTableRow (anonymous) at (0,2) size 22x82 - LayoutTableCell {TD} at (2,2) size 22x38 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x36 - text run at (1,1) width 36: "Cell 1" - LayoutTableCell {TD} at (2,42) size 22x38 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x36 - text run at (1,1) width 36: "Cell 2" - LayoutTableCell {TR} at (0,108) size 26x120 [r=0 c=1 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 26x82 - LayoutTableSection (anonymous) at (0,0) size 26x82 - LayoutTableRow (anonymous) at (0,2) size 22x82 - LayoutTableCell {TD} at (2,2) size 22x38 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x36 - text run at (1,1) width 36: "Cell 3" - LayoutTableCell {TD} at (2,42) size 22x38 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x36 - text run at (1,1) width 36: "Cell 4" - LayoutBlockFlow {P} at (0,418) size 769x20 + LayoutBlockFlow {TABLE} at (10,170) size 52x220 [border: (1px solid #000000)] + LayoutTable (anonymous) at (1,1) size 50x218 + LayoutTableSection (anonymous) at (0,0) size 28x218 + LayoutTableRow (anonymous) at (0,2) size 24x218 + LayoutTableCell {THEAD} at (2,2) size 24x98 [r=0 c=0 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 24x98 + LayoutTableSection (anonymous) at (0,0) size 24x98 + LayoutTableRow (anonymous) at (0,2) size 20x98 + LayoutTableCell {TR} at (2,2) size 20x94 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 21x47 + LayoutText {#text} at (0,1) size 19x45 + text run at (0,1) width 45: "Head 1" + LayoutInline {TD} at (0,0) size 21x47 + LayoutText {#text} at (0,48) size 19x45 + text run at (0,48) width 45: "Head 2" + LayoutTableCell {TFOOT} at (2,102) size 24x114 [r=0 c=1 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 24x114 + LayoutTableSection (anonymous) at (0,0) size 24x114 + LayoutTableRow (anonymous) at (0,2) size 20x114 + LayoutTableCell {TR} at (2,2) size 20x110 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 21x55 + LayoutText {#text} at (0,1) size 19x53 + text run at (0,1) width 53: "Footer 1" + LayoutInline {TD} at (0,0) size 21x55 + LayoutText {#text} at (0,56) size 19x53 + text run at (0,56) width 53: "Footer 2" + LayoutTableSection {TBODY} at (28,0) size 22x218 + LayoutTableRow (anonymous) at (0,0) size 20x218 + LayoutTableCell {TR} at (0,2) size 20x98 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 21x38 + LayoutText {#text} at (0,1) size 19x36 + text run at (0,1) width 36: "Cell 1" + LayoutInline {TD} at (0,0) size 21x38 + LayoutText {#text} at (0,39) size 19x36 + text run at (0,39) width 36: "Cell 2" + LayoutTableCell {TR} at (0,102) size 20x114 [r=0 c=1 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 21x38 + LayoutText {#text} at (0,1) size 19x36 + text run at (0,1) width 36: "Cell 3" + LayoutInline {TD} at (0,0) size 21x38 + LayoutText {#text} at (0,39) size 19x36 + text run at (0,39) width 36: "Cell 4" + LayoutBlockFlow {P} at (0,406) size 769x20 LayoutText {#text} at (0,0) size 189x19 text run at (0,0) width 189: "Row groups have display:block" - LayoutTable {TABLE} at (10,454) size 112x122 [border: (1px solid #000000)] - LayoutTableSection (anonymous) at (1,1) size 56x120 - LayoutTableRow (anonymous) at (0,2) size 52x120 - LayoutTableCell (anonymous) at (2,2) size 52x116 [r=0 c=0 rs=1 cs=1] - LayoutBlockFlow {THEAD} at (0,0) size 26x116 - LayoutBlockFlow {TR} at (0,0) size 26x116 - LayoutTable (anonymous) at (0,0) size 26x100 - LayoutTableSection (anonymous) at (0,0) size 26x100 - LayoutTableRow (anonymous) at (0,2) size 22x100 - LayoutTableCell {TD} at (2,2) size 22x47 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x45 - text run at (1,1) width 45: "Head 1" - LayoutTableCell {TD} at (2,51) size 22x47 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x45 - text run at (1,1) width 45: "Head 2" - LayoutBlockFlow {TFOOT} at (26,0) size 26x116 - LayoutBlockFlow {TR} at (0,0) size 26x116 - LayoutTable (anonymous) at (0,0) size 26x116 - LayoutTableSection (anonymous) at (0,0) size 26x116 - LayoutTableRow (anonymous) at (0,2) size 22x116 - LayoutTableCell {TD} at (2,2) size 22x55 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x53 - text run at (1,1) width 53: "Footer 1" - LayoutTableCell {TD} at (2,59) size 22x55 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x53 - text run at (1,1) width 53: "Footer 2" - LayoutTableSection {TBODY} at (57,1) size 54x120 - LayoutTableRow (anonymous) at (0,0) size 52x120 - LayoutTableCell (anonymous) at (0,2) size 52x116 [r=0 c=0 rs=1 cs=1] - LayoutBlockFlow {TR} at (0,0) size 26x116 - LayoutTable (anonymous) at (0,0) size 26x82 - LayoutTableSection (anonymous) at (0,0) size 26x82 - LayoutTableRow (anonymous) at (0,2) size 22x82 - LayoutTableCell {TD} at (2,2) size 22x38 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x36 - text run at (1,1) width 36: "Cell 1" - LayoutTableCell {TD} at (2,42) size 22x38 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x36 - text run at (1,1) width 36: "Cell 2" - LayoutBlockFlow {TR} at (26,0) size 26x116 - LayoutTable (anonymous) at (0,0) size 26x82 - LayoutTableSection (anonymous) at (0,0) size 26x82 - LayoutTableRow (anonymous) at (0,2) size 22x82 - LayoutTableCell {TD} at (2,2) size 22x38 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x36 - text run at (1,1) width 36: "Cell 3" - LayoutTableCell {TD} at (2,42) size 22x38 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 19x36 - text run at (1,1) width 36: "Cell 4" - LayoutTable (anonymous) at (0,586) size 102x622 + LayoutBlockFlow {TABLE} at (10,442) size 110x118 [border: (1px solid #000000)] + LayoutBlockFlow {THEAD} at (1,1) size 26x116 + LayoutBlockFlow {TR} at (0,0) size 26x116 + LayoutTable (anonymous) at (0,0) size 26x100 + LayoutTableSection (anonymous) at (0,0) size 26x100 + LayoutTableRow (anonymous) at (0,2) size 22x100 + LayoutTableCell {TD} at (2,2) size 22x47 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x45 + text run at (1,1) width 45: "Head 1" + LayoutTableCell {TD} at (2,51) size 22x47 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x45 + text run at (1,1) width 45: "Head 2" + LayoutBlockFlow {TFOOT} at (27,1) size 26x116 + LayoutBlockFlow {TR} at (0,0) size 26x116 + LayoutTable (anonymous) at (0,0) size 26x116 + LayoutTableSection (anonymous) at (0,0) size 26x116 + LayoutTableRow (anonymous) at (0,2) size 22x116 + LayoutTableCell {TD} at (2,2) size 22x55 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x53 + text run at (1,1) width 53: "Footer 1" + LayoutTableCell {TD} at (2,59) size 22x55 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x53 + text run at (1,1) width 53: "Footer 2" + LayoutTable (anonymous) at (53,1) size 56x86 + LayoutTableSection {TBODY} at (0,0) size 56x86 + LayoutTableRow (anonymous) at (0,2) size 52x86 + LayoutTableCell (anonymous) at (2,2) size 52x82 [r=0 c=0 rs=1 cs=1] + LayoutBlockFlow {TR} at (0,0) size 26x82 + LayoutTable (anonymous) at (0,0) size 26x82 + LayoutTableSection (anonymous) at (0,0) size 26x82 + LayoutTableRow (anonymous) at (0,2) size 22x82 + LayoutTableCell {TD} at (2,2) size 22x38 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 1" + LayoutTableCell {TD} at (2,42) size 22x38 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 2" + LayoutBlockFlow {TR} at (26,0) size 26x82 + LayoutTable (anonymous) at (0,0) size 26x82 + LayoutTableSection (anonymous) at (0,0) size 26x82 + LayoutTableRow (anonymous) at (0,2) size 22x82 + LayoutTableCell {TD} at (2,2) size 22x38 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 3" + LayoutTableCell {TD} at (2,42) size 22x38 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 19x36 + text run at (1,1) width 36: "Cell 4" + LayoutTable (anonymous) at (0,570) size 102x622 LayoutTableSection (anonymous) at (0,0) size 102x622 LayoutTableRow (anonymous) at (0,0) size 102x622 LayoutTableCell {P} at (0,0) size 102x622 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1]
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/transforms/transformed-focused-text-input-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/transforms/transformed-focused-text-input-expected.png index 1c77173..9730faa 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/transforms/transformed-focused-text-input-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/transforms/transformed-focused-text-input-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/border-image-vertical-lr-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/border-image-vertical-lr-expected.png index fbd7bcc..f7e4838 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/border-image-vertical-lr-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/border-image-vertical-lr-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/border-image-vertical-rl-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/border-image-vertical-rl-expected.png index 21e70dc..b36c79b 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/border-image-vertical-rl-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/writing-mode/border-image-vertical-rl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt new file mode 100644 index 0000000..6b524d7c --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt
@@ -0,0 +1,86 @@ +zh-CN: 誤過骨 +#zh-CN: +"Times New Roman" : 7, +"Kochi Mincho" : 3 + +zh-TW: 誤過骨 +#zh-TW: +"Times New Roman" : 7, +"Kochi Mincho" : 3 + +zh-HK: 誤過骨 +#zh-HK: +"Times New Roman" : 7, +"Kochi Mincho" : 3 + +ja: 誤過骨 +#ja: +"Times New Roman" : 4, +"Kochi Mincho" : 3 + +ja-JP: 誤過骨 +#ja-JP: +"Times New Roman" : 7, +"Kochi Mincho" : 3 + +ko: 誤過骨 +#ko: +"Times New Roman" : 4, +"Kochi Mincho" : 3 + +ko-KR: 誤過骨 +#ko-KR: +"Times New Roman" : 7, +"Kochi Mincho" : 3 + +en-CN: 誤過骨 +#en-CN: +"Times New Roman" : 7, +"Kochi Mincho" : 3 + +en-JP: 誤過骨 +#en-JP: +"Times New Roman" : 7, +"Kochi Mincho" : 3 + +en-KR: 誤過骨 +#en-KR: +"Times New Roman" : 7, +"Kochi Mincho" : 3 + +en-HK: 誤過骨 +#en-HK: +"Times New Roman" : 7, +"Kochi Mincho" : 3 + +en-TW: 誤過骨 +#en-TW: +"Times New Roman" : 7, +"Kochi Mincho" : 3 + +en-HanS: 誤過骨 +#en-HanS: +"Times New Roman" : 9, +"Kochi Mincho" : 3 + +en-HanT: 誤過骨 +#en-HanT: +"Times New Roman" : 9, +"Kochi Mincho" : 3 + +en-HanS-JP: 誤過骨 +#en-HanS-JP: +"Times New Roman" : 12, +"Kochi Mincho" : 3 + +en-HanT-JP: 誤過骨 +#en-HanT-JP: +"Times New Roman" : 12, +"Kochi Mincho" : 3 + +en-US: 誤過骨 +#en-US: +"Times New Roman" : 7, +"Kochi Mincho" : 3 + +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/audio-repaint-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/audio-repaint-expected.png index 33cfbe9e..f5d507b3 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/media/audio-repaint-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/media/audio-repaint-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/invalidate-box-shadow-currentColor-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/invalidate-box-shadow-currentColor-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/paint/invalidation/invalidate-box-shadow-currentColor-expected.txt rename to third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/invalidate-box-shadow-currentColor-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/linux/printing/ellipsis-printing-style-expected.png b/third_party/WebKit/LayoutTests/platform/linux/printing/ellipsis-printing-style-expected.png new file mode 100644 index 0000000..dd91259 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/printing/ellipsis-printing-style-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/printing/iframe-print-expected.png b/third_party/WebKit/LayoutTests/platform/linux/printing/iframe-print-expected.png index a80552a5..be748b9 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/printing/iframe-print-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/printing/iframe-print-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png index d5021e1..69fcfc67 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/coords-units-01-b-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/coords-units-01-b-expected.png index c92695ab..88eda7a 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/coords-units-01-b-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/coords-units-01-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/text-path-01-b-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/text-path-01-b-expected.txt index 9b9af15..e047347 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/text-path-01-b-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/text-path-01-b-expected.txt
@@ -13,7 +13,7 @@ LayoutSVGText {text} at (168,-7) size 205x121 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 205x120 LayoutSVGInlineText {#text} at (0,0) size 205x120 - chunk 1 text run 1 at (203.03,79.11) startOffset 0 endOffset 1 width 22.00: "T" + chunk 1 text run 1 at (203.03,79.10) startOffset 0 endOffset 1 width 22.00: "T" chunk 1 text run 2 at (212.08,61.90) startOffset 1 endOffset 2 width 17.00: "e" chunk 1 text run 3 at (222.25,47.53) startOffset 2 endOffset 3 width 18.00: "x" chunk 1 text run 4 at (232.81,36.82) startOffset 3 endOffset 4 width 12.00: "t" @@ -36,7 +36,7 @@ LayoutSVGTSpan {tspan} at (0,0) size 56x58 LayoutSVGInlineText {#text} at (0,37) size 56x57 chunk 1 text run 1 at (37.49,135.59) startOffset 0 endOffset 1 width 22.00: "T" - chunk 1 text run 2 at (46.52,118.38) startOffset 1 endOffset 2 width 17.00: "e" + chunk 1 text run 2 at (46.52,118.37) startOffset 1 endOffset 2 width 17.00: "e" LayoutSVGTSpan {tspan} at (0,0) size 44x41 LayoutSVGInlineText {#text} at (33,26) size 44x41 chunk 1 text run 1 at (56.69,104.00) startOffset 0 endOffset 1 width 18.00: "x" @@ -63,7 +63,7 @@ LayoutSVGContainer {g} at (113,212) size 300x80 LayoutSVGContainer {use} at (113,231) size 300x4 LayoutSVGPath {path} at (113,231) size 300x4 [stroke={[type=SOLID] [color=#0000FF] [stroke width=4.00]}] [data="M 113 233 L 413 233"] - LayoutSVGText {text} at (211,212) size 181x27 contains 1 chunk(s) + LayoutSVGText {text} at (212,212) size 180x27 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 180x27 LayoutSVGInlineText {#text} at (0,0) size 180x27 chunk 1 text run 1 at (219.00,233.00) startOffset 0 endOffset 1 width 14.00: "T"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/animations/animate-elem-08-t-drt-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/animations/animate-elem-08-t-drt-expected.txt similarity index 89% rename from third_party/WebKit/LayoutTests/platform/mac/svg/animations/animate-elem-08-t-drt-expected.txt rename to third_party/WebKit/LayoutTests/platform/linux/svg/animations/animate-elem-08-t-drt-expected.txt index b222eaf7..ee7bd6a 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/animations/animate-elem-08-t-drt-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/animations/animate-elem-08-t-drt-expected.txt
@@ -23,38 +23,38 @@ PASS getTransformToElement(rootSVGElement, path1).b is 0.1 PASS getTransformToElement(rootSVGElement, path1).c is -0.1 PASS getTransformToElement(rootSVGElement, path1).d is 1 -FAIL getTransformToElement(rootSVGElement, path1).e should be close to -70.3. Was -70.87814895357428. -FAIL getTransformToElement(rootSVGElement, path1).f should be close to -182.8. Was -182.60109333201257. +FAIL getTransformToElement(rootSVGElement, path1).e should be close to -70.3. Was -70.88506886404467. +FAIL getTransformToElement(rootSVGElement, path1).f should be close to -182.8. Was -182.5994545194139. PASS getTransformToElement(rootSVGElement, path2).a is -1 PASS getTransformToElement(rootSVGElement, path2).b is -0.1 PASS getTransformToElement(rootSVGElement, path2).c is 0.1 PASS getTransformToElement(rootSVGElement, path2).d is -1 -FAIL getTransformToElement(rootSVGElement, path2).e should be close to 318.6. Was 319.29822182153924. -FAIL getTransformToElement(rootSVGElement, path2).f should be close to 211.6. Was 210.66313575977358. +FAIL getTransformToElement(rootSVGElement, path2).e should be close to 318.6. Was 319.3057494247923. +FAIL getTransformToElement(rootSVGElement, path2).f should be close to 211.6. Was 210.65582089693936. PASS getTransformToElement(rootSVGElement, path1).a is 0.7 PASS getTransformToElement(rootSVGElement, path1).b is -0.7 PASS getTransformToElement(rootSVGElement, path1).c is 0.7 PASS getTransformToElement(rootSVGElement, path1).d is 0.7 PASS getTransformToElement(rootSVGElement, path1).e is -265.1 -FAIL getTransformToElement(rootSVGElement, path1).f should be close to -18.9. Was -17.677916691624326. +FAIL getTransformToElement(rootSVGElement, path1).f should be close to -18.9. Was -17.677669529663703. PASS getTransformToElement(rootSVGElement, path2).a is -0.7 PASS getTransformToElement(rootSVGElement, path2).b is 0.7 PASS getTransformToElement(rootSVGElement, path2).c is -0.7 PASS getTransformToElement(rootSVGElement, path2).d is -0.7 -FAIL getTransformToElement(rootSVGElement, path2).e should be close to 442.7. Was 441.941810617502. -FAIL getTransformToElement(rootSVGElement, path2).f should be close to -156.9. Was -159.09852261339003. +FAIL getTransformToElement(rootSVGElement, path2).e should be close to 442.7. Was 441.94173824159213. +FAIL getTransformToElement(rootSVGElement, path2).f should be close to -156.9. Was -159.09902576697306. PASS getTransformToElement(rootSVGElement, path1).a is 0.7 PASS getTransformToElement(rootSVGElement, path1).b is -0.7 PASS getTransformToElement(rootSVGElement, path1).c is 0.7 PASS getTransformToElement(rootSVGElement, path1).d is 0.7 PASS getTransformToElement(rootSVGElement, path1).e is -265.1 -FAIL getTransformToElement(rootSVGElement, path1).f should be close to -18.9. Was -17.677916691624326. +FAIL getTransformToElement(rootSVGElement, path1).f should be close to -18.9. Was -17.677669529663703. PASS getTransformToElement(rootSVGElement, path2).a is -0.7 PASS getTransformToElement(rootSVGElement, path2).b is 0.7 PASS getTransformToElement(rootSVGElement, path2).c is -0.7 PASS getTransformToElement(rootSVGElement, path2).d is -0.7 -FAIL getTransformToElement(rootSVGElement, path2).e should be close to 442.7. Was 441.941810617502. -FAIL getTransformToElement(rootSVGElement, path2).f should be close to -156.9. Was -159.09852261339003. +FAIL getTransformToElement(rootSVGElement, path2).e should be close to 442.7. Was 441.94173824159213. +FAIL getTransformToElement(rootSVGElement, path2).f should be close to -156.9. Was -159.09902576697306. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/animations/animate-text-nested-transforms-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/animations/animate-text-nested-transforms-expected.txt index 92258fa..25c911c5 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/animations/animate-text-nested-transforms-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/animations/animate-text-nested-transforms-expected.txt
@@ -7,7 +7,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -FAIL rootSVGElement.getBBox().x should be close to 117. Was 115.01837921142578. +FAIL rootSVGElement.getBBox().x should be close to 117. Was 115.01841735839844. FAIL rootSVGElement.getBBox().y should be close to -160. Was -154.0113525390625. PASS rootSVGElement.getBBox().x is 367 PASS rootSVGElement.getBBox().y is 550
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textGlyphOrientationHorizontal-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textGlyphOrientationHorizontal-expected.txt index 18504f3..14260789 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textGlyphOrientationHorizontal-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textGlyphOrientationHorizontal-expected.txt
@@ -32,7 +32,7 @@ LayoutSVGTSpan {tspan} at (0,0) size 64x48 LayoutSVGInlineText {#text} at (74,22) size 64x47 chunk 1 text run 1 at (86.10,26.06) startOffset 0 endOffset 1 width 7.00: " " - chunk 1 text run 2 at (95.52,34.83) startOffset 1 endOffset 2 width 19.00: "G" + chunk 1 text run 2 at (95.53,34.83) startOffset 1 endOffset 2 width 19.00: "G" chunk 1 text run 3 at (108.51,44.22) startOffset 2 endOffset 3 width 13.00: "o" chunk 1 text run 4 at (120.77,48.22) startOffset 3 endOffset 4 width 13.00: "o" chunk 1 text run 5 at (133.63,45.06) startOffset 4 endOffset 5 width 14.00: "d" @@ -51,11 +51,11 @@ chunk 1 text run 2 at (40.29,30.05) startOffset 1 endOffset 2 width 13.00: "a" chunk 1 text run 3 at (49.31,25.93) startOffset 2 endOffset 3 width 7.00: "t" chunk 1 text run 4 at (54.86,23.55) startOffset 3 endOffset 4 width 5.00: "i" - chunk 1 text run 5 at (62.74,20.44) startOffset 4 endOffset 5 width 12.00: "k" + chunk 1 text run 5 at (62.75,20.43) startOffset 4 endOffset 5 width 12.00: "k" chunk 1 text run 6 at (71.76,17.33) startOffset 5 endOffset 6 width 7.00: " " LayoutSVGTSpan {tspan} at (0,0) size 25x31 LayoutSVGInlineText {#text} at (56,0) size 24x31 - chunk 1 text run 1 at (77.49,15.65) startOffset 0 endOffset 1 width 5.00: "i" + chunk 1 text run 1 at (77.50,15.65) startOffset 0 endOffset 1 width 5.00: "i" chunk 1 text run 2 at (85.78,13.70) startOffset 1 endOffset 2 width 12.00: "s" LayoutSVGTSpan {tspan} at (0,0) size 76x43 LayoutSVGInlineText {#text} at (78,8) size 75x43 @@ -88,7 +88,7 @@ LayoutSVGTSpan {tspan} at (0,0) size 64x48 LayoutSVGInlineText {#text} at (74,22) size 64x47 chunk 1 text run 1 at (86.10,26.06) startOffset 0 endOffset 1 width 7.00: " " - chunk 1 text run 2 at (95.52,34.83) startOffset 1 endOffset 2 width 19.00: "G" + chunk 1 text run 2 at (95.53,34.83) startOffset 1 endOffset 2 width 19.00: "G" chunk 1 text run 3 at (108.51,44.22) startOffset 2 endOffset 3 width 13.00: "o" chunk 1 text run 4 at (120.77,48.22) startOffset 3 endOffset 4 width 13.00: "o" chunk 1 text run 5 at (133.63,45.06) startOffset 4 endOffset 5 width 14.00: "d" @@ -107,11 +107,11 @@ chunk 1 text run 2 at (40.29,30.05) startOffset 1 endOffset 2 width 13.00: "a" chunk 1 text run 3 at (49.31,25.93) startOffset 2 endOffset 3 width 7.00: "t" chunk 1 text run 4 at (54.86,23.55) startOffset 3 endOffset 4 width 5.00: "i" - chunk 1 text run 5 at (62.74,20.44) startOffset 4 endOffset 5 width 12.00: "k" + chunk 1 text run 5 at (62.75,20.43) startOffset 4 endOffset 5 width 12.00: "k" chunk 1 text run 6 at (71.76,17.33) startOffset 5 endOffset 6 width 7.00: " " LayoutSVGTSpan {tspan} at (0,0) size 25x31 LayoutSVGInlineText {#text} at (56,0) size 24x31 - chunk 1 text run 1 at (77.49,15.65) startOffset 0 endOffset 1 width 5.00: "i" + chunk 1 text run 1 at (77.50,15.65) startOffset 0 endOffset 1 width 5.00: "i" chunk 1 text run 2 at (85.78,13.70) startOffset 1 endOffset 2 width 12.00: "s" LayoutSVGTSpan {tspan} at (0,0) size 76x43 LayoutSVGInlineText {#text} at (78,8) size 75x43
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath-expected.png index 597871c..3459759 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath-expected.txt index 65f6a5a..79c23c4 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath-expected.txt
@@ -18,11 +18,11 @@ chunk 1 text run 1 at (30.47,43.91) startOffset 0 endOffset 1 width 12.00: "T" chunk 1 text run 2 at (33.35,34.63) startOffset 1 endOffset 2 width 7.60: "e" chunk 1 text run 3 at (37.85,27.68) startOffset 2 endOffset 3 width 9.00: "x" - chunk 1 text run 4 at (42.86,22.81) startOffset 3 endOffset 4 width 5.00: "t" - chunk 1 text run 5 at (46.93,19.93) startOffset 4 endOffset 5 width 5.00: " " + chunk 1 text run 4 at (42.86,22.80) startOffset 3 endOffset 4 width 5.00: "t" + chunk 1 text run 5 at (46.94,19.93) startOffset 4 endOffset 5 width 5.00: " " LayoutSVGTSpan {tspan} at (0,0) size 29x28 LayoutSVGInlineText {#text} at (26,0) size 29x28 - chunk 1 text run 1 at (53.63,16.55) startOffset 0 endOffset 1 width 10.00: "o" + chunk 1 text run 1 at (53.63,16.54) startOffset 0 endOffset 1 width 10.00: "o" chunk 1 text run 2 at (62.72,13.77) startOffset 1 endOffset 2 width 9.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 64x40 LayoutSVGInlineText {#text} at (52,9) size 63x40 @@ -50,7 +50,7 @@ LayoutSVGInlineText {#text} at (-13,3) size 0x0 LayoutSVGTSpan {tspan} at (0,0) size 54x52 LayoutSVGInlineText {#text} at (0,0) size 54x52 - chunk 1 (middle anchor) text run 1 at (30.30,45.09) startOffset 0 endOffset 1 width 5.00: " " + chunk 1 (middle anchor) text run 1 at (30.30,45.08) startOffset 0 endOffset 1 width 5.00: " " chunk 1 (middle anchor) text run 2 at (31.85,38.31) startOffset 1 endOffset 2 width 9.00: "a" chunk 1 (middle anchor) text run 3 at (34.77,31.99) startOffset 2 endOffset 3 width 5.00: " " chunk 1 (middle anchor) text run 4 at (39.66,25.69) startOffset 3 endOffset 4 width 11.00: "P" @@ -72,15 +72,15 @@ LayoutSVGInlineText {#text} at (-3,4) size 0x0 LayoutSVGTSpan {tspan} at (0,0) size 24x16 LayoutSVGInlineText {#text} at (0,35) size 24x15 - chunk 1 (end anchor) text run 1 at (30.82,42.06) startOffset 1 endOffset 2 width 9.00: "n" + chunk 1 (end anchor) text run 1 at (30.82,42.05) startOffset 1 endOffset 2 width 9.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 61x45 LayoutSVGInlineText {#text} at (12,0) size 60x45 chunk 1 (end anchor) text run 1 at (32.99,35.39) startOffset 0 endOffset 1 width 5.00: " " - chunk 1 (end anchor) text run 2 at (36.51,29.37) startOffset 1 endOffset 2 width 9.00: "a" + chunk 1 (end anchor) text run 2 at (36.52,29.37) startOffset 1 endOffset 2 width 9.00: "a" chunk 1 (end anchor) text run 3 at (41.21,24.21) startOffset 2 endOffset 3 width 5.00: " " chunk 1 (end anchor) text run 4 at (47.66,19.50) startOffset 3 endOffset 4 width 11.00: "P" chunk 1 (end anchor) text run 5 at (56.77,15.38) startOffset 4 endOffset 5 width 9.00: "a" - chunk 1 (end anchor) text run 6 at (63.54,13.60) startOffset 5 endOffset 6 width 5.00: "t" + chunk 1 (end anchor) text run 6 at (63.55,13.60) startOffset 5 endOffset 6 width 5.00: "t" chunk 1 (end anchor) text run 7 at (70.49,12.67) startOffset 6 endOffset 7 width 9.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 71x12 contains 1 chunk(s) @@ -96,14 +96,14 @@ LayoutSVGTextPath {textPath} at (0,0) size 71x53 LayoutSVGInlineText {#text} at (0,0) size 48x35 chunk 1 text run 1 at (81.00,12.80) startOffset 0 endOffset 1 width 12.00: "T" - chunk 1 text run 2 at (90.63,14.59) startOffset 1 endOffset 2 width 7.60: "e" + chunk 1 text run 2 at (90.64,14.59) startOffset 1 endOffset 2 width 7.60: "e" chunk 1 text run 3 at (98.43,17.44) startOffset 2 endOffset 3 width 9.00: "x" chunk 1 text run 4 at (104.54,20.88) startOffset 3 endOffset 4 width 5.00: "t" chunk 1 text run 5 at (108.49,23.94) startOffset 4 endOffset 5 width 5.00: " " LayoutSVGTSpan {tspan} at (0,0) size 31x32 LayoutSVGInlineText {#text} at (40,14) size 31x32 chunk 1 text run 1 at (113.55,29.45) startOffset 0 endOffset 1 width 10.00: "o" - chunk 1 text run 2 at (117.97,37.79) startOffset 1 endOffset 2 width 9.00: "n" + chunk 1 text run 2 at (117.97,37.80) startOffset 1 endOffset 2 width 9.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 24x9 LayoutSVGInlineText {#text} at (39,44) size 23x9 chunk 1 text run 1 at (119.63,44.55) startOffset 0 endOffset 1 width 5.00: " " @@ -120,21 +120,21 @@ LayoutSVGText {text} at (15,-15) size 120x58 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 120x58 LayoutSVGInlineText {#text} at (0,13) size 45x44 - chunk 1 (middle anchor) text run 1 at (33.49,34.33) startOffset 0 endOffset 1 width 12.00: "T" + chunk 1 (middle anchor) text run 1 at (33.50,34.32) startOffset 0 endOffset 1 width 12.00: "T" chunk 1 (middle anchor) text run 2 at (39.07,26.31) startOffset 1 endOffset 2 width 7.60: "e" chunk 1 (middle anchor) text run 3 at (45.38,20.94) startOffset 2 endOffset 3 width 9.00: "x" chunk 1 (middle anchor) text run 4 at (51.48,17.48) startOffset 3 endOffset 4 width 5.00: "t" - chunk 1 (middle anchor) text run 5 at (56.10,15.61) startOffset 4 endOffset 5 width 5.00: " " + chunk 1 (middle anchor) text run 5 at (56.11,15.61) startOffset 4 endOffset 5 width 5.00: " " LayoutSVGTSpan {tspan} at (0,0) size 26x25 LayoutSVGInlineText {#text} at (37,0) size 25x25 chunk 1 (middle anchor) text run 1 at (63.35,13.64) startOffset 0 endOffset 1 width 10.00: "o" - chunk 1 (middle anchor) text run 2 at (72.79,12.54) startOffset 1 endOffset 2 width 9.00: "n" + chunk 1 (middle anchor) text run 2 at (72.80,12.54) startOffset 1 endOffset 2 width 9.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 59x48 LayoutSVGInlineText {#text} at (61,10) size 58x48 chunk 1 (middle anchor) text run 1 at (79.81,12.69) startOffset 0 endOffset 1 width 5.00: " " chunk 1 (middle anchor) text run 2 at (86.75,13.66) startOffset 1 endOffset 2 width 9.00: "a" - chunk 1 (middle anchor) text run 3 at (93.51,15.48) startOffset 2 endOffset 3 width 5.00: " " - chunk 1 (middle anchor) text run 4 at (100.85,18.66) startOffset 3 endOffset 4 width 11.00: "P" + chunk 1 (middle anchor) text run 3 at (93.52,15.48) startOffset 2 endOffset 3 width 5.00: " " + chunk 1 (middle anchor) text run 4 at (100.86,18.66) startOffset 3 endOffset 4 width 11.00: "P" chunk 1 (middle anchor) text run 5 at (109.01,24.41) startOffset 4 endOffset 5 width 9.00: "a" chunk 1 (middle anchor) text run 6 at (113.66,29.61) startOffset 5 endOffset 6 width 5.00: "t" chunk 1 (middle anchor) text run 7 at (117.13,35.66) startOffset 6 endOffset 7 width 9.00: "h" @@ -163,7 +163,7 @@ LayoutSVGTSpan {tspan} at (0,0) size 52x56 LayoutSVGInlineText {#text} at (63,11) size 52x55 chunk 1 (end anchor) text run 1 at (89.81,14.37) startOffset 0 endOffset 1 width 5.00: " " - chunk 1 (end anchor) text run 2 at (96.46,16.58) startOffset 1 endOffset 2 width 9.00: "a" + chunk 1 (end anchor) text run 2 at (96.47,16.58) startOffset 1 endOffset 2 width 9.00: "a" chunk 1 (end anchor) text run 3 at (102.72,19.72) startOffset 2 endOffset 3 width 5.00: " " chunk 1 (end anchor) text run 4 at (109.12,24.51) startOffset 3 endOffset 4 width 11.00: "P" chunk 1 (end anchor) text run 5 at (115.39,32.25) startOffset 4 endOffset 5 width 9.00: "a" @@ -191,8 +191,8 @@ LayoutSVGInlineText {#text} at (45,0) size 29x28 chunk 1 text run 1 at (88.08,13.94) startOffset 0 endOffset 1 width 10.00: "o" chunk 1 text run 2 at (97.12,16.86) startOffset 1 endOffset 2 width 9.00: "n" - LayoutSVGTSpan {tspan} at (0,0) size 39x48 - LayoutSVGInlineText {#text} at (60,17) size 39x47 + LayoutSVGTSpan {tspan} at (0,0) size 40x48 + LayoutSVGInlineText {#text} at (59,17) size 39x47 chunk 1 text run 1 at (103.33,20.10) startOffset 0 endOffset 1 width 5.00: " " chunk 1 text run 2 at (108.91,24.31) startOffset 1 endOffset 2 width 9.00: "a" chunk 1 text run 3 at (113.58,29.50) startOffset 2 endOffset 3 width 5.00: " " @@ -212,7 +212,7 @@ LayoutSVGTextPath {textPath} at (0,0) size 94x56 LayoutSVGInlineText {#text} at (0,29) size 27x27 chunk 1 (middle anchor) text run 1 at (30.19,46.08) startOffset 2 endOffset 3 width 9.00: "x" - chunk 1 (middle anchor) text run 2 at (31.54,39.28) startOffset 3 endOffset 4 width 5.00: "t" + chunk 1 (middle anchor) text run 2 at (31.54,39.27) startOffset 3 endOffset 4 width 5.00: "t" chunk 1 (middle anchor) text run 3 at (33.35,34.63) startOffset 4 endOffset 5 width 5.00: " " LayoutSVGTSpan {tspan} at (0,0) size 33x33 LayoutSVGInlineText {#text} at (0,1) size 33x33 @@ -221,10 +221,10 @@ LayoutSVGTSpan {tspan} at (0,0) size 67x29 LayoutSVGInlineText {#text} at (27,0) size 66x29 chunk 1 (middle anchor) text run 1 at (50.18,18.12) startOffset 0 endOffset 1 width 5.00: " " - chunk 1 (middle anchor) text run 2 at (56.63,15.43) startOffset 1 endOffset 2 width 9.00: "a" + chunk 1 (middle anchor) text run 2 at (56.64,15.43) startOffset 1 endOffset 2 width 9.00: "a" chunk 1 (middle anchor) text run 3 at (63.40,13.63) startOffset 2 endOffset 3 width 5.00: " " chunk 1 (middle anchor) text run 4 at (71.35,12.61) startOffset 3 endOffset 4 width 11.00: "P" - chunk 1 (middle anchor) text run 5 at (81.35,12.83) startOffset 4 endOffset 5 width 9.00: "a" + chunk 1 (middle anchor) text run 5 at (81.36,12.83) startOffset 4 endOffset 5 width 9.00: "a" chunk 1 (middle anchor) text run 6 at (88.27,13.99) startOffset 5 endOffset 6 width 5.00: "t" chunk 1 (middle anchor) text run 7 at (94.99,16.00) startOffset 6 endOffset 7 width 9.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 @@ -245,8 +245,8 @@ LayoutSVGTSpan {tspan} at (0,0) size 37x44 LayoutSVGInlineText {#text} at (0,0) size 37x44 chunk 1 (end anchor) text run 1 at (30.55,43.43) startOffset 3 endOffset 4 width 11.00: "P" - chunk 1 (end anchor) text run 2 at (33.65,34.02) startOffset 4 endOffset 5 width 9.00: "a" - chunk 1 (end anchor) text run 3 at (37.46,28.15) startOffset 5 endOffset 6 width 5.00: "t" + chunk 1 (end anchor) text run 2 at (33.65,34.01) startOffset 4 endOffset 5 width 9.00: "a" + chunk 1 (end anchor) text run 3 at (37.46,28.14) startOffset 5 endOffset 6 width 5.00: "t" chunk 1 (end anchor) text run 4 at (42.39,23.19) startOffset 6 endOffset 7 width 9.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 63x12 contains 1 chunk(s) @@ -272,14 +272,14 @@ chunk 1 text run 2 at (47.24,8.79) startOffset 1 endOffset 2 width 7.00: "a" chunk 1 text run 3 at (53.97,10.51) startOffset 2 endOffset 3 width 7.00: "n" chunk 1 text run 4 at (59.61,14.61) startOffset 3 endOffset 4 width 7.00: "d" - chunk 1 text run 5 at (63.61,18.60) startOffset 4 endOffset 5 width 4.00: " " + chunk 1 text run 5 at (63.62,18.60) startOffset 4 endOffset 5 width 4.00: " " LayoutSVGTSpan {tspan} at (0,0) size 28x28 LayoutSVGInlineText {#text} at (56,25) size 27x27 - chunk 1 text run 1 at (67.22,22.10) startOffset 0 endOffset 1 width 6.00: "s" + chunk 1 text run 1 at (67.23,22.10) startOffset 0 endOffset 1 width 6.00: "s" chunk 1 text run 2 at (71.97,26.41) startOffset 1 endOffset 2 width 7.00: "u" chunk 1 text run 3 at (77.48,30.72) startOffset 2 endOffset 3 width 7.00: "b" LayoutSVGInlineText {#text} at (78,21) size 38x28 - chunk 1 text run 1 at (83.07,34.03) startOffset 0 endOffset 1 width 6.00: "s" + chunk 1 text run 1 at (83.08,34.03) startOffset 0 endOffset 1 width 6.00: "s" chunk 1 text run 2 at (89.25,36.01) startOffset 1 endOffset 2 width 7.00: "c" chunk 1 text run 3 at (95.17,35.85) startOffset 2 endOffset 3 width 5.00: "r" chunk 1 text run 4 at (98.98,34.48) startOffset 3 endOffset 4 width 3.00: "i" @@ -302,9 +302,9 @@ LayoutSVGInlineText {#text} at (0,0) size 50x39 chunk 1 text run 1 at (17.53,27.48) startOffset 0 endOffset 1 width 7.00: "p" chunk 1 text run 2 at (22.58,22.56) startOffset 1 endOffset 2 width 7.00: "o" - chunk 1 text run 3 at (27.36,18.27) startOffset 2 endOffset 3 width 6.00: "s" + chunk 1 text run 3 at (27.36,18.26) startOffset 2 endOffset 3 width 6.00: "s" chunk 1 text run 4 at (30.87,15.45) startOffset 3 endOffset 4 width 3.00: "i" - chunk 1 text run 5 at (33.75,13.42) startOffset 4 endOffset 5 width 4.00: "t" + chunk 1 text run 5 at (33.76,13.42) startOffset 4 endOffset 5 width 4.00: "t" chunk 1 text run 6 at (36.74,11.64) startOffset 5 endOffset 6 width 3.00: "i" chunk 1 text run 7 at (41.36,9.67) startOffset 6 endOffset 7 width 7.00: "v" chunk 1 text run 8 at (48.24,8.85) startOffset 7 endOffset 8 width 7.00: "e" @@ -317,7 +317,7 @@ LayoutSVGTSpan {tspan} at (0,0) size 52x31 LayoutSVGInlineText {#text} at (65,20) size 51x31 chunk 1 text run 1 at (76.65,30.13) startOffset 0 endOffset 1 width 7.00: "n" - chunk 1 text run 2 at (82.60,33.80) startOffset 1 endOffset 2 width 7.00: "e" + chunk 1 text run 2 at (82.61,33.80) startOffset 1 endOffset 2 width 7.00: "e" chunk 1 text run 3 at (89.25,36.01) startOffset 2 endOffset 3 width 7.00: "g" chunk 1 text run 4 at (96.12,35.61) startOffset 3 endOffset 4 width 7.00: "a" chunk 1 text run 5 at (101.03,33.29) startOffset 4 endOffset 5 width 4.00: "t" @@ -337,15 +337,15 @@ chunk 1 text run 1 at (30.00,-20.00) startOffset 0 endOffset 12 width 142.00: "before path " LayoutSVGTextPath {textPath} at (0,0) size 110x56 LayoutSVGInlineText {#text} at (0,32) size 110x55 - chunk 1 text run 1 at (35.45,30.90) startOffset 0 endOffset 1 width 14.00: "o" + chunk 1 text run 1 at (35.45,30.89) startOffset 0 endOffset 1 width 14.00: "o" chunk 1 text run 2 at (45.25,21.03) startOffset 1 endOffset 2 width 14.00: "n" chunk 1 text run 3 at (55.01,16.00) startOffset 2 endOffset 3 width 8.00: " " chunk 1 text run 4 at (65.67,13.23) startOffset 3 endOffset 4 width 14.00: "p" chunk 1 text run 5 at (79.65,12.68) startOffset 4 endOffset 5 width 14.00: "a" chunk 1 text run 6 at (90.48,14.55) startOffset 5 endOffset 6 width 8.00: "t" - chunk 1 text run 7 at (100.71,18.58) startOffset 6 endOffset 7 width 14.00: "h" + chunk 1 text run 7 at (100.72,18.58) startOffset 6 endOffset 7 width 14.00: "h" LayoutSVGInlineText {#text} at (104,38) size 122x34 - chunk 1 text run 1 at (114.71,18.58) startOffset 0 endOffset 11 width 122.00: " after path" + chunk 1 text run 1 at (114.72,18.58) startOffset 0 endOffset 11 width 122.00: " after path" LayoutSVGText {text} at (15,30) size 96x12 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,0) size 96x12 chunk 1 text run 1 at (15.00,40.00) startOffset 0 endOffset 26 width 96.00: "text before/after textPath"
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath2-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath2-expected.png index 9432fe59..c09dd3d 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath2-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath2-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath2-expected.txt index 6ede128..4eda454 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath2-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath2-expected.txt
@@ -31,47 +31,47 @@ LayoutSVGTextPath {textPath} at (0,0) size 147x119 LayoutSVGInlineText {#text} at (74,32) size 46x87 chunk 1 text run 1 at (100.01,-2.05) startOffset 0 endOffset 1 width 4.00: "t" - chunk 1 text run 2 at (100.18,-7.57) startOffset 1 endOffset 2 width 7.00: "e" - chunk 1 text run 3 at (100.67,-14.54) startOffset 2 endOffset 3 width 7.00: "x" - chunk 1 text run 4 at (101.29,-19.99) startOffset 3 endOffset 4 width 4.00: "t" - chunk 1 text run 5 at (101.89,-24.00) startOffset 4 endOffset 5 width 4.00: " " - chunk 1 text run 6 at (103.05,-30.07) startOffset 5 endOffset 6 width 8.00: "o" - chunk 1 text run 7 at (104.86,-37.26) startOffset 6 endOffset 7 width 7.00: "n" - chunk 1 text run 8 at (106.48,-42.40) startOffset 7 endOffset 8 width 4.00: " " - chunk 1 text run 9 at (108.46,-47.70) startOffset 8 endOffset 9 width 7.00: "a" - chunk 1 text run 10 at (110.67,-52.71) startOffset 9 endOffset 10 width 4.00: " " - chunk 1 text run 11 at (113.36,-57.92) startOffset 10 endOffset 11 width 8.00: "p" - chunk 1 text run 12 at (117.39,-64.41) startOffset 11 endOffset 12 width 7.00: "a" - chunk 1 text run 13 at (120.61,-68.76) startOffset 12 endOffset 13 width 4.00: "t" + chunk 1 text run 2 at (100.18,-7.58) startOffset 1 endOffset 2 width 7.00: "e" + chunk 1 text run 3 at (100.67,-14.55) startOffset 2 endOffset 3 width 7.00: "x" + chunk 1 text run 4 at (101.29,-20.00) startOffset 3 endOffset 4 width 4.00: "t" + chunk 1 text run 5 at (101.89,-24.01) startOffset 4 endOffset 5 width 4.00: " " + chunk 1 text run 6 at (103.06,-30.07) startOffset 5 endOffset 6 width 8.00: "o" + chunk 1 text run 7 at (104.87,-37.27) startOffset 6 endOffset 7 width 7.00: "n" + chunk 1 text run 8 at (106.48,-42.41) startOffset 7 endOffset 8 width 4.00: " " + chunk 1 text run 9 at (108.46,-47.71) startOffset 8 endOffset 9 width 7.00: "a" + chunk 1 text run 10 at (110.67,-52.72) startOffset 9 endOffset 10 width 4.00: " " + chunk 1 text run 11 at (113.36,-57.93) startOffset 10 endOffset 11 width 8.00: "p" + chunk 1 text run 12 at (117.39,-64.42) startOffset 11 endOffset 12 width 7.00: "a" + chunk 1 text run 13 at (120.61,-68.77) startOffset 12 endOffset 13 width 4.00: "t" chunk 1 text run 14 at (124.21,-72.96) startOffset 13 endOffset 14 width 7.00: "h" LayoutSVGTSpan {tspan} at (0,0) size 86x39 LayoutSVGInlineText {#text} at (100,0) size 86x39 - chunk 1 text run 1 at (130.71,-79.15) startOffset 0 endOffset 1 width 11.00: "w" + chunk 1 text run 1 at (130.72,-79.15) startOffset 0 endOffset 1 width 11.00: "w" chunk 1 text run 2 at (136.34,-83.36) startOffset 1 endOffset 2 width 3.00: "i" chunk 1 text run 3 at (139.31,-85.23) startOffset 2 endOffset 3 width 4.00: "t" chunk 1 text run 4 at (144.10,-87.80) startOffset 3 endOffset 4 width 7.00: "h" - chunk 1 text run 5 at (149.20,-89.97) startOffset 4 endOffset 5 width 4.00: " " + chunk 1 text run 5 at (149.21,-89.97) startOffset 4 endOffset 5 width 4.00: " " chunk 1 text run 6 at (154.43,-91.66) startOffset 5 endOffset 6 width 7.00: "n" chunk 1 text run 7 at (161.28,-93.10) startOffset 6 endOffset 7 width 7.00: "e" chunk 1 text run 8 at (167.75,-93.71) startOffset 7 endOffset 8 width 6.00: "s" chunk 1 text run 9 at (172.75,-93.69) startOffset 8 endOffset 9 width 4.00: "t" - chunk 1 text run 10 at (178.22,-93.17) startOffset 9 endOffset 10 width 7.00: "e" + chunk 1 text run 10 at (178.23,-93.17) startOffset 9 endOffset 10 width 7.00: "e" chunk 1 text run 11 at (185.57,-91.66) startOffset 10 endOffset 11 width 8.00: "d" LayoutSVGTSpan {tspan} at (0,0) size 44x39 LayoutSVGInlineText {#text} at (177,14) size 43x38 - chunk 1 text run 1 at (191.26,-89.80) startOffset 0 endOffset 1 width 4.00: " " - chunk 1 text run 2 at (194.99,-88.23) startOffset 1 endOffset 2 width 4.00: "t" + chunk 1 text run 1 at (191.27,-89.79) startOffset 0 endOffset 1 width 4.00: " " + chunk 1 text run 2 at (194.99,-88.22) startOffset 1 endOffset 2 width 4.00: "t" chunk 1 text run 3 at (199.40,-85.98) startOffset 2 endOffset 3 width 6.00: "s" chunk 1 text run 4 at (205.33,-82.21) startOffset 3 endOffset 4 width 8.00: "p" chunk 1 text run 5 at (211.14,-77.54) startOffset 4 endOffset 5 width 7.00: "a" - chunk 1 text run 6 at (216.14,-72.59) startOffset 5 endOffset 6 width 7.00: "n" + chunk 1 text run 6 at (216.14,-72.58) startOffset 5 endOffset 6 width 7.00: "n" LayoutSVGInlineText {#text} at (213,31) size 29x19 - chunk 1 text run 1 at (223.14,-72.59) startOffset 0 endOffset 5 width 29.00: " xxx " + chunk 1 text run 1 at (223.14,-72.58) startOffset 0 endOffset 5 width 29.00: " xxx " LayoutSVGTSpan {tspan} at (0,0) size 47x20 LayoutSVGInlineText {#text} at (252,31) size 46x19 - chunk 1 text run 1 at (262.14,-72.59) startOffset 0 endOffset 9 width 46.00: "all with " + chunk 1 text run 1 at (262.14,-72.58) startOffset 0 endOffset 9 width 46.00: "all with " LayoutSVGInlineText {#text} at (298,31) size 84x19 - chunk 1 text run 1 at (308.14,-72.59) startOffset 0 endOffset 16 width 83.71: "different links." + chunk 1 text run 1 at (308.14,-72.58) startOffset 0 endOffset 16 width 83.71: "different links." LayoutSVGContainer {g} at (50,205) size 396x129 [transform={m=((1.00,0.00)(0.00,1.00)) t=(40.00,330.00)}] LayoutSVGContainer {use} at (139,205) size 142x125 LayoutSVGPath {path} at (139,205) size 142x125 [stroke={[type=SOLID] [color=#0000FF]}] [data="M 100 0 c 0 -125 140 -125 140 0"] @@ -80,18 +80,18 @@ chunk 1 text run 1 at (10.00,0.00) startOffset 0 endOffset 14 width 80.00: "This is simple" LayoutSVGTextPath {textPath} at (0,0) size 159x94 LayoutSVGInlineText {#text} at (77,15) size 64x79 - chunk 1 text run 1 at (102.65,-28.12) startOffset 0 endOffset 1 width 4.00: "t" - chunk 1 text run 2 at (103.86,-33.52) startOffset 1 endOffset 2 width 7.00: "e" - chunk 1 text run 3 at (105.71,-40.06) startOffset 2 endOffset 3 width 7.00: "x" + chunk 1 text run 1 at (102.65,-28.13) startOffset 0 endOffset 1 width 4.00: "t" + chunk 1 text run 2 at (103.87,-33.53) startOffset 1 endOffset 2 width 7.00: "e" + chunk 1 text run 3 at (105.71,-40.07) startOffset 2 endOffset 3 width 7.00: "x" chunk 1 text run 4 at (107.55,-45.38) startOffset 3 endOffset 4 width 4.00: "t" - chunk 1 text run 5 at (109.06,-49.14) startOffset 4 endOffset 5 width 4.00: " " - chunk 1 text run 6 at (111.54,-54.50) startOffset 5 endOffset 6 width 8.00: "o" - chunk 1 text run 7 at (115.21,-61.07) startOffset 6 endOffset 7 width 7.00: "n" - chunk 1 text run 8 at (118.28,-65.67) startOffset 7 endOffset 8 width 4.00: " " - chunk 1 text run 9 at (121.55,-69.93) startOffset 8 endOffset 9 width 7.00: "a" - chunk 1 text run 10 at (125.29,-74.10) startOffset 9 endOffset 10 width 4.00: " " + chunk 1 text run 5 at (109.06,-49.15) startOffset 4 endOffset 5 width 4.00: " " + chunk 1 text run 6 at (111.55,-54.51) startOffset 5 endOffset 6 width 8.00: "o" + chunk 1 text run 7 at (115.22,-61.08) startOffset 6 endOffset 7 width 7.00: "n" + chunk 1 text run 8 at (118.28,-65.68) startOffset 7 endOffset 8 width 4.00: " " + chunk 1 text run 9 at (121.56,-69.93) startOffset 8 endOffset 9 width 7.00: "a" + chunk 1 text run 10 at (125.29,-74.11) startOffset 9 endOffset 10 width 4.00: " " chunk 1 text run 11 at (129.63,-78.23) startOffset 10 endOffset 11 width 8.00: "p" - chunk 1 text run 12 at (135.54,-82.82) startOffset 11 endOffset 12 width 7.00: "a" + chunk 1 text run 12 at (135.55,-82.82) startOffset 11 endOffset 12 width 7.00: "a" chunk 1 text run 13 at (140.21,-85.76) startOffset 12 endOffset 13 width 4.00: "t" chunk 1 text run 14 at (145.06,-88.25) startOffset 13 endOffset 14 width 7.00: "h" LayoutSVGTSpan {tspan} at (0,0) size 87x37 @@ -101,7 +101,7 @@ chunk 1 text run 3 at (163.81,-93.42) startOffset 2 endOffset 3 width 4.00: "t" chunk 1 text run 4 at (169.30,-93.75) startOffset 3 endOffset 4 width 7.00: "h" chunk 1 text run 5 at (174.79,-93.55) startOffset 4 endOffset 5 width 4.00: " " - chunk 1 text run 6 at (180.25,-92.85) startOffset 5 endOffset 6 width 7.00: "n" + chunk 1 text run 6 at (180.26,-92.85) startOffset 5 endOffset 6 width 7.00: "n" chunk 1 text run 7 at (187.05,-91.23) startOffset 6 endOffset 7 width 7.00: "e" chunk 1 text run 8 at (193.18,-89.02) startOffset 7 endOffset 8 width 6.00: "s" chunk 1 text run 9 at (197.70,-86.89) startOffset 8 endOffset 9 width 4.00: "t" @@ -110,7 +110,7 @@ LayoutSVGTSpan {tspan} at (0,0) size 38x44 LayoutSVGInlineText {#text} at (198,30) size 37x43 chunk 1 text run 1 at (213.00,-75.81) startOffset 0 endOffset 1 width 4.00: " " - chunk 1 text run 2 at (215.82,-72.92) startOffset 1 endOffset 2 width 4.00: "t" + chunk 1 text run 2 at (215.83,-72.92) startOffset 1 endOffset 2 width 4.00: "t" chunk 1 text run 3 at (219.12,-69.11) startOffset 2 endOffset 3 width 6.00: "s" chunk 1 text run 4 at (223.20,-63.55) startOffset 3 endOffset 4 width 8.00: "p" chunk 1 text run 5 at (227.16,-56.98) startOffset 4 endOffset 5 width 7.00: "a" @@ -130,19 +130,19 @@ chunk 1 text run 1 at (10.00,0.00) startOffset 0 endOffset 14 width 80.00: "This is simple" LayoutSVGTextPath {textPath} at (0,0) size 160x85 LayoutSVGInlineText {#text} at (80,11) size 71x72 - chunk 1 (middle anchor) text run 1 at (105.34,-38.87) startOffset 0 endOffset 1 width 4.00: "t" - chunk 1 (middle anchor) text run 2 at (107.08,-44.12) startOffset 1 endOffset 2 width 7.00: "e" + chunk 1 (middle anchor) text run 1 at (105.34,-38.88) startOffset 0 endOffset 1 width 4.00: "t" + chunk 1 (middle anchor) text run 2 at (107.09,-44.13) startOffset 1 endOffset 2 width 7.00: "e" chunk 1 (middle anchor) text run 3 at (109.74,-50.70) startOffset 2 endOffset 3 width 7.00: "x" - chunk 1 (middle anchor) text run 4 at (112.07,-55.53) startOffset 3 endOffset 4 width 4.00: "t" + chunk 1 (middle anchor) text run 4 at (112.07,-55.54) startOffset 3 endOffset 4 width 4.00: "t" chunk 1 (middle anchor) text run 5 at (114.00,-59.05) startOffset 4 endOffset 5 width 4.00: " " chunk 1 (middle anchor) text run 6 at (117.25,-64.21) startOffset 5 endOffset 6 width 8.00: "o" - chunk 1 (middle anchor) text run 7 at (121.68,-70.07) startOffset 6 endOffset 7 width 7.00: "n" + chunk 1 (middle anchor) text run 7 at (121.68,-70.08) startOffset 6 endOffset 7 width 7.00: "n" chunk 1 (middle anchor) text run 8 at (125.43,-74.25) startOffset 7 endOffset 8 width 4.00: " " chunk 1 (middle anchor) text run 9 at (129.41,-78.03) startOffset 8 endOffset 9 width 7.00: "a" chunk 1 (middle anchor) text run 10 at (133.64,-81.46) startOffset 9 endOffset 10 width 4.00: " " - chunk 1 (middle anchor) text run 11 at (138.66,-84.84) startOffset 10 endOffset 11 width 8.00: "p" + chunk 1 (middle anchor) text run 11 at (138.67,-84.85) startOffset 10 endOffset 11 width 8.00: "p" chunk 1 (middle anchor) text run 12 at (145.24,-88.33) startOffset 11 endOffset 12 width 7.00: "a" - chunk 1 (middle anchor) text run 13 at (150.38,-90.40) startOffset 12 endOffset 13 width 4.00: "t" + chunk 1 (middle anchor) text run 13 at (150.39,-90.40) startOffset 12 endOffset 13 width 4.00: "t" chunk 1 (middle anchor) text run 14 at (155.63,-91.97) startOffset 13 endOffset 14 width 7.00: "h" LayoutSVGTSpan {tspan} at (0,0) size 82x46 LayoutSVGInlineText {#text} at (146,0) size 82x46 @@ -151,18 +151,18 @@ chunk 1 (middle anchor) text run 3 at (174.99,-93.54) startOffset 2 endOffset 3 width 4.00: "t" chunk 1 (middle anchor) text run 4 at (180.45,-92.81) startOffset 3 endOffset 4 width 7.00: "h" chunk 1 (middle anchor) text run 5 at (185.81,-91.59) startOffset 4 endOffset 5 width 4.00: " " - chunk 1 (middle anchor) text run 6 at (191.03,-89.89) startOffset 5 endOffset 6 width 7.00: "n" + chunk 1 (middle anchor) text run 6 at (191.03,-89.88) startOffset 5 endOffset 6 width 7.00: "n" chunk 1 (middle anchor) text run 7 at (197.44,-87.03) startOffset 6 endOffset 7 width 7.00: "e" chunk 1 (middle anchor) text run 8 at (203.03,-83.78) startOffset 7 endOffset 8 width 6.00: "s" chunk 1 (middle anchor) text run 9 at (207.17,-80.84) startOffset 8 endOffset 9 width 4.00: "t" chunk 1 (middle anchor) text run 10 at (211.33,-77.38) startOffset 9 endOffset 10 width 7.00: "e" - chunk 1 (middle anchor) text run 11 at (216.65,-72.02) startOffset 10 endOffset 11 width 8.00: "d" + chunk 1 (middle anchor) text run 11 at (216.65,-72.01) startOffset 10 endOffset 11 width 8.00: "d" LayoutSVGTSpan {tspan} at (0,0) size 34x45 LayoutSVGInlineText {#text} at (206,40) size 34x44 - chunk 1 (middle anchor) text run 1 at (220.43,-67.42) startOffset 0 endOffset 1 width 4.00: " " + chunk 1 (middle anchor) text run 1 at (220.44,-67.42) startOffset 0 endOffset 1 width 4.00: " " chunk 1 (middle anchor) text run 2 at (222.75,-64.21) startOffset 1 endOffset 2 width 4.00: "t" - chunk 1 (middle anchor) text run 3 at (225.47,-59.94) startOffset 2 endOffset 3 width 6.00: "s" - chunk 1 (middle anchor) text run 4 at (228.80,-53.82) startOffset 3 endOffset 4 width 8.00: "p" + chunk 1 (middle anchor) text run 3 at (225.48,-59.94) startOffset 2 endOffset 3 width 6.00: "s" + chunk 1 (middle anchor) text run 4 at (228.80,-53.81) startOffset 3 endOffset 4 width 8.00: "p" chunk 1 (middle anchor) text run 5 at (231.82,-47.00) startOffset 4 endOffset 5 width 7.00: "a" chunk 1 (middle anchor) text run 6 at (234.23,-40.25) startOffset 5 endOffset 6 width 7.00: "n" LayoutSVGInlineText {#text} at (231,63) size 29x19
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath3-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath3-expected.png index 078ab8cd..afbf5b3 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath3-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath3-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath3-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath3-expected.txt index deddcec..e20f5b4 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath3-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPath3-expected.txt
@@ -18,14 +18,14 @@ LayoutSVGText {text} at (97,-109) size 154x77 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 154x77 LayoutSVGInlineText {#text} at (0,0) size 154x77 - chunk 1 (middle anchor) text run 1 at (112.54,-56.43) startOffset 0 endOffset 1 width 9.00: "T" + chunk 1 (middle anchor) text run 1 at (112.55,-56.44) startOffset 0 endOffset 1 width 9.00: "T" chunk 1 (middle anchor) text run 2 at (116.41,-62.96) startOffset 1 endOffset 2 width 5.88: "e" - chunk 1 (middle anchor) text run 3 at (120.12,-68.15) startOffset 2 endOffset 3 width 7.00: "x" + chunk 1 (middle anchor) text run 3 at (120.13,-68.15) startOffset 2 endOffset 3 width 7.00: "x" chunk 1 (middle anchor) text run 4 at (123.65,-72.35) startOffset 3 endOffset 4 width 4.00: "t" - chunk 1 (middle anchor) text run 5 at (126.45,-75.28) startOffset 4 endOffset 5 width 4.00: " " + chunk 1 (middle anchor) text run 5 at (126.46,-75.28) startOffset 4 endOffset 5 width 4.00: " " chunk 1 (middle anchor) text run 6 at (130.86,-79.27) startOffset 5 endOffset 6 width 8.00: "o" - chunk 1 (middle anchor) text run 7 at (136.92,-83.74) startOffset 6 endOffset 7 width 7.00: "n" - chunk 1 (middle anchor) text run 8 at (141.63,-86.54) startOffset 7 endOffset 8 width 4.00: " " + chunk 1 (middle anchor) text run 7 at (136.92,-83.75) startOffset 6 endOffset 7 width 7.00: "n" + chunk 1 (middle anchor) text run 8 at (141.64,-86.54) startOffset 7 endOffset 8 width 4.00: " " chunk 1 (middle anchor) text run 9 at (146.58,-88.92) startOffset 8 endOffset 9 width 7.00: "a" chunk 1 (middle anchor) text run 10 at (151.75,-90.86) startOffset 9 endOffset 10 width 4.00: " " chunk 1 (middle anchor) text run 11 at (157.51,-92.41) startOffset 10 endOffset 11 width 8.00: "p" @@ -34,15 +34,15 @@ chunk 1 (middle anchor) text run 14 at (175.93,-93.45) startOffset 13 endOffset 14 width 7.00: "h" chunk 1 (middle anchor) text run 15 at (181.38,-92.64) startOffset 14 endOffset 15 width 4.00: " " chunk 1 (middle anchor) text run 16 at (185.27,-91.74) startOffset 15 endOffset 16 width 4.00: "f" - chunk 1 (middle anchor) text run 17 at (190.97,-89.91) startOffset 16 endOffset 17 width 8.00: "o" + chunk 1 (middle anchor) text run 17 at (190.97,-89.90) startOffset 16 endOffset 17 width 8.00: "o" chunk 1 (middle anchor) text run 18 at (196.95,-87.28) startOffset 17 endOffset 18 width 5.00: "r" - chunk 1 (middle anchor) text run 19 at (200.85,-85.14) startOffset 18 endOffset 19 width 4.00: " " + chunk 1 (middle anchor) text run 19 at (200.86,-85.13) startOffset 18 endOffset 19 width 4.00: " " chunk 1 (middle anchor) text run 20 at (204.24,-82.97) startOffset 19 endOffset 20 width 4.00: "t" - chunk 1 (middle anchor) text run 21 at (208.67,-79.66) startOffset 20 endOffset 21 width 7.00: "e" + chunk 1 (middle anchor) text run 21 at (208.67,-79.65) startOffset 20 endOffset 21 width 7.00: "e" chunk 1 (middle anchor) text run 22 at (213.82,-75.01) startOffset 21 endOffset 22 width 7.00: "x" chunk 1 (middle anchor) text run 23 at (217.63,-70.90) startOffset 22 endOffset 23 width 4.00: "t" - chunk 1 (middle anchor) text run 24 at (220.10,-67.86) startOffset 23 endOffset 24 width 4.00: " " - chunk 1 (middle anchor) text run 25 at (224.37,-61.74) startOffset 24 endOffset 25 width 11.00: "w" + chunk 1 (middle anchor) text run 24 at (220.10,-67.85) startOffset 23 endOffset 24 width 4.00: " " + chunk 1 (middle anchor) text run 25 at (224.38,-61.73) startOffset 24 endOffset 25 width 11.00: "w" chunk 1 (middle anchor) text run 26 at (228.12,-55.16) startOffset 25 endOffset 26 width 4.00: "/" chunk 1 (middle anchor) text run 27 at (229.83,-51.66) startOffset 26 endOffset 27 width 4.00: " " chunk 1 (middle anchor) text run 28 at (231.23,-48.46) startOffset 27 endOffset 28 width 3.00: "'" @@ -61,17 +61,17 @@ LayoutSVGTextPath {textPath} at (0,0) size 73x105 LayoutSVGInlineText {#text} at (0,0) size 73x105 chunk 1 (middle anchor) text run 1 at (187.77,-91.01) startOffset 0 endOffset 1 width 9.00: "T" - chunk 1 (middle anchor) text run 2 at (194.75,-88.33) startOffset 1 endOffset 2 width 5.88: "e" - chunk 1 (middle anchor) text run 3 at (200.42,-85.39) startOffset 2 endOffset 3 width 7.00: "x" + chunk 1 (middle anchor) text run 2 at (194.76,-88.33) startOffset 1 endOffset 2 width 5.88: "e" + chunk 1 (middle anchor) text run 3 at (200.43,-85.39) startOffset 2 endOffset 3 width 7.00: "x" chunk 1 (middle anchor) text run 4 at (205.07,-82.39) startOffset 3 endOffset 4 width 4.00: "t" chunk 1 (middle anchor) text run 5 at (208.29,-79.96) startOffset 4 endOffset 5 width 4.00: " " chunk 1 (middle anchor) text run 6 at (212.74,-76.06) startOffset 5 endOffset 6 width 8.00: "o" chunk 1 (middle anchor) text run 7 at (217.96,-70.50) startOffset 6 endOffset 7 width 7.00: "n" chunk 1 (middle anchor) text run 8 at (221.28,-66.29) startOffset 7 endOffset 8 width 4.00: " " - chunk 1 (middle anchor) text run 9 at (224.37,-61.74) startOffset 8 endOffset 9 width 7.00: "a" + chunk 1 (middle anchor) text run 9 at (224.38,-61.73) startOffset 8 endOffset 9 width 7.00: "a" chunk 1 (middle anchor) text run 10 at (227.23,-56.86) startOffset 9 endOffset 10 width 4.00: " " chunk 1 (middle anchor) text run 11 at (229.83,-51.66) startOffset 10 endOffset 11 width 8.00: "p" - chunk 1 (middle anchor) text run 12 at (232.71,-44.67) startOffset 11 endOffset 12 width 7.00: "a" + chunk 1 (middle anchor) text run 12 at (232.72,-44.67) startOffset 11 endOffset 12 width 7.00: "a" chunk 1 (middle anchor) text run 13 at (234.50,-39.39) startOffset 12 endOffset 13 width 4.00: "t" chunk 1 (middle anchor) text run 14 at (235.95,-34.26) startOffset 13 endOffset 14 width 7.00: "h" chunk 1 (middle anchor) text run 15 at (237.19,-28.89) startOffset 14 endOffset 15 width 4.00: " " @@ -91,27 +91,27 @@ LayoutSVGText {text} at (84,-109) size 159x110 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 158x110 LayoutSVGInlineText {#text} at (0,105) size 20x5 - chunk 1 (middle anchor) text run 1 at (100.01,-1.73) startOffset 9 endOffset 10 width 4.00: " " + chunk 1 (middle anchor) text run 1 at (100.01,-1.74) startOffset 9 endOffset 10 width 4.00: " " LayoutSVGTSpan {tspan} at (0,0) size 115x59 LayoutSVGInlineText {#text} at (43,0) size 115x59 chunk 1 (middle anchor) text run 1 at (139.14,-85.13) startOffset 0 endOffset 1 width 8.00: "p" chunk 1 (middle anchor) text run 2 at (145.76,-88.56) startOffset 1 endOffset 2 width 7.00: "a" chunk 1 (middle anchor) text run 3 at (150.91,-90.58) startOffset 2 endOffset 3 width 4.00: "t" chunk 1 (middle anchor) text run 4 at (156.17,-92.10) startOffset 3 endOffset 4 width 7.00: "h" - chunk 1 (middle anchor) text run 5 at (161.58,-93.14) startOffset 4 endOffset 5 width 4.00: " " - chunk 1 (middle anchor) text run 6 at (165.56,-93.58) startOffset 5 endOffset 6 width 4.00: "f" - chunk 1 (middle anchor) text run 7 at (171.55,-93.73) startOffset 6 endOffset 7 width 8.00: "o" + chunk 1 (middle anchor) text run 5 at (161.59,-93.15) startOffset 4 endOffset 5 width 4.00: " " + chunk 1 (middle anchor) text run 6 at (165.57,-93.58) startOffset 5 endOffset 6 width 4.00: "f" + chunk 1 (middle anchor) text run 7 at (171.56,-93.73) startOffset 6 endOffset 7 width 8.00: "o" chunk 1 (middle anchor) text run 8 at (178.03,-93.20) startOffset 7 endOffset 8 width 5.00: "r" - chunk 1 (middle anchor) text run 9 at (182.48,-92.41) startOffset 8 endOffset 9 width 4.00: " " + chunk 1 (middle anchor) text run 9 at (182.49,-92.41) startOffset 8 endOffset 9 width 4.00: " " chunk 1 (middle anchor) text run 10 at (186.34,-91.44) startOffset 9 endOffset 10 width 4.00: "t" chunk 1 (middle anchor) text run 11 at (191.55,-89.68) startOffset 10 endOffset 11 width 7.00: "e" chunk 1 (middle anchor) text run 12 at (197.93,-86.78) startOffset 11 endOffset 12 width 7.00: "x" chunk 1 (middle anchor) text run 13 at (202.66,-84.02) startOffset 12 endOffset 13 width 4.00: "t" chunk 1 (middle anchor) text run 14 at (205.99,-81.73) startOffset 13 endOffset 14 width 4.00: " " - chunk 1 (middle anchor) text run 15 at (211.73,-77.00) startOffset 14 endOffset 15 width 11.00: "w" + chunk 1 (middle anchor) text run 15 at (211.74,-77.00) startOffset 14 endOffset 15 width 11.00: "w" chunk 1 (middle anchor) text run 16 at (217.03,-71.59) startOffset 15 endOffset 16 width 4.00: "/" chunk 1 (middle anchor) text run 17 at (219.57,-68.53) startOffset 16 endOffset 17 width 4.00: " " chunk 1 (middle anchor) text run 18 at (221.64,-65.79) startOffset 17 endOffset 18 width 3.00: "'" chunk 1 (middle anchor) text run 19 at (224.44,-61.63) startOffset 18 endOffset 19 width 7.00: "x" - chunk 1 (middle anchor) text run 20 at (227.05,-57.19) startOffset 19 endOffset 20 width 3.00: "'" + chunk 1 (middle anchor) text run 20 at (227.05,-57.18) startOffset 19 endOffset 20 width 3.00: "'" chunk 1 (middle anchor) text run 21 at (228.61,-54.20) startOffset 20 endOffset 21 width 4.00: "."
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPathSpaces-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPathSpaces-expected.png index d676e36..c87366f 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPathSpaces-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPathSpaces-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPathSpaces-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPathSpaces-expected.txt index abcacbb4..baec1b9 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPathSpaces-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textOnPathSpaces-expected.txt
@@ -19,7 +19,7 @@ chunk 1 text run 1 at (17.89,27.12) startOffset 0 endOffset 1 width 8.00: "s" chunk 1 text run 2 at (24.02,21.22) startOffset 1 endOffset 2 width 9.00: "a" chunk 1 text run 3 at (32.90,13.99) startOffset 2 endOffset 3 width 14.00: "m" - chunk 1 text run 4 at (43.74,9.08) startOffset 3 endOffset 4 width 10.00: "p" + chunk 1 text run 4 at (43.74,9.07) startOffset 3 endOffset 4 width 10.00: "p" chunk 1 text run 5 at (51.59,9.54) startOffset 4 endOffset 5 width 6.00: "l" chunk 1 text run 6 at (58.02,13.19) startOffset 5 endOffset 6 width 9.00: "e" LayoutSVGInlineText {#text} at (0,0) size 0x0 @@ -38,7 +38,7 @@ chunk 1 text run 1 at (62.17,17.17) startOffset 0 endOffset 1 width 14.00: "m" chunk 1 text run 1 at (79.61,32.13) startOffset 0 endOffset 1 width 10.00: "p" chunk 1 text run 1 at (96.60,35.46) startOffset 0 endOffset 1 width 6.00: "l" - chunk 1 text run 1 at (109.88,25.61) startOffset 0 endOffset 1 width 9.00: "e" + chunk 1 text run 1 at (109.89,25.61) startOffset 0 endOffset 1 width 9.00: "e" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (15,50) size 123x12 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,0) size 123x12 @@ -57,7 +57,7 @@ chunk 1 text run 2 at (31.65,14.87) startOffset 1 endOffset 2 width 9.00: "a" chunk 1 text run 3 at (51.59,9.54) startOffset 2 endOffset 3 width 14.00: "m" chunk 1 text run 4 at (68.67,23.45) startOffset 3 endOffset 4 width 10.00: "p" - chunk 1 text run 5 at (83.07,34.03) startOffset 4 endOffset 5 width 6.00: "l" + chunk 1 text run 5 at (83.08,34.03) startOffset 4 endOffset 5 width 6.00: "l" chunk 1 text run 6 at (99.84,34.02) startOffset 5 endOffset 6 width 9.00: "e" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (15,50) size 118x12 contains 1 chunk(s) @@ -86,7 +86,7 @@ LayoutSVGTextPath {textPath} at (0,0) size 79x42 LayoutSVGInlineText {#text} at (0,0) size 79x42 chunk 1 text run 1 at (17.89,27.12) startOffset 0 endOffset 1 width 8.00: "s" - chunk 1 text run 2 at (25.71,19.70) startOffset 1 endOffset 2 width 9.00: "a" + chunk 1 text run 2 at (25.71,19.69) startOffset 1 endOffset 2 width 9.00: "a" chunk 1 text run 3 at (36.88,11.57) startOffset 2 endOffset 3 width 14.00: "m" chunk 1 text run 4 at (50.64,9.26) startOffset 3 endOffset 4 width 10.00: "p" chunk 1 text run 5 at (59.48,14.49) startOffset 4 endOffset 5 width 6.00: "l" @@ -124,7 +124,7 @@ LayoutSVGTextPath {textPath} at (0,0) size 62x42 LayoutSVGInlineText {#text} at (0,0) size 62x42 chunk 1 text run 1 at (17.58,27.43) startOffset 0 endOffset 1 width 8.00: "s" - chunk 1 text run 2 at (23.06,22.12) startOffset 1 endOffset 2 width 9.00: "a" + chunk 1 text run 2 at (23.06,22.11) startOffset 1 endOffset 2 width 9.00: "a" chunk 1 text run 3 at (30.81,15.49) startOffset 2 endOffset 3 width 14.00: "m" chunk 1 text run 4 at (40.08,10.11) startOffset 3 endOffset 4 width 10.00: "p" chunk 1 text run 5 at (47.02,8.79) startOffset 4 endOffset 5 width 6.00: "l" @@ -164,15 +164,15 @@ chunk 1 text run 1 at (17.89,27.12) startOffset 0 endOffset 1 width 8.00: "s" chunk 1 text run 2 at (20.86,24.21) startOffset 1 endOffset 2 width 9.00: "a" chunk 1 text run 3 at (26.00,19.44) startOffset 2 endOffset 3 width 14.00: "m" - chunk 1 text run 4 at (31.92,14.68) startOffset 3 endOffset 4 width 10.00: "p" + chunk 1 text run 4 at (31.92,14.67) startOffset 3 endOffset 4 width 10.00: "p" chunk 1 text run 5 at (35.00,12.63) startOffset 4 endOffset 5 width 6.00: "l" chunk 1 text run 6 at (37.67,11.17) startOffset 5 endOffset 6 width 9.00: "e" chunk 1 text run 7 at (58.57,13.66) startOffset 6 endOffset 7 width 45.00: " " chunk 1 text run 8 at (109.74,25.73) startOffset 7 endOffset 8 width 8.00: "s" chunk 1 text run 9 at (113.07,23.23) startOffset 8 endOffset 9 width 9.00: "a" chunk 1 text run 10 at (119.17,19.58) startOffset 9 endOffset 10 width 14.00: "m" - chunk 1 text run 11 at (126.16,16.70) startOffset 10 endOffset 11 width 10.00: "p" - chunk 1 text run 12 at (129.62,15.75) startOffset 11 endOffset 12 width 6.00: "l" + chunk 1 text run 11 at (126.17,16.70) startOffset 10 endOffset 11 width 10.00: "p" + chunk 1 text run 12 at (129.63,15.75) startOffset 11 endOffset 12 width 6.00: "l" chunk 1 text run 13 at (132.73,15.19) startOffset 12 endOffset 13 width 9.00: "e" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 72x12 contains 1 chunk(s) @@ -189,7 +189,7 @@ LayoutSVGInlineText {#text} at (0,0) size 132x53 chunk 1 text run 1 at (18.78,26.24) startOffset 0 endOffset 1 width 8.00: "s" chunk 1 text run 2 at (26.85,18.70) startOffset 1 endOffset 2 width 9.00: "a" - chunk 1 text run 3 at (39.38,10.39) startOffset 2 endOffset 3 width 14.00: "m" + chunk 1 text run 3 at (39.39,10.39) startOffset 2 endOffset 3 width 14.00: "m" chunk 1 text run 4 at (54.52,10.80) startOffset 3 endOffset 4 width 10.00: "p" chunk 1 text run 5 at (62.58,17.58) startOffset 4 endOffset 5 width 6.00: "l" chunk 1 text run 6 at (69.67,24.37) startOffset 5 endOffset 6 width 9.00: "e" @@ -197,9 +197,9 @@ chunk 1 text run 8 at (73.11,27.37) startOffset 7 endOffset 8 width 8.00: "s" chunk 1 text run 9 at (82.24,33.62) startOffset 8 endOffset 9 width 9.00: "a" chunk 1 text run 10 at (96.72,35.42) startOffset 9 endOffset 10 width 14.00: "m" - chunk 1 text run 11 at (109.39,26.02) startOffset 10 endOffset 11 width 10.00: "p" + chunk 1 text run 11 at (109.39,26.01) startOffset 10 endOffset 11 width 10.00: "p" chunk 1 text run 12 at (118.07,20.16) startOffset 11 endOffset 12 width 6.00: "l" - chunk 1 text run 13 at (127.13,16.40) startOffset 12 endOffset 13 width 9.00: "e" + chunk 1 text run 13 at (127.14,16.40) startOffset 12 endOffset 13 width 9.00: "e" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 72x12 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,0) size 72x12
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/verticalText-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/verticalText-expected.png index 15da7710..4b1ce5f 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/verticalText-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/verticalText-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/verticalText-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/verticalText-expected.txt index 43a3990..c8cc6924 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/verticalText-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/verticalText-expected.txt
@@ -257,14 +257,14 @@ chunk 1 (vertical) text run 14 at (183.26,36.15) startOffset 13 endOffset 14 height 15.00: " " chunk 1 (vertical) text run 15 at (196.10,28.90) startOffset 14 endOffset 15 height 15.00: "o" chunk 1 (vertical) text run 16 at (206.99,18.58) startOffset 15 endOffset 16 height 15.00: "n" - chunk 1 (vertical) text run 17 at (219.50,10.34) startOffset 16 endOffset 17 height 15.00: " " + chunk 1 (vertical) text run 17 at (219.51,10.34) startOffset 16 endOffset 17 height 15.00: " " chunk 1 (vertical) text run 18 at (234.00,10.53) startOffset 17 endOffset 18 height 15.00: "a" chunk 1 (vertical) text run 19 at (245.44,20.39) startOffset 18 endOffset 19 height 15.00: " " - chunk 1 (vertical) text run 20 at (256.67,30.15) startOffset 19 endOffset 20 height 15.00: "P" + chunk 1 (vertical) text run 20 at (256.68,30.15) startOffset 19 endOffset 20 height 15.00: "P" chunk 1 (vertical) text run 21 at (270.28,36.14) startOffset 20 endOffset 21 height 15.00: "a" chunk 1 (vertical) text run 22 at (283.84,31.10) startOffset 21 endOffset 22 height 15.00: "t" chunk 1 (vertical) text run 23 at (294.78,20.53) startOffset 22 endOffset 23 height 15.00: "h" - chunk 1 (vertical) text run 24 at (306.77,11.62) startOffset 23 endOffset 24 height 15.00: "\x{753B}" + chunk 1 (vertical) text run 24 at (306.78,11.62) startOffset 23 endOffset 24 height 15.00: "\x{753B}" chunk 1 (vertical) text run 25 at (321.16,9.40) startOffset 24 endOffset 25 height 15.00: "\x{50CF}" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGContainer {use} at (0,0) size 448x498
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/verticalTextOnPath-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/verticalTextOnPath-expected.png index d408231bc..47787440 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/verticalTextOnPath-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/verticalTextOnPath-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/verticalTextOnPath-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/verticalTextOnPath-expected.txt index 0e225ad1..d3fd2ee 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/verticalTextOnPath-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/verticalTextOnPath-expected.txt
@@ -29,9 +29,9 @@ chunk 1 (vertical) text run 1 at (53.45,10.26) startOffset 0 endOffset 1 height 17.00: " " chunk 1 (vertical) text run 2 at (57.98,13.16) startOffset 1 endOffset 2 height 17.00: "a" chunk 1 (vertical) text run 3 at (62.14,17.13) startOffset 2 endOffset 3 height 17.00: " " - chunk 1 (vertical) text run 4 at (66.83,21.72) startOffset 3 endOffset 4 height 17.00: "P" - chunk 1 (vertical) text run 5 at (72.71,27.04) startOffset 4 endOffset 5 height 17.00: "a" - chunk 1 (vertical) text run 6 at (77.02,30.39) startOffset 5 endOffset 6 height 17.00: "t" + chunk 1 (vertical) text run 4 at (66.83,21.73) startOffset 3 endOffset 4 height 17.00: "P" + chunk 1 (vertical) text run 5 at (72.72,27.04) startOffset 4 endOffset 5 height 17.00: "a" + chunk 1 (vertical) text run 6 at (77.02,30.40) startOffset 5 endOffset 6 height 17.00: "t" chunk 1 (vertical) text run 7 at (81.70,33.34) startOffset 6 endOffset 7 height 17.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 66x12 contains 1 chunk(s) @@ -110,14 +110,14 @@ chunk 1 (vertical) text run 2 at (82.25,33.62) startOffset 1 endOffset 2 height 17.00: "e" chunk 1 (vertical) text run 3 at (88.32,35.84) startOffset 2 endOffset 3 height 17.00: "x" chunk 1 (vertical) text run 4 at (93.81,36.09) startOffset 3 endOffset 4 height 17.00: "t" - chunk 1 (vertical) text run 5 at (97.61,35.10) startOffset 4 endOffset 5 height 17.00: " " + chunk 1 (vertical) text run 5 at (97.61,35.09) startOffset 4 endOffset 5 height 17.00: " " LayoutSVGTSpan {tspan} at (0,0) size 23x22 LayoutSVGInlineText {#text} at (21,4) size 22x23 chunk 1 (vertical) text run 1 at (102.28,32.40) startOffset 0 endOffset 1 height 17.00: "o" chunk 1 (vertical) text run 2 at (107.69,27.46) startOffset 1 endOffset 2 height 17.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 26x29 LayoutSVGInlineText {#text} at (38,0) size 29x26 - chunk 1 (vertical) text run 1 at (111.94,24.03) startOffset 0 endOffset 1 height 17.00: " " + chunk 1 (vertical) text run 1 at (111.95,24.03) startOffset 0 endOffset 1 height 17.00: " " chunk 1 (vertical) text run 2 at (116.51,21.04) startOffset 1 endOffset 2 height 17.00: "a" chunk 1 (vertical) text run 3 at (121.39,18.53) startOffset 2 endOffset 3 height 17.00: " " chunk 1 (vertical) text run 4 at (127.58,16.27) startOffset 3 endOffset 4 height 17.00: "P" @@ -180,7 +180,7 @@ chunk 1 (end anchor, vertical) text run 2 at (96.34,35.54) startOffset 1 endOffset 2 height 17.00: "a" chunk 1 (end anchor, vertical) text run 3 at (101.21,33.17) startOffset 2 endOffset 3 height 17.00: " " chunk 1 (end anchor, vertical) text run 4 at (106.31,28.73) startOffset 3 endOffset 4 height 17.00: "P" - chunk 1 (end anchor, vertical) text run 5 at (112.49,23.63) startOffset 4 endOffset 5 height 17.00: "a" + chunk 1 (end anchor, vertical) text run 5 at (112.50,23.63) startOffset 4 endOffset 5 height 17.00: "a" chunk 1 (end anchor, vertical) text run 6 at (117.11,20.69) startOffset 5 endOffset 6 height 17.00: "t" chunk 1 (end anchor, vertical) text run 7 at (122.03,18.24) startOffset 6 endOffset 7 height 17.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 @@ -200,17 +200,17 @@ LayoutSVGTextPath {textPath} at (0,0) size 45x78 LayoutSVGInlineText {#text} at (0,0) size 32x29 chunk 1 (vertical) text run 1 at (47.24,8.79) startOffset 0 endOffset 1 height 17.00: "T" - chunk 1 (vertical) text run 2 at (54.41,10.74) startOffset 1 endOffset 2 height 17.00: "e" + chunk 1 (vertical) text run 2 at (54.42,10.74) startOffset 1 endOffset 2 height 17.00: "e" chunk 1 (vertical) text run 3 at (59.57,14.58) startOffset 2 endOffset 3 height 17.00: "x" chunk 1 (vertical) text run 4 at (63.58,18.57) startOffset 3 endOffset 4 height 17.00: "t" chunk 1 (vertical) text run 5 at (66.47,21.38) startOffset 4 endOffset 5 height 17.00: " " LayoutSVGTSpan {tspan} at (0,0) size 22x22 LayoutSVGInlineText {#text} at (26,8) size 21x22 - chunk 1 (vertical) text run 1 at (70.44,25.06) startOffset 0 endOffset 1 height 17.00: "o" - chunk 1 (vertical) text run 2 at (75.83,29.53) startOffset 1 endOffset 2 height 17.00: "n" + chunk 1 (vertical) text run 1 at (70.44,25.07) startOffset 0 endOffset 1 height 17.00: "o" + chunk 1 (vertical) text run 2 at (75.84,29.53) startOffset 1 endOffset 2 height 17.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 31x47 LayoutSVGInlineText {#text} at (31,14) size 46x30 - chunk 1 (vertical) text run 1 at (80.42,32.62) startOffset 0 endOffset 1 height 17.00: " " + chunk 1 (vertical) text run 1 at (80.43,32.62) startOffset 0 endOffset 1 height 17.00: " " chunk 1 (vertical) text run 2 at (85.38,35.00) startOffset 1 endOffset 2 height 17.00: "a" chunk 1 (vertical) text run 3 at (90.70,36.17) startOffset 2 endOffset 3 height 17.00: " " chunk 1 (vertical) text run 4 at (97.03,35.31) startOffset 3 endOffset 4 height 17.00: "P" @@ -239,7 +239,7 @@ LayoutSVGTSpan {tspan} at (0,0) size 24x23 LayoutSVGInlineText {#text} at (5,0) size 23x23 chunk 1 (middle anchor, vertical) text run 1 at (30.07,16.06) startOffset 0 endOffset 1 height 17.00: "o" - chunk 1 (middle anchor, vertical) text run 2 at (35.86,12.13) startOffset 1 endOffset 2 height 17.00: "n" + chunk 1 (middle anchor, vertical) text run 2 at (35.87,12.13) startOffset 1 endOffset 2 height 17.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 35x45 LayoutSVGInlineText {#text} at (25,5) size 44x35 chunk 1 (middle anchor, vertical) text run 1 at (40.86,9.83) startOffset 0 endOffset 1 height 17.00: " " @@ -268,7 +268,7 @@ LayoutSVGInlineText {#text} at (0,0) size 32x31 chunk 1 (end anchor, vertical) text run 1 at (16.80,28.20) startOffset 3 endOffset 4 height 17.00: "P" chunk 1 (end anchor, vertical) text run 2 at (22.58,22.56) startOffset 4 endOffset 5 height 17.00: "a" - chunk 1 (end anchor, vertical) text run 3 at (26.58,18.94) startOffset 5 endOffset 6 height 17.00: "t" + chunk 1 (end anchor, vertical) text run 3 at (26.58,18.93) startOffset 5 endOffset 6 height 17.00: "t" chunk 1 (end anchor, vertical) text run 4 at (30.87,15.45) startOffset 6 endOffset 7 height 17.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 63x12 contains 1 chunk(s) @@ -288,16 +288,16 @@ LayoutSVGTSpan {tspan} at (0,0) size 41x31 LayoutSVGInlineText {#text} at (0,5) size 31x41 chunk 1 (vertical) text run 1 at (30.12,46.89) startOffset 0 endOffset 1 height 17.00: "s" - chunk 1 (vertical) text run 2 at (31.17,40.56) startOffset 1 endOffset 2 height 17.00: "u" - chunk 1 (vertical) text run 3 at (33.65,34.02) startOffset 2 endOffset 3 height 17.00: "p" - chunk 1 (vertical) text run 4 at (37.46,28.15) startOffset 3 endOffset 4 height 17.00: "e" + chunk 1 (vertical) text run 2 at (31.18,40.56) startOffset 1 endOffset 2 height 17.00: "u" + chunk 1 (vertical) text run 3 at (33.65,34.01) startOffset 2 endOffset 3 height 17.00: "p" + chunk 1 (vertical) text run 4 at (37.46,28.14) startOffset 3 endOffset 4 height 17.00: "e" chunk 1 (vertical) text run 5 at (41.62,23.84) startOffset 4 endOffset 5 height 17.00: "r" LayoutSVGInlineText {#text} at (25,0) size 33x26 chunk 1 (vertical) text run 1 at (45.18,21.08) startOffset 0 endOffset 1 height 17.00: " " chunk 1 (vertical) text run 2 at (49.91,18.26) startOffset 1 endOffset 2 height 17.00: "a" chunk 1 (vertical) text run 3 at (56.35,15.52) startOffset 2 endOffset 3 height 17.00: "n" chunk 1 (vertical) text run 4 at (63.11,13.69) startOffset 3 endOffset 4 height 17.00: "d" - chunk 1 (vertical) text run 5 at (68.55,12.84) startOffset 4 endOffset 5 height 17.00: " " + chunk 1 (vertical) text run 5 at (68.56,12.84) startOffset 4 endOffset 5 height 17.00: " " LayoutSVGTSpan {tspan} at (0,0) size 20x21 LayoutSVGInlineText {#text} at (57,8) size 20x19 chunk 1 (vertical) text run 1 at (73.55,12.52) startOffset 0 endOffset 1 height 17.00: "s" @@ -305,7 +305,7 @@ chunk 1 (vertical) text run 3 at (87.00,13.71) startOffset 2 endOffset 3 height 17.00: "b" LayoutSVGInlineText {#text} at (74,2) size 39x36 chunk 1 (vertical) text run 1 at (93.28,15.40) startOffset 0 endOffset 1 height 17.00: "s" - chunk 1 (vertical) text run 2 at (99.28,17.85) startOffset 1 endOffset 2 height 17.00: "c" + chunk 1 (vertical) text run 2 at (99.29,17.85) startOffset 1 endOffset 2 height 17.00: "c" chunk 1 (vertical) text run 3 at (104.50,20.86) startOffset 2 endOffset 3 height 17.00: "r" chunk 1 (vertical) text run 4 at (107.70,23.26) startOffset 3 endOffset 4 height 17.00: "i" chunk 1 (vertical) text run 5 at (111.31,26.71) startOffset 4 endOffset 5 height 17.00: "p" @@ -330,9 +330,9 @@ LayoutSVGInlineText {#text} at (0,1) size 38x45 chunk 1 (vertical) text run 1 at (30.16,46.38) startOffset 0 endOffset 1 height 17.00: "p" chunk 1 (vertical) text run 2 at (31.45,39.57) startOffset 1 endOffset 2 height 17.00: "o" - chunk 1 (vertical) text run 3 at (33.87,33.58) startOffset 2 endOffset 3 height 17.00: "s" + chunk 1 (vertical) text run 3 at (33.88,33.58) startOffset 2 endOffset 3 height 17.00: "s" chunk 1 (vertical) text run 4 at (36.25,29.73) startOffset 3 endOffset 4 height 17.00: "i" - chunk 1 (vertical) text run 5 at (38.43,27.01) startOffset 4 endOffset 5 height 17.00: "t" + chunk 1 (vertical) text run 5 at (38.43,27.00) startOffset 4 endOffset 5 height 17.00: "t" chunk 1 (vertical) text run 6 at (40.88,24.51) startOffset 5 endOffset 6 height 17.00: "i" chunk 1 (vertical) text run 7 at (44.77,21.36) startOffset 6 endOffset 7 height 17.00: "v" chunk 1 (vertical) text run 8 at (50.81,17.80) startOffset 7 endOffset 8 height 17.00: "e" @@ -344,13 +344,13 @@ chunk 1 (vertical) text run 5 at (80.56,12.76) startOffset 4 endOffset 5 height 17.00: " " LayoutSVGTSpan {tspan} at (0,0) size 38x45 LayoutSVGInlineText {#text} at (62,3) size 44x38 - chunk 1 (vertical) text run 1 at (86.01,13.52) startOffset 0 endOffset 1 height 17.00: "n" + chunk 1 (vertical) text run 1 at (86.02,13.52) startOffset 0 endOffset 1 height 17.00: "n" chunk 1 (vertical) text run 2 at (92.80,15.24) startOffset 1 endOffset 2 height 17.00: "e" - chunk 1 (vertical) text run 3 at (99.28,17.85) startOffset 2 endOffset 3 height 17.00: "g" - chunk 1 (vertical) text run 4 at (105.31,21.42) startOffset 3 endOffset 4 height 17.00: "a" + chunk 1 (vertical) text run 3 at (99.29,17.85) startOffset 2 endOffset 3 height 17.00: "g" + chunk 1 (vertical) text run 4 at (105.32,21.42) startOffset 3 endOffset 4 height 17.00: "a" chunk 1 (vertical) text run 5 at (109.56,24.93) startOffset 4 endOffset 5 height 17.00: "t" chunk 1 (vertical) text run 6 at (111.97,27.46) startOffset 5 endOffset 6 height 17.00: "i" - chunk 1 (vertical) text run 7 at (114.92,31.48) startOffset 6 endOffset 7 height 17.00: "v" + chunk 1 (vertical) text run 7 at (114.92,31.49) startOffset 6 endOffset 7 height 17.00: "v" chunk 1 (vertical) text run 8 at (117.96,37.75) startOffset 7 endOffset 8 height 17.00: "e" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (20,55) size 96x12 contains 1 chunk(s) @@ -379,11 +379,11 @@ chunk 1 (vertical) text run 12 at (4.00,69.33) startOffset 11 endOffset 12 height 22.67: " " LayoutSVGTextPath {textPath} at (0,0) size 42x59 LayoutSVGInlineText {#text} at (23,21) size 58x42 - chunk 1 (vertical) text run 1 at (34.24,32.91) startOffset 0 endOffset 1 height 22.67: "o" + chunk 1 (vertical) text run 1 at (34.24,32.90) startOffset 0 endOffset 1 height 22.67: "o" chunk 1 (vertical) text run 2 at (39.86,25.49) startOffset 1 endOffset 2 height 22.67: "n" chunk 1 (vertical) text run 3 at (45.53,20.84) startOffset 2 endOffset 3 height 22.67: " " chunk 1 (vertical) text run 4 at (51.94,17.27) startOffset 3 endOffset 4 height 22.67: "p" - chunk 1 (vertical) text run 5 at (60.75,14.22) startOffset 4 endOffset 5 height 22.67: "a" + chunk 1 (vertical) text run 5 at (60.76,14.22) startOffset 4 endOffset 5 height 22.67: "a" chunk 1 (vertical) text run 6 at (67.98,12.91) startOffset 5 endOffset 6 height 22.67: "t" chunk 1 (vertical) text run 7 at (75.31,12.50) startOffset 6 endOffset 7 height 22.67: "h" LayoutSVGInlineText {#text} at (65,41) size 23x76
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/invalid-lengthlist-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/invalid-lengthlist-expected.txt index 1b0035f0..220ffb4 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/invalid-lengthlist-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/invalid-lengthlist-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 13: Error: Invalid value for <text> attribute x="1.2.3" +CONSOLE ERROR: line 13: Error: <text> attribute x: Expected length, "1.2.3". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/text-match-highlight-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/text-match-highlight-expected.png index beeb8bb..cc330c7 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/text-match-highlight-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/text-match-highlight-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/text-match-highlight-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/text-match-highlight-expected.txt index 6036db8..01a609f 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/text-match-highlight-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/text-match-highlight-expected.txt
@@ -51,37 +51,37 @@ LayoutSVGTextPath {textPath} at (0,0) size 668x238 LayoutSVGInlineText {#text} at (0,0) size 668x238 chunk 1 text run 1 at (109.48,190.53) startOffset 0 endOffset 1 width 26.67: "F" - chunk 1 text run 2 at (122.50,177.58) startOffset 1 endOffset 2 width 10.00: "i" - chunk 1 text run 3 at (135.53,164.80) startOffset 2 endOffset 3 width 26.67: "n" - chunk 1 text run 4 at (154.82,146.40) startOffset 3 endOffset 4 width 26.67: "d" - chunk 1 text run 5 at (178.39,125.18) startOffset 4 endOffset 5 width 36.67: "m" - chunk 1 text run 6 at (202.97,105.12) startOffset 5 endOffset 6 width 26.67: "e" - chunk 1 text run 7 at (220.54,92.43) startOffset 6 endOffset 7 width 16.67: " " - chunk 1 text run 8 at (238.91,80.94) startOffset 7 endOffset 8 width 26.67: "o" - chunk 1 text run 9 at (262.80,69.16) startOffset 8 endOffset 9 width 26.67: "n" - chunk 1 text run 10 at (283.31,62.32) startOffset 9 endOffset 10 width 16.67: " " + chunk 1 text run 2 at (122.51,177.58) startOffset 1 endOffset 2 width 10.00: "i" + chunk 1 text run 3 at (135.54,164.79) startOffset 2 endOffset 3 width 26.67: "n" + chunk 1 text run 4 at (154.83,146.39) startOffset 3 endOffset 4 width 26.67: "d" + chunk 1 text run 5 at (178.39,125.17) startOffset 4 endOffset 5 width 36.67: "m" + chunk 1 text run 6 at (202.97,105.11) startOffset 5 endOffset 6 width 26.67: "e" + chunk 1 text run 7 at (220.55,92.43) startOffset 6 endOffset 7 width 16.67: " " + chunk 1 text run 8 at (238.92,80.94) startOffset 7 endOffset 8 width 26.67: "o" + chunk 1 text run 9 at (262.81,69.16) startOffset 8 endOffset 9 width 26.67: "n" + chunk 1 text run 10 at (283.32,62.32) startOffset 9 endOffset 10 width 16.67: " " chunk 1 text run 11 at (304.62,58.84) startOffset 10 endOffset 11 width 26.67: "a" chunk 1 text run 12 at (326.23,59.54) startOffset 11 endOffset 12 width 16.67: " " chunk 1 text run 13 at (347.21,64.70) startOffset 12 endOffset 13 width 26.67: "p" chunk 1 text run 14 at (371.10,76.49) startOffset 13 endOffset 14 width 26.67: "a" chunk 1 text run 15 at (389.76,90.45) startOffset 14 endOffset 15 width 20.00: "t" - chunk 1 text run 16 at (406.65,106.65) startOffset 15 endOffset 16 width 26.67: "h" - chunk 1 text run 17 at (422.05,121.97) startOffset 16 endOffset 17 width 16.67: "!" + chunk 1 text run 16 at (406.66,106.65) startOffset 15 endOffset 16 width 26.67: "h" + chunk 1 text run 17 at (422.06,121.98) startOffset 16 endOffset 17 width 16.67: "!" chunk 1 text run 18 at (433.90,133.61) startOffset 17 endOffset 18 width 16.67: " " - chunk 1 text run 19 at (450.74,149.77) startOffset 18 endOffset 19 width 30.00: "D" - chunk 1 text run 20 at (465.45,163.37) startOffset 19 endOffset 20 width 10.00: "i" - chunk 1 text run 21 at (479.18,175.50) startOffset 20 endOffset 21 width 26.67: "d" + chunk 1 text run 19 at (450.74,149.78) startOffset 18 endOffset 19 width 30.00: "D" + chunk 1 text run 20 at (465.45,163.38) startOffset 19 endOffset 20 width 10.00: "i" + chunk 1 text run 21 at (479.18,175.51) startOffset 20 endOffset 21 width 26.67: "d" chunk 1 text run 22 at (495.84,189.32) startOffset 21 endOffset 22 width 16.67: " " - chunk 1 text run 23 at (513.09,202.37) startOffset 22 endOffset 23 width 26.67: "y" + chunk 1 text run 23 at (513.09,202.38) startOffset 22 endOffset 23 width 26.67: "y" chunk 1 text run 24 at (535.29,216.95) startOffset 23 endOffset 24 width 26.29: "o" chunk 1 text run 25 at (558.82,229.15) startOffset 24 endOffset 25 width 26.67: "u" chunk 1 text run 26 at (579.15,236.56) startOffset 25 endOffset 26 width 16.67: " " chunk 1 text run 27 at (595.34,240.13) startOffset 26 endOffset 27 width 16.67: "f" - chunk 1 text run 28 at (608.60,241.36) startOffset 27 endOffset 28 width 10.00: "i" + chunk 1 text run 28 at (608.61,241.36) startOffset 27 endOffset 28 width 10.00: "i" chunk 1 text run 29 at (626.88,240.37) startOffset 28 endOffset 29 width 26.67: "n" - chunk 1 text run 30 at (652.51,233.25) startOffset 29 endOffset 30 width 26.67: "d" + chunk 1 text run 30 at (652.52,233.25) startOffset 29 endOffset 30 width 26.67: "d" chunk 1 text run 31 at (679.87,217.49) startOffset 30 endOffset 31 width 36.67: "m" chunk 1 text run 32 at (703.66,196.38) startOffset 31 endOffset 32 width 26.67: "e" - chunk 1 text run 33 at (722.06,179.49) startOffset 32 endOffset 33 width 23.33: "?" + chunk 1 text run 33 at (722.07,179.48) startOffset 32 endOffset 33 width 23.33: "?" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/error/010-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/error/010-expected.txt index b1136d42..9c6f25c 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/error/010-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/error/010-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 1: Error: Invalid value for <svg> attribute viewBox="0 0 1 1 1" +CONSOLE ERROR: line 1: Error: <svg> attribute viewBox: Trailing garbage, "0 0 1 1 1". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/error/011-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/error/011-expected.txt index db215eb..58506dc 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/error/011-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/error/011-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 1: Error: Invalid value for <svg> attribute viewBox="0 0,, 1 1" +CONSOLE ERROR: line 1: Error: <svg> attribute viewBox: Expected number, "0 0,, 1 1". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/bbox-with-glyph-overflow-on-path-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/text/bbox-with-glyph-overflow-on-path-expected.png index 8447ebb..bf1eb7eb 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/bbox-with-glyph-overflow-on-path-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/bbox-with-glyph-overflow-on-path-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/bbox-with-glyph-overflow-on-path-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/text/bbox-with-glyph-overflow-on-path-expected.txt index ed5576d5..f76f5c5 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/bbox-with-glyph-overflow-on-path-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/bbox-with-glyph-overflow-on-path-expected.txt
@@ -12,7 +12,7 @@ LayoutSVGPath {path} at (8,28) size 0x0 [fill={[type=SOLID] [color=#000000]}] [data="M 400 150 L 50 150"] LayoutSVGPath {path} at (58,278) size 350x100 [fill={[type=SOLID] [color=#000000]}] [data="M 50 250 L 400 350"] LayoutSVGPath {path} at (8,28) size 0x0 [fill={[type=SOLID] [color=#000000]}] [data="M 50 450 L 400 450"] - LayoutSVGText {text} at (40,55) size 364x57 contains 1 chunk(s) + LayoutSVGText {text} at (41,55) size 363x57 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 363x57 LayoutSVGInlineText {#text} at (0,0) size 363x57 chunk 1 text run 1 at (57.50,100.00) startOffset 0 endOffset 1 width 15.00: "f" @@ -94,7 +94,7 @@ chunk 1 text run 23 at (374.51,342.72) startOffset 22 endOffset 23 width 15.00: "f" chunk 1 text run 24 at (388.94,346.84) startOffset 23 endOffset 24 width 15.00: "f" LayoutSVGInlineText {#text} at (0,0) size 0x0 - LayoutSVGText {text} at (49,394) size 136x71 contains 1 chunk(s) + LayoutSVGText {text} at (50,394) size 135x71 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 135x71 LayoutSVGInlineText {#text} at (0,0) size 135x71 chunk 1 text run 1 at (59.50,450.00) startOffset 0 endOffset 1 width 19.00: "'" @@ -103,9 +103,9 @@ chunk 1 text run 4 at (142.00,450.00) startOffset 3 endOffset 4 width 44.00: "Q" chunk 1 text run 5 at (173.50,450.00) startOffset 4 endOffset 5 width 19.00: "'" LayoutSVGInlineText {#text} at (0,0) size 0x0 - LayoutSVGRect {rect} at (48,82) size 365x59 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=40.98] [y=55.00] [width=363.00] [height=57.00] + LayoutSVGRect {rect} at (48,82) size 365x59 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=41.00] [y=55.00] [width=363.00] [height=57.00] LayoutSVGRect {rect} at (53,165) size 365x59 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=46.00] [y=138.00] [width=363.00] [height=57.00] LayoutSVGRect {rect} at (45,231) size 381x161 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=38.05] [y=204.25] [width=379.09] [height=158.64] - LayoutSVGRect {rect} at (57,421) size 137x73 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=49.98] [y=394.00] [width=135.00] [height=71.00] + LayoutSVGRect {rect} at (57,421) size 137x73 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=50.00] [y=394.00] [width=135.00] [height=71.00] LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/text-selection-path-01-b-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/text/text-selection-path-01-b-expected.png index fa00a29..e022ed9 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/text-selection-path-01-b-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/text-selection-path-01-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/text-selection-path-01-b-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/text/text-selection-path-01-b-expected.txt index 8703b94..3399f36e 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/text-selection-path-01-b-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/text-selection-path-01-b-expected.txt
@@ -25,7 +25,7 @@ chunk 1 text run 10 at (302.19,62.96) startOffset 9 endOffset 10 width 8.40: " " chunk 1 text run 11 at (310.87,74.37) startOffset 10 endOffset 11 width 20.40: "p" chunk 1 text run 12 at (324.66,87.72) startOffset 11 endOffset 12 width 18.00: "a" - chunk 1 text run 13 at (337.49,96.09) startOffset 12 endOffset 13 width 12.60: "t" + chunk 1 text run 13 at (337.49,96.10) startOffset 12 endOffset 13 width 12.60: "t" chunk 1 text run 14 at (353.02,102.49) startOffset 13 endOffset 14 width 21.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGContainer {g} at (0,82) size 486x271 @@ -35,7 +35,7 @@ LayoutSVGTextPath {textPath} at (0,0) size 216x120 LayoutSVGTSpan {tspan} at (0,0) size 57x58 LayoutSVGInlineText {#text} at (0,37) size 57x58 - chunk 1 text run 1 at (37.53,135.51) startOffset 0 endOffset 1 width 22.20: "T" + chunk 1 text run 1 at (37.53,135.50) startOffset 0 endOffset 1 width 22.20: "T" chunk 1 text run 2 at (46.73,118.03) startOffset 1 endOffset 2 width 17.40: "e" LayoutSVGTSpan {tspan} at (0,0) size 44x41 LayoutSVGInlineText {#text} at (34,25) size 44x41 @@ -50,7 +50,7 @@ chunk 1 text run 7 at (136.56,119.54) startOffset 6 endOffset 7 width 8.40: " " chunk 1 text run 8 at (145.36,130.85) startOffset 7 endOffset 8 width 20.40: "p" chunk 1 text run 9 at (159.13,144.22) startOffset 8 endOffset 9 width 18.00: "a" - chunk 1 text run 10 at (171.95,152.60) startOffset 9 endOffset 10 width 12.60: "t" + chunk 1 text run 10 at (171.96,152.60) startOffset 9 endOffset 10 width 12.60: "t" chunk 1 text run 11 at (187.48,158.99) startOffset 10 endOffset 11 width 21.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGRect {rect} at (27,280) size 459x71 [stroke={[type=SOLID] [color=#000000]}] [x=17.00] [y=169.00] [width=274.00] [height=41.00] @@ -63,7 +63,7 @@ LayoutSVGContainer {g} at (188,352) size 501x134 LayoutSVGContainer {use} at (188,385) size 501x7 LayoutSVGPath {path} at (188,385) size 501x7 [stroke={[type=SOLID] [color=#0000FF] [stroke width=4.00]}] [data="M 113 233 L 413 233"] - LayoutSVGText {text} at (211,211) size 175x28 contains 1 chunk(s) + LayoutSVGText {text} at (212,211) size 174x28 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 174x27 LayoutSVGInlineText {#text} at (0,0) size 174x27 chunk 1 text run 1 at (219.20,233.00) startOffset 0 endOffset 1 width 14.40: "T"
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/text/textPathBoundsBug-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/text/textPathBoundsBug-expected.png index ee10195e..0ac2ef0 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/text/textPathBoundsBug-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/text/textPathBoundsBug-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/animated-path-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/animated-path-inside-transformed-html-expected.png index 1a53842..aa2852bf 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/animated-path-inside-transformed-html-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/animated-path-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/svg-css-transforms-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/svg-css-transforms-expected.png index aaf844c..e05cce8 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/svg-css-transforms-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/svg-css-transforms-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-inside-transformed-html-expected.png index 509d715..e03cbfe 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-inside-transformed-html-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/tables/mozilla/dom/tableDom-expected.png b/third_party/WebKit/LayoutTests/platform/linux/tables/mozilla/dom/tableDom-expected.png index 23b1f77..02b5996 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/tables/mozilla/dom/tableDom-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/tables/mozilla/dom/tableDom-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/tables/mozilla/dom/tableDom-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/tables/mozilla/dom/tableDom-expected.txt index b682f96..ccdb7a09 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/tables/mozilla/dom/tableDom-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/tables/mozilla/dom/tableDom-expected.txt
@@ -4,28 +4,28 @@ LayoutBlockFlow {HTML} at (0,0) size 800x600 LayoutBlockFlow {BODY} at (8,8) size 784x584 LayoutBlockFlow {FORM} at (0,0) size 784x22 - LayoutMenuList {SELECT} at (0,1) size 91x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] - LayoutBlockFlow (anonymous) at (1,1) size 89x18 + LayoutMenuList {SELECT} at (0,1) size 90x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] + LayoutBlockFlow (anonymous) at (1,1) size 88x18 LayoutText (anonymous) at (4,1) size 66x16 text run at (4,1) width 66: "append cell" - LayoutText {#text} at (91,1) size 51x19 - text run at (91,1) width 51: " tbody " - LayoutTextControl {INPUT} at (142,0) size 64x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutText {#text} at (206,1) size 40x19 - text run at (206,1) width 40: " row " - LayoutTextControl {INPUT} at (246,0) size 64x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutText {#text} at (310,1) size 34x19 - text run at (310,1) width 34: " col " - LayoutTextControl {INPUT} at (344,0) size 64x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutText {#text} at (408,1) size 72x19 - text run at (408,1) width 72: " row span " - LayoutTextControl {INPUT} at (480,0) size 64x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutText {#text} at (544,1) size 66x19 - text run at (544,1) width 66: " col span " - LayoutTextControl {INPUT} at (610,0) size 64x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutText {#text} at (674,1) size 20x19 - text run at (674,1) width 20: " " - LayoutButton {INPUT} at (694,0) size 43x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] + LayoutText {#text} at (90,1) size 51x19 + text run at (90,1) width 51: " tbody " + LayoutTextControl {INPUT} at (141,0) size 64x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (205,1) size 40x19 + text run at (205,1) width 40: " row " + LayoutTextControl {INPUT} at (245,0) size 64x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (309,1) size 34x19 + text run at (309,1) width 34: " col " + LayoutTextControl {INPUT} at (343,0) size 64x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (407,1) size 72x19 + text run at (407,1) width 72: " row span " + LayoutTextControl {INPUT} at (479,0) size 64x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (543,1) size 66x19 + text run at (543,1) width 66: " col span " + LayoutTextControl {INPUT} at (609,0) size 64x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (673,1) size 20x19 + text run at (673,1) width 20: " " + LayoutButton {INPUT} at (693,0) size 43x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] LayoutBlockFlow (anonymous) at (8,3) size 27x16 LayoutText {#text} at (0,0) size 27x16 text run at (0,0) width 27: "Do It" @@ -47,23 +47,23 @@ text run at (2,2) width 23: "c22" LayoutBlockFlow (anonymous) at (0,114) size 784x20 LayoutBR {BR} at (0,0) size 0x19 -layer at (152,11) size 60x16 +layer at (151,11) size 60x16 LayoutBlockFlow {DIV} at (2,3) size 60x16 LayoutText {#text} at (0,0) size 7x16 text run at (0,0) width 7: "0" -layer at (256,11) size 60x16 +layer at (255,11) size 60x16 LayoutBlockFlow {DIV} at (2,3) size 60x16 LayoutText {#text} at (0,0) size 7x16 text run at (0,0) width 7: "0" -layer at (354,11) size 60x16 +layer at (353,11) size 60x16 LayoutBlockFlow {DIV} at (2,3) size 60x16 LayoutText {#text} at (0,0) size 7x16 text run at (0,0) width 7: "0" -layer at (490,11) size 60x16 +layer at (489,11) size 60x16 LayoutBlockFlow {DIV} at (2,3) size 60x16 LayoutText {#text} at (0,0) size 7x16 text run at (0,0) width 7: "1" -layer at (620,11) size 60x16 +layer at (619,11) size 60x16 LayoutBlockFlow {DIV} at (2,3) size 60x16 LayoutText {#text} at (0,0) size 7x16 text run at (0,0) width 7: "1"
diff --git a/third_party/WebKit/LayoutTests/platform/linux/transforms/svg-vs-css-expected.png b/third_party/WebKit/LayoutTests/platform/linux/transforms/svg-vs-css-expected.png index a0f8298..1e65cbc 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/transforms/svg-vs-css-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/transforms/svg-vs-css-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png index f5737bf..44044a12 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/threaded/printing/ellipsis-printing-style-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/threaded/printing/ellipsis-printing-style-expected.png new file mode 100644 index 0000000..dd91259 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/threaded/printing/ellipsis-printing-style-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/threaded/printing/iframe-print-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/threaded/printing/iframe-print-expected.png new file mode 100644 index 0000000..be748b9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/threaded/printing/iframe-print-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/editing/selection/select-across-readonly-input-3-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/editing/selection/select-across-readonly-input-3-expected.png index 7e39e61..c80d8bf 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-lion/editing/selection/select-across-readonly-input-3-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-lion/editing/selection/select-across-readonly-input-3-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/placeholder-position-expected.png index a2c5a320..07e87e4 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/placeholder-position-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/placeholder-position-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/search/search-vertical-alignment-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/search/search-vertical-alignment-expected.png index c954e30..84344f2 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/search/search-vertical-alignment-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/search/search-vertical-alignment-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/text/text-font-height-mismatch-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/text/text-font-height-mismatch-expected.png index f4ec5e2..a4e8c7a 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/text/text-font-height-mismatch-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/text/text-font-height-mismatch-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/text/text-font-height-mismatch-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/text/text-font-height-mismatch-expected.txt index b78dea0c..e3a7806 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/text/text-font-height-mismatch-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/text/text-font-height-mismatch-expected.txt
@@ -1,27 +1,32 @@ CONSOLE WARNING: Failed to decode downloaded font: NotoSansCJKjp-Regular-cid03075.otf layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x138 - LayoutBlockFlow {HTML} at (0,0) size 800x138 - LayoutBlockFlow {BODY} at (8,16) size 784x114 +layer at (0,0) size 800x142 + LayoutBlockFlow {HTML} at (0,0) size 800x142 + LayoutBlockFlow {BODY} at (8,16) size 784x118 LayoutBlockFlow {P} at (0,0) size 784x18 LayoutText {#text} at (0,0) size 273x18 text run at (0,0) width 273: "Editable text should be centered vertically." - LayoutBlockFlow {DIV} at (0,34) size 784x24 - LayoutTextControl {INPUT} at (0,0) size 170x22 [bgcolor=#FFFFFF] [border: (1px solid #000000)] - LayoutBlockFlow {DIV} at (0,58) size 784x28 + LayoutBlockFlow {DIV} at (0,34) size 784x28 + LayoutTextControl {INPUT} at (0,3) size 170x22 [bgcolor=#FFFFFF] [border: (1px solid #000000)] + LayoutTextControl {INPUT} at (170,0) size 170x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)] + LayoutBlockFlow {DIV} at (0,62) size 784x28 LayoutTextControl {INPUT} at (0,0) size 260x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)] - LayoutBlockFlow {DIV} at (0,86) size 784x28 + LayoutBlockFlow {DIV} at (0,90) size 784x28 LayoutTextControl {INPUT} at (0,0) size 170x28 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] -layer at (10,52) size 166x18 scrollHeight 24 - LayoutBlockFlow {DIV} at (2,2) size 166x18 +layer at (10,52) size 166x24 + LayoutBlockFlow {DIV} at (2,-1) size 166x24 LayoutText {#text} at (0,4) size 74x18 text run at (0,4) width 74: "\x{3075} ABCgjy" -layer at (10,74) size 256x28 +layer at (180,52) size 166x24 + LayoutBlockFlow {DIV} at (2,2) size 166x24 + LayoutText {#text} at (0,4) size 74x18 + text run at (0,4) width 74: "\x{3075} ABCgjy" +layer at (10,78) size 256x28 LayoutBlockFlow {DIV} at (2,0) size 256x28 LayoutText {#text} at (0,0) size 82x28 text run at (0,0) width 82: "ABCgjy" -layer at (11,107) size 164x18 +layer at (11,111) size 164x18 LayoutBlockFlow {DIV} at (3,5) size 164x18 LayoutText {#text} at (0,0) size 55x18 text run at (0,0) width 55: "ABCgjy"
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/frames/iframe-scaling-with-scroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/frames/iframe-scaling-with-scroll-expected.png index afde499..13c84062 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/frames/iframe-scaling-with-scroll-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/frames/iframe-scaling-with-scroll-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/overflow/overflow-update-transform-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/overflow/overflow-update-transform-expected.png index 37318bd..c4b89d6 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/overflow/overflow-update-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/overflow/overflow-update-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/table/table-display-types-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/table/table-display-types-vertical-expected.png index 6b9be1b..5baa47d6 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/table/table-display-types-vertical-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/table/table-display-types-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/text/international/mixed-directionality-selection-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/text/international/mixed-directionality-selection-expected.png index f02f7d8..77b05b2 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/text/international/mixed-directionality-selection-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/text/international/mixed-directionality-selection-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/transforms/transformed-focused-text-input-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/transforms/transformed-focused-text-input-expected.png index e408e4b6..4ba7f2d 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/transforms/transformed-focused-text-input-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/transforms/transformed-focused-text-input-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/svg/transforms/text-with-pattern-inside-transformed-html-expected.png index e98416f..f8d39aa4 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-lion/svg/transforms/text-with-pattern-inside-transformed-html-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-lion/svg/transforms/text-with-pattern-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png deleted file mode 100644 index 9d5592a..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-lion/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-3-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-3-expected.png index b92588c..88767c9a 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-3-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-3-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/placeholder-position-expected.png index b5f46f7..50bb433 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/placeholder-position-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/placeholder-position-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/placeholder-position-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/placeholder-position-expected.txt index 72f8c118..aba789f6 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/placeholder-position-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/placeholder-position-expected.txt
@@ -7,9 +7,19 @@ LayoutFlexibleBox {DIV} at (4,3) size 117x13 LayoutBlockFlow {DIV} at (0,6.50) size 5x0 LayoutBlockFlow {DIV} at (5,0) size 100x13 - LayoutBR {BR} at (125,14) size 0x0 - LayoutTextControl {INPUT} at (0,19) size 123x19 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (123,33) size 0x0 + LayoutText {#text} at (125,0) size 4x18 + text run at (125,0) width 4: " " + LayoutBR {BR} at (129,14) size 0x0 + LayoutTextControl {INPUT} at (0,19) size 73x19 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (73,19) size 4x18 + text run at (73,19) width 4: " " + LayoutTextControl {INPUT} at (77,19) size 73x19 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (150,19) size 4x18 + text run at (150,19) width 4: " " + LayoutTextControl {INPUT} at (154,19) size 123x19 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (277,19) size 4x18 + text run at (277,19) width 4: " " + LayoutBR {BR} at (281,33) size 0x0 LayoutTextControl {INPUT} at (0,38) size 125x19 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (4,3) size 117x13 LayoutBlockFlow {DIV} at (0,6.50) size 5x0 @@ -32,7 +42,13 @@ LayoutTextControl {INPUT} at (127,226) size 123x31 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (250,232) size 4x18 text run at (250,232) width 4: " " - LayoutBR {BR} at (254,246) size 0x0 + LayoutTextControl {INPUT} at (254,229) size 123x25 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (377,232) size 4x18 + text run at (377,232) width 4: " " + LayoutTextControl {INPUT} at (381,229) size 123x25 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (504,232) size 4x18 + text run at (504,232) width 4: " " + LayoutBR {BR} at (0,0) size 0x0 LayoutTextControl {INPUT} at (0,257) size 123x19 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (123,257) size 4x18 text run at (123,257) width 4: " " @@ -50,11 +66,23 @@ text run at (0,0) width 63: "placeholder" layer at (17,11) size 100x13 LayoutBlockFlow {DIV} at (0,0) size 100x13 -layer at (11,30) size 117x13 - LayoutBlockFlow {DIV} at (3,3) size 117x13 [color=#A9A9A9] +layer at (11,30) size 67x13 + LayoutBlockFlow {DIV} at (3,3) size 67x13 [color=#A9A9A9] LayoutText {#text} at (0,0) size 63x13 text run at (0,0) width 63: "placeholder" -layer at (11,30) size 117x13 +layer at (11,30) size 67x13 + LayoutBlockFlow {DIV} at (3,3) size 67x13 +layer at (88,31) size 67x11 scrollHeight 12 + LayoutBlockFlow {DIV} at (3,4) size 67x11 [color=#A9A9A9] + LayoutText {#text} at (0,-1) size 63x13 + text run at (0,-1) width 63: "placeholder" +layer at (88,30) size 67x13 + LayoutBlockFlow {DIV} at (3,3) size 67x13 +layer at (165,28) size 117x17 + LayoutBlockFlow {DIV} at (3,1) size 117x17 [color=#A9A9A9] + LayoutText {#text} at (0,2) size 96x13 + text run at (0,2) width 96: "\x{65E5}\x{672C}\x{8A9E}placeholder" +layer at (165,30) size 117x13 LayoutBlockFlow {DIV} at (3,3) size 117x13 layer at (17,49) size 100x13 LayoutBlockFlow {DIV} at (9,3) size 100x13 [color=#A9A9A9] @@ -102,6 +130,18 @@ text run at (0,6) width 63: "placeholder" layer at (138,237) size 117x25 LayoutBlockFlow {DIV} at (3,3) size 117x25 +layer at (265,243) size 117x13 + LayoutBlockFlow {DIV} at (3,6) size 117x13 [color=#A9A9A9] + LayoutText {#text} at (0,0) size 63x13 + text run at (0,0) width 63: "placeholder" +layer at (265,243) size 117x13 + LayoutBlockFlow {DIV} at (3,6) size 117x13 +layer at (392,237) size 117x25 + LayoutBlockFlow {DIV} at (3,0) size 117x25 [color=#A9A9A9] + LayoutText {#text} at (0,6) size 63x13 + text run at (0,6) width 63: "placeholder" +layer at (392,243) size 117x13 + LayoutBlockFlow {DIV} at (3,6) size 117x13 layer at (11,268) size 117x13 LayoutBlockFlow {DIV} at (3,3) size 117x13 LayoutText {#text} at (43,0) size 31x13
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-vertical-alignment-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-vertical-alignment-expected.png index e2cb9d2e..60a1f196 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-vertical-alignment-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-vertical-alignment-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-vertical-alignment-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-vertical-alignment-expected.txt index c7dd7976..2db64ad 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-vertical-alignment-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-vertical-alignment-expected.txt
@@ -29,13 +29,13 @@ LayoutTextControl {INPUT} at (127,2) size 123x16 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 LayoutBlockFlow {P} at (0,147) size 784x18 - LayoutTextControl {INPUT} at (0,0) size 123x12 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutTextControl {INPUT} at (0,4) size 123x12 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (3,0) size 117x12 LayoutBlockFlow {DIV} at (0,0) size 16x13 - LayoutBlockFlow {DIV} at (16,3) size 89x6 + LayoutBlockFlow {DIV} at (16,-0.50) size 89x13 LayoutText {#text} at (123,0) size 4x18 text run at (123,0) width 4: " " - LayoutTextControl {INPUT} at (127,0) size 123x12 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutTextControl {INPUT} at (127,4) size 123x12 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (27,76) size 89x13 LayoutBlockFlow {DIV} at (0,0) size 89x13 @@ -53,17 +53,17 @@ LayoutBlockFlow {DIV} at (3,1.50) size 117x13 LayoutText {#text} at (0,0) size 24x13 text run at (0,0) width 24: "Text" -layer at (27,158) size 89x6 scrollHeight 13 - LayoutBlockFlow {DIV} at (0,0) size 89x6 +layer at (27,159) size 89x13 + LayoutBlockFlow {DIV} at (0,0) size 89x13 LayoutText {#text} at (0,0) size 24x13 text run at (0,0) width 24: "Text" -layer at (138,158) size 117x6 scrollHeight 13 - LayoutBlockFlow {DIV} at (3,3) size 117x6 +layer at (138,159) size 117x13 + LayoutBlockFlow {DIV} at (3,-0.50) size 117x13 LayoutText {#text} at (0,0) size 24x13 text run at (0,0) width 24: "Text" layer at (117,77) size 11x11 transparent LayoutBlockFlow {DIV} at (106,14) size 11x11 layer at (117,126) size 11x11 transparent LayoutBlockFlow {DIV} at (106,1) size 11x11 -layer at (117,156) size 11x11 transparent +layer at (117,160) size 11x11 transparent LayoutBlockFlow {DIV} at (106,0.50) size 11x11
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-font-height-mismatch-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-font-height-mismatch-expected.png index f1eedaf94..3de080d 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-font-height-mismatch-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-font-height-mismatch-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-font-height-mismatch-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-font-height-mismatch-expected.txt index 528cd4a..abab82c 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-font-height-mismatch-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-font-height-mismatch-expected.txt
@@ -8,6 +8,7 @@ text run at (0,0) width 273: "Editable text should be centered vertically." LayoutBlockFlow {DIV} at (0,34) size 784x28 LayoutTextControl {INPUT} at (0,0) size 251x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)] + LayoutTextControl {INPUT} at (251,0) size 251x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (0,62) size 784x28 LayoutTextControl {INPUT} at (0,0) size 260x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (0,90) size 784x28 @@ -16,6 +17,10 @@ LayoutBlockFlow {DIV} at (2,1.50) size 247x25 LayoutText {#text} at (0,0) size 74x24 text run at (0,0) width 74: "\x{3075} ABCgjy" +layer at (261,52) size 247x25 + LayoutBlockFlow {DIV} at (2,1.50) size 247x25 + LayoutText {#text} at (0,0) size 74x24 + text run at (0,0) width 74: "\x{3075} ABCgjy" layer at (10,78) size 256x28 LayoutBlockFlow {DIV} at (2,0) size 256x28 LayoutText {#text} at (0,0) size 82x28
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-overflow-by-value-update-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-overflow-by-value-update-expected.txt index 16ccf596..2c974eb2 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-overflow-by-value-update-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-overflow-by-value-update-expected.txt
@@ -1,12 +1,12 @@ layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x52 - LayoutBlockFlow {HTML} at (0,0) size 800x52 - LayoutBlockFlow {BODY} at (8,8) size 784x36 - LayoutTextControl {INPUT} at (0,0) size 102x2 [bgcolor=#FFFFFF] +layer at (0,0) size 800x34 + LayoutBlockFlow {HTML} at (0,0) size 800x34 + LayoutBlockFlow {BODY} at (8,8) size 784x18 + LayoutTextControl {INPUT} at (0,1) size 102x2 [bgcolor=#FFFFFF] LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 -layer at (9,9) size 100x0 scrollHeight 38 - LayoutBlockFlow {DIV} at (1,1) size 100x0 +layer at (9,-9) size 100x38 backgroundClip at (9,0) size 100x29 clip at (9,0) size 100x29 + LayoutBlockFlow {DIV} at (1,-18) size 100x38 LayoutText {#text} at (0,0) size 66x38 text run at (0,0) width 66: "FAIL"
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-overflow-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-overflow-expected.txt index 333f9eb..6e7e064e 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-overflow-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-overflow-expected.txt
@@ -6,6 +6,6 @@ LayoutTextControl {INPUT} at (0,0) size 123x10 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 -layer at (11,11) size 117x4 scrollHeight 13 - LayoutBlockFlow {DIV} at (3,3) size 117x4 +layer at (11,7) size 117x13 + LayoutBlockFlow {DIV} at (3,-1.50) size 117x13 caret: position 0 of child 0 {DIV} of {#document-fragment} of child 1 {INPUT} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/frames/iframe-scaling-with-scroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/frames/iframe-scaling-with-scroll-expected.png index a229235..5cce9af 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/frames/iframe-scaling-with-scroll-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/frames/iframe-scaling-with-scroll-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-update-transform-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-update-transform-expected.png index ab8fdf1..6993487a 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-update-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-update-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/change-text-content-and-background-color-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/change-text-content-and-background-color-expected.txt index 9cbb0220..d4c3d7c 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/change-text-content-and-background-color-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/change-text-content-and-background-color-expected.txt
@@ -12,11 +12,10 @@ [8, 8, 244, 67] ], "paintInvalidationClients": [ - "RootInlineBox", "InlineTextBox ''", + "RootInlineBox", "LayoutTextControl (positioned) INPUT id='input'", "LayoutBlockFlow DIV id='inner-editor'", - "RootInlineBox", "LayoutText #text", "InlineTextBox 'NEW'" ]
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/multi-layout-one-frame-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/multi-layout-one-frame-expected.txt index 1a604daa6..430fc53 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/multi-layout-one-frame-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/multi-layout-one-frame-expected.txt
@@ -14,16 +14,14 @@ [11, 11, 37, 13] ], "paintInvalidationClients": [ - "RootInlineBox", "InlineTextBox ''", "RootInlineBox", "InlineTextBox ''", + "RootInlineBox", "LayoutBlockFlow DIV id='inner-editor'", - "RootInlineBox", "LayoutText #text", "InlineTextBox 'PASSED'", "LayoutBlockFlow DIV id='inner-editor'", - "RootInlineBox", "LayoutText #text", "InlineTextBox 'PASSED'" ]
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/subtree-root-skipped-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/subtree-root-skipped-expected.txt index 3fe1f63a..247f8f7 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/subtree-root-skipped-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/subtree-root-skipped-expected.txt
@@ -13,10 +13,9 @@ [8, 288, 10, 20] ], "paintInvalidationClients": [ - "RootInlineBox", "InlineTextBox ''", - "LayoutBlockFlow DIV id='inner-editor'", "RootInlineBox", + "LayoutBlockFlow DIV id='inner-editor'", "LayoutText #text", "InlineTextBox 'PASS'", "LayoutBlockFlow (positioned) DIV id='div'"
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/table-display-types-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/table-display-types-vertical-expected.png index a606ed1..2a44d32 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/table-display-types-vertical-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/table-display-types-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/mixed-directionality-selection-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/mixed-directionality-selection-expected.png index 8d25a556..324ab86 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/mixed-directionality-selection-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/mixed-directionality-selection-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/mixed-directionality-selection-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/mixed-directionality-selection-expected.txt index 2f2b434..faee0d9 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/mixed-directionality-selection-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/mixed-directionality-selection-expected.txt
@@ -10,8 +10,8 @@ LayoutText {#text} at (0,0) size 560x18 text run at (0,0) width 367: "The last character (and only the last character) should be " text run at (366,0) width 194: "selected in the text box above." -layer at (11,11) size 200x76 scrollHeight 88 - LayoutBlockFlow {DIV} at (3,3) size 200x76 +layer at (11,5) size 200x88 + LayoutBlockFlow {DIV} at (3,-3) size 200x88 LayoutText {#text} at (11,0) size 189x76 text run at (11,0) width 189 RTL: "[[\x{645}\x{642}\x{627}\x{644}\x{647}]]" selection start: position 0 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 1 {INPUT} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/transforms/transformed-focused-text-input-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/transforms/transformed-focused-text-input-expected.png index 33d47de..f4cd1cb9 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/transforms/transformed-focused-text-input-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/transforms/transformed-focused-text-input-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mavericks/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt new file mode 100644 index 0000000..526cb16 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt
@@ -0,0 +1,86 @@ +zh-CN: 誤過骨 +#zh-CN: +"Times" : 7, +"Hiragino Mincho ProN" : 3 + +zh-TW: 誤過骨 +#zh-TW: +"Times" : 7, +"Hiragino Mincho ProN" : 3 + +zh-HK: 誤過骨 +#zh-HK: +"Times" : 7, +"Hiragino Mincho ProN" : 3 + +ja: 誤過骨 +#ja: +"Times" : 4, +"Hiragino Mincho ProN" : 3 + +ja-JP: 誤過骨 +#ja-JP: +"Times" : 7, +"Hiragino Mincho ProN" : 3 + +ko: 誤過骨 +#ko: +"Times" : 4, +"Hiragino Mincho ProN" : 3 + +ko-KR: 誤過骨 +#ko-KR: +"Times" : 7, +"Hiragino Mincho ProN" : 3 + +en-CN: 誤過骨 +#en-CN: +"Times" : 7, +"Hiragino Mincho ProN" : 3 + +en-JP: 誤過骨 +#en-JP: +"Times" : 7, +"Hiragino Mincho ProN" : 3 + +en-KR: 誤過骨 +#en-KR: +"Times" : 7, +"Hiragino Mincho ProN" : 3 + +en-HK: 誤過骨 +#en-HK: +"Times" : 7, +"Hiragino Mincho ProN" : 3 + +en-TW: 誤過骨 +#en-TW: +"Times" : 7, +"Hiragino Mincho ProN" : 3 + +en-HanS: 誤過骨 +#en-HanS: +"Times" : 9, +"Hiragino Mincho ProN" : 3 + +en-HanT: 誤過骨 +#en-HanT: +"Times" : 9, +"Hiragino Mincho ProN" : 3 + +en-HanS-JP: 誤過骨 +#en-HanS-JP: +"Times" : 12, +"Hiragino Mincho ProN" : 3 + +en-HanT-JP: 誤過骨 +#en-HanT-JP: +"Times" : 12, +"Hiragino Mincho ProN" : 3 + +en-US: 誤過骨 +#en-US: +"Times" : 7, +"Hiragino Mincho ProN" : 3 + +
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/transforms/text-with-pattern-inside-transformed-html-expected.png index de1f1b7..1f740a7 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/transforms/text-with-pattern-inside-transformed-html-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/transforms/text-with-pattern-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png deleted file mode 100644 index 9d5592a..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mountainlion/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mountainlion/fast/forms/placeholder-position-expected.png new file mode 100644 index 0000000..c5a96e6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mountainlion/fast/forms/placeholder-position-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mountainlion/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mountainlion/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png deleted file mode 100644 index 9d5592a..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-mountainlion/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png deleted file mode 100644 index 9d5592a..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/editing/selection/select-across-readonly-input-3-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/editing/selection/select-across-readonly-input-3-expected.png index bb458556..1396540 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/editing/selection/select-across-readonly-input-3-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/editing/selection/select-across-readonly-input-3-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/forms/placeholder-position-expected.png index 1d5a823..96dc16af 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/forms/placeholder-position-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/forms/placeholder-position-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/forms/search/search-vertical-alignment-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/forms/search/search-vertical-alignment-expected.png index 4929c6d..582a086 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/forms/search/search-vertical-alignment-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/forms/search/search-vertical-alignment-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/forms/text/text-font-height-mismatch-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/forms/text/text-font-height-mismatch-expected.png index 8110ea6..89f675e 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/forms/text/text-font-height-mismatch-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/forms/text/text-font-height-mismatch-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/frames/iframe-scaling-with-scroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/frames/iframe-scaling-with-scroll-expected.png index 25ff661..968ddaf1 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/frames/iframe-scaling-with-scroll-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/frames/iframe-scaling-with-scroll-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/overflow/overflow-update-transform-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/overflow/overflow-update-transform-expected.png index 99fb1de..3d3810e 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/overflow/overflow-update-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/overflow/overflow-update-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/table/table-display-types-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/table/table-display-types-vertical-expected.png index 96941e3..8ee6076 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/table/table-display-types-vertical-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/table/table-display-types-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/text/international/mixed-directionality-selection-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/text/international/mixed-directionality-selection-expected.png index 4e848dc8..e6d7960 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/text/international/mixed-directionality-selection-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/text/international/mixed-directionality-selection-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/transforms/transformed-focused-text-input-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/transforms/transformed-focused-text-input-expected.png index d6eac64..869d5e6 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/transforms/transformed-focused-text-input-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/transforms/transformed-focused-text-input-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/svg/text/text-selection-path-01-b-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/svg/text/text-selection-path-01-b-expected.png index c5e9e163..2cc26c54 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/svg/text/text-selection-path-01-b-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/svg/text/text-selection-path-01-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/svg/transforms/text-with-pattern-inside-transformed-html-expected.png index b44629c..622cf7b3 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/svg/transforms/text-with-pattern-inside-transformed-html-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/svg/transforms/text-with-pattern-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png deleted file mode 100644 index 9d5592a..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-composite-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-composite-expected.txt index 4f8a150..ad02e67 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-composite-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-composite-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 61: Error: Invalid value for <feComposite> attribute y="20\"" +CONSOLE ERROR: line 61: Error: <feComposite> attribute y: Expected length, "20\"". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-composite-hw-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-composite-hw-expected.txt index 4f8a150..ad02e67 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-composite-hw-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-composite-hw-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 61: Error: Invalid value for <feComposite> attribute y="20\"" +CONSOLE ERROR: line 61: Error: <feComposite> attribute y: Expected length, "20\"". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-image-outset-split-inline-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-image-outset-split-inline-expected.png index 745d283..a3f1b1d 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-image-outset-split-inline-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-image-outset-split-inline-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-radius-percent-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-radius-percent-expected.png index a49477d..0411a5d 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-radius-percent-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-radius-percent-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png index 9d5592a..3645861a 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/css/resize-corner-tracking-transformed-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/css/resize-corner-tracking-transformed-expected.png index 7765728..b2e1ab16 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/css/resize-corner-tracking-transformed-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/css/resize-corner-tracking-transformed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/text/textfield-overflow-by-value-update-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/text/textfield-overflow-by-value-update-expected.txt index 3584f87a..551106e 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/text/textfield-overflow-by-value-update-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/text/textfield-overflow-by-value-update-expected.txt
@@ -3,10 +3,10 @@ layer at (0,0) size 800x34 LayoutBlockFlow {HTML} at (0,0) size 800x34 LayoutBlockFlow {BODY} at (8,8) size 784x18 - LayoutTextControl {INPUT} at (0,2) size 100x0 [bgcolor=#FFFFFF] + LayoutTextControl {INPUT} at (0,1) size 102x2 [bgcolor=#FFFFFF] LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 -layer at (8,-9) size 100x38 backgroundClip at (8,0) size 100x29 clip at (8,0) size 100x29 - LayoutBlockFlow {DIV} at (0,-19) size 100x38 +layer at (9,-9) size 100x38 backgroundClip at (9,0) size 100x29 clip at (9,0) size 100x29 + LayoutBlockFlow {DIV} at (1,-18) size 100x38 LayoutText {#text} at (0,0) size 65x38 text run at (0,0) width 65: "FAIL"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/frames/iframe-scaling-with-scroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/frames/iframe-scaling-with-scroll-expected.png index d952db7..0091e8c9 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/frames/iframe-scaling-with-scroll-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/frames/iframe-scaling-with-scroll-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/overflow/overflow-update-transform-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/overflow/overflow-update-transform-expected.png index 244451a..b69c5fa 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/overflow/overflow-update-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/overflow/overflow-update-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/replaced/selection-rect-transform-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/replaced/selection-rect-transform-expected.png index 36f36c1..1cc999e 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/replaced/selection-rect-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/replaced/selection-rect-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/table/table-display-types-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/table/table-display-types-expected.png index a6578c0..6b0db917 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/table/table-display-types-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/table/table-display-types-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/table/table-display-types-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/table/table-display-types-expected.txt index e926279c..b1595db 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/table/table-display-types-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/table/table-display-types-expected.txt
@@ -3,147 +3,135 @@ layer at (0,0) size 800x600 LayoutBlockFlow {HTML} at (0,0) size 800x600 LayoutBlockFlow {BODY} at (8,10) size 784x582 - LayoutTable {TABLE} at (10,0) size 120x92 [border: (1px solid #000000)] - LayoutTableSection {THEAD} at (1,1) size 118x24 - LayoutTableRow {TR} at (0,2) size 118x20 - LayoutTableCell {TD} at (2,2) size 56x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 46x18 - text run at (1,1) width 46: "Head 1" - LayoutTableCell {TD} at (60,2) size 56x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 46x18 - text run at (1,1) width 46: "Head 2" - LayoutTableSection {TFOOT} at (1,69) size 118x22 - LayoutTableRow {TR} at (0,0) size 118x20 - LayoutTableCell {TD} at (2,0) size 56x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 54x18 - text run at (1,1) width 54: "Footer 1" - LayoutTableCell {TD} at (60,0) size 56x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 54x18 - text run at (1,1) width 54: "Footer 2" - LayoutTableSection {TBODY} at (1,25) size 118x44 - LayoutTableRow {TR} at (0,0) size 118x20 - LayoutTableCell {TD} at (2,0) size 56x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x18 - text run at (1,1) width 39: "Cell 1" - LayoutTableCell {TD} at (60,0) size 56x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x18 - text run at (1,1) width 39: "Cell 2" - LayoutTableRow {TR} at (0,22) size 118x20 - LayoutTableCell {TD} at (2,22) size 56x20 [r=1 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x18 - text run at (1,1) width 39: "Cell 3" - LayoutTableCell {TD} at (60,22) size 56x20 [r=1 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x18 - text run at (1,1) width 39: "Cell 4" + LayoutBlockFlow {TABLE} at (10,0) size 764x92 [border: (1px solid #000000)] + LayoutTable (anonymous) at (1,1) size 118x90 + LayoutTableSection {THEAD} at (0,0) size 118x24 + LayoutTableRow {TR} at (0,2) size 118x20 + LayoutTableCell {TD} at (2,2) size 56x20 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 46x18 + text run at (1,1) width 46: "Head 1" + LayoutTableCell {TD} at (60,2) size 56x20 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 46x18 + text run at (1,1) width 46: "Head 2" + LayoutTableSection {TFOOT} at (0,68) size 118x22 + LayoutTableRow {TR} at (0,0) size 118x20 + LayoutTableCell {TD} at (2,0) size 56x20 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 54x18 + text run at (1,1) width 54: "Footer 1" + LayoutTableCell {TD} at (60,0) size 56x20 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 54x18 + text run at (1,1) width 54: "Footer 2" + LayoutTableSection {TBODY} at (0,24) size 118x44 + LayoutTableRow {TR} at (0,0) size 118x20 + LayoutTableCell {TD} at (2,0) size 56x20 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 39x18 + text run at (1,1) width 39: "Cell 1" + LayoutTableCell {TD} at (60,0) size 56x20 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 39x18 + text run at (1,1) width 39: "Cell 2" + LayoutTableRow {TR} at (0,22) size 118x20 + LayoutTableCell {TD} at (2,22) size 56x20 [r=1 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 39x18 + text run at (1,1) width 39: "Cell 3" + LayoutTableCell {TD} at (60,22) size 56x20 [r=1 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 39x18 + text run at (1,1) width 39: "Cell 4" LayoutBlockFlow {P} at (0,108) size 784x18 LayoutText {#text} at (0,0) size 227x18 text run at (0,0) width 227: "Row groups have display:table-cell" - LayoutTable {TABLE} at (10,142) size 236x60 [border: (1px solid #000000)] - LayoutTableSection (anonymous) at (1,1) size 234x32 - LayoutTableRow (anonymous) at (0,2) size 234x28 - LayoutTableCell {THEAD} at (2,2) size 106x28 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 106x28 - LayoutTableSection (anonymous) at (0,0) size 106x28 - LayoutTableRow (anonymous) at (0,2) size 106x24 - LayoutTableCell {TR} at (2,2) size 102x24 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 102x24 - LayoutTableSection (anonymous) at (0,0) size 102x24 - LayoutTableRow (anonymous) at (0,2) size 102x20 - LayoutTableCell {TD} at (2,2) size 48x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 46x18 - text run at (1,1) width 46: "Head 1" - LayoutTableCell {TD} at (52,2) size 48x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 46x18 - text run at (1,1) width 46: "Head 2" - LayoutTableCell {TFOOT} at (110,2) size 122x28 [r=0 c=1 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 122x28 - LayoutTableSection (anonymous) at (0,0) size 122x28 - LayoutTableRow (anonymous) at (0,2) size 122x24 - LayoutTableCell {TR} at (2,2) size 118x24 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 118x24 - LayoutTableSection (anonymous) at (0,0) size 118x24 - LayoutTableRow (anonymous) at (0,2) size 118x20 - LayoutTableCell {TD} at (2,2) size 56x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 54x18 - text run at (1,1) width 54: "Footer 1" - LayoutTableCell {TD} at (60,2) size 56x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 54x18 - text run at (1,1) width 54: "Footer 2" - LayoutTableSection {TBODY} at (1,33) size 234x26 - LayoutTableRow (anonymous) at (0,0) size 234x24 - LayoutTableCell {TR} at (2,0) size 106x24 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 88x24 - LayoutTableSection (anonymous) at (0,0) size 88x24 - LayoutTableRow (anonymous) at (0,2) size 88x20 - LayoutTableCell {TD} at (2,2) size 41x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x18 - text run at (1,1) width 39: "Cell 1" - LayoutTableCell {TD} at (45,2) size 41x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x18 - text run at (1,1) width 39: "Cell 2" - LayoutTableCell {TR} at (110,0) size 122x24 [r=0 c=1 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 88x24 - LayoutTableSection (anonymous) at (0,0) size 88x24 - LayoutTableRow (anonymous) at (0,2) size 88x20 - LayoutTableCell {TD} at (2,2) size 41x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x18 - text run at (1,1) width 39: "Cell 3" - LayoutTableCell {TD} at (45,2) size 41x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x18 - text run at (1,1) width 39: "Cell 4" - LayoutBlockFlow {P} at (0,218) size 784x18 + LayoutBlockFlow {TABLE} at (10,142) size 764x48 [border: (1px solid #000000)] + LayoutTable (anonymous) at (1,1) size 222x46 + LayoutTableSection (anonymous) at (0,0) size 222x26 + LayoutTableRow (anonymous) at (0,2) size 222x22 + LayoutTableCell {THEAD} at (2,2) size 100x22 [r=0 c=0 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 100x22 + LayoutTableSection (anonymous) at (0,0) size 100x22 + LayoutTableRow (anonymous) at (0,2) size 100x18 + LayoutTableCell {TR} at (2,2) size 96x18 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 48x20 + LayoutText {#text} at (1,0) size 46x18 + text run at (1,0) width 46: "Head 1" + LayoutInline {TD} at (0,0) size 49x20 + LayoutText {#text} at (48,0) size 47x18 + text run at (48,0) width 47: "Head 2" + LayoutTableCell {TFOOT} at (104,2) size 116x22 [r=0 c=1 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 116x22 + LayoutTableSection (anonymous) at (0,0) size 116x22 + LayoutTableRow (anonymous) at (0,2) size 116x18 + LayoutTableCell {TR} at (2,2) size 112x18 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 56x20 + LayoutText {#text} at (1,0) size 54x18 + text run at (1,0) width 54: "Footer 1" + LayoutInline {TD} at (0,0) size 57x20 + LayoutText {#text} at (56,0) size 55x18 + text run at (56,0) width 55: "Footer 2" + LayoutTableSection {TBODY} at (0,26) size 222x20 + LayoutTableRow (anonymous) at (0,0) size 222x18 + LayoutTableCell {TR} at (2,0) size 100x18 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 41x20 + LayoutText {#text} at (1,0) size 39x18 + text run at (1,0) width 39: "Cell 1" + LayoutInline {TD} at (0,0) size 42x20 + LayoutText {#text} at (41,0) size 40x18 + text run at (41,0) width 40: "Cell 2" + LayoutTableCell {TR} at (104,0) size 116x18 [r=0 c=1 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 41x20 + LayoutText {#text} at (1,0) size 39x18 + text run at (1,0) width 39: "Cell 3" + LayoutInline {TD} at (0,0) size 42x20 + LayoutText {#text} at (41,0) size 40x18 + text run at (41,0) width 40: "Cell 4" + LayoutBlockFlow {P} at (0,206) size 784x18 LayoutText {#text} at (0,0) size 203x18 text run at (0,0) width 203: "Row groups have display:block" - LayoutTable {TABLE} at (10,252) size 124x104 [border: (1px solid #000000)] - LayoutTableSection (anonymous) at (1,1) size 122x52 - LayoutTableRow (anonymous) at (0,2) size 122x48 - LayoutTableCell (anonymous) at (2,2) size 118x48 [r=0 c=0 rs=1 cs=1] - LayoutBlockFlow {THEAD} at (0,0) size 118x24 - LayoutBlockFlow {TR} at (0,0) size 118x24 - LayoutTable (anonymous) at (0,0) size 102x24 - LayoutTableSection (anonymous) at (0,0) size 102x24 - LayoutTableRow (anonymous) at (0,2) size 102x20 - LayoutTableCell {TD} at (2,2) size 48x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 46x18 - text run at (1,1) width 46: "Head 1" - LayoutTableCell {TD} at (52,2) size 48x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 46x18 - text run at (1,1) width 46: "Head 2" - LayoutBlockFlow {TFOOT} at (0,24) size 118x24 - LayoutBlockFlow {TR} at (0,0) size 118x24 - LayoutTable (anonymous) at (0,0) size 118x24 - LayoutTableSection (anonymous) at (0,0) size 118x24 - LayoutTableRow (anonymous) at (0,2) size 118x20 - LayoutTableCell {TD} at (2,2) size 56x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 54x18 - text run at (1,1) width 54: "Footer 1" - LayoutTableCell {TD} at (60,2) size 56x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 54x18 - text run at (1,1) width 54: "Footer 2" - LayoutTableSection {TBODY} at (1,53) size 122x50 - LayoutTableRow (anonymous) at (0,0) size 122x48 - LayoutTableCell (anonymous) at (2,0) size 118x48 [r=0 c=0 rs=1 cs=1] - LayoutBlockFlow {TR} at (0,0) size 118x24 - LayoutTable (anonymous) at (0,0) size 88x24 - LayoutTableSection (anonymous) at (0,0) size 88x24 - LayoutTableRow (anonymous) at (0,2) size 88x20 - LayoutTableCell {TD} at (2,2) size 41x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x18 - text run at (1,1) width 39: "Cell 1" - LayoutTableCell {TD} at (45,2) size 41x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x18 - text run at (1,1) width 39: "Cell 2" - LayoutBlockFlow {TR} at (0,24) size 118x24 - LayoutTable (anonymous) at (0,0) size 88x24 - LayoutTableSection (anonymous) at (0,0) size 88x24 - LayoutTableRow (anonymous) at (0,2) size 88x20 - LayoutTableCell {TD} at (2,2) size 41x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x18 - text run at (1,1) width 39: "Cell 3" - LayoutTableCell {TD} at (45,2) size 41x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x18 - text run at (1,1) width 39: "Cell 4" - LayoutTable (anonymous) at (0,366) size 302x200 + LayoutBlockFlow {TABLE} at (10,240) size 764x102 [border: (1px solid #000000)] + LayoutBlockFlow {THEAD} at (1,1) size 762x24 + LayoutBlockFlow {TR} at (0,0) size 762x24 + LayoutTable (anonymous) at (0,0) size 102x24 + LayoutTableSection (anonymous) at (0,0) size 102x24 + LayoutTableRow (anonymous) at (0,2) size 102x20 + LayoutTableCell {TD} at (2,2) size 48x20 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 46x18 + text run at (1,1) width 46: "Head 1" + LayoutTableCell {TD} at (52,2) size 48x20 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 46x18 + text run at (1,1) width 46: "Head 2" + LayoutBlockFlow {TFOOT} at (1,25) size 762x24 + LayoutBlockFlow {TR} at (0,0) size 762x24 + LayoutTable (anonymous) at (0,0) size 118x24 + LayoutTableSection (anonymous) at (0,0) size 118x24 + LayoutTableRow (anonymous) at (0,2) size 118x20 + LayoutTableCell {TD} at (2,2) size 56x20 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 54x18 + text run at (1,1) width 54: "Footer 1" + LayoutTableCell {TD} at (60,2) size 56x20 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 54x18 + text run at (1,1) width 54: "Footer 2" + LayoutTable (anonymous) at (1,49) size 92x52 + LayoutTableSection {TBODY} at (0,0) size 92x52 + LayoutTableRow (anonymous) at (0,2) size 92x48 + LayoutTableCell (anonymous) at (2,2) size 88x48 [r=0 c=0 rs=1 cs=1] + LayoutBlockFlow {TR} at (0,0) size 88x24 + LayoutTable (anonymous) at (0,0) size 88x24 + LayoutTableSection (anonymous) at (0,0) size 88x24 + LayoutTableRow (anonymous) at (0,2) size 88x20 + LayoutTableCell {TD} at (2,2) size 41x20 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 39x18 + text run at (1,1) width 39: "Cell 1" + LayoutTableCell {TD} at (45,2) size 41x20 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 39x18 + text run at (1,1) width 39: "Cell 2" + LayoutBlockFlow {TR} at (0,24) size 88x24 + LayoutTable (anonymous) at (0,0) size 88x24 + LayoutTableSection (anonymous) at (0,0) size 88x24 + LayoutTableRow (anonymous) at (0,2) size 88x20 + LayoutTableCell {TD} at (2,2) size 41x20 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 39x18 + text run at (1,1) width 39: "Cell 3" + LayoutTableCell {TD} at (45,2) size 41x20 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 39x18 + text run at (1,1) width 39: "Cell 4" + LayoutTable (anonymous) at (0,352) size 302x200 LayoutTableSection (anonymous) at (0,0) size 302x200 LayoutTableRow (anonymous) at (0,0) size 302x200 LayoutTableCell {P} at (0,0) size 302x200 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1]
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/table/table-display-types-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/table/table-display-types-vertical-expected.png index 60f1e4f..3542e4f 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/table/table-display-types-vertical-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/table/table-display-types-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/table/table-display-types-vertical-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/table/table-display-types-vertical-expected.txt index d157222..adff366b 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/table/table-display-types-vertical-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/table/table-display-types-vertical-expected.txt
@@ -1,149 +1,137 @@ -layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 1240 +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 1224 LayoutView at (0,0) size 800x600 -layer at (0,0) size 785x1240 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 - LayoutBlockFlow {HTML} at (0,0) size 785x1240 - LayoutBlockFlow {BODY} at (8,10) size 769x1222 - LayoutTable {TABLE} at (10,0) size 92x120 [border: (1px solid #000000)] - LayoutTableSection {THEAD} at (1,1) size 24x118 - LayoutTableRow {TR} at (0,2) size 20x118 - LayoutTableCell {TD} at (2,2) size 20x56 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x46 - text run at (1,1) width 46: "Head 1" - LayoutTableCell {TD} at (2,60) size 20x56 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x46 - text run at (1,1) width 46: "Head 2" - LayoutTableSection {TFOOT} at (69,1) size 22x118 - LayoutTableRow {TR} at (0,0) size 20x118 - LayoutTableCell {TD} at (0,2) size 20x56 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x54 - text run at (1,1) width 54: "Footer 1" - LayoutTableCell {TD} at (0,60) size 20x56 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x54 - text run at (1,1) width 54: "Footer 2" - LayoutTableSection {TBODY} at (25,1) size 44x118 - LayoutTableRow {TR} at (0,0) size 20x118 - LayoutTableCell {TD} at (0,2) size 20x56 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x39 - text run at (1,1) width 39: "Cell 1" - LayoutTableCell {TD} at (0,60) size 20x56 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x39 - text run at (1,1) width 39: "Cell 2" - LayoutTableRow {TR} at (0,22) size 20x118 - LayoutTableCell {TD} at (22,2) size 20x56 [r=1 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x39 - text run at (1,1) width 39: "Cell 3" - LayoutTableCell {TD} at (22,60) size 20x56 [r=1 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x39 - text run at (1,1) width 39: "Cell 4" +layer at (0,0) size 785x1224 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow {HTML} at (0,0) size 785x1224 + LayoutBlockFlow {BODY} at (8,10) size 769x1206 + LayoutBlockFlow {TABLE} at (10,0) size 92x120 [border: (1px solid #000000)] + LayoutTable (anonymous) at (1,1) size 90x118 + LayoutTableSection {THEAD} at (0,0) size 24x118 + LayoutTableRow {TR} at (0,2) size 20x118 + LayoutTableCell {TD} at (2,2) size 20x56 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 18x46 + text run at (1,1) width 46: "Head 1" + LayoutTableCell {TD} at (2,60) size 20x56 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 18x46 + text run at (1,1) width 46: "Head 2" + LayoutTableSection {TFOOT} at (68,0) size 22x118 + LayoutTableRow {TR} at (0,0) size 20x118 + LayoutTableCell {TD} at (0,2) size 20x56 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 18x54 + text run at (1,1) width 54: "Footer 1" + LayoutTableCell {TD} at (0,60) size 20x56 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 18x54 + text run at (1,1) width 54: "Footer 2" + LayoutTableSection {TBODY} at (24,0) size 44x118 + LayoutTableRow {TR} at (0,0) size 20x118 + LayoutTableCell {TD} at (0,2) size 20x56 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 18x39 + text run at (1,1) width 39: "Cell 1" + LayoutTableCell {TD} at (0,60) size 20x56 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 18x39 + text run at (1,1) width 39: "Cell 2" + LayoutTableRow {TR} at (0,22) size 20x118 + LayoutTableCell {TD} at (22,2) size 20x56 [r=1 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 18x39 + text run at (1,1) width 39: "Cell 3" + LayoutTableCell {TD} at (22,60) size 20x56 [r=1 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 18x39 + text run at (1,1) width 39: "Cell 4" LayoutBlockFlow {P} at (0,136) size 769x18 LayoutText {#text} at (0,0) size 227x18 text run at (0,0) width 227: "Row groups have display:table-cell" - LayoutTable {TABLE} at (10,170) size 60x236 [border: (1px solid #000000)] - LayoutTableSection (anonymous) at (1,1) size 32x234 - LayoutTableRow (anonymous) at (0,2) size 28x234 - LayoutTableCell {THEAD} at (2,2) size 28x106 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 28x106 - LayoutTableSection (anonymous) at (0,0) size 28x106 - LayoutTableRow (anonymous) at (0,2) size 24x106 - LayoutTableCell {TR} at (2,2) size 24x102 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 24x102 - LayoutTableSection (anonymous) at (0,0) size 24x102 - LayoutTableRow (anonymous) at (0,2) size 20x102 - LayoutTableCell {TD} at (2,2) size 20x48 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x46 - text run at (1,1) width 46: "Head 1" - LayoutTableCell {TD} at (2,52) size 20x48 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x46 - text run at (1,1) width 46: "Head 2" - LayoutTableCell {TFOOT} at (2,110) size 28x122 [r=0 c=1 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 28x122 - LayoutTableSection (anonymous) at (0,0) size 28x122 - LayoutTableRow (anonymous) at (0,2) size 24x122 - LayoutTableCell {TR} at (2,2) size 24x118 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 24x118 - LayoutTableSection (anonymous) at (0,0) size 24x118 - LayoutTableRow (anonymous) at (0,2) size 20x118 - LayoutTableCell {TD} at (2,2) size 20x56 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x54 - text run at (1,1) width 54: "Footer 1" - LayoutTableCell {TD} at (2,60) size 20x56 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x54 - text run at (1,1) width 54: "Footer 2" - LayoutTableSection {TBODY} at (33,1) size 26x234 - LayoutTableRow (anonymous) at (0,0) size 24x234 - LayoutTableCell {TR} at (0,2) size 24x106 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 24x88 - LayoutTableSection (anonymous) at (0,0) size 24x88 - LayoutTableRow (anonymous) at (0,2) size 20x88 - LayoutTableCell {TD} at (2,2) size 20x41 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x39 - text run at (1,1) width 39: "Cell 1" - LayoutTableCell {TD} at (2,45) size 20x41 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x39 - text run at (1,1) width 39: "Cell 2" - LayoutTableCell {TR} at (0,110) size 24x122 [r=0 c=1 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 24x88 - LayoutTableSection (anonymous) at (0,0) size 24x88 - LayoutTableRow (anonymous) at (0,2) size 20x88 - LayoutTableCell {TD} at (2,2) size 20x41 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x39 - text run at (1,1) width 39: "Cell 3" - LayoutTableCell {TD} at (2,45) size 20x41 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x39 - text run at (1,1) width 39: "Cell 4" - LayoutBlockFlow {P} at (0,422) size 769x18 + LayoutBlockFlow {TABLE} at (10,170) size 48x224 [border: (1px solid #000000)] + LayoutTable (anonymous) at (1,1) size 46x222 + LayoutTableSection (anonymous) at (0,0) size 26x222 + LayoutTableRow (anonymous) at (0,2) size 22x222 + LayoutTableCell {THEAD} at (2,2) size 22x100 [r=0 c=0 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 22x100 + LayoutTableSection (anonymous) at (0,0) size 22x100 + LayoutTableRow (anonymous) at (0,2) size 18x100 + LayoutTableCell {TR} at (2,2) size 18x96 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 20x48 + LayoutText {#text} at (0,1) size 18x46 + text run at (0,1) width 46: "Head 1" + LayoutInline {TD} at (0,0) size 20x49 + LayoutText {#text} at (0,48) size 18x47 + text run at (0,48) width 46: "Head 2" + LayoutTableCell {TFOOT} at (2,104) size 22x116 [r=0 c=1 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 22x116 + LayoutTableSection (anonymous) at (0,0) size 22x116 + LayoutTableRow (anonymous) at (0,2) size 18x116 + LayoutTableCell {TR} at (2,2) size 18x112 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 20x56 + LayoutText {#text} at (0,1) size 18x54 + text run at (0,1) width 54: "Footer 1" + LayoutInline {TD} at (0,0) size 20x57 + LayoutText {#text} at (0,56) size 18x55 + text run at (0,56) width 54: "Footer 2" + LayoutTableSection {TBODY} at (26,0) size 20x222 + LayoutTableRow (anonymous) at (0,0) size 18x222 + LayoutTableCell {TR} at (0,2) size 18x100 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 20x41 + LayoutText {#text} at (0,1) size 18x39 + text run at (0,1) width 39: "Cell 1" + LayoutInline {TD} at (0,0) size 20x42 + LayoutText {#text} at (0,41) size 18x40 + text run at (0,41) width 39: "Cell 2" + LayoutTableCell {TR} at (0,104) size 18x116 [r=0 c=1 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 20x41 + LayoutText {#text} at (0,1) size 18x39 + text run at (0,1) width 39: "Cell 3" + LayoutInline {TD} at (0,0) size 20x42 + LayoutText {#text} at (0,41) size 18x40 + text run at (0,41) width 39: "Cell 4" + LayoutBlockFlow {P} at (0,410) size 769x18 LayoutText {#text} at (0,0) size 203x18 text run at (0,0) width 203: "Row groups have display:block" - LayoutTable {TABLE} at (10,456) size 104x124 [border: (1px solid #000000)] - LayoutTableSection (anonymous) at (1,1) size 52x122 - LayoutTableRow (anonymous) at (0,2) size 48x122 - LayoutTableCell (anonymous) at (2,2) size 48x118 [r=0 c=0 rs=1 cs=1] - LayoutBlockFlow {THEAD} at (0,0) size 24x118 - LayoutBlockFlow {TR} at (0,0) size 24x118 - LayoutTable (anonymous) at (0,0) size 24x102 - LayoutTableSection (anonymous) at (0,0) size 24x102 - LayoutTableRow (anonymous) at (0,2) size 20x102 - LayoutTableCell {TD} at (2,2) size 20x48 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x46 - text run at (1,1) width 46: "Head 1" - LayoutTableCell {TD} at (2,52) size 20x48 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x46 - text run at (1,1) width 46: "Head 2" - LayoutBlockFlow {TFOOT} at (24,0) size 24x118 - LayoutBlockFlow {TR} at (0,0) size 24x118 - LayoutTable (anonymous) at (0,0) size 24x118 - LayoutTableSection (anonymous) at (0,0) size 24x118 - LayoutTableRow (anonymous) at (0,2) size 20x118 - LayoutTableCell {TD} at (2,2) size 20x56 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x54 - text run at (1,1) width 54: "Footer 1" - LayoutTableCell {TD} at (2,60) size 20x56 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x54 - text run at (1,1) width 54: "Footer 2" - LayoutTableSection {TBODY} at (53,1) size 50x122 - LayoutTableRow (anonymous) at (0,0) size 48x122 - LayoutTableCell (anonymous) at (0,2) size 48x118 [r=0 c=0 rs=1 cs=1] - LayoutBlockFlow {TR} at (0,0) size 24x118 - LayoutTable (anonymous) at (0,0) size 24x88 - LayoutTableSection (anonymous) at (0,0) size 24x88 - LayoutTableRow (anonymous) at (0,2) size 20x88 - LayoutTableCell {TD} at (2,2) size 20x41 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x39 - text run at (1,1) width 39: "Cell 1" - LayoutTableCell {TD} at (2,45) size 20x41 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x39 - text run at (1,1) width 39: "Cell 2" - LayoutBlockFlow {TR} at (24,0) size 24x118 - LayoutTable (anonymous) at (0,0) size 24x88 - LayoutTableSection (anonymous) at (0,0) size 24x88 - LayoutTableRow (anonymous) at (0,2) size 20x88 - LayoutTableCell {TD} at (2,2) size 20x41 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x39 - text run at (1,1) width 39: "Cell 3" - LayoutTableCell {TD} at (2,45) size 20x41 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 18x39 - text run at (1,1) width 39: "Cell 4" - LayoutTable (anonymous) at (0,590) size 102x632 + LayoutBlockFlow {TABLE} at (10,444) size 102x120 [border: (1px solid #000000)] + LayoutBlockFlow {THEAD} at (1,1) size 24x118 + LayoutBlockFlow {TR} at (0,0) size 24x118 + LayoutTable (anonymous) at (0,0) size 24x102 + LayoutTableSection (anonymous) at (0,0) size 24x102 + LayoutTableRow (anonymous) at (0,2) size 20x102 + LayoutTableCell {TD} at (2,2) size 20x48 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 18x46 + text run at (1,1) width 46: "Head 1" + LayoutTableCell {TD} at (2,52) size 20x48 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 18x46 + text run at (1,1) width 46: "Head 2" + LayoutBlockFlow {TFOOT} at (25,1) size 24x118 + LayoutBlockFlow {TR} at (0,0) size 24x118 + LayoutTable (anonymous) at (0,0) size 24x118 + LayoutTableSection (anonymous) at (0,0) size 24x118 + LayoutTableRow (anonymous) at (0,2) size 20x118 + LayoutTableCell {TD} at (2,2) size 20x56 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 18x54 + text run at (1,1) width 54: "Footer 1" + LayoutTableCell {TD} at (2,60) size 20x56 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 18x54 + text run at (1,1) width 54: "Footer 2" + LayoutTable (anonymous) at (49,1) size 52x92 + LayoutTableSection {TBODY} at (0,0) size 52x92 + LayoutTableRow (anonymous) at (0,2) size 48x92 + LayoutTableCell (anonymous) at (2,2) size 48x88 [r=0 c=0 rs=1 cs=1] + LayoutBlockFlow {TR} at (0,0) size 24x88 + LayoutTable (anonymous) at (0,0) size 24x88 + LayoutTableSection (anonymous) at (0,0) size 24x88 + LayoutTableRow (anonymous) at (0,2) size 20x88 + LayoutTableCell {TD} at (2,2) size 20x41 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 18x39 + text run at (1,1) width 39: "Cell 1" + LayoutTableCell {TD} at (2,45) size 20x41 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 18x39 + text run at (1,1) width 39: "Cell 2" + LayoutBlockFlow {TR} at (24,0) size 24x88 + LayoutTable (anonymous) at (0,0) size 24x88 + LayoutTableSection (anonymous) at (0,0) size 24x88 + LayoutTableRow (anonymous) at (0,2) size 20x88 + LayoutTableCell {TD} at (2,2) size 20x41 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 18x39 + text run at (1,1) width 39: "Cell 3" + LayoutTableCell {TD} at (2,45) size 20x41 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 18x39 + text run at (1,1) width 39: "Cell 4" + LayoutTable (anonymous) at (0,574) size 102x632 LayoutTableSection (anonymous) at (0,0) size 102x632 LayoutTableRow (anonymous) at (0,0) size 102x632 LayoutTableCell {P} at (0,0) size 102x632 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1]
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/transforms/transformed-focused-text-input-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/transforms/transformed-focused-text-input-expected.png index c1f1a0e..5cf3f15 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/transforms/transformed-focused-text-input-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/transforms/transformed-focused-text-input-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/writing-mode/border-image-vertical-lr-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/writing-mode/border-image-vertical-lr-expected.png index ebf2297..f4d1062 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/writing-mode/border-image-vertical-lr-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/writing-mode/border-image-vertical-lr-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/writing-mode/border-image-vertical-rl-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/writing-mode/border-image-vertical-rl-expected.png index a87e9a7a..452e2c3e 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/writing-mode/border-image-vertical-rl-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/writing-mode/border-image-vertical-rl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt new file mode 100644 index 0000000..087e3c5e --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt
@@ -0,0 +1,86 @@ +zh-CN: 誤過骨 +#zh-CN: +"Times" : 7, +"Songti SC" : 3 + +zh-TW: 誤過骨 +#zh-TW: +"Times" : 7, +"Songti SC" : 3 + +zh-HK: 誤過骨 +#zh-HK: +"Times" : 7, +"Songti SC" : 3 + +ja: 誤過骨 +#ja: +"Times" : 4, +"Songti SC" : 3 + +ja-JP: 誤過骨 +#ja-JP: +"Times" : 7, +"Songti SC" : 3 + +ko: 誤過骨 +#ko: +"Times" : 4, +"Songti SC" : 3 + +ko-KR: 誤過骨 +#ko-KR: +"Times" : 7, +"Songti SC" : 3 + +en-CN: 誤過骨 +#en-CN: +"Times" : 7, +"Songti SC" : 3 + +en-JP: 誤過骨 +#en-JP: +"Times" : 7, +"Songti SC" : 3 + +en-KR: 誤過骨 +#en-KR: +"Times" : 7, +"Songti SC" : 3 + +en-HK: 誤過骨 +#en-HK: +"Times" : 7, +"Songti SC" : 3 + +en-TW: 誤過骨 +#en-TW: +"Times" : 7, +"Songti SC" : 3 + +en-HanS: 誤過骨 +#en-HanS: +"Times" : 9, +"Songti SC" : 3 + +en-HanT: 誤過骨 +#en-HanT: +"Times" : 9, +"Songti SC" : 3 + +en-HanS-JP: 誤過骨 +#en-HanS-JP: +"Times" : 12, +"Songti SC" : 3 + +en-HanT-JP: 誤過骨 +#en-HanT-JP: +"Times" : 12, +"Songti SC" : 3 + +en-US: 誤過骨 +#en-US: +"Times" : 7, +"Songti SC" : 3 + +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/media/audio-repaint-expected.png b/third_party/WebKit/LayoutTests/platform/mac/media/audio-repaint-expected.png index 2b775e5d..1a89397e 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/media/audio-repaint-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/media/audio-repaint-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/invalidate-box-shadow-currentColor-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/invalidate-box-shadow-currentColor-expected.txt new file mode 100644 index 0000000..5265000 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/invalidate-box-shadow-currentColor-expected.txt
@@ -0,0 +1,21 @@ +{ + "bounds": [800, 600], + "children": [ + { + "bounds": [800, 600], + "contentsOpaque": true, + "drawsContent": true, + "repaintRects": [ + [8, 8, 29, 23], + [8, 8, 29, 18] + ], + "paintInvalidationClients": [ + "LayoutInline SPAN id='target'", + "InlineFlowBox", + "LayoutText #text", + "InlineTextBox 'Text'" + ] + } + ] +} +
diff --git a/third_party/WebKit/LayoutTests/platform/mac/printing/ellipsis-printing-style-expected.png b/third_party/WebKit/LayoutTests/platform/mac/printing/ellipsis-printing-style-expected.png new file mode 100644 index 0000000..8501bb75 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/printing/ellipsis-printing-style-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/printing/iframe-print-expected.png b/third_party/WebKit/LayoutTests/platform/mac/printing/iframe-print-expected.png index 639fabb6..c0919334 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/printing/iframe-print-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/printing/iframe-print-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png index 1fe11a0..c03961d 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/coords-units-01-b-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/coords-units-01-b-expected.png index 6e11829..7d6ed83 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/coords-units-01-b-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/coords-units-01-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/text-align-04-b-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/text-align-04-b-expected.txt index 4a9c0e20..ad5fae5 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/text-align-04-b-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/text-align-04-b-expected.txt
@@ -38,7 +38,7 @@ chunk 1 (end anchor) text run 4 at (46.54,260.00) startOffset 15 endOffset 16 width 16.68: "d" chunk 1 (end anchor) text run 5 at (59.05,260.00) startOffset 16 endOffset 17 width 8.33: " " chunk 1 (end anchor) text run 6 at (67.39,260.00) startOffset 17 endOffset 18 width 8.33: "t" - chunk 1 (end anchor) text run 7 at (79.89,260.00) startOffset 18 endOffset 19 width 16.68: "e" + chunk 1 (end anchor) text run 7 at (79.90,260.00) startOffset 18 endOffset 19 width 16.68: "e" chunk 1 (end anchor) text run 8 at (95.74,260.00) startOffset 19 endOffset 20 width 15.00: "x" chunk 1 (end anchor) text run 9 at (107.40,260.00) startOffset 20 endOffset 21 width 8.33: "t" chunk 1 (end anchor) text run 10 at (115.74,260.00) startOffset 21 endOffset 22 width 8.33: " "
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/text-path-01-b-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/text-path-01-b-expected.txt index f249d14..d9db99f 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/text-path-01-b-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/text-path-01-b-expected.txt
@@ -14,9 +14,9 @@ LayoutSVGTextPath {textPath} at (0,0) size 205x120 LayoutSVGInlineText {#text} at (0,0) size 205x120 chunk 1 text run 1 at (203.08,78.99) startOffset 0 endOffset 1 width 22.27: "T" - chunk 1 text run 2 at (212.32,61.50) startOffset 1 endOffset 2 width 17.40: "e" - chunk 1 text run 3 at (222.73,46.94) startOffset 2 endOffset 3 width 18.18: "x" - chunk 1 text run 4 at (233.61,36.17) startOffset 3 endOffset 4 width 12.43: "t" + chunk 1 text run 2 at (212.33,61.49) startOffset 1 endOffset 2 width 17.40: "e" + chunk 1 text run 3 at (222.74,46.94) startOffset 2 endOffset 3 width 18.18: "x" + chunk 1 text run 4 at (233.62,36.17) startOffset 3 endOffset 4 width 12.43: "t" chunk 1 text run 5 at (242.47,30.46) startOffset 4 endOffset 5 width 8.68: " " chunk 1 text run 6 at (255.95,26.99) startOffset 5 endOffset 6 width 19.41: "o" chunk 1 text run 7 at (274.98,33.23) startOffset 6 endOffset 7 width 21.27: "n" @@ -35,18 +35,18 @@ LayoutSVGTextPath {textPath} at (0,0) size 216x120 LayoutSVGTSpan {tspan} at (0,0) size 56x58 LayoutSVGInlineText {#text} at (0,36) size 56x58 - chunk 1 text run 1 at (37.54,135.48) startOffset 0 endOffset 1 width 22.27: "T" + chunk 1 text run 1 at (37.54,135.47) startOffset 0 endOffset 1 width 22.27: "T" chunk 1 text run 2 at (46.77,117.97) startOffset 1 endOffset 2 width 17.40: "e" LayoutSVGTSpan {tspan} at (0,0) size 44x42 LayoutSVGInlineText {#text} at (34,24) size 44x41 chunk 1 text run 1 at (57.18,103.42) startOffset 0 endOffset 1 width 18.18: "x" LayoutSVGInlineText {#text} at (50,0) size 166x120 chunk 1 text run 1 at (68.07,92.65) startOffset 0 endOffset 1 width 12.43: "t" - chunk 1 text run 2 at (76.93,86.96) startOffset 1 endOffset 2 width 8.68: " " + chunk 1 text run 2 at (76.93,86.95) startOffset 1 endOffset 2 width 8.68: " " chunk 1 text run 3 at (90.41,83.48) startOffset 2 endOffset 3 width 19.41: "o" chunk 1 text run 4 at (109.45,89.71) startOffset 3 endOffset 4 width 21.27: "n" chunk 1 text run 5 at (120.62,99.55) startOffset 4 endOffset 5 width 8.68: " " - chunk 1 text run 6 at (129.32,109.91) startOffset 5 endOffset 6 width 18.14: "a" + chunk 1 text run 6 at (129.32,109.92) startOffset 5 endOffset 6 width 18.14: "a" chunk 1 text run 7 at (137.43,120.71) startOffset 6 endOffset 7 width 8.68: " " chunk 1 text run 8 at (146.41,132.09) startOffset 7 endOffset 8 width 20.57: "p" chunk 1 text run 9 at (160.55,145.31) startOffset 8 endOffset 9 width 18.14: "a" @@ -63,7 +63,7 @@ LayoutSVGContainer {g} at (113,211) size 300x81 LayoutSVGContainer {use} at (113,231) size 300x4 LayoutSVGPath {path} at (113,231) size 300x4 [stroke={[type=SOLID] [color=#0000FF] [stroke width=4.00]}] [data="M 113 233 L 413 233"] - LayoutSVGText {text} at (211,211) size 180x27 contains 1 chunk(s) + LayoutSVGText {text} at (212,211) size 179x27 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 179x27 LayoutSVGInlineText {#text} at (0,0) size 179x27 chunk 1 text run 1 at (219.33,233.00) startOffset 0 endOffset 1 width 14.66: "T"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/animations/animateMotion-accumulate-1c-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/animations/animateMotion-accumulate-1c-expected.png new file mode 100644 index 0000000..daffd912 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/animations/animateMotion-accumulate-1c-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/longTextOnPath-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/longTextOnPath-expected.png index 879f4a7..7dbe904 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/longTextOnPath-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/longTextOnPath-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/longTextOnPath-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/longTextOnPath-expected.txt index ff1b547..a7d28ec 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/longTextOnPath-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/longTextOnPath-expected.txt
@@ -52,9 +52,9 @@ chunk 1 text run 36 at (307.71,150.00) startOffset 35 endOffset 36 width 5.56: "t" chunk 1 text run 37 at (313.82,150.00) startOffset 36 endOffset 37 width 6.66: "r" chunk 1 text run 38 at (319.93,150.00) startOffset 37 endOffset 38 width 5.56: "i" - chunk 1 text run 39 at (327.70,150.00) startOffset 38 endOffset 39 width 10.00: "n" - chunk 1 text run 40 at (337.70,150.00) startOffset 39 endOffset 40 width 10.00: "g" - chunk 1 text run 41 at (345.20,150.00) startOffset 40 endOffset 41 width 5.00: " " + chunk 1 text run 39 at (327.71,150.00) startOffset 38 endOffset 39 width 10.00: "n" + chunk 1 text run 40 at (337.71,150.00) startOffset 39 endOffset 40 width 10.00: "g" + chunk 1 text run 41 at (345.21,150.00) startOffset 40 endOffset 41 width 5.00: " " chunk 1 text run 42 at (350.48,150.00) startOffset 41 endOffset 42 width 5.56: "t" chunk 1 text run 43 at (358.26,150.00) startOffset 42 endOffset 43 width 10.00: "h" chunk 1 text run 44 at (367.70,150.00) startOffset 43 endOffset 44 width 8.88: "a" @@ -322,7 +322,7 @@ chunk 1 text run 306 at (390.29,250.00) startOffset 305 endOffset 306 width 15.56: "m" chunk 1 text run 307 at (403.07,250.00) startOffset 306 endOffset 307 width 10.00: "o" chunk 1 text run 308 at (411.40,250.00) startOffset 307 endOffset 308 width 6.66: "r" - chunk 1 text run 309 at (419.16,250.00) startOffset 308 endOffset 309 width 8.88: "e" + chunk 1 text run 309 at (419.17,250.00) startOffset 308 endOffset 309 width 8.88: "e" chunk 1 text run 310 at (26.10,270.00) startOffset 309 endOffset 310 width 5.00: " " chunk 1 text run 311 at (31.93,270.00) startOffset 310 endOffset 311 width 6.66: "r" chunk 1 text run 312 at (39.70,270.00) startOffset 311 endOffset 312 width 8.88: "e" @@ -420,7 +420,7 @@ chunk 1 text run 404 at (316.52,290.00) startOffset 403 endOffset 404 width 5.00: " " chunk 1 text run 405 at (324.02,290.00) startOffset 404 endOffset 405 width 10.00: "d" chunk 1 text run 406 at (334.02,290.00) startOffset 405 endOffset 406 width 10.00: "o" - chunk 1 text run 407 at (346.24,290.00) startOffset 406 endOffset 407 width 14.44: "w" + chunk 1 text run 407 at (346.25,290.00) startOffset 406 endOffset 407 width 14.44: "w" chunk 1 text run 408 at (358.47,290.00) startOffset 407 endOffset 408 width 10.00: "n" chunk 1 text run 409 at (365.97,290.00) startOffset 408 endOffset 409 width 5.00: "." chunk 1 text run 410 at (370.97,290.00) startOffset 409 endOffset 410 width 5.00: " " @@ -572,7 +572,7 @@ chunk 1 text run 61 at (335.23,350.00) startOffset 60 endOffset 61 width 8.88: "e" chunk 1 text run 62 at (343.00,350.00) startOffset 61 endOffset 62 width 6.66: "r" chunk 1 text run 63 at (350.77,350.00) startOffset 62 endOffset 63 width 8.88: "e" - chunk 1 text run 64 at (357.70,350.00) startOffset 63 endOffset 64 width 5.00: " " + chunk 1 text run 64 at (357.71,350.00) startOffset 63 endOffset 64 width 5.00: " " chunk 1 text run 65 at (362.98,350.00) startOffset 64 endOffset 65 width 5.56: "i" chunk 1 text run 66 at (369.65,350.00) startOffset 65 endOffset 66 width 7.78: "s" chunk 1 text run 67 at (376.04,350.00) startOffset 66 endOffset 67 width 5.00: " " @@ -622,7 +622,7 @@ chunk 1 text run 32 at (314.04,370.00) startOffset 31 endOffset 32 width 8.88: "e" chunk 1 text run 33 at (320.98,370.00) startOffset 32 endOffset 33 width 5.00: " " chunk 1 text run 34 at (328.48,370.00) startOffset 33 endOffset 34 width 10.00: "n" - chunk 1 text run 35 at (337.91,370.00) startOffset 34 endOffset 35 width 8.88: "e" + chunk 1 text run 35 at (337.92,370.00) startOffset 34 endOffset 35 width 8.88: "e" chunk 1 text run 36 at (346.79,370.00) startOffset 35 endOffset 36 width 8.88: "a" chunk 1 text run 37 at (354.56,370.00) startOffset 36 endOffset 37 width 6.66: "r" chunk 1 text run 38 at (360.39,370.00) startOffset 37 endOffset 38 width 5.00: " " @@ -646,7 +646,7 @@ chunk 1 text run 56 at (87.59,390.00) startOffset 55 endOffset 56 width 6.66: "r" chunk 1 text run 57 at (95.36,390.00) startOffset 56 endOffset 57 width 8.88: "e" chunk 1 text run 58 at (104.79,390.00) startOffset 57 endOffset 58 width 10.00: "d" - chunk 1 text run 59 at (113.12,390.00) startOffset 58 endOffset 59 width 6.66: "r" + chunk 1 text run 59 at (113.13,390.00) startOffset 58 endOffset 59 width 6.66: "r" chunk 1 text run 60 at (120.89,390.00) startOffset 59 endOffset 60 width 8.88: "a" chunk 1 text run 61 at (132.55,390.00) startOffset 60 endOffset 61 width 14.44: "w" chunk 1 text run 62 at (142.28,390.00) startOffset 61 endOffset 62 width 5.00: " "
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath-expected.png index 35c9ed7..dc1790b8 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath-expected.txt index 56969fb..6f129ce0 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath-expected.txt
@@ -22,7 +22,7 @@ chunk 1 text run 5 at (48.36,19.09) startOffset 4 endOffset 5 width 5.00: " " LayoutSVGTSpan {tspan} at (0,0) size 29x29 LayoutSVGInlineText {#text} at (29,0) size 29x29 - chunk 1 text run 1 at (55.17,15.95) startOffset 0 endOffset 1 width 10.00: "o" + chunk 1 text run 1 at (55.17,15.94) startOffset 0 endOffset 1 width 10.00: "o" chunk 1 text run 2 at (64.84,13.36) startOffset 1 endOffset 2 width 10.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 63x43 LayoutSVGInlineText {#text} at (57,9) size 63x43 @@ -52,11 +52,11 @@ LayoutSVGInlineText {#text} at (0,0) size 56x53 chunk 1 (middle anchor) text run 1 at (30.38,44.49) startOffset 0 endOffset 1 width 5.00: " " chunk 1 (middle anchor) text run 2 at (32.03,37.79) startOffset 1 endOffset 2 width 8.88: "a" - chunk 1 (middle anchor) text run 3 at (35.02,31.58) startOffset 2 endOffset 3 width 5.00: " " - chunk 1 (middle anchor) text run 4 at (40.05,25.31) startOffset 3 endOffset 4 width 11.12: "P" + chunk 1 (middle anchor) text run 3 at (35.02,31.57) startOffset 2 endOffset 3 width 5.00: " " + chunk 1 (middle anchor) text run 4 at (40.05,25.30) startOffset 3 endOffset 4 width 11.12: "P" chunk 1 (middle anchor) text run 5 at (48.01,19.29) startOffset 4 endOffset 5 width 8.88: "a" chunk 1 (middle anchor) text run 6 at (54.52,16.19) startOffset 5 endOffset 6 width 5.56: "t" - chunk 1 (middle anchor) text run 7 at (61.97,13.93) startOffset 6 endOffset 7 width 10.00: "h" + chunk 1 (middle anchor) text run 7 at (61.98,13.93) startOffset 6 endOffset 7 width 10.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 70x13 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,0) size 70x13 @@ -76,12 +76,12 @@ LayoutSVGTSpan {tspan} at (0,0) size 62x47 LayoutSVGInlineText {#text} at (12,0) size 61x47 chunk 1 (end anchor) text run 1 at (32.44,36.70) startOffset 0 endOffset 1 width 5.00: " " - chunk 1 (end anchor) text run 2 at (35.65,30.60) startOffset 1 endOffset 2 width 8.88: "a" - chunk 1 (end anchor) text run 3 at (40.07,25.28) startOffset 2 endOffset 3 width 5.00: " " + chunk 1 (end anchor) text run 2 at (35.65,30.59) startOffset 1 endOffset 2 width 8.88: "a" + chunk 1 (end anchor) text run 3 at (40.08,25.28) startOffset 2 endOffset 3 width 5.00: " " chunk 1 (end anchor) text run 4 at (46.38,20.28) startOffset 3 endOffset 4 width 11.12: "P" chunk 1 (end anchor) text run 5 at (55.35,15.88) startOffset 4 endOffset 5 width 8.88: "a" chunk 1 (end anchor) text run 6 at (62.29,13.86) startOffset 5 endOffset 6 width 5.56: "t" - chunk 1 (end anchor) text run 7 at (69.99,12.71) startOffset 6 endOffset 7 width 10.00: "h" + chunk 1 (end anchor) text run 7 at (70.00,12.71) startOffset 6 endOffset 7 width 10.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 75x13 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,0) size 75x13 @@ -97,11 +97,11 @@ LayoutSVGInlineText {#text} at (0,0) size 50x37 chunk 1 text run 1 at (81.11,12.81) startOffset 0 endOffset 1 width 12.22: "T" chunk 1 text run 2 at (90.78,14.63) startOffset 1 endOffset 2 width 7.48: "e" - chunk 1 text run 3 at (98.96,17.69) startOffset 2 endOffset 3 width 10.00: "x" + chunk 1 text run 3 at (98.96,17.70) startOffset 2 endOffset 3 width 10.00: "x" chunk 1 text run 4 at (105.65,21.67) startOffset 3 endOffset 4 width 5.56: "t" chunk 1 text run 5 at (109.71,25.06) startOffset 4 endOffset 5 width 5.00: " " LayoutSVGTSpan {tspan} at (0,0) size 32x33 - LayoutSVGInlineText {#text} at (41,16) size 31x33 + LayoutSVGInlineText {#text} at (41,16) size 32x33 chunk 1 text run 1 at (114.49,30.81) startOffset 0 endOffset 1 width 10.00: "o" chunk 1 text run 2 at (118.64,39.87) startOffset 1 endOffset 2 width 10.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 24x7 @@ -121,13 +121,13 @@ LayoutSVGTextPath {textPath} at (0,0) size 123x60 LayoutSVGInlineText {#text} at (0,13) size 47x46 chunk 1 (middle anchor) text run 1 at (32.70,36.06) startOffset 0 endOffset 1 width 12.22: "T" - chunk 1 (middle anchor) text run 2 at (37.82,27.72) startOffset 1 endOffset 2 width 7.48: "e" + chunk 1 (middle anchor) text run 2 at (37.82,27.71) startOffset 1 endOffset 2 width 7.48: "e" chunk 1 (middle anchor) text run 3 at (44.21,21.77) startOffset 2 endOffset 3 width 10.00: "x" chunk 1 (middle anchor) text run 4 at (50.88,17.77) startOffset 3 endOffset 4 width 5.56: "t" - chunk 1 (middle anchor) text run 5 at (55.73,15.74) startOffset 4 endOffset 5 width 5.00: " " + chunk 1 (middle anchor) text run 5 at (55.74,15.74) startOffset 4 endOffset 5 width 5.00: " " LayoutSVGTSpan {tspan} at (0,0) size 26x26 LayoutSVGInlineText {#text} at (38,0) size 26x26 - chunk 1 (middle anchor) text run 1 at (62.96,13.72) startOffset 0 endOffset 1 width 10.00: "o" + chunk 1 (middle anchor) text run 1 at (62.97,13.72) startOffset 0 endOffset 1 width 10.00: "o" chunk 1 (middle anchor) text run 2 at (72.90,12.54) startOffset 1 endOffset 2 width 10.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 60x50 LayoutSVGInlineText {#text} at (63,10) size 59x49 @@ -152,18 +152,18 @@ LayoutSVGTextPath {textPath} at (0,0) size 120x67 LayoutSVGInlineText {#text} at (0,11) size 49x42 chunk 1 (end anchor) text run 1 at (36.73,29.08) startOffset 0 endOffset 1 width 12.22: "T" - chunk 1 (end anchor) text run 2 at (43.69,22.15) startOffset 1 endOffset 2 width 7.48: "e" + chunk 1 (end anchor) text run 2 at (43.70,22.15) startOffset 1 endOffset 2 width 7.48: "e" chunk 1 (end anchor) text run 3 at (51.17,17.63) startOffset 2 endOffset 3 width 10.00: "x" chunk 1 (end anchor) text run 4 at (58.44,14.85) startOffset 3 endOffset 4 width 5.56: "t" - chunk 1 (end anchor) text run 5 at (63.55,13.60) startOffset 4 endOffset 5 width 5.00: " " + chunk 1 (end anchor) text run 5 at (63.56,13.60) startOffset 4 endOffset 5 width 5.00: " " LayoutSVGTSpan {tspan} at (0,0) size 26x24 LayoutSVGInlineText {#text} at (45,0) size 25x24 - chunk 1 (end anchor) text run 1 at (71.00,12.63) startOffset 0 endOffset 1 width 10.00: "o" + chunk 1 (end anchor) text run 1 at (71.01,12.63) startOffset 0 endOffset 1 width 10.00: "o" chunk 1 (end anchor) text run 2 at (81.01,12.80) startOffset 1 endOffset 2 width 10.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 54x56 LayoutSVGInlineText {#text} at (66,11) size 54x55 chunk 1 (end anchor) text run 1 at (88.42,14.02) startOffset 0 endOffset 1 width 5.00: " " - chunk 1 (end anchor) text run 2 at (95.07,16.03) startOffset 1 endOffset 2 width 8.88: "a" + chunk 1 (end anchor) text run 2 at (95.07,16.04) startOffset 1 endOffset 2 width 8.88: "a" chunk 1 (end anchor) text run 3 at (101.37,18.94) startOffset 2 endOffset 3 width 5.00: " " chunk 1 (end anchor) text run 4 at (108.00,23.51) startOffset 3 endOffset 4 width 11.12: "P" chunk 1 (end anchor) text run 5 at (114.60,30.97) startOffset 4 endOffset 5 width 8.88: "a" @@ -185,7 +185,7 @@ chunk 1 text run 1 at (51.36,17.54) startOffset 0 endOffset 1 width 12.22: "T" chunk 1 text run 2 at (60.63,14.25) startOffset 1 endOffset 2 width 7.48: "e" chunk 1 text run 3 at (69.25,12.77) startOffset 2 endOffset 3 width 10.00: "x" - chunk 1 text run 4 at (77.03,12.53) startOffset 3 endOffset 4 width 5.56: "t" + chunk 1 text run 4 at (77.04,12.53) startOffset 3 endOffset 4 width 5.56: "t" chunk 1 text run 5 at (82.30,12.94) startOffset 4 endOffset 5 width 5.00: " " LayoutSVGTSpan {tspan} at (0,0) size 31x30 LayoutSVGInlineText {#text} at (47,0) size 30x30 @@ -212,20 +212,20 @@ LayoutSVGTextPath {textPath} at (0,0) size 97x59 LayoutSVGInlineText {#text} at (0,30) size 27x28 chunk 1 (middle anchor) text run 1 at (30.07,47.55) startOffset 2 endOffset 3 width 10.00: "x" - chunk 1 (middle anchor) text run 2 at (31.34,39.93) startOffset 3 endOffset 4 width 5.56: "t" - chunk 1 (middle anchor) text run 3 at (33.18,34.98) startOffset 4 endOffset 5 width 5.00: " " + chunk 1 (middle anchor) text run 2 at (31.35,39.93) startOffset 3 endOffset 4 width 5.56: "t" + chunk 1 (middle anchor) text run 3 at (33.18,34.97) startOffset 4 endOffset 5 width 5.00: " " LayoutSVGTSpan {tspan} at (0,0) size 34x35 LayoutSVGInlineText {#text} at (0,1) size 34x34 - chunk 1 (middle anchor) text run 1 at (37.10,28.61) startOffset 0 endOffset 1 width 10.00: "o" + chunk 1 (middle anchor) text run 1 at (37.10,28.60) startOffset 0 endOffset 1 width 10.00: "o" chunk 1 (middle anchor) text run 2 at (44.30,21.70) startOffset 1 endOffset 2 width 10.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 69x30 LayoutSVGInlineText {#text} at (28,0) size 68x30 chunk 1 (middle anchor) text run 1 at (50.73,17.84) startOffset 0 endOffset 1 width 5.00: " " chunk 1 (middle anchor) text run 2 at (57.16,15.25) startOffset 1 endOffset 2 width 8.88: "a" chunk 1 (middle anchor) text run 3 at (63.88,13.54) startOffset 2 endOffset 3 width 5.00: " " - chunk 1 (middle anchor) text run 4 at (71.89,12.58) startOffset 3 endOffset 4 width 11.12: "P" + chunk 1 (middle anchor) text run 4 at (71.90,12.58) startOffset 3 endOffset 4 width 11.12: "P" chunk 1 (middle anchor) text run 5 at (81.90,12.89) startOffset 4 endOffset 5 width 8.88: "a" - chunk 1 (middle anchor) text run 6 at (89.01,14.17) startOffset 5 endOffset 6 width 5.56: "t" + chunk 1 (middle anchor) text run 6 at (89.02,14.17) startOffset 5 endOffset 6 width 5.56: "t" chunk 1 (middle anchor) text run 7 at (96.42,16.57) startOffset 6 endOffset 7 width 10.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 66x13 contains 1 chunk(s) @@ -244,7 +244,7 @@ LayoutSVGInlineText {#text} at (-11,-6) size 0x0 LayoutSVGTSpan {tspan} at (0,0) size 38x45 LayoutSVGInlineText {#text} at (0,0) size 38x45 - chunk 1 (end anchor) text run 1 at (30.33,44.89) startOffset 3 endOffset 4 width 11.12: "P" + chunk 1 (end anchor) text run 1 at (30.33,44.88) startOffset 3 endOffset 4 width 11.12: "P" chunk 1 (end anchor) text run 2 at (33.02,35.34) startOffset 4 endOffset 5 width 8.88: "a" chunk 1 (end anchor) text run 3 at (36.68,29.15) startOffset 5 endOffset 6 width 5.56: "t" chunk 1 (end anchor) text run 4 at (42.00,23.51) startOffset 6 endOffset 7 width 10.00: "h" @@ -265,7 +265,7 @@ chunk 1 text run 1 at (17.11,27.90) startOffset 0 endOffset 1 width 5.84: "s" chunk 1 text run 2 at (21.92,23.19) startOffset 1 endOffset 2 width 7.50: "u" chunk 1 text run 3 at (27.42,18.21) startOffset 2 endOffset 3 width 7.50: "p" - chunk 1 text run 4 at (33.04,13.89) startOffset 3 endOffset 4 width 6.66: "e" + chunk 1 text run 4 at (33.05,13.89) startOffset 3 endOffset 4 width 6.66: "e" chunk 1 text run 5 at (38.06,10.98) startOffset 4 endOffset 5 width 5.00: "r" LayoutSVGInlineText {#text} at (37,5) size 38x28 chunk 1 text run 1 at (42.17,9.43) startOffset 0 endOffset 1 width 3.75: " " @@ -276,10 +276,10 @@ LayoutSVGTSpan {tspan} at (0,0) size 28x28 LayoutSVGInlineText {#text} at (57,26) size 28x27 chunk 1 text run 1 at (67.63,22.49) startOffset 0 endOffset 1 width 5.84: "s" - chunk 1 text run 2 at (72.54,26.89) startOffset 1 endOffset 2 width 7.50: "u" + chunk 1 text run 2 at (72.55,26.90) startOffset 1 endOffset 2 width 7.50: "u" chunk 1 text run 3 at (78.54,31.44) startOffset 2 endOffset 3 width 7.50: "b" LayoutSVGInlineText {#text} at (80,20) size 38x30 - chunk 1 text run 1 at (84.39,34.61) startOffset 0 endOffset 1 width 5.84: "s" + chunk 1 text run 1 at (84.39,34.62) startOffset 0 endOffset 1 width 5.84: "s" chunk 1 text run 2 at (90.40,36.15) startOffset 1 endOffset 2 width 6.66: "c" chunk 1 text run 3 at (96.10,35.61) startOffset 2 endOffset 3 width 5.00: "r" chunk 1 text run 4 at (100.28,33.76) startOffset 3 endOffset 4 width 4.17: "i" @@ -312,7 +312,7 @@ chunk 1 text run 1 at (56.32,11.91) startOffset 0 endOffset 1 width 3.75: " " chunk 1 text run 2 at (60.42,15.42) startOffset 1 endOffset 2 width 6.66: "a" chunk 1 text run 3 at (65.53,20.48) startOffset 2 endOffset 3 width 7.50: "n" - chunk 1 text run 4 at (70.95,25.51) startOffset 3 endOffset 4 width 7.50: "d" + chunk 1 text run 4 at (70.95,25.52) startOffset 3 endOffset 4 width 7.50: "d" chunk 1 text run 5 at (75.31,29.13) startOffset 4 endOffset 5 width 3.75: " " LayoutSVGTSpan {tspan} at (0,0) size 52x34 LayoutSVGInlineText {#text} at (69,17) size 52x34 @@ -338,7 +338,7 @@ LayoutSVGTextPath {textPath} at (0,0) size 114x56 LayoutSVGInlineText {#text} at (0,32) size 114x55 chunk 1 text run 1 at (35.73,30.48) startOffset 0 endOffset 1 width 15.00: "o" - chunk 1 text run 2 at (46.50,20.21) startOffset 1 endOffset 2 width 15.00: "n" + chunk 1 text run 2 at (46.50,20.20) startOffset 1 endOffset 2 width 15.00: "n" chunk 1 text run 3 at (56.67,15.41) startOffset 2 endOffset 3 width 7.50: " " chunk 1 text run 4 at (67.65,12.95) startOffset 3 endOffset 4 width 15.00: "p" chunk 1 text run 5 at (81.80,12.88) startOffset 4 endOffset 5 width 13.32: "a"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath2-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath2-expected.png index 56e0c46b..2b3003d 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath2-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath2-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath2-expected.txt index 36cbda7..59564a3 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath2-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath2-expected.txt
@@ -31,28 +31,28 @@ LayoutSVGTextPath {textPath} at (0,0) size 152x118 LayoutSVGInlineText {#text} at (75,28) size 47x89 chunk 1 text run 1 at (100.02,-2.28) startOffset 0 endOffset 1 width 4.45: "t" - chunk 1 text run 2 at (100.20,-8.06) startOffset 1 endOffset 2 width 7.10: "e" - chunk 1 text run 3 at (100.77,-15.59) startOffset 2 endOffset 3 width 8.00: "x" - chunk 1 text run 4 at (101.53,-21.70) startOffset 3 endOffset 4 width 4.45: "t" - chunk 1 text run 5 at (102.25,-26.04) startOffset 4 endOffset 5 width 4.00: " " - chunk 1 text run 6 at (103.50,-32.02) startOffset 5 endOffset 6 width 8.00: "o" - chunk 1 text run 7 at (105.55,-39.55) startOffset 6 endOffset 7 width 8.00: "n" - chunk 1 text run 8 at (107.53,-45.32) startOffset 7 endOffset 8 width 4.00: " " - chunk 1 text run 9 at (109.65,-50.51) startOffset 8 endOffset 9 width 7.10: "a" - chunk 1 text run 10 at (112.00,-55.40) startOffset 9 endOffset 10 width 4.00: " " + chunk 1 text run 2 at (100.20,-8.07) startOffset 1 endOffset 2 width 7.10: "e" + chunk 1 text run 3 at (100.77,-15.60) startOffset 2 endOffset 3 width 8.00: "x" + chunk 1 text run 4 at (101.53,-21.71) startOffset 3 endOffset 4 width 4.45: "t" + chunk 1 text run 5 at (102.25,-26.05) startOffset 4 endOffset 5 width 4.00: " " + chunk 1 text run 6 at (103.50,-32.03) startOffset 5 endOffset 6 width 8.00: "o" + chunk 1 text run 7 at (105.55,-39.56) startOffset 6 endOffset 7 width 8.00: "n" + chunk 1 text run 8 at (107.53,-45.33) startOffset 7 endOffset 8 width 4.00: " " + chunk 1 text run 9 at (109.66,-50.52) startOffset 8 endOffset 9 width 7.10: "a" + chunk 1 text run 10 at (112.01,-55.41) startOffset 9 endOffset 10 width 4.00: " " chunk 1 text run 11 at (114.97,-60.68) startOffset 10 endOffset 11 width 8.00: "p" - chunk 1 text run 12 at (119.21,-66.94) startOffset 11 endOffset 12 width 7.10: "a" + chunk 1 text run 12 at (119.21,-66.95) startOffset 11 endOffset 12 width 7.10: "a" chunk 1 text run 13 at (122.78,-71.37) startOffset 12 endOffset 13 width 4.45: "t" - chunk 1 text run 14 at (127.14,-75.94) startOffset 13 endOffset 14 width 8.00: "h" + chunk 1 text run 14 at (127.14,-75.95) startOffset 13 endOffset 14 width 8.00: "h" LayoutSVGTSpan {tspan} at (0,0) size 94x35 LayoutSVGInlineText {#text} at (105,0) size 93x35 - chunk 1 text run 1 at (134.60,-82.16) startOffset 0 endOffset 1 width 11.55: "w" - chunk 1 text run 2 at (141.39,-86.41) startOffset 1 endOffset 2 width 4.45: "i" + chunk 1 text run 1 at (134.61,-82.16) startOffset 0 endOffset 1 width 11.55: "w" + chunk 1 text run 2 at (141.40,-86.42) startOffset 1 endOffset 2 width 4.45: "i" chunk 1 text run 3 at (145.35,-88.38) startOffset 2 endOffset 3 width 4.45: "t" - chunk 1 text run 4 at (151.17,-90.67) startOffset 3 endOffset 4 width 8.00: "h" + chunk 1 text run 4 at (151.18,-90.67) startOffset 3 endOffset 4 width 8.00: "h" chunk 1 text run 5 at (156.92,-92.28) startOffset 4 endOffset 5 width 4.00: " " - chunk 1 text run 6 at (162.85,-93.31) startOffset 5 endOffset 6 width 8.00: "n" - chunk 1 text run 7 at (170.38,-93.75) startOffset 6 endOffset 7 width 7.10: "e" + chunk 1 text run 6 at (162.86,-93.31) startOffset 5 endOffset 6 width 8.00: "n" + chunk 1 text run 7 at (170.39,-93.75) startOffset 6 endOffset 7 width 7.10: "e" chunk 1 text run 8 at (177.03,-93.33) startOffset 7 endOffset 8 width 6.23: "s" chunk 1 text run 9 at (182.32,-92.45) startOffset 8 endOffset 9 width 4.45: "t" chunk 1 text run 10 at (187.87,-90.98) startOffset 9 endOffset 10 width 7.10: "e" @@ -60,9 +60,9 @@ LayoutSVGTSpan {tspan} at (0,0) size 41x41 LayoutSVGInlineText {#text} at (186,19) size 41x41 chunk 1 text run 1 at (200.23,-85.50) startOffset 0 endOffset 1 width 4.00: " " - chunk 1 text run 2 at (203.81,-83.26) startOffset 1 endOffset 2 width 4.45: "t" - chunk 1 text run 3 at (208.16,-80.07) startOffset 2 endOffset 3 width 6.23: "s" - chunk 1 text run 4 at (213.42,-75.41) startOffset 3 endOffset 4 width 8.00: "p" + chunk 1 text run 2 at (203.82,-83.26) startOffset 1 endOffset 2 width 4.45: "t" + chunk 1 text run 3 at (208.17,-80.06) startOffset 2 endOffset 3 width 6.23: "s" + chunk 1 text run 4 at (213.42,-75.40) startOffset 3 endOffset 4 width 8.00: "p" chunk 1 text run 5 at (218.59,-69.76) startOffset 4 endOffset 5 width 7.10: "a" chunk 1 text run 6 at (223.02,-63.81) startOffset 5 endOffset 6 width 8.00: "n" LayoutSVGInlineText {#text} at (221,39) size 32x18 @@ -80,20 +80,20 @@ chunk 1 text run 1 at (10.00,0.00) startOffset 0 endOffset 14 width 89.78: "This is simple" LayoutSVGTextPath {textPath} at (0,0) size 161x93 LayoutSVGInlineText {#text} at (78,13) size 66x79 - chunk 1 text run 1 at (102.69,-28.35) startOffset 0 endOffset 1 width 4.45: "t" - chunk 1 text run 2 at (103.98,-34.00) startOffset 1 endOffset 2 width 7.10: "e" - chunk 1 text run 3 at (106.01,-41.01) startOffset 2 endOffset 3 width 8.00: "x" - chunk 1 text run 4 at (108.20,-47.06) startOffset 3 endOffset 4 width 4.45: "t" - chunk 1 text run 5 at (109.86,-50.96) startOffset 4 endOffset 5 width 4.00: " " - chunk 1 text run 6 at (112.42,-56.21) startOffset 5 endOffset 6 width 8.00: "o" - chunk 1 text run 7 at (116.57,-63.20) startOffset 6 endOffset 7 width 8.00: "n" - chunk 1 text run 8 at (120.03,-68.03) startOffset 7 endOffset 8 width 4.00: " " - chunk 1 text run 9 at (123.58,-72.27) startOffset 8 endOffset 9 width 7.10: "a" + chunk 1 text run 1 at (102.70,-28.36) startOffset 0 endOffset 1 width 4.45: "t" + chunk 1 text run 2 at (103.99,-34.01) startOffset 1 endOffset 2 width 7.10: "e" + chunk 1 text run 3 at (106.02,-41.01) startOffset 2 endOffset 3 width 8.00: "x" + chunk 1 text run 4 at (108.21,-47.07) startOffset 3 endOffset 4 width 4.45: "t" + chunk 1 text run 5 at (109.86,-50.97) startOffset 4 endOffset 5 width 4.00: " " + chunk 1 text run 6 at (112.43,-56.22) startOffset 5 endOffset 6 width 8.00: "o" + chunk 1 text run 7 at (116.58,-63.21) startOffset 6 endOffset 7 width 8.00: "n" + chunk 1 text run 8 at (120.04,-68.04) startOffset 7 endOffset 8 width 4.00: " " + chunk 1 text run 9 at (123.59,-72.28) startOffset 8 endOffset 9 width 7.10: "a" chunk 1 text run 10 at (127.50,-76.29) startOffset 9 endOffset 10 width 4.00: " " - chunk 1 text run 11 at (131.96,-80.16) startOffset 10 endOffset 11 width 8.00: "p" - chunk 1 text run 12 at (138.19,-84.55) startOffset 11 endOffset 12 width 7.10: "a" + chunk 1 text run 11 at (131.96,-80.17) startOffset 10 endOffset 11 width 8.00: "p" + chunk 1 text run 12 at (138.19,-84.56) startOffset 11 endOffset 12 width 7.10: "a" chunk 1 text run 13 at (143.19,-87.35) startOffset 12 endOffset 13 width 4.45: "t" - chunk 1 text run 14 at (148.91,-89.86) startOffset 13 endOffset 14 width 8.00: "h" + chunk 1 text run 14 at (148.92,-89.86) startOffset 13 endOffset 14 width 8.00: "h" LayoutSVGTSpan {tspan} at (0,0) size 90x44 LayoutSVGInlineText {#text} at (137,0) size 89x44 chunk 1 text run 1 at (158.28,-92.57) startOffset 0 endOffset 1 width 11.55: "w" @@ -104,15 +104,15 @@ chunk 1 text run 6 at (188.56,-90.76) startOffset 5 endOffset 6 width 8.00: "n" chunk 1 text run 7 at (195.62,-87.93) startOffset 6 endOffset 7 width 7.10: "e" chunk 1 text run 8 at (201.42,-84.79) startOffset 7 endOffset 8 width 6.23: "s" - chunk 1 text run 9 at (205.89,-81.80) startOffset 8 endOffset 9 width 4.45: "t" + chunk 1 text run 9 at (205.90,-81.80) startOffset 8 endOffset 9 width 4.45: "t" chunk 1 text run 10 at (210.37,-78.22) startOffset 9 endOffset 10 width 7.10: "e" chunk 1 text run 11 at (215.80,-72.95) startOffset 10 endOffset 11 width 8.00: "d" LayoutSVGTSpan {tspan} at (0,0) size 34x44 LayoutSVGInlineText {#text} at (205,39) size 34x44 chunk 1 text run 1 at (219.70,-68.38) startOffset 0 endOffset 1 width 4.00: " " - chunk 1 text run 2 at (222.17,-65.05) startOffset 1 endOffset 2 width 4.45: "t" + chunk 1 text run 2 at (222.17,-65.04) startOffset 1 endOffset 2 width 4.45: "t" chunk 1 text run 3 at (225.12,-60.54) startOffset 2 endOffset 3 width 6.23: "s" - chunk 1 text run 4 at (228.55,-54.31) startOffset 3 endOffset 4 width 8.00: "p" + chunk 1 text run 4 at (228.56,-54.31) startOffset 3 endOffset 4 width 8.00: "p" chunk 1 text run 5 at (231.63,-47.49) startOffset 4 endOffset 5 width 7.10: "a" chunk 1 text run 6 at (234.24,-40.22) startOffset 5 endOffset 6 width 8.00: "n" LayoutSVGInlineText {#text} at (232,63) size 32x18 @@ -131,39 +131,39 @@ LayoutSVGTextPath {textPath} at (0,0) size 162x88 LayoutSVGInlineText {#text} at (79,11) size 70x76 chunk 1 (middle anchor) text run 1 at (103.88,-33.58) startOffset 0 endOffset 1 width 4.45: "t" - chunk 1 (middle anchor) text run 2 at (105.38,-38.99) startOffset 1 endOffset 2 width 7.10: "e" + chunk 1 (middle anchor) text run 2 at (105.38,-39.00) startOffset 1 endOffset 2 width 7.10: "e" chunk 1 (middle anchor) text run 3 at (107.87,-46.22) startOffset 2 endOffset 3 width 8.00: "x" chunk 1 (middle anchor) text run 4 at (110.31,-51.96) startOffset 3 endOffset 4 width 4.45: "t" - chunk 1 (middle anchor) text run 5 at (112.13,-55.64) startOffset 4 endOffset 5 width 4.00: " " - chunk 1 (middle anchor) text run 6 at (115.12,-60.92) startOffset 5 endOffset 6 width 8.00: "o" - chunk 1 (middle anchor) text run 7 at (119.64,-67.51) startOffset 6 endOffset 7 width 8.00: "n" - chunk 1 (middle anchor) text run 8 at (123.43,-72.11) startOffset 7 endOffset 8 width 4.00: " " + chunk 1 (middle anchor) text run 5 at (112.13,-55.65) startOffset 4 endOffset 5 width 4.00: " " + chunk 1 (middle anchor) text run 6 at (115.12,-60.93) startOffset 5 endOffset 6 width 8.00: "o" + chunk 1 (middle anchor) text run 7 at (119.64,-67.52) startOffset 6 endOffset 7 width 8.00: "n" + chunk 1 (middle anchor) text run 8 at (123.44,-72.11) startOffset 7 endOffset 8 width 4.00: " " chunk 1 (middle anchor) text run 9 at (127.34,-76.14) startOffset 8 endOffset 9 width 7.10: "a" - chunk 1 (middle anchor) text run 10 at (131.45,-79.75) startOffset 9 endOffset 10 width 4.00: " " + chunk 1 (middle anchor) text run 10 at (131.45,-79.76) startOffset 9 endOffset 10 width 4.00: " " chunk 1 (middle anchor) text run 11 at (136.32,-83.35) startOffset 10 endOffset 11 width 8.00: "p" chunk 1 (middle anchor) text run 12 at (142.80,-87.15) startOffset 11 endOffset 12 width 7.10: "a" chunk 1 (middle anchor) text run 13 at (148.08,-89.54) startOffset 12 endOffset 13 width 4.45: "t" - chunk 1 (middle anchor) text run 14 at (153.97,-91.53) startOffset 13 endOffset 14 width 8.00: "h" + chunk 1 (middle anchor) text run 14 at (153.98,-91.53) startOffset 13 endOffset 14 width 8.00: "h" LayoutSVGTSpan {tspan} at (0,0) size 86x49 LayoutSVGInlineText {#text} at (145,0) size 86x49 - chunk 1 (middle anchor) text run 1 at (163.56,-93.40) startOffset 0 endOffset 1 width 11.55: "w" + chunk 1 (middle anchor) text run 1 at (163.57,-93.40) startOffset 0 endOffset 1 width 11.55: "w" chunk 1 (middle anchor) text run 2 at (171.55,-93.73) startOffset 1 endOffset 2 width 4.45: "i" - chunk 1 (middle anchor) text run 3 at (175.98,-93.45) startOffset 2 endOffset 3 width 4.45: "t" + chunk 1 (middle anchor) text run 3 at (175.98,-93.44) startOffset 2 endOffset 3 width 4.45: "t" chunk 1 (middle anchor) text run 4 at (182.15,-92.48) startOffset 3 endOffset 4 width 8.00: "h" - chunk 1 (middle anchor) text run 5 at (187.92,-90.96) startOffset 4 endOffset 5 width 4.00: " " + chunk 1 (middle anchor) text run 5 at (187.93,-90.96) startOffset 4 endOffset 5 width 4.00: " " chunk 1 (middle anchor) text run 6 at (193.57,-88.86) startOffset 5 endOffset 6 width 8.00: "n" - chunk 1 (middle anchor) text run 7 at (200.28,-85.48) startOffset 6 endOffset 7 width 7.10: "e" + chunk 1 (middle anchor) text run 7 at (200.28,-85.47) startOffset 6 endOffset 7 width 7.10: "e" chunk 1 (middle anchor) text run 8 at (205.89,-81.80) startOffset 7 endOffset 8 width 6.23: "s" - chunk 1 (middle anchor) text run 9 at (210.04,-78.51) startOffset 8 endOffset 9 width 4.45: "t" + chunk 1 (middle anchor) text run 9 at (210.05,-78.51) startOffset 8 endOffset 9 width 4.45: "t" chunk 1 (middle anchor) text run 10 at (214.24,-74.58) startOffset 9 endOffset 10 width 7.10: "e" chunk 1 (middle anchor) text run 11 at (219.29,-68.89) startOffset 10 endOffset 11 width 8.00: "d" LayoutSVGTSpan {tspan} at (0,0) size 33x44 LayoutSVGInlineText {#text} at (208,44) size 32x44 - chunk 1 (middle anchor) text run 1 at (222.80,-64.14) startOffset 0 endOffset 1 width 4.00: " " + chunk 1 (middle anchor) text run 1 at (222.80,-64.13) startOffset 0 endOffset 1 width 4.00: " " chunk 1 (middle anchor) text run 2 at (225.11,-60.54) startOffset 1 endOffset 2 width 4.45: "t" chunk 1 (middle anchor) text run 3 at (227.77,-55.84) startOffset 2 endOffset 3 width 6.23: "s" chunk 1 (middle anchor) text run 4 at (230.77,-49.55) startOffset 3 endOffset 4 width 8.00: "p" - chunk 1 (middle anchor) text run 5 at (233.54,-42.35) startOffset 4 endOffset 5 width 7.10: "a" + chunk 1 (middle anchor) text run 5 at (233.54,-42.34) startOffset 4 endOffset 5 width 7.10: "a" chunk 1 (middle anchor) text run 6 at (235.68,-35.28) startOffset 5 endOffset 6 width 8.00: "n" LayoutSVGInlineText {#text} at (233,68) size 32x18 chunk 1 text run 1 at (243.68,-35.28) startOffset 0 endOffset 5 width 32.00: " xxx "
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath3-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath3-expected.txt index 182a4e9..965d6f39 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath3-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPath3-expected.txt
@@ -18,29 +18,29 @@ LayoutSVGText {text} at (95,-108) size 156x81 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 156x80 LayoutSVGInlineText {#text} at (0,0) size 156x80 - chunk 1 (middle anchor) text run 1 at (110.46,-52.27) startOffset 0 endOffset 1 width 9.77: "T" - chunk 1 (middle anchor) text run 2 at (114.07,-59.16) startOffset 1 endOffset 2 width 5.98: "e" + chunk 1 (middle anchor) text run 1 at (110.46,-52.28) startOffset 0 endOffset 1 width 9.77: "T" + chunk 1 (middle anchor) text run 2 at (114.07,-59.17) startOffset 1 endOffset 2 width 5.98: "e" chunk 1 (middle anchor) text run 3 at (117.89,-65.13) startOffset 2 endOffset 3 width 8.00: "x" - chunk 1 (middle anchor) text run 4 at (121.58,-69.96) startOffset 3 endOffset 4 width 4.45: "t" + chunk 1 (middle anchor) text run 4 at (121.59,-69.97) startOffset 3 endOffset 4 width 4.45: "t" chunk 1 (middle anchor) text run 5 at (124.43,-73.20) startOffset 4 endOffset 5 width 4.00: " " chunk 1 (middle anchor) text run 6 at (128.72,-77.42) startOffset 5 endOffset 6 width 8.00: "o" - chunk 1 (middle anchor) text run 7 at (134.93,-82.40) startOffset 6 endOffset 7 width 8.00: "n" + chunk 1 (middle anchor) text run 7 at (134.94,-82.40) startOffset 6 endOffset 7 width 8.00: "n" chunk 1 (middle anchor) text run 8 at (140.01,-85.64) startOffset 7 endOffset 8 width 4.00: " " chunk 1 (middle anchor) text run 9 at (144.89,-88.17) startOffset 8 endOffset 9 width 7.10: "a" - chunk 1 (middle anchor) text run 10 at (150.07,-90.29) startOffset 9 endOffset 10 width 4.00: " " - chunk 1 (middle anchor) text run 11 at (155.79,-92.01) startOffset 10 endOffset 11 width 8.00: "p" + chunk 1 (middle anchor) text run 10 at (150.08,-90.29) startOffset 9 endOffset 10 width 4.00: " " + chunk 1 (middle anchor) text run 11 at (155.80,-92.01) startOffset 10 endOffset 11 width 8.00: "p" chunk 1 (middle anchor) text run 12 at (163.24,-93.36) startOffset 11 endOffset 12 width 7.10: "a" - chunk 1 (middle anchor) text run 13 at (168.99,-93.74) startOffset 12 endOffset 13 width 4.45: "t" + chunk 1 (middle anchor) text run 13 at (169.00,-93.74) startOffset 12 endOffset 13 width 4.45: "t" chunk 1 (middle anchor) text run 14 at (175.21,-93.52) startOffset 13 endOffset 14 width 8.00: "h" chunk 1 (middle anchor) text run 15 at (181.16,-92.68) startOffset 14 endOffset 15 width 4.00: " " - chunk 1 (middle anchor) text run 16 at (185.69,-91.62) startOffset 15 endOffset 16 width 5.33: "f" + chunk 1 (middle anchor) text run 16 at (185.70,-91.62) startOffset 15 endOffset 16 width 5.33: "f" chunk 1 (middle anchor) text run 17 at (192.01,-89.50) startOffset 16 endOffset 17 width 8.00: "o" chunk 1 (middle anchor) text run 18 at (198.06,-86.71) startOffset 17 endOffset 18 width 5.33: "r" chunk 1 (middle anchor) text run 19 at (202.08,-84.39) startOffset 18 endOffset 19 width 4.00: " " - chunk 1 (middle anchor) text run 20 at (205.61,-82.00) startOffset 19 endOffset 20 width 4.45: "t" + chunk 1 (middle anchor) text run 20 at (205.62,-82.00) startOffset 19 endOffset 20 width 4.45: "t" chunk 1 (middle anchor) text run 21 at (210.12,-78.44) startOffset 20 endOffset 21 width 7.10: "e" chunk 1 (middle anchor) text run 22 at (215.56,-73.21) startOffset 21 endOffset 22 width 8.00: "x" - chunk 1 (middle anchor) text run 23 at (219.62,-68.47) startOffset 22 endOffset 23 width 4.45: "t" + chunk 1 (middle anchor) text run 23 at (219.63,-68.47) startOffset 22 endOffset 23 width 4.45: "t" chunk 1 (middle anchor) text run 24 at (222.10,-65.14) startOffset 23 endOffset 24 width 4.00: " " chunk 1 (middle anchor) text run 25 at (226.33,-58.47) startOffset 24 endOffset 25 width 11.55: "w" chunk 1 (middle anchor) text run 26 at (229.91,-51.47) startOffset 25 endOffset 26 width 4.45: "/" @@ -66,17 +66,17 @@ chunk 1 (middle anchor) text run 4 at (202.48,-84.13) startOffset 3 endOffset 4 width 4.45: "t" chunk 1 (middle anchor) text run 5 at (206.00,-81.72) startOffset 4 endOffset 5 width 4.00: " " chunk 1 (middle anchor) text run 6 at (210.64,-77.99) startOffset 5 endOffset 6 width 8.00: "o" - chunk 1 (middle anchor) text run 7 at (216.35,-72.34) startOffset 6 endOffset 7 width 8.00: "n" + chunk 1 (middle anchor) text run 7 at (216.36,-72.34) startOffset 6 endOffset 7 width 8.00: "n" chunk 1 (middle anchor) text run 8 at (220.18,-67.76) startOffset 7 endOffset 8 width 4.00: " " chunk 1 (middle anchor) text run 9 at (223.38,-63.28) startOffset 8 endOffset 9 width 7.10: "a" - chunk 1 (middle anchor) text run 10 at (226.34,-58.45) startOffset 9 endOffset 10 width 4.00: " " + chunk 1 (middle anchor) text run 10 at (226.35,-58.45) startOffset 9 endOffset 10 width 4.00: " " chunk 1 (middle anchor) text run 11 at (229.09,-53.23) startOffset 10 endOffset 11 width 8.00: "p" chunk 1 (middle anchor) text run 12 at (232.09,-46.32) startOffset 11 endOffset 12 width 7.10: "a" - chunk 1 (middle anchor) text run 13 at (234.09,-40.71) startOffset 12 endOffset 13 width 4.45: "t" + chunk 1 (middle anchor) text run 13 at (234.09,-40.70) startOffset 12 endOffset 13 width 4.45: "t" chunk 1 (middle anchor) text run 14 at (235.77,-34.95) startOffset 13 endOffset 14 width 8.00: "h" chunk 1 (middle anchor) text run 15 at (237.15,-29.11) startOffset 14 endOffset 15 width 4.00: " " chunk 1 (middle anchor) text run 16 at (238.04,-24.39) startOffset 15 endOffset 16 width 5.33: "f" - chunk 1 (middle anchor) text run 17 at (238.99,-17.75) startOffset 16 endOffset 17 width 8.00: "o" + chunk 1 (middle anchor) text run 17 at (238.99,-17.74) startOffset 16 endOffset 17 width 8.00: "o" chunk 1 (middle anchor) text run 18 at (239.62,-11.04) startOffset 17 endOffset 18 width 5.33: "r" chunk 1 (middle anchor) text run 19 at (239.87,-6.46) startOffset 18 endOffset 19 width 4.00: " " chunk 1 (middle anchor) text run 20 at (239.99,-2.21) startOffset 19 endOffset 20 width 4.45: "t" @@ -95,10 +95,10 @@ LayoutSVGInlineText {#text} at (0,0) size 120x59 chunk 1 (middle anchor) text run 1 at (134.77,-82.28) startOffset 0 endOffset 1 width 8.00: "p" chunk 1 (middle anchor) text run 2 at (141.18,-86.30) startOffset 1 endOffset 2 width 7.10: "a" - chunk 1 (middle anchor) text run 3 at (146.34,-88.82) startOffset 2 endOffset 3 width 4.45: "t" + chunk 1 (middle anchor) text run 3 at (146.35,-88.82) startOffset 2 endOffset 3 width 4.45: "t" chunk 1 (middle anchor) text run 4 at (152.20,-91.00) startOffset 3 endOffset 4 width 8.00: "h" chunk 1 (middle anchor) text run 5 at (157.98,-92.51) startOffset 4 endOffset 5 width 4.00: " " - chunk 1 (middle anchor) text run 6 at (162.59,-93.28) startOffset 5 endOffset 6 width 5.33: "f" + chunk 1 (middle anchor) text run 6 at (162.60,-93.28) startOffset 5 endOffset 6 width 5.33: "f" chunk 1 (middle anchor) text run 7 at (169.24,-93.75) startOffset 6 endOffset 7 width 8.00: "o" chunk 1 (middle anchor) text run 8 at (175.89,-93.45) startOffset 7 endOffset 8 width 5.33: "r" chunk 1 (middle anchor) text run 9 at (180.52,-92.80) startOffset 8 endOffset 9 width 4.00: " " @@ -106,10 +106,10 @@ chunk 1 (middle anchor) text run 11 at (190.15,-90.21) startOffset 10 endOffset 11 width 7.10: "e" chunk 1 (middle anchor) text run 12 at (197.10,-87.20) startOffset 11 endOffset 12 width 8.00: "x" chunk 1 (middle anchor) text run 13 at (202.47,-84.14) startOffset 12 endOffset 13 width 4.45: "t" - chunk 1 (middle anchor) text run 14 at (206.00,-81.73) startOffset 13 endOffset 14 width 4.00: " " + chunk 1 (middle anchor) text run 14 at (206.00,-81.72) startOffset 13 endOffset 14 width 4.00: " " chunk 1 (middle anchor) text run 15 at (211.94,-76.81) startOffset 14 endOffset 15 width 11.55: "w" chunk 1 (middle anchor) text run 16 at (217.56,-70.98) startOffset 15 endOffset 16 width 4.45: "/" - chunk 1 (middle anchor) text run 17 at (220.17,-67.76) startOffset 16 endOffset 17 width 4.00: " " + chunk 1 (middle anchor) text run 17 at (220.18,-67.76) startOffset 16 endOffset 17 width 4.00: " " chunk 1 (middle anchor) text run 18 at (222.18,-65.03) startOffset 17 endOffset 18 width 2.88: "'" chunk 1 (middle anchor) text run 19 at (225.18,-60.43) startOffset 18 endOffset 19 width 8.00: "x" chunk 1 (middle anchor) text run 20 at (227.88,-55.64) startOffset 19 endOffset 20 width 2.88: "'"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPathSpaces-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPathSpaces-expected.txt index 13df6b8..2945bb6 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPathSpaces-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textOnPathSpaces-expected.txt
@@ -70,11 +70,11 @@ LayoutSVGTextPath {textPath} at (0,0) size 120x46 LayoutSVGInlineText {#text} at (0,0) size 120x46 chunk 1 text run 1 at (17.81,27.20) startOffset 0 endOffset 1 width 7.78: "s" - chunk 1 text run 2 at (34.70,12.82) startOffset 1 endOffset 2 width 8.88: "a" + chunk 1 text run 2 at (34.70,12.81) startOffset 1 endOffset 2 width 8.88: "a" chunk 1 text run 3 at (58.59,13.68) startOffset 2 endOffset 3 width 15.56: "m" chunk 1 text run 4 at (78.67,31.53) startOffset 3 endOffset 4 width 10.00: "p" chunk 1 text run 5 at (99.04,34.45) startOffset 4 endOffset 5 width 5.56: "l" - chunk 1 text run 6 at (115.72,21.50) startOffset 5 endOffset 6 width 8.88: "e" + chunk 1 text run 6 at (115.73,21.50) startOffset 5 endOffset 6 width 8.88: "e" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 73x13 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,0) size 73x13 @@ -90,7 +90,7 @@ chunk 1 text run 3 at (37.07,11.47) startOffset 2 endOffset 3 width 15.56: "m" chunk 1 text run 4 at (51.49,9.50) startOffset 3 endOffset 4 width 10.00: "p" chunk 1 text run 5 at (59.92,14.92) startOffset 4 endOffset 5 width 5.56: "l" - chunk 1 text run 6 at (66.75,21.64) startOffset 5 endOffset 6 width 8.88: "e" + chunk 1 text run 6 at (66.75,21.65) startOffset 5 endOffset 6 width 8.88: "e" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 68x13 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,0) size 68x13 @@ -105,7 +105,7 @@ chunk 1 text run 2 at (38.26,10.88) startOffset 1 endOffset 2 width 8.88: "a" chunk 1 text run 3 at (64.62,19.59) startOffset 2 endOffset 3 width 15.56: "m" chunk 1 text run 4 at (90.72,36.18) startOffset 3 endOffset 4 width 10.00: "p" - chunk 1 text run 5 at (107.41,27.71) startOffset 4 endOffset 5 width 5.56: "l" + chunk 1 text run 5 at (107.42,27.71) startOffset 4 endOffset 5 width 5.56: "l" chunk 1 text run 6 at (122.33,18.12) startOffset 5 endOffset 6 width 8.88: "e" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 73x13 contains 1 chunk(s) @@ -145,10 +145,10 @@ LayoutSVGText {text} at (2,-2) size 36x36 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 36x36 LayoutSVGInlineText {#text} at (0,0) size 36x36 - chunk 1 text run 1 at (16.73,28.28) startOffset 0 endOffset 1 width 4.78: "s" + chunk 1 text run 1 at (16.73,28.27) startOffset 0 endOffset 1 width 4.78: "s" chunk 1 text run 2 at (18.41,26.60) startOffset 1 endOffset 2 width 5.88: "a" - chunk 1 text run 3 at (22.90,22.27) startOffset 2 endOffset 3 width 12.56: "m" - chunk 1 text run 4 at (27.91,17.79) startOffset 3 endOffset 4 width 7.00: "p" + chunk 1 text run 3 at (22.90,22.26) startOffset 2 endOffset 3 width 12.56: "m" + chunk 1 text run 4 at (27.92,17.79) startOffset 3 endOffset 4 width 7.00: "p" chunk 1 text run 5 at (29.30,16.66) startOffset 4 endOffset 5 width 2.56: "l" chunk 1 text run 6 at (30.25,15.92) startOffset 5 endOffset 6 width 5.88: "e" LayoutSVGInlineText {#text} at (0,0) size 0x0 @@ -164,7 +164,7 @@ chunk 1 text run 1 at (17.81,27.20) startOffset 0 endOffset 1 width 7.78: "s" chunk 1 text run 2 at (20.59,24.47) startOffset 1 endOffset 2 width 8.88: "a" chunk 1 text run 3 at (26.17,19.29) startOffset 2 endOffset 3 width 15.56: "m" - chunk 1 text run 4 at (32.70,14.13) startOffset 3 endOffset 4 width 10.00: "p" + chunk 1 text run 4 at (32.70,14.12) startOffset 3 endOffset 4 width 10.00: "p" chunk 1 text run 5 at (35.51,12.33) startOffset 4 endOffset 5 width 5.56: "l" chunk 1 text run 6 at (37.87,11.07) startOffset 5 endOffset 6 width 8.88: "e" chunk 1 text run 7 at (58.61,13.69) startOffset 6 endOffset 7 width 45.00: " " @@ -194,7 +194,7 @@ chunk 1 text run 5 at (63.01,18.00) startOffset 4 endOffset 5 width 5.56: "l" chunk 1 text run 6 at (69.75,24.44) startOffset 5 endOffset 6 width 8.88: "e" chunk 1 text run 7 at (74.10,28.18) startOffset 6 endOffset 7 width 0.00: " " - chunk 1 text run 8 at (72.98,27.26) startOffset 7 endOffset 8 width 7.78: "s" + chunk 1 text run 8 at (72.99,27.26) startOffset 7 endOffset 8 width 7.78: "s" chunk 1 text run 9 at (81.80,33.39) startOffset 8 endOffset 9 width 8.88: "a" chunk 1 text run 10 at (96.94,35.35) startOffset 9 endOffset 10 width 15.56: "m" chunk 1 text run 11 at (110.17,25.39) startOffset 10 endOffset 11 width 10.00: "p"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/verticalText-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/verticalText-expected.txt index aa9d78c8b..f7c0d7a3 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/verticalText-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/verticalText-expected.txt
@@ -261,7 +261,7 @@ chunk 1 (vertical) text run 18 at (217.19,11.41) startOffset 17 endOffset 18 height 14.00: "a" chunk 1 (vertical) text run 19 at (230.67,9.27) startOffset 18 endOffset 19 height 14.00: " " chunk 1 (vertical) text run 20 at (242.19,17.19) startOffset 19 endOffset 20 height 14.00: "P" - chunk 1 (vertical) text run 21 at (252.38,26.76) startOffset 20 endOffset 21 height 14.00: "a" + chunk 1 (vertical) text run 21 at (252.39,26.76) startOffset 20 endOffset 21 height 14.00: "a" chunk 1 (vertical) text run 22 at (264.04,34.47) startOffset 21 endOffset 22 height 14.00: "t" chunk 1 (vertical) text run 23 at (277.58,35.11) startOffset 22 endOffset 23 height 14.00: "h" chunk 1 (vertical) text run 24 at (288.64,26.37) startOffset 23 endOffset 24 height 14.00: "\x{753B}"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/verticalTextOnPath-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/verticalTextOnPath-expected.txt index 777c6ca..dbfda0d 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/verticalTextOnPath-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/verticalTextOnPath-expected.txt
@@ -76,11 +76,11 @@ LayoutSVGText {text} at (6,0) size 66x35 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 35x66 LayoutSVGInlineText {#text} at (4,19) size 15x15 - chunk 1 (end anchor, vertical) text run 1 at (17.82,27.18) startOffset 4 endOffset 5 height 17.00: " " + chunk 1 (end anchor, vertical) text run 1 at (17.83,27.18) startOffset 4 endOffset 5 height 17.00: " " LayoutSVGTSpan {tspan} at (0,0) size 23x24 LayoutSVGInlineText {#text} at (0,1) size 23x23 chunk 1 (end anchor, vertical) text run 1 at (21.89,23.22) startOffset 0 endOffset 1 height 17.00: "o" - chunk 1 (end anchor, vertical) text run 2 at (27.38,18.24) startOffset 1 endOffset 2 height 17.00: "n" + chunk 1 (end anchor, vertical) text run 2 at (27.39,18.24) startOffset 1 endOffset 2 height 17.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 28x47 LayoutSVGInlineText {#text} at (18,0) size 47x27 chunk 1 (end anchor, vertical) text run 1 at (31.77,14.78) startOffset 0 endOffset 1 height 17.00: " " @@ -174,7 +174,7 @@ LayoutSVGTSpan {tspan} at (0,0) size 22x18 LayoutSVGInlineText {#text} at (28,11) size 18x21 chunk 1 (end anchor, vertical) text run 1 at (80.17,32.47) startOffset 0 endOffset 1 height 17.00: "o" - chunk 1 (end anchor, vertical) text run 2 at (86.97,35.51) startOffset 1 endOffset 2 height 17.00: "n" + chunk 1 (end anchor, vertical) text run 2 at (86.98,35.51) startOffset 1 endOffset 2 height 17.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 37x40 LayoutSVGInlineText {#text} at (41,5) size 39x36 chunk 1 (end anchor, vertical) text run 1 at (92.52,36.20) startOffset 0 endOffset 1 height 17.00: " " @@ -236,14 +236,14 @@ LayoutSVGInlineText {#text} at (0,18) size 23x23 chunk 1 (middle anchor, vertical) text run 1 at (19.16,25.86) startOffset 2 endOffset 3 height 17.00: "x" chunk 1 (middle anchor, vertical) text run 2 at (23.37,21.82) startOffset 3 endOffset 4 height 17.00: "t" - chunk 1 (middle anchor, vertical) text run 3 at (26.23,19.24) startOffset 4 endOffset 5 height 17.00: " " + chunk 1 (middle anchor, vertical) text run 3 at (26.23,19.23) startOffset 4 endOffset 5 height 17.00: " " LayoutSVGTSpan {tspan} at (0,0) size 25x24 LayoutSVGInlineText {#text} at (5,0) size 24x24 chunk 1 (middle anchor, vertical) text run 1 at (30.62,15.64) startOffset 0 endOffset 1 height 17.00: "o" chunk 1 (middle anchor, vertical) text run 2 at (36.89,11.56) startOffset 1 endOffset 2 height 17.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 35x43 LayoutSVGInlineText {#text} at (27,6) size 42x35 - chunk 1 (middle anchor, vertical) text run 1 at (42.11,9.45) startOffset 0 endOffset 1 height 17.00: " " + chunk 1 (middle anchor, vertical) text run 1 at (42.12,9.45) startOffset 0 endOffset 1 height 17.00: " " chunk 1 (middle anchor, vertical) text run 2 at (47.25,8.79) startOffset 1 endOffset 2 height 17.00: "a" chunk 1 (middle anchor, vertical) text run 3 at (52.27,9.77) startOffset 2 endOffset 3 height 17.00: " " chunk 1 (middle anchor, vertical) text run 4 at (57.43,12.72) startOffset 3 endOffset 4 height 17.00: "P" @@ -291,14 +291,14 @@ chunk 1 (vertical) text run 1 at (30.11,46.97) startOffset 0 endOffset 1 height 17.00: "s" chunk 1 (vertical) text run 2 at (31.20,40.47) startOffset 1 endOffset 2 height 17.00: "u" chunk 1 (vertical) text run 3 at (33.92,33.50) startOffset 2 endOffset 3 height 17.00: "p" - chunk 1 (vertical) text run 4 at (37.89,27.64) startOffset 3 endOffset 4 height 17.00: "e" + chunk 1 (vertical) text run 4 at (37.89,27.63) startOffset 3 endOffset 4 height 17.00: "e" chunk 1 (vertical) text run 5 at (42.00,23.52) startOffset 4 endOffset 5 height 17.00: "r" LayoutSVGInlineText {#text} at (26,0) size 33x25 chunk 1 (vertical) text run 1 at (45.48,20.87) startOffset 0 endOffset 1 height 17.00: " " chunk 1 (vertical) text run 2 at (49.97,18.22) startOffset 1 endOffset 2 height 17.00: "a" chunk 1 (vertical) text run 3 at (56.49,15.48) startOffset 2 endOffset 3 height 17.00: "n" chunk 1 (vertical) text run 4 at (63.74,13.56) startOffset 3 endOffset 4 height 17.00: "d" - chunk 1 (vertical) text run 5 at (69.32,12.77) startOffset 4 endOffset 5 height 17.00: " " + chunk 1 (vertical) text run 5 at (69.33,12.77) startOffset 4 endOffset 5 height 17.00: " " LayoutSVGTSpan {tspan} at (0,0) size 20x21 LayoutSVGInlineText {#text} at (58,8) size 21x19 chunk 1 (vertical) text run 1 at (74.12,12.51) startOffset 0 endOffset 1 height 17.00: "s" @@ -306,10 +306,10 @@ chunk 1 (vertical) text run 3 at (88.21,13.97) startOffset 2 endOffset 3 height 17.00: "b" LayoutSVGInlineText {#text} at (76,2) size 39x37 chunk 1 (vertical) text run 1 at (94.61,15.86) startOffset 0 endOffset 1 height 17.00: "s" - chunk 1 (vertical) text run 2 at (100.32,18.38) startOffset 1 endOffset 2 height 17.00: "c" + chunk 1 (vertical) text run 2 at (100.33,18.38) startOffset 1 endOffset 2 height 17.00: "c" chunk 1 (vertical) text run 3 at (105.30,21.41) startOffset 2 endOffset 3 height 17.00: "r" - chunk 1 (vertical) text run 4 at (108.87,24.28) startOffset 3 endOffset 4 height 17.00: "i" - chunk 1 (vertical) text run 5 at (112.85,28.53) startOffset 4 endOffset 5 height 17.00: "p" + chunk 1 (vertical) text run 4 at (108.88,24.28) startOffset 3 endOffset 4 height 17.00: "i" + chunk 1 (vertical) text run 5 at (112.85,28.54) startOffset 4 endOffset 5 height 17.00: "p" chunk 1 (vertical) text run 6 at (116.05,33.43) startOffset 5 endOffset 6 height 17.00: "t" chunk 1 (vertical) text run 7 at (118.03,37.97) startOffset 6 endOffset 7 height 17.00: "s" LayoutSVGInlineText {#text} at (0,0) size 0x0 @@ -334,22 +334,22 @@ chunk 1 (vertical) text run 3 at (34.32,32.76) startOffset 2 endOffset 3 height 17.00: "s" chunk 1 (vertical) text run 4 at (37.10,28.60) startOffset 3 endOffset 4 height 17.00: "i" chunk 1 (vertical) text run 5 at (39.86,25.49) startOffset 4 endOffset 5 height 17.00: "t" - chunk 1 (vertical) text run 6 at (42.97,22.71) startOffset 5 endOffset 6 height 17.00: "i" + chunk 1 (vertical) text run 6 at (42.98,22.71) startOffset 5 endOffset 6 height 17.00: "i" chunk 1 (vertical) text run 7 at (47.78,19.42) startOffset 6 endOffset 7 height 17.00: "v" chunk 1 (vertical) text run 8 at (54.15,16.33) startOffset 7 endOffset 8 height 17.00: "e" LayoutSVGInlineText {#text} at (36,0) size 33x20 chunk 1 (vertical) text run 1 at (59.10,14.66) startOffset 0 endOffset 1 height 17.00: " " chunk 1 (vertical) text run 2 at (64.17,13.48) startOffset 1 endOffset 2 height 17.00: "a" chunk 1 (vertical) text run 3 at (71.20,12.62) startOffset 2 endOffset 3 height 17.00: "n" - chunk 1 (vertical) text run 4 at (78.71,12.61) startOffset 3 endOffset 4 height 17.00: "d" + chunk 1 (vertical) text run 4 at (78.72,12.61) startOffset 3 endOffset 4 height 17.00: "d" chunk 1 (vertical) text run 5 at (84.31,13.22) startOffset 4 endOffset 5 height 17.00: " " LayoutSVGTSpan {tspan} at (0,0) size 42x43 LayoutSVGInlineText {#text} at (64,4) size 43x41 chunk 1 (vertical) text run 1 at (89.83,14.37) startOffset 0 endOffset 1 height 17.00: "n" chunk 1 (vertical) text run 2 at (96.55,16.62) startOffset 1 endOffset 2 height 17.00: "e" chunk 1 (vertical) text run 3 at (102.87,19.81) startOffset 2 endOffset 3 height 17.00: "g" - chunk 1 (vertical) text run 4 at (108.56,24.00) startOffset 3 endOffset 4 height 17.00: "a" - chunk 1 (vertical) text run 5 at (112.32,27.88) startOffset 4 endOffset 5 height 17.00: "t" + chunk 1 (vertical) text run 4 at (108.56,24.01) startOffset 3 endOffset 4 height 17.00: "a" + chunk 1 (vertical) text run 5 at (112.32,27.89) startOffset 4 endOffset 5 height 17.00: "t" chunk 1 (vertical) text run 6 at (114.77,31.25) startOffset 5 endOffset 6 height 17.00: "i" chunk 1 (vertical) text run 7 at (117.44,36.40) startOffset 6 endOffset 7 height 17.00: "v" chunk 1 (vertical) text run 8 at (119.40,43.18) startOffset 7 endOffset 8 height 17.00: "e" @@ -380,12 +380,12 @@ chunk 1 (vertical) text run 12 at (3.50,70.51) startOffset 11 endOffset 12 height 22.67: " " LayoutSVGTextPath {textPath} at (0,0) size 42x61 LayoutSVGInlineText {#text} at (24,21) size 60x42 - chunk 1 (vertical) text run 1 at (34.40,32.61) startOffset 0 endOffset 1 height 22.67: "o" + chunk 1 (vertical) text run 1 at (34.41,32.61) startOffset 0 endOffset 1 height 22.67: "o" chunk 1 (vertical) text run 2 at (40.58,24.79) startOffset 1 endOffset 2 height 22.67: "n" - chunk 1 (vertical) text run 3 at (46.50,20.21) startOffset 2 endOffset 3 height 22.67: " " - chunk 1 (vertical) text run 4 at (53.15,16.74) startOffset 3 endOffset 4 height 22.67: "p" + chunk 1 (vertical) text run 3 at (46.50,20.20) startOffset 2 endOffset 3 height 22.67: " " + chunk 1 (vertical) text run 4 at (53.16,16.74) startOffset 3 endOffset 4 height 22.67: "p" chunk 1 (vertical) text run 5 at (62.15,13.89) startOffset 4 endOffset 5 height 22.67: "a" - chunk 1 (vertical) text run 6 at (69.29,12.77) startOffset 5 endOffset 6 height 22.67: "t" + chunk 1 (vertical) text run 6 at (69.30,12.77) startOffset 5 endOffset 6 height 22.67: "t" chunk 1 (vertical) text run 7 at (77.08,12.54) startOffset 6 endOffset 7 height 22.67: "h" LayoutSVGInlineText {#text} at (67,42) size 23x77 chunk 1 (vertical) text run 1 at (70.58,22.54) startOffset 0 endOffset 1 height 22.67: "a"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/text-match-highlight-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/text-match-highlight-expected.png index 296af63..0a321c3 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/text-match-highlight-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/text-match-highlight-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/text-match-highlight-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/text-match-highlight-expected.txt index 7341035..98b075f 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/text-match-highlight-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/text-match-highlight-expected.txt
@@ -51,38 +51,38 @@ LayoutSVGText {text} at (69,14) size 663x238 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 662x238 LayoutSVGInlineText {#text} at (0,0) size 662x238 - chunk 1 text run 1 at (108.68,191.33) startOffset 0 endOffset 1 width 24.43: "F" - chunk 1 text run 2 at (121.50,178.57) startOffset 1 endOffset 2 width 11.66: "i" - chunk 1 text run 3 at (135.20,165.12) startOffset 2 endOffset 3 width 26.89: "n" - chunk 1 text run 4 at (154.50,146.70) startOffset 3 endOffset 4 width 26.48: "d" - chunk 1 text run 5 at (179.76,124.00) startOffset 4 endOffset 5 width 41.34: "m" - chunk 1 text run 6 at (205.72,103.04) startOffset 5 endOffset 6 width 25.32: "e" - chunk 1 text run 7 at (222.14,91.36) startOffset 6 endOffset 7 width 14.94: " " + chunk 1 text run 1 at (108.68,191.32) startOffset 0 endOffset 1 width 24.43: "F" + chunk 1 text run 2 at (121.51,178.57) startOffset 1 endOffset 2 width 11.66: "i" + chunk 1 text run 3 at (135.21,165.11) startOffset 2 endOffset 3 width 26.89: "n" + chunk 1 text run 4 at (154.51,146.69) startOffset 3 endOffset 4 width 26.48: "d" + chunk 1 text run 5 at (179.77,123.99) startOffset 4 endOffset 5 width 41.34: "m" + chunk 1 text run 6 at (205.72,103.03) startOffset 5 endOffset 6 width 25.32: "e" + chunk 1 text run 7 at (222.14,91.35) startOffset 6 endOffset 7 width 14.94: " " chunk 1 text run 8 at (239.46,80.63) startOffset 7 endOffset 8 width 25.79: "o" chunk 1 text run 9 at (263.08,69.05) startOffset 8 endOffset 9 width 26.89: "n" - chunk 1 text run 10 at (282.88,62.43) startOffset 9 endOffset 10 width 14.94: " " + chunk 1 text run 10 at (282.89,62.42) startOffset 9 endOffset 10 width 14.94: " " chunk 1 text run 11 at (302.75,58.99) startOffset 10 endOffset 11 width 25.52: "a" chunk 1 text run 12 at (322.94,59.14) startOffset 11 endOffset 12 width 14.94: " " chunk 1 text run 13 at (343.19,63.35) startOffset 12 endOffset 13 width 26.48: "p" chunk 1 text run 14 at (366.84,73.90) startOffset 13 endOffset 14 width 25.52: "a" - chunk 1 text run 15 at (384.24,85.86) startOffset 14 endOffset 15 width 16.75: "t" + chunk 1 text run 15 at (384.24,85.87) startOffset 14 endOffset 15 width 16.75: "t" chunk 1 text run 16 at (400.51,100.51) startOffset 15 endOffset 16 width 26.89: "h" chunk 1 text run 17 at (416.01,115.98) startOffset 16 endOffset 17 width 16.73: "!" - chunk 1 text run 18 at (427.26,127.11) startOffset 17 endOffset 18 width 14.94: " " - chunk 1 text run 19 at (444.34,143.69) startOffset 18 endOffset 19 width 32.75: "D" - chunk 1 text run 20 at (460.53,158.89) startOffset 19 endOffset 20 width 11.66: "i" - chunk 1 text run 21 at (474.68,171.60) startOffset 20 endOffset 21 width 26.48: "d" - chunk 1 text run 22 at (490.52,185.03) startOffset 21 endOffset 22 width 14.94: " " + chunk 1 text run 18 at (427.27,127.12) startOffset 17 endOffset 18 width 14.94: " " + chunk 1 text run 19 at (444.35,143.70) startOffset 18 endOffset 19 width 32.75: "D" + chunk 1 text run 20 at (460.54,158.90) startOffset 19 endOffset 20 width 11.66: "i" + chunk 1 text run 21 at (474.69,171.60) startOffset 20 endOffset 21 width 26.48: "d" + chunk 1 text run 22 at (490.53,185.03) startOffset 21 endOffset 22 width 14.94: " " chunk 1 text run 23 at (506.34,197.43) startOffset 22 endOffset 23 width 25.15: "y" - chunk 1 text run 24 at (527.23,211.97) startOffset 23 endOffset 24 width 25.79: "o" + chunk 1 text run 24 at (527.23,211.98) startOffset 23 endOffset 24 width 25.79: "o" chunk 1 text run 25 at (550.02,225.01) startOffset 24 endOffset 25 width 26.89: "u" chunk 1 text run 26 at (569.22,233.33) startOffset 25 endOffset 26 width 14.94: " " - chunk 1 text run 27 at (583.55,237.74) startOffset 26 endOffset 27 width 14.94: "f" + chunk 1 text run 27 at (583.56,237.75) startOffset 26 endOffset 27 width 14.94: "f" chunk 1 text run 28 at (596.55,240.30) startOffset 27 endOffset 28 width 11.66: "i" - chunk 1 text run 29 at (615.77,241.36) startOffset 28 endOffset 29 width 26.89: "n" + chunk 1 text run 29 at (615.78,241.36) startOffset 28 endOffset 29 width 26.89: "n" chunk 1 text run 30 at (642.02,237.01) startOffset 29 endOffset 30 width 26.48: "d" chunk 1 text run 31 at (672.58,222.56) startOffset 30 endOffset 31 width 41.34: "m" chunk 1 text run 32 at (698.38,201.60) startOffset 31 endOffset 32 width 25.32: "e" - chunk 1 text run 33 at (716.05,184.78) startOffset 32 endOffset 33 width 23.18: "?" + chunk 1 text run 33 at (716.06,184.77) startOffset 32 endOffset 33 width 23.18: "?" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/viewbox-syntax-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/viewbox-syntax-expected.txt index 3ccb6213..a01fd30 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/viewbox-syntax-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/viewbox-syntax-expected.txt
@@ -1,13 +1,13 @@ -CONSOLE ERROR: line 20: Error: Invalid value for <svg> attribute viewBox="0" -CONSOLE ERROR: line 23: Error: Invalid value for <svg> attribute viewBox="0 0" -CONSOLE ERROR: line 26: Error: Invalid value for <svg> attribute viewBox="0 0 30" -CONSOLE ERROR: line 29: Error: Invalid value for <svg> attribute viewBox="0 0 30 40 50" -CONSOLE ERROR: line 32: Error: Invalid value for <svg> attribute viewBox="0 0 30 40," -CONSOLE ERROR: line 35: Error: Invalid value for <svg> attribute viewBox=",0 0 30 40" +CONSOLE ERROR: line 20: Error: <svg> attribute viewBox: Unexpected end of attribute. Expected number, "0". +CONSOLE ERROR: line 23: Error: <svg> attribute viewBox: Unexpected end of attribute. Expected number, "0 0". +CONSOLE ERROR: line 26: Error: <svg> attribute viewBox: Unexpected end of attribute. Expected number, "0 0 30". +CONSOLE ERROR: line 29: Error: <svg> attribute viewBox: Trailing garbage, "0 0 30 40 50". +CONSOLE ERROR: line 32: Error: <svg> attribute viewBox: Trailing garbage, "0 0 30 40,". +CONSOLE ERROR: line 35: Error: <svg> attribute viewBox: Expected number, ",0 0 30 40". CONSOLE ERROR: line 38: Error: <svg> attribute viewBox: A negative value is not valid. ("0 0 -30 40") CONSOLE ERROR: line 41: Error: <svg> attribute viewBox: A negative value is not valid. ("0 0 30 -40") -CONSOLE ERROR: line 44: Error: Invalid value for <svg> attribute viewBox="0 0 30, , 40" -CONSOLE ERROR: line 47: Error: Invalid value for <svg> attribute viewBox="0 0 30% 40" +CONSOLE ERROR: line 44: Error: <svg> attribute viewBox: Expected number, "0 0 30, , 40". +CONSOLE ERROR: line 47: Error: <svg> attribute viewBox: Expected number, "0 0 30% 40". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/bbox-with-glyph-overflow-on-path-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/text/bbox-with-glyph-overflow-on-path-expected.txt index 7572bc7..9c42a9c 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/bbox-with-glyph-overflow-on-path-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/bbox-with-glyph-overflow-on-path-expected.txt
@@ -27,7 +27,7 @@ chunk 1 text run 10 at (181.97,100.00) startOffset 9 endOffset 10 width 13.89: "f" chunk 1 text run 11 at (195.86,100.00) startOffset 10 endOffset 11 width 13.89: "f" chunk 1 text run 12 at (209.75,100.00) startOffset 11 endOffset 12 width 13.89: "f" - chunk 1 text run 13 at (223.64,100.00) startOffset 12 endOffset 13 width 13.89: "f" + chunk 1 text run 13 at (223.65,100.00) startOffset 12 endOffset 13 width 13.89: "f" chunk 1 text run 14 at (237.54,100.00) startOffset 13 endOffset 14 width 13.89: "f" chunk 1 text run 15 at (251.43,100.00) startOffset 14 endOffset 15 width 13.89: "f" chunk 1 text run 16 at (265.32,100.00) startOffset 15 endOffset 16 width 13.89: "f" @@ -55,7 +55,7 @@ chunk 1 text run 10 at (268.03,150.00) startOffset 9 endOffset 10 width 13.89: "f" chunk 1 text run 11 at (254.14,150.00) startOffset 10 endOffset 11 width 13.89: "f" chunk 1 text run 12 at (240.25,150.00) startOffset 11 endOffset 12 width 13.89: "f" - chunk 1 text run 13 at (226.36,150.00) startOffset 12 endOffset 13 width 13.89: "f" + chunk 1 text run 13 at (226.35,150.00) startOffset 12 endOffset 13 width 13.89: "f" chunk 1 text run 14 at (212.46,150.00) startOffset 13 endOffset 14 width 13.89: "f" chunk 1 text run 15 at (198.57,150.00) startOffset 14 endOffset 15 width 13.89: "f" chunk 1 text run 16 at (184.68,150.00) startOffset 15 endOffset 16 width 13.89: "f"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/text-selection-align-04-b-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/text/text-selection-align-04-b-expected.txt index 7599650..745128c4 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/text-selection-align-04-b-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/text-selection-align-04-b-expected.txt
@@ -38,7 +38,7 @@ chunk 1 (end anchor) text run 4 at (46.54,260.00) startOffset 15 endOffset 16 width 16.68: "d" chunk 1 (end anchor) text run 5 at (59.05,260.00) startOffset 16 endOffset 17 width 8.33: " " chunk 1 (end anchor) text run 6 at (67.39,260.00) startOffset 17 endOffset 18 width 8.33: "t" - chunk 1 (end anchor) text run 7 at (79.89,260.00) startOffset 18 endOffset 19 width 16.68: "e" + chunk 1 (end anchor) text run 7 at (79.90,260.00) startOffset 18 endOffset 19 width 16.68: "e" chunk 1 (end anchor) text run 8 at (95.74,260.00) startOffset 19 endOffset 20 width 15.00: "x" chunk 1 (end anchor) text run 9 at (107.40,260.00) startOffset 20 endOffset 21 width 8.33: "t" chunk 1 (end anchor) text run 10 at (115.74,260.00) startOffset 21 endOffset 22 width 8.33: " "
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/text-selection-path-01-b-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/text/text-selection-path-01-b-expected.png index 388c8f9..d33a3f7 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/text-selection-path-01-b-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/text-selection-path-01-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/text/text-selection-path-01-b-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/text/text-selection-path-01-b-expected.txt index 4c459b2a..108f74d8b 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/text/text-selection-path-01-b-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/text/text-selection-path-01-b-expected.txt
@@ -14,9 +14,9 @@ LayoutSVGTextPath {textPath} at (0,0) size 205x120 LayoutSVGInlineText {#text} at (0,0) size 205x120 chunk 1 text run 1 at (203.08,78.99) startOffset 0 endOffset 1 width 22.27: "T" - chunk 1 text run 2 at (212.32,61.50) startOffset 1 endOffset 2 width 17.40: "e" - chunk 1 text run 3 at (222.73,46.94) startOffset 2 endOffset 3 width 18.18: "x" - chunk 1 text run 4 at (233.61,36.17) startOffset 3 endOffset 4 width 12.43: "t" + chunk 1 text run 2 at (212.33,61.49) startOffset 1 endOffset 2 width 17.40: "e" + chunk 1 text run 3 at (222.74,46.94) startOffset 2 endOffset 3 width 18.18: "x" + chunk 1 text run 4 at (233.62,36.17) startOffset 3 endOffset 4 width 12.43: "t" chunk 1 text run 5 at (242.47,30.46) startOffset 4 endOffset 5 width 8.68: " " chunk 1 text run 6 at (255.95,26.99) startOffset 5 endOffset 6 width 19.41: "o" chunk 1 text run 7 at (274.98,33.23) startOffset 6 endOffset 7 width 21.27: "n" @@ -35,18 +35,18 @@ LayoutSVGTextPath {textPath} at (0,0) size 216x120 LayoutSVGTSpan {tspan} at (0,0) size 56x58 LayoutSVGInlineText {#text} at (0,36) size 56x57 - chunk 1 text run 1 at (37.54,135.48) startOffset 0 endOffset 1 width 22.27: "T" + chunk 1 text run 1 at (37.54,135.47) startOffset 0 endOffset 1 width 22.27: "T" chunk 1 text run 2 at (46.77,117.97) startOffset 1 endOffset 2 width 17.40: "e" LayoutSVGTSpan {tspan} at (0,0) size 44x42 LayoutSVGInlineText {#text} at (34,24) size 43x41 chunk 1 text run 1 at (57.18,103.42) startOffset 0 endOffset 1 width 18.18: "x" LayoutSVGInlineText {#text} at (50,0) size 166x120 chunk 1 text run 1 at (68.07,92.65) startOffset 0 endOffset 1 width 12.43: "t" - chunk 1 text run 2 at (76.93,86.96) startOffset 1 endOffset 2 width 8.68: " " + chunk 1 text run 2 at (76.93,86.95) startOffset 1 endOffset 2 width 8.68: " " chunk 1 text run 3 at (90.41,83.48) startOffset 2 endOffset 3 width 19.41: "o" chunk 1 text run 4 at (109.45,89.71) startOffset 3 endOffset 4 width 21.27: "n" chunk 1 text run 5 at (120.62,99.55) startOffset 4 endOffset 5 width 8.68: " " - chunk 1 text run 6 at (129.32,109.91) startOffset 5 endOffset 6 width 18.14: "a" + chunk 1 text run 6 at (129.32,109.92) startOffset 5 endOffset 6 width 18.14: "a" chunk 1 text run 7 at (137.43,120.71) startOffset 6 endOffset 7 width 8.68: " " chunk 1 text run 8 at (146.41,132.09) startOffset 7 endOffset 8 width 20.57: "p" chunk 1 text run 9 at (160.55,145.31) startOffset 8 endOffset 9 width 18.14: "a" @@ -63,7 +63,7 @@ LayoutSVGContainer {g} at (188,352) size 501x134 LayoutSVGContainer {use} at (188,385) size 501x7 LayoutSVGPath {path} at (188,385) size 501x7 [stroke={[type=SOLID] [color=#0000FF] [stroke width=4.00]}] [data="M 113 233 L 413 233"] - LayoutSVGText {text} at (211,211) size 180x27 contains 1 chunk(s) + LayoutSVGText {text} at (212,211) size 179x27 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 179x27 LayoutSVGInlineText {#text} at (0,0) size 179x27 chunk 1 text run 1 at (219.33,233.00) startOffset 0 endOffset 1 width 14.66: "T"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/animated-path-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/animated-path-inside-transformed-html-expected.png index 558c1868..bbff6ac3 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/animated-path-inside-transformed-html-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/animated-path-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/svg-css-transforms-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/svg-css-transforms-expected.png index be799eb..10ee9ef4 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/svg-css-transforms-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/svg-css-transforms-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-inside-transformed-html-expected.png index 7af9deb..08b2abf 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-inside-transformed-html-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/tables/mozilla/bugs/bug46368-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac/tables/mozilla/bugs/bug46368-1-expected.png index e6b7c7e5..cc17f0e3 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/tables/mozilla/bugs/bug46368-1-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/tables/mozilla/bugs/bug46368-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/tables/mozilla/bugs/bug46368-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac/tables/mozilla/bugs/bug46368-2-expected.png index 03ec250..4da92474 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/tables/mozilla/bugs/bug46368-2-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/tables/mozilla/bugs/bug46368-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/tables/mozilla/dom/tableDom-expected.png b/third_party/WebKit/LayoutTests/platform/mac/tables/mozilla/dom/tableDom-expected.png index ec4d0b9..f5a5969 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/tables/mozilla/dom/tableDom-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/tables/mozilla/dom/tableDom-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/transforms/svg-vs-css-expected.png b/third_party/WebKit/LayoutTests/platform/mac/transforms/svg-vs-css-expected.png index 53d0e862..9575f00d 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/transforms/svg-vs-css-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/transforms/svg-vs-css-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png index 9d5592a..3645861a 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/threaded/printing/ellipsis-printing-style-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/threaded/printing/ellipsis-printing-style-expected.png new file mode 100644 index 0000000..8501bb75 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/threaded/printing/ellipsis-printing-style-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/threaded/printing/iframe-print-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/threaded/printing/iframe-print-expected.png new file mode 100644 index 0000000..c0919334 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/threaded/printing/iframe-print-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/css3/filters/effect-reference-composite-expected.txt b/third_party/WebKit/LayoutTests/platform/win/css3/filters/effect-reference-composite-expected.txt index 1af6712..1d6da6a6 100644 --- a/third_party/WebKit/LayoutTests/platform/win/css3/filters/effect-reference-composite-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/css3/filters/effect-reference-composite-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 61: Error: Invalid value for <feComposite> attribute y="20\"" +CONSOLE ERROR: line 61: Error: <feComposite> attribute y: Expected length, "20\"". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/platform/win/css3/filters/effect-reference-composite-hw-expected.txt b/third_party/WebKit/LayoutTests/platform/win/css3/filters/effect-reference-composite-hw-expected.txt index 1af6712..1d6da6a6 100644 --- a/third_party/WebKit/LayoutTests/platform/win/css3/filters/effect-reference-composite-hw-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/css3/filters/effect-reference-composite-hw-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 61: Error: Invalid value for <feComposite> attribute y="20\"" +CONSOLE ERROR: line 61: Error: <feComposite> attribute y: Expected length, "20\"". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-image-outset-split-inline-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-image-outset-split-inline-expected.png index d65ed14..5f9c2b9 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-image-outset-split-inline-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-image-outset-split-inline-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-radius-percent-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-radius-percent-expected.png index 86072e1..a4a3d68 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-radius-percent-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-radius-percent-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png index d529ecd..54e9bf54 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/css/resize-corner-tracking-transformed-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/css/resize-corner-tracking-transformed-expected.png index 8e70f6f..f9690a8 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/css/resize-corner-tracking-transformed-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/css/resize-corner-tracking-transformed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/placeholder-position-expected.png index bda7e24..0e83318 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/placeholder-position-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/placeholder-position-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/placeholder-position-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/forms/placeholder-position-expected.txt index 34e6a5f..20faa0d 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/placeholder-position-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/placeholder-position-expected.txt
@@ -7,9 +7,19 @@ LayoutFlexibleBox {DIV} at (3,3) size 169x16 LayoutBlockFlow {DIV} at (0,2.50) size 1x11 LayoutBlockFlow {DIV} at (1,0) size 155x16 - LayoutBR {BR} at (175,16) size 0x0 - LayoutTextControl {INPUT} at (0,22) size 173x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutBR {BR} at (173,38) size 0x0 + LayoutText {#text} at (175,2) size 4x17 + text run at (175,2) width 4: " " + LayoutBR {BR} at (179,16) size 0x0 + LayoutTextControl {INPUT} at (0,22) size 103x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (103,24) size 4x17 + text run at (103,24) width 4: " " + LayoutTextControl {INPUT} at (107,22) size 103x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (210,24) size 4x17 + text run at (210,24) width 4: " " + LayoutTextControl {INPUT} at (214,22) size 173x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (387,24) size 4x17 + text run at (387,24) width 4: " " + LayoutBR {BR} at (391,38) size 0x0 LayoutTextControl {INPUT} at (0,44) size 175x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (3,3) size 169x16 LayoutBlockFlow {DIV} at (0,2.50) size 1x11 @@ -32,7 +42,13 @@ LayoutTextControl {INPUT} at (177,248) size 173x31 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (350,254) size 4x17 text run at (350,254) width 4: " " - LayoutBR {BR} at (354,268) size 0x0 + LayoutTextControl {INPUT} at (354,251) size 173x25 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (527,254) size 4x17 + text run at (527,254) width 4: " " + LayoutTextControl {INPUT} at (531,251) size 173x25 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (704,254) size 4x17 + text run at (704,254) width 4: " " + LayoutBR {BR} at (0,0) size 0x0 LayoutTextControl {INPUT} at (0,279) size 173x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (173,281) size 4x17 text run at (173,281) width 4: " " @@ -50,11 +66,23 @@ text run at (0,0) width 66: "placeholder" layer at (12,11) size 155x16 LayoutBlockFlow {DIV} at (0,0) size 155x16 -layer at (10,33) size 169x16 - LayoutBlockFlow {DIV} at (2,3) size 169x16 [color=#A9A9A9] +layer at (10,33) size 99x16 + LayoutBlockFlow {DIV} at (2,3) size 99x16 [color=#A9A9A9] LayoutText {#text} at (0,0) size 66x16 text run at (0,0) width 66: "placeholder" -layer at (10,33) size 169x16 +layer at (10,33) size 99x16 + LayoutBlockFlow {DIV} at (2,3) size 99x16 +layer at (117,35) size 99x13 scrollHeight 14 + LayoutBlockFlow {DIV} at (2,5) size 99x13 [color=#A9A9A9] + LayoutText {#text} at (0,-2) size 66x16 + text run at (0,-2) width 66: "placeholder" +layer at (117,33) size 99x16 + LayoutBlockFlow {DIV} at (2,3) size 99x16 +layer at (224,33) size 169x16 + LayoutBlockFlow {DIV} at (2,3) size 169x16 [color=#A9A9A9] + LayoutText {#text} at (0,0) size 105x16 + text run at (0,0) width 105: "\x{65E5}\x{672C}\x{8A9E}placeholder" +layer at (224,33) size 169x16 LayoutBlockFlow {DIV} at (2,3) size 169x16 layer at (12,55) size 155x16 LayoutBlockFlow {DIV} at (4,3) size 155x16 [color=#A9A9A9] @@ -102,6 +130,18 @@ text run at (0,4) width 66: "placeholder" layer at (187,259) size 169x25 LayoutBlockFlow {DIV} at (2,3) size 169x25 +layer at (364,264) size 169x16 + LayoutBlockFlow {DIV} at (2,4.50) size 169x16 [color=#A9A9A9] + LayoutText {#text} at (0,0) size 66x16 + text run at (0,0) width 66: "placeholder" +layer at (364,264) size 169x16 + LayoutBlockFlow {DIV} at (2,4.50) size 169x16 +layer at (541,260) size 169x25 + LayoutBlockFlow {DIV} at (2,0.50) size 169x25 [color=#A9A9A9] + LayoutText {#text} at (0,4) size 66x16 + text run at (0,4) width 66: "placeholder" +layer at (541,264) size 169x16 + LayoutBlockFlow {DIV} at (2,4.50) size 169x16 layer at (10,290) size 169x16 LayoutBlockFlow {DIV} at (2,3) size 169x16 LayoutText {#text} at (68,0) size 33x16
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/search/search-vertical-alignment-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/search/search-vertical-alignment-expected.png index 406f8d4..6b1cd174 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/search/search-vertical-alignment-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/search/search-vertical-alignment-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/search/search-vertical-alignment-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/forms/search/search-vertical-alignment-expected.txt index f668b7a..c5ed996 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/search/search-vertical-alignment-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/search/search-vertical-alignment-expected.txt
@@ -28,14 +28,14 @@ text run at (175,0) width 4: " " LayoutTextControl {INPUT} at (179,1) size 173x16 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 - LayoutBlockFlow {P} at (0,147) size 784x20 - LayoutTextControl {INPUT} at (0,0) size 175x12 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutBlockFlow {P} at (0,147) size 784x18 + LayoutTextControl {INPUT} at (0,3) size 175x12 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutFlexibleBox {DIV} at (3,0) size 169x12 LayoutBlockFlow {DIV} at (2,0) size 13x13 - LayoutBlockFlow {DIV} at (18,3) size 138x6 - LayoutText {#text} at (175,2) size 4x17 - text run at (175,2) width 4: " " - LayoutTextControl {INPUT} at (179,0) size 173x12 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutBlockFlow {DIV} at (18,-2) size 138x16 + LayoutText {#text} at (175,0) size 4x17 + text run at (175,0) width 4: " " + LayoutTextControl {INPUT} at (179,3) size 173x12 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 layer at (29,75) size 138x16 LayoutBlockFlow {DIV} at (0,0) size 138x16 @@ -53,17 +53,17 @@ LayoutBlockFlow {DIV} at (2,0) size 169x16 LayoutText {#text} at (0,0) size 24x16 text run at (0,0) width 24: "Text" -layer at (29,158) size 138x6 scrollHeight 16 - LayoutBlockFlow {DIV} at (0,0) size 138x6 +layer at (29,156) size 138x16 + LayoutBlockFlow {DIV} at (0,0) size 138x16 LayoutText {#text} at (0,0) size 24x16 text run at (0,0) width 24: "Text" -layer at (189,158) size 169x6 scrollHeight 16 - LayoutBlockFlow {DIV} at (2,3) size 169x6 +layer at (189,156) size 169x16 + LayoutBlockFlow {DIV} at (2,-2) size 169x16 LayoutText {#text} at (0,0) size 24x16 text run at (0,0) width 24: "Text" layer at (168,78) size 9x9 transparent LayoutBlockFlow {DIV} at (157,15) size 9x9 layer at (168,126) size 9x9 transparent LayoutBlockFlow {DIV} at (157,3.50) size 9x9 -layer at (168,157) size 9x9 transparent +layer at (168,160) size 9x9 transparent LayoutBlockFlow {DIV} at (157,1.50) size 9x9
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-empty-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-empty-expected.png index 9559dfc..83fb40ba 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-empty-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-empty-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-expected.png index 73a143ba..f2aef43 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-long-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-long-expected.png index 745bc3f3..205c54c 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-long-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-long-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-many-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-many-expected.png index aff4a5f..6709cf2 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-many-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-many-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-single-option-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-single-option-expected.png index d60a2ed..fef3a2d7 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-single-option-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-single-option-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-styled-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-styled-expected.png index 08bb24a..c79433a 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-styled-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-styled-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-tall-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-tall-expected.png index fa6c56d..55b815a 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-tall-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-tall-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-texttransform-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-texttransform-expected.png index d54ff724..103a2ed 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-texttransform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-texttransform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-transform-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-transform-expected.png index 4831c034..3b7caa47 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-zoom-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-zoom-expected.png index 02dc55d..369c5661 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-zoom-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-zoom-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-zoom090-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-zoom090-expected.png index 82c05f5..6413e85 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-zoom090-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select-popup/popup-menu-appearance-zoom090-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/text/text-font-height-mismatch-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/text/text-font-height-mismatch-expected.png index da914085..c1d3dcd 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/text/text-font-height-mismatch-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/text/text-font-height-mismatch-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/text/text-font-height-mismatch-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/forms/text/text-font-height-mismatch-expected.txt index 9fca126b..872c9def 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/text/text-font-height-mismatch-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/text/text-font-height-mismatch-expected.txt
@@ -8,6 +8,7 @@ text run at (0,0) width 273: "Editable text should be centered vertically." LayoutBlockFlow {DIV} at (0,34) size 784x28 LayoutTextControl {INPUT} at (0,0) size 236x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)] + LayoutTextControl {INPUT} at (236,0) size 236x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (0,62) size 784x28 LayoutTextControl {INPUT} at (0,0) size 294x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (0,90) size 784x28 @@ -16,6 +17,10 @@ LayoutBlockFlow {DIV} at (1,0.50) size 234x27 LayoutText {#text} at (0,0) size 74x24 text run at (0,0) width 74: "\x{3075} ABCgjy" +layer at (245,51) size 234x27 + LayoutBlockFlow {DIV} at (1,0.50) size 234x27 + LayoutText {#text} at (0,0) size 74x24 + text run at (0,0) width 74: "\x{3075} ABCgjy" layer at (9,78) size 292x28 LayoutBlockFlow {DIV} at (1,0) size 292x28 LayoutText {#text} at (0,0) size 81x27
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/text/textfield-overflow-by-value-update-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/forms/text/textfield-overflow-by-value-update-expected.txt index cdcc31d..3e8f25e5 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/text/textfield-overflow-by-value-update-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/text/textfield-overflow-by-value-update-expected.txt
@@ -1,12 +1,12 @@ layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x50 - LayoutBlockFlow {HTML} at (0,0) size 800x50 - LayoutBlockFlow {BODY} at (8,8) size 784x34 - LayoutTextControl {INPUT} at (0,0) size 100x2 [bgcolor=#FFFFFF] +layer at (0,0) size 800x34 + LayoutBlockFlow {HTML} at (0,0) size 800x34 + LayoutBlockFlow {BODY} at (8,8) size 784x18 + LayoutTextControl {INPUT} at (0,3) size 100x2 [bgcolor=#FFFFFF] LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 -layer at (8,9) size 100x0 scrollHeight 37 - LayoutBlockFlow {DIV} at (0,1) size 100x0 +layer at (8,-6) size 100x37 backgroundClip at (8,0) size 100x31 clip at (8,0) size 100x31 + LayoutBlockFlow {DIV} at (0,-17.50) size 100x37 LayoutText {#text} at (0,0) size 66x36 text run at (0,0) width 66: "FAIL"
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/text/textfield-overflow-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/forms/text/textfield-overflow-expected.txt index 2bd07e2..bd79c042 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/text/textfield-overflow-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/text/textfield-overflow-expected.txt
@@ -6,6 +6,6 @@ LayoutTextControl {INPUT} at (0,0) size 173x10 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0 -layer at (10,11) size 169x4 scrollHeight 16 - LayoutBlockFlow {DIV} at (2,3) size 169x4 +layer at (10,5) size 169x16 + LayoutBlockFlow {DIV} at (2,-3) size 169x16 caret: position 0 of child 0 {DIV} of {#document-fragment} of child 1 {INPUT} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/overflow/overflow-update-transform-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/overflow/overflow-update-transform-expected.png index 3ff86449..9e66461f 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/overflow/overflow-update-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/overflow/overflow-update-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/repaint/change-text-content-and-background-color-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/repaint/change-text-content-and-background-color-expected.txt index eb4bcb1b..d1c5dea 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/repaint/change-text-content-and-background-color-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/fast/repaint/change-text-content-and-background-color-expected.txt
@@ -6,17 +6,16 @@ "contentsOpaque": true, "drawsContent": true, "repaintRects": [ - [30, 30, 200, 23], + [30, 30, 200, 22], [30, 30, 47, 22], [30, 30, 42, 22], [8, 8, 244, 67] ], "paintInvalidationClients": [ - "RootInlineBox", "InlineTextBox ''", + "RootInlineBox", "LayoutTextControl (positioned) INPUT id='input'", "LayoutBlockFlow DIV id='inner-editor'", - "RootInlineBox", "LayoutText #text", "InlineTextBox 'NEW'" ]
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/repaint/multi-layout-one-frame-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/repaint/multi-layout-one-frame-expected.txt index aa3a972..e11c0b7 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/repaint/multi-layout-one-frame-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/fast/repaint/multi-layout-one-frame-expected.txt
@@ -14,16 +14,14 @@ [10, 11, 45, 16] ], "paintInvalidationClients": [ - "RootInlineBox", "InlineTextBox ''", "RootInlineBox", "InlineTextBox ''", + "RootInlineBox", "LayoutBlockFlow DIV id='inner-editor'", - "RootInlineBox", "LayoutText #text", "InlineTextBox 'PASSED'", "LayoutBlockFlow DIV id='inner-editor'", - "RootInlineBox", "LayoutText #text", "InlineTextBox 'PASSED'" ]
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/repaint/subtree-root-skipped-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/repaint/subtree-root-skipped-expected.txt index 12aa261c..88c9f63 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/repaint/subtree-root-skipped-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/fast/repaint/subtree-root-skipped-expected.txt
@@ -13,10 +13,9 @@ [8, 288, 10, 20] ], "paintInvalidationClients": [ - "RootInlineBox", "InlineTextBox ''", - "LayoutBlockFlow DIV id='inner-editor'", "RootInlineBox", + "LayoutBlockFlow DIV id='inner-editor'", "LayoutText #text", "InlineTextBox 'PASS'", "LayoutBlockFlow (positioned) DIV id='div'"
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/replaced/selection-rect-transform-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/replaced/selection-rect-transform-expected.png index 428ef1e3..eb1f7cd 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/replaced/selection-rect-transform-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/replaced/selection-rect-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/table/table-display-types-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/table/table-display-types-expected.png index 5138789..f5b8eff9c 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/table/table-display-types-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/table/table-display-types-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/table/table-display-types-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/table/table-display-types-expected.txt index 04970880..7234c091 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/table/table-display-types-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/fast/table/table-display-types-expected.txt
@@ -3,147 +3,135 @@ layer at (0,0) size 800x600 LayoutBlockFlow {HTML} at (0,0) size 800x600 LayoutBlockFlow {BODY} at (8,10) size 784x582 - LayoutTable {TABLE} at (10,0) size 120x92 [border: (1px solid #000000)] - LayoutTableSection {THEAD} at (1,1) size 118x24 - LayoutTableRow {TR} at (0,2) size 118x20 - LayoutTableCell {TD} at (2,2) size 56x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 46x17 - text run at (1,1) width 46: "Head 1" - LayoutTableCell {TD} at (60,2) size 56x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 46x17 - text run at (1,1) width 46: "Head 2" - LayoutTableSection {TFOOT} at (1,69) size 118x22 - LayoutTableRow {TR} at (0,0) size 118x20 - LayoutTableCell {TD} at (2,0) size 56x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 54x17 - text run at (1,1) width 54: "Footer 1" - LayoutTableCell {TD} at (60,0) size 56x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 54x17 - text run at (1,1) width 54: "Footer 2" - LayoutTableSection {TBODY} at (1,25) size 118x44 - LayoutTableRow {TR} at (0,0) size 118x20 - LayoutTableCell {TD} at (2,0) size 56x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x17 - text run at (1,1) width 39: "Cell 1" - LayoutTableCell {TD} at (60,0) size 56x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x17 - text run at (1,1) width 39: "Cell 2" - LayoutTableRow {TR} at (0,22) size 118x20 - LayoutTableCell {TD} at (2,22) size 56x20 [r=1 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x17 - text run at (1,1) width 39: "Cell 3" - LayoutTableCell {TD} at (60,22) size 56x20 [r=1 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x17 - text run at (1,1) width 39: "Cell 4" + LayoutBlockFlow {TABLE} at (10,0) size 764x92 [border: (1px solid #000000)] + LayoutTable (anonymous) at (1,1) size 118x90 + LayoutTableSection {THEAD} at (0,0) size 118x24 + LayoutTableRow {TR} at (0,2) size 118x20 + LayoutTableCell {TD} at (2,2) size 56x20 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 46x17 + text run at (1,1) width 46: "Head 1" + LayoutTableCell {TD} at (60,2) size 56x20 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 46x17 + text run at (1,1) width 46: "Head 2" + LayoutTableSection {TFOOT} at (0,68) size 118x22 + LayoutTableRow {TR} at (0,0) size 118x20 + LayoutTableCell {TD} at (2,0) size 56x20 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 54x17 + text run at (1,1) width 54: "Footer 1" + LayoutTableCell {TD} at (60,0) size 56x20 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 54x17 + text run at (1,1) width 54: "Footer 2" + LayoutTableSection {TBODY} at (0,24) size 118x44 + LayoutTableRow {TR} at (0,0) size 118x20 + LayoutTableCell {TD} at (2,0) size 56x20 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 39x17 + text run at (1,1) width 39: "Cell 1" + LayoutTableCell {TD} at (60,0) size 56x20 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 39x17 + text run at (1,1) width 39: "Cell 2" + LayoutTableRow {TR} at (0,22) size 118x20 + LayoutTableCell {TD} at (2,22) size 56x20 [r=1 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 39x17 + text run at (1,1) width 39: "Cell 3" + LayoutTableCell {TD} at (60,22) size 56x20 [r=1 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 39x17 + text run at (1,1) width 39: "Cell 4" LayoutBlockFlow {P} at (0,108) size 784x18 LayoutText {#text} at (0,0) size 227x17 text run at (0,0) width 227: "Row groups have display:table-cell" - LayoutTable {TABLE} at (10,142) size 236x60 [border: (1px solid #000000)] - LayoutTableSection (anonymous) at (1,1) size 234x32 - LayoutTableRow (anonymous) at (0,2) size 234x28 - LayoutTableCell {THEAD} at (2,2) size 106x28 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 106x28 - LayoutTableSection (anonymous) at (0,0) size 106x28 - LayoutTableRow (anonymous) at (0,2) size 106x24 - LayoutTableCell {TR} at (2,2) size 102x24 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 102x24 - LayoutTableSection (anonymous) at (0,0) size 102x24 - LayoutTableRow (anonymous) at (0,2) size 102x20 - LayoutTableCell {TD} at (2,2) size 48x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 46x17 - text run at (1,1) width 46: "Head 1" - LayoutTableCell {TD} at (52,2) size 48x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 46x17 - text run at (1,1) width 46: "Head 2" - LayoutTableCell {TFOOT} at (110,2) size 122x28 [r=0 c=1 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 122x28 - LayoutTableSection (anonymous) at (0,0) size 122x28 - LayoutTableRow (anonymous) at (0,2) size 122x24 - LayoutTableCell {TR} at (2,2) size 118x24 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 118x24 - LayoutTableSection (anonymous) at (0,0) size 118x24 - LayoutTableRow (anonymous) at (0,2) size 118x20 - LayoutTableCell {TD} at (2,2) size 56x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 54x17 - text run at (1,1) width 54: "Footer 1" - LayoutTableCell {TD} at (60,2) size 56x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 54x17 - text run at (1,1) width 54: "Footer 2" - LayoutTableSection {TBODY} at (1,33) size 234x26 - LayoutTableRow (anonymous) at (0,0) size 234x24 - LayoutTableCell {TR} at (2,0) size 106x24 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 88x24 - LayoutTableSection (anonymous) at (0,0) size 88x24 - LayoutTableRow (anonymous) at (0,2) size 88x20 - LayoutTableCell {TD} at (2,2) size 41x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x17 - text run at (1,1) width 39: "Cell 1" - LayoutTableCell {TD} at (45,2) size 41x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x17 - text run at (1,1) width 39: "Cell 2" - LayoutTableCell {TR} at (110,0) size 122x24 [r=0 c=1 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 88x24 - LayoutTableSection (anonymous) at (0,0) size 88x24 - LayoutTableRow (anonymous) at (0,2) size 88x20 - LayoutTableCell {TD} at (2,2) size 41x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x17 - text run at (1,1) width 39: "Cell 3" - LayoutTableCell {TD} at (45,2) size 41x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x17 - text run at (1,1) width 39: "Cell 4" - LayoutBlockFlow {P} at (0,218) size 784x18 + LayoutBlockFlow {TABLE} at (10,142) size 764x48 [border: (1px solid #000000)] + LayoutTable (anonymous) at (1,1) size 222x46 + LayoutTableSection (anonymous) at (0,0) size 222x26 + LayoutTableRow (anonymous) at (0,2) size 222x22 + LayoutTableCell {THEAD} at (2,2) size 100x22 [r=0 c=0 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 100x22 + LayoutTableSection (anonymous) at (0,0) size 100x22 + LayoutTableRow (anonymous) at (0,2) size 100x18 + LayoutTableCell {TR} at (2,2) size 96x18 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 48x19 + LayoutText {#text} at (1,0) size 46x17 + text run at (1,0) width 46: "Head 1" + LayoutInline {TD} at (0,0) size 49x19 + LayoutText {#text} at (48,0) size 47x17 + text run at (48,0) width 47: "Head 2" + LayoutTableCell {TFOOT} at (104,2) size 116x22 [r=0 c=1 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 116x22 + LayoutTableSection (anonymous) at (0,0) size 116x22 + LayoutTableRow (anonymous) at (0,2) size 116x18 + LayoutTableCell {TR} at (2,2) size 112x18 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 56x19 + LayoutText {#text} at (1,0) size 54x17 + text run at (1,0) width 54: "Footer 1" + LayoutInline {TD} at (0,0) size 57x19 + LayoutText {#text} at (56,0) size 55x17 + text run at (56,0) width 55: "Footer 2" + LayoutTableSection {TBODY} at (0,26) size 222x20 + LayoutTableRow (anonymous) at (0,0) size 222x18 + LayoutTableCell {TR} at (2,0) size 100x18 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 41x19 + LayoutText {#text} at (1,0) size 39x17 + text run at (1,0) width 39: "Cell 1" + LayoutInline {TD} at (0,0) size 42x19 + LayoutText {#text} at (41,0) size 40x17 + text run at (41,0) width 40: "Cell 2" + LayoutTableCell {TR} at (104,0) size 116x18 [r=0 c=1 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 41x19 + LayoutText {#text} at (1,0) size 39x17 + text run at (1,0) width 39: "Cell 3" + LayoutInline {TD} at (0,0) size 42x19 + LayoutText {#text} at (41,0) size 40x17 + text run at (41,0) width 40: "Cell 4" + LayoutBlockFlow {P} at (0,206) size 784x18 LayoutText {#text} at (0,0) size 203x17 text run at (0,0) width 203: "Row groups have display:block" - LayoutTable {TABLE} at (10,252) size 124x104 [border: (1px solid #000000)] - LayoutTableSection (anonymous) at (1,1) size 122x52 - LayoutTableRow (anonymous) at (0,2) size 122x48 - LayoutTableCell (anonymous) at (2,2) size 118x48 [r=0 c=0 rs=1 cs=1] - LayoutBlockFlow {THEAD} at (0,0) size 118x24 - LayoutBlockFlow {TR} at (0,0) size 118x24 - LayoutTable (anonymous) at (0,0) size 102x24 - LayoutTableSection (anonymous) at (0,0) size 102x24 - LayoutTableRow (anonymous) at (0,2) size 102x20 - LayoutTableCell {TD} at (2,2) size 48x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 46x17 - text run at (1,1) width 46: "Head 1" - LayoutTableCell {TD} at (52,2) size 48x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 46x17 - text run at (1,1) width 46: "Head 2" - LayoutBlockFlow {TFOOT} at (0,24) size 118x24 - LayoutBlockFlow {TR} at (0,0) size 118x24 - LayoutTable (anonymous) at (0,0) size 118x24 - LayoutTableSection (anonymous) at (0,0) size 118x24 - LayoutTableRow (anonymous) at (0,2) size 118x20 - LayoutTableCell {TD} at (2,2) size 56x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 54x17 - text run at (1,1) width 54: "Footer 1" - LayoutTableCell {TD} at (60,2) size 56x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 54x17 - text run at (1,1) width 54: "Footer 2" - LayoutTableSection {TBODY} at (1,53) size 122x50 - LayoutTableRow (anonymous) at (0,0) size 122x48 - LayoutTableCell (anonymous) at (2,0) size 118x48 [r=0 c=0 rs=1 cs=1] - LayoutBlockFlow {TR} at (0,0) size 118x24 - LayoutTable (anonymous) at (0,0) size 88x24 - LayoutTableSection (anonymous) at (0,0) size 88x24 - LayoutTableRow (anonymous) at (0,2) size 88x20 - LayoutTableCell {TD} at (2,2) size 41x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x17 - text run at (1,1) width 39: "Cell 1" - LayoutTableCell {TD} at (45,2) size 41x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x17 - text run at (1,1) width 39: "Cell 2" - LayoutBlockFlow {TR} at (0,24) size 118x24 - LayoutTable (anonymous) at (0,0) size 88x24 - LayoutTableSection (anonymous) at (0,0) size 88x24 - LayoutTableRow (anonymous) at (0,2) size 88x20 - LayoutTableCell {TD} at (2,2) size 41x20 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x17 - text run at (1,1) width 39: "Cell 3" - LayoutTableCell {TD} at (45,2) size 41x20 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 39x17 - text run at (1,1) width 39: "Cell 4" - LayoutTable (anonymous) at (0,366) size 302x200 + LayoutBlockFlow {TABLE} at (10,240) size 764x102 [border: (1px solid #000000)] + LayoutBlockFlow {THEAD} at (1,1) size 762x24 + LayoutBlockFlow {TR} at (0,0) size 762x24 + LayoutTable (anonymous) at (0,0) size 102x24 + LayoutTableSection (anonymous) at (0,0) size 102x24 + LayoutTableRow (anonymous) at (0,2) size 102x20 + LayoutTableCell {TD} at (2,2) size 48x20 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 46x17 + text run at (1,1) width 46: "Head 1" + LayoutTableCell {TD} at (52,2) size 48x20 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 46x17 + text run at (1,1) width 46: "Head 2" + LayoutBlockFlow {TFOOT} at (1,25) size 762x24 + LayoutBlockFlow {TR} at (0,0) size 762x24 + LayoutTable (anonymous) at (0,0) size 118x24 + LayoutTableSection (anonymous) at (0,0) size 118x24 + LayoutTableRow (anonymous) at (0,2) size 118x20 + LayoutTableCell {TD} at (2,2) size 56x20 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 54x17 + text run at (1,1) width 54: "Footer 1" + LayoutTableCell {TD} at (60,2) size 56x20 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 54x17 + text run at (1,1) width 54: "Footer 2" + LayoutTable (anonymous) at (1,49) size 92x52 + LayoutTableSection {TBODY} at (0,0) size 92x52 + LayoutTableRow (anonymous) at (0,2) size 92x48 + LayoutTableCell (anonymous) at (2,2) size 88x48 [r=0 c=0 rs=1 cs=1] + LayoutBlockFlow {TR} at (0,0) size 88x24 + LayoutTable (anonymous) at (0,0) size 88x24 + LayoutTableSection (anonymous) at (0,0) size 88x24 + LayoutTableRow (anonymous) at (0,2) size 88x20 + LayoutTableCell {TD} at (2,2) size 41x20 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 39x17 + text run at (1,1) width 39: "Cell 1" + LayoutTableCell {TD} at (45,2) size 41x20 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 39x17 + text run at (1,1) width 39: "Cell 2" + LayoutBlockFlow {TR} at (0,24) size 88x24 + LayoutTable (anonymous) at (0,0) size 88x24 + LayoutTableSection (anonymous) at (0,0) size 88x24 + LayoutTableRow (anonymous) at (0,2) size 88x20 + LayoutTableCell {TD} at (2,2) size 41x20 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 39x17 + text run at (1,1) width 39: "Cell 3" + LayoutTableCell {TD} at (45,2) size 41x20 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 39x17 + text run at (1,1) width 39: "Cell 4" + LayoutTable (anonymous) at (0,352) size 302x200 LayoutTableSection (anonymous) at (0,0) size 302x200 LayoutTableRow (anonymous) at (0,0) size 302x200 LayoutTableCell {P} at (0,0) size 302x200 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1]
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/table/table-display-types-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/table/table-display-types-vertical-expected.png index ac74f91..e9f50e23 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/table/table-display-types-vertical-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/table/table-display-types-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/table/table-display-types-vertical-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/table/table-display-types-vertical-expected.txt index 98de4f2..bd66158c 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/table/table-display-types-vertical-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/fast/table/table-display-types-vertical-expected.txt
@@ -1,149 +1,137 @@ -layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 1240 +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 1224 LayoutView at (0,0) size 800x600 -layer at (0,0) size 785x1240 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 - LayoutBlockFlow {HTML} at (0,0) size 785x1240 - LayoutBlockFlow {BODY} at (8,10) size 769x1222 - LayoutTable {TABLE} at (10,0) size 92x120 [border: (1px solid #000000)] - LayoutTableSection {THEAD} at (1,1) size 24x118 - LayoutTableRow {TR} at (0,2) size 20x118 - LayoutTableCell {TD} at (2,2) size 20x56 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x46 - text run at (1,1) width 46: "Head 1" - LayoutTableCell {TD} at (2,60) size 20x56 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x46 - text run at (1,1) width 46: "Head 2" - LayoutTableSection {TFOOT} at (69,1) size 22x118 - LayoutTableRow {TR} at (0,0) size 20x118 - LayoutTableCell {TD} at (0,2) size 20x56 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x54 - text run at (1,1) width 54: "Footer 1" - LayoutTableCell {TD} at (0,60) size 20x56 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x54 - text run at (1,1) width 54: "Footer 2" - LayoutTableSection {TBODY} at (25,1) size 44x118 - LayoutTableRow {TR} at (0,0) size 20x118 - LayoutTableCell {TD} at (0,2) size 20x56 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x39 - text run at (1,1) width 39: "Cell 1" - LayoutTableCell {TD} at (0,60) size 20x56 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x39 - text run at (1,1) width 39: "Cell 2" - LayoutTableRow {TR} at (0,22) size 20x118 - LayoutTableCell {TD} at (22,2) size 20x56 [r=1 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x39 - text run at (1,1) width 39: "Cell 3" - LayoutTableCell {TD} at (22,60) size 20x56 [r=1 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x39 - text run at (1,1) width 39: "Cell 4" +layer at (0,0) size 785x1224 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow {HTML} at (0,0) size 785x1224 + LayoutBlockFlow {BODY} at (8,10) size 769x1206 + LayoutBlockFlow {TABLE} at (10,0) size 92x120 [border: (1px solid #000000)] + LayoutTable (anonymous) at (1,1) size 90x118 + LayoutTableSection {THEAD} at (0,0) size 24x118 + LayoutTableRow {TR} at (0,2) size 20x118 + LayoutTableCell {TD} at (2,2) size 20x56 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 17x46 + text run at (1,1) width 46: "Head 1" + LayoutTableCell {TD} at (2,60) size 20x56 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 17x46 + text run at (1,1) width 46: "Head 2" + LayoutTableSection {TFOOT} at (68,0) size 22x118 + LayoutTableRow {TR} at (0,0) size 20x118 + LayoutTableCell {TD} at (0,2) size 20x56 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 17x54 + text run at (1,1) width 54: "Footer 1" + LayoutTableCell {TD} at (0,60) size 20x56 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 17x54 + text run at (1,1) width 54: "Footer 2" + LayoutTableSection {TBODY} at (24,0) size 44x118 + LayoutTableRow {TR} at (0,0) size 20x118 + LayoutTableCell {TD} at (0,2) size 20x56 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 17x39 + text run at (1,1) width 39: "Cell 1" + LayoutTableCell {TD} at (0,60) size 20x56 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 17x39 + text run at (1,1) width 39: "Cell 2" + LayoutTableRow {TR} at (0,22) size 20x118 + LayoutTableCell {TD} at (22,2) size 20x56 [r=1 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 17x39 + text run at (1,1) width 39: "Cell 3" + LayoutTableCell {TD} at (22,60) size 20x56 [r=1 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 17x39 + text run at (1,1) width 39: "Cell 4" LayoutBlockFlow {P} at (0,136) size 769x18 LayoutText {#text} at (0,0) size 227x17 text run at (0,0) width 227: "Row groups have display:table-cell" - LayoutTable {TABLE} at (10,170) size 60x236 [border: (1px solid #000000)] - LayoutTableSection (anonymous) at (1,1) size 32x234 - LayoutTableRow (anonymous) at (0,2) size 28x234 - LayoutTableCell {THEAD} at (2,2) size 28x106 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 28x106 - LayoutTableSection (anonymous) at (0,0) size 28x106 - LayoutTableRow (anonymous) at (0,2) size 24x106 - LayoutTableCell {TR} at (2,2) size 24x102 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 24x102 - LayoutTableSection (anonymous) at (0,0) size 24x102 - LayoutTableRow (anonymous) at (0,2) size 20x102 - LayoutTableCell {TD} at (2,2) size 20x48 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x46 - text run at (1,1) width 46: "Head 1" - LayoutTableCell {TD} at (2,52) size 20x48 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x46 - text run at (1,1) width 46: "Head 2" - LayoutTableCell {TFOOT} at (2,110) size 28x122 [r=0 c=1 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 28x122 - LayoutTableSection (anonymous) at (0,0) size 28x122 - LayoutTableRow (anonymous) at (0,2) size 24x122 - LayoutTableCell {TR} at (2,2) size 24x118 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 24x118 - LayoutTableSection (anonymous) at (0,0) size 24x118 - LayoutTableRow (anonymous) at (0,2) size 20x118 - LayoutTableCell {TD} at (2,2) size 20x56 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x54 - text run at (1,1) width 54: "Footer 1" - LayoutTableCell {TD} at (2,60) size 20x56 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x54 - text run at (1,1) width 54: "Footer 2" - LayoutTableSection {TBODY} at (33,1) size 26x234 - LayoutTableRow (anonymous) at (0,0) size 24x234 - LayoutTableCell {TR} at (0,2) size 24x106 [r=0 c=0 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 24x88 - LayoutTableSection (anonymous) at (0,0) size 24x88 - LayoutTableRow (anonymous) at (0,2) size 20x88 - LayoutTableCell {TD} at (2,2) size 20x41 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x39 - text run at (1,1) width 39: "Cell 1" - LayoutTableCell {TD} at (2,45) size 20x41 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x39 - text run at (1,1) width 39: "Cell 2" - LayoutTableCell {TR} at (0,110) size 24x122 [r=0 c=1 rs=1 cs=1] - LayoutTable (anonymous) at (0,0) size 24x88 - LayoutTableSection (anonymous) at (0,0) size 24x88 - LayoutTableRow (anonymous) at (0,2) size 20x88 - LayoutTableCell {TD} at (2,2) size 20x41 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x39 - text run at (1,1) width 39: "Cell 3" - LayoutTableCell {TD} at (2,45) size 20x41 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x39 - text run at (1,1) width 39: "Cell 4" - LayoutBlockFlow {P} at (0,422) size 769x18 + LayoutBlockFlow {TABLE} at (10,170) size 48x224 [border: (1px solid #000000)] + LayoutTable (anonymous) at (1,1) size 46x222 + LayoutTableSection (anonymous) at (0,0) size 26x222 + LayoutTableRow (anonymous) at (0,2) size 22x222 + LayoutTableCell {THEAD} at (2,2) size 22x100 [r=0 c=0 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 22x100 + LayoutTableSection (anonymous) at (0,0) size 22x100 + LayoutTableRow (anonymous) at (0,2) size 18x100 + LayoutTableCell {TR} at (2,2) size 18x96 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 19x48 + LayoutText {#text} at (0,1) size 17x46 + text run at (0,1) width 46: "Head 1" + LayoutInline {TD} at (0,0) size 19x49 + LayoutText {#text} at (0,48) size 17x47 + text run at (0,48) width 46: "Head 2" + LayoutTableCell {TFOOT} at (2,104) size 22x116 [r=0 c=1 rs=1 cs=1] + LayoutTable (anonymous) at (0,0) size 22x116 + LayoutTableSection (anonymous) at (0,0) size 22x116 + LayoutTableRow (anonymous) at (0,2) size 18x116 + LayoutTableCell {TR} at (2,2) size 18x112 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 19x56 + LayoutText {#text} at (0,1) size 17x54 + text run at (0,1) width 54: "Footer 1" + LayoutInline {TD} at (0,0) size 19x57 + LayoutText {#text} at (0,56) size 17x55 + text run at (0,56) width 54: "Footer 2" + LayoutTableSection {TBODY} at (26,0) size 20x222 + LayoutTableRow (anonymous) at (0,0) size 18x222 + LayoutTableCell {TR} at (0,2) size 18x100 [r=0 c=0 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 19x41 + LayoutText {#text} at (0,1) size 17x39 + text run at (0,1) width 39: "Cell 1" + LayoutInline {TD} at (0,0) size 19x42 + LayoutText {#text} at (0,41) size 17x40 + text run at (0,41) width 39: "Cell 2" + LayoutTableCell {TR} at (0,104) size 18x116 [r=0 c=1 rs=1 cs=1] + LayoutInline {TD} at (0,0) size 19x41 + LayoutText {#text} at (0,1) size 17x39 + text run at (0,1) width 39: "Cell 3" + LayoutInline {TD} at (0,0) size 19x42 + LayoutText {#text} at (0,41) size 17x40 + text run at (0,41) width 39: "Cell 4" + LayoutBlockFlow {P} at (0,410) size 769x18 LayoutText {#text} at (0,0) size 203x17 text run at (0,0) width 203: "Row groups have display:block" - LayoutTable {TABLE} at (10,456) size 104x124 [border: (1px solid #000000)] - LayoutTableSection (anonymous) at (1,1) size 52x122 - LayoutTableRow (anonymous) at (0,2) size 48x122 - LayoutTableCell (anonymous) at (2,2) size 48x118 [r=0 c=0 rs=1 cs=1] - LayoutBlockFlow {THEAD} at (0,0) size 24x118 - LayoutBlockFlow {TR} at (0,0) size 24x118 - LayoutTable (anonymous) at (0,0) size 24x102 - LayoutTableSection (anonymous) at (0,0) size 24x102 - LayoutTableRow (anonymous) at (0,2) size 20x102 - LayoutTableCell {TD} at (2,2) size 20x48 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x46 - text run at (1,1) width 46: "Head 1" - LayoutTableCell {TD} at (2,52) size 20x48 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x46 - text run at (1,1) width 46: "Head 2" - LayoutBlockFlow {TFOOT} at (24,0) size 24x118 - LayoutBlockFlow {TR} at (0,0) size 24x118 - LayoutTable (anonymous) at (0,0) size 24x118 - LayoutTableSection (anonymous) at (0,0) size 24x118 - LayoutTableRow (anonymous) at (0,2) size 20x118 - LayoutTableCell {TD} at (2,2) size 20x56 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x54 - text run at (1,1) width 54: "Footer 1" - LayoutTableCell {TD} at (2,60) size 20x56 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x54 - text run at (1,1) width 54: "Footer 2" - LayoutTableSection {TBODY} at (53,1) size 50x122 - LayoutTableRow (anonymous) at (0,0) size 48x122 - LayoutTableCell (anonymous) at (0,2) size 48x118 [r=0 c=0 rs=1 cs=1] - LayoutBlockFlow {TR} at (0,0) size 24x118 - LayoutTable (anonymous) at (0,0) size 24x88 - LayoutTableSection (anonymous) at (0,0) size 24x88 - LayoutTableRow (anonymous) at (0,2) size 20x88 - LayoutTableCell {TD} at (2,2) size 20x41 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x39 - text run at (1,1) width 39: "Cell 1" - LayoutTableCell {TD} at (2,45) size 20x41 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x39 - text run at (1,1) width 39: "Cell 2" - LayoutBlockFlow {TR} at (24,0) size 24x118 - LayoutTable (anonymous) at (0,0) size 24x88 - LayoutTableSection (anonymous) at (0,0) size 24x88 - LayoutTableRow (anonymous) at (0,2) size 20x88 - LayoutTableCell {TD} at (2,2) size 20x41 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x39 - text run at (1,1) width 39: "Cell 3" - LayoutTableCell {TD} at (2,45) size 20x41 [r=0 c=1 rs=1 cs=1] - LayoutText {#text} at (1,1) size 17x39 - text run at (1,1) width 39: "Cell 4" - LayoutTable (anonymous) at (0,590) size 102x632 + LayoutBlockFlow {TABLE} at (10,444) size 102x120 [border: (1px solid #000000)] + LayoutBlockFlow {THEAD} at (1,1) size 24x118 + LayoutBlockFlow {TR} at (0,0) size 24x118 + LayoutTable (anonymous) at (0,0) size 24x102 + LayoutTableSection (anonymous) at (0,0) size 24x102 + LayoutTableRow (anonymous) at (0,2) size 20x102 + LayoutTableCell {TD} at (2,2) size 20x48 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 17x46 + text run at (1,1) width 46: "Head 1" + LayoutTableCell {TD} at (2,52) size 20x48 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 17x46 + text run at (1,1) width 46: "Head 2" + LayoutBlockFlow {TFOOT} at (25,1) size 24x118 + LayoutBlockFlow {TR} at (0,0) size 24x118 + LayoutTable (anonymous) at (0,0) size 24x118 + LayoutTableSection (anonymous) at (0,0) size 24x118 + LayoutTableRow (anonymous) at (0,2) size 20x118 + LayoutTableCell {TD} at (2,2) size 20x56 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 17x54 + text run at (1,1) width 54: "Footer 1" + LayoutTableCell {TD} at (2,60) size 20x56 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 17x54 + text run at (1,1) width 54: "Footer 2" + LayoutTable (anonymous) at (49,1) size 52x92 + LayoutTableSection {TBODY} at (0,0) size 52x92 + LayoutTableRow (anonymous) at (0,2) size 48x92 + LayoutTableCell (anonymous) at (2,2) size 48x88 [r=0 c=0 rs=1 cs=1] + LayoutBlockFlow {TR} at (0,0) size 24x88 + LayoutTable (anonymous) at (0,0) size 24x88 + LayoutTableSection (anonymous) at (0,0) size 24x88 + LayoutTableRow (anonymous) at (0,2) size 20x88 + LayoutTableCell {TD} at (2,2) size 20x41 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 17x39 + text run at (1,1) width 39: "Cell 1" + LayoutTableCell {TD} at (2,45) size 20x41 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 17x39 + text run at (1,1) width 39: "Cell 2" + LayoutBlockFlow {TR} at (24,0) size 24x88 + LayoutTable (anonymous) at (0,0) size 24x88 + LayoutTableSection (anonymous) at (0,0) size 24x88 + LayoutTableRow (anonymous) at (0,2) size 20x88 + LayoutTableCell {TD} at (2,2) size 20x41 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (1,1) size 17x39 + text run at (1,1) width 39: "Cell 3" + LayoutTableCell {TD} at (2,45) size 20x41 [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (1,1) size 17x39 + text run at (1,1) width 39: "Cell 4" + LayoutTable (anonymous) at (0,574) size 102x632 LayoutTableSection (anonymous) at (0,0) size 102x632 LayoutTableRow (anonymous) at (0,0) size 102x632 LayoutTableCell {P} at (0,0) size 102x632 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1]
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/text/international/mixed-directionality-selection-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/text/international/mixed-directionality-selection-expected.png index aba28eb0..d5df0ce 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/text/international/mixed-directionality-selection-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/text/international/mixed-directionality-selection-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/transforms/transformed-focused-text-input-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/transforms/transformed-focused-text-input-expected.png index 26adec6c..9a61b15 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/transforms/transformed-focused-text-input-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/transforms/transformed-focused-text-input-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/writing-mode/border-image-vertical-lr-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/writing-mode/border-image-vertical-lr-expected.png index 2e80d67..6f26a68 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/writing-mode/border-image-vertical-lr-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/writing-mode/border-image-vertical-lr-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/writing-mode/border-image-vertical-rl-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/writing-mode/border-image-vertical-rl-expected.png index ae735e2c..ea362a4 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/writing-mode/border-image-vertical-rl-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/writing-mode/border-image-vertical-rl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt b/third_party/WebKit/LayoutTests/platform/win/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt index 997f411..d521ef4d 100644 --- a/third_party/WebKit/LayoutTests/platform/win/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt
@@ -6,22 +6,32 @@ zh-TW: 誤過骨 #zh-TW: "Times New Roman" : 7, -"PMingLiU" : 3 +"å¾®è»æ£é»é«" : 3 zh-HK: 誤過骨 #zh-HK: "Times New Roman" : 7, -"PMingLiU" : 3 +"å¾®è»æ£é»é«" : 3 ja: 誤過骨 #ja: "Times New Roman" : 4, -"MS PGothic" : 3 +"Yu Gothic" : 3 + +ja-JP: 誤過骨 +#ja-JP: +"Times New Roman" : 7, +"Yu Gothic" : 3 ko: 誤過骨 #ko: "Times New Roman" : 4, -"Gulim" : 3 +"Malgun Gothic" : 3 + +ko-KR: 誤過骨 +#ko-KR: +"Times New Roman" : 7, +"Malgun Gothic" : 3 en-CN: 誤過骨 #en-CN: @@ -31,17 +41,22 @@ en-JP: 誤過骨 #en-JP: "Times New Roman" : 7, -"MS PGothic" : 3 +"Yu Gothic" : 3 en-KR: 誤過骨 #en-KR: "Times New Roman" : 7, -"Gulim" : 3 +"Malgun Gothic" : 3 + +en-HK: 誤過骨 +#en-HK: +"Times New Roman" : 7, +"å¾®è»æ£é»é«" : 3 en-TW: 誤過骨 #en-TW: "Times New Roman" : 7, -"PMingLiU" : 3 +"å¾®è»æ£é»é«" : 3 en-HanS: 誤過骨 #en-HanS: @@ -51,7 +66,7 @@ en-HanT: 誤過骨 #en-HanT: "Times New Roman" : 9, -"PMingLiU" : 3 +"å¾®è»æ£é»é«" : 3 en-HanS-JP: 誤過骨 #en-HanS-JP: @@ -61,11 +76,11 @@ en-HanT-JP: 誤過骨 #en-HanT-JP: "Times New Roman" : 12, -"PMingLiU" : 3 +"å¾®è»æ£é»é«" : 3 en-US: 誤過骨 #en-US: "Times New Roman" : 7, -"MS PGothic" : 3 +"SimSun" : 3
diff --git a/third_party/WebKit/LayoutTests/platform/win/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt b/third_party/WebKit/LayoutTests/platform/win/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt index 1a76da2df..e4d76f0b 100644 --- a/third_party/WebKit/LayoutTests/platform/win/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt
@@ -5,8 +5,7 @@ いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさき ゆめみし ゑひもせす(ん)色は匂へど 散りぬるを 我が世誰ぞ 常ならむ 有為の奥山 今日越えて 浅き夢見じ 酔ひもせず(ん) #japanese_iroha: -"Yu Gothic" : 71, -"SimSun" : 21, +"Yu Gothic" : 92, "Times New Roman" : 15 키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다.
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/audio-repaint-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/audio-repaint-expected.png index 916ac12a..5dfbaf1 100644 --- a/third_party/WebKit/LayoutTests/platform/win/media/audio-repaint-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/media/audio-repaint-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/invalidate-box-shadow-currentColor-expected.txt b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/invalidate-box-shadow-currentColor-expected.txt new file mode 100644 index 0000000..66a0786 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/invalidate-box-shadow-currentColor-expected.txt
@@ -0,0 +1,21 @@ +{ + "bounds": [800, 600], + "children": [ + { + "bounds": [800, 600], + "contentsOpaque": true, + "drawsContent": true, + "repaintRects": [ + [8, 8, 29, 22], + [8, 8, 29, 17] + ], + "paintInvalidationClients": [ + "LayoutInline SPAN id='target'", + "InlineFlowBox", + "LayoutText #text", + "InlineTextBox 'Text'" + ] + } + ] +} +
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png index d4a8ee1d..9b97473 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/coords-units-01-b-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/coords-units-01-b-expected.png index 88a3e76..2b982264 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/coords-units-01-b-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/coords-units-01-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/text-align-04-b-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/text-align-04-b-expected.txt index 01bdb2f58..0f8dbf8 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/text-align-04-b-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/text-align-04-b-expected.txt
@@ -38,7 +38,7 @@ chunk 1 (end anchor) text run 4 at (46.54,260.00) startOffset 15 endOffset 16 width 16.68: "d" chunk 1 (end anchor) text run 5 at (59.05,260.00) startOffset 16 endOffset 17 width 8.33: " " chunk 1 (end anchor) text run 6 at (67.39,260.00) startOffset 17 endOffset 18 width 8.33: "t" - chunk 1 (end anchor) text run 7 at (79.89,260.00) startOffset 18 endOffset 19 width 16.68: "e" + chunk 1 (end anchor) text run 7 at (79.90,260.00) startOffset 18 endOffset 19 width 16.68: "e" chunk 1 (end anchor) text run 8 at (95.74,260.00) startOffset 19 endOffset 20 width 15.00: "x" chunk 1 (end anchor) text run 9 at (107.40,260.00) startOffset 20 endOffset 21 width 8.33: "t" chunk 1 (end anchor) text run 10 at (115.74,260.00) startOffset 21 endOffset 22 width 8.33: " "
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/text-path-01-b-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/text-path-01-b-expected.txt index ba06278..7476a365 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/text-path-01-b-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/text-path-01-b-expected.txt
@@ -14,9 +14,9 @@ LayoutSVGTextPath {textPath} at (0,0) size 205x120 LayoutSVGInlineText {#text} at (0,0) size 205x120 chunk 1 text run 1 at (203.08,78.99) startOffset 0 endOffset 1 width 22.27: "T" - chunk 1 text run 2 at (212.32,61.50) startOffset 1 endOffset 2 width 17.40: "e" - chunk 1 text run 3 at (222.73,46.94) startOffset 2 endOffset 3 width 18.18: "x" - chunk 1 text run 4 at (233.61,36.17) startOffset 3 endOffset 4 width 12.43: "t" + chunk 1 text run 2 at (212.33,61.49) startOffset 1 endOffset 2 width 17.40: "e" + chunk 1 text run 3 at (222.74,46.94) startOffset 2 endOffset 3 width 18.18: "x" + chunk 1 text run 4 at (233.62,36.17) startOffset 3 endOffset 4 width 12.43: "t" chunk 1 text run 5 at (242.47,30.46) startOffset 4 endOffset 5 width 8.68: " " chunk 1 text run 6 at (255.95,26.99) startOffset 5 endOffset 6 width 19.41: "o" chunk 1 text run 7 at (274.98,33.23) startOffset 6 endOffset 7 width 21.27: "n" @@ -35,18 +35,18 @@ LayoutSVGTextPath {textPath} at (0,0) size 216x120 LayoutSVGTSpan {tspan} at (0,0) size 56x58 LayoutSVGInlineText {#text} at (0,36) size 56x58 - chunk 1 text run 1 at (37.54,135.48) startOffset 0 endOffset 1 width 22.27: "T" + chunk 1 text run 1 at (37.54,135.47) startOffset 0 endOffset 1 width 22.27: "T" chunk 1 text run 2 at (46.77,117.97) startOffset 1 endOffset 2 width 17.40: "e" LayoutSVGTSpan {tspan} at (0,0) size 44x42 LayoutSVGInlineText {#text} at (34,24) size 44x41 chunk 1 text run 1 at (57.18,103.42) startOffset 0 endOffset 1 width 18.18: "x" LayoutSVGInlineText {#text} at (50,0) size 166x120 chunk 1 text run 1 at (68.07,92.65) startOffset 0 endOffset 1 width 12.43: "t" - chunk 1 text run 2 at (76.93,86.96) startOffset 1 endOffset 2 width 8.68: " " + chunk 1 text run 2 at (76.93,86.95) startOffset 1 endOffset 2 width 8.68: " " chunk 1 text run 3 at (90.41,83.48) startOffset 2 endOffset 3 width 19.41: "o" chunk 1 text run 4 at (109.45,89.71) startOffset 3 endOffset 4 width 21.27: "n" chunk 1 text run 5 at (120.62,99.55) startOffset 4 endOffset 5 width 8.68: " " - chunk 1 text run 6 at (129.32,109.91) startOffset 5 endOffset 6 width 18.14: "a" + chunk 1 text run 6 at (129.32,109.92) startOffset 5 endOffset 6 width 18.14: "a" chunk 1 text run 7 at (137.43,120.71) startOffset 6 endOffset 7 width 8.68: " " chunk 1 text run 8 at (146.41,132.09) startOffset 7 endOffset 8 width 20.57: "p" chunk 1 text run 9 at (160.55,145.31) startOffset 8 endOffset 9 width 18.14: "a" @@ -63,7 +63,7 @@ LayoutSVGContainer {g} at (113,211) size 300x81 LayoutSVGContainer {use} at (113,231) size 300x4 LayoutSVGPath {path} at (113,231) size 300x4 [stroke={[type=SOLID] [color=#0000FF] [stroke width=4.00]}] [data="M 113 233 L 413 233"] - LayoutSVGText {text} at (211,211) size 180x27 contains 1 chunk(s) + LayoutSVGText {text} at (212,211) size 179x27 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 179x27 LayoutSVGInlineText {#text} at (0,0) size 179x27 chunk 1 text run 1 at (219.33,233.00) startOffset 0 endOffset 1 width 14.66: "T"
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/longTextOnPath-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/longTextOnPath-expected.txt index ba92610..e6bcb21 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/longTextOnPath-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/longTextOnPath-expected.txt
@@ -52,9 +52,9 @@ chunk 1 text run 36 at (307.71,150.00) startOffset 35 endOffset 36 width 5.56: "t" chunk 1 text run 37 at (313.82,150.00) startOffset 36 endOffset 37 width 6.66: "r" chunk 1 text run 38 at (319.93,150.00) startOffset 37 endOffset 38 width 5.56: "i" - chunk 1 text run 39 at (327.70,150.00) startOffset 38 endOffset 39 width 10.00: "n" - chunk 1 text run 40 at (337.70,150.00) startOffset 39 endOffset 40 width 10.00: "g" - chunk 1 text run 41 at (345.20,150.00) startOffset 40 endOffset 41 width 5.00: " " + chunk 1 text run 39 at (327.71,150.00) startOffset 38 endOffset 39 width 10.00: "n" + chunk 1 text run 40 at (337.71,150.00) startOffset 39 endOffset 40 width 10.00: "g" + chunk 1 text run 41 at (345.21,150.00) startOffset 40 endOffset 41 width 5.00: " " chunk 1 text run 42 at (350.48,150.00) startOffset 41 endOffset 42 width 5.56: "t" chunk 1 text run 43 at (358.26,150.00) startOffset 42 endOffset 43 width 10.00: "h" chunk 1 text run 44 at (367.70,150.00) startOffset 43 endOffset 44 width 8.88: "a" @@ -310,12 +310,12 @@ chunk 1 text run 294 at (288.89,250.00) startOffset 293 endOffset 294 width 5.00: " " chunk 1 text run 295 at (296.39,250.00) startOffset 294 endOffset 295 width 10.00: "g" chunk 1 text run 296 at (306.39,250.00) startOffset 295 endOffset 296 width 10.00: "o" - chunk 1 text run 297 at (314.16,250.00) startOffset 296 endOffset 297 width 5.56: "i" + chunk 1 text run 297 at (314.17,250.00) startOffset 296 endOffset 297 width 5.56: "i" chunk 1 text run 298 at (321.94,250.00) startOffset 297 endOffset 298 width 10.00: "n" chunk 1 text run 299 at (331.94,250.00) startOffset 298 endOffset 299 width 10.00: "g" chunk 1 text run 300 at (339.44,250.00) startOffset 299 endOffset 300 width 5.00: " " - chunk 1 text run 301 at (349.16,250.00) startOffset 300 endOffset 301 width 14.44: "w" - chunk 1 text run 302 at (359.16,250.00) startOffset 301 endOffset 302 width 5.56: "i" + chunk 1 text run 301 at (349.17,250.00) startOffset 300 endOffset 301 width 14.44: "w" + chunk 1 text run 302 at (359.17,250.00) startOffset 301 endOffset 302 width 5.56: "i" chunk 1 text run 303 at (364.72,250.00) startOffset 302 endOffset 303 width 5.56: "t" chunk 1 text run 304 at (372.50,250.00) startOffset 303 endOffset 304 width 10.00: "h" chunk 1 text run 305 at (380.00,250.00) startOffset 304 endOffset 305 width 5.00: " " @@ -463,7 +463,7 @@ chunk 1 text run 37 at (277.01,310.00) startOffset 36 endOffset 37 width 10.00: "n" chunk 1 text run 38 at (287.01,310.00) startOffset 37 endOffset 38 width 10.00: "o" chunk 1 text run 39 at (299.23,310.00) startOffset 38 endOffset 39 width 14.44: "w" - chunk 1 text run 40 at (308.95,310.00) startOffset 39 endOffset 40 width 5.00: " " + chunk 1 text run 40 at (308.96,310.00) startOffset 39 endOffset 40 width 5.00: " " chunk 1 text run 41 at (314.79,310.00) startOffset 40 endOffset 41 width 6.66: "I" chunk 1 text run 42 at (319.92,310.00) startOffset 41 endOffset 42 width 3.60: "'" chunk 1 text run 43 at (329.50,310.00) startOffset 42 endOffset 43 width 15.56: "m" @@ -526,7 +526,7 @@ chunk 1 text run 15 at (381.94,330.00) startOffset 14 endOffset 15 width 10.00: "k" chunk 1 text run 16 at (391.94,330.00) startOffset 15 endOffset 16 width 10.00: "n" chunk 1 text run 17 at (401.94,330.00) startOffset 16 endOffset 17 width 10.00: "o" - chunk 1 text run 18 at (414.16,330.00) startOffset 17 endOffset 18 width 14.44: "w" + chunk 1 text run 18 at (414.17,330.00) startOffset 17 endOffset 18 width 14.44: "w" chunk 1 text run 19 at (423.89,330.00) startOffset 18 endOffset 19 width 5.00: " " chunk 1 text run 20 at (29.72,350.00) startOffset 19 endOffset 20 width 6.66: "f" chunk 1 text run 21 at (38.05,350.00) startOffset 20 endOffset 21 width 10.00: "o"
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath-expected.png index 3be13f7b7..7c817fa3 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath-expected.txt index 6f3a16c5..05259ea6 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath-expected.txt
@@ -22,7 +22,7 @@ chunk 1 text run 5 at (48.36,19.09) startOffset 4 endOffset 5 width 5.00: " " LayoutSVGTSpan {tspan} at (0,0) size 28x28 LayoutSVGInlineText {#text} at (29,0) size 28x28 - chunk 1 text run 1 at (55.17,15.95) startOffset 0 endOffset 1 width 10.00: "o" + chunk 1 text run 1 at (55.17,15.94) startOffset 0 endOffset 1 width 10.00: "o" chunk 1 text run 2 at (64.84,13.36) startOffset 1 endOffset 2 width 10.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 63x43 LayoutSVGInlineText {#text} at (57,9) size 63x42 @@ -52,11 +52,11 @@ LayoutSVGInlineText {#text} at (0,0) size 56x53 chunk 1 (middle anchor) text run 1 at (30.38,44.49) startOffset 0 endOffset 1 width 5.00: " " chunk 1 (middle anchor) text run 2 at (32.03,37.79) startOffset 1 endOffset 2 width 8.88: "a" - chunk 1 (middle anchor) text run 3 at (35.02,31.58) startOffset 2 endOffset 3 width 5.00: " " - chunk 1 (middle anchor) text run 4 at (40.05,25.31) startOffset 3 endOffset 4 width 11.12: "P" + chunk 1 (middle anchor) text run 3 at (35.02,31.57) startOffset 2 endOffset 3 width 5.00: " " + chunk 1 (middle anchor) text run 4 at (40.05,25.30) startOffset 3 endOffset 4 width 11.12: "P" chunk 1 (middle anchor) text run 5 at (48.01,19.29) startOffset 4 endOffset 5 width 8.88: "a" chunk 1 (middle anchor) text run 6 at (54.52,16.19) startOffset 5 endOffset 6 width 5.56: "t" - chunk 1 (middle anchor) text run 7 at (61.97,13.93) startOffset 6 endOffset 7 width 10.00: "h" + chunk 1 (middle anchor) text run 7 at (61.98,13.93) startOffset 6 endOffset 7 width 10.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 66x12 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,0) size 66x12 @@ -76,12 +76,12 @@ LayoutSVGTSpan {tspan} at (0,0) size 62x47 LayoutSVGInlineText {#text} at (12,0) size 61x47 chunk 1 (end anchor) text run 1 at (32.44,36.70) startOffset 0 endOffset 1 width 5.00: " " - chunk 1 (end anchor) text run 2 at (35.65,30.60) startOffset 1 endOffset 2 width 8.88: "a" - chunk 1 (end anchor) text run 3 at (40.07,25.28) startOffset 2 endOffset 3 width 5.00: " " + chunk 1 (end anchor) text run 2 at (35.65,30.59) startOffset 1 endOffset 2 width 8.88: "a" + chunk 1 (end anchor) text run 3 at (40.08,25.28) startOffset 2 endOffset 3 width 5.00: " " chunk 1 (end anchor) text run 4 at (46.38,20.28) startOffset 3 endOffset 4 width 11.12: "P" chunk 1 (end anchor) text run 5 at (55.35,15.88) startOffset 4 endOffset 5 width 8.88: "a" chunk 1 (end anchor) text run 6 at (62.29,13.86) startOffset 5 endOffset 6 width 5.56: "t" - chunk 1 (end anchor) text run 7 at (69.99,12.71) startOffset 6 endOffset 7 width 10.00: "h" + chunk 1 (end anchor) text run 7 at (70.00,12.71) startOffset 6 endOffset 7 width 10.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 71x12 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,0) size 71x12 @@ -97,7 +97,7 @@ LayoutSVGInlineText {#text} at (0,0) size 50x36 chunk 1 text run 1 at (81.11,12.81) startOffset 0 endOffset 1 width 12.22: "T" chunk 1 text run 2 at (90.78,14.63) startOffset 1 endOffset 2 width 7.48: "e" - chunk 1 text run 3 at (98.96,17.69) startOffset 2 endOffset 3 width 10.00: "x" + chunk 1 text run 3 at (98.96,17.70) startOffset 2 endOffset 3 width 10.00: "x" chunk 1 text run 4 at (105.65,21.67) startOffset 3 endOffset 4 width 5.56: "t" chunk 1 text run 5 at (109.71,25.06) startOffset 4 endOffset 5 width 5.00: " " LayoutSVGTSpan {tspan} at (0,0) size 31x33 @@ -121,13 +121,13 @@ LayoutSVGTextPath {textPath} at (0,0) size 123x59 LayoutSVGInlineText {#text} at (0,13) size 46x46 chunk 1 (middle anchor) text run 1 at (32.70,36.06) startOffset 0 endOffset 1 width 12.22: "T" - chunk 1 (middle anchor) text run 2 at (37.82,27.72) startOffset 1 endOffset 2 width 7.48: "e" + chunk 1 (middle anchor) text run 2 at (37.82,27.71) startOffset 1 endOffset 2 width 7.48: "e" chunk 1 (middle anchor) text run 3 at (44.21,21.77) startOffset 2 endOffset 3 width 10.00: "x" chunk 1 (middle anchor) text run 4 at (50.88,17.77) startOffset 3 endOffset 4 width 5.56: "t" - chunk 1 (middle anchor) text run 5 at (55.73,15.74) startOffset 4 endOffset 5 width 5.00: " " + chunk 1 (middle anchor) text run 5 at (55.74,15.74) startOffset 4 endOffset 5 width 5.00: " " LayoutSVGTSpan {tspan} at (0,0) size 26x25 LayoutSVGInlineText {#text} at (38,0) size 26x25 - chunk 1 (middle anchor) text run 1 at (62.96,13.72) startOffset 0 endOffset 1 width 10.00: "o" + chunk 1 (middle anchor) text run 1 at (62.97,13.72) startOffset 0 endOffset 1 width 10.00: "o" chunk 1 (middle anchor) text run 2 at (72.90,12.54) startOffset 1 endOffset 2 width 10.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 60x49 LayoutSVGInlineText {#text} at (63,10) size 59x49 @@ -152,18 +152,18 @@ LayoutSVGTextPath {textPath} at (0,0) size 120x66 LayoutSVGInlineText {#text} at (0,11) size 49x41 chunk 1 (end anchor) text run 1 at (36.73,29.08) startOffset 0 endOffset 1 width 12.22: "T" - chunk 1 (end anchor) text run 2 at (43.69,22.15) startOffset 1 endOffset 2 width 7.48: "e" + chunk 1 (end anchor) text run 2 at (43.70,22.15) startOffset 1 endOffset 2 width 7.48: "e" chunk 1 (end anchor) text run 3 at (51.17,17.63) startOffset 2 endOffset 3 width 10.00: "x" chunk 1 (end anchor) text run 4 at (58.44,14.85) startOffset 3 endOffset 4 width 5.56: "t" - chunk 1 (end anchor) text run 5 at (63.55,13.60) startOffset 4 endOffset 5 width 5.00: " " + chunk 1 (end anchor) text run 5 at (63.56,13.60) startOffset 4 endOffset 5 width 5.00: " " LayoutSVGTSpan {tspan} at (0,0) size 26x23 LayoutSVGInlineText {#text} at (45,0) size 25x23 - chunk 1 (end anchor) text run 1 at (71.00,12.63) startOffset 0 endOffset 1 width 10.00: "o" + chunk 1 (end anchor) text run 1 at (71.01,12.63) startOffset 0 endOffset 1 width 10.00: "o" chunk 1 (end anchor) text run 2 at (81.01,12.80) startOffset 1 endOffset 2 width 10.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 54x55 LayoutSVGInlineText {#text} at (66,11) size 54x55 chunk 1 (end anchor) text run 1 at (88.42,14.02) startOffset 0 endOffset 1 width 5.00: " " - chunk 1 (end anchor) text run 2 at (95.07,16.03) startOffset 1 endOffset 2 width 8.88: "a" + chunk 1 (end anchor) text run 2 at (95.07,16.04) startOffset 1 endOffset 2 width 8.88: "a" chunk 1 (end anchor) text run 3 at (101.37,18.94) startOffset 2 endOffset 3 width 5.00: " " chunk 1 (end anchor) text run 4 at (108.00,23.51) startOffset 3 endOffset 4 width 11.12: "P" chunk 1 (end anchor) text run 5 at (114.60,30.97) startOffset 4 endOffset 5 width 8.88: "a" @@ -185,7 +185,7 @@ chunk 1 text run 1 at (51.36,17.54) startOffset 0 endOffset 1 width 12.22: "T" chunk 1 text run 2 at (60.63,14.25) startOffset 1 endOffset 2 width 7.48: "e" chunk 1 text run 3 at (69.25,12.77) startOffset 2 endOffset 3 width 10.00: "x" - chunk 1 text run 4 at (77.03,12.53) startOffset 3 endOffset 4 width 5.56: "t" + chunk 1 text run 4 at (77.04,12.53) startOffset 3 endOffset 4 width 5.56: "t" chunk 1 text run 5 at (82.30,12.94) startOffset 4 endOffset 5 width 5.00: " " LayoutSVGTSpan {tspan} at (0,0) size 30x29 LayoutSVGInlineText {#text} at (48,0) size 30x29 @@ -212,20 +212,20 @@ LayoutSVGTextPath {textPath} at (0,0) size 97x59 LayoutSVGInlineText {#text} at (0,30) size 27x28 chunk 1 (middle anchor) text run 1 at (30.07,47.55) startOffset 2 endOffset 3 width 10.00: "x" - chunk 1 (middle anchor) text run 2 at (31.34,39.93) startOffset 3 endOffset 4 width 5.56: "t" - chunk 1 (middle anchor) text run 3 at (33.18,34.98) startOffset 4 endOffset 5 width 5.00: " " + chunk 1 (middle anchor) text run 2 at (31.35,39.93) startOffset 3 endOffset 4 width 5.56: "t" + chunk 1 (middle anchor) text run 3 at (33.18,34.97) startOffset 4 endOffset 5 width 5.00: " " LayoutSVGTSpan {tspan} at (0,0) size 33x34 LayoutSVGInlineText {#text} at (0,1) size 33x33 - chunk 1 (middle anchor) text run 1 at (37.10,28.61) startOffset 0 endOffset 1 width 10.00: "o" + chunk 1 (middle anchor) text run 1 at (37.10,28.60) startOffset 0 endOffset 1 width 10.00: "o" chunk 1 (middle anchor) text run 2 at (44.30,21.70) startOffset 1 endOffset 2 width 10.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 69x29 LayoutSVGInlineText {#text} at (28,0) size 68x29 chunk 1 (middle anchor) text run 1 at (50.73,17.84) startOffset 0 endOffset 1 width 5.00: " " chunk 1 (middle anchor) text run 2 at (57.16,15.25) startOffset 1 endOffset 2 width 8.88: "a" chunk 1 (middle anchor) text run 3 at (63.88,13.54) startOffset 2 endOffset 3 width 5.00: " " - chunk 1 (middle anchor) text run 4 at (71.89,12.58) startOffset 3 endOffset 4 width 11.12: "P" + chunk 1 (middle anchor) text run 4 at (71.90,12.58) startOffset 3 endOffset 4 width 11.12: "P" chunk 1 (middle anchor) text run 5 at (81.90,12.89) startOffset 4 endOffset 5 width 8.88: "a" - chunk 1 (middle anchor) text run 6 at (89.01,14.17) startOffset 5 endOffset 6 width 5.56: "t" + chunk 1 (middle anchor) text run 6 at (89.02,14.17) startOffset 5 endOffset 6 width 5.56: "t" chunk 1 (middle anchor) text run 7 at (96.42,16.57) startOffset 6 endOffset 7 width 10.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 63x12 contains 1 chunk(s) @@ -244,7 +244,7 @@ LayoutSVGInlineText {#text} at (-11,-6) size 0x0 LayoutSVGTSpan {tspan} at (0,0) size 37x45 LayoutSVGInlineText {#text} at (0,0) size 37x45 - chunk 1 (end anchor) text run 1 at (30.33,44.89) startOffset 3 endOffset 4 width 11.12: "P" + chunk 1 (end anchor) text run 1 at (30.33,44.88) startOffset 3 endOffset 4 width 11.12: "P" chunk 1 (end anchor) text run 2 at (33.02,35.34) startOffset 4 endOffset 5 width 8.88: "a" chunk 1 (end anchor) text run 3 at (36.68,29.15) startOffset 5 endOffset 6 width 5.56: "t" chunk 1 (end anchor) text run 4 at (42.00,23.51) startOffset 6 endOffset 7 width 10.00: "h" @@ -272,14 +272,14 @@ chunk 1 text run 2 at (47.24,8.79) startOffset 1 endOffset 2 width 7.00: "a" chunk 1 text run 3 at (53.97,10.51) startOffset 2 endOffset 3 width 7.00: "n" chunk 1 text run 4 at (59.61,14.61) startOffset 3 endOffset 4 width 7.00: "d" - chunk 1 text run 5 at (63.61,18.60) startOffset 4 endOffset 5 width 4.00: " " + chunk 1 text run 5 at (63.62,18.60) startOffset 4 endOffset 5 width 4.00: " " LayoutSVGTSpan {tspan} at (0,0) size 28x28 LayoutSVGInlineText {#text} at (56,25) size 27x27 - chunk 1 text run 1 at (67.22,22.10) startOffset 0 endOffset 1 width 6.00: "s" + chunk 1 text run 1 at (67.23,22.10) startOffset 0 endOffset 1 width 6.00: "s" chunk 1 text run 2 at (71.97,26.41) startOffset 1 endOffset 2 width 7.00: "u" chunk 1 text run 3 at (77.48,30.72) startOffset 2 endOffset 3 width 7.00: "b" LayoutSVGInlineText {#text} at (78,21) size 38x28 - chunk 1 text run 1 at (83.07,34.03) startOffset 0 endOffset 1 width 6.00: "s" + chunk 1 text run 1 at (83.08,34.03) startOffset 0 endOffset 1 width 6.00: "s" chunk 1 text run 2 at (89.25,36.01) startOffset 1 endOffset 2 width 7.00: "c" chunk 1 text run 3 at (95.17,35.85) startOffset 2 endOffset 3 width 5.00: "r" chunk 1 text run 4 at (98.98,34.48) startOffset 3 endOffset 4 width 3.00: "i" @@ -302,9 +302,9 @@ LayoutSVGInlineText {#text} at (0,0) size 50x39 chunk 1 text run 1 at (17.53,27.48) startOffset 0 endOffset 1 width 7.00: "p" chunk 1 text run 2 at (22.58,22.56) startOffset 1 endOffset 2 width 7.00: "o" - chunk 1 text run 3 at (27.36,18.27) startOffset 2 endOffset 3 width 6.00: "s" + chunk 1 text run 3 at (27.36,18.26) startOffset 2 endOffset 3 width 6.00: "s" chunk 1 text run 4 at (30.87,15.45) startOffset 3 endOffset 4 width 3.00: "i" - chunk 1 text run 5 at (33.75,13.42) startOffset 4 endOffset 5 width 4.00: "t" + chunk 1 text run 5 at (33.76,13.42) startOffset 4 endOffset 5 width 4.00: "t" chunk 1 text run 6 at (36.74,11.64) startOffset 5 endOffset 6 width 3.00: "i" chunk 1 text run 7 at (41.36,9.67) startOffset 6 endOffset 7 width 7.00: "v" chunk 1 text run 8 at (48.24,8.85) startOffset 7 endOffset 8 width 7.00: "e" @@ -317,7 +317,7 @@ LayoutSVGTSpan {tspan} at (0,0) size 52x31 LayoutSVGInlineText {#text} at (65,20) size 51x31 chunk 1 text run 1 at (76.65,30.13) startOffset 0 endOffset 1 width 7.00: "n" - chunk 1 text run 2 at (82.60,33.80) startOffset 1 endOffset 2 width 7.00: "e" + chunk 1 text run 2 at (82.61,33.80) startOffset 1 endOffset 2 width 7.00: "e" chunk 1 text run 3 at (89.25,36.01) startOffset 2 endOffset 3 width 7.00: "g" chunk 1 text run 4 at (96.12,35.61) startOffset 3 endOffset 4 width 7.00: "a" chunk 1 text run 5 at (101.03,33.29) startOffset 4 endOffset 5 width 4.00: "t" @@ -337,15 +337,15 @@ chunk 1 text run 1 at (30.00,-20.00) startOffset 0 endOffset 12 width 142.00: "before path " LayoutSVGTextPath {textPath} at (0,0) size 110x56 LayoutSVGInlineText {#text} at (0,32) size 110x55 - chunk 1 text run 1 at (35.45,30.90) startOffset 0 endOffset 1 width 14.00: "o" + chunk 1 text run 1 at (35.45,30.89) startOffset 0 endOffset 1 width 14.00: "o" chunk 1 text run 2 at (45.25,21.03) startOffset 1 endOffset 2 width 14.00: "n" chunk 1 text run 3 at (55.01,16.00) startOffset 2 endOffset 3 width 8.00: " " chunk 1 text run 4 at (65.67,13.23) startOffset 3 endOffset 4 width 14.00: "p" chunk 1 text run 5 at (79.65,12.68) startOffset 4 endOffset 5 width 14.00: "a" chunk 1 text run 6 at (90.48,14.55) startOffset 5 endOffset 6 width 8.00: "t" - chunk 1 text run 7 at (100.71,18.58) startOffset 6 endOffset 7 width 14.00: "h" + chunk 1 text run 7 at (100.72,18.58) startOffset 6 endOffset 7 width 14.00: "h" LayoutSVGInlineText {#text} at (104,38) size 122x34 - chunk 1 text run 1 at (114.71,18.58) startOffset 0 endOffset 11 width 122.00: " after path" + chunk 1 text run 1 at (114.72,18.58) startOffset 0 endOffset 11 width 122.00: " after path" LayoutSVGText {text} at (15,30) size 96x12 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,0) size 96x12 chunk 1 text run 1 at (15.00,40.00) startOffset 0 endOffset 26 width 96.00: "text before/after textPath"
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath2-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath2-expected.png index ac7e496..7480da8 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath2-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath2-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath2-expected.txt index 331a765..462722ed 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath2-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath2-expected.txt
@@ -31,28 +31,28 @@ LayoutSVGTextPath {textPath} at (0,0) size 152x118 LayoutSVGInlineText {#text} at (75,28) size 47x89 chunk 1 text run 1 at (100.02,-2.28) startOffset 0 endOffset 1 width 4.45: "t" - chunk 1 text run 2 at (100.20,-8.06) startOffset 1 endOffset 2 width 7.10: "e" - chunk 1 text run 3 at (100.77,-15.59) startOffset 2 endOffset 3 width 8.00: "x" - chunk 1 text run 4 at (101.53,-21.70) startOffset 3 endOffset 4 width 4.45: "t" - chunk 1 text run 5 at (102.25,-26.04) startOffset 4 endOffset 5 width 4.00: " " - chunk 1 text run 6 at (103.50,-32.02) startOffset 5 endOffset 6 width 8.00: "o" - chunk 1 text run 7 at (105.55,-39.55) startOffset 6 endOffset 7 width 8.00: "n" - chunk 1 text run 8 at (107.53,-45.32) startOffset 7 endOffset 8 width 4.00: " " - chunk 1 text run 9 at (109.65,-50.51) startOffset 8 endOffset 9 width 7.10: "a" - chunk 1 text run 10 at (112.00,-55.40) startOffset 9 endOffset 10 width 4.00: " " + chunk 1 text run 2 at (100.20,-8.07) startOffset 1 endOffset 2 width 7.10: "e" + chunk 1 text run 3 at (100.77,-15.60) startOffset 2 endOffset 3 width 8.00: "x" + chunk 1 text run 4 at (101.53,-21.71) startOffset 3 endOffset 4 width 4.45: "t" + chunk 1 text run 5 at (102.25,-26.05) startOffset 4 endOffset 5 width 4.00: " " + chunk 1 text run 6 at (103.50,-32.03) startOffset 5 endOffset 6 width 8.00: "o" + chunk 1 text run 7 at (105.55,-39.56) startOffset 6 endOffset 7 width 8.00: "n" + chunk 1 text run 8 at (107.53,-45.33) startOffset 7 endOffset 8 width 4.00: " " + chunk 1 text run 9 at (109.66,-50.52) startOffset 8 endOffset 9 width 7.10: "a" + chunk 1 text run 10 at (112.01,-55.41) startOffset 9 endOffset 10 width 4.00: " " chunk 1 text run 11 at (114.97,-60.68) startOffset 10 endOffset 11 width 8.00: "p" - chunk 1 text run 12 at (119.21,-66.94) startOffset 11 endOffset 12 width 7.10: "a" + chunk 1 text run 12 at (119.21,-66.95) startOffset 11 endOffset 12 width 7.10: "a" chunk 1 text run 13 at (122.78,-71.37) startOffset 12 endOffset 13 width 4.45: "t" - chunk 1 text run 14 at (127.14,-75.94) startOffset 13 endOffset 14 width 8.00: "h" + chunk 1 text run 14 at (127.14,-75.95) startOffset 13 endOffset 14 width 8.00: "h" LayoutSVGTSpan {tspan} at (0,0) size 94x34 LayoutSVGInlineText {#text} at (105,0) size 93x34 - chunk 1 text run 1 at (134.60,-82.16) startOffset 0 endOffset 1 width 11.55: "w" - chunk 1 text run 2 at (141.39,-86.41) startOffset 1 endOffset 2 width 4.45: "i" + chunk 1 text run 1 at (134.61,-82.16) startOffset 0 endOffset 1 width 11.55: "w" + chunk 1 text run 2 at (141.40,-86.42) startOffset 1 endOffset 2 width 4.45: "i" chunk 1 text run 3 at (145.35,-88.38) startOffset 2 endOffset 3 width 4.45: "t" - chunk 1 text run 4 at (151.17,-90.67) startOffset 3 endOffset 4 width 8.00: "h" + chunk 1 text run 4 at (151.18,-90.67) startOffset 3 endOffset 4 width 8.00: "h" chunk 1 text run 5 at (156.92,-92.28) startOffset 4 endOffset 5 width 4.00: " " - chunk 1 text run 6 at (162.85,-93.31) startOffset 5 endOffset 6 width 8.00: "n" - chunk 1 text run 7 at (170.38,-93.75) startOffset 6 endOffset 7 width 7.10: "e" + chunk 1 text run 6 at (162.86,-93.31) startOffset 5 endOffset 6 width 8.00: "n" + chunk 1 text run 7 at (170.39,-93.75) startOffset 6 endOffset 7 width 7.10: "e" chunk 1 text run 8 at (177.03,-93.33) startOffset 7 endOffset 8 width 6.23: "s" chunk 1 text run 9 at (182.32,-92.45) startOffset 8 endOffset 9 width 4.45: "t" chunk 1 text run 10 at (187.87,-90.98) startOffset 9 endOffset 10 width 7.10: "e" @@ -60,9 +60,9 @@ LayoutSVGTSpan {tspan} at (0,0) size 41x40 LayoutSVGInlineText {#text} at (186,19) size 40x40 chunk 1 text run 1 at (200.23,-85.50) startOffset 0 endOffset 1 width 4.00: " " - chunk 1 text run 2 at (203.81,-83.26) startOffset 1 endOffset 2 width 4.45: "t" - chunk 1 text run 3 at (208.16,-80.07) startOffset 2 endOffset 3 width 6.23: "s" - chunk 1 text run 4 at (213.42,-75.41) startOffset 3 endOffset 4 width 8.00: "p" + chunk 1 text run 2 at (203.82,-83.26) startOffset 1 endOffset 2 width 4.45: "t" + chunk 1 text run 3 at (208.17,-80.06) startOffset 2 endOffset 3 width 6.23: "s" + chunk 1 text run 4 at (213.42,-75.40) startOffset 3 endOffset 4 width 8.00: "p" chunk 1 text run 5 at (218.59,-69.76) startOffset 4 endOffset 5 width 7.10: "a" chunk 1 text run 6 at (223.02,-63.81) startOffset 5 endOffset 6 width 8.00: "n" LayoutSVGInlineText {#text} at (221,39) size 32x17 @@ -80,20 +80,20 @@ chunk 1 text run 1 at (10.00,0.00) startOffset 0 endOffset 14 width 89.78: "This is simple" LayoutSVGTextPath {textPath} at (0,0) size 161x93 LayoutSVGInlineText {#text} at (78,13) size 66x79 - chunk 1 text run 1 at (102.69,-28.35) startOffset 0 endOffset 1 width 4.45: "t" - chunk 1 text run 2 at (103.98,-34.00) startOffset 1 endOffset 2 width 7.10: "e" - chunk 1 text run 3 at (106.01,-41.01) startOffset 2 endOffset 3 width 8.00: "x" - chunk 1 text run 4 at (108.20,-47.06) startOffset 3 endOffset 4 width 4.45: "t" - chunk 1 text run 5 at (109.86,-50.96) startOffset 4 endOffset 5 width 4.00: " " - chunk 1 text run 6 at (112.42,-56.21) startOffset 5 endOffset 6 width 8.00: "o" - chunk 1 text run 7 at (116.57,-63.20) startOffset 6 endOffset 7 width 8.00: "n" - chunk 1 text run 8 at (120.03,-68.03) startOffset 7 endOffset 8 width 4.00: " " - chunk 1 text run 9 at (123.58,-72.27) startOffset 8 endOffset 9 width 7.10: "a" + chunk 1 text run 1 at (102.70,-28.36) startOffset 0 endOffset 1 width 4.45: "t" + chunk 1 text run 2 at (103.99,-34.01) startOffset 1 endOffset 2 width 7.10: "e" + chunk 1 text run 3 at (106.02,-41.01) startOffset 2 endOffset 3 width 8.00: "x" + chunk 1 text run 4 at (108.21,-47.07) startOffset 3 endOffset 4 width 4.45: "t" + chunk 1 text run 5 at (109.86,-50.97) startOffset 4 endOffset 5 width 4.00: " " + chunk 1 text run 6 at (112.43,-56.22) startOffset 5 endOffset 6 width 8.00: "o" + chunk 1 text run 7 at (116.58,-63.21) startOffset 6 endOffset 7 width 8.00: "n" + chunk 1 text run 8 at (120.04,-68.04) startOffset 7 endOffset 8 width 4.00: " " + chunk 1 text run 9 at (123.59,-72.28) startOffset 8 endOffset 9 width 7.10: "a" chunk 1 text run 10 at (127.50,-76.29) startOffset 9 endOffset 10 width 4.00: " " - chunk 1 text run 11 at (131.96,-80.16) startOffset 10 endOffset 11 width 8.00: "p" - chunk 1 text run 12 at (138.19,-84.55) startOffset 11 endOffset 12 width 7.10: "a" + chunk 1 text run 11 at (131.96,-80.17) startOffset 10 endOffset 11 width 8.00: "p" + chunk 1 text run 12 at (138.19,-84.56) startOffset 11 endOffset 12 width 7.10: "a" chunk 1 text run 13 at (143.19,-87.35) startOffset 12 endOffset 13 width 4.45: "t" - chunk 1 text run 14 at (148.91,-89.86) startOffset 13 endOffset 14 width 8.00: "h" + chunk 1 text run 14 at (148.92,-89.86) startOffset 13 endOffset 14 width 8.00: "h" LayoutSVGTSpan {tspan} at (0,0) size 90x44 LayoutSVGInlineText {#text} at (137,0) size 89x44 chunk 1 text run 1 at (158.28,-92.57) startOffset 0 endOffset 1 width 11.55: "w" @@ -104,15 +104,15 @@ chunk 1 text run 6 at (188.56,-90.76) startOffset 5 endOffset 6 width 8.00: "n" chunk 1 text run 7 at (195.62,-87.93) startOffset 6 endOffset 7 width 7.10: "e" chunk 1 text run 8 at (201.42,-84.79) startOffset 7 endOffset 8 width 6.23: "s" - chunk 1 text run 9 at (205.89,-81.80) startOffset 8 endOffset 9 width 4.45: "t" + chunk 1 text run 9 at (205.90,-81.80) startOffset 8 endOffset 9 width 4.45: "t" chunk 1 text run 10 at (210.37,-78.22) startOffset 9 endOffset 10 width 7.10: "e" chunk 1 text run 11 at (215.80,-72.95) startOffset 10 endOffset 11 width 8.00: "d" LayoutSVGTSpan {tspan} at (0,0) size 33x44 LayoutSVGInlineText {#text} at (206,39) size 33x44 chunk 1 text run 1 at (219.70,-68.38) startOffset 0 endOffset 1 width 4.00: " " - chunk 1 text run 2 at (222.17,-65.05) startOffset 1 endOffset 2 width 4.45: "t" + chunk 1 text run 2 at (222.17,-65.04) startOffset 1 endOffset 2 width 4.45: "t" chunk 1 text run 3 at (225.12,-60.54) startOffset 2 endOffset 3 width 6.23: "s" - chunk 1 text run 4 at (228.55,-54.31) startOffset 3 endOffset 4 width 8.00: "p" + chunk 1 text run 4 at (228.56,-54.31) startOffset 3 endOffset 4 width 8.00: "p" chunk 1 text run 5 at (231.63,-47.49) startOffset 4 endOffset 5 width 7.10: "a" chunk 1 text run 6 at (234.24,-40.22) startOffset 5 endOffset 6 width 8.00: "n" LayoutSVGInlineText {#text} at (232,63) size 32x17 @@ -131,39 +131,39 @@ LayoutSVGTextPath {textPath} at (0,0) size 162x88 LayoutSVGInlineText {#text} at (79,11) size 69x76 chunk 1 (middle anchor) text run 1 at (103.88,-33.58) startOffset 0 endOffset 1 width 4.45: "t" - chunk 1 (middle anchor) text run 2 at (105.38,-38.99) startOffset 1 endOffset 2 width 7.10: "e" + chunk 1 (middle anchor) text run 2 at (105.38,-39.00) startOffset 1 endOffset 2 width 7.10: "e" chunk 1 (middle anchor) text run 3 at (107.87,-46.22) startOffset 2 endOffset 3 width 8.00: "x" chunk 1 (middle anchor) text run 4 at (110.31,-51.96) startOffset 3 endOffset 4 width 4.45: "t" - chunk 1 (middle anchor) text run 5 at (112.13,-55.64) startOffset 4 endOffset 5 width 4.00: " " - chunk 1 (middle anchor) text run 6 at (115.12,-60.92) startOffset 5 endOffset 6 width 8.00: "o" - chunk 1 (middle anchor) text run 7 at (119.64,-67.51) startOffset 6 endOffset 7 width 8.00: "n" - chunk 1 (middle anchor) text run 8 at (123.43,-72.11) startOffset 7 endOffset 8 width 4.00: " " + chunk 1 (middle anchor) text run 5 at (112.13,-55.65) startOffset 4 endOffset 5 width 4.00: " " + chunk 1 (middle anchor) text run 6 at (115.12,-60.93) startOffset 5 endOffset 6 width 8.00: "o" + chunk 1 (middle anchor) text run 7 at (119.64,-67.52) startOffset 6 endOffset 7 width 8.00: "n" + chunk 1 (middle anchor) text run 8 at (123.44,-72.11) startOffset 7 endOffset 8 width 4.00: " " chunk 1 (middle anchor) text run 9 at (127.34,-76.14) startOffset 8 endOffset 9 width 7.10: "a" - chunk 1 (middle anchor) text run 10 at (131.45,-79.75) startOffset 9 endOffset 10 width 4.00: " " + chunk 1 (middle anchor) text run 10 at (131.45,-79.76) startOffset 9 endOffset 10 width 4.00: " " chunk 1 (middle anchor) text run 11 at (136.32,-83.35) startOffset 10 endOffset 11 width 8.00: "p" chunk 1 (middle anchor) text run 12 at (142.80,-87.15) startOffset 11 endOffset 12 width 7.10: "a" chunk 1 (middle anchor) text run 13 at (148.08,-89.54) startOffset 12 endOffset 13 width 4.45: "t" - chunk 1 (middle anchor) text run 14 at (153.97,-91.53) startOffset 13 endOffset 14 width 8.00: "h" + chunk 1 (middle anchor) text run 14 at (153.98,-91.53) startOffset 13 endOffset 14 width 8.00: "h" LayoutSVGTSpan {tspan} at (0,0) size 86x48 LayoutSVGInlineText {#text} at (145,0) size 86x48 - chunk 1 (middle anchor) text run 1 at (163.56,-93.40) startOffset 0 endOffset 1 width 11.55: "w" + chunk 1 (middle anchor) text run 1 at (163.57,-93.40) startOffset 0 endOffset 1 width 11.55: "w" chunk 1 (middle anchor) text run 2 at (171.55,-93.73) startOffset 1 endOffset 2 width 4.45: "i" - chunk 1 (middle anchor) text run 3 at (175.98,-93.45) startOffset 2 endOffset 3 width 4.45: "t" + chunk 1 (middle anchor) text run 3 at (175.98,-93.44) startOffset 2 endOffset 3 width 4.45: "t" chunk 1 (middle anchor) text run 4 at (182.15,-92.48) startOffset 3 endOffset 4 width 8.00: "h" - chunk 1 (middle anchor) text run 5 at (187.92,-90.96) startOffset 4 endOffset 5 width 4.00: " " + chunk 1 (middle anchor) text run 5 at (187.93,-90.96) startOffset 4 endOffset 5 width 4.00: " " chunk 1 (middle anchor) text run 6 at (193.57,-88.86) startOffset 5 endOffset 6 width 8.00: "n" - chunk 1 (middle anchor) text run 7 at (200.28,-85.48) startOffset 6 endOffset 7 width 7.10: "e" + chunk 1 (middle anchor) text run 7 at (200.28,-85.47) startOffset 6 endOffset 7 width 7.10: "e" chunk 1 (middle anchor) text run 8 at (205.89,-81.80) startOffset 7 endOffset 8 width 6.23: "s" - chunk 1 (middle anchor) text run 9 at (210.04,-78.51) startOffset 8 endOffset 9 width 4.45: "t" + chunk 1 (middle anchor) text run 9 at (210.05,-78.51) startOffset 8 endOffset 9 width 4.45: "t" chunk 1 (middle anchor) text run 10 at (214.24,-74.58) startOffset 9 endOffset 10 width 7.10: "e" chunk 1 (middle anchor) text run 11 at (219.29,-68.89) startOffset 10 endOffset 11 width 8.00: "d" LayoutSVGTSpan {tspan} at (0,0) size 32x44 LayoutSVGInlineText {#text} at (209,44) size 32x44 - chunk 1 (middle anchor) text run 1 at (222.80,-64.14) startOffset 0 endOffset 1 width 4.00: " " + chunk 1 (middle anchor) text run 1 at (222.80,-64.13) startOffset 0 endOffset 1 width 4.00: " " chunk 1 (middle anchor) text run 2 at (225.11,-60.54) startOffset 1 endOffset 2 width 4.45: "t" chunk 1 (middle anchor) text run 3 at (227.77,-55.84) startOffset 2 endOffset 3 width 6.23: "s" chunk 1 (middle anchor) text run 4 at (230.77,-49.55) startOffset 3 endOffset 4 width 8.00: "p" - chunk 1 (middle anchor) text run 5 at (233.54,-42.35) startOffset 4 endOffset 5 width 7.10: "a" + chunk 1 (middle anchor) text run 5 at (233.54,-42.34) startOffset 4 endOffset 5 width 7.10: "a" chunk 1 (middle anchor) text run 6 at (235.68,-35.28) startOffset 5 endOffset 6 width 8.00: "n" LayoutSVGInlineText {#text} at (233,68) size 32x17 chunk 1 text run 1 at (243.68,-35.28) startOffset 0 endOffset 5 width 32.00: " xxx "
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath3-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath3-expected.png index edc8f46..09fa4ef 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath3-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath3-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath3-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath3-expected.txt index 5b685df..19be2c93 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath3-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPath3-expected.txt
@@ -18,29 +18,29 @@ LayoutSVGText {text} at (95,-108) size 156x80 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 156x80 LayoutSVGInlineText {#text} at (0,0) size 156x80 - chunk 1 (middle anchor) text run 1 at (110.46,-52.27) startOffset 0 endOffset 1 width 9.77: "T" - chunk 1 (middle anchor) text run 2 at (114.07,-59.16) startOffset 1 endOffset 2 width 5.98: "e" + chunk 1 (middle anchor) text run 1 at (110.46,-52.28) startOffset 0 endOffset 1 width 9.77: "T" + chunk 1 (middle anchor) text run 2 at (114.07,-59.17) startOffset 1 endOffset 2 width 5.98: "e" chunk 1 (middle anchor) text run 3 at (117.89,-65.13) startOffset 2 endOffset 3 width 8.00: "x" - chunk 1 (middle anchor) text run 4 at (121.58,-69.96) startOffset 3 endOffset 4 width 4.45: "t" + chunk 1 (middle anchor) text run 4 at (121.59,-69.97) startOffset 3 endOffset 4 width 4.45: "t" chunk 1 (middle anchor) text run 5 at (124.43,-73.20) startOffset 4 endOffset 5 width 4.00: " " chunk 1 (middle anchor) text run 6 at (128.72,-77.42) startOffset 5 endOffset 6 width 8.00: "o" - chunk 1 (middle anchor) text run 7 at (134.93,-82.40) startOffset 6 endOffset 7 width 8.00: "n" + chunk 1 (middle anchor) text run 7 at (134.94,-82.40) startOffset 6 endOffset 7 width 8.00: "n" chunk 1 (middle anchor) text run 8 at (140.01,-85.64) startOffset 7 endOffset 8 width 4.00: " " chunk 1 (middle anchor) text run 9 at (144.89,-88.17) startOffset 8 endOffset 9 width 7.10: "a" - chunk 1 (middle anchor) text run 10 at (150.07,-90.29) startOffset 9 endOffset 10 width 4.00: " " - chunk 1 (middle anchor) text run 11 at (155.79,-92.01) startOffset 10 endOffset 11 width 8.00: "p" + chunk 1 (middle anchor) text run 10 at (150.08,-90.29) startOffset 9 endOffset 10 width 4.00: " " + chunk 1 (middle anchor) text run 11 at (155.80,-92.01) startOffset 10 endOffset 11 width 8.00: "p" chunk 1 (middle anchor) text run 12 at (163.24,-93.36) startOffset 11 endOffset 12 width 7.10: "a" - chunk 1 (middle anchor) text run 13 at (168.99,-93.74) startOffset 12 endOffset 13 width 4.45: "t" + chunk 1 (middle anchor) text run 13 at (169.00,-93.74) startOffset 12 endOffset 13 width 4.45: "t" chunk 1 (middle anchor) text run 14 at (175.21,-93.52) startOffset 13 endOffset 14 width 8.00: "h" chunk 1 (middle anchor) text run 15 at (181.16,-92.68) startOffset 14 endOffset 15 width 4.00: " " - chunk 1 (middle anchor) text run 16 at (185.69,-91.62) startOffset 15 endOffset 16 width 5.33: "f" + chunk 1 (middle anchor) text run 16 at (185.70,-91.62) startOffset 15 endOffset 16 width 5.33: "f" chunk 1 (middle anchor) text run 17 at (192.01,-89.50) startOffset 16 endOffset 17 width 8.00: "o" chunk 1 (middle anchor) text run 18 at (198.06,-86.71) startOffset 17 endOffset 18 width 5.33: "r" chunk 1 (middle anchor) text run 19 at (202.08,-84.39) startOffset 18 endOffset 19 width 4.00: " " - chunk 1 (middle anchor) text run 20 at (205.61,-82.00) startOffset 19 endOffset 20 width 4.45: "t" + chunk 1 (middle anchor) text run 20 at (205.62,-82.00) startOffset 19 endOffset 20 width 4.45: "t" chunk 1 (middle anchor) text run 21 at (210.12,-78.44) startOffset 20 endOffset 21 width 7.10: "e" chunk 1 (middle anchor) text run 22 at (215.56,-73.21) startOffset 21 endOffset 22 width 8.00: "x" - chunk 1 (middle anchor) text run 23 at (219.62,-68.47) startOffset 22 endOffset 23 width 4.45: "t" + chunk 1 (middle anchor) text run 23 at (219.63,-68.47) startOffset 22 endOffset 23 width 4.45: "t" chunk 1 (middle anchor) text run 24 at (222.10,-65.14) startOffset 23 endOffset 24 width 4.00: " " chunk 1 (middle anchor) text run 25 at (226.33,-58.47) startOffset 24 endOffset 25 width 11.55: "w" chunk 1 (middle anchor) text run 26 at (229.91,-51.47) startOffset 25 endOffset 26 width 4.45: "/" @@ -66,17 +66,17 @@ chunk 1 (middle anchor) text run 4 at (202.48,-84.13) startOffset 3 endOffset 4 width 4.45: "t" chunk 1 (middle anchor) text run 5 at (206.00,-81.72) startOffset 4 endOffset 5 width 4.00: " " chunk 1 (middle anchor) text run 6 at (210.64,-77.99) startOffset 5 endOffset 6 width 8.00: "o" - chunk 1 (middle anchor) text run 7 at (216.35,-72.34) startOffset 6 endOffset 7 width 8.00: "n" + chunk 1 (middle anchor) text run 7 at (216.36,-72.34) startOffset 6 endOffset 7 width 8.00: "n" chunk 1 (middle anchor) text run 8 at (220.18,-67.76) startOffset 7 endOffset 8 width 4.00: " " chunk 1 (middle anchor) text run 9 at (223.38,-63.28) startOffset 8 endOffset 9 width 7.10: "a" - chunk 1 (middle anchor) text run 10 at (226.34,-58.45) startOffset 9 endOffset 10 width 4.00: " " + chunk 1 (middle anchor) text run 10 at (226.35,-58.45) startOffset 9 endOffset 10 width 4.00: " " chunk 1 (middle anchor) text run 11 at (229.09,-53.23) startOffset 10 endOffset 11 width 8.00: "p" chunk 1 (middle anchor) text run 12 at (232.09,-46.32) startOffset 11 endOffset 12 width 7.10: "a" - chunk 1 (middle anchor) text run 13 at (234.09,-40.71) startOffset 12 endOffset 13 width 4.45: "t" + chunk 1 (middle anchor) text run 13 at (234.09,-40.70) startOffset 12 endOffset 13 width 4.45: "t" chunk 1 (middle anchor) text run 14 at (235.77,-34.95) startOffset 13 endOffset 14 width 8.00: "h" chunk 1 (middle anchor) text run 15 at (237.15,-29.11) startOffset 14 endOffset 15 width 4.00: " " chunk 1 (middle anchor) text run 16 at (238.04,-24.39) startOffset 15 endOffset 16 width 5.33: "f" - chunk 1 (middle anchor) text run 17 at (238.99,-17.75) startOffset 16 endOffset 17 width 8.00: "o" + chunk 1 (middle anchor) text run 17 at (238.99,-17.74) startOffset 16 endOffset 17 width 8.00: "o" chunk 1 (middle anchor) text run 18 at (239.62,-11.04) startOffset 17 endOffset 18 width 5.33: "r" chunk 1 (middle anchor) text run 19 at (239.87,-6.46) startOffset 18 endOffset 19 width 4.00: " " chunk 1 (middle anchor) text run 20 at (239.99,-2.21) startOffset 19 endOffset 20 width 4.45: "t" @@ -95,10 +95,10 @@ LayoutSVGInlineText {#text} at (0,0) size 120x59 chunk 1 (middle anchor) text run 1 at (134.77,-82.28) startOffset 0 endOffset 1 width 8.00: "p" chunk 1 (middle anchor) text run 2 at (141.18,-86.30) startOffset 1 endOffset 2 width 7.10: "a" - chunk 1 (middle anchor) text run 3 at (146.34,-88.82) startOffset 2 endOffset 3 width 4.45: "t" + chunk 1 (middle anchor) text run 3 at (146.35,-88.82) startOffset 2 endOffset 3 width 4.45: "t" chunk 1 (middle anchor) text run 4 at (152.20,-91.00) startOffset 3 endOffset 4 width 8.00: "h" chunk 1 (middle anchor) text run 5 at (157.98,-92.51) startOffset 4 endOffset 5 width 4.00: " " - chunk 1 (middle anchor) text run 6 at (162.59,-93.28) startOffset 5 endOffset 6 width 5.33: "f" + chunk 1 (middle anchor) text run 6 at (162.60,-93.28) startOffset 5 endOffset 6 width 5.33: "f" chunk 1 (middle anchor) text run 7 at (169.24,-93.75) startOffset 6 endOffset 7 width 8.00: "o" chunk 1 (middle anchor) text run 8 at (175.89,-93.45) startOffset 7 endOffset 8 width 5.33: "r" chunk 1 (middle anchor) text run 9 at (180.52,-92.80) startOffset 8 endOffset 9 width 4.00: " " @@ -106,10 +106,10 @@ chunk 1 (middle anchor) text run 11 at (190.15,-90.21) startOffset 10 endOffset 11 width 7.10: "e" chunk 1 (middle anchor) text run 12 at (197.10,-87.20) startOffset 11 endOffset 12 width 8.00: "x" chunk 1 (middle anchor) text run 13 at (202.47,-84.14) startOffset 12 endOffset 13 width 4.45: "t" - chunk 1 (middle anchor) text run 14 at (206.00,-81.73) startOffset 13 endOffset 14 width 4.00: " " + chunk 1 (middle anchor) text run 14 at (206.00,-81.72) startOffset 13 endOffset 14 width 4.00: " " chunk 1 (middle anchor) text run 15 at (211.94,-76.81) startOffset 14 endOffset 15 width 11.55: "w" chunk 1 (middle anchor) text run 16 at (217.56,-70.98) startOffset 15 endOffset 16 width 4.45: "/" - chunk 1 (middle anchor) text run 17 at (220.17,-67.76) startOffset 16 endOffset 17 width 4.00: " " + chunk 1 (middle anchor) text run 17 at (220.18,-67.76) startOffset 16 endOffset 17 width 4.00: " " chunk 1 (middle anchor) text run 18 at (222.18,-65.03) startOffset 17 endOffset 18 width 2.88: "'" chunk 1 (middle anchor) text run 19 at (225.18,-60.43) startOffset 18 endOffset 19 width 8.00: "x" chunk 1 (middle anchor) text run 20 at (227.88,-55.64) startOffset 19 endOffset 20 width 2.88: "'"
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPathSpaces-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPathSpaces-expected.png index 448e8ef..fe86ab9 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPathSpaces-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPathSpaces-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPathSpaces-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPathSpaces-expected.txt index fab36731..b95fbde 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPathSpaces-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textOnPathSpaces-expected.txt
@@ -70,11 +70,11 @@ LayoutSVGTextPath {textPath} at (0,0) size 120x45 LayoutSVGInlineText {#text} at (0,0) size 120x45 chunk 1 text run 1 at (17.81,27.20) startOffset 0 endOffset 1 width 7.78: "s" - chunk 1 text run 2 at (34.70,12.82) startOffset 1 endOffset 2 width 8.88: "a" + chunk 1 text run 2 at (34.70,12.81) startOffset 1 endOffset 2 width 8.88: "a" chunk 1 text run 3 at (58.59,13.68) startOffset 2 endOffset 3 width 15.56: "m" chunk 1 text run 4 at (78.67,31.53) startOffset 3 endOffset 4 width 10.00: "p" chunk 1 text run 5 at (99.04,34.45) startOffset 4 endOffset 5 width 5.56: "l" - chunk 1 text run 6 at (115.72,21.50) startOffset 5 endOffset 6 width 8.88: "e" + chunk 1 text run 6 at (115.73,21.50) startOffset 5 endOffset 6 width 8.88: "e" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 72x12 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,0) size 72x12 @@ -90,7 +90,7 @@ chunk 1 text run 3 at (37.07,11.47) startOffset 2 endOffset 3 width 15.56: "m" chunk 1 text run 4 at (51.49,9.50) startOffset 3 endOffset 4 width 10.00: "p" chunk 1 text run 5 at (59.92,14.92) startOffset 4 endOffset 5 width 5.56: "l" - chunk 1 text run 6 at (66.75,21.64) startOffset 5 endOffset 6 width 8.88: "e" + chunk 1 text run 6 at (66.75,21.65) startOffset 5 endOffset 6 width 8.88: "e" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 67x12 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,0) size 67x12 @@ -105,7 +105,7 @@ chunk 1 text run 2 at (38.26,10.88) startOffset 1 endOffset 2 width 8.88: "a" chunk 1 text run 3 at (64.62,19.59) startOffset 2 endOffset 3 width 15.56: "m" chunk 1 text run 4 at (90.72,36.18) startOffset 3 endOffset 4 width 10.00: "p" - chunk 1 text run 5 at (107.41,27.71) startOffset 4 endOffset 5 width 5.56: "l" + chunk 1 text run 5 at (107.42,27.71) startOffset 4 endOffset 5 width 5.56: "l" chunk 1 text run 6 at (122.33,18.12) startOffset 5 endOffset 6 width 8.88: "e" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 72x12 contains 1 chunk(s) @@ -145,10 +145,10 @@ LayoutSVGText {text} at (2,-2) size 35x35 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 35x35 LayoutSVGInlineText {#text} at (0,0) size 35x35 - chunk 1 text run 1 at (16.73,28.28) startOffset 0 endOffset 1 width 4.78: "s" + chunk 1 text run 1 at (16.73,28.27) startOffset 0 endOffset 1 width 4.78: "s" chunk 1 text run 2 at (18.41,26.60) startOffset 1 endOffset 2 width 5.88: "a" - chunk 1 text run 3 at (22.90,22.27) startOffset 2 endOffset 3 width 12.56: "m" - chunk 1 text run 4 at (27.91,17.79) startOffset 3 endOffset 4 width 7.00: "p" + chunk 1 text run 3 at (22.90,22.26) startOffset 2 endOffset 3 width 12.56: "m" + chunk 1 text run 4 at (27.92,17.79) startOffset 3 endOffset 4 width 7.00: "p" chunk 1 text run 5 at (29.30,16.66) startOffset 4 endOffset 5 width 2.56: "l" chunk 1 text run 6 at (30.25,15.92) startOffset 5 endOffset 6 width 5.88: "e" LayoutSVGInlineText {#text} at (0,0) size 0x0 @@ -164,7 +164,7 @@ chunk 1 text run 1 at (17.81,27.20) startOffset 0 endOffset 1 width 7.78: "s" chunk 1 text run 2 at (20.59,24.47) startOffset 1 endOffset 2 width 8.88: "a" chunk 1 text run 3 at (26.17,19.29) startOffset 2 endOffset 3 width 15.56: "m" - chunk 1 text run 4 at (32.70,14.13) startOffset 3 endOffset 4 width 10.00: "p" + chunk 1 text run 4 at (32.70,14.12) startOffset 3 endOffset 4 width 10.00: "p" chunk 1 text run 5 at (35.51,12.33) startOffset 4 endOffset 5 width 5.56: "l" chunk 1 text run 6 at (37.87,11.07) startOffset 5 endOffset 6 width 8.88: "e" chunk 1 text run 7 at (58.61,13.69) startOffset 6 endOffset 7 width 45.00: " " @@ -194,7 +194,7 @@ chunk 1 text run 5 at (63.01,18.00) startOffset 4 endOffset 5 width 5.56: "l" chunk 1 text run 6 at (69.75,24.44) startOffset 5 endOffset 6 width 8.88: "e" chunk 1 text run 7 at (74.10,28.18) startOffset 6 endOffset 7 width 0.00: " " - chunk 1 text run 8 at (72.98,27.26) startOffset 7 endOffset 8 width 7.78: "s" + chunk 1 text run 8 at (72.99,27.26) startOffset 7 endOffset 8 width 7.78: "s" chunk 1 text run 9 at (81.80,33.39) startOffset 8 endOffset 9 width 8.88: "a" chunk 1 text run 10 at (96.94,35.35) startOffset 9 endOffset 10 width 15.56: "m" chunk 1 text run 11 at (110.17,25.39) startOffset 10 endOffset 11 width 10.00: "p"
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/verticalText-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/verticalText-expected.txt index 9e98e1e4..1ecc6dc6 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/verticalText-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/verticalText-expected.txt
@@ -257,14 +257,14 @@ chunk 1 (vertical) text run 14 at (183.26,36.15) startOffset 13 endOffset 14 height 15.00: " " chunk 1 (vertical) text run 15 at (196.10,28.90) startOffset 14 endOffset 15 height 15.00: "o" chunk 1 (vertical) text run 16 at (206.99,18.58) startOffset 15 endOffset 16 height 15.00: "n" - chunk 1 (vertical) text run 17 at (219.50,10.34) startOffset 16 endOffset 17 height 15.00: " " + chunk 1 (vertical) text run 17 at (219.51,10.34) startOffset 16 endOffset 17 height 15.00: " " chunk 1 (vertical) text run 18 at (234.00,10.53) startOffset 17 endOffset 18 height 15.00: "a" chunk 1 (vertical) text run 19 at (245.44,20.39) startOffset 18 endOffset 19 height 15.00: " " - chunk 1 (vertical) text run 20 at (256.67,30.15) startOffset 19 endOffset 20 height 15.00: "P" + chunk 1 (vertical) text run 20 at (256.68,30.15) startOffset 19 endOffset 20 height 15.00: "P" chunk 1 (vertical) text run 21 at (270.28,36.14) startOffset 20 endOffset 21 height 15.00: "a" chunk 1 (vertical) text run 22 at (283.84,31.10) startOffset 21 endOffset 22 height 15.00: "t" chunk 1 (vertical) text run 23 at (294.78,20.53) startOffset 22 endOffset 23 height 15.00: "h" - chunk 1 (vertical) text run 24 at (306.77,11.62) startOffset 23 endOffset 24 height 15.00: "\x{753B}" + chunk 1 (vertical) text run 24 at (306.78,11.62) startOffset 23 endOffset 24 height 15.00: "\x{753B}" chunk 1 (vertical) text run 25 at (321.16,9.40) startOffset 24 endOffset 25 height 15.00: "\x{50CF}" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGContainer {use} at (0,0) size 448x498
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/verticalTextOnPath-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/verticalTextOnPath-expected.png index afb00c7b..fb29dc47 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/verticalTextOnPath-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/verticalTextOnPath-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/verticalTextOnPath-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/verticalTextOnPath-expected.txt index 610faab..cf197dbd 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/verticalTextOnPath-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/verticalTextOnPath-expected.txt
@@ -29,9 +29,9 @@ chunk 1 (vertical) text run 1 at (53.45,10.26) startOffset 0 endOffset 1 height 17.00: " " chunk 1 (vertical) text run 2 at (57.98,13.16) startOffset 1 endOffset 2 height 17.00: "a" chunk 1 (vertical) text run 3 at (62.14,17.13) startOffset 2 endOffset 3 height 17.00: " " - chunk 1 (vertical) text run 4 at (66.83,21.72) startOffset 3 endOffset 4 height 17.00: "P" - chunk 1 (vertical) text run 5 at (72.71,27.04) startOffset 4 endOffset 5 height 17.00: "a" - chunk 1 (vertical) text run 6 at (77.02,30.39) startOffset 5 endOffset 6 height 17.00: "t" + chunk 1 (vertical) text run 4 at (66.83,21.73) startOffset 3 endOffset 4 height 17.00: "P" + chunk 1 (vertical) text run 5 at (72.72,27.04) startOffset 4 endOffset 5 height 17.00: "a" + chunk 1 (vertical) text run 6 at (77.02,30.40) startOffset 5 endOffset 6 height 17.00: "t" chunk 1 (vertical) text run 7 at (81.70,33.34) startOffset 6 endOffset 7 height 17.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 66x12 contains 1 chunk(s) @@ -110,14 +110,14 @@ chunk 1 (vertical) text run 2 at (82.25,33.62) startOffset 1 endOffset 2 height 17.00: "e" chunk 1 (vertical) text run 3 at (88.32,35.84) startOffset 2 endOffset 3 height 17.00: "x" chunk 1 (vertical) text run 4 at (93.81,36.09) startOffset 3 endOffset 4 height 17.00: "t" - chunk 1 (vertical) text run 5 at (97.61,35.10) startOffset 4 endOffset 5 height 17.00: " " + chunk 1 (vertical) text run 5 at (97.61,35.09) startOffset 4 endOffset 5 height 17.00: " " LayoutSVGTSpan {tspan} at (0,0) size 23x22 LayoutSVGInlineText {#text} at (21,4) size 22x23 chunk 1 (vertical) text run 1 at (102.28,32.40) startOffset 0 endOffset 1 height 17.00: "o" chunk 1 (vertical) text run 2 at (107.69,27.46) startOffset 1 endOffset 2 height 17.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 26x29 LayoutSVGInlineText {#text} at (38,0) size 29x26 - chunk 1 (vertical) text run 1 at (111.94,24.03) startOffset 0 endOffset 1 height 17.00: " " + chunk 1 (vertical) text run 1 at (111.95,24.03) startOffset 0 endOffset 1 height 17.00: " " chunk 1 (vertical) text run 2 at (116.51,21.04) startOffset 1 endOffset 2 height 17.00: "a" chunk 1 (vertical) text run 3 at (121.39,18.53) startOffset 2 endOffset 3 height 17.00: " " chunk 1 (vertical) text run 4 at (127.58,16.27) startOffset 3 endOffset 4 height 17.00: "P" @@ -180,7 +180,7 @@ chunk 1 (end anchor, vertical) text run 2 at (96.34,35.54) startOffset 1 endOffset 2 height 17.00: "a" chunk 1 (end anchor, vertical) text run 3 at (101.21,33.17) startOffset 2 endOffset 3 height 17.00: " " chunk 1 (end anchor, vertical) text run 4 at (106.31,28.73) startOffset 3 endOffset 4 height 17.00: "P" - chunk 1 (end anchor, vertical) text run 5 at (112.49,23.63) startOffset 4 endOffset 5 height 17.00: "a" + chunk 1 (end anchor, vertical) text run 5 at (112.50,23.63) startOffset 4 endOffset 5 height 17.00: "a" chunk 1 (end anchor, vertical) text run 6 at (117.11,20.69) startOffset 5 endOffset 6 height 17.00: "t" chunk 1 (end anchor, vertical) text run 7 at (122.03,18.24) startOffset 6 endOffset 7 height 17.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 @@ -200,17 +200,17 @@ LayoutSVGTextPath {textPath} at (0,0) size 45x78 LayoutSVGInlineText {#text} at (0,0) size 32x29 chunk 1 (vertical) text run 1 at (47.24,8.79) startOffset 0 endOffset 1 height 17.00: "T" - chunk 1 (vertical) text run 2 at (54.41,10.74) startOffset 1 endOffset 2 height 17.00: "e" + chunk 1 (vertical) text run 2 at (54.42,10.74) startOffset 1 endOffset 2 height 17.00: "e" chunk 1 (vertical) text run 3 at (59.57,14.58) startOffset 2 endOffset 3 height 17.00: "x" chunk 1 (vertical) text run 4 at (63.58,18.57) startOffset 3 endOffset 4 height 17.00: "t" chunk 1 (vertical) text run 5 at (66.47,21.38) startOffset 4 endOffset 5 height 17.00: " " LayoutSVGTSpan {tspan} at (0,0) size 22x22 LayoutSVGInlineText {#text} at (26,8) size 21x22 - chunk 1 (vertical) text run 1 at (70.44,25.06) startOffset 0 endOffset 1 height 17.00: "o" - chunk 1 (vertical) text run 2 at (75.83,29.53) startOffset 1 endOffset 2 height 17.00: "n" + chunk 1 (vertical) text run 1 at (70.44,25.07) startOffset 0 endOffset 1 height 17.00: "o" + chunk 1 (vertical) text run 2 at (75.84,29.53) startOffset 1 endOffset 2 height 17.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 31x47 LayoutSVGInlineText {#text} at (31,14) size 46x30 - chunk 1 (vertical) text run 1 at (80.42,32.62) startOffset 0 endOffset 1 height 17.00: " " + chunk 1 (vertical) text run 1 at (80.43,32.62) startOffset 0 endOffset 1 height 17.00: " " chunk 1 (vertical) text run 2 at (85.38,35.00) startOffset 1 endOffset 2 height 17.00: "a" chunk 1 (vertical) text run 3 at (90.70,36.17) startOffset 2 endOffset 3 height 17.00: " " chunk 1 (vertical) text run 4 at (97.03,35.31) startOffset 3 endOffset 4 height 17.00: "P" @@ -239,7 +239,7 @@ LayoutSVGTSpan {tspan} at (0,0) size 24x23 LayoutSVGInlineText {#text} at (5,0) size 23x23 chunk 1 (middle anchor, vertical) text run 1 at (30.07,16.06) startOffset 0 endOffset 1 height 17.00: "o" - chunk 1 (middle anchor, vertical) text run 2 at (35.86,12.13) startOffset 1 endOffset 2 height 17.00: "n" + chunk 1 (middle anchor, vertical) text run 2 at (35.87,12.13) startOffset 1 endOffset 2 height 17.00: "n" LayoutSVGTSpan {tspan} at (0,0) size 35x45 LayoutSVGInlineText {#text} at (25,5) size 44x35 chunk 1 (middle anchor, vertical) text run 1 at (40.86,9.83) startOffset 0 endOffset 1 height 17.00: " " @@ -268,7 +268,7 @@ LayoutSVGInlineText {#text} at (0,0) size 32x31 chunk 1 (end anchor, vertical) text run 1 at (16.80,28.20) startOffset 3 endOffset 4 height 17.00: "P" chunk 1 (end anchor, vertical) text run 2 at (22.58,22.56) startOffset 4 endOffset 5 height 17.00: "a" - chunk 1 (end anchor, vertical) text run 3 at (26.58,18.94) startOffset 5 endOffset 6 height 17.00: "t" + chunk 1 (end anchor, vertical) text run 3 at (26.58,18.93) startOffset 5 endOffset 6 height 17.00: "t" chunk 1 (end anchor, vertical) text run 4 at (30.87,15.45) startOffset 6 endOffset 7 height 17.00: "h" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (35,50) size 63x12 contains 1 chunk(s) @@ -288,16 +288,16 @@ LayoutSVGTSpan {tspan} at (0,0) size 41x31 LayoutSVGInlineText {#text} at (0,5) size 31x41 chunk 1 (vertical) text run 1 at (30.12,46.89) startOffset 0 endOffset 1 height 17.00: "s" - chunk 1 (vertical) text run 2 at (31.17,40.56) startOffset 1 endOffset 2 height 17.00: "u" - chunk 1 (vertical) text run 3 at (33.65,34.02) startOffset 2 endOffset 3 height 17.00: "p" - chunk 1 (vertical) text run 4 at (37.46,28.15) startOffset 3 endOffset 4 height 17.00: "e" + chunk 1 (vertical) text run 2 at (31.18,40.56) startOffset 1 endOffset 2 height 17.00: "u" + chunk 1 (vertical) text run 3 at (33.65,34.01) startOffset 2 endOffset 3 height 17.00: "p" + chunk 1 (vertical) text run 4 at (37.46,28.14) startOffset 3 endOffset 4 height 17.00: "e" chunk 1 (vertical) text run 5 at (41.62,23.84) startOffset 4 endOffset 5 height 17.00: "r" LayoutSVGInlineText {#text} at (25,0) size 33x26 chunk 1 (vertical) text run 1 at (45.18,21.08) startOffset 0 endOffset 1 height 17.00: " " chunk 1 (vertical) text run 2 at (49.91,18.26) startOffset 1 endOffset 2 height 17.00: "a" chunk 1 (vertical) text run 3 at (56.35,15.52) startOffset 2 endOffset 3 height 17.00: "n" chunk 1 (vertical) text run 4 at (63.11,13.69) startOffset 3 endOffset 4 height 17.00: "d" - chunk 1 (vertical) text run 5 at (68.55,12.84) startOffset 4 endOffset 5 height 17.00: " " + chunk 1 (vertical) text run 5 at (68.56,12.84) startOffset 4 endOffset 5 height 17.00: " " LayoutSVGTSpan {tspan} at (0,0) size 20x21 LayoutSVGInlineText {#text} at (57,8) size 20x19 chunk 1 (vertical) text run 1 at (73.55,12.52) startOffset 0 endOffset 1 height 17.00: "s" @@ -305,7 +305,7 @@ chunk 1 (vertical) text run 3 at (87.00,13.71) startOffset 2 endOffset 3 height 17.00: "b" LayoutSVGInlineText {#text} at (74,2) size 39x36 chunk 1 (vertical) text run 1 at (93.28,15.40) startOffset 0 endOffset 1 height 17.00: "s" - chunk 1 (vertical) text run 2 at (99.28,17.85) startOffset 1 endOffset 2 height 17.00: "c" + chunk 1 (vertical) text run 2 at (99.29,17.85) startOffset 1 endOffset 2 height 17.00: "c" chunk 1 (vertical) text run 3 at (104.50,20.86) startOffset 2 endOffset 3 height 17.00: "r" chunk 1 (vertical) text run 4 at (107.70,23.26) startOffset 3 endOffset 4 height 17.00: "i" chunk 1 (vertical) text run 5 at (111.31,26.71) startOffset 4 endOffset 5 height 17.00: "p" @@ -330,9 +330,9 @@ LayoutSVGInlineText {#text} at (0,1) size 38x45 chunk 1 (vertical) text run 1 at (30.16,46.38) startOffset 0 endOffset 1 height 17.00: "p" chunk 1 (vertical) text run 2 at (31.45,39.57) startOffset 1 endOffset 2 height 17.00: "o" - chunk 1 (vertical) text run 3 at (33.87,33.58) startOffset 2 endOffset 3 height 17.00: "s" + chunk 1 (vertical) text run 3 at (33.88,33.58) startOffset 2 endOffset 3 height 17.00: "s" chunk 1 (vertical) text run 4 at (36.25,29.73) startOffset 3 endOffset 4 height 17.00: "i" - chunk 1 (vertical) text run 5 at (38.43,27.01) startOffset 4 endOffset 5 height 17.00: "t" + chunk 1 (vertical) text run 5 at (38.43,27.00) startOffset 4 endOffset 5 height 17.00: "t" chunk 1 (vertical) text run 6 at (40.88,24.51) startOffset 5 endOffset 6 height 17.00: "i" chunk 1 (vertical) text run 7 at (44.77,21.36) startOffset 6 endOffset 7 height 17.00: "v" chunk 1 (vertical) text run 8 at (50.81,17.80) startOffset 7 endOffset 8 height 17.00: "e" @@ -344,13 +344,13 @@ chunk 1 (vertical) text run 5 at (80.56,12.76) startOffset 4 endOffset 5 height 17.00: " " LayoutSVGTSpan {tspan} at (0,0) size 38x45 LayoutSVGInlineText {#text} at (62,3) size 44x38 - chunk 1 (vertical) text run 1 at (86.01,13.52) startOffset 0 endOffset 1 height 17.00: "n" + chunk 1 (vertical) text run 1 at (86.02,13.52) startOffset 0 endOffset 1 height 17.00: "n" chunk 1 (vertical) text run 2 at (92.80,15.24) startOffset 1 endOffset 2 height 17.00: "e" - chunk 1 (vertical) text run 3 at (99.28,17.85) startOffset 2 endOffset 3 height 17.00: "g" - chunk 1 (vertical) text run 4 at (105.31,21.42) startOffset 3 endOffset 4 height 17.00: "a" + chunk 1 (vertical) text run 3 at (99.29,17.85) startOffset 2 endOffset 3 height 17.00: "g" + chunk 1 (vertical) text run 4 at (105.32,21.42) startOffset 3 endOffset 4 height 17.00: "a" chunk 1 (vertical) text run 5 at (109.56,24.93) startOffset 4 endOffset 5 height 17.00: "t" chunk 1 (vertical) text run 6 at (111.97,27.46) startOffset 5 endOffset 6 height 17.00: "i" - chunk 1 (vertical) text run 7 at (114.92,31.48) startOffset 6 endOffset 7 height 17.00: "v" + chunk 1 (vertical) text run 7 at (114.92,31.49) startOffset 6 endOffset 7 height 17.00: "v" chunk 1 (vertical) text run 8 at (117.96,37.75) startOffset 7 endOffset 8 height 17.00: "e" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutSVGText {text} at (20,55) size 96x12 contains 1 chunk(s) @@ -379,11 +379,11 @@ chunk 1 (vertical) text run 12 at (3.00,69.33) startOffset 11 endOffset 12 height 22.67: " " LayoutSVGTextPath {textPath} at (0,0) size 42x58 LayoutSVGInlineText {#text} at (25,22) size 58x41 - chunk 1 (vertical) text run 1 at (34.24,32.91) startOffset 0 endOffset 1 height 22.67: "o" + chunk 1 (vertical) text run 1 at (34.24,32.90) startOffset 0 endOffset 1 height 22.67: "o" chunk 1 (vertical) text run 2 at (39.86,25.49) startOffset 1 endOffset 2 height 22.67: "n" chunk 1 (vertical) text run 3 at (45.53,20.84) startOffset 2 endOffset 3 height 22.67: " " chunk 1 (vertical) text run 4 at (51.94,17.27) startOffset 3 endOffset 4 height 22.67: "p" - chunk 1 (vertical) text run 5 at (60.75,14.22) startOffset 4 endOffset 5 height 22.67: "a" + chunk 1 (vertical) text run 5 at (60.76,14.22) startOffset 4 endOffset 5 height 22.67: "a" chunk 1 (vertical) text run 6 at (67.98,12.91) startOffset 5 endOffset 6 height 22.67: "t" chunk 1 (vertical) text run 7 at (75.31,12.50) startOffset 6 endOffset 7 height 22.67: "h" LayoutSVGInlineText {#text} at (65,41) size 23x76
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/custom/text-match-highlight-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/custom/text-match-highlight-expected.png index 117b6c5..16292d4 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/custom/text-match-highlight-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/custom/text-match-highlight-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/custom/text-match-highlight-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/custom/text-match-highlight-expected.txt index 0ff2d8d..b324e20 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/custom/text-match-highlight-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/custom/text-match-highlight-expected.txt
@@ -42,47 +42,47 @@ LayoutSVGHiddenContainer {defs} at (0,0) size 0x0 LayoutSVGPath {path} at (108,98) size 350x300 [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"] LayoutSVGText {text} at (10,36) size 233x18 contains 1 chunk(s) - LayoutSVGInlineText {#text} at (0,0) size 228x17 + LayoutSVGInlineText {#text} at (0,0) size 233x18 chunk 1 text run 1 at (10.00,50.00) startOffset 0 endOffset 36 width 232.85: "Can you findme in this stroked text?" LayoutSVGText {text} at (10,91) size 138x12 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,0) size 138x12 chunk 1 text run 1 at (10.00,100.00) startOffset 0 endOffset 23 width 138.00: "Findme in a typewriter!" LayoutSVGContainer {g} at (28,222) size 202x72 [transform={m=((0.30,0.00)(0.00,0.30)) t=(0.00,120.00)}] LayoutSVGText {text} at (69,14) size 669x239 contains 1 chunk(s) - LayoutSVGTextPath {textPath} at (0,0) size 669x238 - LayoutSVGInlineText {#text} at (0,0) size 669x238 + LayoutSVGTextPath {textPath} at (0,0) size 668x238 + LayoutSVGInlineText {#text} at (0,0) size 668x238 chunk 1 text run 1 at (109.48,190.53) startOffset 0 endOffset 1 width 26.67: "F" - chunk 1 text run 2 at (122.50,177.58) startOffset 1 endOffset 2 width 10.00: "i" - chunk 1 text run 3 at (135.53,164.80) startOffset 2 endOffset 3 width 26.67: "n" - chunk 1 text run 4 at (154.82,146.40) startOffset 3 endOffset 4 width 26.67: "d" - chunk 1 text run 5 at (178.39,125.18) startOffset 4 endOffset 5 width 36.67: "m" - chunk 1 text run 6 at (202.97,105.12) startOffset 5 endOffset 6 width 26.67: "e" - chunk 1 text run 7 at (220.54,92.43) startOffset 6 endOffset 7 width 16.67: " " - chunk 1 text run 8 at (238.91,80.94) startOffset 7 endOffset 8 width 26.67: "o" - chunk 1 text run 9 at (262.80,69.16) startOffset 8 endOffset 9 width 26.67: "n" - chunk 1 text run 10 at (283.31,62.32) startOffset 9 endOffset 10 width 16.67: " " + chunk 1 text run 2 at (122.51,177.58) startOffset 1 endOffset 2 width 10.00: "i" + chunk 1 text run 3 at (135.54,164.79) startOffset 2 endOffset 3 width 26.67: "n" + chunk 1 text run 4 at (154.83,146.39) startOffset 3 endOffset 4 width 26.67: "d" + chunk 1 text run 5 at (178.39,125.17) startOffset 4 endOffset 5 width 36.67: "m" + chunk 1 text run 6 at (202.97,105.11) startOffset 5 endOffset 6 width 26.67: "e" + chunk 1 text run 7 at (220.55,92.43) startOffset 6 endOffset 7 width 16.67: " " + chunk 1 text run 8 at (238.92,80.94) startOffset 7 endOffset 8 width 26.67: "o" + chunk 1 text run 9 at (262.81,69.16) startOffset 8 endOffset 9 width 26.67: "n" + chunk 1 text run 10 at (283.32,62.32) startOffset 9 endOffset 10 width 16.67: " " chunk 1 text run 11 at (304.62,58.84) startOffset 10 endOffset 11 width 26.67: "a" chunk 1 text run 12 at (326.23,59.54) startOffset 11 endOffset 12 width 16.67: " " chunk 1 text run 13 at (347.21,64.70) startOffset 12 endOffset 13 width 26.67: "p" chunk 1 text run 14 at (371.10,76.49) startOffset 13 endOffset 14 width 26.67: "a" chunk 1 text run 15 at (389.76,90.45) startOffset 14 endOffset 15 width 20.00: "t" - chunk 1 text run 16 at (406.65,106.65) startOffset 15 endOffset 16 width 26.67: "h" - chunk 1 text run 17 at (422.05,121.97) startOffset 16 endOffset 17 width 16.67: "!" + chunk 1 text run 16 at (406.66,106.65) startOffset 15 endOffset 16 width 26.67: "h" + chunk 1 text run 17 at (422.06,121.98) startOffset 16 endOffset 17 width 16.67: "!" chunk 1 text run 18 at (433.90,133.61) startOffset 17 endOffset 18 width 16.67: " " - chunk 1 text run 19 at (450.74,149.77) startOffset 18 endOffset 19 width 30.00: "D" - chunk 1 text run 20 at (465.45,163.37) startOffset 19 endOffset 20 width 10.00: "i" - chunk 1 text run 21 at (479.18,175.50) startOffset 20 endOffset 21 width 26.67: "d" + chunk 1 text run 19 at (450.74,149.78) startOffset 18 endOffset 19 width 30.00: "D" + chunk 1 text run 20 at (465.45,163.38) startOffset 19 endOffset 20 width 10.00: "i" + chunk 1 text run 21 at (479.18,175.51) startOffset 20 endOffset 21 width 26.67: "d" chunk 1 text run 22 at (495.84,189.32) startOffset 21 endOffset 22 width 16.67: " " - chunk 1 text run 23 at (513.09,202.37) startOffset 22 endOffset 23 width 26.67: "y" - chunk 1 text run 24 at (535.45,217.04) startOffset 23 endOffset 24 width 26.67: "o" - chunk 1 text run 25 at (559.16,229.30) startOffset 24 endOffset 25 width 26.67: "u" - chunk 1 text run 26 at (579.51,236.66) startOffset 25 endOffset 26 width 16.67: " " - chunk 1 text run 27 at (595.71,240.18) startOffset 26 endOffset 27 width 16.67: "f" - chunk 1 text run 28 at (608.98,241.37) startOffset 27 endOffset 28 width 10.00: "i" - chunk 1 text run 29 at (627.25,240.32) startOffset 28 endOffset 29 width 26.67: "n" - chunk 1 text run 30 at (652.86,233.10) startOffset 29 endOffset 30 width 26.67: "d" - chunk 1 text run 31 at (680.18,217.26) startOffset 30 endOffset 31 width 36.67: "m" - chunk 1 text run 32 at (703.93,196.12) startOffset 31 endOffset 32 width 26.67: "e" - chunk 1 text run 33 at (722.35,179.24) startOffset 32 endOffset 33 width 23.33: "?" + chunk 1 text run 23 at (513.09,202.38) startOffset 22 endOffset 23 width 26.67: "y" + chunk 1 text run 24 at (535.29,216.95) startOffset 23 endOffset 24 width 26.29: "o" + chunk 1 text run 25 at (558.82,229.15) startOffset 24 endOffset 25 width 26.67: "u" + chunk 1 text run 26 at (579.15,236.56) startOffset 25 endOffset 26 width 16.67: " " + chunk 1 text run 27 at (595.34,240.13) startOffset 26 endOffset 27 width 16.67: "f" + chunk 1 text run 28 at (608.61,241.36) startOffset 27 endOffset 28 width 10.00: "i" + chunk 1 text run 29 at (626.88,240.37) startOffset 28 endOffset 29 width 26.67: "n" + chunk 1 text run 30 at (652.52,233.25) startOffset 29 endOffset 30 width 26.67: "d" + chunk 1 text run 31 at (679.87,217.49) startOffset 30 endOffset 31 width 36.67: "m" + chunk 1 text run 32 at (703.66,196.38) startOffset 31 endOffset 32 width 26.67: "e" + chunk 1 text run 33 at (722.07,179.48) startOffset 32 endOffset 33 width 23.33: "?" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/custom/viewbox-syntax-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/custom/viewbox-syntax-expected.txt index 3abbe1a..eac47d1 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/custom/viewbox-syntax-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/custom/viewbox-syntax-expected.txt
@@ -1,13 +1,13 @@ -CONSOLE ERROR: line 20: Error: Invalid value for <svg> attribute viewBox="0" -CONSOLE ERROR: line 23: Error: Invalid value for <svg> attribute viewBox="0 0" -CONSOLE ERROR: line 26: Error: Invalid value for <svg> attribute viewBox="0 0 30" -CONSOLE ERROR: line 29: Error: Invalid value for <svg> attribute viewBox="0 0 30 40 50" -CONSOLE ERROR: line 32: Error: Invalid value for <svg> attribute viewBox="0 0 30 40," -CONSOLE ERROR: line 35: Error: Invalid value for <svg> attribute viewBox=",0 0 30 40" +CONSOLE ERROR: line 20: Error: <svg> attribute viewBox: Unexpected end of attribute. Expected number, "0". +CONSOLE ERROR: line 23: Error: <svg> attribute viewBox: Unexpected end of attribute. Expected number, "0 0". +CONSOLE ERROR: line 26: Error: <svg> attribute viewBox: Unexpected end of attribute. Expected number, "0 0 30". +CONSOLE ERROR: line 29: Error: <svg> attribute viewBox: Trailing garbage, "0 0 30 40 50". +CONSOLE ERROR: line 32: Error: <svg> attribute viewBox: Trailing garbage, "0 0 30 40,". +CONSOLE ERROR: line 35: Error: <svg> attribute viewBox: Expected number, ",0 0 30 40". CONSOLE ERROR: line 38: Error: <svg> attribute viewBox: A negative value is not valid. ("0 0 -30 40") CONSOLE ERROR: line 41: Error: <svg> attribute viewBox: A negative value is not valid. ("0 0 30 -40") -CONSOLE ERROR: line 44: Error: Invalid value for <svg> attribute viewBox="0 0 30, , 40" -CONSOLE ERROR: line 47: Error: Invalid value for <svg> attribute viewBox="0 0 30% 40" +CONSOLE ERROR: line 44: Error: <svg> attribute viewBox: Expected number, "0 0 30, , 40". +CONSOLE ERROR: line 47: Error: <svg> attribute viewBox: Expected number, "0 0 30% 40". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/bbox-with-glyph-overflow-on-path-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/text/bbox-with-glyph-overflow-on-path-expected.png index 13cf15e..bb4df99 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/text/bbox-with-glyph-overflow-on-path-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/bbox-with-glyph-overflow-on-path-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/bbox-with-glyph-overflow-on-path-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/text/bbox-with-glyph-overflow-on-path-expected.txt index f13fea1..83c4d6f 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/text/bbox-with-glyph-overflow-on-path-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/bbox-with-glyph-overflow-on-path-expected.txt
@@ -27,7 +27,7 @@ chunk 1 text run 10 at (181.97,100.00) startOffset 9 endOffset 10 width 13.89: "f" chunk 1 text run 11 at (195.86,100.00) startOffset 10 endOffset 11 width 13.89: "f" chunk 1 text run 12 at (209.75,100.00) startOffset 11 endOffset 12 width 13.89: "f" - chunk 1 text run 13 at (223.64,100.00) startOffset 12 endOffset 13 width 13.89: "f" + chunk 1 text run 13 at (223.65,100.00) startOffset 12 endOffset 13 width 13.89: "f" chunk 1 text run 14 at (237.54,100.00) startOffset 13 endOffset 14 width 13.89: "f" chunk 1 text run 15 at (251.43,100.00) startOffset 14 endOffset 15 width 13.89: "f" chunk 1 text run 16 at (265.32,100.00) startOffset 15 endOffset 16 width 13.89: "f" @@ -55,7 +55,7 @@ chunk 1 text run 10 at (268.03,150.00) startOffset 9 endOffset 10 width 13.89: "f" chunk 1 text run 11 at (254.14,150.00) startOffset 10 endOffset 11 width 13.89: "f" chunk 1 text run 12 at (240.25,150.00) startOffset 11 endOffset 12 width 13.89: "f" - chunk 1 text run 13 at (226.36,150.00) startOffset 12 endOffset 13 width 13.89: "f" + chunk 1 text run 13 at (226.35,150.00) startOffset 12 endOffset 13 width 13.89: "f" chunk 1 text run 14 at (212.46,150.00) startOffset 13 endOffset 14 width 13.89: "f" chunk 1 text run 15 at (198.57,150.00) startOffset 14 endOffset 15 width 13.89: "f" chunk 1 text run 16 at (184.68,150.00) startOffset 15 endOffset 16 width 13.89: "f" @@ -96,7 +96,7 @@ chunk 1 text run 23 at (350.53,335.87) startOffset 22 endOffset 23 width 13.89: "f" chunk 1 text run 24 at (363.89,339.68) startOffset 23 endOffset 24 width 13.89: "f" LayoutSVGInlineText {#text} at (0,0) size 0x0 - LayoutSVGText {text} at (49,395) size 135x70 contains 1 chunk(s) + LayoutSVGText {text} at (50,395) size 134x70 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 134x70 LayoutSVGInlineText {#text} at (0,0) size 134x70 chunk 1 text run 1 at (59.70,450.00) startOffset 0 endOffset 1 width 19.41: "'" @@ -108,6 +108,6 @@ LayoutSVGRect {rect} at (48,80) size 354x58 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=41.28] [y=55.00] [width=351.77] [height=56.00] LayoutSVGRect {rect} at (64,164) size 354x58 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=56.92] [y=139.00] [width=351.78] [height=56.00] LayoutSVGRect {rect} at (46,229) size 355x153 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=38.59] [y=204.33] [width=353.61] [height=150.48] - LayoutSVGRect {rect} at (57,420) size 136x72 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=49.98] [y=395.00] [width=133.64] [height=70.00] + LayoutSVGRect {rect} at (57,420) size 136x72 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=50.00] [y=395.00] [width=133.63] [height=70.00] LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/text-selection-align-04-b-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/text/text-selection-align-04-b-expected.txt index d6db275..6164f18 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/text/text-selection-align-04-b-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/text-selection-align-04-b-expected.txt
@@ -38,7 +38,7 @@ chunk 1 (end anchor) text run 4 at (46.54,260.00) startOffset 15 endOffset 16 width 16.68: "d" chunk 1 (end anchor) text run 5 at (59.05,260.00) startOffset 16 endOffset 17 width 8.33: " " chunk 1 (end anchor) text run 6 at (67.39,260.00) startOffset 17 endOffset 18 width 8.33: "t" - chunk 1 (end anchor) text run 7 at (79.89,260.00) startOffset 18 endOffset 19 width 16.68: "e" + chunk 1 (end anchor) text run 7 at (79.90,260.00) startOffset 18 endOffset 19 width 16.68: "e" chunk 1 (end anchor) text run 8 at (95.74,260.00) startOffset 19 endOffset 20 width 15.00: "x" chunk 1 (end anchor) text run 9 at (107.40,260.00) startOffset 20 endOffset 21 width 8.33: "t" chunk 1 (end anchor) text run 10 at (115.74,260.00) startOffset 21 endOffset 22 width 8.33: " "
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/text-selection-path-01-b-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/text/text-selection-path-01-b-expected.png index f5525141..e2e8a09 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/text/text-selection-path-01-b-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/text-selection-path-01-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/text-selection-path-01-b-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/text/text-selection-path-01-b-expected.txt index 95a774fa..91aefd9 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/text/text-selection-path-01-b-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/text-selection-path-01-b-expected.txt
@@ -14,9 +14,9 @@ LayoutSVGTextPath {textPath} at (0,0) size 205x120 LayoutSVGInlineText {#text} at (0,0) size 205x120 chunk 1 text run 1 at (203.08,78.99) startOffset 0 endOffset 1 width 22.27: "T" - chunk 1 text run 2 at (212.32,61.50) startOffset 1 endOffset 2 width 17.40: "e" - chunk 1 text run 3 at (222.73,46.94) startOffset 2 endOffset 3 width 18.18: "x" - chunk 1 text run 4 at (233.61,36.17) startOffset 3 endOffset 4 width 12.43: "t" + chunk 1 text run 2 at (212.33,61.49) startOffset 1 endOffset 2 width 17.40: "e" + chunk 1 text run 3 at (222.74,46.94) startOffset 2 endOffset 3 width 18.18: "x" + chunk 1 text run 4 at (233.62,36.17) startOffset 3 endOffset 4 width 12.43: "t" chunk 1 text run 5 at (242.47,30.46) startOffset 4 endOffset 5 width 8.68: " " chunk 1 text run 6 at (255.95,26.99) startOffset 5 endOffset 6 width 19.41: "o" chunk 1 text run 7 at (274.98,33.23) startOffset 6 endOffset 7 width 21.27: "n" @@ -35,18 +35,18 @@ LayoutSVGTextPath {textPath} at (0,0) size 216x120 LayoutSVGTSpan {tspan} at (0,0) size 56x58 LayoutSVGInlineText {#text} at (0,36) size 56x57 - chunk 1 text run 1 at (37.54,135.48) startOffset 0 endOffset 1 width 22.27: "T" + chunk 1 text run 1 at (37.54,135.47) startOffset 0 endOffset 1 width 22.27: "T" chunk 1 text run 2 at (46.77,117.97) startOffset 1 endOffset 2 width 17.40: "e" LayoutSVGTSpan {tspan} at (0,0) size 44x42 LayoutSVGInlineText {#text} at (34,24) size 43x41 chunk 1 text run 1 at (57.18,103.42) startOffset 0 endOffset 1 width 18.18: "x" LayoutSVGInlineText {#text} at (50,0) size 166x120 chunk 1 text run 1 at (68.07,92.65) startOffset 0 endOffset 1 width 12.43: "t" - chunk 1 text run 2 at (76.93,86.96) startOffset 1 endOffset 2 width 8.68: " " + chunk 1 text run 2 at (76.93,86.95) startOffset 1 endOffset 2 width 8.68: " " chunk 1 text run 3 at (90.41,83.48) startOffset 2 endOffset 3 width 19.41: "o" chunk 1 text run 4 at (109.45,89.71) startOffset 3 endOffset 4 width 21.27: "n" chunk 1 text run 5 at (120.62,99.55) startOffset 4 endOffset 5 width 8.68: " " - chunk 1 text run 6 at (129.32,109.91) startOffset 5 endOffset 6 width 18.14: "a" + chunk 1 text run 6 at (129.32,109.92) startOffset 5 endOffset 6 width 18.14: "a" chunk 1 text run 7 at (137.43,120.71) startOffset 6 endOffset 7 width 8.68: " " chunk 1 text run 8 at (146.41,132.09) startOffset 7 endOffset 8 width 20.57: "p" chunk 1 text run 9 at (160.55,145.31) startOffset 8 endOffset 9 width 18.14: "a" @@ -63,7 +63,7 @@ LayoutSVGContainer {g} at (188,352) size 501x134 LayoutSVGContainer {use} at (188,385) size 501x7 LayoutSVGPath {path} at (188,385) size 501x7 [stroke={[type=SOLID] [color=#0000FF] [stroke width=4.00]}] [data="M 113 233 L 413 233"] - LayoutSVGText {text} at (211,211) size 180x27 contains 1 chunk(s) + LayoutSVGText {text} at (212,211) size 179x27 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 179x27 LayoutSVGInlineText {#text} at (0,0) size 179x27 chunk 1 text run 1 at (219.33,233.00) startOffset 0 endOffset 1 width 14.66: "T"
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/text/textPathBoundsBug-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/text/textPathBoundsBug-expected.png index 48922848..90bdfae 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/text/textPathBoundsBug-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/text/textPathBoundsBug-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/transforms/animated-path-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/transforms/animated-path-inside-transformed-html-expected.png index a6d25e59..bbca955 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/transforms/animated-path-inside-transformed-html-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/transforms/animated-path-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/transforms/svg-css-transforms-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/transforms/svg-css-transforms-expected.png index 5b88f70..17e2d7a8 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/transforms/svg-css-transforms-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/transforms/svg-css-transforms-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-inside-transformed-html-expected.png index 57cb0314..34bccb88 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-inside-transformed-html-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/tables/mozilla/dom/tableDom-expected.png b/third_party/WebKit/LayoutTests/platform/win/tables/mozilla/dom/tableDom-expected.png index a553d97..f20a467a 100644 --- a/third_party/WebKit/LayoutTests/platform/win/tables/mozilla/dom/tableDom-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/tables/mozilla/dom/tableDom-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/tables/mozilla/dom/tableDom-expected.txt b/third_party/WebKit/LayoutTests/platform/win/tables/mozilla/dom/tableDom-expected.txt index f1371f8..aa710a4 100644 --- a/third_party/WebKit/LayoutTests/platform/win/tables/mozilla/dom/tableDom-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/tables/mozilla/dom/tableDom-expected.txt
@@ -4,28 +4,28 @@ LayoutBlockFlow {HTML} at (0,0) size 800x600 LayoutBlockFlow {BODY} at (8,8) size 784x584 LayoutBlockFlow {FORM} at (0,0) size 784x22 - LayoutMenuList {SELECT} at (0,1) size 91x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] - LayoutBlockFlow (anonymous) at (1,1) size 89x18 + LayoutMenuList {SELECT} at (0,1) size 90x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow (anonymous) at (1,1) size 88x18 LayoutText (anonymous) at (4,1) size 66x16 text run at (4,1) width 66: "append cell" - LayoutText {#text} at (91,2) size 53x17 - text run at (91,2) width 53: " tbody " - LayoutTextControl {INPUT} at (143.44,0) size 68x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutText {#text} at (211,2) size 42x17 - text run at (211,2) width 42: " row " - LayoutTextControl {INPUT} at (252.31,0) size 68x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutText {#text} at (320,2) size 36x17 - text run at (320,2) width 36: " col " - LayoutTextControl {INPUT} at (355.86,0) size 68x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutText {#text} at (423,2) size 76x17 - text run at (423,2) width 76: " row span " - LayoutTextControl {INPUT} at (498.06,0) size 68x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutText {#text} at (566,2) size 69x17 - text run at (566,2) width 69: " col span " - LayoutTextControl {INPUT} at (634.94,0) size 68x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] - LayoutText {#text} at (702,2) size 21x17 - text run at (702,2) width 21: " " - LayoutButton {INPUT} at (722.94,0) size 43x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] + LayoutText {#text} at (90,2) size 53x17 + text run at (90,2) width 53: " tbody " + LayoutTextControl {INPUT} at (142.44,0) size 68x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (210,2) size 42x17 + text run at (210,2) width 42: " row " + LayoutTextControl {INPUT} at (251.31,0) size 68x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (319,2) size 36x17 + text run at (319,2) width 36: " col " + LayoutTextControl {INPUT} at (354.86,0) size 68x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (422,2) size 76x17 + text run at (422,2) width 76: " row span " + LayoutTextControl {INPUT} at (497.06,0) size 68x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (565,2) size 69x17 + text run at (565,2) width 69: " col span " + LayoutTextControl {INPUT} at (633.94,0) size 68x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] + LayoutText {#text} at (701,2) size 21x17 + text run at (701,2) width 21: " " + LayoutButton {INPUT} at (721.94,0) size 43x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] LayoutBlockFlow (anonymous) at (8,3) size 27x16 LayoutText {#text} at (0,0) size 27x16 text run at (0,0) width 27: "Do It" @@ -47,23 +47,23 @@ text run at (2,2) width 24: "c22" LayoutBlockFlow (anonymous) at (0,108) size 784x18 LayoutBR {BR} at (0,0) size 0x17 -layer at (153,11) size 64x16 +layer at (152,11) size 64x16 LayoutBlockFlow {DIV} at (2,3) size 64x16 LayoutText {#text} at (0,0) size 7x16 text run at (0,0) width 7: "0" -layer at (262,11) size 64x16 +layer at (261,11) size 64x16 LayoutBlockFlow {DIV} at (2,3) size 64x16 LayoutText {#text} at (0,0) size 7x16 text run at (0,0) width 7: "0" -layer at (366,11) size 64x16 +layer at (365,11) size 64x16 LayoutBlockFlow {DIV} at (2,3) size 64x16 LayoutText {#text} at (0,0) size 7x16 text run at (0,0) width 7: "0" -layer at (508,11) size 64x16 +layer at (507,11) size 64x16 LayoutBlockFlow {DIV} at (2,3) size 64x16 LayoutText {#text} at (0,0) size 7x16 text run at (0,0) width 7: "1" -layer at (645,11) size 64x16 +layer at (644,11) size 64x16 LayoutBlockFlow {DIV} at (2,3) size 64x16 LayoutText {#text} at (0,0) size 7x16 text run at (0,0) width 7: "1"
diff --git a/third_party/WebKit/LayoutTests/platform/win/transforms/svg-vs-css-expected.png b/third_party/WebKit/LayoutTests/platform/win/transforms/svg-vs-css-expected.png index 214bb437..491de4e 100644 --- a/third_party/WebKit/LayoutTests/platform/win/transforms/svg-vs-css-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/transforms/svg-vs-css-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png index d529ecd..54e9bf54 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png index 723f7624..2286101c 100644 --- a/third_party/WebKit/LayoutTests/platform/win7/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/forms/month/month-appearance-l10n-expected.png b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/month/month-appearance-l10n-expected.png index 58363d7..4590252 100644 --- a/third_party/WebKit/LayoutTests/platform/win7/fast/forms/month/month-appearance-l10n-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/month/month-appearance-l10n-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/forms/select-popup/popup-menu-appearance-styled-expected.png b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/select-popup/popup-menu-appearance-styled-expected.png index 72a9fbdc..4c5824e 100644 --- a/third_party/WebKit/LayoutTests/platform/win7/fast/forms/select-popup/popup-menu-appearance-styled-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/select-popup/popup-menu-appearance-styled-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/forms/text/text-font-height-mismatch-expected.png b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/text/text-font-height-mismatch-expected.png index 2ff8853..34660311 100644 --- a/third_party/WebKit/LayoutTests/platform/win7/fast/forms/text/text-font-height-mismatch-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/text/text-font-height-mismatch-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/forms/text/text-font-height-mismatch-expected.txt b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/text/text-font-height-mismatch-expected.txt index 20ecb73b..87ec162 100644 --- a/third_party/WebKit/LayoutTests/platform/win7/fast/forms/text/text-font-height-mismatch-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/text/text-font-height-mismatch-expected.txt
@@ -1,27 +1,32 @@ CONSOLE WARNING: Failed to decode downloaded font: NotoSansCJKjp-Regular-cid03075.otf layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x136 - LayoutBlockFlow {HTML} at (0,0) size 800x136 - LayoutBlockFlow {BODY} at (8,16) size 784x112 +layer at (0,0) size 800x142 + LayoutBlockFlow {HTML} at (0,0) size 800x142 + LayoutBlockFlow {BODY} at (8,16) size 784x118 LayoutBlockFlow {P} at (0,0) size 784x18 LayoutText {#text} at (0,0) size 273x17 text run at (0,0) width 273: "Editable text should be centered vertically." - LayoutBlockFlow {DIV} at (0,34) size 784x22 - LayoutTextControl {INPUT} at (0,0) size 195x22 [bgcolor=#FFFFFF] [border: (1px solid #000000)] - LayoutBlockFlow {DIV} at (0,56) size 784x28 + LayoutBlockFlow {DIV} at (0,34) size 784x28 + LayoutTextControl {INPUT} at (0,3) size 195x22 [bgcolor=#FFFFFF] [border: (1px solid #000000)] + LayoutTextControl {INPUT} at (195,0) size 195x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)] + LayoutBlockFlow {DIV} at (0,62) size 784x28 LayoutTextControl {INPUT} at (0,0) size 294x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)] - LayoutBlockFlow {DIV} at (0,84) size 784x28 + LayoutBlockFlow {DIV} at (0,90) size 784x28 LayoutTextControl {INPUT} at (0,0) size 199x28 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)] -layer at (9,52) size 193x18 +layer at (9,55) size 193x18 LayoutBlockFlow {DIV} at (1,2) size 193x18 LayoutText {#text} at (0,0) size 74x17 text run at (0,0) width 74: "\x{3075} ABCgjy" -layer at (9,72) size 292x28 +layer at (204,55) size 193x18 + LayoutBlockFlow {DIV} at (1,5) size 193x18 + LayoutText {#text} at (0,0) size 74x17 + text run at (0,0) width 74: "\x{3075} ABCgjy" +layer at (9,78) size 292x28 LayoutBlockFlow {DIV} at (1,0) size 292x28 LayoutText {#text} at (0,0) size 81x27 text run at (0,0) width 81: "ABCgjy" -layer at (10,105) size 195x18 +layer at (10,111) size 195x18 LayoutBlockFlow {DIV} at (2,5) size 195x18 LayoutText {#text} at (0,0) size 54x17 text run at (0,0) width 54: "ABCgjy"
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/ruby/nested-ruby-expected.png b/third_party/WebKit/LayoutTests/platform/win7/fast/ruby/nested-ruby-expected.png new file mode 100644 index 0000000..7375b3c --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win7/fast/ruby/nested-ruby-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/ruby/nested-ruby-expected.txt b/third_party/WebKit/LayoutTests/platform/win7/fast/ruby/nested-ruby-expected.txt new file mode 100644 index 0000000..fcbbe22 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win7/fast/ruby/nested-ruby-expected.txt
@@ -0,0 +1,48 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x600 + LayoutBlockFlow {HTML} at (0,0) size 800x600 + LayoutBlockFlow {BODY} at (8,8) size 784x576 + LayoutBlockFlow {P} at (0,0) size 784x42 + LayoutRuby (inline) {RUBY} at (0,0) size 81x17 + LayoutRubyRun (anonymous) at (0,12) size 81x30 + LayoutRubyText {RT} at (0,-12) size 81x12 + LayoutText {#text} at (11,0) size 59x12 + text run at (11,0) width 59: "K\x{14D}kakukid\x{14D}tai" + LayoutRubyBase (anonymous) at (0,0) size 81x30 + LayoutRuby (inline) {RUBY} at (0,0) size 81x17 + LayoutRubyRun (anonymous) at (0,12) size 16x18 + LayoutRubyText {RT} at (0,-12) size 16x12 + LayoutText {#text} at (0,0) size 15x12 + text run at (0,0) width 15: "\x{3053}\x{3046}" + LayoutRubyBase (anonymous) at (0,0) size 16x18 + LayoutText {#text} at (0,0) size 16x17 + text run at (0,0) width 16: "\x{653B}" + LayoutRubyRun (anonymous) at (16,12) size 16x18 + LayoutRubyText {RT} at (0,-12) size 16x12 + LayoutText {#text} at (0,0) size 16x12 + text run at (0,0) width 16: "\x{304B}\x{304F}" + LayoutRubyBase (anonymous) at (0,0) size 16x18 + LayoutText {#text} at (0,0) size 16x17 + text run at (0,0) width 16: "\x{6BBB}" + LayoutRubyRun (anonymous) at (32,12) size 16x18 + LayoutRubyText {RT} at (0,-12) size 16x12 + LayoutText {#text} at (4,0) size 8x12 + text run at (4,0) width 8: "\x{304D}" + LayoutRubyBase (anonymous) at (0,0) size 16x18 + LayoutText {#text} at (0,0) size 16x17 + text run at (0,0) width 16: "\x{6A5F}" + LayoutRubyRun (anonymous) at (48,12) size 16x18 + LayoutRubyText {RT} at (0,-12) size 16x12 + LayoutText {#text} at (0,0) size 16x12 + text run at (0,0) width 16: "\x{3069}\x{3046}" + LayoutRubyBase (anonymous) at (0,0) size 16x18 + LayoutText {#text} at (0,0) size 16x17 + text run at (0,0) width 16: "\x{52D5}" + LayoutRubyRun (anonymous) at (64,12) size 17x18 + LayoutRubyText {RT} at (0,-12) size 17x12 + LayoutText {#text} at (0,0) size 17x12 + text run at (0,0) width 17: "\x{305F}\x{3044}" + LayoutRubyBase (anonymous) at (0,0) size 17x18 + LayoutText {#text} at (0,0) size 17x17 + text run at (0,0) width 17: "\x{968A}"
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/002-expected.png b/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/002-expected.png index 2f0d18ca..7f0e3178 100644 --- a/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/002-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/002-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/002-expected.txt b/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/002-expected.txt index aa9f57b..85749e4 100644 --- a/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/002-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/002-expected.txt
@@ -3,14 +3,14 @@ layer at (0,0) size 800x600 LayoutBlockFlow {HTML} at (0,0) size 800x600 LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutTable {TABLE} at (0,0) size 280x94 - LayoutTableSection {TBODY} at (0,0) size 280x94 - LayoutTableRow {TR} at (0,0) size 280x94 - LayoutTableCell {TD} at (0,0) size 280x94 [r=0 c=0 rs=1 cs=1] - LayoutText {#text} at (0,1) size 278x92 - text run at (0,1) width 265: "\x{8AB0}\x{3067}\x{3082}\x{3042}\x{306A}\x{305F}\x{306E}\x{30C9}\x{30AD}\x{30E5}\x{30E1}\x{30F3}\x{30C8}\x{3092}\x{30AA}\x{30EA}\x{30B8}\x{30CA}\x{30EB}" - text run at (0,20) width 202: "\x{306E}\x{4F53}\x{88C1}\x{3067}\x{958B}\x{304F}\x{3053}\x{3068}\x{304C}\x{3067}\x{304D}\x{307E}\x{3059}\x{3002} " - text run at (201,20) width 77: "\x{3042}\x{306A}\x{305F}\x{306E}\x{610F}" - text run at (0,39) width 271: "\x{56F3}\x{3057}\x{305F}\x{3068}\x{304A}\x{308A}\x{306B}\x{60C5}\x{5831}\x{3092}\x{4F1D}\x{3048}\x{308B}\x{3053}\x{3068}\x{304C}\x{3067}\x{304D}\x{307E}" - text run at (0,57) width 271: "\x{3059}\x{3002}\x{3055}\x{3089}\x{306B}\x{3001}\x{30D6}\x{30E9}\x{30A6}\x{30B6}\x{304B}\x{3089}\x{30B3}\x{30E1}\x{30F3}\x{30C8}\x{3084}\x{30DE}\x{30FC}\x{30AF}" - text run at (0,76) width 142: "\x{30A2}\x{30C3}\x{30D7}\x{3092}\x{66F8}\x{304D}\x{8FBC}\x{3093}\x{3060}\x{308A}" + LayoutTable {TABLE} at (0,0) size 280x90 + LayoutTableSection {TBODY} at (0,0) size 280x90 + LayoutTableRow {TR} at (0,0) size 280x90 + LayoutTableCell {TD} at (0,0) size 280x90 [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (0,0) size 278x89 + text run at (0,0) width 265: "\x{8AB0}\x{3067}\x{3082}\x{3042}\x{306A}\x{305F}\x{306E}\x{30C9}\x{30AD}\x{30E5}\x{30E1}\x{30F3}\x{30C8}\x{3092}\x{30AA}\x{30EA}\x{30B8}\x{30CA}\x{30EB}" + text run at (0,18) width 202: "\x{306E}\x{4F53}\x{88C1}\x{3067}\x{958B}\x{304F}\x{3053}\x{3068}\x{304C}\x{3067}\x{304D}\x{307E}\x{3059}\x{3002} " + text run at (201,18) width 77: "\x{3042}\x{306A}\x{305F}\x{306E}\x{610F}" + text run at (0,36) width 271: "\x{56F3}\x{3057}\x{305F}\x{3068}\x{304A}\x{308A}\x{306B}\x{60C5}\x{5831}\x{3092}\x{4F1D}\x{3048}\x{308B}\x{3053}\x{3068}\x{304C}\x{3067}\x{304D}\x{307E}" + text run at (0,54) width 271: "\x{3059}\x{3002}\x{3055}\x{3089}\x{306B}\x{3001}\x{30D6}\x{30E9}\x{30A6}\x{30B6}\x{304B}\x{3089}\x{30B3}\x{30E1}\x{30F3}\x{30C8}\x{3084}\x{30DE}\x{30FC}\x{30AF}" + text run at (0,72) width 142: "\x{30A2}\x{30C3}\x{30D7}\x{3092}\x{66F8}\x{304D}\x{8FBC}\x{3093}\x{3060}\x{308A}"
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/lang-glyph-cache-separation-expected.png b/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/lang-glyph-cache-separation-expected.png index 54a9169..ccbf43c1 100644 --- a/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/lang-glyph-cache-separation-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/lang-glyph-cache-separation-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/lang-glyph-cache-separation-expected.txt b/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/lang-glyph-cache-separation-expected.txt index 141086c2..0c1591bf 100644 --- a/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/lang-glyph-cache-separation-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/lang-glyph-cache-separation-expected.txt
@@ -1,8 +1,8 @@ layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x352 - LayoutBlockFlow {HTML} at (0,0) size 800x352 - LayoutBlockFlow {BODY} at (8,8) size 784x336 +layer at (0,0) size 800x349 + LayoutBlockFlow {HTML} at (0,0) size 800x349 + LayoutBlockFlow {BODY} at (8,8) size 784x333 LayoutBlockFlow (anonymous) at (0,0) size 784x54 LayoutText {#text} at (0,0) size 340x17 text run at (0,0) width 340: "Tests if glyph caches of different languages interfere." @@ -11,7 +11,7 @@ text run at (0,18) width 743: "On systems that the locales have different font preferences, the following divs should be displayed in corresponding" text run at (0,36) width 179: "preferred fonts respectively." LayoutBR {BR} at (178,36) size 1x17 - LayoutBlockFlow {DIV} at (0,54) size 784x94 + LayoutBlockFlow {DIV} at (0,54) size 784x93 LayoutBlockFlow (anonymous) at (0,0) size 784x18 LayoutText {#text} at (0,0) size 130x17 text run at (0,0) width 130: "Default font-family:" @@ -19,15 +19,15 @@ LayoutText {#text} at (0,1) size 180x17 text run at (0,1) width 180: "Simplified Chinese: \x{8AA4}\x{904E}\x{9AA8}" LayoutBlockFlow {DIV} at (0,37) size 784x19 - LayoutText {#text} at (0,1) size 183x17 - text run at (0,1) width 183: "Traditional Chinese: \x{8AA4}\x{904E}\x{9AA8}" - LayoutBlockFlow {DIV} at (0,56) size 784x19 - LayoutText {#text} at (0,1) size 114x17 - text run at (0,1) width 114: "Japanese: \x{8AA4}\x{904E}\x{9AA8}" - LayoutBlockFlow {DIV} at (0,75) size 784x19 + LayoutText {#text} at (0,0) size 183x17 + text run at (0,0) width 183: "Traditional Chinese: \x{8AA4}\x{904E}\x{9AA8}" + LayoutBlockFlow {DIV} at (0,56) size 784x18 + LayoutText {#text} at (0,0) size 114x17 + text run at (0,0) width 114: "Japanese: \x{8AA4}\x{904E}\x{9AA8}" + LayoutBlockFlow {DIV} at (0,74) size 784x19 LayoutText {#text} at (0,1) size 104x17 text run at (0,1) width 104: "Korean: \x{8AA4}\x{904E}\x{9AA8}" - LayoutBlockFlow {DIV} at (0,148) size 784x94 + LayoutBlockFlow {DIV} at (0,147) size 784x93 LayoutBlockFlow (anonymous) at (0,0) size 784x18 LayoutText {#text} at (0,0) size 224x17 text run at (0,0) width 224: "Generic font-family (sans-serif):" @@ -35,15 +35,15 @@ LayoutText {#text} at (0,1) size 190x17 text run at (0,1) width 190: "Simplified Chinese: \x{8AA4}\x{904E}\x{9AA8}" LayoutBlockFlow {DIV} at (0,37) size 784x19 - LayoutText {#text} at (0,1) size 195x17 - text run at (0,1) width 195: "Traditional Chinese: \x{8AA4}\x{904E}\x{9AA8}" - LayoutBlockFlow {DIV} at (0,56) size 784x19 - LayoutText {#text} at (0,1) size 127x17 - text run at (0,1) width 127: "Japanese: \x{8AA4}\x{904E}\x{9AA8}" - LayoutBlockFlow {DIV} at (0,75) size 784x19 + LayoutText {#text} at (0,0) size 195x17 + text run at (0,0) width 195: "Traditional Chinese: \x{8AA4}\x{904E}\x{9AA8}" + LayoutBlockFlow {DIV} at (0,56) size 784x18 + LayoutText {#text} at (0,0) size 127x17 + text run at (0,0) width 127: "Japanese: \x{8AA4}\x{904E}\x{9AA8}" + LayoutBlockFlow {DIV} at (0,74) size 784x19 LayoutText {#text} at (0,1) size 109x17 text run at (0,1) width 109: "Korean: \x{8AA4}\x{904E}\x{9AA8}" - LayoutBlockFlow {DIV} at (0,242) size 784x94 + LayoutBlockFlow {DIV} at (0,240) size 784x93 LayoutBlockFlow (anonymous) at (0,0) size 784x18 LayoutText {#text} at (0,0) size 300x17 text run at (0,0) width 300: "Non-generic font-family (Times New Roman):" @@ -51,11 +51,11 @@ LayoutText {#text} at (0,1) size 180x17 text run at (0,1) width 180: "Simplified Chinese: \x{8AA4}\x{904E}\x{9AA8}" LayoutBlockFlow {DIV} at (0,37) size 784x19 - LayoutText {#text} at (0,1) size 183x17 - text run at (0,1) width 183: "Traditional Chinese: \x{8AA4}\x{904E}\x{9AA8}" - LayoutBlockFlow {DIV} at (0,56) size 784x19 - LayoutText {#text} at (0,1) size 114x17 - text run at (0,1) width 114: "Japanese: \x{8AA4}\x{904E}\x{9AA8}" - LayoutBlockFlow {DIV} at (0,75) size 784x19 + LayoutText {#text} at (0,0) size 183x17 + text run at (0,0) width 183: "Traditional Chinese: \x{8AA4}\x{904E}\x{9AA8}" + LayoutBlockFlow {DIV} at (0,56) size 784x18 + LayoutText {#text} at (0,0) size 114x17 + text run at (0,0) width 114: "Japanese: \x{8AA4}\x{904E}\x{9AA8}" + LayoutBlockFlow {DIV} at (0,74) size 784x19 LayoutText {#text} at (0,1) size 104x17 text run at (0,1) width 104: "Korean: \x{8AA4}\x{904E}\x{9AA8}"
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/mixed-directionality-selection-expected.png b/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/mixed-directionality-selection-expected.png new file mode 100644 index 0000000..aba28eb0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win7/fast/text/international/mixed-directionality-selection-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/writing-mode/japanese-ruby-vertical-lr-expected.png b/third_party/WebKit/LayoutTests/platform/win7/fast/writing-mode/japanese-ruby-vertical-lr-expected.png new file mode 100644 index 0000000..3b505a2d --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win7/fast/writing-mode/japanese-ruby-vertical-lr-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/writing-mode/japanese-ruby-vertical-rl-expected.png b/third_party/WebKit/LayoutTests/platform/win7/fast/writing-mode/japanese-ruby-vertical-rl-expected.png new file mode 100644 index 0000000..30f6784 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win7/fast/writing-mode/japanese-ruby-vertical-rl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt b/third_party/WebKit/LayoutTests/platform/win7/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt new file mode 100644 index 0000000..27a48cd --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win7/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt
@@ -0,0 +1,86 @@ +zh-CN: 誤過骨 +#zh-CN: +"Times New Roman" : 7, +"SimSun" : 3 + +zh-TW: 誤過骨 +#zh-TW: +"Times New Roman" : 7, +"PMingLiU" : 3 + +zh-HK: 誤過骨 +#zh-HK: +"Times New Roman" : 7, +"PMingLiU" : 3 + +ja: 誤過骨 +#ja: +"Times New Roman" : 4, +"MS PGothic" : 3 + +ja-JP: 誤過骨 +#ja-JP: +"Times New Roman" : 7, +"MS PGothic" : 3 + +ko: 誤過骨 +#ko: +"Times New Roman" : 4, +"Gulim" : 3 + +ko-KR: 誤過骨 +#ko-KR: +"Times New Roman" : 7, +"Gulim" : 3 + +en-CN: 誤過骨 +#en-CN: +"Times New Roman" : 7, +"SimSun" : 3 + +en-JP: 誤過骨 +#en-JP: +"Times New Roman" : 7, +"MS PGothic" : 3 + +en-KR: 誤過骨 +#en-KR: +"Times New Roman" : 7, +"Gulim" : 3 + +en-HK: 誤過骨 +#en-HK: +"Times New Roman" : 7, +"PMingLiU" : 3 + +en-TW: 誤過骨 +#en-TW: +"Times New Roman" : 7, +"PMingLiU" : 3 + +en-HanS: 誤過骨 +#en-HanS: +"Times New Roman" : 9, +"SimSun" : 3 + +en-HanT: 誤過骨 +#en-HanT: +"Times New Roman" : 9, +"PMingLiU" : 3 + +en-HanS-JP: 誤過骨 +#en-HanS-JP: +"Times New Roman" : 12, +"SimSun" : 3 + +en-HanT-JP: 誤過骨 +#en-HanT-JP: +"Times New Roman" : 12, +"PMingLiU" : 3 + +en-US: 誤過骨 +#en-US: +"Times New Roman" : 7, +"SimSun" : 3 + +
diff --git a/third_party/WebKit/LayoutTests/platform/win7/printing/ellipsis-printing-style-expected.png b/third_party/WebKit/LayoutTests/platform/win7/printing/ellipsis-printing-style-expected.png new file mode 100644 index 0000000..f534999 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win7/printing/ellipsis-printing-style-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/printing/iframe-print-expected.png b/third_party/WebKit/LayoutTests/platform/win7/printing/iframe-print-expected.png index e21150c..26a4ca36 100644 --- a/third_party/WebKit/LayoutTests/platform/win7/printing/iframe-print-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win7/printing/iframe-print-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/svg/custom/text-match-highlight-expected.png b/third_party/WebKit/LayoutTests/platform/win7/svg/custom/text-match-highlight-expected.png index 117b6c5..c238ca9 100644 --- a/third_party/WebKit/LayoutTests/platform/win7/svg/custom/text-match-highlight-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win7/svg/custom/text-match-highlight-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/svg/custom/text-match-highlight-expected.txt b/third_party/WebKit/LayoutTests/platform/win7/svg/custom/text-match-highlight-expected.txt index 0ffa56e..205a8e4 100644 --- a/third_party/WebKit/LayoutTests/platform/win7/svg/custom/text-match-highlight-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win7/svg/custom/text-match-highlight-expected.txt
@@ -52,37 +52,37 @@ LayoutSVGTextPath {textPath} at (0,0) size 669x238 LayoutSVGInlineText {#text} at (0,0) size 669x238 chunk 1 text run 1 at (109.48,190.53) startOffset 0 endOffset 1 width 26.67: "F" - chunk 1 text run 2 at (122.50,177.58) startOffset 1 endOffset 2 width 10.00: "i" - chunk 1 text run 3 at (135.53,164.80) startOffset 2 endOffset 3 width 26.67: "n" - chunk 1 text run 4 at (154.82,146.40) startOffset 3 endOffset 4 width 26.67: "d" - chunk 1 text run 5 at (178.39,125.18) startOffset 4 endOffset 5 width 36.67: "m" - chunk 1 text run 6 at (202.97,105.12) startOffset 5 endOffset 6 width 26.67: "e" - chunk 1 text run 7 at (220.54,92.43) startOffset 6 endOffset 7 width 16.67: " " - chunk 1 text run 8 at (238.91,80.94) startOffset 7 endOffset 8 width 26.67: "o" - chunk 1 text run 9 at (262.80,69.16) startOffset 8 endOffset 9 width 26.67: "n" - chunk 1 text run 10 at (283.31,62.32) startOffset 9 endOffset 10 width 16.67: " " + chunk 1 text run 2 at (122.51,177.58) startOffset 1 endOffset 2 width 10.00: "i" + chunk 1 text run 3 at (135.54,164.79) startOffset 2 endOffset 3 width 26.67: "n" + chunk 1 text run 4 at (154.83,146.39) startOffset 3 endOffset 4 width 26.67: "d" + chunk 1 text run 5 at (178.39,125.17) startOffset 4 endOffset 5 width 36.67: "m" + chunk 1 text run 6 at (202.97,105.11) startOffset 5 endOffset 6 width 26.67: "e" + chunk 1 text run 7 at (220.55,92.43) startOffset 6 endOffset 7 width 16.67: " " + chunk 1 text run 8 at (238.92,80.94) startOffset 7 endOffset 8 width 26.67: "o" + chunk 1 text run 9 at (262.81,69.16) startOffset 8 endOffset 9 width 26.67: "n" + chunk 1 text run 10 at (283.32,62.32) startOffset 9 endOffset 10 width 16.67: " " chunk 1 text run 11 at (304.62,58.84) startOffset 10 endOffset 11 width 26.67: "a" chunk 1 text run 12 at (326.23,59.54) startOffset 11 endOffset 12 width 16.67: " " chunk 1 text run 13 at (347.21,64.70) startOffset 12 endOffset 13 width 26.67: "p" chunk 1 text run 14 at (371.10,76.49) startOffset 13 endOffset 14 width 26.67: "a" chunk 1 text run 15 at (389.76,90.45) startOffset 14 endOffset 15 width 20.00: "t" - chunk 1 text run 16 at (406.65,106.65) startOffset 15 endOffset 16 width 26.67: "h" - chunk 1 text run 17 at (422.05,121.97) startOffset 16 endOffset 17 width 16.67: "!" + chunk 1 text run 16 at (406.66,106.65) startOffset 15 endOffset 16 width 26.67: "h" + chunk 1 text run 17 at (422.06,121.98) startOffset 16 endOffset 17 width 16.67: "!" chunk 1 text run 18 at (433.90,133.61) startOffset 17 endOffset 18 width 16.67: " " - chunk 1 text run 19 at (450.74,149.77) startOffset 18 endOffset 19 width 30.00: "D" - chunk 1 text run 20 at (465.45,163.37) startOffset 19 endOffset 20 width 10.00: "i" - chunk 1 text run 21 at (479.18,175.50) startOffset 20 endOffset 21 width 26.67: "d" + chunk 1 text run 19 at (450.74,149.78) startOffset 18 endOffset 19 width 30.00: "D" + chunk 1 text run 20 at (465.45,163.38) startOffset 19 endOffset 20 width 10.00: "i" + chunk 1 text run 21 at (479.18,175.51) startOffset 20 endOffset 21 width 26.67: "d" chunk 1 text run 22 at (495.84,189.32) startOffset 21 endOffset 22 width 16.67: " " - chunk 1 text run 23 at (513.09,202.37) startOffset 22 endOffset 23 width 26.67: "y" - chunk 1 text run 24 at (535.45,217.04) startOffset 23 endOffset 24 width 26.67: "o" - chunk 1 text run 25 at (559.16,229.30) startOffset 24 endOffset 25 width 26.67: "u" + chunk 1 text run 23 at (513.09,202.38) startOffset 22 endOffset 23 width 26.67: "y" + chunk 1 text run 24 at (535.45,217.05) startOffset 23 endOffset 24 width 26.67: "o" + chunk 1 text run 25 at (559.17,229.30) startOffset 24 endOffset 25 width 26.67: "u" chunk 1 text run 26 at (579.51,236.66) startOffset 25 endOffset 26 width 16.67: " " chunk 1 text run 27 at (595.71,240.18) startOffset 26 endOffset 27 width 16.67: "f" chunk 1 text run 28 at (608.98,241.37) startOffset 27 endOffset 28 width 10.00: "i" chunk 1 text run 29 at (627.25,240.32) startOffset 28 endOffset 29 width 26.67: "n" - chunk 1 text run 30 at (652.86,233.10) startOffset 29 endOffset 30 width 26.67: "d" + chunk 1 text run 30 at (652.87,233.10) startOffset 29 endOffset 30 width 26.67: "d" chunk 1 text run 31 at (680.18,217.26) startOffset 30 endOffset 31 width 36.67: "m" - chunk 1 text run 32 at (703.93,196.12) startOffset 31 endOffset 32 width 26.67: "e" - chunk 1 text run 33 at (722.35,179.24) startOffset 32 endOffset 33 width 23.33: "?" + chunk 1 text run 32 at (703.94,196.12) startOffset 31 endOffset 32 width 26.67: "e" + chunk 1 text run 33 at (722.36,179.23) startOffset 32 endOffset 33 width 23.33: "?" LayoutSVGInlineText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/platform/win7/svg/text/bbox-with-glyph-overflow-on-path-expected.png b/third_party/WebKit/LayoutTests/platform/win7/svg/text/bbox-with-glyph-overflow-on-path-expected.png index 35026cb2..007aa9a 100644 --- a/third_party/WebKit/LayoutTests/platform/win7/svg/text/bbox-with-glyph-overflow-on-path-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win7/svg/text/bbox-with-glyph-overflow-on-path-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/svg/text/bbox-with-glyph-overflow-on-path-expected.txt b/third_party/WebKit/LayoutTests/platform/win7/svg/text/bbox-with-glyph-overflow-on-path-expected.txt index d1b90f61..9803a19 100644 --- a/third_party/WebKit/LayoutTests/platform/win7/svg/text/bbox-with-glyph-overflow-on-path-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win7/svg/text/bbox-with-glyph-overflow-on-path-expected.txt
@@ -27,7 +27,7 @@ chunk 1 text run 10 at (181.97,100.00) startOffset 9 endOffset 10 width 13.89: "f" chunk 1 text run 11 at (195.86,100.00) startOffset 10 endOffset 11 width 13.89: "f" chunk 1 text run 12 at (209.75,100.00) startOffset 11 endOffset 12 width 13.89: "f" - chunk 1 text run 13 at (223.64,100.00) startOffset 12 endOffset 13 width 13.89: "f" + chunk 1 text run 13 at (223.65,100.00) startOffset 12 endOffset 13 width 13.89: "f" chunk 1 text run 14 at (237.54,100.00) startOffset 13 endOffset 14 width 13.89: "f" chunk 1 text run 15 at (251.43,100.00) startOffset 14 endOffset 15 width 13.89: "f" chunk 1 text run 16 at (265.32,100.00) startOffset 15 endOffset 16 width 13.89: "f" @@ -55,7 +55,7 @@ chunk 1 text run 10 at (268.03,150.00) startOffset 9 endOffset 10 width 13.89: "f" chunk 1 text run 11 at (254.14,150.00) startOffset 10 endOffset 11 width 13.89: "f" chunk 1 text run 12 at (240.25,150.00) startOffset 11 endOffset 12 width 13.89: "f" - chunk 1 text run 13 at (226.36,150.00) startOffset 12 endOffset 13 width 13.89: "f" + chunk 1 text run 13 at (226.35,150.00) startOffset 12 endOffset 13 width 13.89: "f" chunk 1 text run 14 at (212.46,150.00) startOffset 13 endOffset 14 width 13.89: "f" chunk 1 text run 15 at (198.57,150.00) startOffset 14 endOffset 15 width 13.89: "f" chunk 1 text run 16 at (184.68,150.00) startOffset 15 endOffset 16 width 13.89: "f" @@ -96,7 +96,7 @@ chunk 1 text run 23 at (350.53,335.87) startOffset 22 endOffset 23 width 13.89: "f" chunk 1 text run 24 at (363.89,339.68) startOffset 23 endOffset 24 width 13.89: "f" LayoutSVGInlineText {#text} at (0,0) size 0x0 - LayoutSVGText {text} at (49,395) size 141x70 contains 1 chunk(s) + LayoutSVGText {text} at (50,395) size 140x70 contains 1 chunk(s) LayoutSVGTextPath {textPath} at (0,0) size 140x70 LayoutSVGInlineText {#text} at (0,0) size 140x70 chunk 1 text run 1 at (59.70,450.00) startOffset 0 endOffset 1 width 19.41: "'" @@ -108,6 +108,6 @@ LayoutSVGRect {rect} at (48,80) size 354x58 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=41.28] [y=55.00] [width=351.77] [height=56.00] LayoutSVGRect {rect} at (64,164) size 354x58 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=56.92] [y=139.00] [width=351.78] [height=56.00] LayoutSVGRect {rect} at (46,229) size 355x153 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=38.59] [y=204.33] [width=353.61] [height=150.48] - LayoutSVGRect {rect} at (57,420) size 141x72 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=49.98] [y=395.00] [width=139.06] [height=70.00] + LayoutSVGRect {rect} at (57,420) size 141x72 [stroke={[type=SOLID] [color=#008000]}] [fill={[type=SOLID] [color=#00000000]}] [x=50.00] [y=395.00] [width=139.05] [height=70.00] LayoutText {#text} at (0,0) size 0x0 LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/platform/win7/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png b/third_party/WebKit/LayoutTests/platform/win7/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png deleted file mode 100644 index d529ecd..0000000 --- a/third_party/WebKit/LayoutTests/platform/win7/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/virtual/threaded/printing/ellipsis-printing-style-expected.png b/third_party/WebKit/LayoutTests/platform/win7/virtual/threaded/printing/ellipsis-printing-style-expected.png new file mode 100644 index 0000000..f534999 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win7/virtual/threaded/printing/ellipsis-printing-style-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/virtual/threaded/printing/iframe-print-expected.png b/third_party/WebKit/LayoutTests/platform/win7/virtual/threaded/printing/iframe-print-expected.png new file mode 100644 index 0000000..26a4ca36 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win7/virtual/threaded/printing/iframe-print-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/printing/ellipsis-printing-style-expected.txt b/third_party/WebKit/LayoutTests/printing/ellipsis-printing-style-expected.txt new file mode 100644 index 0000000..c2d0011 --- /dev/null +++ b/third_party/WebKit/LayoutTests/printing/ellipsis-printing-style-expected.txt
@@ -0,0 +1,9 @@ +layer at (0,0) size 1000x750 + LayoutView at (0,0) size 1000x750 +layer at (0,0) size 1000x40 + LayoutBlockFlow {HTML} at (0,0) size 1000x40 + LayoutBlockFlow {BODY} at (8,8) size 984x24 +layer at (8,8) size 168x24 scrollWidth 1216 + LayoutBlockFlow {DIV} at (0,0) size 168x24 [color=#FFFFFF] [bgcolor=#000000] + LayoutText {#text} at (0,0) size 1216x16 + text run at (0,0) width 1216: "This text should be ellipsized and the ellipsis should visible when printed."
diff --git a/third_party/WebKit/LayoutTests/resources/mojo-helpers.js b/third_party/WebKit/LayoutTests/resources/mojo-helpers.js new file mode 100644 index 0000000..8752dd1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/resources/mojo-helpers.js
@@ -0,0 +1,37 @@ +/* + * mojo-helpers contains extensions to testharness.js useful for consuming + * and mocking Mojo services directly within test code. + */ +'use strict'; + +// Runs a promise_test which depends on the Mojo system API modules available to +// all layout tests. The test implementation function is called with an Object +// that exposes common Mojo module interfaces. +function mojo_test(func, name, properties) { + // Fix up the global window.define, since all baked-in Mojo modules expect to + // find it there. + window.define = mojo.define; + + promise_test(() => { + return new Promise((resolve, reject) => { + define('Mojo layout test module: ' + name, [ + 'mojo/public/js/core', + 'mojo/public/js/router', + 'content/public/renderer/service_provider', + ], (core, router, serviceProvider) => { + try { + resolve(func({ + core: core, + router: router, + + // |serviceProvider| is a bit of a misnomer. It should probably be + // called |serviceRegistry|, so let's call it that here. + serviceRegistry: serviceProvider, + })); + } catch (e) { + reject(e); + } + }); + }); + }, name, properties); +}
diff --git a/third_party/WebKit/LayoutTests/svg/animations/animate-elem-06-t-drt-expected.txt b/third_party/WebKit/LayoutTests/svg/animations/animate-elem-06-t-drt-expected.txt index 9d4054c..9cd9987 100644 --- a/third_party/WebKit/LayoutTests/svg/animations/animate-elem-06-t-drt-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/animations/animate-elem-06-t-drt-expected.txt
@@ -9,7 +9,7 @@ PASS getTransformToElement(rootSVGElement, path).e is -15 PASS getTransformToElement(rootSVGElement, path).f is -43 -FAIL getTransformToElement(rootSVGElement, path).e should be close to -38.5. Was -38.3656120300293. +FAIL getTransformToElement(rootSVGElement, path).e should be close to -38.5. Was -38.36632537841797. PASS getTransformToElement(rootSVGElement, path).f is -30 PASS getTransformToElement(rootSVGElement, path).e is -65 PASS getTransformToElement(rootSVGElement, path).f is -33
diff --git a/third_party/WebKit/LayoutTests/svg/animations/animate-elem-07-t-drt-expected.txt b/third_party/WebKit/LayoutTests/svg/animations/animate-elem-07-t-drt-expected.txt index 9d4054c..9cd9987 100644 --- a/third_party/WebKit/LayoutTests/svg/animations/animate-elem-07-t-drt-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/animations/animate-elem-07-t-drt-expected.txt
@@ -9,7 +9,7 @@ PASS getTransformToElement(rootSVGElement, path).e is -15 PASS getTransformToElement(rootSVGElement, path).f is -43 -FAIL getTransformToElement(rootSVGElement, path).e should be close to -38.5. Was -38.3656120300293. +FAIL getTransformToElement(rootSVGElement, path).e should be close to -38.5. Was -38.36632537841797. PASS getTransformToElement(rootSVGElement, path).f is -30 PASS getTransformToElement(rootSVGElement, path).e is -65 PASS getTransformToElement(rootSVGElement, path).f is -33
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/animations/animate-elem-08-t-drt-expected.txt b/third_party/WebKit/LayoutTests/svg/animations/animate-elem-08-t-drt-expected.txt similarity index 89% copy from third_party/WebKit/LayoutTests/platform/mac/svg/animations/animate-elem-08-t-drt-expected.txt copy to third_party/WebKit/LayoutTests/svg/animations/animate-elem-08-t-drt-expected.txt index b222eaf7..10c8c56 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/animations/animate-elem-08-t-drt-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/animations/animate-elem-08-t-drt-expected.txt
@@ -23,38 +23,38 @@ PASS getTransformToElement(rootSVGElement, path1).b is 0.1 PASS getTransformToElement(rootSVGElement, path1).c is -0.1 PASS getTransformToElement(rootSVGElement, path1).d is 1 -FAIL getTransformToElement(rootSVGElement, path1).e should be close to -70.3. Was -70.87814895357428. -FAIL getTransformToElement(rootSVGElement, path1).f should be close to -182.8. Was -182.60109333201257. +FAIL getTransformToElement(rootSVGElement, path1).e should be close to -70.3. Was -70.88506734438292. +FAIL getTransformToElement(rootSVGElement, path1).f should be close to -182.8. Was -182.59945510934625. PASS getTransformToElement(rootSVGElement, path2).a is -1 PASS getTransformToElement(rootSVGElement, path2).b is -0.1 PASS getTransformToElement(rootSVGElement, path2).c is 0.1 PASS getTransformToElement(rootSVGElement, path2).d is -1 -FAIL getTransformToElement(rootSVGElement, path2).e should be close to 318.6. Was 319.29822182153924. -FAIL getTransformToElement(rootSVGElement, path2).f should be close to 211.6. Was 210.66313575977358. +FAIL getTransformToElement(rootSVGElement, path2).e should be close to 318.6. Was 319.3057494247923. +FAIL getTransformToElement(rootSVGElement, path2).f should be close to 211.6. Was 210.65582089693936. PASS getTransformToElement(rootSVGElement, path1).a is 0.7 PASS getTransformToElement(rootSVGElement, path1).b is -0.7 PASS getTransformToElement(rootSVGElement, path1).c is 0.7 PASS getTransformToElement(rootSVGElement, path1).d is 0.7 PASS getTransformToElement(rootSVGElement, path1).e is -265.1 -FAIL getTransformToElement(rootSVGElement, path1).f should be close to -18.9. Was -17.677916691624326. +FAIL getTransformToElement(rootSVGElement, path1).f should be close to -18.9. Was -17.677669529663703. PASS getTransformToElement(rootSVGElement, path2).a is -0.7 PASS getTransformToElement(rootSVGElement, path2).b is 0.7 PASS getTransformToElement(rootSVGElement, path2).c is -0.7 PASS getTransformToElement(rootSVGElement, path2).d is -0.7 -FAIL getTransformToElement(rootSVGElement, path2).e should be close to 442.7. Was 441.941810617502. -FAIL getTransformToElement(rootSVGElement, path2).f should be close to -156.9. Was -159.09852261339003. +FAIL getTransformToElement(rootSVGElement, path2).e should be close to 442.7. Was 441.94173824159213. +FAIL getTransformToElement(rootSVGElement, path2).f should be close to -156.9. Was -159.09902576697306. PASS getTransformToElement(rootSVGElement, path1).a is 0.7 PASS getTransformToElement(rootSVGElement, path1).b is -0.7 PASS getTransformToElement(rootSVGElement, path1).c is 0.7 PASS getTransformToElement(rootSVGElement, path1).d is 0.7 PASS getTransformToElement(rootSVGElement, path1).e is -265.1 -FAIL getTransformToElement(rootSVGElement, path1).f should be close to -18.9. Was -17.677916691624326. +FAIL getTransformToElement(rootSVGElement, path1).f should be close to -18.9. Was -17.677669529663703. PASS getTransformToElement(rootSVGElement, path2).a is -0.7 PASS getTransformToElement(rootSVGElement, path2).b is 0.7 PASS getTransformToElement(rootSVGElement, path2).c is -0.7 PASS getTransformToElement(rootSVGElement, path2).d is -0.7 -FAIL getTransformToElement(rootSVGElement, path2).e should be close to 442.7. Was 441.941810617502. -FAIL getTransformToElement(rootSVGElement, path2).f should be close to -156.9. Was -159.09852261339003. +FAIL getTransformToElement(rootSVGElement, path2).e should be close to 442.7. Was 441.94173824159213. +FAIL getTransformToElement(rootSVGElement, path2).f should be close to -156.9. Was -159.09902576697306. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/svg/animations/animateMotion-accumulate-2a-expected.png b/third_party/WebKit/LayoutTests/svg/animations/animateMotion-accumulate-2a-expected.png index 6d155091..4f17ae61 100644 --- a/third_party/WebKit/LayoutTests/svg/animations/animateMotion-accumulate-2a-expected.png +++ b/third_party/WebKit/LayoutTests/svg/animations/animateMotion-accumulate-2a-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/svg/animations/animateMotion-accumulate-2a-expected.txt b/third_party/WebKit/LayoutTests/svg/animations/animateMotion-accumulate-2a-expected.txt index 71c52fc4..cf9b7db 100644 --- a/third_party/WebKit/LayoutTests/svg/animations/animateMotion-accumulate-2a-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/animations/animateMotion-accumulate-2a-expected.txt
@@ -9,7 +9,7 @@ LayoutSVGContainer {g} at (445,81) size 102x102 LayoutSVGEllipse {circle} at (445,81) size 102x102 [transform={m=((1.00,0.00)(0.00,1.00)) t=(600.00,200.00)}] [fill={[type=SOLID] [color=#FF0000]}] [cx=0.00] [cy=0.00] [r=70.00] LayoutSVGEllipse {circle} at (445,81) size 102x102 [transform={m=((0.00,-1.00)(1.00,0.00)) t=(600.00,200.00)}] [stroke={[type=SOLID] [color=#0000FF] [stroke width=21.00]}] [fill={[type=SOLID] [color=#FF0000]}] [cx=0.00] [cy=0.00] [r=60.00] - LayoutSVGEllipse {circle} at (459,95) size 74x74 [transform={m=((-0.00,1.00)(-1.00,-0.00)) t=(600.00,200.00)}] [stroke={[type=SOLID] [color=#0000FF] [stroke width=21.00]}] [fill={[type=SOLID] [color=#FF0000]}] [cx=0.00] [cy=0.00] [r=40.00] + LayoutSVGEllipse {circle} at (459,95) size 74x74 [transform={m=((0.00,1.00)(-1.00,0.00)) t=(600.00,200.00)}] [stroke={[type=SOLID] [color=#0000FF] [stroke width=21.00]}] [fill={[type=SOLID] [color=#FF0000]}] [cx=0.00] [cy=0.00] [r=40.00] LayoutSVGEllipse {circle} at (474,110) size 44x44 [transform={m=((1.00,0.00)(0.00,1.00)) t=(600.00,200.00)}] [stroke={[type=SOLID] [color=#0000FF] [stroke width=21.00]}] [fill={[type=SOLID] [color=#FF0000]}] [cx=0.00] [cy=0.00] [r=20.00] LayoutSVGContainer {g} at (344,124) size 160x152 LayoutSVGPath {path} at (344,124) size 160x152 [stroke={[type=SOLID] [color=#888888] [stroke width=20.00] [line cap=ROUND] [line join=ROUND]}] [data="M 400 200 c 0 200 200 200 200 0"]
diff --git a/third_party/WebKit/LayoutTests/svg/animations/animateMotion-accumulate-2b-expected.png b/third_party/WebKit/LayoutTests/svg/animations/animateMotion-accumulate-2b-expected.png index b5bd4b1..595245b 100644 --- a/third_party/WebKit/LayoutTests/svg/animations/animateMotion-accumulate-2b-expected.png +++ b/third_party/WebKit/LayoutTests/svg/animations/animateMotion-accumulate-2b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/svg/animations/animateMotion-accumulate-2b-expected.txt b/third_party/WebKit/LayoutTests/svg/animations/animateMotion-accumulate-2b-expected.txt index 13b405c..58b2201 100644 --- a/third_party/WebKit/LayoutTests/svg/animations/animateMotion-accumulate-2b-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/animations/animateMotion-accumulate-2b-expected.txt
@@ -9,7 +9,7 @@ LayoutSVGContainer {g} at (661,153) size 102x102 LayoutSVGEllipse {circle} at (661,153) size 102x102 [transform={m=((1.00,0.00)(0.00,1.00)) t=(900.00,300.00)}] [fill={[type=SOLID] [color=#FF0000]}] [cx=0.00] [cy=0.00] [r=70.00] LayoutSVGEllipse {circle} at (661,153) size 102x102 [transform={m=((0.00,-1.00)(1.00,0.00)) t=(900.00,300.00)}] [stroke={[type=SOLID] [color=#0000FF] [stroke width=21.00]}] [fill={[type=SOLID] [color=#FF0000]}] [cx=0.00] [cy=0.00] [r=60.00] - LayoutSVGEllipse {circle} at (675,167) size 74x74 [transform={m=((-0.00,1.00)(-1.00,-0.00)) t=(900.00,300.00)}] [stroke={[type=SOLID] [color=#0000FF] [stroke width=21.00]}] [fill={[type=SOLID] [color=#FF0000]}] [cx=0.00] [cy=0.00] [r=40.00] + LayoutSVGEllipse {circle} at (675,167) size 74x74 [transform={m=((0.00,1.00)(-1.00,0.00)) t=(900.00,300.00)}] [stroke={[type=SOLID] [color=#0000FF] [stroke width=21.00]}] [fill={[type=SOLID] [color=#FF0000]}] [cx=0.00] [cy=0.00] [r=40.00] LayoutSVGEllipse {circle} at (690,182) size 44x44 [transform={m=((1.00,0.00)(0.00,1.00)) t=(900.00,300.00)}] [stroke={[type=SOLID] [color=#0000FF] [stroke width=21.00]}] [fill={[type=SOLID] [color=#FF0000]}] [cx=0.00] [cy=0.00] [r=20.00] LayoutSVGContainer {g} at (560,196) size 160x152 LayoutSVGPath {path} at (560,196) size 160x152 [stroke={[type=SOLID] [color=#888888] [stroke width=20.00] [line cap=ROUND] [line join=ROUND]}] [data="M 700 300 c 0 200 200 200 200 0"]
diff --git a/third_party/WebKit/LayoutTests/svg/batik/text/textGlyphOrientationHorizontal-expected.txt b/third_party/WebKit/LayoutTests/svg/batik/text/textGlyphOrientationHorizontal-expected.txt index f3aa370..322c0ee3 100644 --- a/third_party/WebKit/LayoutTests/svg/batik/text/textGlyphOrientationHorizontal-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/batik/text/textGlyphOrientationHorizontal-expected.txt
@@ -32,7 +32,7 @@ LayoutSVGTSpan {tspan} at (0,0) size 63x46 LayoutSVGInlineText {#text} at (75,23) size 62x46 chunk 1 text run 1 at (86.24,26.19) startOffset 0 endOffset 1 width 6.67: " " - chunk 1 text run 2 at (95.41,34.74) startOffset 1 endOffset 2 width 18.67: "G" + chunk 1 text run 2 at (95.42,34.74) startOffset 1 endOffset 2 width 18.67: "G" chunk 1 text run 3 at (108.40,44.16) startOffset 2 endOffset 3 width 13.35: "o" chunk 1 text run 4 at (120.98,48.24) startOffset 3 endOffset 4 width 13.35: "o" chunk 1 text run 5 at (133.69,45.03) startOffset 4 endOffset 5 width 13.35: "d" @@ -51,11 +51,11 @@ chunk 1 text run 2 at (40.45,29.97) startOffset 1 endOffset 2 width 13.35: "a" chunk 1 text run 3 at (49.48,25.85) startOffset 2 endOffset 3 width 6.67: "t" chunk 1 text run 4 at (55.03,23.48) startOffset 3 endOffset 4 width 5.33: "i" - chunk 1 text run 5 at (63.07,20.31) startOffset 4 endOffset 5 width 12.00: "k" + chunk 1 text run 5 at (63.08,20.31) startOffset 4 endOffset 5 width 12.00: "k" chunk 1 text run 6 at (71.94,17.27) startOffset 5 endOffset 6 width 6.67: " " LayoutSVGTSpan {tspan} at (0,0) size 25x31 LayoutSVGInlineText {#text} at (56,0) size 25x31 - chunk 1 text run 1 at (77.67,15.60) startOffset 0 endOffset 1 width 5.33: "i" + chunk 1 text run 1 at (77.68,15.60) startOffset 0 endOffset 1 width 5.33: "i" chunk 1 text run 2 at (86.13,13.63) startOffset 1 endOffset 2 width 12.00: "s" LayoutSVGTSpan {tspan} at (0,0) size 75x43 LayoutSVGInlineText {#text} at (79,8) size 75x43 @@ -88,7 +88,7 @@ LayoutSVGTSpan {tspan} at (0,0) size 63x46 LayoutSVGInlineText {#text} at (75,23) size 62x46 chunk 1 text run 1 at (86.24,26.19) startOffset 0 endOffset 1 width 6.67: " " - chunk 1 text run 2 at (95.41,34.74) startOffset 1 endOffset 2 width 18.67: "G" + chunk 1 text run 2 at (95.42,34.74) startOffset 1 endOffset 2 width 18.67: "G" chunk 1 text run 3 at (108.40,44.16) startOffset 2 endOffset 3 width 13.35: "o" chunk 1 text run 4 at (120.98,48.24) startOffset 3 endOffset 4 width 13.35: "o" chunk 1 text run 5 at (133.69,45.03) startOffset 4 endOffset 5 width 13.35: "d" @@ -107,11 +107,11 @@ chunk 1 text run 2 at (40.45,29.97) startOffset 1 endOffset 2 width 13.35: "a" chunk 1 text run 3 at (49.48,25.85) startOffset 2 endOffset 3 width 6.67: "t" chunk 1 text run 4 at (55.03,23.48) startOffset 3 endOffset 4 width 5.33: "i" - chunk 1 text run 5 at (63.07,20.31) startOffset 4 endOffset 5 width 12.00: "k" + chunk 1 text run 5 at (63.08,20.31) startOffset 4 endOffset 5 width 12.00: "k" chunk 1 text run 6 at (71.94,17.27) startOffset 5 endOffset 6 width 6.67: " " LayoutSVGTSpan {tspan} at (0,0) size 25x31 LayoutSVGInlineText {#text} at (56,0) size 25x31 - chunk 1 text run 1 at (77.67,15.60) startOffset 0 endOffset 1 width 5.33: "i" + chunk 1 text run 1 at (77.68,15.60) startOffset 0 endOffset 1 width 5.33: "i" chunk 1 text run 2 at (86.13,13.63) startOffset 1 endOffset 2 width 12.00: "s" LayoutSVGTSpan {tspan} at (0,0) size 75x43 LayoutSVGInlineText {#text} at (79,8) size 75x43
diff --git a/third_party/WebKit/LayoutTests/svg/css/parse-length-expected.txt b/third_party/WebKit/LayoutTests/svg/css/parse-length-expected.txt index 2229b05..725201b7 100644 --- a/third_party/WebKit/LayoutTests/svg/css/parse-length-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/css/parse-length-expected.txt
@@ -1,83 +1,83 @@ -CONSOLE ERROR: Error: Invalid value for <mask> attribute x="auto" -CONSOLE ERROR: Error: Invalid value for <mask> attribute x="100 px" -CONSOLE ERROR: Error: Invalid value for <mask> attribute x="100px;" -CONSOLE ERROR: Error: Invalid value for <mask> attribute x="100px !important" -CONSOLE ERROR: Error: Invalid value for <mask> attribute x="{ 100px }" -CONSOLE ERROR: Error: Invalid value for <mask> attribute y="auto" -CONSOLE ERROR: Error: Invalid value for <mask> attribute y="100 px" -CONSOLE ERROR: Error: Invalid value for <mask> attribute y="100px;" -CONSOLE ERROR: Error: Invalid value for <mask> attribute y="100px !important" -CONSOLE ERROR: Error: Invalid value for <mask> attribute y="{ 100px }" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="auto" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="100 px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="100px;" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="100px !important" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="{ 100px }" -CONSOLE ERROR: Error: Invalid value for <svg> attribute y="auto" -CONSOLE ERROR: Error: Invalid value for <svg> attribute y="100 px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute y="100px;" -CONSOLE ERROR: Error: Invalid value for <svg> attribute y="100px !important" -CONSOLE ERROR: Error: Invalid value for <svg> attribute y="{ 100px }" -CONSOLE ERROR: Error: Invalid value for <rect> attribute x="auto" -CONSOLE ERROR: Error: Invalid value for <rect> attribute x="100 px" -CONSOLE ERROR: Error: Invalid value for <rect> attribute x="100px;" -CONSOLE ERROR: Error: Invalid value for <rect> attribute x="100px !important" -CONSOLE ERROR: Error: Invalid value for <rect> attribute x="{ 100px }" -CONSOLE ERROR: Error: Invalid value for <rect> attribute y="auto" -CONSOLE ERROR: Error: Invalid value for <rect> attribute y="100 px" -CONSOLE ERROR: Error: Invalid value for <rect> attribute y="100px;" -CONSOLE ERROR: Error: Invalid value for <rect> attribute y="100px !important" -CONSOLE ERROR: Error: Invalid value for <rect> attribute y="{ 100px }" -CONSOLE ERROR: Error: Invalid value for <image> attribute x="auto" -CONSOLE ERROR: Error: Invalid value for <image> attribute x="100 px" -CONSOLE ERROR: Error: Invalid value for <image> attribute x="100px;" -CONSOLE ERROR: Error: Invalid value for <image> attribute x="100px !important" -CONSOLE ERROR: Error: Invalid value for <image> attribute x="{ 100px }" -CONSOLE ERROR: Error: Invalid value for <image> attribute y="auto" -CONSOLE ERROR: Error: Invalid value for <image> attribute y="100 px" -CONSOLE ERROR: Error: Invalid value for <image> attribute y="100px;" -CONSOLE ERROR: Error: Invalid value for <image> attribute y="100px !important" -CONSOLE ERROR: Error: Invalid value for <image> attribute y="{ 100px }" -CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute x="auto" -CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute x="100 px" -CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute x="100px;" -CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute x="100px !important" -CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute x="{ 100px }" -CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute y="auto" -CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute y="100 px" -CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute y="100px;" -CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute y="100px !important" -CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute y="{ 100px }" +CONSOLE ERROR: Error: <mask> attribute x: Expected length, "auto". +CONSOLE ERROR: Error: <mask> attribute x: Expected length, "100 px". +CONSOLE ERROR: Error: <mask> attribute x: Expected length, "100px;". +CONSOLE ERROR: Error: <mask> attribute x: Expected length, "100px !important". +CONSOLE ERROR: Error: <mask> attribute x: Expected length, "{ 100px }". +CONSOLE ERROR: Error: <mask> attribute y: Expected length, "auto". +CONSOLE ERROR: Error: <mask> attribute y: Expected length, "100 px". +CONSOLE ERROR: Error: <mask> attribute y: Expected length, "100px;". +CONSOLE ERROR: Error: <mask> attribute y: Expected length, "100px !important". +CONSOLE ERROR: Error: <mask> attribute y: Expected length, "{ 100px }". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "auto". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "100 px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "100px;". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "100px !important". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "{ 100px }". +CONSOLE ERROR: Error: <svg> attribute y: Expected length, "auto". +CONSOLE ERROR: Error: <svg> attribute y: Expected length, "100 px". +CONSOLE ERROR: Error: <svg> attribute y: Expected length, "100px;". +CONSOLE ERROR: Error: <svg> attribute y: Expected length, "100px !important". +CONSOLE ERROR: Error: <svg> attribute y: Expected length, "{ 100px }". +CONSOLE ERROR: Error: <rect> attribute x: Expected length, "auto". +CONSOLE ERROR: Error: <rect> attribute x: Expected length, "100 px". +CONSOLE ERROR: Error: <rect> attribute x: Expected length, "100px;". +CONSOLE ERROR: Error: <rect> attribute x: Expected length, "100px !important". +CONSOLE ERROR: Error: <rect> attribute x: Expected length, "{ 100px }". +CONSOLE ERROR: Error: <rect> attribute y: Expected length, "auto". +CONSOLE ERROR: Error: <rect> attribute y: Expected length, "100 px". +CONSOLE ERROR: Error: <rect> attribute y: Expected length, "100px;". +CONSOLE ERROR: Error: <rect> attribute y: Expected length, "100px !important". +CONSOLE ERROR: Error: <rect> attribute y: Expected length, "{ 100px }". +CONSOLE ERROR: Error: <image> attribute x: Expected length, "auto". +CONSOLE ERROR: Error: <image> attribute x: Expected length, "100 px". +CONSOLE ERROR: Error: <image> attribute x: Expected length, "100px;". +CONSOLE ERROR: Error: <image> attribute x: Expected length, "100px !important". +CONSOLE ERROR: Error: <image> attribute x: Expected length, "{ 100px }". +CONSOLE ERROR: Error: <image> attribute y: Expected length, "auto". +CONSOLE ERROR: Error: <image> attribute y: Expected length, "100 px". +CONSOLE ERROR: Error: <image> attribute y: Expected length, "100px;". +CONSOLE ERROR: Error: <image> attribute y: Expected length, "100px !important". +CONSOLE ERROR: Error: <image> attribute y: Expected length, "{ 100px }". +CONSOLE ERROR: Error: <foreignObject> attribute x: Expected length, "auto". +CONSOLE ERROR: Error: <foreignObject> attribute x: Expected length, "100 px". +CONSOLE ERROR: Error: <foreignObject> attribute x: Expected length, "100px;". +CONSOLE ERROR: Error: <foreignObject> attribute x: Expected length, "100px !important". +CONSOLE ERROR: Error: <foreignObject> attribute x: Expected length, "{ 100px }". +CONSOLE ERROR: Error: <foreignObject> attribute y: Expected length, "auto". +CONSOLE ERROR: Error: <foreignObject> attribute y: Expected length, "100 px". +CONSOLE ERROR: Error: <foreignObject> attribute y: Expected length, "100px;". +CONSOLE ERROR: Error: <foreignObject> attribute y: Expected length, "100px !important". +CONSOLE ERROR: Error: <foreignObject> attribute y: Expected length, "{ 100px }". CONSOLE ERROR: Error: <rect> attribute rx: A negative value is not valid. ("-200px") -CONSOLE ERROR: Error: Invalid value for <rect> attribute rx="auto" -CONSOLE ERROR: Error: Invalid value for <rect> attribute rx="100 px" -CONSOLE ERROR: Error: Invalid value for <rect> attribute rx="100px;" -CONSOLE ERROR: Error: Invalid value for <rect> attribute rx="100px !important" -CONSOLE ERROR: Error: Invalid value for <rect> attribute rx="{ 100px }" +CONSOLE ERROR: Error: <rect> attribute rx: Expected length, "auto". +CONSOLE ERROR: Error: <rect> attribute rx: Expected length, "100 px". +CONSOLE ERROR: Error: <rect> attribute rx: Expected length, "100px;". +CONSOLE ERROR: Error: <rect> attribute rx: Expected length, "100px !important". +CONSOLE ERROR: Error: <rect> attribute rx: Expected length, "{ 100px }". CONSOLE ERROR: Error: <rect> attribute ry: A negative value is not valid. ("-200px") -CONSOLE ERROR: Error: Invalid value for <rect> attribute ry="auto" -CONSOLE ERROR: Error: Invalid value for <rect> attribute ry="100 px" -CONSOLE ERROR: Error: Invalid value for <rect> attribute ry="100px;" -CONSOLE ERROR: Error: Invalid value for <rect> attribute ry="100px !important" -CONSOLE ERROR: Error: Invalid value for <rect> attribute ry="{ 100px }" +CONSOLE ERROR: Error: <rect> attribute ry: Expected length, "auto". +CONSOLE ERROR: Error: <rect> attribute ry: Expected length, "100 px". +CONSOLE ERROR: Error: <rect> attribute ry: Expected length, "100px;". +CONSOLE ERROR: Error: <rect> attribute ry: Expected length, "100px !important". +CONSOLE ERROR: Error: <rect> attribute ry: Expected length, "{ 100px }". CONSOLE ERROR: Error: <ellipse> attribute rx: A negative value is not valid. ("-200px") -CONSOLE ERROR: Error: Invalid value for <ellipse> attribute rx="auto" -CONSOLE ERROR: Error: Invalid value for <ellipse> attribute rx="100 px" -CONSOLE ERROR: Error: Invalid value for <ellipse> attribute rx="100px;" -CONSOLE ERROR: Error: Invalid value for <ellipse> attribute rx="100px !important" -CONSOLE ERROR: Error: Invalid value for <ellipse> attribute rx="{ 100px }" +CONSOLE ERROR: Error: <ellipse> attribute rx: Expected length, "auto". +CONSOLE ERROR: Error: <ellipse> attribute rx: Expected length, "100 px". +CONSOLE ERROR: Error: <ellipse> attribute rx: Expected length, "100px;". +CONSOLE ERROR: Error: <ellipse> attribute rx: Expected length, "100px !important". +CONSOLE ERROR: Error: <ellipse> attribute rx: Expected length, "{ 100px }". CONSOLE ERROR: Error: <ellipse> attribute ry: A negative value is not valid. ("-200px") -CONSOLE ERROR: Error: Invalid value for <ellipse> attribute ry="auto" -CONSOLE ERROR: Error: Invalid value for <ellipse> attribute ry="100 px" -CONSOLE ERROR: Error: Invalid value for <ellipse> attribute ry="100px;" -CONSOLE ERROR: Error: Invalid value for <ellipse> attribute ry="100px !important" -CONSOLE ERROR: Error: Invalid value for <ellipse> attribute ry="{ 100px }" +CONSOLE ERROR: Error: <ellipse> attribute ry: Expected length, "auto". +CONSOLE ERROR: Error: <ellipse> attribute ry: Expected length, "100 px". +CONSOLE ERROR: Error: <ellipse> attribute ry: Expected length, "100px;". +CONSOLE ERROR: Error: <ellipse> attribute ry: Expected length, "100px !important". +CONSOLE ERROR: Error: <ellipse> attribute ry: Expected length, "{ 100px }". CONSOLE ERROR: Error: <circle> attribute r: A negative value is not valid. ("-200px") -CONSOLE ERROR: Error: Invalid value for <circle> attribute r="auto" -CONSOLE ERROR: Error: Invalid value for <circle> attribute r="100 px" -CONSOLE ERROR: Error: Invalid value for <circle> attribute r="100px;" -CONSOLE ERROR: Error: Invalid value for <circle> attribute r="100px !important" -CONSOLE ERROR: Error: Invalid value for <circle> attribute r="{ 100px }" +CONSOLE ERROR: Error: <circle> attribute r: Expected length, "auto". +CONSOLE ERROR: Error: <circle> attribute r: Expected length, "100 px". +CONSOLE ERROR: Error: <circle> attribute r: Expected length, "100px;". +CONSOLE ERROR: Error: <circle> attribute r: Expected length, "100px !important". +CONSOLE ERROR: Error: <circle> attribute r: Expected length, "{ 100px }". Test that 'length' presentation attribute values are parsed with CSS presentation rules. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/svg/custom/disallow-non-lengths-in-attrs-expected.txt b/third_party/WebKit/LayoutTests/svg/custom/disallow-non-lengths-in-attrs-expected.txt index be10764..a36696c 100644 --- a/third_party/WebKit/LayoutTests/svg/custom/disallow-non-lengths-in-attrs-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/custom/disallow-non-lengths-in-attrs-expected.txt
@@ -1,11 +1,11 @@ -CONSOLE ERROR: Error: Invalid value for <svg> attribute width="auto" -CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute width="auto" -CONSOLE ERROR: Error: Invalid value for <svg> attribute width="initial" -CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute width="initial" -CONSOLE ERROR: Error: Invalid value for <svg> attribute width="inherit" -CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute width="inherit" -CONSOLE ERROR: Error: Invalid value for <svg> attribute width="foo" -CONSOLE ERROR: Error: Invalid value for <foreignObject> attribute width="foo" +CONSOLE ERROR: Error: <svg> attribute width: Expected length, "auto". +CONSOLE ERROR: Error: <foreignObject> attribute width: Expected length, "auto". +CONSOLE ERROR: Error: <svg> attribute width: Expected length, "initial". +CONSOLE ERROR: Error: <foreignObject> attribute width: Expected length, "initial". +CONSOLE ERROR: Error: <svg> attribute width: Expected length, "inherit". +CONSOLE ERROR: Error: <foreignObject> attribute width: Expected length, "inherit". +CONSOLE ERROR: Error: <svg> attribute width: Expected length, "foo". +CONSOLE ERROR: Error: <foreignObject> attribute width: Expected length, "foo". This is a testharness.js-based test. PASS Test width 'auto' on SVGSVGElement
diff --git a/third_party/WebKit/LayoutTests/svg/custom/invalid-length-units-expected.txt b/third_party/WebKit/LayoutTests/svg/custom/invalid-length-units-expected.txt index dff7a6f..df412090 100644 --- a/third_party/WebKit/LayoutTests/svg/custom/invalid-length-units-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/custom/invalid-length-units-expected.txt
@@ -1,11 +1,11 @@ -CONSOLE ERROR: Error: Invalid value for <rect> attribute x=" " -CONSOLE ERROR: Error: Invalid value for <rect> attribute x="foo" -CONSOLE ERROR: Error: Invalid value for <rect> attribute x="10foo" -CONSOLE ERROR: Error: Invalid value for <rect> attribute x="px" -CONSOLE ERROR: Error: Invalid value for <rect> attribute x="10 % " -CONSOLE ERROR: Error: Invalid value for <rect> attribute x="10 %" -CONSOLE ERROR: Error: Invalid value for <rect> attribute x="10 px " -CONSOLE ERROR: Error: Invalid value for <rect> attribute x="10 px" +CONSOLE ERROR: Error: <rect> attribute x: Expected length, " ". +CONSOLE ERROR: Error: <rect> attribute x: Expected length, "foo". +CONSOLE ERROR: Error: <rect> attribute x: Expected length, "10foo". +CONSOLE ERROR: Error: <rect> attribute x: Expected length, "px". +CONSOLE ERROR: Error: <rect> attribute x: Expected length, "10 % ". +CONSOLE ERROR: Error: <rect> attribute x: Expected length, "10 %". +CONSOLE ERROR: Error: <rect> attribute x: Expected length, "10 px ". +CONSOLE ERROR: Error: <rect> attribute x: Expected length, "10 px". Tests handling of invalid SVG length units. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/svg/custom/invalid-lengthlist-expected.txt b/third_party/WebKit/LayoutTests/svg/custom/invalid-lengthlist-expected.txt index ad868c3d..e1113103 100644 --- a/third_party/WebKit/LayoutTests/svg/custom/invalid-lengthlist-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/custom/invalid-lengthlist-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 13: Error: Invalid value for <text> attribute x="1.2.3" +CONSOLE ERROR: line 13: Error: <text> attribute x: Expected length, "1.2.3". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/svg/custom/poly-parsing-error-expected.txt b/third_party/WebKit/LayoutTests/svg/custom/poly-parsing-error-expected.txt index 6082962..2b42215 100644 --- a/third_party/WebKit/LayoutTests/svg/custom/poly-parsing-error-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/custom/poly-parsing-error-expected.txt
@@ -1,7 +1,7 @@ -CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="80,200 80,300 150,250 80,200 250" -CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="180,200 180,300 250,250 180,200 250" -CONSOLE ERROR: Error: Invalid value for <polygon> attribute points="80,60 80,160 150,110 80" -CONSOLE ERROR: Error: Invalid value for <polygon> attribute points="180,60 180,160 250,110 180" +CONSOLE ERROR: Error: <polyline> attribute points: Unexpected end of attribute. Expected number, "…0,250 80,200 250". +CONSOLE ERROR: Error: <polyline> attribute points: Unexpected end of attribute. Expected number, "…,250 180,200 250". +CONSOLE ERROR: Error: <polygon> attribute points: Unexpected end of attribute. Expected number, "…0,160 150,110 80". +CONSOLE ERROR: Error: <polygon> attribute points: Unexpected end of attribute. Expected number, "…,160 250,110 180". Tests whether polygons render up to first parsing error. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/svg/custom/polyline-invalid-points-expected.txt b/third_party/WebKit/LayoutTests/svg/custom/polyline-invalid-points-expected.txt index 985406f..35cdd01 100644 --- a/third_party/WebKit/LayoutTests/svg/custom/polyline-invalid-points-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/custom/polyline-invalid-points-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 4: Error: Invalid value for <polyline> attribute points="0, 0 100,0 100, 100 0, 100 INF INF" +CONSOLE ERROR: line 4: Error: <polyline> attribute points: Expected number, "…100, 100 0, 100 INF INF". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/svg/custom/polyline-setattribute-points-null-expected.txt b/third_party/WebKit/LayoutTests/svg/custom/polyline-setattribute-points-null-expected.txt index 05f57f1..ce95474e 100644 --- a/third_party/WebKit/LayoutTests/svg/custom/polyline-setattribute-points-null-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/custom/polyline-setattribute-points-null-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="undefined" +CONSOLE ERROR: Error: <polyline> attribute points: Expected number, "undefined". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/svg/custom/svg-length-rem-crash-expected.txt b/third_party/WebKit/LayoutTests/svg/custom/svg-length-rem-crash-expected.txt index 9388ebd..757d98e 100644 --- a/third_party/WebKit/LayoutTests/svg/custom/svg-length-rem-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/custom/svg-length-rem-crash-expected.txt
@@ -1,2 +1,2 @@ -CONSOLE ERROR: line 2: Error: Invalid value for <svg> attribute width="1re" +CONSOLE ERROR: line 2: Error: <svg> attribute width: Expected length, "1re". This test passes if it doesn't crash in ASAN.
diff --git a/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-1-expected.txt b/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-1-expected.txt index e87dff4..893b0875 100644 --- a/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-1-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-1-expected.txt
@@ -1,2 +1,2 @@ -CONSOLE ERROR: line 9: Error: Invalid value for <foreignObject> attribute y="105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +CONSOLE ERROR: line 9: Error: <foreignObject> attribute y: Expected length, "1050000000000000…".
diff --git a/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-2-expected.txt b/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-2-expected.txt index 0f0ed25..0e97bcd 100644 --- a/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-2-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-2-expected.txt
@@ -1,2 +1,2 @@ -CONSOLE ERROR: line 9: Error: Invalid value for <rect> attribute height="-105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +CONSOLE ERROR: line 9: Error: <rect> attribute height: Expected length, "-105000000000000…".
diff --git a/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-3-expected.txt b/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-3-expected.txt index 6aa637c..e36481f 100644 --- a/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-3-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-3-expected.txt
@@ -1,2 +1,2 @@ -CONSOLE ERROR: line 14: Error: Invalid value for <rect> attribute height="105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +CONSOLE ERROR: line 14: Error: <rect> attribute height: Expected length, "1050000000000000…".
diff --git a/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-4-expected.txt b/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-4-expected.txt index c534597..d5db480 100644 --- a/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-4-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-4-expected.txt
@@ -1,2 +1,2 @@ -CONSOLE ERROR: line 9: Error: Invalid value for <foreignObject> attribute y="105.0e50" +CONSOLE ERROR: line 9: Error: <foreignObject> attribute y: Expected length, "105.0e50".
diff --git a/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-5-expected.txt b/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-5-expected.txt index 9477f6e7..f2c36e9cb 100644 --- a/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-5-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/custom/svg-parse-overflow-5-expected.txt
@@ -1,2 +1,2 @@ -CONSOLE ERROR: line 9: Error: Invalid value for <foreignObject> attribute y="105.0e5000000000000000000000000000000000000000000000000000" +CONSOLE ERROR: line 9: Error: <foreignObject> attribute y: Expected length, "105.0e5000000000…".
diff --git a/third_party/WebKit/LayoutTests/svg/custom/use-property-synchronization-crash-expected.txt b/third_party/WebKit/LayoutTests/svg/custom/use-property-synchronization-crash-expected.txt index 6788ca02..33db0f0 100644 --- a/third_party/WebKit/LayoutTests/svg/custom/use-property-synchronization-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/custom/use-property-synchronization-crash-expected.txt
@@ -1,5 +1,5 @@ -CONSOLE ERROR: line 5: Error: Invalid value for <polyline> attribute points="0" -CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="0" +CONSOLE ERROR: line 5: Error: <polyline> attribute points: Unexpected end of attribute. Expected number, "0". +CONSOLE ERROR: Error: <polyline> attribute points: Unexpected end of attribute. Expected number, "0". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/svg/dom/points-parser-expected.txt b/third_party/WebKit/LayoutTests/svg/dom/points-parser-expected.txt index 50752656..42d8269 100644 --- a/third_party/WebKit/LayoutTests/svg/dom/points-parser-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/dom/points-parser-expected.txt
@@ -1,14 +1,14 @@ -CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="a" -CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="10" -CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="10," -CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="10,," -CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="10,,10" -CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="10,10," -CONSOLE ERROR: Error: Invalid value for <polyline> attribute points="10,10a" -CONSOLE ERROR: Error: Invalid value for <polyline> attribute points=",10" -CONSOLE ERROR: Error: Invalid value for <polyline> attribute points=",10," -CONSOLE ERROR: Error: Invalid value for <polyline> attribute points=",10,," -CONSOLE ERROR: Error: Invalid value for <polyline> attribute points=",10,10" +CONSOLE ERROR: Error: <polyline> attribute points: Expected number, "a". +CONSOLE ERROR: Error: <polyline> attribute points: Unexpected end of attribute. Expected number, "10". +CONSOLE ERROR: Error: <polyline> attribute points: Unexpected end of attribute. Expected number, "10,". +CONSOLE ERROR: Error: <polyline> attribute points: Expected number, "10,,". +CONSOLE ERROR: Error: <polyline> attribute points: Expected number, "10,,10". +CONSOLE ERROR: Error: <polyline> attribute points: Unexpected end of attribute. Expected number, "10,10,". +CONSOLE ERROR: Error: <polyline> attribute points: Expected number, "10,10a". +CONSOLE ERROR: Error: <polyline> attribute points: Expected number, ",10". +CONSOLE ERROR: Error: <polyline> attribute points: Expected number, ",10,". +CONSOLE ERROR: Error: <polyline> attribute points: Expected number, ",10,,". +CONSOLE ERROR: Error: <polyline> attribute points: Expected number, ",10,10". This tests the parser for points attribute values. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/svg/dynamic-updates/SVG-dynamic-css-transform-expected.png b/third_party/WebKit/LayoutTests/svg/dynamic-updates/SVG-dynamic-css-transform-expected.png index 529b842..5200d4b 100644 --- a/third_party/WebKit/LayoutTests/svg/dynamic-updates/SVG-dynamic-css-transform-expected.png +++ b/third_party/WebKit/LayoutTests/svg/dynamic-updates/SVG-dynamic-css-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/svg/filters/subRegion-one-effect-expected.png b/third_party/WebKit/LayoutTests/svg/filters/subRegion-one-effect-expected.png index 50451baf..669281e0 100644 --- a/third_party/WebKit/LayoutTests/svg/filters/subRegion-one-effect-expected.png +++ b/third_party/WebKit/LayoutTests/svg/filters/subRegion-one-effect-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/svg/filters/subRegion-two-effects-expected.png b/third_party/WebKit/LayoutTests/svg/filters/subRegion-two-effects-expected.png index f2ffa5a..e3f5a62b 100644 --- a/third_party/WebKit/LayoutTests/svg/filters/subRegion-two-effects-expected.png +++ b/third_party/WebKit/LayoutTests/svg/filters/subRegion-two-effects-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/svg/hixie/error/001-expected.txt b/third_party/WebKit/LayoutTests/svg/hixie/error/001-expected.txt index b42e8eec..ddef405 100644 --- a/third_party/WebKit/LayoutTests/svg/hixie/error/001-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/hixie/error/001-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 3: Error: Invalid value for <circle> attribute r="r" +CONSOLE ERROR: line 3: Error: <circle> attribute r: Expected length, "r". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/svg/hixie/error/010-expected.txt b/third_party/WebKit/LayoutTests/svg/hixie/error/010-expected.txt index 691106e..f83d7e4 100644 --- a/third_party/WebKit/LayoutTests/svg/hixie/error/010-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/hixie/error/010-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 1: Error: Invalid value for <svg> attribute viewBox="0 0 1 1 1" +CONSOLE ERROR: line 1: Error: <svg> attribute viewBox: Trailing garbage, "0 0 1 1 1". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/svg/hixie/error/011-expected.txt b/third_party/WebKit/LayoutTests/svg/hixie/error/011-expected.txt index 79d93ef..8192494 100644 --- a/third_party/WebKit/LayoutTests/svg/hixie/error/011-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/hixie/error/011-expected.txt
@@ -1,4 +1,4 @@ -CONSOLE ERROR: line 1: Error: Invalid value for <svg> attribute viewBox="0 0,, 1 1" +CONSOLE ERROR: line 1: Error: <svg> attribute viewBox: Expected number, "0 0,, 1 1". layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/svg/parser/whitespace-length-invalid-1-expected.txt b/third_party/WebKit/LayoutTests/svg/parser/whitespace-length-invalid-1-expected.txt index 6f0500a..ff5517a 100644 --- a/third_party/WebKit/LayoutTests/svg/parser/whitespace-length-invalid-1-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/parser/whitespace-length-invalid-1-expected.txt
@@ -1,1503 +1,1503 @@ -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitycm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitymm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitycm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitymm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ein" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ecm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Emm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ept" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ein" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ecm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="emm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ept" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Emm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="emm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Emm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="emm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNcm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNmm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitycm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitymm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitycm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitymm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordcm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordmm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ein\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ecm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Emm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ept\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ein\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ecm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="emm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ept\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNcm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNmm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaNpc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="NaN%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinityin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitycm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitymm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinitypc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Infinity%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinityin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitycm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitymm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinitypc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-Infinity%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordcm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordmm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnordpc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="fnord%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Eex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ein\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ecm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Emm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Ept\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="Epc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="eex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ein\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ecm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="emm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="ept\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="epc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNcm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNmm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaNpc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" NaN%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinityin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitycm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitymm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinitypc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Infinity%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinityin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitycm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitymm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinitypc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -Infinity%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordcm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordmm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnordpc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" fnord%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Eex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ein\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ecm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Emm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Ept\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" Epc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" eex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ein\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ecm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" emm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ept\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" epc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitycm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitymm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitycm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitymm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ein" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ecm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Emm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ept" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ein" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ecm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t emm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ept" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Emm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t emm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Emm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t emm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNcm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNmm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitycm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitymm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitycm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitymm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordcm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordmm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ein\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ecm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Emm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ept\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ein\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ecm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t emm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ept\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNcm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNmm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaNpc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t NaN%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinityin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitycm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitymm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinitypc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Infinity%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinityin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitycm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitymm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinitypc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -Infinity%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordcm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordmm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnordpc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t fnord%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Eex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ein\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ecm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Emm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Ept\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t Epc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t eex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ein\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ecm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t emm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ept\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t epc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitycm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitymm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitycm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitymm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEin" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEcm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEmm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feem" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepx" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fein" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fecm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\femm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fept" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\femm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitycm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitymm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEin " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEcm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEmm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feem " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepx " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fein " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fecm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\femm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fept " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNcm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNmm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitycm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitymm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitycm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitymm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordcm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordmm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEin\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEcm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEmm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feem\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepx\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fein\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fecm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\femm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fept\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNcm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNmm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaNpc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fNaN%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinityin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitycm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitymm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinitypc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fInfinity%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinityin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitycm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitymm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinitypc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-Infinity%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordcm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordmm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnordpc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\ffnord%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEin\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEcm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEmm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fEpc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feem\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\feex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepx\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fein\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fecm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\femm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fept\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fepc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe%\f" +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaN". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaN%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinity". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinityem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinityex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitypx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinityin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitycm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitymm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitypt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitypc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinity%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinity". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinityem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinityex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitypx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinityin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitycm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitymm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitypt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitypc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinity%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnord". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnord%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Eem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Eex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Epx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Ein". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Ecm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Emm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Ept". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Epc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "eem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "eex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "epx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "ein". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "ecm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "emm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "ept". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "epc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaN ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaN% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnord ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnord% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Eem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Eex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Epx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Ein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Ecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Emm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Ept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Epc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "eem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "eex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "epx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "ein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "ecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "emm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "ept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "epc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaN ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaN% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnord ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnord% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Eem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Eex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Epx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Ein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Ecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Emm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Ept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Epc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "eem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "eex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "epx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "ein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "ecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "emm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "ept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "epc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaN\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNpx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNcm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNmm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNpt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNpc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaN%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinity\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinityem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinityex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitypx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinityin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitycm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitymm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitypt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitypc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinity%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinity\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinityem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinityex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitypx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinityin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitycm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitymm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitypt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitypc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinity%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnord\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordpx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordcm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordmm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordpt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordpc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnord%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Eem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Eex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Epx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Ein\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Ecm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Emm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Ept\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Epc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "eem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "eex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "epx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "ein\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "ecm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "emm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "ept\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "epc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaN\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNpx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNcm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNmm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNpt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaNpc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "NaN%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinity\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinityem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinityex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitypx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinityin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitycm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitymm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitypt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinitypc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Infinity%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinity\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinityem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinityex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitypx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinityin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitycm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitymm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitypt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinitypc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-Infinity%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnord\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordpx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordcm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordmm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordpt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnordpc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "fnord%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Eem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Eex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Epx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Ein\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Ecm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Emm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Ept\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "Epc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "eem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "eex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "epx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "ein\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "ecm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "emm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "ept\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "epc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitycm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitymm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitycm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitymm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ein". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ecm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Emm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ept". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ein". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ecm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " emm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ept". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Emm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " emm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Emm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " emm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNcm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNmm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitycm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitymm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitycm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitymm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordcm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordmm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ein\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ecm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Emm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ept\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ein\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ecm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " emm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ept\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNcm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNmm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitycm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitymm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitycm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitymm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordcm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordmm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ein\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ecm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Emm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ept\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ein\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ecm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " emm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ept\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitycm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitymm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitycm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitymm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ein". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ecm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Emm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ept". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ein". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ecm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " emm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ept". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Emm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " emm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityem …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityex …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypx …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityin …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitycm …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitymm …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypt …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypc …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Emm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " emm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNcm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNmm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityem\r\n\t…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityex\r\n\t…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypx\r\n\t…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityin\r\n\t…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitycm\r\n\t…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitymm\r\n\t…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypt\r\n\t…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypc\r\n\t…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityem\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityex\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypx\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityin\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitycm\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitymm\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypt\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypc\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity%\r\n\t…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordcm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordmm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ein\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ecm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Emm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ept\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ein\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ecm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " emm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ept\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNcm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNmm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaNpc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " NaN%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinityin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitycm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitymm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinitypc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Infinity%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinityin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitycm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitymm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinitypc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -Infinity%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordcm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordmm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnordpc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " fnord%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Eex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ein\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ecm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Emm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Ept\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " Epc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " eex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ein\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ecm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " emm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " ept\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " epc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaN". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaN%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinity". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinityem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinityex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitypx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinityin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitycm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitymm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitypt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitypc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinity%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinity". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinityem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinityex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitypx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinityin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitycm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitymm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitypt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitypc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinity%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnord". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnord%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Eem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Eex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Epx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Ein". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Ecm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Emm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Ept". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Epc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t eem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t eex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t epx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t ein". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t ecm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t emm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t ept". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t epc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaN ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaN% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnord ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnord% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Eem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Eex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Epx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Ein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Ecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Emm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Ept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Epc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t eem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t eex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t epx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t ein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t ecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t emm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t ept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t epc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaN ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaN% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinityem …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinityex …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitypx …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinityin …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitycm …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitymm …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitypt …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitypc …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinityem …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinityex …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitypx …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinityin …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitycm …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitymm …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitypt …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitypc …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinity% …". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnord ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnord% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Eem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Eex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Epx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Ein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Ecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Emm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Ept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Epc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t eem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t eex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t epx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t ein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t ecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t emm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t ept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t epc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaN\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNpx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNcm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNmm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNpt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNpc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaN%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinity\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinityem\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinityex\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitypx\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinityin\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitycm\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitymm\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitypt\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitypc\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinity%\r\n\t…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinity\r\n\t…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinityem\r…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinityex\r…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitypx\r…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinityin\r…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitycm\r…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitymm\r…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitypt\r…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitypc\r…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinity%\r\n…". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnord\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordpx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordcm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordmm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordpt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordpc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnord%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Eem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Eex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Epx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Ein\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Ecm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Emm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Ept\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Epc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t eem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t eex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t epx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t ein\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t ecm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t emm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t ept\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t epc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaN\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNpx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNcm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNmm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNpt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaNpc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t NaN%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinity\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinityem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinityex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitypx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinityin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitycm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitymm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitypt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinitypc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Infinity%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinity\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinityem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinityex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitypx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinityin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitycm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitymm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitypt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinitypc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -Infinity%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnord\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordpx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordcm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordmm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordpt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnordpc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t fnord%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Eem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Eex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Epx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Ein\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Ecm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Emm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Ept\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t Epc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t eem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t eex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t epx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t ein\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t ecm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t emm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t ept\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t epc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaN". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaN%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinity". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinityem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinityex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitypx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinityin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitycm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitymm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitypt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitypc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinity%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinity". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinityem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinityex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitypx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinityin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitycm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitymm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitypt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitypc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinity%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnord". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnord%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEpx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEin". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEcm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEmm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEpt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEpc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\feem". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\feex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fepx". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fein". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fecm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\femm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fept". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fepc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaN ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaN% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnord ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnord% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\feem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\feex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fepx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\femm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fepc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaN ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaN% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinity ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinityem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinityex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitypx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinityin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitycm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitymm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitypt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitypc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinity% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnord ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnord% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEpx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEin ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEcm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEmm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEpt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEpc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\feem ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\feex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fepx ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fein ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fecm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\femm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fept ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fepc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaN\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNpx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNcm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNmm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNpt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNpc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaN%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinity\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinityem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinityex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitypx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinityin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitycm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitymm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitypt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitypc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinity%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinity\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinityem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinityex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitypx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinityin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitycm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitymm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitypt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitypc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinity%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnord\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordpx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordcm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordmm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordpt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordpc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnord%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEpx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEin\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEcm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEmm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEpt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEpc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\feem\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\feex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fepx\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fein\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fecm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\femm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fept\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fepc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaN\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNpx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNcm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNmm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNpt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaNpc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fNaN%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinity\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinityem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinityex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitypx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinityin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitycm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitymm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitypt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinitypc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fInfinity%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinity\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinityem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinityex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitypx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinityin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitycm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitymm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitypt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinitypc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-Infinity%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnord\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordpx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordcm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordmm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordpt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnordpc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\ffnord%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEpx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEin\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEcm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEmm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEpt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fEpc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\feem\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\feex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fepx\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fein\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fecm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\femm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fept\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fepc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe%\f". This is a testharness.js-based test. PASS Test <length> invalid value: NaN PASS Test <length> invalid value: NaNem
diff --git a/third_party/WebKit/LayoutTests/svg/parser/whitespace-length-invalid-2-expected.txt b/third_party/WebKit/LayoutTests/svg/parser/whitespace-length-invalid-2-expected.txt index 04011ca..49e0fd6e 100644 --- a/third_party/WebKit/LayoutTests/svg/parser/whitespace-length-invalid-2-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/parser/whitespace-length-invalid-2-expected.txt
@@ -1,2503 +1,2503 @@ -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-." -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="." -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+." -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+ " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+ " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=". " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+ " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+ " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=". " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e+%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="E-%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="-.%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".-%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="+.%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=".E0%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="e1%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -." -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ." -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +." -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" - " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" + " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" . " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" - " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" + " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" . " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -." -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" ." -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +." -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" - " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" + " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" . " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" - " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" + " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" . " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e+%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" E-%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" -.%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .-%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" +.%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" .E0%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x=" e1%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -." -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t ." -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +." -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+ " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t - " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t + " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t . " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+ " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t - " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t + " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t . " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e+%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t E-%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t -.%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .-%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t +.%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t .E0%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\r\n\t e1%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-." -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f." -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+." -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1em" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1ex" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1px" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1in" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1cm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1mm" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pt" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pc" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1%" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+ " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+ " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+ " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+ " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.- " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+. " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1 " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1em " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1ex " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1px " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1in " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1cm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1mm " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pt " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pc " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1% " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1em\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1ex\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1px\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1in\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1cm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1mm\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pt\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pc\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1%\r\n\t " -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe+%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fE-%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f-.%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.-%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f+.%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\f.E0%\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1em\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1ex\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1px\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1in\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1cm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1mm\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pt\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1pc\f" -CONSOLE ERROR: Error: Invalid value for <svg> attribute x="\fe1%\f" +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+ ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+ ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ". ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+ ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+ ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ". ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e+%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "E-%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "-.%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".-%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "+.%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, ".E0%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "e1%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+ ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " - ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " + ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " . ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+ ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " - ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " + ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " . ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+ ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " - ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " + ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " . ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+ ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " - ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " + ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " . ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e+%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " E-%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " -.%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .-%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " +.%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " .E0%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, " e1%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+ ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t - ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t + ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t . ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+ ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t - ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t + ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t . ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e+%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t E-%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t -.%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .-%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t +.%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t .E0%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\r\n\t e1%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1em". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1ex". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1px". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1in". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1cm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1mm". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1pt". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1pc". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1%". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+ ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+ ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+ ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+ ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.- ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+. ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1 ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1em ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1ex ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1px ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1in ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1cm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1mm ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1pt ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1pc ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1% ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1em\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1ex\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1px\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1in\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1cm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1mm\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1pt\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1pc\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1%\r\n\t ". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe+%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fE-%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f-.%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.-%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f+.%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\f.E0%\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1em\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1ex\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1px\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1in\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1cm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1mm\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1pt\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1pc\f". +CONSOLE ERROR: Error: <svg> attribute x: Expected length, "\fe1%\f". This is a testharness.js-based test. PASS Test <length> invalid value: e+ PASS Test <length> invalid value: e+em
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt index 5be927d..d6b0c94 100644 --- a/third_party/WebKit/LayoutTests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -609,6 +609,7 @@ method clearTimeout method close method constructor + method createImageBitmap method fetch method importScripts method setInterval
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt index f1fd03e..ced7b78 100644 --- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -579,6 +579,7 @@ [Worker] method clearTimeout [Worker] method close [Worker] method constructor +[Worker] method createImageBitmap [Worker] method fetch [Worker] method importScripts [Worker] method setInterval
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt index fa960b1..7cb1098 100644 --- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -5851,6 +5851,7 @@ attribute location attribute locationbar attribute menubar + attribute mojo attribute name attribute navigator attribute offscreenBuffering @@ -5982,6 +5983,7 @@ method clearTimeout method close method confirm + method createImageBitmap method fetch method find method focus
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt index 47c87448..733f129 100644 --- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -571,6 +571,7 @@ [Worker] method clearTimeout [Worker] method close [Worker] method constructor +[Worker] method createImageBitmap [Worker] method fetch [Worker] method importScripts [Worker] method setInterval
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt index 6fd5f67..71090e8 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -6681,6 +6681,7 @@ attribute location attribute locationbar attribute menubar + attribute mojo attribute name attribute navigator attribute offscreenBuffering
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptState.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptState.cpp index eae715ec..1f80618 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptState.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptState.cpp
@@ -8,6 +8,7 @@ #include "core/dom/ExecutionContext.h" #include "core/frame/LocalDOMWindow.h" #include "core/frame/LocalFrame.h" +#include "core/inspector/v8/V8Debugger.h" namespace blink { @@ -127,6 +128,12 @@ return toLocalDOMWindow(toDOMWindow(context())); } +int ScriptState::contextIdInDebugger() +{ + v8::HandleScope scope(m_isolate); + return V8Debugger::contextId(m_context.newLocal(m_isolate)); +} + ScriptState* ScriptState::forMainWorld(LocalFrame* frame) { return ScriptState::forWorld(frame, DOMWrapperWorld::mainWorld());
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptState.h b/third_party/WebKit/Source/bindings/core/v8/ScriptState.h index 3d30288a..045b3009 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptState.h +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptState.h
@@ -89,6 +89,7 @@ LocalDOMWindow* domWindow() const; virtual ExecutionContext* executionContext() const; virtual void setExecutionContext(ExecutionContext*); + int contextIdInDebugger(); // This can return an empty handle if the v8::Context is gone. v8::Local<v8::Context> context() const { return m_context.newLocal(m_isolate); }
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8Binding.cpp b/third_party/WebKit/Source/bindings/core/v8/V8Binding.cpp index a44710a5..5186f39 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8Binding.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8Binding.cpp
@@ -59,7 +59,6 @@ #include "core/workers/WorkerGlobalScope.h" #include "core/xml/XPathNSResolver.h" #include "platform/EventTracer.h" -#include "platform/JSONValues.h" #include "wtf/MainThread.h" #include "wtf/MathExtras.h" #include "wtf/StdLibExtras.h" @@ -908,75 +907,6 @@ return frame->script().isolate(); } -JSONValuePtr NativeValueTraits<JSONValuePtr>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState, int maxDepth) -{ - return toJSONValue(isolate, value, maxDepth); -} - -JSONValuePtr toJSONValue(v8::Isolate* isolate, v8::Local<v8::Value> value, int maxDepth) -{ - if (value.IsEmpty()) { - ASSERT_NOT_REACHED(); - return nullptr; - } - - if (!maxDepth) - return nullptr; - maxDepth--; - - v8::Local<v8::Context> context = isolate->GetCurrentContext(); - if (value->IsNull() || value->IsUndefined()) - return JSONValue::null(); - if (value->IsBoolean()) - return JSONBasicValue::create(value.As<v8::Boolean>()->Value()); - if (value->IsNumber()) - return JSONBasicValue::create(value.As<v8::Number>()->Value()); - if (value->IsString()) - return JSONString::create(toCoreString(value.As<v8::String>())); - if (value->IsArray()) { - v8::Local<v8::Array> array = value.As<v8::Array>(); - RefPtr<JSONArray> inspectorArray = JSONArray::create(); - uint32_t length = array->Length(); - for (uint32_t i = 0; i < length; i++) { - v8::Local<v8::Value> value; - if (!array->Get(context, i).ToLocal(&value)) - return nullptr; - RefPtr<JSONValue> element = toJSONValue(isolate, value, maxDepth); - if (!element) - return nullptr; - inspectorArray->pushValue(element); - } - return inspectorArray; - } - if (value->IsObject()) { - RefPtr<JSONObject> jsonObject = JSONObject::create(); - v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value); - v8::Local<v8::Array> propertyNames; - if (!object->GetPropertyNames(context).ToLocal(&propertyNames)) - return nullptr; - uint32_t length = propertyNames->Length(); - for (uint32_t i = 0; i < length; i++) { - v8::Local<v8::Value> name; - if (!propertyNames->Get(context, i).ToLocal(&name)) - return nullptr; - // FIXME(yurys): v8::Object should support GetOwnPropertyNames - if (name->IsString() && !v8CallBoolean(object->HasRealNamedProperty(context, v8::Local<v8::String>::Cast(name)))) - continue; - v8::Local<v8::Value> property; - if (!object->Get(context, name).ToLocal(&property)) - return nullptr; - RefPtr<JSONValue> propertyValue = toJSONValue(isolate, property, maxDepth); - if (!propertyValue) - return nullptr; - TOSTRING_DEFAULT(V8StringResource<TreatNullAsNullString>, nameString, name, nullptr); - jsonObject->setValue(nameString, propertyValue); - } - return jsonObject; - } - ASSERT_NOT_REACHED(); - return nullptr; -} - void DevToolsFunctionInfo::ensureInitialized() const { if (m_function.IsEmpty())
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8Binding.h b/third_party/WebKit/Source/bindings/core/v8/V8Binding.h index 5e02ab9b..352d65b 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8Binding.h +++ b/third_party/WebKit/Source/bindings/core/v8/V8Binding.h
@@ -47,7 +47,6 @@ #include "bindings/core/v8/V8ThrowException.h" #include "bindings/core/v8/V8ValueCache.h" #include "core/CoreExport.h" -#include "platform/JSONValues.h" #include "platform/heap/Handle.h" #include "platform/text/CompressibleString.h" #include "wtf/text/AtomicString.h" @@ -951,14 +950,6 @@ } }; -using JSONValuePtr = PassRefPtr<JSONValue>; -template <> -struct NativeValueTraits<JSONValuePtr> { - CORE_EXPORT static JSONValuePtr nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&, int maxDepth = JSONValue::maxDepth); -}; - -JSONValuePtr toJSONValue(v8::Isolate*, v8::Local<v8::Value>, int maxDepth = JSONValue::maxDepth); - CORE_EXPORT v8::Isolate* toIsolate(ExecutionContext*); CORE_EXPORT v8::Isolate* toIsolate(LocalFrame*); @@ -1039,8 +1030,7 @@ DeleteUnknownProperty }; -class V8IsolateInterruptor : public BlinkGCInterruptor { - USING_FAST_MALLOC(V8IsolateInterruptor); +class V8IsolateInterruptor final : public BlinkGCInterruptor { public: explicit V8IsolateInterruptor(v8::Isolate* isolate) : m_isolate(isolate)
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.cpp b/third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.cpp index 14bf780..d343b39 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.cpp
@@ -86,6 +86,27 @@ case v8::Isolate::kRegExpPrototypeToString: blinkFeature = UseCounter::V8RegExpPrototypeToString; break; + case v8::Isolate::kRegExpPrototypeUnicodeGetter: + blinkFeature = UseCounter::V8RegExpPrototypeUnicodeGetter; + break; + case v8::Isolate::kIntlV8Parse: + blinkFeature = UseCounter::V8IntlV8Parse; + break; + case v8::Isolate::kIntlPattern: + blinkFeature = UseCounter::V8IntlPattern; + break; + case v8::Isolate::kIntlResolved: + blinkFeature = UseCounter::V8IntlResolved; + break; + case v8::Isolate::kPromiseChain: + blinkFeature = UseCounter::V8PromiseChain; + break; + case v8::Isolate::kPromiseAccept: + blinkFeature = UseCounter::V8PromiseAccept; + break; + case v8::Isolate::kPromiseDefer: + blinkFeature = UseCounter::V8PromiseDefer; + break; default: // This can happen if V8 has added counters that this version of Blink // does not know about. It's harmless.
diff --git a/third_party/WebKit/Source/core/animation/CompositorPendingAnimations.cpp b/third_party/WebKit/Source/core/animation/CompositorPendingAnimations.cpp index f2de763..3447ebf 100644 --- a/third_party/WebKit/Source/core/animation/CompositorPendingAnimations.cpp +++ b/third_party/WebKit/Source/core/animation/CompositorPendingAnimations.cpp
@@ -49,7 +49,7 @@ if (document->view()) document->view()->scheduleAnimation(); - bool visible = document->page() && document->page()->visibilityState() == PageVisibilityStateVisible; + bool visible = document->page() && document->page()->isPageVisible(); if (!visible && !m_timer.isActive()) { m_timer.startOneShot(0, BLINK_FROM_HERE); }
diff --git a/third_party/WebKit/Source/core/core.gypi b/third_party/WebKit/Source/core/core.gypi index cd89ae0..9e1c7d4 100644 --- a/third_party/WebKit/Source/core/core.gypi +++ b/third_party/WebKit/Source/core/core.gypi
@@ -1769,9 +1769,6 @@ 'inspector/InspectorResourceContentLoader.h', 'inspector/InspectorRuntimeAgent.cpp', 'inspector/InspectorRuntimeAgent.h', - 'inspector/InspectorState.cpp', - 'inspector/InspectorState.h', - 'inspector/InspectorStateClient.h', 'inspector/InspectorStyleSheet.cpp', 'inspector/InspectorStyleSheet.h', 'inspector/InspectorTaskRunner.cpp',
diff --git a/third_party/WebKit/Source/core/css/CSSPageRule.cpp b/third_party/WebKit/Source/core/css/CSSPageRule.cpp index e608db8..bee62d6 100644 --- a/third_party/WebKit/Source/core/css/CSSPageRule.cpp +++ b/third_party/WebKit/Source/core/css/CSSPageRule.cpp
@@ -70,7 +70,7 @@ void CSSPageRule::setSelectorText(const String& selectorText) { CSSParserContext context(parserContext(), 0); - CSSSelectorList selectorList = CSSParser::parseSelector(context, selectorText); + CSSSelectorList selectorList = CSSParser::parseSelector(context, parentStyleSheet() ? parentStyleSheet()->contents() : nullptr, selectorText); if (!selectorList.isValid()) return;
diff --git a/third_party/WebKit/Source/core/css/CSSSelectorList.cpp b/third_party/WebKit/Source/core/css/CSSSelectorList.cpp index 83626a2..361d99bc 100644 --- a/third_party/WebKit/Source/core/css/CSSSelectorList.cpp +++ b/third_party/WebKit/Source/core/css/CSSSelectorList.cpp
@@ -151,16 +151,6 @@ return false; } -bool CSSSelectorList::selectorsNeedNamespaceResolution() -{ - return forEachSelector([](const CSSSelector& selector) -> bool { - if (selector.match() != CSSSelector::Tag && !selector.isAttributeSelector()) - return false; - const AtomicString& prefix = selector.isAttributeSelector() ? selector.attribute().prefix() : selector.tagQName().prefix(); - return prefix != nullAtom && prefix != emptyAtom && prefix != starAtom; - }, this); -} - bool CSSSelectorList::selectorHasContentPseudo(size_t index) const { return forEachTagSelector([](const CSSSelector& selector) -> bool {
diff --git a/third_party/WebKit/Source/core/css/CSSSelectorList.h b/third_party/WebKit/Source/core/css/CSSSelectorList.h index 90a8f03..c0edf57f 100644 --- a/third_party/WebKit/Source/core/css/CSSSelectorList.h +++ b/third_party/WebKit/Source/core/css/CSSSelectorList.h
@@ -75,8 +75,6 @@ return next - m_selectorArray; } - bool selectorsNeedNamespaceResolution(); - bool selectorNeedsUpdatedDistribution(size_t index) const; bool selectorHasContentPseudo(size_t index) const;
diff --git a/third_party/WebKit/Source/core/css/CSSStyleRule.cpp b/third_party/WebKit/Source/core/css/CSSStyleRule.cpp index 1b9d4fb..cf2d06ae 100644 --- a/third_party/WebKit/Source/core/css/CSSStyleRule.cpp +++ b/third_party/WebKit/Source/core/css/CSSStyleRule.cpp
@@ -95,7 +95,7 @@ void CSSStyleRule::setSelectorText(const String& selectorText) { CSSParserContext context(parserContext(), 0); - CSSSelectorList selectorList = CSSParser::parseSelector(context, selectorText); + CSSSelectorList selectorList = CSSParser::parseSelector(context, parentStyleSheet() ? parentStyleSheet()->contents() : nullptr, selectorText); if (!selectorList.isValid()) return;
diff --git a/third_party/WebKit/Source/core/css/RuleFeatureSetTest.cpp b/third_party/WebKit/Source/core/css/RuleFeatureSetTest.cpp index 81d3267..95e7c0a 100644 --- a/third_party/WebKit/Source/core/css/RuleFeatureSetTest.cpp +++ b/third_party/WebKit/Source/core/css/RuleFeatureSetTest.cpp
@@ -37,7 +37,7 @@ void updateInvalidationSets(const String& selectorText) { - CSSSelectorList selectorList = CSSParser::parseSelector(strictCSSParserContext(), selectorText); + CSSSelectorList selectorList = CSSParser::parseSelector(strictCSSParserContext(), nullptr, selectorText); RefPtrWillBeRawPtr<StyleRule> styleRule = StyleRule::create(std::move(selectorList), MutableStylePropertySet::create(HTMLStandardMode)); RuleData ruleData(styleRule.get(), 0, 0, RuleHasNoSpecialState);
diff --git a/third_party/WebKit/Source/core/css/StyleSheetContents.cpp b/third_party/WebKit/Source/core/css/StyleSheetContents.cpp index a00f4b563..fc39002b 100644 --- a/third_party/WebKit/Source/core/css/StyleSheetContents.cpp +++ b/third_party/WebKit/Source/core/css/StyleSheetContents.cpp
@@ -313,14 +313,8 @@ result.storedValue->value = uri; } -const AtomicString& StyleSheetContents::determineNamespace(const AtomicString& prefix) +const AtomicString& StyleSheetContents::namespaceURIFromPrefix(const AtomicString& prefix) { - if (prefix.isNull()) - return defaultNamespace(); - if (prefix.isEmpty()) - return emptyAtom; // No namespace. If an element/attribute has a namespace, we won't match it. - if (prefix == starAtom) - return starAtom; // We'll match any namespace. return m_namespaces.get(prefix); }
diff --git a/third_party/WebKit/Source/core/css/StyleSheetContents.h b/third_party/WebKit/Source/core/css/StyleSheetContents.h index f34dd904..2f8f5b7 100644 --- a/third_party/WebKit/Source/core/css/StyleSheetContents.h +++ b/third_party/WebKit/Source/core/css/StyleSheetContents.h
@@ -66,7 +66,7 @@ const CSSParserContext& parserContext() const { return m_parserContext; } const AtomicString& defaultNamespace() { return m_defaultNamespace; } - const AtomicString& determineNamespace(const AtomicString& prefix); + const AtomicString& namespaceURIFromPrefix(const AtomicString& prefix); void parseAuthorStyleSheet(const CSSStyleSheetResource*, const SecurityOrigin*); void parseString(const String&);
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSParser.cpp index 97f94ae..85f65f9 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSParser.cpp +++ b/third_party/WebKit/Source/core/css/parser/CSSParser.cpp
@@ -31,10 +31,10 @@ CSSParserImpl::parseDeclarationListForInspector(declaration, context, observer); } -CSSSelectorList CSSParser::parseSelector(const CSSParserContext& context, const String& selector) +CSSSelectorList CSSParser::parseSelector(const CSSParserContext& context, StyleSheetContents* styleSheetContents, const String& selector) { CSSTokenizer::Scope scope(selector); - return CSSSelectorParser::parseSelector(scope.tokenRange(), context, nullptr); + return CSSSelectorParser::parseSelector(scope.tokenRange(), context, styleSheetContents); } PassRefPtrWillBeRawPtr<StyleRuleBase> CSSParser::parseRule(const CSSParserContext& context, StyleSheetContents* styleSheet, const String& rule)
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParser.h b/third_party/WebKit/Source/core/css/parser/CSSParser.h index 57c322b..b927202 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSParser.h +++ b/third_party/WebKit/Source/core/css/parser/CSSParser.h
@@ -30,7 +30,7 @@ // As well as regular rules, allows @import and @namespace but not @charset static PassRefPtrWillBeRawPtr<StyleRuleBase> parseRule(const CSSParserContext&, StyleSheetContents*, const String&); static void parseSheet(const CSSParserContext&, StyleSheetContents*, const String&); - static CSSSelectorList parseSelector(const CSSParserContext&, const String&); + static CSSSelectorList parseSelector(const CSSParserContext&, StyleSheetContents*, const String&); static bool parseDeclarationList(const CSSParserContext&, MutableStylePropertySet*, const String&); // Returns whether anything was changed. static bool parseValue(MutableStylePropertySet*, CSSPropertyID unresolvedProperty, const String&, bool important, StyleSheetContents*);
diff --git a/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp index 6d32983..4a90301 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp +++ b/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp
@@ -308,6 +308,8 @@ m_failedParsing = true; return nullptr; } + if (namespaceURI == defaultNamespace()) + namespacePrefix = nullAtom; return CSSParserSelector::create(QualifiedName(namespacePrefix, elementName, namespaceURI)); } prependTypeSelectorIfNeeded(namespacePrefix, elementName, compoundSelector.get()); @@ -703,9 +705,15 @@ const AtomicString& CSSSelectorParser::determineNamespace(const AtomicString& prefix) { - if (!m_styleSheet) + if (prefix.isNull()) return defaultNamespace(); - return m_styleSheet->determineNamespace(prefix); + if (prefix.isEmpty()) + return emptyAtom; // No namespace. If an element/attribute has a namespace, we won't match it. + if (prefix == starAtom) + return starAtom; // We'll match any namespace. + if (!m_styleSheet) + return nullAtom; // Cannot resolve prefix to namespace without a stylesheet, syntax error. + return m_styleSheet->namespaceURIFromPrefix(prefix); } void CSSSelectorParser::prependTypeSelectorIfNeeded(const AtomicString& namespacePrefix, const AtomicString& elementName, CSSParserSelector* compoundSelector) @@ -719,7 +727,10 @@ m_failedParsing = true; return; } - QualifiedName tag = QualifiedName(namespacePrefix, determinedElementName, namespaceURI); + AtomicString determinedPrefix = namespacePrefix; + if (namespaceURI == defaultNamespace()) + determinedPrefix = nullAtom; + QualifiedName tag = QualifiedName(determinedPrefix, determinedElementName, namespaceURI); // *:host/*:host-context never matches, so we can't discard the *, // otherwise we can't tell the difference between *:host and just :host. @@ -729,8 +740,9 @@ // ::cue, ::shadow), we need a universal selector to set the combinator // (relation) on in the cases where there are no simple selectors preceding // the pseudo element. - if (tag != anyQName() || compoundSelector->isHostPseudoSelector() || compoundSelector->needsImplicitShadowCombinatorForMatching()) - compoundSelector->prependTagSelector(tag, elementName.isNull()); + bool explicitForHost = compoundSelector->isHostPseudoSelector() && !elementName.isNull(); + if (tag != anyQName() || explicitForHost || compoundSelector->needsImplicitShadowCombinatorForMatching()) + compoundSelector->prependTagSelector(tag, determinedPrefix == nullAtom && determinedElementName == starAtom && !explicitForHost); } PassOwnPtr<CSSParserSelector> CSSSelectorParser::addSimpleSelectorToCompound(PassOwnPtr<CSSParserSelector> compoundSelector, PassOwnPtr<CSSParserSelector> simpleSelector)
diff --git a/third_party/WebKit/Source/core/css/parser/CSSSelectorParserTest.cpp b/third_party/WebKit/Source/core/css/parser/CSSSelectorParserTest.cpp index f09f9a7..7e4f1ff 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSSelectorParserTest.cpp +++ b/third_party/WebKit/Source/core/css/parser/CSSSelectorParserTest.cpp
@@ -271,4 +271,37 @@ } } +TEST(CSSSelectorParserTest, SerializedUniversal) +{ + const char* testCases[][2] = { + { "*::-webkit-volume-slider", "::-webkit-volume-slider" }, + { "*::cue(i)", "::cue(i)" }, + { "*::shadow", "::shadow" }, + { "*:host-context(.x)", "*:host-context(.x)" }, + { "*:host", "*:host" }, + { "|*::-webkit-volume-slider", "|*::-webkit-volume-slider" }, + { "|*::cue(i)", "|*::cue(i)" }, + { "|*::shadow", "|*::shadow" }, + { "*|*::-webkit-volume-slider", "::-webkit-volume-slider" }, + { "*|*::cue(i)", "::cue(i)" }, + { "*|*::shadow", "::shadow" }, + { "ns|*::-webkit-volume-slider", "ns|*::-webkit-volume-slider" }, + { "ns|*::cue(i)", "ns|*::cue(i)" }, + { "ns|*::shadow", "ns|*::shadow" } + }; + + CSSParserContext context(HTMLStandardMode, nullptr); + RefPtrWillBeRawPtr<StyleSheetContents> sheet = StyleSheetContents::create(context); + sheet->parserAddNamespace("ns", "http://ns.org"); + + for (auto testCase : testCases) { + SCOPED_TRACE(testCase[0]); + CSSTokenizer::Scope scope(testCase[0]); + CSSParserTokenRange range = scope.tokenRange(); + CSSSelectorList list = CSSSelectorParser::parseSelector(range, context, sheet.get()); + EXPECT_TRUE(list.isValid()); + EXPECT_STREQ(testCase[1], list.selectorsText().ascii().data()); + } +} + } // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/CSSSelectorWatch.cpp b/third_party/WebKit/Source/core/dom/CSSSelectorWatch.cpp index b837585..7b2034c 100644 --- a/third_party/WebKit/Source/core/dom/CSSSelectorWatch.cpp +++ b/third_party/WebKit/Source/core/dom/CSSSelectorWatch.cpp
@@ -148,7 +148,7 @@ const RefPtrWillBeRawPtr<StylePropertySet> callbackPropertySet = ImmutableStylePropertySet::create(nullptr, 0, UASheetMode); for (unsigned i = 0; i < selectors.size(); ++i) { - CSSSelectorList selectorList = CSSParser::parseSelector(CSSParserContext(UASheetMode, 0), selectors[i]); + CSSSelectorList selectorList = CSSParser::parseSelector(CSSParserContext(UASheetMode, 0), nullptr, selectors[i]); if (!selectorList.isValid()) continue;
diff --git a/third_party/WebKit/Source/core/dom/SelectorQuery.cpp b/third_party/WebKit/Source/core/dom/SelectorQuery.cpp index a35b8bf..91257de 100644 --- a/third_party/WebKit/Source/core/dom/SelectorQuery.cpp +++ b/third_party/WebKit/Source/core/dom/SelectorQuery.cpp
@@ -547,19 +547,13 @@ if (it != m_entries.end()) return it->value.get(); - CSSSelectorList selectorList = CSSParser::parseSelector(CSSParserContext(document, nullptr), selectors); + CSSSelectorList selectorList = CSSParser::parseSelector(CSSParserContext(document, nullptr), nullptr, selectors); if (!selectorList.first()) { exceptionState.throwDOMException(SyntaxError, "'" + selectors + "' is not a valid selector."); return nullptr; } - // throw a NamespaceError if the selector includes any namespace prefixes. - if (selectorList.selectorsNeedNamespaceResolution()) { - exceptionState.throwDOMException(NamespaceError, "'" + selectors + "' contains namespaces, which are not supported."); - return nullptr; - } - const unsigned maximumSelectorQueryCacheSize = 256; if (m_entries.size() == maximumSelectorQueryCacheSize) m_entries.remove(m_entries.begin());
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.cpp b/third_party/WebKit/Source/core/editing/FrameSelection.cpp index 9e4a90a..33f6b80 100644 --- a/third_party/WebKit/Source/core/editing/FrameSelection.cpp +++ b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
@@ -331,7 +331,8 @@ if (!(options & DoNotUpdateAppearance)) { // Hits in compositing/overflow/do-not-paint-outline-into-composited-scrolling-contents.html DisableCompositingQueryAsserts disabler; - updateAppearance(ResetCaretBlink); + stopCaretBlinkTimer(); + updateAppearance(); } // Always clear the x position used for vertical arrow navigation. @@ -980,7 +981,7 @@ return m_pendingSelection->commit(layoutView); } -void FrameSelection::updateAppearance(ResetCaretBlinkOption option) +void FrameSelection::updateAppearance() { // Paint a block cursor instead of a caret in overtype mode unless the caret is at the end of a line (in this case // the FrameSelection will paint a blinking caret as usual). @@ -990,12 +991,8 @@ // If the caret moved, stop the blink timer so we can restart with a // black caret in the new location. - if (option == ResetCaretBlink || !shouldBlink || shouldStopBlinkingDueToTypingCommand(m_frame)) { - m_caretBlinkTimer.stop(); - - m_shouldPaintCaret = false; - setCaretRectNeedsUpdate(); - } + if (!shouldBlink || shouldStopBlinkingDueToTypingCommand(m_frame)) + stopCaretBlinkTimer(); // Start blinking with a black caret. Be sure not to restart if we're // already blinking in the right location. @@ -1052,6 +1049,13 @@ setCaretRectNeedsUpdate(); } +void FrameSelection::stopCaretBlinkTimer() +{ + m_caretBlinkTimer.stop(); + m_shouldPaintCaret = false; + setCaretRectNeedsUpdate(); +} + void FrameSelection::notifyLayoutObjectOfSelectionChange(EUserTriggered userTriggered) { if (HTMLTextFormControlElement* textControl = enclosingTextFormControl(start()))
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.h b/third_party/WebKit/Source/core/editing/FrameSelection.h index 12e06d1..e53345c 100644 --- a/third_party/WebKit/Source/core/editing/FrameSelection.h +++ b/third_party/WebKit/Source/core/editing/FrameSelection.h
@@ -91,11 +91,6 @@ return static_cast<EUserTriggered>(options & UserTriggered); } - enum ResetCaretBlinkOption { - None, - ResetCaretBlink - }; - LocalFrame* frame() const { return m_frame; } Element* rootEditableElement() const { return selection().rootEditableElement(); } Element* rootEditableElementOrDocumentElement() const; @@ -186,7 +181,7 @@ bool isAppearanceDirty() const; void commitAppearanceIfNeeded(LayoutView&); - void updateAppearance(ResetCaretBlinkOption = None); + void updateAppearance(); void setCaretVisible(bool caretIsVisible) { setCaretVisibility(caretIsVisible ? Visible : Hidden); } bool isCaretBoundsDirty() const { return m_caretRectDirty; } void setCaretRectNeedsUpdate(); @@ -281,6 +276,7 @@ void focusedOrActiveStateChanged(); void caretBlinkTimerFired(Timer<FrameSelection>*); + void stopCaretBlinkTimer(); void setUseSecureKeyboardEntry(bool);
diff --git a/third_party/WebKit/Source/core/editing/VisibleSelection.h b/third_party/WebKit/Source/core/editing/VisibleSelection.h index 2a67827..eb95e76 100644 --- a/third_party/WebKit/Source/core/editing/VisibleSelection.h +++ b/third_party/WebKit/Source/core/editing/VisibleSelection.h
@@ -40,8 +40,7 @@ class LayoutPoint; -// TODO(yosin) We should use capitalized name instead of |SEL_DEFAULT_AFFINITY|. -const TextAffinity SEL_DEFAULT_AFFINITY = TextAffinity::Downstream; // NOLINT +const TextAffinity SelDefaultAffinity = TextAffinity::Downstream; enum SelectionDirection { DirectionForward, DirectionBackward, DirectionRight, DirectionLeft }; // Listener of |VisibleSelection| modification. |didChangeVisibleSelection()| @@ -66,8 +65,8 @@ public: VisibleSelectionTemplate(); VisibleSelectionTemplate(const PositionTemplate<Strategy>&, TextAffinity, bool isDirectional = false); - VisibleSelectionTemplate(const PositionTemplate<Strategy>& base, const PositionTemplate<Strategy>& extent, TextAffinity = SEL_DEFAULT_AFFINITY, bool isDirectional = false); - explicit VisibleSelectionTemplate(const EphemeralRangeTemplate<Strategy>&, TextAffinity = SEL_DEFAULT_AFFINITY, bool isDirectional = false); + VisibleSelectionTemplate(const PositionTemplate<Strategy>& base, const PositionTemplate<Strategy>& extent, TextAffinity = SelDefaultAffinity, bool isDirectional = false); + explicit VisibleSelectionTemplate(const EphemeralRangeTemplate<Strategy>&, TextAffinity = SelDefaultAffinity, bool isDirectional = false); explicit VisibleSelectionTemplate(const VisiblePositionTemplate<Strategy>&, bool isDirectional = false); VisibleSelectionTemplate(const VisiblePositionTemplate<Strategy>&, const VisiblePositionTemplate<Strategy>&, bool isDirectional = false);
diff --git a/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp b/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp index 9c7903f..77f0f49de 100644 --- a/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp +++ b/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp
@@ -1384,9 +1384,9 @@ m_endOfInsertedRange = end; if (m_selectReplacement) - setEndingSelection(VisibleSelection(start, end, SEL_DEFAULT_AFFINITY, endingSelection().isDirectional())); + setEndingSelection(VisibleSelection(start, end, SelDefaultAffinity, endingSelection().isDirectional())); else - setEndingSelection(VisibleSelection(end, SEL_DEFAULT_AFFINITY, endingSelection().isDirectional())); + setEndingSelection(VisibleSelection(end, SelDefaultAffinity, endingSelection().isDirectional())); } void ReplaceSelectionCommand::mergeTextNodesAroundPosition(Position& position, Position& positionOnlyToBeUpdated)
diff --git a/third_party/WebKit/Source/core/fetch/WebCacheMemoryDumpProvider.h b/third_party/WebKit/Source/core/fetch/WebCacheMemoryDumpProvider.h index ba0994f..d195572 100644 --- a/third_party/WebKit/Source/core/fetch/WebCacheMemoryDumpProvider.h +++ b/third_party/WebKit/Source/core/fetch/WebCacheMemoryDumpProvider.h
@@ -9,6 +9,7 @@ #include "platform/heap/Handle.h" #include "public/platform/WebCommon.h" #include "public/platform/WebMemoryDumpProvider.h" +#include "wtf/Allocator.h" #include "wtf/MainThread.h" namespace blink { @@ -16,6 +17,7 @@ // This class is wrapper around MemoryCache to take memory snapshots. It dumps // the stats of cache only after the cache is created. class CORE_EXPORT WebCacheMemoryDumpProvider final : public WebMemoryDumpProvider { + USING_FAST_MALLOC(WebCacheMemoryDumpProvider); public: // This class is singleton since there is a global MemoryCache object. static WebCacheMemoryDumpProvider* instance();
diff --git a/third_party/WebKit/Source/core/frame/DeviceSingleWindowEventController.cpp b/third_party/WebKit/Source/core/frame/DeviceSingleWindowEventController.cpp index 0a76a58..b9686e94 100644 --- a/third_party/WebKit/Source/core/frame/DeviceSingleWindowEventController.cpp +++ b/third_party/WebKit/Source/core/frame/DeviceSingleWindowEventController.cpp
@@ -49,7 +49,7 @@ if (eventType != eventTypeName()) return; - if (page() && page()->visibilityState() == PageVisibilityStateVisible) + if (page() && page()->isPageVisible()) startUpdating(); m_hasEventListener = true;
diff --git a/third_party/WebKit/Source/core/frame/FrameView.h b/third_party/WebKit/Source/core/frame/FrameView.h index 296d9b2..4724c13b 100644 --- a/third_party/WebKit/Source/core/frame/FrameView.h +++ b/third_party/WebKit/Source/core/frame/FrameView.h
@@ -571,13 +571,13 @@ // Paint properties for SPv2 Only. void setPreTranslation(PassRefPtr<TransformPaintPropertyNode> preTranslation) { m_preTranslation = preTranslation; } - const TransformPaintPropertyNode* preTranslation() const { return m_preTranslation.get(); } + TransformPaintPropertyNode* preTranslation() const { return m_preTranslation.get(); } void setScrollTranslation(PassRefPtr<TransformPaintPropertyNode> scrollTranslation) { m_scrollTranslation = scrollTranslation; } - const TransformPaintPropertyNode* scrollTranslation() const { return m_scrollTranslation.get(); } + TransformPaintPropertyNode* scrollTranslation() const { return m_scrollTranslation.get(); } void setContentClip(PassRefPtr<ClipPaintPropertyNode> contentClip) { m_contentClip = contentClip; } - const ClipPaintPropertyNode* contentClip() const { return m_contentClip.get(); } + ClipPaintPropertyNode* contentClip() const { return m_contentClip.get(); } // TODO(ojan): Merge this with IntersectionObserver once it lands. IntRect computeVisibleArea(); @@ -888,11 +888,11 @@ // The hierarchy of transform subtree created by a FrameView. // [ preTranslation ] The offset from Widget::frameRect. Establishes viewport. // +---[ scrollTranslation ] Frame scrolling. - // TODO(trchen): This is going away in favor of Settings::rootLayerScrolls. + // TODO(trchen): These will not be needed once settings->rootLayerScrolls() is enabled. RefPtr<TransformPaintPropertyNode> m_preTranslation; RefPtr<TransformPaintPropertyNode> m_scrollTranslation; // The content clip clips the document (= LayoutView) but not the scrollbars. - // TODO(trchen): Going away in favor of Settings::rootLayerScrolls too. + // TODO(trchen): This will not be needed once settings->rootLayerScrolls() is enabled. RefPtr<ClipPaintPropertyNode> m_contentClip; bool m_isUpdatingAllLifecyclePhases;
diff --git a/third_party/WebKit/Source/core/frame/PlatformEventController.cpp b/third_party/WebKit/Source/core/frame/PlatformEventController.cpp index acc073c..83c78bd 100644 --- a/third_party/WebKit/Source/core/frame/PlatformEventController.cpp +++ b/third_party/WebKit/Source/core/frame/PlatformEventController.cpp
@@ -60,7 +60,7 @@ if (!m_hasEventListener) return; - if (page()->visibilityState() == PageVisibilityStateVisible) + if (page()->isPageVisible()) startUpdating(); else stopUpdating();
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.h b/third_party/WebKit/Source/core/frame/UseCounter.h index 1462e201..44d36637 100644 --- a/third_party/WebKit/Source/core/frame/UseCounter.h +++ b/third_party/WebKit/Source/core/frame/UseCounter.h
@@ -987,6 +987,13 @@ ContentEditableTrue = 1130, ContentEditableTrueOnHTML = 1131, ContentEditablePlainTextOnly = 1132, + V8RegExpPrototypeUnicodeGetter = 1133, + V8IntlV8Parse = 1134, + V8IntlPattern = 1135, + V8IntlResolved = 1136, + V8PromiseChain = 1137, + V8PromiseAccept = 1138, + V8PromiseDefer = 1139, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp b/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp index f9b8b64..4a0915f 100644 --- a/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp +++ b/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp
@@ -34,6 +34,11 @@ return "sha256-" + base64Encode(reinterpret_cast<char*>(digest.data()), digest.size(), Base64DoNotInsertLFs); } +template<typename CharType> inline bool isASCIIAlphanumericOrHyphen(CharType c) +{ + return isASCIIAlphanumeric(c) || c == '-'; +} + } // namespace CSPDirectiveList::CSPDirectiveList(ContentSecurityPolicy* policy, ContentSecurityPolicyHeaderType type, ContentSecurityPolicyHeaderSource source) @@ -719,7 +724,7 @@ const UChar* begin = position; - skipWhile<UChar, isASCIIAlphanumeric>(position, end); + skipWhile<UChar, isASCIIAlphanumericOrHyphen>(position, end); if (position != end && !isASCIISpace(*position)) { m_policy->reportInvalidSuboriginFlags("Invalid character \'" + String(position, 1) + "\' in suborigin."); return String();
diff --git a/third_party/WebKit/Source/core/html/HTMLAreaElement.cpp b/third_party/WebKit/Source/core/html/HTMLAreaElement.cpp index d1e42750..1c096e2a 100644 --- a/third_party/WebKit/Source/core/html/HTMLAreaElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLAreaElement.cpp
@@ -67,13 +67,13 @@ void HTMLAreaElement::parseAttribute(const QualifiedName& name, const AtomicString& oldValue, const AtomicString& value) { if (name == shapeAttr) { - if (equalIgnoringCase(value, "default")) + if (equalIgnoringASCIICase(value, "default")) m_shape = Default; - else if (equalIgnoringCase(value, "circle")) + else if (equalIgnoringASCIICase(value, "circle")) m_shape = Circle; - else if (equalIgnoringCase(value, "poly")) + else if (equalIgnoringASCIICase(value, "poly")) m_shape = Poly; - else if (equalIgnoringCase(value, "rect")) + else if (equalIgnoringASCIICase(value, "rect")) m_shape = Rect; invalidateCachedRegion(); } else if (name == coordsAttr) { @@ -156,6 +156,7 @@ for (int i = 1; i < numPoints; ++i) path.addLineTo(FloatPoint(clampCoordinate(m_coords[i * 2]), clampCoordinate(m_coords[i * 2 + 1]))); path.closeSubpath(); + path.setWindRule(RULE_EVENODD); } break; case Circle:
diff --git a/third_party/WebKit/Source/core/html/HTMLContentElement.cpp b/third_party/WebKit/Source/core/html/HTMLContentElement.cpp index 4708e487..b226357 100644 --- a/third_party/WebKit/Source/core/html/HTMLContentElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLContentElement.cpp
@@ -65,7 +65,7 @@ { ASSERT(m_shouldParseSelect); - m_selectorList = CSSParser::parseSelector(CSSParserContext(document(), 0), m_select); + m_selectorList = CSSParser::parseSelector(CSSParserContext(document(), 0), nullptr, m_select); m_shouldParseSelect = false; m_isValidSelector = validateSelect(); if (!m_isValidSelector)
diff --git a/third_party/WebKit/Source/core/html/forms/RadioButtonGroupScope.cpp b/third_party/WebKit/Source/core/html/forms/RadioButtonGroupScope.cpp index fedc9df..a09c670 100644 --- a/third_party/WebKit/Source/core/html/forms/RadioButtonGroupScope.cpp +++ b/third_party/WebKit/Source/core/html/forms/RadioButtonGroupScope.cpp
@@ -22,7 +22,7 @@ #include "core/InputTypeNames.h" #include "core/html/HTMLInputElement.h" -#include "wtf/HashSet.h" +#include "wtf/HashMap.h" namespace blink { @@ -47,7 +47,18 @@ bool isValid() const; void setCheckedButton(HTMLInputElement*); - WillBeHeapHashSet<RawPtrWillBeMember<HTMLInputElement>> m_members; + // The map records the 'required' state of each (button) element. + using Members = WillBeHeapHashMap<RawPtrWillBeMember<HTMLInputElement>, bool>; + +#if ENABLE(OILPAN) + using MemberKeyValue = WTF::KeyValuePair<Member<HTMLInputElement>, bool>; +#else + using MemberKeyValue = WTF::KeyValuePair<HTMLInputElement*, bool>; +#endif + + void updateRequiredButton(MemberKeyValue&, bool isRequired); + + Members m_members; RawPtrWillBeMember<HTMLInputElement> m_checkedButton; size_t m_requiredCount; }; @@ -78,14 +89,28 @@ oldCheckedButton->setChecked(false); } +void RadioButtonGroup::updateRequiredButton(MemberKeyValue& it, bool isRequired) +{ + if (it.value == isRequired) + return; + + it.value = isRequired; + if (isRequired) { + m_requiredCount++; + } else { + ASSERT(m_requiredCount); + m_requiredCount--; + } +} + void RadioButtonGroup::add(HTMLInputElement* button) { ASSERT(button->type() == InputTypeNames::radio); - if (!m_members.add(button).isNewEntry) + auto addResult = m_members.add(button, false); + if (!addResult.isNewEntry) return; bool groupWasValid = isValid(); - if (button->isRequired()) - ++m_requiredCount; + updateRequiredButton(*addResult.storedValue, button->isRequired()); if (button->checked()) setCheckedButton(button); @@ -112,7 +137,8 @@ } if (wasValid != isValid()) setNeedsValidityCheckForAllButtons(); - for (HTMLInputElement* const inputElement : m_members) { + for (auto& member : m_members) { + HTMLInputElement* const inputElement = member.key; inputElement->pseudoStateChanged(CSSSelector::PseudoIndeterminate); } } @@ -120,14 +146,12 @@ void RadioButtonGroup::requiredAttributeChanged(HTMLInputElement* button) { ASSERT(button->type() == InputTypeNames::radio); - ASSERT(m_members.contains(button)); + auto it = m_members.find(button); + ASSERT(it != m_members.end()); bool wasValid = isValid(); - if (button->isRequired()) { - ++m_requiredCount; - } else { - ASSERT(m_requiredCount); - --m_requiredCount; - } + // Synchronize the 'required' flag for the button, along with + // updating the overall count. + updateRequiredButton(*it, button->isRequired()); if (wasValid != isValid()) setNeedsValidityCheckForAllButtons(); } @@ -135,15 +159,13 @@ void RadioButtonGroup::remove(HTMLInputElement* button) { ASSERT(button->type() == InputTypeNames::radio); - WillBeHeapHashSet<RawPtrWillBeMember<HTMLInputElement>>::iterator it = m_members.find(button); + auto it = m_members.find(button); if (it == m_members.end()) return; bool wasValid = isValid(); + ASSERT(it->value == button->isRequired()); + updateRequiredButton(*it, false); m_members.remove(it); - if (button->isRequired()) { - ASSERT(m_requiredCount); - --m_requiredCount; - } if (m_checkedButton == button) m_checkedButton = nullptr; @@ -162,7 +184,8 @@ void RadioButtonGroup::setNeedsValidityCheckForAllButtons() { - for (HTMLInputElement* const button : m_members) { + for (auto& element : m_members) { + HTMLInputElement* const button = element.key; ASSERT(button->type() == InputTypeNames::radio); button->setNeedsValidityCheck(); }
diff --git a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.idl b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.idl index 703fc5a..02b3425 100644 --- a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.idl +++ b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.idl
@@ -41,7 +41,6 @@ LegacyTreatAsPartialInterface, NoInterfaceObject, // Always used on target of 'implements' Exposed=(Window,Worker), - RuntimeEnabled=ExperimentalCanvasFeatures, ] interface ImageBitmapFactories { [CallWith=ScriptState, RaisesException] Promise createImageBitmap(ImageBitmapSource imageBitmap); [CallWith=ScriptState, RaisesException, RuntimeEnabled=ExperimentalCanvasFeatures] Promise createImageBitmap(
diff --git a/third_party/WebKit/Source/core/inspector/DevToolsHost.cpp b/third_party/WebKit/Source/core/inspector/DevToolsHost.cpp index 5a295331..94db56df 100644 --- a/third_party/WebKit/Source/core/inspector/DevToolsHost.cpp +++ b/third_party/WebKit/Source/core/inspector/DevToolsHost.cpp
@@ -29,8 +29,8 @@ #include "core/inspector/DevToolsHost.h" -#include "bindings/core/v8/ScriptFunctionCall.h" #include "bindings/core/v8/ScriptState.h" +#include "bindings/core/v8/V8ScriptRunner.h" #include "core/clipboard/Pasteboard.h" #include "core/dom/ExecutionContext.h" #include "core/events/Event.h" @@ -49,7 +49,6 @@ #include "platform/ContextMenu.h" #include "platform/ContextMenuItem.h" #include "platform/HostWindow.h" -#include "platform/ScriptForbiddenScope.h" #include "platform/SharedBuffer.h" #include "platform/UserGestureIndicator.h" #include "platform/network/ResourceError.h" @@ -60,9 +59,9 @@ class FrontendMenuProvider final : public ContextMenuProvider { public: - static PassRefPtrWillBeRawPtr<FrontendMenuProvider> create(DevToolsHost* devtoolsHost, ScriptValue devtoolsApiObject, const Vector<ContextMenuItem>& items) + static PassRefPtrWillBeRawPtr<FrontendMenuProvider> create(DevToolsHost* devtoolsHost, const Vector<ContextMenuItem>& items) { - return adoptRefWillBeNoop(new FrontendMenuProvider(devtoolsHost, devtoolsApiObject, items)); + return adoptRefWillBeNoop(new FrontendMenuProvider(devtoolsHost, items)); } ~FrontendMenuProvider() override @@ -79,17 +78,13 @@ void disconnect() { - m_devtoolsApiObject = ScriptValue(); m_devtoolsHost = nullptr; } void contextMenuCleared() override { if (m_devtoolsHost) { - if (!ScriptForbiddenScope::isScriptForbidden()) { - ScriptFunctionCall function(m_devtoolsApiObject, "contextMenuCleared"); - function.call(); - } + m_devtoolsHost->evaluateScript("DevToolsAPI.contextMenuCleared()"); m_devtoolsHost->clearMenuProvider(); m_devtoolsHost = nullptr; } @@ -106,28 +101,18 @@ { if (!m_devtoolsHost) return; - - UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture); int itemNumber = item->action() - ContextMenuItemBaseCustomTag; - - if (!ScriptForbiddenScope::isScriptForbidden()) { - ScriptFunctionCall function(m_devtoolsApiObject, "contextMenuItemSelected"); - function.appendArgument(itemNumber); - function.call(); - } + m_devtoolsHost->evaluateScript("DevToolsAPI.contextMenuItemSelected(" + String::number(itemNumber) + ")"); } private: - FrontendMenuProvider(DevToolsHost* devtoolsHost, ScriptValue devtoolsApiObject, const Vector<ContextMenuItem>& items) + FrontendMenuProvider(DevToolsHost* devtoolsHost, const Vector<ContextMenuItem>& items) : m_devtoolsHost(devtoolsHost) - , m_devtoolsApiObject(devtoolsApiObject) , m_items(items) { } RawPtrWillBeMember<DevToolsHost> m_devtoolsHost; - ScriptValue m_devtoolsApiObject; - Vector<ContextMenuItem> m_items; }; @@ -149,6 +134,19 @@ visitor->trace(m_menuProvider); } +void DevToolsHost::evaluateScript(const String& expression) +{ + if (!m_frontendFrame) + return; + ScriptState* scriptState = ScriptState::forMainWorld(m_frontendFrame); + if (!scriptState) + return; + ScriptState::Scope scope(scriptState); + UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture); + v8::Local<v8::String> source = v8AtomicString(scriptState->isolate(), expression.utf8().data()); + V8ScriptRunner::compileAndRunInternalScript(source, scriptState->isolate(), String(), TextPosition()); +} + void DevToolsHost::disconnectClient() { m_client = 0; @@ -218,13 +216,7 @@ void DevToolsHost::showContextMenu(LocalFrame* targetFrame, float x, float y, const Vector<ContextMenuItem>& items) { ASSERT(m_frontendFrame); - ScriptState* frontendScriptState = ScriptState::forMainWorld(m_frontendFrame); - if (!frontendScriptState) - return; - ScriptValue devtoolsApiObject = frontendScriptState->getFromGlobalObject("DevToolsAPI"); - ASSERT(devtoolsApiObject.isObject()); - - RefPtrWillBeRawPtr<FrontendMenuProvider> menuProvider = FrontendMenuProvider::create(this, devtoolsApiObject, items); + RefPtrWillBeRawPtr<FrontendMenuProvider> menuProvider = FrontendMenuProvider::create(this, items); m_menuProvider = menuProvider.get(); float zoom = targetFrame->pageZoomFactor(); if (m_client)
diff --git a/third_party/WebKit/Source/core/inspector/DevToolsHost.h b/third_party/WebKit/Source/core/inspector/DevToolsHost.h index 01d1670..fe18693d 100644 --- a/third_party/WebKit/Source/core/inspector/DevToolsHost.h +++ b/third_party/WebKit/Source/core/inspector/DevToolsHost.h
@@ -77,7 +77,10 @@ void clearMenuProvider() { m_menuProvider = nullptr; } private: + friend class FrontendMenuProvider; + DevToolsHost(InspectorFrontendClient*, LocalFrame* frontendFrame); + void evaluateScript(const String&); InspectorFrontendClient* m_client; RawPtrWillBeMember<LocalFrame> m_frontendFrame;
diff --git a/third_party/WebKit/Source/core/inspector/InjectedScript.cpp b/third_party/WebKit/Source/core/inspector/InjectedScript.cpp index b88db7d3..a8b7b8b 100644 --- a/third_party/WebKit/Source/core/inspector/InjectedScript.cpp +++ b/third_party/WebKit/Source/core/inspector/InjectedScript.cpp
@@ -37,6 +37,7 @@ #include "core/inspector/JSONParser.h" #include "core/inspector/RemoteObjectId.h" #include "platform/JSONValues.h" +#include "platform/JSONValuesForV8.h" #include "wtf/text/WTFString.h" using blink::TypeBuilder::Array; @@ -55,8 +56,7 @@ ScriptState* scriptState = value.scriptState(); ASSERT(scriptState->contextIsValid()); ScriptState::Scope scope(scriptState); - NonThrowableExceptionState exceptionState; - return ScriptValue::to<JSONValuePtr>(scriptState->isolate(), value, exceptionState); + return toJSONValue(scriptState->isolate(), value.v8Value()); } static PassRefPtr<TypeBuilder::Debugger::ExceptionDetails> toExceptionDetails(PassRefPtr<JSONObject> object) @@ -334,7 +334,6 @@ PassRefPtr<Array<CallFrame>> InjectedScript::wrapCallFrames(v8::Local<v8::Object> callFrames, int asyncOrdinal) { - ASSERT(!isEmpty()); ScriptFunctionCall function(injectedScriptObject(), "wrapCallFrames"); function.appendArgument(callFrames); function.appendArgument(asyncOrdinal); @@ -349,7 +348,6 @@ PassRefPtr<TypeBuilder::Runtime::RemoteObject> InjectedScript::wrapObject(const ScriptValue& value, const String& groupName, bool generatePreview) const { - ASSERT(!isEmpty()); ScriptFunctionCall wrapFunction(injectedScriptObject(), "wrapObject"); wrapFunction.appendArgument(value); wrapFunction.appendArgument(groupName); @@ -365,7 +363,6 @@ PassRefPtr<TypeBuilder::Runtime::RemoteObject> InjectedScript::wrapTable(const ScriptValue& table, const ScriptValue& columns) const { - ASSERT(!isEmpty()); ScriptFunctionCall wrapFunction(injectedScriptObject(), "wrapTable"); wrapFunction.appendArgument(canAccessInspectedWindow()); wrapFunction.appendArgument(table); @@ -383,7 +380,6 @@ v8::Local<v8::Value> InjectedScript::findObject(const RemoteObjectId& objectId) const { - ASSERT(!isEmpty()); return m_native->objectForId(objectId.id()); } @@ -403,7 +399,6 @@ void InjectedScript::releaseObjectGroup(const String& objectGroup) { - ASSERT(!isEmpty()); m_native->releaseObjectGroup(objectGroup); if (objectGroup == "console") { ScriptFunctionCall releaseFunction(injectedScriptObject(), "clearLastEvaluationResult"); @@ -415,7 +410,6 @@ void InjectedScript::setCustomObjectFormatterEnabled(bool enabled) { - ASSERT(!isEmpty()); ScriptFunctionCall function(injectedScriptObject(), "setCustomObjectFormatterEnabled"); function.appendArgument(enabled); RefPtr<JSONValue> result; @@ -430,7 +424,6 @@ bool InjectedScript::canAccessInspectedWindow() const { - ASSERT(!isEmpty()); return m_inspectedStateAccessCheck(m_injectedScriptObject.scriptState()); } @@ -441,8 +434,6 @@ ScriptValue InjectedScript::callFunctionWithEvalEnabled(ScriptFunctionCall& function, bool& hadException) const { - ASSERT(!isEmpty()); - ScriptState* scriptState = m_injectedScriptObject.scriptState(); ScriptState::Scope scope(scriptState); bool evalIsDisabled = !scriptState->evalEnabled(); @@ -461,7 +452,7 @@ void InjectedScript::makeCall(ScriptFunctionCall& function, RefPtr<JSONValue>* result) { - if (isEmpty() || !canAccessInspectedWindow()) { + if (!canAccessInspectedWindow()) { *result = JSONValue::null(); return; }
diff --git a/third_party/WebKit/Source/core/inspector/InjectedScript.h b/third_party/WebKit/Source/core/inspector/InjectedScript.h index 05315254c..62218e2 100644 --- a/third_party/WebKit/Source/core/inspector/InjectedScript.h +++ b/third_party/WebKit/Source/core/inspector/InjectedScript.h
@@ -48,17 +48,14 @@ typedef String ErrorString; PassRefPtr<JSONValue> toJSONValue(const ScriptValue&); - class InjectedScript final { - DISALLOW_NEW(); + USING_FAST_MALLOC(InjectedScript); public: InjectedScript(); ~InjectedScript(); - bool isEmpty() const { return m_injectedScriptObject.isEmpty(); } ScriptState* scriptState() const { - ASSERT(!isEmpty()); return m_injectedScriptObject.scriptState(); } @@ -117,7 +114,7 @@ int contextId() { return m_contextId; } private: - friend InjectedScript InjectedScriptManager::injectedScriptFor(ScriptState*); + friend InjectedScript* InjectedScriptManager::injectedScriptFor(ScriptState*); using InspectedStateAccessCheck = bool (*)(ScriptState*); InjectedScript(ScriptValue, InspectedStateAccessCheck, PassRefPtr<InjectedScriptNative>, int contextId);
diff --git a/third_party/WebKit/Source/core/inspector/InjectedScriptManager.cpp b/third_party/WebKit/Source/core/inspector/InjectedScriptManager.cpp index 904413f..f5e2b88 100644 --- a/third_party/WebKit/Source/core/inspector/InjectedScriptManager.cpp +++ b/third_party/WebKit/Source/core/inspector/InjectedScriptManager.cpp
@@ -74,19 +74,17 @@ return m_injectedScriptHost.get(); } -InjectedScript InjectedScriptManager::findInjectedScript(int id) const +InjectedScript* InjectedScriptManager::findInjectedScript(int id) const { IdToInjectedScriptMap::const_iterator it = m_idToInjectedScript.find(id); if (it != m_idToInjectedScript.end()) - return it->value; - return InjectedScript(); + return it->value.get(); + return nullptr; } -InjectedScript InjectedScriptManager::findInjectedScript(RemoteObjectIdBase* objectId) const +InjectedScript* InjectedScriptManager::findInjectedScript(RemoteObjectIdBase* objectId) const { - if (!objectId) - return InjectedScript(); - return m_idToInjectedScript.get(objectId->contextId()); + return objectId ? findInjectedScript(objectId->contextId()) : nullptr; } void InjectedScriptManager::discardInjectedScripts() @@ -114,7 +112,7 @@ for (auto& key : keys) { IdToInjectedScriptMap::iterator s = m_idToInjectedScript.find(key); if (s != m_idToInjectedScript.end()) - s->value.releaseObjectGroup(objectGroup); // m_idToInjectedScript may change here. + s->value->releaseObjectGroup(objectGroup); // m_idToInjectedScript may change here. } } @@ -123,8 +121,7 @@ m_customObjectFormatterEnabled = enabled; IdToInjectedScriptMap::iterator end = m_idToInjectedScript.end(); for (IdToInjectedScriptMap::iterator it = m_idToInjectedScript.begin(); it != end; ++it) { - if (!it->value.isEmpty()) - it->value.setCustomObjectFormatterEnabled(enabled); + it->value->setCustomObjectFormatterEnabled(enabled); } } @@ -134,25 +131,26 @@ return String(injectedScriptSourceResource.data(), injectedScriptSourceResource.size()); } -InjectedScript InjectedScriptManager::injectedScriptFor(ScriptState* scriptState) +InjectedScript* InjectedScriptManager::injectedScriptFor(ScriptState* scriptState) { ScriptState::Scope scope(scriptState); int contextId = V8Debugger::contextId(scriptState->context()); IdToInjectedScriptMap::iterator it = m_idToInjectedScript.find(contextId); if (it != m_idToInjectedScript.end()) - return it->value; + return it->value.get(); if (!m_inspectedStateAccessCheck(scriptState)) - return InjectedScript(); + return nullptr; RefPtr<InjectedScriptNative> injectedScriptNative = adoptRef(new InjectedScriptNative(scriptState->isolate())); ScriptValue injectedScriptValue = createInjectedScript(injectedScriptSource(), scriptState, contextId, injectedScriptNative.get()); - InjectedScript result(injectedScriptValue, m_inspectedStateAccessCheck, injectedScriptNative.release(), contextId); + OwnPtr<InjectedScript> result = adoptPtr(new InjectedScript(injectedScriptValue, m_inspectedStateAccessCheck, injectedScriptNative.release(), contextId)); + InjectedScript* resultPtr = result.get(); if (m_customObjectFormatterEnabled) - result.setCustomObjectFormatterEnabled(m_customObjectFormatterEnabled); - m_idToInjectedScript.set(contextId, result); - return result; + result->setCustomObjectFormatterEnabled(m_customObjectFormatterEnabled); + m_idToInjectedScript.set(contextId, result.release()); + return resultPtr; } } // namespace blink
diff --git a/third_party/WebKit/Source/core/inspector/InjectedScriptManager.h b/third_party/WebKit/Source/core/inspector/InjectedScriptManager.h index d0f3896..c87dd67 100644 --- a/third_party/WebKit/Source/core/inspector/InjectedScriptManager.h +++ b/third_party/WebKit/Source/core/inspector/InjectedScriptManager.h
@@ -57,9 +57,9 @@ InjectedScriptHost* injectedScriptHost(); - InjectedScript injectedScriptFor(ScriptState*); - InjectedScript findInjectedScript(int) const; - InjectedScript findInjectedScript(RemoteObjectIdBase*) const; + InjectedScript* injectedScriptFor(ScriptState*); + InjectedScript* findInjectedScript(int) const; + InjectedScript* findInjectedScript(RemoteObjectIdBase*) const; void discardInjectedScripts(); int discardInjectedScriptFor(ScriptState*); void releaseObjectGroup(const String& objectGroup); @@ -78,7 +78,7 @@ static bool canAccessInspectedWindow(ScriptState*); static bool canAccessInspectedWorkerGlobalScope(ScriptState*); - typedef HashMap<int, InjectedScript> IdToInjectedScriptMap; + typedef HashMap<int, OwnPtr<InjectedScript>> IdToInjectedScriptMap; IdToInjectedScriptMap m_idToInjectedScript; RefPtr<InjectedScriptHost> m_injectedScriptHost; InspectedStateAccessCheck m_inspectedStateAccessCheck;
diff --git a/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.cpp index 0b39ac1..f76b0b78 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.cpp
@@ -24,7 +24,6 @@ #include "core/inspector/InspectedFrames.h" #include "core/inspector/InspectorCSSAgent.h" #include "core/inspector/InspectorDOMAgent.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/InspectorStyleSheet.h" #include "platform/Decimal.h" #include "platform/animation/TimingFunction.h" @@ -49,10 +48,11 @@ void InspectorAnimationAgent::restore() { - if (m_state->getBoolean(AnimationAgentState::animationAgentEnabled)) { + if (m_state->booleanProperty(AnimationAgentState::animationAgentEnabled, false)) { ErrorString error; enable(&error); - double playbackRate = m_state->getDouble(AnimationAgentState::animationAgentPlaybackRate, 1); + double playbackRate = 1; + m_state->getNumber(AnimationAgentState::animationAgentPlaybackRate, &playbackRate); setPlaybackRate(nullptr, playbackRate); } } @@ -84,7 +84,8 @@ m_idToAnimationClone.clear(); m_clearedAnimations.clear(); } - double playbackRate = m_state->getDouble(AnimationAgentState::animationAgentPlaybackRate, 1); + double playbackRate = 1; + m_state->getNumber(AnimationAgentState::animationAgentPlaybackRate, &playbackRate); setPlaybackRate(nullptr, playbackRate); } @@ -204,7 +205,7 @@ { for (LocalFrame* frame : *m_inspectedFrames) frame->document()->timeline().setPlaybackRate(playbackRate); - m_state->setDouble(AnimationAgentState::animationAgentPlaybackRate, playbackRate); + m_state->setNumber(AnimationAgentState::animationAgentPlaybackRate, playbackRate); } void InspectorAnimationAgent::getCurrentTime(ErrorString* errorString, const String& id, double* currentTime) @@ -389,15 +390,15 @@ ScriptState* scriptState = ScriptState::forMainWorld(frame); if (!scriptState) return; - InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(scriptState); - if (injectedScript.isEmpty()) + InjectedScript* injectedScript = m_injectedScriptManager->injectedScriptFor(scriptState); + if (!injectedScript) return; ScriptState::Scope scope(scriptState); v8::Isolate* isolate = scriptState->isolate(); ScriptValue scriptValue = ScriptValue(scriptState, toV8(animation, scriptState->context()->Global(), isolate)); - injectedScript.releaseObjectGroup("animation"); - result = injectedScript.wrapObject(scriptValue, "animation"); + injectedScript->releaseObjectGroup("animation"); + result = injectedScript->wrapObject(scriptValue, "animation"); } static CSSPropertyID animationProperties[] = { @@ -477,7 +478,7 @@ void InspectorAnimationAgent::didClearDocumentOfWindowObject(LocalFrame* frame) { - if (!m_state->getBoolean(AnimationAgentState::animationAgentEnabled)) + if (!m_state->booleanProperty(AnimationAgentState::animationAgentEnabled, false)) return; ASSERT(frame->document()); frame->document()->timeline().setPlaybackRate(referenceTimeline().playbackRate());
diff --git a/third_party/WebKit/Source/core/inspector/InspectorApplicationCacheAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorApplicationCacheAgent.cpp index eee8a38..05abda9 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorApplicationCacheAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorApplicationCacheAgent.cpp
@@ -28,7 +28,6 @@ #include "core/frame/LocalFrame.h" #include "core/inspector/IdentifiersFactory.h" #include "core/inspector/InspectedFrames.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/InstrumentingAgents.h" #include "core/loader/DocumentLoader.h" #include "core/loader/FrameLoader.h" @@ -49,7 +48,7 @@ void InspectorApplicationCacheAgent::restore() { - if (m_state->getBoolean(ApplicationCacheAgentState::applicationCacheAgentEnabled)) { + if (m_state->booleanProperty(ApplicationCacheAgentState::applicationCacheAgentEnabled, false)) { ErrorString error; enable(&error); }
diff --git a/third_party/WebKit/Source/core/inspector/InspectorBaseAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorBaseAgent.cpp index 77789b4..1f89f3f 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorBaseAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorBaseAgent.cpp
@@ -30,7 +30,7 @@ #include "core/inspector/InspectorBaseAgent.h" -#include "core/inspector/InspectorState.h" +#include "core/inspector/JSONParser.h" #include "wtf/PassOwnPtr.h" namespace blink { @@ -49,22 +49,30 @@ visitor->trace(m_instrumentingAgents); } -void InspectorAgent::appended(InstrumentingAgents* instrumentingAgents, InspectorState* inspectorState) +void InspectorAgent::appended(InstrumentingAgents* instrumentingAgents) { m_instrumentingAgents = instrumentingAgents; - m_state = inspectorState; init(); } -InspectorAgentRegistry::InspectorAgentRegistry(InstrumentingAgents* instrumentingAgents, InspectorCompositeState* inspectorState) +void InspectorAgent::setState(PassRefPtr<JSONObject> state) +{ + m_state = state; +} + +InspectorAgentRegistry::InspectorAgentRegistry(InstrumentingAgents* instrumentingAgents) : m_instrumentingAgents(instrumentingAgents) - , m_inspectorState(inspectorState) + , m_state(JSONObject::create()) { } void InspectorAgentRegistry::append(PassOwnPtrWillBeRawPtr<InspectorAgent> agent) { - agent->appended(m_instrumentingAgents, m_inspectorState->createAgentState(agent->name())); + ASSERT(m_state->find(agent->name()) == m_state->end()); + RefPtr<JSONObject> agentState = JSONObject::create(); + m_state->setObject(agent->name(), agentState); + agent->setState(agentState); + agent->appended(m_instrumentingAgents); m_agents.append(agent); } @@ -80,12 +88,32 @@ m_agents[i]->clearFrontend(); } -void InspectorAgentRegistry::restore() +void InspectorAgentRegistry::restore(const String& savedState) { + RefPtr<JSONValue> state = parseJSON(savedState); + if (state) + m_state = state->asObject(); + if (!m_state) + m_state = JSONObject::create(); + + for (size_t i = 0; i < m_agents.size(); i++) { + RefPtr<JSONObject> agentState = m_state->getObject(m_agents[i]->name()); + if (!agentState) { + agentState = JSONObject::create(); + m_state->setObject(m_agents[i]->name(), agentState); + } + m_agents[i]->setState(agentState); + } + for (size_t i = 0; i < m_agents.size(); i++) m_agents[i]->restore(); } +String InspectorAgentRegistry::state() +{ + return m_state->toJSONString(); +} + void InspectorAgentRegistry::registerInDispatcher(InspectorBackendDispatcher* dispatcher) { for (size_t i = 0; i < m_agents.size(); i++)
diff --git a/third_party/WebKit/Source/core/inspector/InspectorBaseAgent.h b/third_party/WebKit/Source/core/inspector/InspectorBaseAgent.h index 57e0ec16..ebc9a41 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorBaseAgent.h +++ b/third_party/WebKit/Source/core/inspector/InspectorBaseAgent.h
@@ -34,6 +34,7 @@ #include "core/CoreExport.h" #include "core/InspectorBackendDispatcher.h" #include "core/inspector/InstrumentingAgents.h" +#include "platform/JSONValues.h" #include "platform/heap/Handle.h" #include "wtf/Forward.h" #include "wtf/Vector.h" @@ -42,8 +43,6 @@ namespace blink { class InspectorFrontend; -class InspectorCompositeState; -class InspectorState; class InstrumentingAgents; class LocalFrame; @@ -63,13 +62,14 @@ virtual void discardAgent() { } virtual void didCommitLoadForLocalFrame(LocalFrame*) { } virtual void flushPendingProtocolNotifications() { } + virtual void setState(PassRefPtr<JSONObject>); String name() const { return m_name; } - void appended(InstrumentingAgents*, InspectorState*); + void appended(InstrumentingAgents*); protected: RawPtrWillBeMember<InstrumentingAgents> m_instrumentingAgents; - InspectorState* m_state; + RefPtr<JSONObject> m_state; private: String m_name; @@ -79,22 +79,23 @@ DISALLOW_NEW(); WTF_MAKE_NONCOPYABLE(InspectorAgentRegistry); public: - InspectorAgentRegistry(InstrumentingAgents*, InspectorCompositeState*); + explicit InspectorAgentRegistry(InstrumentingAgents*); void append(PassOwnPtrWillBeRawPtr<InspectorAgent>); void setFrontend(InspectorFrontend*); void clearFrontend(); - void restore(); + void restore(const String& savedState); void registerInDispatcher(InspectorBackendDispatcher*); void discardAgents(); void flushPendingProtocolNotifications(); void didCommitLoadForLocalFrame(LocalFrame*); + String state(); DECLARE_TRACE(); private: RawPtrWillBeMember<InstrumentingAgents> m_instrumentingAgents; - InspectorCompositeState* m_inspectorState; + RefPtr<JSONObject> m_state; WillBeHeapVector<OwnPtrWillBeMember<InspectorAgent> > m_agents; };
diff --git a/third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp index 3ef64c48..06a97a9 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorCSSAgent.cpp
@@ -63,7 +63,6 @@ #include "core/inspector/InspectorHistory.h" #include "core/inspector/InspectorResourceAgent.h" #include "core/inspector/InspectorResourceContentLoader.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/InstrumentingAgents.h" #include "core/layout/HitTestResult.h" #include "core/layout/LayoutObject.h" @@ -614,7 +613,7 @@ void InspectorCSSAgent::restore() { - if (m_state->getBoolean(CSSAgentState::cssAgentEnabled)) + if (m_state->booleanProperty(CSSAgentState::cssAgentEnabled, false)) wasEnabled(); } @@ -665,7 +664,7 @@ void InspectorCSSAgent::wasEnabled() { - if (!m_state->getBoolean(CSSAgentState::cssAgentEnabled)) { + if (!m_state->booleanProperty(CSSAgentState::cssAgentEnabled, false)) { // We were disabled while fetching resources. return; }
diff --git a/third_party/WebKit/Source/core/inspector/InspectorConsoleAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorConsoleAgent.cpp index de46f84..7e72022 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorConsoleAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorConsoleAgent.cpp
@@ -30,7 +30,6 @@ #include "core/inspector/IdentifiersFactory.h" #include "core/inspector/InjectedScript.h" #include "core/inspector/InjectedScriptManager.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/InstrumentingAgents.h" #include "core/inspector/ScriptArguments.h" #include "core/inspector/ScriptAsyncCallStack.h" @@ -94,7 +93,7 @@ void InspectorConsoleAgent::restore() { - if (m_state->getBoolean(ConsoleAgentState::consoleMessagesEnabled)) { + if (m_state->booleanProperty(ConsoleAgentState::consoleMessagesEnabled, false)) { frontend()->messagesCleared(); ErrorString error; enable(&error); @@ -192,18 +191,18 @@ jsonObj->setUrl(consoleMessage->url()); ScriptState* scriptState = consoleMessage->scriptState(); if (scriptState) - jsonObj->setExecutionContextId(m_injectedScriptManager->injectedScriptFor(scriptState).contextId()); + jsonObj->setExecutionContextId(scriptState->contextIdInDebugger()); if (consoleMessage->source() == NetworkMessageSource && consoleMessage->requestIdentifier()) jsonObj->setNetworkRequestId(IdentifiersFactory::requestId(consoleMessage->requestIdentifier())); RefPtrWillBeRawPtr<ScriptArguments> arguments = consoleMessage->scriptArguments(); if (arguments && arguments->argumentCount()) { - InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(arguments->scriptState()); - if (!injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->injectedScriptFor(arguments->scriptState()); + if (injectedScript) { RefPtr<TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject> > jsonArgs = TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject>::create(); if (consoleMessage->type() == TableMessageType && generatePreview && arguments->argumentCount()) { ScriptValue table = arguments->argumentAt(0); ScriptValue columns = arguments->argumentCount() > 1 ? arguments->argumentAt(1) : ScriptValue(); - RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = injectedScript.wrapTable(table, columns); + RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = injectedScript->wrapTable(table, columns); if (!inspectorValue) { ASSERT_NOT_REACHED(); return; @@ -211,7 +210,7 @@ jsonArgs->addItem(inspectorValue); } else { for (unsigned i = 0; i < arguments->argumentCount(); ++i) { - RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = injectedScript.wrapObject(arguments->argumentAt(i), "console", generatePreview); + RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = injectedScript->wrapObject(arguments->argumentAt(i), "console", generatePreview); if (!inspectorValue) { ASSERT_NOT_REACHED(); return;
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp index a5a0c56..e2805cd6 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
@@ -70,7 +70,6 @@ #include "core/inspector/InspectedFrames.h" #include "core/inspector/InspectorHighlight.h" #include "core/inspector/InspectorHistory.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/InstrumentingAgents.h" #include "core/inspector/RemoteObjectId.h" #include "core/layout/HitTestResult.h" @@ -529,7 +528,7 @@ bool InspectorDOMAgent::enabled() const { - return m_state->getBoolean(DOMAgentState::domAgentEnabled); + return m_state->booleanProperty(DOMAgentState::domAgentEnabled, false); } void InspectorDOMAgent::disable(ErrorString* errorString) @@ -1217,18 +1216,18 @@ *errorString = "Invalid remote object id"; return nullptr; } - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); + if (!injectedScript) { *errorString = "Cannot find context for specified object id"; return nullptr; } - ScriptState::Scope scope(injectedScript.scriptState()); - v8::Local<v8::Value> value = injectedScript.findObject(*remoteId); + ScriptState::Scope scope(injectedScript->scriptState()); + v8::Local<v8::Value> value = injectedScript->findObject(*remoteId); if (value.IsEmpty()) { *errorString = "Node for given objectId not found"; return nullptr; } - v8::Isolate* isolate = injectedScript.scriptState()->isolate(); + v8::Isolate* isolate = injectedScript->scriptState()->isolate(); if (!V8Node::hasInstance(value, isolate)) { *errorString = "Object id doesn't reference a Node"; return nullptr; @@ -2121,12 +2120,12 @@ ScriptState* scriptState = ScriptState::forMainWorld(frame); if (!scriptState) return nullptr; - InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(scriptState); - if (injectedScript.isEmpty()) + InjectedScript* injectedScript = m_injectedScriptManager->injectedScriptFor(scriptState); + if (!injectedScript) return nullptr; ScriptValue scriptValue = nodeAsScriptValue(scriptState, node); - return injectedScript.wrapObject(scriptValue, objectGroup); + return injectedScript->wrapObject(scriptValue, objectGroup); } bool InspectorDOMAgent::pushDocumentUponHandlelessOperation(ErrorString* errorString)
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.cpp index 799fd5e4..b04d3c7 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.cpp
@@ -42,7 +42,6 @@ #include "core/inspector/InjectedScriptHost.h" #include "core/inspector/InjectedScriptManager.h" #include "core/inspector/InspectorDOMAgent.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/InstrumentingAgents.h" #include "core/inspector/RemoteObjectId.h" #include "core/inspector/v8/EventListenerInfo.h" @@ -169,7 +168,7 @@ void InspectorDOMDebuggerAgent::restore() { - if (m_state->getBoolean(DOMDebuggerAgentState::enabled)) + if (m_state->booleanProperty(DOMDebuggerAgentState::enabled, false)) m_instrumentingAgents->setInspectorDOMDebuggerAgent(this); } @@ -183,7 +182,7 @@ setBreakpoint(error, String(instrumentationEventCategoryType) + eventName, 0); } -static PassRefPtr<JSONObject> ensurePropertyObject(JSONObject* object, const String& propertyName) +static PassRefPtr<JSONObject> ensurePropertyObject(PassRefPtr<JSONObject> object, const String& propertyName) { JSONObject::iterator it = object->find(propertyName); if (it != object->end()) @@ -194,6 +193,26 @@ return result.release(); } +PassRefPtr<JSONObject> InspectorDOMDebuggerAgent::eventListenerBreakpoints() +{ + RefPtr<JSONObject> breakpoints = m_state->getObject(DOMDebuggerAgentState::eventListenerBreakpoints); + if (!breakpoints) { + breakpoints = JSONObject::create(); + m_state->setObject(DOMDebuggerAgentState::eventListenerBreakpoints, breakpoints); + } + return breakpoints; +} + +PassRefPtr<JSONObject> InspectorDOMDebuggerAgent::xhrBreakpoints() +{ + RefPtr<JSONObject> breakpoints = m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints); + if (!breakpoints) { + breakpoints = JSONObject::create(); + m_state->setObject(DOMDebuggerAgentState::xhrBreakpoints, breakpoints); + } + return breakpoints; +} + void InspectorDOMDebuggerAgent::setBreakpoint(ErrorString* error, const String& eventName, const String* targetName) { if (eventName.isEmpty()) { @@ -201,13 +220,11 @@ return; } - RefPtr<JSONObject> eventListenerBreakpoints = m_state->getObject(DOMDebuggerAgentState::eventListenerBreakpoints); - RefPtr<JSONObject> breakpointsByTarget = ensurePropertyObject(eventListenerBreakpoints.get(), eventName); + RefPtr<JSONObject> breakpointsByTarget = ensurePropertyObject(eventListenerBreakpoints(), eventName); if (!targetName || targetName->isEmpty()) breakpointsByTarget->setBoolean(DOMDebuggerAgentState::eventTargetAny, true); else breakpointsByTarget->setBoolean(targetName->lower(), true); - m_state->setObject(DOMDebuggerAgentState::eventListenerBreakpoints, eventListenerBreakpoints.release()); didAddBreakpoint(); } @@ -228,13 +245,11 @@ return; } - RefPtr<JSONObject> eventListenerBreakpoints = m_state->getObject(DOMDebuggerAgentState::eventListenerBreakpoints); - RefPtr<JSONObject> breakpointsByTarget = ensurePropertyObject(eventListenerBreakpoints.get(), eventName); + RefPtr<JSONObject> breakpointsByTarget = ensurePropertyObject(eventListenerBreakpoints(), eventName); if (!targetName || targetName->isEmpty()) breakpointsByTarget->remove(DOMDebuggerAgentState::eventTargetAny); else breakpointsByTarget->remove(targetName->lower()); - m_state->setObject(DOMDebuggerAgentState::eventListenerBreakpoints, eventListenerBreakpoints.release()); didRemoveBreakpoint(); } @@ -347,27 +362,27 @@ *errorString = "Invalid object id"; return; } - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); + if (!injectedScript) { *errorString = "Inspected frame has gone"; return; } - ScriptState* state = injectedScript.scriptState(); + ScriptState* state = injectedScript->scriptState(); ScriptState::Scope scope(state); - v8::Local<v8::Value> value = injectedScript.findObject(*remoteId); + v8::Local<v8::Value> value = injectedScript->findObject(*remoteId); if (value.IsEmpty()) { *errorString = "No object with passed objectId"; return; } - String objectGroup = injectedScript.objectIdToObjectGroupName(objectId); + String objectGroup = injectedScript->objectIdToObjectGroupName(objectId); listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener>::create(); eventListeners(injectedScript, value, objectGroup, listenersArray); } -void InspectorDOMDebuggerAgent::eventListeners(InjectedScript& injectedScript, v8::Local<v8::Value> object, const String& objectGroup, RefPtr<TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener>>& listenersArray) +void InspectorDOMDebuggerAgent::eventListeners(InjectedScript* injectedScript, v8::Local<v8::Value> object, const String& objectGroup, RefPtr<TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener>>& listenersArray) { - ScriptState* state = injectedScript.scriptState(); + ScriptState* state = injectedScript->scriptState(); EventListenerInfoMap eventInformation; InspectorDOMDebuggerAgent::eventListenersInfoForTarget(state->isolate(), object, eventInformation); for (const auto& it : eventInformation) { @@ -388,12 +403,12 @@ } } -PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::buildObjectForEventListener(InjectedScript& injectedScript, const EventListenerInfo& info, const String& objectGroupId) +PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::buildObjectForEventListener(InjectedScript* injectedScript, const EventListenerInfo& info, const String& objectGroupId) { if (info.handler.IsEmpty()) return nullptr; - ScriptState* scriptState = injectedScript.scriptState(); + ScriptState* scriptState = injectedScript->scriptState(); v8::Isolate* isolate = scriptState->isolate(); v8::Local<v8::Function> function = eventListenerEffectiveFunction(isolate, info.handler); if (function.IsEmpty()) @@ -413,8 +428,8 @@ .setUseCapture(info.useCapture) .setLocation(location); if (!objectGroupId.isEmpty()) { - value->setHandler(injectedScript.wrapObject(ScriptValue(scriptState, function), objectGroupId)); - value->setOriginalHandler(injectedScript.wrapObject(ScriptValue(scriptState, info.handler), objectGroupId)); + value->setHandler(injectedScript->wrapObject(ScriptValue(scriptState, function), objectGroupId)); + value->setOriginalHandler(injectedScript->wrapObject(ScriptValue(scriptState, info.handler), objectGroupId)); } return value.release(); } @@ -531,9 +546,9 @@ PassRefPtr<JSONObject> InspectorDOMDebuggerAgent::preparePauseOnNativeEventData(const String& eventName, const String* targetName) { String fullEventName = (targetName ? listenerEventCategoryType : instrumentationEventCategoryType) + eventName; - RefPtr<JSONObject> eventListenerBreakpoints = m_state->getObject(DOMDebuggerAgentState::eventListenerBreakpoints); - JSONObject::iterator it = eventListenerBreakpoints->find(fullEventName); - if (it == eventListenerBreakpoints->end()) + RefPtr<JSONObject> breakpoints = eventListenerBreakpoints(); + JSONObject::iterator it = breakpoints->find(fullEventName); + if (it == breakpoints->end()) return nullptr; bool match = false; RefPtr<JSONObject> breakpointsByTarget = it->value->asObject(); @@ -632,36 +647,29 @@ void InspectorDOMDebuggerAgent::setXHRBreakpoint(ErrorString* errorString, const String& url) { - if (url.isEmpty()) { + if (url.isEmpty()) m_state->setBoolean(DOMDebuggerAgentState::pauseOnAllXHRs, true); - } else { - RefPtr<JSONObject> xhrBreakpoints = m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints); - xhrBreakpoints->setBoolean(url, true); - m_state->setObject(DOMDebuggerAgentState::xhrBreakpoints, xhrBreakpoints.release()); - } + else + xhrBreakpoints()->setBoolean(url, true); didAddBreakpoint(); } void InspectorDOMDebuggerAgent::removeXHRBreakpoint(ErrorString* errorString, const String& url) { - if (url.isEmpty()) { + if (url.isEmpty()) m_state->setBoolean(DOMDebuggerAgentState::pauseOnAllXHRs, false); - } else { - RefPtr<JSONObject> xhrBreakpoints = m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints); - xhrBreakpoints->remove(url); - m_state->setObject(DOMDebuggerAgentState::xhrBreakpoints, xhrBreakpoints.release()); - } + else + xhrBreakpoints()->remove(url); didRemoveBreakpoint(); } void InspectorDOMDebuggerAgent::willSendXMLHttpRequest(const String& url) { String breakpointURL; - if (m_state->getBoolean(DOMDebuggerAgentState::pauseOnAllXHRs)) + if (m_state->booleanProperty(DOMDebuggerAgentState::pauseOnAllXHRs, false)) breakpointURL = ""; else { - RefPtr<JSONObject> xhrBreakpoints = m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints); - for (auto& breakpoint : *xhrBreakpoints) { + for (auto& breakpoint : *xhrBreakpoints()) { if (url.contains(breakpoint.key)) { breakpointURL = breakpoint.key; break; @@ -682,7 +690,7 @@ void InspectorDOMDebuggerAgent::didAddBreakpoint() { - if (m_state->getBoolean(DOMDebuggerAgentState::enabled)) + if (m_state->booleanProperty(DOMDebuggerAgentState::enabled, false)) return; setEnabled(true); } @@ -696,11 +704,11 @@ { if (!m_domBreakpoints.isEmpty()) return; - if (!isEmpty(m_state->getObject(DOMDebuggerAgentState::eventListenerBreakpoints))) + if (!isEmpty(eventListenerBreakpoints())) return; - if (!isEmpty(m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints))) + if (!isEmpty(xhrBreakpoints())) return; - if (m_state->getBoolean(DOMDebuggerAgentState::pauseOnAllXHRs)) + if (m_state->booleanProperty(DOMDebuggerAgentState::pauseOnAllXHRs, false)) return; setEnabled(false); }
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.h b/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.h index 04c4e761..9abaa779 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.h +++ b/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.h
@@ -110,6 +110,9 @@ void pauseOnNativeEventIfNeeded(PassRefPtr<JSONObject> eventData, bool synchronous); PassRefPtr<JSONObject> preparePauseOnNativeEventData(const String& eventName, const String* targetName); + PassRefPtr<JSONObject> eventListenerBreakpoints(); + PassRefPtr<JSONObject> xhrBreakpoints(); + void descriptionForDOMEvent(Node* target, int breakpointType, bool insertion, JSONObject* description); void updateSubtreeBreakpoints(Node*, uint32_t rootMask, bool set); bool hasBreakpoint(Node*, int type); @@ -120,8 +123,8 @@ void didRemoveBreakpoint(); void setEnabled(bool); - void eventListeners(InjectedScript&, v8::Local<v8::Value>, const String& objectGroup, RefPtr<TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener>>& listenersArray); - PassRefPtr<TypeBuilder::DOMDebugger::EventListener> buildObjectForEventListener(InjectedScript&, const EventListenerInfo&, const String& objectGroupId); + void eventListeners(InjectedScript*, v8::Local<v8::Value>, const String& objectGroup, RefPtr<TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener>>& listenersArray); + PassRefPtr<TypeBuilder::DOMDebugger::EventListener> buildObjectForEventListener(InjectedScript*, const EventListenerInfo&, const String& objectGroupId); InjectedScriptManager* m_injectedScriptManager; RawPtrWillBeMember<InspectorDOMAgent> m_domAgent;
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.cpp index 8f6c50470..761fb9d 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.cpp
@@ -31,7 +31,6 @@ #include "bindings/core/v8/V8Binding.h" #include "core/inspector/AsyncCallTracker.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/MuteConsoleScope.h" #include "core/inspector/ScriptAsyncCallStack.h" #include "core/inspector/v8/V8Debugger.h" @@ -289,9 +288,14 @@ } // InspectorBaseAgent overrides. +void InspectorDebuggerAgent::setState(PassRefPtr<JSONObject> state) +{ + InspectorBaseAgent::setState(state); + m_v8DebuggerAgent->setInspectorState(m_state); +} + void InspectorDebuggerAgent::init() { - m_v8DebuggerAgent->setInspectorState(m_state); m_asyncCallTracker = adoptPtrWillBeNoop(new AsyncCallTracker(m_v8DebuggerAgent.get(), m_instrumentingAgents.get())); } @@ -309,7 +313,7 @@ void InspectorDebuggerAgent::restore() { - if (!m_state->getBoolean(DebuggerAgentState::debuggerEnabled)) + if (!m_state->booleanProperty(DebuggerAgentState::debuggerEnabled, false)) return; m_v8DebuggerAgent->restore(); ErrorString errorString;
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.h b/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.h index 6f5d3d0..409c070c 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.h +++ b/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.h
@@ -90,6 +90,7 @@ void didExecuteScript(); // InspectorBaseAgent overrides. + void setState(PassRefPtr<JSONObject>) override; void init() override; void setFrontend(InspectorFrontend*) override; void clearFrontend() override;
diff --git a/third_party/WebKit/Source/core/inspector/InspectorHeapProfilerAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorHeapProfilerAgent.cpp index 1fe4c09..77270f6 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorHeapProfilerAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorHeapProfilerAgent.cpp
@@ -35,7 +35,6 @@ #include "core/frame/LocalDOMWindow.h" #include "core/inspector/InjectedScript.h" #include "core/inspector/InjectedScriptHost.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/RemoteObjectId.h" #include "platform/Timer.h" #include "wtf/CurrentTime.h" @@ -203,10 +202,10 @@ void InspectorHeapProfilerAgent::restore() { - if (m_state->getBoolean(HeapProfilerAgentState::heapProfilerEnabled)) + if (m_state->booleanProperty(HeapProfilerAgentState::heapProfilerEnabled, false)) frontend()->resetProfiles(); - if (m_state->getBoolean(HeapProfilerAgentState::heapObjectsTrackingEnabled)) - startTrackingHeapObjectsInternal(m_state->getBoolean(HeapProfilerAgentState::allocationTrackingEnabled)); + if (m_state->booleanProperty(HeapProfilerAgentState::heapObjectsTrackingEnabled, false)) + startTrackingHeapObjectsInternal(m_state->booleanProperty(HeapProfilerAgentState::allocationTrackingEnabled, false)); } void InspectorHeapProfilerAgent::collectGarbage(ErrorString*) @@ -334,12 +333,12 @@ *error = "Object is not available"; return; } - InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(heapObject.scriptState()); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->injectedScriptFor(heapObject.scriptState()); + if (!injectedScript) { *error = "Object is not available. Inspected context is gone"; return; } - result = injectedScript.wrapObject(heapObject, objectGroup ? *objectGroup : ""); + result = injectedScript->wrapObject(heapObject, objectGroup ? *objectGroup : ""); if (!result) *error = "Failed to wrap object"; } @@ -362,13 +361,13 @@ *errorString = "Invalid object id"; return; } - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); + if (!injectedScript) { *errorString = "Inspected context has gone"; return; } - ScriptState::Scope scope(injectedScript.scriptState()); - v8::Local<v8::Value> value = injectedScript.findObject(*remoteId); + ScriptState::Scope scope(injectedScript->scriptState()); + v8::Local<v8::Value> value = injectedScript->findObject(*remoteId); if (value.IsEmpty() || value->IsUndefined()) { *errorString = "Object with given id not found"; return;
diff --git a/third_party/WebKit/Source/core/inspector/InspectorInspectorAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorInspectorAgent.cpp index 64e02edd..f63dbc5 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorInspectorAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorInspectorAgent.cpp
@@ -37,7 +37,6 @@ #include "core/frame/LocalFrame.h" #include "core/inspector/InjectedScriptHost.h" #include "core/inspector/InjectedScriptManager.h" -#include "core/inspector/InspectorState.h" #include "core/loader/DocumentLoader.h" #include "core/page/Page.h" #include "platform/weborigin/SecurityOrigin.h" @@ -85,7 +84,7 @@ void InspectorInspectorAgent::restore() { - if (m_state->getBoolean(InspectorAgentState::inspectorAgentEnabled)) { + if (m_state->booleanProperty(InspectorAgentState::inspectorAgentEnabled, false)) { ErrorString error; enable(&error); } @@ -93,7 +92,7 @@ void InspectorInspectorAgent::evaluateForTestInFrontend(long callId, const String& script) { - if (m_state->getBoolean(InspectorAgentState::inspectorAgentEnabled)) { + if (m_state->booleanProperty(InspectorAgentState::inspectorAgentEnabled, false)) { frontend()->evaluateForTestInFrontend(static_cast<int>(callId), script); frontend()->flush(); } else { @@ -103,7 +102,7 @@ void InspectorInspectorAgent::inspect(PassRefPtr<TypeBuilder::Runtime::RemoteObject> objectToInspect, PassRefPtr<JSONObject> hints) { - if (frontend() && m_state->getBoolean(InspectorAgentState::inspectorAgentEnabled)) + if (frontend() && m_state->booleanProperty(InspectorAgentState::inspectorAgentEnabled, false)) frontend()->inspect(objectToInspect, hints); }
diff --git a/third_party/WebKit/Source/core/inspector/InspectorLayerTreeAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorLayerTreeAgent.cpp index 5b8586a..03eb06de 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorLayerTreeAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorLayerTreeAgent.cpp
@@ -39,7 +39,6 @@ #include "core/frame/Settings.h" #include "core/inspector/IdentifiersFactory.h" #include "core/inspector/InspectedFrames.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/InstrumentingAgents.h" #include "core/layout/LayoutPart.h" #include "core/layout/LayoutView.h"
diff --git a/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp index f742ce7..dff07c5 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp
@@ -57,7 +57,6 @@ #include "core/inspector/InspectorDebuggerAgent.h" #include "core/inspector/InspectorInstrumentation.h" #include "core/inspector/InspectorResourceContentLoader.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/InstrumentingAgents.h" #include "core/loader/DocumentLoader.h" #include "core/loader/FrameLoader.h" @@ -359,7 +358,7 @@ void InspectorPageAgent::restore() { - if (m_state->getBoolean(PageAgentState::pageAgentEnabled)) { + if (m_state->booleanProperty(PageAgentState::pageAgentEnabled, false)) { ErrorString error; enable(&error); } @@ -399,9 +398,6 @@ *identifier = String::number(++m_lastScriptIdentifier); } while (scripts->find(*identifier) != scripts->end()); scripts->setString(*identifier, source); - - // Force cookie serialization. - m_state->setObject(PageAgentState::pageAgentScriptsToEvaluateOnLoad, scripts); } void InspectorPageAgent::removeScriptToEvaluateOnLoad(ErrorString* error, const String& identifier) @@ -638,7 +634,7 @@ bool InspectorPageAgent::screencastEnabled() { - return m_enabled && m_state->getBoolean(PageAgentState::screencastEnabled); + return m_enabled && m_state->booleanProperty(PageAgentState::screencastEnabled, false); } void InspectorPageAgent::frameStartedLoading(LocalFrame* frame)
diff --git a/third_party/WebKit/Source/core/inspector/InspectorProfilerAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorProfilerAgent.cpp index 30537f6..14ddf49 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorProfilerAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorProfilerAgent.cpp
@@ -32,7 +32,6 @@ #include "bindings/core/v8/ScriptCallStackFactory.h" #include "bindings/core/v8/V8Binding.h" #include "core/frame/UseCounter.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/InstrumentingAgents.h" #include "core/inspector/ScriptCallStack.h" #include "core/inspector/v8/V8ProfilerAgent.h" @@ -60,8 +59,9 @@ } // InspectorBaseAgent overrides. -void InspectorProfilerAgent::init() +void InspectorProfilerAgent::setState(PassRefPtr<JSONObject> state) { + InspectorBaseAgent::setState(state); m_v8ProfilerAgent->setInspectorState(m_state); } @@ -79,7 +79,7 @@ void InspectorProfilerAgent::restore() { - if (!m_state->getBoolean(ProfilerAgentState::profilerEnabled)) + if (!m_state->booleanProperty(ProfilerAgentState::profilerEnabled, false)) return; m_v8ProfilerAgent->restore(); ErrorString errorString;
diff --git a/third_party/WebKit/Source/core/inspector/InspectorProfilerAgent.h b/third_party/WebKit/Source/core/inspector/InspectorProfilerAgent.h index 51da27d..34bcd9276 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorProfilerAgent.h +++ b/third_party/WebKit/Source/core/inspector/InspectorProfilerAgent.h
@@ -62,7 +62,7 @@ DECLARE_VIRTUAL_TRACE(); // InspectorBaseAgent overrides. - void init() override; + void setState(PassRefPtr<JSONObject>) override; void setFrontend(InspectorFrontend*) override; void clearFrontend() override; void restore() override;
diff --git a/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp index d96e8b0..732cf7ff 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp
@@ -50,7 +50,6 @@ #include "core/inspector/ConsoleMessageStorage.h" #include "core/inspector/IdentifiersFactory.h" #include "core/inspector/InspectedFrames.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/InstrumentingAgents.h" #include "core/inspector/NetworkResourcesData.h" #include "core/inspector/ScriptAsyncCallStack.h" @@ -248,7 +247,7 @@ void InspectorResourceAgent::restore() { - if (m_state->getBoolean(ResourceAgentState::resourceAgentEnabled)) + if (m_state->booleanProperty(ResourceAgentState::resourceAgentEnabled, false)) enable(); } @@ -401,7 +400,7 @@ InspectorResourceAgent::~InspectorResourceAgent() { #if !ENABLE(OILPAN) - if (m_state->getBoolean(ResourceAgentState::resourceAgentEnabled)) { + if (m_state->booleanProperty(ResourceAgentState::resourceAgentEnabled, false)) { ErrorString error; disable(&error); } @@ -421,8 +420,10 @@ bool InspectorResourceAgent::shouldBlockRequest(const ResourceRequest& request) { - String url = request.url().string(); RefPtr<JSONObject> blockedURLs = m_state->getObject(ResourceAgentState::blockedURLs); + if (!blockedURLs) + return false; + String url = request.url().string(); for (const auto& entry : *blockedURLs) { if (matches(url, entry.key)) return true; @@ -483,7 +484,6 @@ return; RefPtr<JSONObject> headers = m_state->getObject(ResourceAgentState::extraRequestHeaders); - if (headers) { for (const auto& header : *headers) { String value; @@ -494,7 +494,7 @@ request.setReportRawHeaders(true); - if (m_state->getBoolean(ResourceAgentState::cacheDisabled)) { + if (m_state->booleanProperty(ResourceAgentState::cacheDisabled, false)) { request.setCachePolicy(ReloadBypassingCache); request.setShouldResetAppCache(true); } @@ -677,7 +677,7 @@ if (it == m_knownRequestIdMap.end()) return; - if (m_state->getBoolean(ResourceAgentState::monitoringXHR)) { + if (m_state->booleanProperty(ResourceAgentState::monitoringXHR, false)) { String message = (success ? "XHR finished loading: " : "XHR failed loading: ") + method + " \"" + url + "\"."; RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(NetworkMessageSource, DebugMessageLevel, message); consoleMessage->setRequestIdentifier(it->value); @@ -704,7 +704,7 @@ if (it == m_knownRequestIdMap.end()) return; - if (m_state->getBoolean(ResourceAgentState::monitoringXHR)) { + if (m_state->booleanProperty(ResourceAgentState::monitoringXHR, false)) { String message = "Fetch complete: " + method + " \"" + url + "\"."; RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(NetworkMessageSource, DebugMessageLevel, message); consoleMessage->setRequestIdentifier(it->value); @@ -748,7 +748,8 @@ void InspectorResourceAgent::applyUserAgentOverride(String* userAgent) { - String userAgentOverride = m_state->getString(ResourceAgentState::userAgentOverride); + String userAgentOverride; + m_state->getString(ResourceAgentState::userAgentOverride, &userAgentOverride); if (!userAgentOverride.isEmpty()) *userAgent = userAgentOverride; } @@ -964,15 +965,18 @@ void InspectorResourceAgent::addBlockedURL(ErrorString*, const String& url) { RefPtr<JSONObject> blockedURLs = m_state->getObject(ResourceAgentState::blockedURLs); + if (!blockedURLs) { + blockedURLs = JSONObject::create(); + m_state->setObject(ResourceAgentState::blockedURLs, blockedURLs); + } blockedURLs->setBoolean(url, true); - m_state->setObject(ResourceAgentState::blockedURLs, blockedURLs.release()); } void InspectorResourceAgent::removeBlockedURL(ErrorString*, const String& url) { RefPtr<JSONObject> blockedURLs = m_state->getObject(ResourceAgentState::blockedURLs); - blockedURLs->remove(url); - m_state->setObject(ResourceAgentState::blockedURLs, blockedURLs.release()); + if (blockedURLs) + blockedURLs->remove(url); } void InspectorResourceAgent::replayXHR(ErrorString*, const String& requestId) @@ -1039,7 +1043,7 @@ if (loader->frame() != m_inspectedFrames->root()) return; - if (m_state->getBoolean(ResourceAgentState::cacheDisabled)) + if (m_state->booleanProperty(ResourceAgentState::cacheDisabled, false)) memoryCache()->evictResources(); m_resourcesData->clear(IdentifiersFactory::loaderId(loader)); @@ -1098,7 +1102,7 @@ bool InspectorResourceAgent::shouldForceCORSPreflight() { - return m_state->getBoolean(ResourceAgentState::cacheDisabled); + return m_state->booleanProperty(ResourceAgentState::cacheDisabled, false); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/inspector/InspectorRuntimeAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorRuntimeAgent.cpp index 133c086..2a3dc4c 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorRuntimeAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorRuntimeAgent.cpp
@@ -33,7 +33,6 @@ #include "bindings/core/v8/ScriptState.h" #include "core/inspector/InjectedScript.h" #include "core/inspector/InjectedScriptManager.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/MuteConsoleScope.h" #include "core/inspector/RemoteObjectId.h" #include "core/inspector/v8/V8Debugger.h" @@ -62,8 +61,9 @@ } // InspectorBaseAgent overrides. -void InspectorRuntimeAgent::init() +void InspectorRuntimeAgent::setState(PassRefPtr<JSONObject> state) { + InspectorBaseAgent::setState(state); m_v8RuntimeAgent->setInspectorState(m_state); } @@ -81,7 +81,7 @@ void InspectorRuntimeAgent::restore() { - if (!m_state->getBoolean(InspectorRuntimeAgentState::runtimeEnabled)) + if (!m_state->booleanProperty(InspectorRuntimeAgentState::runtimeEnabled, false)) return; m_v8RuntimeAgent->restore(); ErrorString errorString; @@ -90,7 +90,14 @@ void InspectorRuntimeAgent::evaluate(ErrorString* errorString, const String& expression, const String* const objectGroup, const bool* const includeCommandLineAPI, const bool* const doNotPauseOnExceptionsAndMuteConsole, const int* optExecutionContextId, const bool* const returnByValue, const bool* generatePreview, RefPtr<TypeBuilder::Runtime::RemoteObject>& result, TypeBuilder::OptOutput<bool>* wasThrown, RefPtr<TypeBuilder::Debugger::ExceptionDetails>& exceptionDetails) { - int executionContextId = optExecutionContextId ? *optExecutionContextId : m_injectedScriptManager->injectedScriptFor(defaultScriptState()).contextId(); + int executionContextId; + if (optExecutionContextId) { + executionContextId = *optExecutionContextId; + } else { + InjectedScript* injectedScript = m_injectedScriptManager->injectedScriptFor(defaultScriptState()); + ASSERT(injectedScript); + executionContextId = injectedScript->contextId(); + } MuteConsoleScope<InspectorRuntimeAgent> muteScope; if (asBool(doNotPauseOnExceptionsAndMuteConsole)) muteScope.enter(this);
diff --git a/third_party/WebKit/Source/core/inspector/InspectorRuntimeAgent.h b/third_party/WebKit/Source/core/inspector/InspectorRuntimeAgent.h index 3c4c9302e..74d22fd0 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorRuntimeAgent.h +++ b/third_party/WebKit/Source/core/inspector/InspectorRuntimeAgent.h
@@ -64,7 +64,7 @@ ~InspectorRuntimeAgent() override; // InspectorBaseAgent overrides. - void init() override; + void setState(PassRefPtr<JSONObject>) override; void setFrontend(InspectorFrontend*) override; void clearFrontend() override; void restore() override;
diff --git a/third_party/WebKit/Source/core/inspector/InspectorState.cpp b/third_party/WebKit/Source/core/inspector/InspectorState.cpp deleted file mode 100644 index fe31468..0000000 --- a/third_party/WebKit/Source/core/inspector/InspectorState.cpp +++ /dev/null
@@ -1,170 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY GOOGLE AND ITS CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "core/inspector/InspectorState.h" - -#include "core/inspector/InspectorStateClient.h" -#include "core/inspector/JSONParser.h" -#include "wtf/PassOwnPtr.h" - -namespace blink { - -InspectorState::InspectorState(InspectorStateUpdateListener* listener, PassRefPtr<JSONObject> properties) - : m_listener(listener) - , m_properties(properties) -{ -} - -void InspectorState::updateCookie() -{ - if (m_listener) - m_listener->inspectorStateUpdated(); -} - -void InspectorState::setFromCookie(PassRefPtr<JSONObject> properties) -{ - m_properties = properties; -} - -void InspectorState::setValue(const String& propertyName, PassRefPtr<JSONValue> value) -{ - m_properties->setValue(propertyName, value); - updateCookie(); -} - -void InspectorState::remove(const String& propertyName) -{ - m_properties->remove(propertyName); - updateCookie(); -} - -bool InspectorState::getBoolean(const String& propertyName) -{ - JSONObject::iterator it = m_properties->find(propertyName); - bool value = false; - if (it != m_properties->end()) - it->value->asBoolean(&value); - return value; -} - -String InspectorState::getString(const String& propertyName) -{ - JSONObject::iterator it = m_properties->find(propertyName); - String value; - if (it != m_properties->end()) - it->value->asString(&value); - return value; -} - -long InspectorState::getLong(const String& propertyName) -{ - return getLong(propertyName, 0); -} - - -long InspectorState::getLong(const String& propertyName, long defaultValue) -{ - JSONObject::iterator it = m_properties->find(propertyName); - long value = defaultValue; - if (it != m_properties->end()) - it->value->asNumber(&value); - return value; -} - -double InspectorState::getDouble(const String& propertyName) -{ - return getDouble(propertyName, 0); -} - -double InspectorState::getDouble(const String& propertyName, double defaultValue) -{ - JSONObject::iterator it = m_properties->find(propertyName); - double value = defaultValue; - if (it != m_properties->end()) - it->value->asNumber(&value); - return value; -} - -PassRefPtr<JSONObject> InspectorState::getObject(const String& propertyName) -{ - JSONObject::iterator it = m_properties->find(propertyName); - if (it == m_properties->end()) { - m_properties->setObject(propertyName, JSONObject::create()); - it = m_properties->find(propertyName); - } - return it->value->asObject(); -} - -InspectorState* InspectorCompositeState::createAgentState(const String& agentName) -{ - ASSERT(m_stateObject->find(agentName) == m_stateObject->end()); - ASSERT(m_inspectorStateMap.find(agentName) == m_inspectorStateMap.end()); - RefPtr<JSONObject> stateProperties = JSONObject::create(); - m_stateObject->setObject(agentName, stateProperties); - OwnPtr<InspectorState> statePtr = adoptPtr(new InspectorState(this, stateProperties)); - InspectorState* state = statePtr.get(); - m_inspectorStateMap.add(agentName, statePtr.release()); - return state; -} - -void InspectorCompositeState::loadFromCookie(const String& inspectorCompositeStateCookie) -{ - RefPtr<JSONValue> cookie = parseJSON(inspectorCompositeStateCookie); - if (cookie) - m_stateObject = cookie->asObject(); - if (!m_stateObject) - m_stateObject = JSONObject::create(); - - for (auto& state : m_inspectorStateMap) { - RefPtr<JSONObject> agentStateObject = m_stateObject->getObject(state.key); - if (!agentStateObject) { - agentStateObject = JSONObject::create(); - m_stateObject->setObject(state.key, agentStateObject); - } - state.value->setFromCookie(agentStateObject); - } -} - -void InspectorCompositeState::mute() -{ - m_isMuted = true; -} - -void InspectorCompositeState::unmute() -{ - m_isMuted = false; -} - -void InspectorCompositeState::inspectorStateUpdated() -{ - if (m_client && !m_isMuted) - m_client->updateInspectorStateCookie(m_stateObject->toJSONString()); -} - -} // namespace blink -
diff --git a/third_party/WebKit/Source/core/inspector/InspectorState.h b/third_party/WebKit/Source/core/inspector/InspectorState.h deleted file mode 100644 index 0cce07fe..0000000 --- a/third_party/WebKit/Source/core/inspector/InspectorState.h +++ /dev/null
@@ -1,122 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef InspectorState_h -#define InspectorState_h - -#include "core/CoreExport.h" -#include "platform/JSONValues.h" -#include "platform/heap/Handle.h" -#include "wtf/HashMap.h" -#include "wtf/Noncopyable.h" -#include "wtf/text/WTFString.h" - -namespace blink { - -class InspectorStateClient; - -class CORE_EXPORT InspectorStateUpdateListener { -public: - virtual ~InspectorStateUpdateListener() { } - virtual void inspectorStateUpdated() = 0; -}; - -class CORE_EXPORT InspectorState final { - USING_FAST_MALLOC(InspectorState); -public: - InspectorState(InspectorStateUpdateListener*, PassRefPtr<JSONObject>); - - void loadFromCookie(const String& inspectorStateCookie); - - void mute(); - void unmute(); - - bool getBoolean(const String& propertyName); - String getString(const String& propertyName); - long getLong(const String& propertyName); - long getLong(const String& propertyName, long defaultValue); - double getDouble(const String& propertyName); - double getDouble(const String& propertyName, double defaultValue); - PassRefPtr<JSONObject> getObject(const String& propertyName); - - void setBoolean(const String& propertyName, bool value) { setValue(propertyName, JSONBasicValue::create(value)); } - void setString(const String& propertyName, const String& value) { setValue(propertyName, JSONString::create(value)); } - void setLong(const String& propertyName, long value) { setValue(propertyName, JSONBasicValue::create((double)value)); } - void setDouble(const String& propertyName, double value) { setValue(propertyName, JSONBasicValue::create(value)); } - void setObject(const String& propertyName, PassRefPtr<JSONObject> value) { setValue(propertyName, value); } - - void remove(const String&); - -private: - void updateCookie(); - void setValue(const String& propertyName, PassRefPtr<JSONValue>); - - // Gets called from InspectorCompositeState::loadFromCookie(). - void setFromCookie(PassRefPtr<JSONObject>); - - friend class InspectorCompositeState; - - InspectorStateUpdateListener* m_listener; - RefPtr<JSONObject> m_properties; -}; - -class CORE_EXPORT InspectorCompositeState final : public InspectorStateUpdateListener { - WTF_MAKE_NONCOPYABLE(InspectorCompositeState); - USING_FAST_MALLOC(InspectorCompositeState); -public: - InspectorCompositeState(InspectorStateClient* inspectorStateClient) - : m_client(inspectorStateClient) - , m_stateObject(JSONObject::create()) - , m_isMuted(false) - { - } - virtual ~InspectorCompositeState() { } - - void mute(); - void unmute(); - - InspectorState* createAgentState(const String&); - void loadFromCookie(const String&); - -private: - typedef HashMap<String, OwnPtr<InspectorState>> InspectorStateMap; - - // From InspectorStateUpdateListener. - void inspectorStateUpdated() override; - - InspectorStateClient* m_client; - RefPtr<JSONObject> m_stateObject; - bool m_isMuted; - InspectorStateMap m_inspectorStateMap; -}; - -} // namespace blink - -#endif // !defined(InspectorState_h)
diff --git a/third_party/WebKit/Source/core/inspector/InspectorStateClient.h b/third_party/WebKit/Source/core/inspector/InspectorStateClient.h deleted file mode 100644 index 6aa2ee7..0000000 --- a/third_party/WebKit/Source/core/inspector/InspectorStateClient.h +++ /dev/null
@@ -1,45 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef InspectorStateClient_h -#define InspectorStateClient_h - -#include "wtf/Forward.h" - -namespace blink { - -class InspectorStateClient { -public: - virtual ~InspectorStateClient() { } - - // Navigation can cause some WebKit implementations to change the view / page / inspector controller instance. - // However, there are some inspector controller states that should survive navigation (such as tracking resources - // or recording timeline) and worker restart. Following callbacks allow embedders to track these states. - virtual void updateInspectorStateCookie(const String&) { } -}; - -} // namespace blink - -#endif // !defined(InspectorStateClient_h)
diff --git a/third_party/WebKit/Source/core/inspector/InspectorTracingAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorTracingAgent.cpp index 20faf58a..978795f9 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorTracingAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorTracingAgent.cpp
@@ -9,7 +9,6 @@ #include "core/frame/LocalFrame.h" #include "core/inspector/IdentifiersFactory.h" #include "core/inspector/InspectedFrames.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/InspectorTraceEvents.h" #include "core/inspector/InspectorWorkerAgent.h" #include "platform/TraceEvent.h" @@ -47,7 +46,7 @@ void InspectorTracingAgent::start(ErrorString*, const String* categoryFilter, const String*, const double*, const String*, PassRefPtrWillBeRawPtr<StartCallback> callback) { - ASSERT(m_state->getString(TracingAgentState::sessionId).isEmpty()); + ASSERT(sessionId().isEmpty()); m_state->setString(TracingAgentState::sessionId, IdentifiersFactory::createIdentifier()); m_client->enableTracing(categoryFilter ? *categoryFilter : String()); emitMetadataEvents(); @@ -63,7 +62,9 @@ String InspectorTracingAgent::sessionId() { - return m_state->getString(TracingAgentState::sessionId); + String result; + m_state->getString(TracingAgentState::sessionId, &result); + return result; } void InspectorTracingAgent::emitMetadataEvents()
diff --git a/third_party/WebKit/Source/core/inspector/InspectorWorkerAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorWorkerAgent.cpp index efaec68..835bc2f 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorWorkerAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorWorkerAgent.cpp
@@ -32,7 +32,6 @@ #include "core/InspectorFrontend.h" #include "core/inspector/IdentifiersFactory.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/InstrumentingAgents.h" #include "core/inspector/PageConsoleAgent.h" #include "platform/weborigin/KURL.h" @@ -72,7 +71,7 @@ void InspectorWorkerAgent::restore() { - if (m_state->getBoolean(WorkerAgentState::workerInspectionEnabled)) + if (m_state->booleanProperty(WorkerAgentState::workerInspectionEnabled, false)) createWorkerAgentClientsForExistingWorkers(); } @@ -132,14 +131,14 @@ bool InspectorWorkerAgent::shouldPauseDedicatedWorkerOnStart() { - return m_state->getBoolean(WorkerAgentState::autoconnectToWorkers); + return m_state->booleanProperty(WorkerAgentState::autoconnectToWorkers, false); } void InspectorWorkerAgent::didStartWorker(WorkerInspectorProxy* workerInspectorProxy, const KURL& url) { String id = "dedicated:" + IdentifiersFactory::createIdentifier(); m_workerInfos.set(workerInspectorProxy, WorkerInfo(url.string(), id)); - if (frontend() && m_state->getBoolean(WorkerAgentState::workerInspectionEnabled)) + if (frontend() && m_state->booleanProperty(WorkerAgentState::workerInspectionEnabled, false)) createWorkerAgentClient(workerInspectorProxy, url.string(), id); if (!m_tracingSessionId.isEmpty()) workerInspectorProxy->writeTimelineStartedEvent(m_tracingSessionId, id); @@ -178,7 +177,7 @@ m_idToClient.set(id, client.release()); ASSERT(frontend()); - bool autoconnectToWorkers = m_state->getBoolean(WorkerAgentState::autoconnectToWorkers); + bool autoconnectToWorkers = m_state->booleanProperty(WorkerAgentState::autoconnectToWorkers, false); if (autoconnectToWorkers) rawClient->connectToWorker(); frontend()->workerCreated(id, url, autoconnectToWorkers);
diff --git a/third_party/WebKit/Source/core/inspector/LayoutEditor.h b/third_party/WebKit/Source/core/inspector/LayoutEditor.h index a0b1306..6a38c414 100644 --- a/third_party/WebKit/Source/core/inspector/LayoutEditor.h +++ b/third_party/WebKit/Source/core/inspector/LayoutEditor.h
@@ -10,6 +10,7 @@ #include "core/css/CSSPrimitiveValue.h" #include "core/css/CSSRuleList.h" #include "core/dom/Element.h" +#include "platform/JSONValues.h" #include "platform/heap/Handle.h" #include "wtf/PassOwnPtr.h" #include "wtf/RefPtr.h" @@ -20,8 +21,6 @@ class CSSPrimitiveValue; class InspectorCSSAgent; class InspectorDOMAgent; -class JSONArray; -class JSONObject; class ScriptController; class CORE_EXPORT LayoutEditor final : public NoBaseWillBeGarbageCollectedFinalized<LayoutEditor> {
diff --git a/third_party/WebKit/Source/core/inspector/PageDebuggerAgent.cpp b/third_party/WebKit/Source/core/inspector/PageDebuggerAgent.cpp index 9065b2e..5e04126 100644 --- a/third_party/WebKit/Source/core/inspector/PageDebuggerAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/PageDebuggerAgent.cpp
@@ -132,12 +132,12 @@ void PageDebuggerAgent::compileScript(ErrorString* errorString, const String& expression, const String& sourceURL, bool persistScript, int executionContextId, TypeBuilder::OptOutput<ScriptId>* scriptId, RefPtr<ExceptionDetails>& exceptionDetails) { - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(executionContextId); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(executionContextId); + if (!injectedScript) { *errorString = "Inspected frame has gone"; return; } - ExecutionContext* executionContext = injectedScript.scriptState()->executionContext(); + ExecutionContext* executionContext = injectedScript->scriptState()->executionContext(); RefPtrWillBeRawPtr<LocalFrame> protect(toDocument(executionContext)->frame()); InspectorDebuggerAgent::compileScript(errorString, expression, sourceURL, persistScript, executionContextId, scriptId, exceptionDetails); if (!scriptId->isAssigned()) @@ -150,12 +150,12 @@ void PageDebuggerAgent::runScript(ErrorString* errorString, const ScriptId& scriptId, int executionContextId, const String* const objectGroup, const bool* const doNotPauseOnExceptionsAndMuteConsole, RefPtr<RemoteObject>& result, RefPtr<ExceptionDetails>& exceptionDetails) { - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(executionContextId); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(executionContextId); + if (!injectedScript) { *errorString = "Inspected frame has gone"; return; } - ExecutionContext* executionContext = injectedScript.scriptState()->executionContext(); + ExecutionContext* executionContext = injectedScript->scriptState()->executionContext(); String sourceURL = m_compiledScriptURLs.take(scriptId); LocalFrame* frame = toDocument(executionContext)->frame();
diff --git a/third_party/WebKit/Source/core/inspector/WorkerInspectorController.cpp b/third_party/WebKit/Source/core/inspector/WorkerInspectorController.cpp index 01f5d3c..45cd166 100644 --- a/third_party/WebKit/Source/core/inspector/WorkerInspectorController.cpp +++ b/third_party/WebKit/Source/core/inspector/WorkerInspectorController.cpp
@@ -39,8 +39,6 @@ #include "core/inspector/InspectorHeapProfilerAgent.h" #include "core/inspector/InspectorInstrumentation.h" #include "core/inspector/InspectorProfilerAgent.h" -#include "core/inspector/InspectorState.h" -#include "core/inspector/InspectorStateClient.h" #include "core/inspector/InspectorTaskRunner.h" #include "core/inspector/InspectorTimelineAgent.h" #include "core/inspector/InstrumentingAgents.h" @@ -57,16 +55,6 @@ namespace { -class WorkerStateClient final : public InspectorStateClient { - USING_FAST_MALLOC(WorkerStateClient); -public: - WorkerStateClient(WorkerGlobalScope* context) { } - ~WorkerStateClient() override { } - -private: - void updateInspectorStateCookie(const String& cookie) override { } -}; - class RunInspectorCommandsTask final : public InspectorTaskRunner::Task { public: explicit RunInspectorCommandsTask(WorkerThread* thread) @@ -130,12 +118,10 @@ WorkerInspectorController::WorkerInspectorController(WorkerGlobalScope* workerGlobalScope) : m_workerGlobalScope(workerGlobalScope) - , m_stateClient(adoptPtr(new WorkerStateClient(workerGlobalScope))) - , m_state(adoptPtr(new InspectorCompositeState(m_stateClient.get()))) , m_instrumentingAgents(InstrumentingAgents::create()) , m_injectedScriptManager(InjectedScriptManager::createForWorker()) , m_workerThreadDebugger(adoptPtr(new WorkerThreadDebugger(workerGlobalScope->thread()))) - , m_agents(m_instrumentingAgents.get(), m_state.get()) + , m_agents(m_instrumentingAgents.get()) , m_inspectorTaskRunner(adoptPtr(new InspectorTaskRunner(v8::Isolate::GetCurrent()))) , m_beforeInitlizedScope(adoptPtr(new InspectorTaskRunner::IgnoreInterruptsScope(m_inspectorTaskRunner.get()))) , m_paused(false) @@ -179,7 +165,6 @@ void WorkerInspectorController::connectFrontend() { ASSERT(!m_frontend); - m_state->unmute(); m_pageInspectorProxy = PageInspectorProxy::create(m_workerGlobalScope); m_frontend = adoptPtr(new InspectorFrontend(frontendChannel())); m_backendDispatcher = InspectorBackendDispatcher::create(frontendChannel()); @@ -194,9 +179,6 @@ return; m_backendDispatcher->clearFrontend(); m_backendDispatcher.clear(); - // Destroying agents would change the state, but we don't want that. - // Pre-disconnect state will be used to restore inspector agents. - m_state->mute(); m_agents.clearFrontend(); m_frontend.clear(); InspectorInstrumentation::frontendDeleted(); @@ -207,9 +189,7 @@ { ASSERT(!m_frontend); connectFrontend(); - m_state->loadFromCookie(inspectorCookie); - - m_agents.restore(); + m_agents.restore(inspectorCookie); } void WorkerInspectorController::dispatchMessageFromFrontend(const String& message)
diff --git a/third_party/WebKit/Source/core/inspector/WorkerInspectorController.h b/third_party/WebKit/Source/core/inspector/WorkerInspectorController.h index 559db88..630277b 100644 --- a/third_party/WebKit/Source/core/inspector/WorkerInspectorController.h +++ b/third_party/WebKit/Source/core/inspector/WorkerInspectorController.h
@@ -46,7 +46,6 @@ class InspectorBackendDispatcher; class InspectorFrontend; class InspectorFrontendChannel; -class InspectorStateClient; class InstrumentingAgents; class WorkerDebuggerAgent; class WorkerGlobalScope; @@ -85,8 +84,6 @@ InspectorFrontendChannel* frontendChannel() const; RawPtrWillBeMember<WorkerGlobalScope> m_workerGlobalScope; - OwnPtr<InspectorStateClient> m_stateClient; - OwnPtr<InspectorCompositeState> m_state; RefPtrWillBeMember<InstrumentingAgents> m_instrumentingAgents; OwnPtr<InjectedScriptManager> m_injectedScriptManager; OwnPtr<WorkerThreadDebugger> m_workerThreadDebugger;
diff --git a/third_party/WebKit/Source/core/inspector/injected_script_externs.js b/third_party/WebKit/Source/core/inspector/injected_script_externs.js index c78421f..571e499 100644 --- a/third_party/WebKit/Source/core/inspector/injected_script_externs.js +++ b/third_party/WebKit/Source/core/inspector/injected_script_externs.js
@@ -91,9 +91,10 @@ /** * @param {string} text + * @param {!Object=} commandLineAPI * @return {*} */ -InjectedScriptHostClass.prototype.evaluateWithExceptionDetails = function(text) {} +InjectedScriptHostClass.prototype.evaluateWithExceptionDetails = function(text, commandLineAPI) {} /** * @param {*} fn
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgent.h b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgent.h index fed29239..4579551 100644 --- a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgent.h +++ b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgent.h
@@ -14,7 +14,6 @@ class InjectedScript; class InjectedScriptManager; -class InspectorState; class JSONObject; class RemoteCallFrameId; class ScriptAsyncCallStack; @@ -77,7 +76,7 @@ virtual void removeAsyncOperationBreakpoint(ErrorString*, int in_operationId) = 0; // State management methods. - virtual void setInspectorState(InspectorState*) = 0; + virtual void setInspectorState(PassRefPtr<JSONObject>) = 0; virtual void setFrontend(InspectorFrontend::Debugger*) = 0; virtual void clearFrontend() = 0; virtual void restore() = 0;
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgentImpl.cpp b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgentImpl.cpp index 41835026..2f580f5 100644 --- a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgentImpl.cpp +++ b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgentImpl.cpp
@@ -15,7 +15,6 @@ #include "core/inspector/ContentSearchUtils.h" #include "core/inspector/InjectedScript.h" #include "core/inspector/InjectedScriptManager.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/InstrumentingAgents.h" #include "core/inspector/JSONParser.h" #include "core/inspector/RemoteObjectId.h" @@ -222,10 +221,10 @@ return; m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, JSONObject::create()); - m_state->setLong(DebuggerAgentState::pauseOnExceptionsState, V8DebuggerImpl::DontPauseOnExceptions); + m_state->setNumber(DebuggerAgentState::pauseOnExceptionsState, V8DebuggerImpl::DontPauseOnExceptions); m_state->setString(DebuggerAgentState::skipStackPattern, ""); m_state->setBoolean(DebuggerAgentState::skipContentScripts, false); - m_state->setLong(DebuggerAgentState::asyncCallStackDepth, 0); + m_state->setNumber(DebuggerAgentState::asyncCallStackDepth, 0); m_state->setBoolean(DebuggerAgentState::promiseTrackerEnabled, false); m_state->setBoolean(DebuggerAgentState::promiseTrackerCaptureStacks, false); @@ -281,7 +280,7 @@ m_v8AsyncCallTracker->asyncCallTrackingStateChanged(m_maxAsyncCallStackDepth); } -void V8DebuggerAgentImpl::setInspectorState(InspectorState* state) +void V8DebuggerAgentImpl::setInspectorState(PassRefPtr<JSONObject> state) { m_state = state; } @@ -299,15 +298,25 @@ ASSERT(!m_enabled); m_frontend->globalObjectCleared(); enable(); - long pauseState = m_state->getLong(DebuggerAgentState::pauseOnExceptionsState, V8DebuggerImpl::DontPauseOnExceptions); String error; + + long pauseState = V8DebuggerImpl::DontPauseOnExceptions; + m_state->getNumber(DebuggerAgentState::pauseOnExceptionsState, &pauseState); setPauseOnExceptionsImpl(&error, pauseState); - m_cachedSkipStackRegExp = compileSkipCallFramePattern(m_state->getString(DebuggerAgentState::skipStackPattern)); + + String skipStackPattern; + m_state->getString(DebuggerAgentState::skipStackPattern, &skipStackPattern); + m_cachedSkipStackRegExp = compileSkipCallFramePattern(skipStackPattern); increaseCachedSkipStackGeneration(); - m_skipContentScripts = m_state->getBoolean(DebuggerAgentState::skipContentScripts); - m_skipAllPauses = m_state->getBoolean(DebuggerAgentState::skipAllPauses); - internalSetAsyncCallStackDepth(m_state->getLong(DebuggerAgentState::asyncCallStackDepth)); - m_promiseTracker->setEnabled(m_state->getBoolean(DebuggerAgentState::promiseTrackerEnabled), m_state->getBoolean(DebuggerAgentState::promiseTrackerCaptureStacks)); + + m_skipContentScripts = m_state->booleanProperty(DebuggerAgentState::skipContentScripts, false); + m_skipAllPauses = m_state->booleanProperty(DebuggerAgentState::skipAllPauses, false); + + int asyncCallStackDepth = 0; + m_state->getNumber(DebuggerAgentState::asyncCallStackDepth, &asyncCallStackDepth); + internalSetAsyncCallStackDepth(asyncCallStackDepth); + + m_promiseTracker->setEnabled(m_state->booleanProperty(DebuggerAgentState::promiseTrackerEnabled, false), m_state->booleanProperty(DebuggerAgentState::promiseTrackerCaptureStacks, false)); } void V8DebuggerAgentImpl::setBreakpointsActive(ErrorString* errorString, bool active) @@ -370,6 +379,10 @@ String breakpointId = (isRegex ? "/" + url + "/" : url) + ':' + String::number(lineNumber) + ':' + String::number(columnNumber); RefPtr<JSONObject> breakpointsCookie = m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); + if (!breakpointsCookie) { + breakpointsCookie = JSONObject::create(); + m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, breakpointsCookie); + } if (breakpointsCookie->find(breakpointId) != breakpointsCookie->end()) { *errorString = "Breakpoint at specified location already exists."; return; @@ -431,8 +444,8 @@ if (!checkEnabled(errorString)) return; RefPtr<JSONObject> breakpointsCookie = m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); - breakpointsCookie->remove(breakpointId); - m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, breakpointsCookie); + if (breakpointsCookie) + breakpointsCookie->remove(breakpointId); removeBreakpoint(breakpointId); } @@ -483,15 +496,15 @@ *errorString = "Invalid call frame id"; return; } - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); + if (!injectedScript) { *errorString = "Inspected frame has gone"; return; } v8::HandleScope scope(m_isolate); v8::Local<v8::Object> callStack = m_currentCallStack.Get(m_isolate); - injectedScript.getStepInPositions(errorString, callStack, callFrameId, positions); + injectedScript->getStepInPositions(errorString, callStack, callFrameId, positions); } void V8DebuggerAgentImpl::getBacktrace(ErrorString* errorString, RefPtr<Array<CallFrame>>& callFrames, RefPtr<StackTrace>& asyncStackTrace) @@ -675,15 +688,15 @@ *errorString = "Invalid call frame id"; return; } - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); + if (!injectedScript) { *errorString = "Inspected frame has gone"; return; } v8::HandleScope scope(m_isolate); v8::Local<v8::Object> callStack = m_currentCallStack.Get(m_isolate); - injectedScript.restartFrame(errorString, callStack, callFrameId); + injectedScript->restartFrame(errorString, callStack, callFrameId); m_currentCallStack.Reset(m_isolate, debugger().currentCallFrames()); newCallFrames = currentCallFrames(); asyncStackTrace = currentAsyncStackTrace(); @@ -710,12 +723,12 @@ *errorString = "Invalid object id"; return; } - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); + if (!injectedScript) { *errorString = "Function object id is obsolete"; return; } - injectedScript.getFunctionDetails(errorString, functionId, &details); + injectedScript->getFunctionDetails(errorString, functionId, &details); } void V8DebuggerAgentImpl::getGeneratorObjectDetails(ErrorString* errorString, const String& objectId, RefPtr<GeneratorObjectDetails>& details) @@ -727,12 +740,12 @@ *errorString = "Invalid object id"; return; } - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); + if (!injectedScript) { *errorString = "Inspected frame has gone"; return; } - injectedScript.getGeneratorObjectDetails(errorString, objectId, &details); + injectedScript->getGeneratorObjectDetails(errorString, objectId, &details); } void V8DebuggerAgentImpl::getCollectionEntries(ErrorString* errorString, const String& objectId, RefPtr<TypeBuilder::Array<CollectionEntry>>& entries) @@ -744,12 +757,12 @@ *errorString = "Invalid object id"; return; } - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); + if (!injectedScript) { *errorString = "Inspected frame has gone"; return; } - injectedScript.getCollectionEntries(errorString, objectId, &entries); + injectedScript->getCollectionEntries(errorString, objectId, &entries); } void V8DebuggerAgentImpl::schedulePauseOnNextStatement(InspectorFrontend::Debugger::Reason::Enum breakReason, PassRefPtr<JSONObject> data) @@ -909,7 +922,7 @@ if (debugger().pauseOnExceptionsState() != pauseState) *errorString = "Internal error. Could not change pause on exceptions state"; else - m_state->setLong(DebuggerAgentState::pauseOnExceptionsState, pauseState); + m_state->setNumber(DebuggerAgentState::pauseOnExceptionsState, pauseState); } bool V8DebuggerAgentImpl::callStackForId(ErrorString* errorString, const RemoteCallFrameId& callFrameId, v8::Local<v8::Object>* callStack, bool* isAsync) @@ -941,8 +954,8 @@ *errorString = "Invalid call frame id"; return; } - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); + if (!injectedScript) { *errorString = "Inspected frame has gone"; return; } @@ -958,20 +971,20 @@ if (asBool(doNotPauseOnExceptionsAndMuteConsole)) ignoreExceptionsScope.emplace(m_debugger); - injectedScript.evaluateOnCallFrame(errorString, callStack, isAsync, callFrameId, expression, objectGroup ? *objectGroup : "", asBool(includeCommandLineAPI), asBool(returnByValue), asBool(generatePreview), &result, wasThrown, &exceptionDetails); + injectedScript->evaluateOnCallFrame(errorString, callStack, isAsync, callFrameId, expression, objectGroup ? *objectGroup : "", asBool(includeCommandLineAPI), asBool(returnByValue), asBool(generatePreview), &result, wasThrown, &exceptionDetails); } void V8DebuggerAgentImpl::compileScript(ErrorString* errorString, const String& expression, const String& sourceURL, bool persistScript, int executionContextId, TypeBuilder::OptOutput<ScriptId>* scriptId, RefPtr<ExceptionDetails>& exceptionDetails) { if (!checkEnabled(errorString)) return; - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(executionContextId); - if (injectedScript.isEmpty() || !injectedScript.scriptState()->contextIsValid()) { + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(executionContextId); + if (!injectedScript || !injectedScript->scriptState()->contextIsValid()) { *errorString = "Inspected frame has gone"; return; } - ScriptState::Scope scope(injectedScript.scriptState()); + ScriptState::Scope scope(injectedScript->scriptState()); v8::Local<v8::String> source = v8String(m_isolate, expression); v8::TryCatch tryCatch(m_isolate); v8::Local<v8::Script> script; @@ -996,8 +1009,8 @@ { if (!checkEnabled(errorString)) return; - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(executionContextId); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(executionContextId); + if (!injectedScript) { *errorString = "Inspected frame has gone"; return; } @@ -1011,7 +1024,7 @@ return; } - ScriptState* scriptState = injectedScript.scriptState(); + ScriptState* scriptState = injectedScript->scriptState(); ScriptState::Scope scope(scriptState); v8::Local<v8::Script> script = v8::Local<v8::Script>::New(m_isolate, m_compiledScripts.Remove(scriptId)); @@ -1036,14 +1049,14 @@ return; } - result = injectedScript.wrapObject(scriptValue, objectGroup ? *objectGroup : ""); + result = injectedScript->wrapObject(scriptValue, objectGroup ? *objectGroup : ""); } void V8DebuggerAgentImpl::setVariableValue(ErrorString* errorString, int scopeNumber, const String& variableName, const RefPtr<JSONObject>& newValue, const String* callFrameId, const String* functionObjectId) { if (!checkEnabled(errorString)) return; - InjectedScript injectedScript; + InjectedScript* injectedScript = nullptr; if (callFrameId) { if (!isPaused() || m_currentCallStack.IsEmpty()) { *errorString = "Attempt to access callframe when debugger is not on pause"; @@ -1055,7 +1068,7 @@ return; } injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); - if (injectedScript.isEmpty()) { + if (!injectedScript) { *errorString = "Inspected frame has gone"; return; } @@ -1066,7 +1079,7 @@ return; } injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); - if (injectedScript.isEmpty()) { + if (!injectedScript) { *errorString = "Function object id cannot be resolved"; return; } @@ -1078,7 +1091,7 @@ v8::HandleScope scope(m_isolate); v8::Local<v8::Object> currentCallStack = m_currentCallStack.Get(m_isolate); - injectedScript.setVariableValue(errorString, currentCallStack, callFrameId, functionObjectId, scopeNumber, variableName, newValueString); + injectedScript->setVariableValue(errorString, currentCallStack, callFrameId, functionObjectId, scopeNumber, variableName, newValueString); } void V8DebuggerAgentImpl::skipStackFrames(ErrorString* errorString, const String* pattern, const bool* skipContentScripts) @@ -1105,7 +1118,7 @@ { if (!checkEnabled(errorString)) return; - m_state->setLong(DebuggerAgentState::asyncCallStackDepth, depth); + m_state->setNumber(DebuggerAgentState::asyncCallStackDepth, depth); internalSetAsyncCallStackDepth(depth); } @@ -1139,8 +1152,8 @@ *errorString = "Promise with specified ID not found."; return; } - InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(value.scriptState()); - promise = injectedScript.wrapObject(value, objectGroup ? *objectGroup : ""); + InjectedScript* injectedScript = m_injectedScriptManager->injectedScriptFor(value.scriptState()); + promise = injectedScript->wrapObject(value, objectGroup ? *objectGroup : ""); } void V8DebuggerAgentImpl::didUpdatePromise(InspectorFrontend::Debugger::EventType::Enum eventType, PassRefPtr<TypeBuilder::Debugger::PromiseDetails> promise) @@ -1420,15 +1433,15 @@ { if (!m_pausedScriptState || m_currentCallStack.IsEmpty()) return Array<CallFrame>::create(); - InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(m_pausedScriptState.get()); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->injectedScriptFor(m_pausedScriptState.get()); + if (!injectedScript) { ASSERT_NOT_REACHED(); return Array<CallFrame>::create(); } v8::HandleScope scope(m_isolate); v8::Local<v8::Object> currentCallStack = m_currentCallStack.Get(m_isolate); - return injectedScript.wrapCallFrames(currentCallStack, 0); + return injectedScript->wrapCallFrames(currentCallStack, 0); } PassRefPtr<StackTrace> V8DebuggerAgentImpl::currentAsyncStackTrace() @@ -1447,13 +1460,13 @@ v8::HandleScope scope(m_isolate); v8::Local<v8::Object> callFrames = (*it)->callFrames(m_isolate); ScriptState* scriptState = ScriptState::from(callFrames->CreationContext()); - InjectedScript injectedScript = scriptState ? m_injectedScriptManager->injectedScriptFor(scriptState) : InjectedScript(); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = scriptState ? m_injectedScriptManager->injectedScriptFor(scriptState) : nullptr; + if (!injectedScript) { result.clear(); continue; } RefPtr<StackTrace> next = StackTrace::create() - .setCallFrames(injectedScript.wrapCallFrames(callFrames, asyncOrdinal)) + .setCallFrames(injectedScript->wrapCallFrames(callFrames, asyncOrdinal)) .release(); next->setDescription((*it)->description()); if (result) @@ -1525,6 +1538,9 @@ return; RefPtr<JSONObject> breakpointsCookie = m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); + if (!breakpointsCookie) + return; + for (auto& cookie : *breakpointsCookie) { RefPtr<JSONObject> breakpointObject = cookie.value->asObject(); bool isRegex; @@ -1580,10 +1596,10 @@ m_currentCallStack.Reset(m_isolate, callFrames); if (!exception.isEmpty()) { - InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(scriptState); - if (!injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->injectedScriptFor(scriptState); + if (injectedScript) { m_breakReason = isPromiseRejection ? InspectorFrontend::Debugger::Reason::PromiseRejection : InspectorFrontend::Debugger::Reason::Exception; - m_breakAuxData = injectedScript.wrapObject(exception, V8DebuggerAgentImpl::backtraceObjectGroup)->openAccessors(); + m_breakAuxData = injectedScript->wrapObject(exception, V8DebuggerAgentImpl::backtraceObjectGroup)->openAccessors(); // m_breakAuxData might be null after this. } } else if (m_pausingOnAsyncOperation) {
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgentImpl.h b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgentImpl.h index 7477dc14..ef18207 100644 --- a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgentImpl.h +++ b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgentImpl.h
@@ -59,7 +59,7 @@ ~V8DebuggerAgentImpl() override; DECLARE_TRACE(); - void setInspectorState(InspectorState*) override; + void setInspectorState(PassRefPtr<JSONObject>) override; void setFrontend(InspectorFrontend::Debugger* frontend) override { m_frontend = frontend; } void clearFrontend() override; void restore() override; @@ -205,7 +205,7 @@ V8DebuggerImpl* m_debugger; int m_contextGroupId; bool m_enabled; - InspectorState* m_state; + RefPtr<JSONObject> m_state; InspectorFrontend::Debugger* m_frontend; v8::Isolate* m_isolate; RefPtr<ScriptState> m_pausedScriptState;
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8InjectedScriptHost.cpp b/third_party/WebKit/Source/core/inspector/v8/V8InjectedScriptHost.cpp index 1a54e04..d235b349 100644 --- a/third_party/WebKit/Source/core/inspector/v8/V8InjectedScriptHost.cpp +++ b/third_party/WebKit/Source/core/inspector/v8/V8InjectedScriptHost.cpp
@@ -23,6 +23,7 @@ #include "core/inspector/v8/V8DebuggerClient.h" #include "core/inspector/v8/V8DebuggerImpl.h" #include "platform/JSONValues.h" +#include "platform/JSONValuesForV8.h" #include "wtf/NonCopyingSort.h" #include "wtf/RefPtr.h" #include "wtf/StdLibExtras.h" @@ -262,9 +263,7 @@ InjectedScriptHost* host = V8InjectedScriptHost::unwrap(info.GetIsolate()->GetCurrentContext(), info.Holder()); ScriptState* scriptState = ScriptState::current(info.GetIsolate()); - ScriptValue object(scriptState, info[0]); - ScriptValue hints(scriptState, info[1]); - host->inspectImpl(toJSONValue(object), toJSONValue(hints)); + host->inspectImpl(toJSONValue(scriptState->isolate(), info[0]), toJSONValue(scriptState->isolate(), info[1])); } void V8InjectedScriptHost::evalCallback(const v8::FunctionCallbackInfo<v8::Value>& info)
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8ProfilerAgent.h b/third_party/WebKit/Source/core/inspector/v8/V8ProfilerAgent.h index 6e375f9..b4c619f 100644 --- a/third_party/WebKit/Source/core/inspector/v8/V8ProfilerAgent.h +++ b/third_party/WebKit/Source/core/inspector/v8/V8ProfilerAgent.h
@@ -17,7 +17,7 @@ namespace blink { -class InspectorState; +class JSONObject; typedef String ErrorString; @@ -27,7 +27,7 @@ virtual ~V8ProfilerAgent() { } // State management methods. - virtual void setInspectorState(InspectorState*) = 0; + virtual void setInspectorState(PassRefPtr<JSONObject>) = 0; virtual void setFrontend(InspectorFrontend::Profiler*) = 0; virtual void clearFrontend() = 0; virtual void restore() = 0;
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8ProfilerAgentImpl.cpp b/third_party/WebKit/Source/core/inspector/v8/V8ProfilerAgentImpl.cpp index bb2d540..798c8ad4 100644 --- a/third_party/WebKit/Source/core/inspector/v8/V8ProfilerAgentImpl.cpp +++ b/third_party/WebKit/Source/core/inspector/v8/V8ProfilerAgentImpl.cpp
@@ -6,7 +6,6 @@ #include "bindings/core/v8/ScriptCallStackFactory.h" #include "bindings/core/v8/V8Binding.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/ScriptCallStack.h" #include "wtf/Atomics.h" #include <v8-profiler.h> @@ -199,7 +198,7 @@ *error = "Cannot change sampling interval when profiling."; return; } - m_state->setLong(ProfilerAgentState::samplingInterval, interval); + m_state->setNumber(ProfilerAgentState::samplingInterval, interval); m_isolate->GetCpuProfiler()->SetSamplingInterval(interval); } @@ -214,9 +213,11 @@ void V8ProfilerAgentImpl::restore() { m_enabled = true; - if (long interval = m_state->getLong(ProfilerAgentState::samplingInterval, 0)) + long interval = 0; + m_state->getNumber(ProfilerAgentState::samplingInterval, &interval); + if (interval) m_isolate->GetCpuProfiler()->SetSamplingInterval(interval); - if (m_state->getBoolean(ProfilerAgentState::userInitiatedProfiling)) { + if (m_state->booleanProperty(ProfilerAgentState::userInitiatedProfiling, false)) { ErrorString error; start(&error); }
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8ProfilerAgentImpl.h b/third_party/WebKit/Source/core/inspector/v8/V8ProfilerAgentImpl.h index 61ad489..64ca1ce1 100644 --- a/third_party/WebKit/Source/core/inspector/v8/V8ProfilerAgentImpl.h +++ b/third_party/WebKit/Source/core/inspector/v8/V8ProfilerAgentImpl.h
@@ -21,7 +21,7 @@ explicit V8ProfilerAgentImpl(v8::Isolate*); ~V8ProfilerAgentImpl() override; - void setInspectorState(InspectorState* state) override { m_state = state; } + void setInspectorState(PassRefPtr<JSONObject> state) override { m_state = state; } void setFrontend(InspectorFrontend::Profiler* frontend) override { m_frontend = frontend; } void clearFrontend() override; void restore() override; @@ -48,7 +48,7 @@ bool isRecording() const; v8::Isolate* m_isolate; - InspectorState* m_state; + RefPtr<JSONObject> m_state; InspectorFrontend::Profiler* m_frontend; bool m_enabled; bool m_recordingCPUProfile;
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8RuntimeAgent.h b/third_party/WebKit/Source/core/inspector/v8/V8RuntimeAgent.h index c53638e..c70f1c43 100644 --- a/third_party/WebKit/Source/core/inspector/v8/V8RuntimeAgent.h +++ b/third_party/WebKit/Source/core/inspector/v8/V8RuntimeAgent.h
@@ -16,6 +16,7 @@ class InjectedScript; class InjectedScriptManager; class JSONArray; +class JSONObject; class ScriptState; class V8Debugger; @@ -27,7 +28,7 @@ virtual ~V8RuntimeAgent() { } // State management methods. - virtual void setInspectorState(InspectorState*) = 0; + virtual void setInspectorState(PassRefPtr<JSONObject>) = 0; virtual void setFrontend(InspectorFrontend::Runtime*) = 0; virtual void clearFrontend() = 0; virtual void restore() = 0;
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8RuntimeAgentImpl.cpp b/third_party/WebKit/Source/core/inspector/v8/V8RuntimeAgentImpl.cpp index 00eac31..44c20af6 100644 --- a/third_party/WebKit/Source/core/inspector/v8/V8RuntimeAgentImpl.cpp +++ b/third_party/WebKit/Source/core/inspector/v8/V8RuntimeAgentImpl.cpp
@@ -33,7 +33,6 @@ #include "bindings/core/v8/ScriptState.h" #include "core/inspector/InjectedScript.h" #include "core/inspector/InjectedScriptManager.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/RemoteObjectId.h" #include "core/inspector/v8/IgnoreExceptionsScope.h" #include "core/inspector/v8/V8Debugger.h" @@ -73,15 +72,15 @@ *errorString = "Cannot find default execution context"; return; } - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(*executionContextId); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(*executionContextId); + if (!injectedScript) { *errorString = "Cannot find execution context with given id"; return; } Optional<IgnoreExceptionsScope> ignoreExceptionsScope; if (asBool(doNotPauseOnExceptionsAndMuteConsole)) ignoreExceptionsScope.emplace(m_debugger); - injectedScript.evaluate(errorString, expression, objectGroup ? *objectGroup : "", asBool(includeCommandLineAPI), asBool(returnByValue), asBool(generatePreview), &result, wasThrown, &exceptionDetails); + injectedScript->evaluate(errorString, expression, objectGroup ? *objectGroup : "", asBool(includeCommandLineAPI), asBool(returnByValue), asBool(generatePreview), &result, wasThrown, &exceptionDetails); } void V8RuntimeAgentImpl::callFunctionOn(ErrorString* errorString, const String& objectId, const String& expression, const RefPtr<JSONArray>* const optionalArguments, const bool* const doNotPauseOnExceptionsAndMuteConsole, const bool* const returnByValue, const bool* generatePreview, RefPtr<TypeBuilder::Runtime::RemoteObject>& result, TypeBuilder::OptOutput<bool>* wasThrown) @@ -91,8 +90,8 @@ *errorString = "Invalid object id"; return; } - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); + if (!injectedScript) { *errorString = "Inspected frame has gone"; return; } @@ -103,7 +102,7 @@ Optional<IgnoreExceptionsScope> ignoreExceptionsScope; if (asBool(doNotPauseOnExceptionsAndMuteConsole)) ignoreExceptionsScope.emplace(m_debugger); - injectedScript.callFunctionOn(errorString, objectId, expression, arguments, asBool(returnByValue), asBool(generatePreview), &result, wasThrown); + injectedScript->callFunctionOn(errorString, objectId, expression, arguments, asBool(returnByValue), asBool(generatePreview), &result, wasThrown); } void V8RuntimeAgentImpl::getProperties(ErrorString* errorString, const String& objectId, const bool* ownProperties, const bool* accessorPropertiesOnly, const bool* generatePreview, RefPtr<TypeBuilder::Array<TypeBuilder::Runtime::PropertyDescriptor>>& result, RefPtr<TypeBuilder::Array<TypeBuilder::Runtime::InternalPropertyDescriptor>>& internalProperties, RefPtr<TypeBuilder::Debugger::ExceptionDetails>& exceptionDetails) @@ -113,18 +112,18 @@ *errorString = "Invalid object id"; return; } - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); - if (injectedScript.isEmpty()) { + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); + if (!injectedScript) { *errorString = "Inspected frame has gone"; return; } IgnoreExceptionsScope ignoreExceptionsScope(m_debugger); - injectedScript.getProperties(errorString, objectId, asBool(ownProperties), asBool(accessorPropertiesOnly), asBool(generatePreview), &result, &exceptionDetails); + injectedScript->getProperties(errorString, objectId, asBool(ownProperties), asBool(accessorPropertiesOnly), asBool(generatePreview), &result, &exceptionDetails); if (!exceptionDetails && !asBool(accessorPropertiesOnly)) - injectedScript.getInternalProperties(errorString, objectId, &internalProperties, &exceptionDetails); + injectedScript->getInternalProperties(errorString, objectId, &internalProperties, &exceptionDetails); } void V8RuntimeAgentImpl::releaseObject(ErrorString* errorString, const String& objectId) @@ -134,13 +133,13 @@ *errorString = "Invalid object id"; return; } - InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); - if (injectedScript.isEmpty()) + InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); + if (!injectedScript) return; bool pausingOnNextStatement = m_debugger->pausingOnNextStatement(); if (pausingOnNextStatement) m_debugger->setPauseOnNextStatement(false); - injectedScript.releaseObject(objectId); + injectedScript->releaseObject(objectId); if (pausingOnNextStatement) m_debugger->setPauseOnNextStatement(true); } @@ -171,7 +170,7 @@ injectedScriptManager()->setCustomObjectFormatterEnabled(enabled); } -void V8RuntimeAgentImpl::setInspectorState(InspectorState* state) +void V8RuntimeAgentImpl::setInspectorState(PassRefPtr<JSONObject> state) { m_state = state; } @@ -194,7 +193,7 @@ m_frontend->executionContextsCleared(); String error; enable(&error); - if (m_state->getBoolean(V8RuntimeAgentImplState::customObjectFormatterEnabled)) + if (m_state->booleanProperty(V8RuntimeAgentImplState::customObjectFormatterEnabled, false)) injectedScriptManager()->setCustomObjectFormatterEnabled(true); } @@ -212,9 +211,9 @@ { if (!m_enabled) return; - InjectedScript injectedScript = injectedScriptManager()->injectedScriptFor(scriptState); + InjectedScript* injectedScript = injectedScriptManager()->injectedScriptFor(scriptState); RefPtr<ExecutionContextDescription> description = ExecutionContextDescription::create() - .setId(injectedScript.contextId()) + .setId(injectedScript->contextId()) .setName(humanReadableName) .setOrigin(origin) .setFrameId(frameId);
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8RuntimeAgentImpl.h b/third_party/WebKit/Source/core/inspector/v8/V8RuntimeAgentImpl.h index 09cbd962..b4b9f2d 100644 --- a/third_party/WebKit/Source/core/inspector/v8/V8RuntimeAgentImpl.h +++ b/third_party/WebKit/Source/core/inspector/v8/V8RuntimeAgentImpl.h
@@ -56,7 +56,7 @@ ~V8RuntimeAgentImpl() override; // State management methods. - void setInspectorState(InspectorState*) override; + void setInspectorState(PassRefPtr<JSONObject>) override; void setFrontend(InspectorFrontend::Runtime*) override; void clearFrontend() override; void restore() override; @@ -96,7 +96,7 @@ void reportExecutionContextCreated(ScriptState*, const String& type, const String& origin, const String& humanReadableName, const String& frameId) override; void reportExecutionContextDestroyed(ScriptState*) override; - InspectorState* m_state; + RefPtr<JSONObject> m_state; InspectorFrontend::Runtime* m_frontend; InjectedScriptManager* m_injectedScriptManager; V8DebuggerImpl* m_debugger;
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlock.cpp b/third_party/WebKit/Source/core/layout/LayoutBlock.cpp index ae0385b..8e907b7 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBlock.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBlock.cpp
@@ -98,15 +98,13 @@ // the middle of recomputing the style so we can't rely on any of its // information), which is why it's easier to just update it for every layout. static TrackedDescendantsMap* gPositionedDescendantsMap = nullptr; +static TrackedContainerMap* gPositionedContainerMap = nullptr; // This map keeps track of the descendants whose 'height' is percentage associated // with a containing block. Like |gPositionedDescendantsMap|, it is also recomputed // for every layout (see the comment above about why). static TrackedDescendantsMap* gPercentHeightDescendantsMap = nullptr; -static TrackedContainerMap* gPositionedContainerMap = nullptr; -static TrackedContainerMap* gPercentHeightContainerMap = nullptr; - struct ScrollInfo { ScrollInfo() : autoHorizontalScrollBarChanged(false), autoVerticalScrollBarChanged(false) {} DoubleSize scrollOffset; @@ -135,34 +133,31 @@ , m_hasOnlySelfCollapsingChildren(false) , m_descendantsWithFloatsMarkedForLayout(false) , m_needsRecalcLogicalWidthAfterLayoutChildren(false) + , m_hasPositionedObjects(false) + , m_hasPercentHeightDescendants(false) { // LayoutBlockFlow calls setChildrenInline(true). // By default, subclasses do not have inline children. } -static void removeBlockFromDescendantAndContainerMaps(LayoutBlock* block, TrackedDescendantsMap*& descendantMap, TrackedContainerMap*& containerMap) -{ - if (OwnPtr<TrackedLayoutBoxListHashSet> descendantSet = descendantMap->take(block)) { - for (auto& descendant : *descendantSet) { - TrackedContainerMap::iterator it = containerMap->find(descendant); - ASSERT(it != containerMap->end()); - if (it == containerMap->end()) - continue; - HashSet<LayoutBlock*>* containerSet = it->value.get(); - ASSERT(containerSet->contains(block)); - containerSet->remove(block); - if (containerSet->isEmpty()) - containerMap->remove(it); - } - } -} - void LayoutBlock::removeFromGlobalMaps() { - if (gPercentHeightDescendantsMap) - removeBlockFromDescendantAndContainerMaps(this, gPercentHeightDescendantsMap, gPercentHeightContainerMap); - if (gPositionedDescendantsMap) - removeBlockFromDescendantAndContainerMaps(this, gPositionedDescendantsMap, gPositionedContainerMap); + if (hasPositionedObjects()) { + OwnPtr<TrackedLayoutBoxListHashSet> descendants = gPositionedDescendantsMap->take(this); + ASSERT(!descendants->isEmpty()); + for (LayoutBox* descendant : *descendants) { + ASSERT(gPositionedContainerMap->get(descendant) == this); + gPositionedContainerMap->remove(descendant); + } + } + if (hasPercentHeightDescendants()) { + OwnPtr<TrackedLayoutBoxListHashSet> descendants = gPercentHeightDescendantsMap->take(this); + ASSERT(!descendants->isEmpty()); + for (LayoutBox* descendant : *descendants) { + ASSERT(descendant->percentHeightContainer() == this); + descendant->setPercentHeightContainer(nullptr); + } + } } LayoutBlock::~LayoutBlock() @@ -1397,77 +1392,58 @@ inlineBoxWrapper()->root().setHasSelectedChildren(state != SelectionNone); } -void LayoutBlock::insertIntoTrackedLayoutBoxMaps(LayoutBox* descendant, TrackedDescendantsMap*& descendantsMap, TrackedContainerMap*& containerMap) +TrackedLayoutBoxListHashSet* LayoutBlock::positionedObjectsInternal() const { - if (!descendantsMap) { - descendantsMap = new TrackedDescendantsMap; - containerMap = new TrackedContainerMap; - } - - TrackedLayoutBoxListHashSet* descendantSet = descendantsMap->get(this); - if (!descendantSet) { - descendantSet = new TrackedLayoutBoxListHashSet; - descendantsMap->set(this, adoptPtr(descendantSet)); - } - bool added = descendantSet->add(descendant).isNewEntry; - if (!added) { - ASSERT(containerMap->get(descendant)); - ASSERT(containerMap->get(descendant)->contains(this)); - return; - } - - HashSet<LayoutBlock*>* containerSet = containerMap->get(descendant); - if (!containerSet) { - containerSet = new HashSet<LayoutBlock*>; - containerMap->set(descendant, adoptPtr(containerSet)); - } - ASSERT(!containerSet->contains(this)); - containerSet->add(this); -} - -void LayoutBlock::removeFromTrackedLayoutBoxMaps(LayoutBox* descendant, TrackedDescendantsMap*& descendantsMap, TrackedContainerMap*& containerMap) -{ - if (!descendantsMap) - return; - - OwnPtr<HashSet<LayoutBlock*>> containerSet = containerMap->take(descendant); - if (!containerSet) - return; - - for (auto* container : *containerSet) { - // FIXME: Disabling this assert temporarily until we fix the layout - // bugs associated with positioned objects not properly cleared from - // their ancestor chain before being moved. See webkit bug 93766. - // ASSERT(descendant->isDescendantOf(container)); - - TrackedDescendantsMap::iterator descendantsMapIterator = descendantsMap->find(container); - ASSERT(descendantsMapIterator != descendantsMap->end()); - if (descendantsMapIterator == descendantsMap->end()) - continue; - TrackedLayoutBoxListHashSet* descendantSet = descendantsMapIterator->value.get(); - ASSERT(descendantSet->contains(descendant)); - descendantSet->remove(descendant); - if (descendantSet->isEmpty()) - descendantsMap->remove(descendantsMapIterator); - } -} - -TrackedLayoutBoxListHashSet* LayoutBlock::positionedObjects() const -{ - if (gPositionedDescendantsMap) - return gPositionedDescendantsMap->get(this); - return nullptr; + return gPositionedDescendantsMap ? gPositionedDescendantsMap->get(this) : nullptr; } void LayoutBlock::insertPositionedObject(LayoutBox* o) { ASSERT(!isAnonymousBlock()); - insertIntoTrackedLayoutBoxMaps(o, gPositionedDescendantsMap, gPositionedContainerMap); + ASSERT(o->containingBlock() == this); + + if (gPositionedContainerMap) { + auto containerMapIt = gPositionedContainerMap->find(o); + if (containerMapIt != gPositionedContainerMap->end()) { + if (containerMapIt->value == this) { + ASSERT(hasPositionedObjects() && positionedObjects()->contains(o)); + return; + } + removePositionedObject(o); + } + } else { + gPositionedContainerMap = new TrackedContainerMap; + } + gPositionedContainerMap->set(o, this); + + if (!gPositionedDescendantsMap) + gPositionedDescendantsMap = new TrackedDescendantsMap; + TrackedLayoutBoxListHashSet* descendantSet = gPositionedDescendantsMap->get(this); + if (!descendantSet) { + descendantSet = new TrackedLayoutBoxListHashSet; + gPositionedDescendantsMap->set(this, adoptPtr(descendantSet)); + } + descendantSet->add(o); + + m_hasPositionedObjects = true; } void LayoutBlock::removePositionedObject(LayoutBox* o) { - removeFromTrackedLayoutBoxMaps(o, gPositionedDescendantsMap, gPositionedContainerMap); + if (!gPositionedContainerMap) + return; + + LayoutBlock* container = gPositionedContainerMap->take(o); + if (!container) + return; + + TrackedLayoutBoxListHashSet* positionedDescendants = gPositionedDescendantsMap->get(container); + ASSERT(positionedDescendants && positionedDescendants->contains(o)); + positionedDescendants->remove(o); + if (positionedDescendants->isEmpty()) { + gPositionedDescendantsMap->remove(container); + container->m_hasPositionedObjects = false; + } } void LayoutBlock::removePositionedObjects(LayoutBlock* o, ContainingBlockState containingBlockState) @@ -1506,45 +1482,60 @@ } } - for (unsigned i = 0; i < deadObjects.size(); i++) - removePositionedObject(deadObjects.at(i)); + for (auto object : deadObjects) { + ASSERT(gPositionedContainerMap->get(object) == this); + positionedDescendants->remove(object); + gPositionedContainerMap->remove(object); + } + if (positionedDescendants->isEmpty()) { + gPositionedDescendantsMap->remove(this); + m_hasPositionedObjects = false; + } } void LayoutBlock::addPercentHeightDescendant(LayoutBox* descendant) { - insertIntoTrackedLayoutBoxMaps(descendant, gPercentHeightDescendantsMap, gPercentHeightContainerMap); + if (descendant->percentHeightContainer()) { + if (descendant->percentHeightContainer() == this) { + ASSERT(hasPercentHeightDescendant(descendant)); + return; + } + descendant->removeFromPercentHeightContainer(); + } + descendant->setPercentHeightContainer(this); + + if (!gPercentHeightDescendantsMap) + gPercentHeightDescendantsMap = new TrackedDescendantsMap; + TrackedLayoutBoxListHashSet* descendantSet = gPercentHeightDescendantsMap->get(this); + if (!descendantSet) { + descendantSet = new TrackedLayoutBoxListHashSet; + gPercentHeightDescendantsMap->set(this, adoptPtr(descendantSet)); + } + descendantSet->add(descendant); + + m_hasPercentHeightDescendants = true; } void LayoutBlock::removePercentHeightDescendant(LayoutBox* descendant) { - removeFromTrackedLayoutBoxMaps(descendant, gPercentHeightDescendantsMap, gPercentHeightContainerMap); + if (TrackedLayoutBoxListHashSet* descendants = percentHeightDescendants()) { + descendants->remove(descendant); + descendant->setPercentHeightContainer(nullptr); + if (descendants->isEmpty()) { + gPercentHeightDescendantsMap->remove(this); + m_hasPercentHeightDescendants = false; + } + } } -TrackedLayoutBoxListHashSet* LayoutBlock::percentHeightDescendants() const +TrackedLayoutBoxListHashSet* LayoutBlock::percentHeightDescendantsInternal() const { - return gPercentHeightDescendantsMap ? gPercentHeightDescendantsMap->get(this) : 0; -} - -bool LayoutBlock::hasPercentHeightContainerMap() -{ - return gPercentHeightContainerMap; -} - -bool LayoutBlock::hasPercentHeightDescendant(LayoutBox* descendant) -{ - // We don't null check gPercentHeightContainerMap since the caller - // already ensures this and we need to call this function on every - // descendant in clearPercentHeightDescendantsFrom(). - ASSERT(gPercentHeightContainerMap); - return gPercentHeightContainerMap->contains(descendant); + return gPercentHeightDescendantsMap ? gPercentHeightDescendantsMap->get(this) : nullptr; } void LayoutBlock::dirtyForLayoutFromPercentageHeightDescendants(SubtreeLayoutScope& layoutScope) { - if (!gPercentHeightDescendantsMap) - return; - - TrackedLayoutBoxListHashSet* descendants = gPercentHeightDescendantsMap->get(this); + TrackedLayoutBoxListHashSet* descendants = percentHeightDescendants(); if (!descendants) return; @@ -1562,35 +1553,6 @@ } } -void LayoutBlock::removePercentHeightDescendantIfNeeded(LayoutBox* descendant) -{ - // We query the map directly, rather than looking at style's - // logicalHeight()/logicalMinHeight()/logicalMaxHeight() since those - // can change with writing mode/directional changes. - if (!hasPercentHeightContainerMap()) - return; - - if (!hasPercentHeightDescendant(descendant)) - return; - - removePercentHeightDescendant(descendant); -} - -void LayoutBlock::clearPercentHeightDescendantsFrom(LayoutBox* parent) -{ - ASSERT(gPercentHeightContainerMap); - for (LayoutObject* curr = parent->slowFirstChild(); curr; curr = curr->nextInPreOrder(parent)) { - if (!curr->isBox()) - continue; - - LayoutBox* box = toLayoutBox(curr); - if (!hasPercentHeightDescendant(box)) - continue; - - removePercentHeightDescendant(box); - } -} - LayoutUnit LayoutBlock::textIndentOffset() const { LayoutUnit cw = 0;
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlock.h b/third_party/WebKit/Source/core/layout/LayoutBlock.h index 2a962d0..10a6df4c 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBlock.h +++ b/third_party/WebKit/Source/core/layout/LayoutBlock.h
@@ -44,7 +44,7 @@ typedef WTF::ListHashSet<LayoutBox*, 16> TrackedLayoutBoxListHashSet; typedef WTF::HashMap<const LayoutBlock*, OwnPtr<TrackedLayoutBoxListHashSet>> TrackedDescendantsMap; -typedef WTF::HashMap<const LayoutBox*, OwnPtr<HashSet<LayoutBlock*>>> TrackedContainerMap; +typedef WTF::HashMap<const LayoutBox*, LayoutBlock*> TrackedContainerMap; typedef Vector<WordMeasurement, 64> WordMeasurements; enum ContainingBlockState { NewContainingBlock, SameContainingBlock }; @@ -159,25 +159,22 @@ static void removePositionedObject(LayoutBox*); void removePositionedObjects(LayoutBlock*, ContainingBlockState = SameContainingBlock); - TrackedLayoutBoxListHashSet* positionedObjects() const; + TrackedLayoutBoxListHashSet* positionedObjects() const { return hasPositionedObjects() ? positionedObjectsInternal() : nullptr; } bool hasPositionedObjects() const { - TrackedLayoutBoxListHashSet* objects = positionedObjects(); - return objects && !objects->isEmpty(); + ASSERT(m_hasPositionedObjects ? (positionedObjectsInternal() && !positionedObjectsInternal()->isEmpty()) : !positionedObjectsInternal()); + return m_hasPositionedObjects; } void addPercentHeightDescendant(LayoutBox*); - static void removePercentHeightDescendant(LayoutBox*); - static bool hasPercentHeightContainerMap(); - static bool hasPercentHeightDescendant(LayoutBox*); - static void clearPercentHeightDescendantsFrom(LayoutBox*); - static void removePercentHeightDescendantIfNeeded(LayoutBox*); + void removePercentHeightDescendant(LayoutBox*); + bool hasPercentHeightDescendant(LayoutBox* o) const { return hasPercentHeightDescendants() && percentHeightDescendantsInternal()->contains(o); } - TrackedLayoutBoxListHashSet* percentHeightDescendants() const; + TrackedLayoutBoxListHashSet* percentHeightDescendants() const { return hasPercentHeightDescendants() ? percentHeightDescendantsInternal() : nullptr; } bool hasPercentHeightDescendants() const { - TrackedLayoutBoxListHashSet* descendants = percentHeightDescendants(); - return descendants && !descendants->isEmpty(); + ASSERT(m_hasPercentHeightDescendants ? (percentHeightDescendantsInternal() && !percentHeightDescendantsInternal()->isEmpty()) : !percentHeightDescendantsInternal()); + return m_hasPercentHeightDescendants; } void notifyScrollbarThicknessChanged() { m_widthAvailableToChildrenChanged = true; } @@ -399,8 +396,8 @@ bool isSelfCollapsingBlock() const override; - void insertIntoTrackedLayoutBoxMaps(LayoutBox* descendant, TrackedDescendantsMap*&, TrackedContainerMap*&); - static void removeFromTrackedLayoutBoxMaps(LayoutBox* descendant, TrackedDescendantsMap*&, TrackedContainerMap*&); + TrackedLayoutBoxListHashSet* positionedObjectsInternal() const; + TrackedLayoutBoxListHashSet* percentHeightDescendantsInternal() const; Node* nodeForHitTest() const; @@ -496,6 +493,9 @@ mutable unsigned m_descendantsWithFloatsMarkedForLayout : 1; mutable unsigned m_needsRecalcLogicalWidthAfterLayoutChildren : 1; + unsigned m_hasPositionedObjects : 1; + unsigned m_hasPercentHeightDescendants : 1; + // LayoutRubyBase objects need to be able to split and merge, moving their children around // (calling moveChildTo, moveAllChildrenTo, and makeChildrenNonInline). friend class LayoutRubyBase;
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp index d9bda97..b0cb299 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -130,7 +130,9 @@ clearContainingBlockOverrideSize(); clearExtraInlineAndBlockOffests(); - LayoutBlock::removePercentHeightDescendantIfNeeded(this); + if (isOutOfFlowPositioned()) + LayoutBlock::removePositionedObject(this); + removeFromPercentHeightContainer(); ShapeOutsideInfo::removeInfo(*this); @@ -219,11 +221,10 @@ const ComputedStyle& newStyle = styleRef(); if (needsLayout() && oldStyle) - LayoutBlock::removePercentHeightDescendantIfNeeded(this); + removeFromPercentHeightContainer(); - if (LayoutBlock::hasPercentHeightContainerMap() && slowFirstChild() - && oldHorizontalWritingMode != isHorizontalWritingMode()) - LayoutBlock::clearPercentHeightDescendantsFrom(this); + if (oldHorizontalWritingMode != isHorizontalWritingMode()) + clearPercentHeightDescendants(); // If our zoom factor changes and we have a defined scrollLeft/Top, we need to adjust that value into the // new zoomed coordinate space. @@ -4611,4 +4612,31 @@ scrollableArea->clearPreviousPaintInvalidationRects(); } +void LayoutBox::setPercentHeightContainer(LayoutBlock* container) +{ + ASSERT(!container || !percentHeightContainer()); + if (!container && !m_rareData) + return; + ensureRareData().m_percentHeightContainer = container; +} + +void LayoutBox::removeFromPercentHeightContainer() +{ + if (!percentHeightContainer()) + return; + + ASSERT(percentHeightContainer()->hasPercentHeightDescendant(this)); + percentHeightContainer()->removePercentHeightDescendant(this); + // The above call should call this object's setPercentHeightContainer(nullptr). + ASSERT(!percentHeightContainer()); +} + +void LayoutBox::clearPercentHeightDescendants() +{ + for (LayoutObject* curr = slowFirstChild(); curr; curr = curr->nextInPreOrder(this)) { + if (curr->isBox()) + toLayoutBox(curr)->removeFromPercentHeightContainer(); + } +} + } // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.h b/third_party/WebKit/Source/core/layout/LayoutBox.h index 3f97933..2dd9f94 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBox.h +++ b/third_party/WebKit/Source/core/layout/LayoutBox.h
@@ -57,6 +57,7 @@ , m_overrideLogicalContentHeight(-1) , m_overrideLogicalContentWidth(-1) , m_previousBorderBoxSize(-1, -1) + , m_percentHeightContainer(nullptr) { } @@ -74,6 +75,8 @@ LayoutUnit m_pageLogicalOffset; LayoutUnit m_paginationStrut; + + LayoutBlock* m_percentHeightContainer; }; // LayoutBox implements the full CSS box model. @@ -868,6 +871,11 @@ void clearPreviousPaintInvalidationRects() override; + LayoutBlock* percentHeightContainer() const { return m_rareData ? m_rareData->m_percentHeightContainer : nullptr; } + void setPercentHeightContainer(LayoutBlock*); + void removeFromPercentHeightContainer(); + void clearPercentHeightDescendants(); + protected: void willBeDestroyed() override;
diff --git a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp index 4a4187ff..b9ca8b1 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
@@ -1009,7 +1009,7 @@ } if (fullRemoveInsert && isLayoutBlock() && child->isBox()) - LayoutBlock::removePercentHeightDescendantIfNeeded(toLayoutBox(child)); + toLayoutBox(child)->removeFromPercentHeightContainer(); if (fullRemoveInsert && (toBoxModelObject->isLayoutBlock() || toBoxModelObject->isLayoutInline())) { // Takes care of adding the new child correctly if toBlock and fromBlock @@ -1028,7 +1028,7 @@ if (fullRemoveInsert && isLayoutBlock()) { LayoutBlock* block = toLayoutBlock(this); block->removePositionedObjects(nullptr); - LayoutBlock::removePercentHeightDescendantIfNeeded(block); + block->removeFromPercentHeightContainer(); if (block->isLayoutBlockFlow()) toLayoutBlockFlow(block)->removeFloatingObjects(); }
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp index 34f8259..e83ac35 100644 --- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
@@ -1231,8 +1231,6 @@ void LayoutObject::invalidateDisplayItemClient(const DisplayItemClient& displayItemClient) const { - // TODO(wangxianzhu): Ensure correct bounds for the client will be or has been passed to PaintController. crbug.com/547119. - // Not using enclosingCompositedContainer() directly because this object may be in an orphaned subtree. if (PaintLayer* enclosingLayer = this->enclosingLayer()) { // This is valid because we want to invalidate the client in the display item list of the current backing. DisableCompositingQueryAsserts disabler; @@ -1242,19 +1240,38 @@ } } +#if ENABLE(ASSERT) +static void assertEnclosingSelfPaintingLayerHasSetNeedsRepaint(const LayoutObject& layoutObject) +{ + PaintLayer* enclosingSelfPaintingLayer = nullptr; + const LayoutObject* curr = &layoutObject; + while (curr) { + if (curr->hasLayer() && toLayoutBoxModelObject(curr)->hasSelfPaintingLayer()) { + enclosingSelfPaintingLayer = toLayoutBoxModelObject(curr)->layer(); + break; + } + // Multi-column spanner is painted by the layer of the multi-column container instead of + // its enclosing layer (the layer of the multi-column flow thread). + curr = curr->isColumnSpanAll() ? curr->containingBlock() : curr->parent(); + } + ASSERT(!enclosingSelfPaintingLayer || enclosingSelfPaintingLayer->needsRepaint()); +} +#endif + void LayoutObject::invalidateDisplayItemClients(const LayoutBoxModelObject& paintInvalidationContainer, PaintInvalidationReason invalidationReason) const { - // It's caller's responsibility to ensure enclosingLayer's needsRepaint is set. - // Don't set the flag here because enclosingLayer() has cost and the caller can use - // various ways (e.g. PaintInvalidatinState::enclosingLayer()) to reduce the cost. - ASSERT(!enclosingLayer() || enclosingLayer()->needsRepaint()); + // It's caller's responsibility to ensure enclosingSelfPaintingLayer's needsRepaint is set. + // Don't set the flag here because getting enclosingSelfPaintLayer has cost and the caller can use + // various ways (e.g. PaintInvalidatinState::enclosingSelfPaintingLayer()) to reduce the cost. +#if ENABLE(ASSERT) + assertEnclosingSelfPaintingLayerHasSetNeedsRepaint(*this); +#endif paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*this, invalidationReason); } void LayoutObject::invalidateDisplayItemClientsWithPaintInvalidationState(const LayoutBoxModelObject& paintInvalidationContainer, const PaintInvalidationState& paintInvalidationState, PaintInvalidationReason invalidationReason) const { - ASSERT(&paintInvalidationState.enclosingLayer(*this) == enclosingLayer()); - paintInvalidationState.enclosingLayer(*this).setNeedsRepaint(); + paintInvalidationState.enclosingSelfPaintingLayer(*this).setNeedsRepaint(); invalidateDisplayItemClients(paintInvalidationContainer, invalidationReason); } @@ -3418,10 +3435,12 @@ void LayoutObject::invalidatePaintOfPreviousPaintInvalidationRect(const LayoutBoxModelObject& paintInvalidationContainer, PaintInvalidationReason reason) { - // It's caller's responsibility to ensure enclosingLayer's needsRepaint is set. - // Don't set the flag here because enclosingLayer() has cost and the caller can use - // various ways (e.g. PaintInvalidatinState::enclosingLayer()) to reduce the cost. - ASSERT(!enclosingLayer() || enclosingLayer()->needsRepaint()); + // It's caller's responsibility to ensure enclosingSelfPaintingLayer's needsRepaint is set. + // Don't set the flag here because getting enclosingSelfPaintLayer has cost and the caller can use + // various ways (e.g. PaintInvalidatinState::enclosingSelfPaintingLayer()) to reduce the cost. +#if ENABLE(ASSERT) + assertEnclosingSelfPaintingLayerHasSetNeedsRepaint(*this); +#endif // These disablers are valid because we want to use the current compositing/invalidation status. DisablePaintInvalidationStateAsserts invalidationDisabler;
diff --git a/third_party/WebKit/Source/core/layout/LayoutRubyRun.cpp b/third_party/WebKit/Source/core/layout/LayoutRubyRun.cpp index a22c8f9..85d6957 100644 --- a/third_party/WebKit/Source/core/layout/LayoutRubyRun.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutRubyRun.cpp
@@ -128,7 +128,7 @@ // Make sure we don't leave anything in the percentage descendant // map before moving the children to the new base. if (hasPercentHeightDescendants()) - clearPercentHeightDescendantsFrom(this); + clearPercentHeightDescendants(); rubyBaseSafe()->moveChildren(newRun->rubyBaseSafe(), beforeChild); } } else {
diff --git a/third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp b/third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp index 23d8fa55..018a769 100644 --- a/third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp +++ b/third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp
@@ -20,7 +20,7 @@ , m_viewClippingAndScrollOffsetDisabled(false) , m_paintInvalidationContainer(layoutView.containerForPaintInvalidation()) , m_pendingDelayedPaintInvalidations(pendingDelayedPaintInvalidations) - , m_enclosingLayer(*layoutView.layer()) + , m_enclosingSelfPaintingLayer(*layoutView.layer()) { bool establishesPaintInvalidationContainer = layoutView == m_paintInvalidationContainer; if (!establishesPaintInvalidationContainer) { @@ -47,7 +47,7 @@ , m_viewClippingAndScrollOffsetDisabled(false) , m_paintInvalidationContainer(paintInvalidationContainer) , m_pendingDelayedPaintInvalidations(next.pendingDelayedPaintInvalidationTargets()) - , m_enclosingLayer(next.enclosingLayer(layoutObject)) + , m_enclosingSelfPaintingLayer(next.enclosingSelfPaintingLayer(layoutObject)) { // FIXME: SVG could probably benefit from a stack-based optimization like html does. crbug.com/391054 bool establishesPaintInvalidationContainer = layoutObject == m_paintInvalidationContainer; @@ -109,7 +109,7 @@ , m_paintOffset(next.m_paintOffset) , m_paintInvalidationContainer(next.m_paintInvalidationContainer) , m_pendingDelayedPaintInvalidations(next.pendingDelayedPaintInvalidationTargets()) - , m_enclosingLayer(next.enclosingLayer(layoutObject)) + , m_enclosingSelfPaintingLayer(next.enclosingSelfPaintingLayer(layoutObject)) { ASSERT(layoutObject != m_paintInvalidationContainer); @@ -145,19 +145,12 @@ m_paintOffset -= box.scrolledContentOffset(); } -PaintLayer& PaintInvalidationState::enclosingLayer(const LayoutObject& layoutObject) const +PaintLayer& PaintInvalidationState::enclosingSelfPaintingLayer(const LayoutObject& layoutObject) const { - if (layoutObject.hasLayer()) + if (layoutObject.hasLayer() && toLayoutBoxModelObject(layoutObject).hasSelfPaintingLayer()) return *toLayoutBoxModelObject(layoutObject).layer(); - // During paint invalidation, a multi-column spanner place holder invokes paint invalidation of - // its layoutObjectInFlowThread (which has a non-null spannerPlaceHolder) directly, skipping the - // parent of its layoutObjectInFlowThread which has a PaintLayer. - if (layoutObject.spannerPlaceholder()) - return *layoutObject.enclosingLayer(); - - ASSERT(layoutObject.enclosingLayer() == &m_enclosingLayer); - return m_enclosingLayer; + return m_enclosingSelfPaintingLayer; } } // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/PaintInvalidationState.h b/third_party/WebKit/Source/core/layout/PaintInvalidationState.h index d57ddf64..11f0a30 100644 --- a/third_party/WebKit/Source/core/layout/PaintInvalidationState.h +++ b/third_party/WebKit/Source/core/layout/PaintInvalidationState.h
@@ -68,7 +68,7 @@ bool viewClippingAndScrollOffsetDisabled() const { return m_viewClippingAndScrollOffsetDisabled; } void setViewClippingAndScrollOffsetDisabled(bool b) { m_viewClippingAndScrollOffsetDisabled = b; } - PaintLayer& enclosingLayer(const LayoutObject&) const; + PaintLayer& enclosingSelfPaintingLayer(const LayoutObject&) const; private: PaintInvalidationState(const LayoutView&, Vector<LayoutObject*>& pendingDelayedPaintInvalidations, PaintInvalidationState* ownerPaintInvalidationState); @@ -101,7 +101,7 @@ Vector<LayoutObject*>& m_pendingDelayedPaintInvalidations; - PaintLayer& m_enclosingLayer; + PaintLayer& m_enclosingSelfPaintingLayer; }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp index baf3d277..afe1f47 100644 --- a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp +++ b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
@@ -205,7 +205,7 @@ // It's possible for trusted Pepper plugins to force hit testing in situations where // the frame tree is in an inconsistent state, such as in the middle of frame detach. // TODO(bbudge) Remove this check when trusted Pepper plugins are gone. - if (localFrame->document()->isActive()) + if (localFrame->document()->isActive() && localFrame->contentLayoutObject()) localFrame->contentLayoutObject()->compositor()->updateIfNeededRecursive(); }
diff --git a/third_party/WebKit/Source/core/layout/line/InlineFlowBox.h b/third_party/WebKit/Source/core/layout/line/InlineFlowBox.h index 2b5d669..e03f8aa 100644 --- a/third_party/WebKit/Source/core/layout/line/InlineFlowBox.h +++ b/third_party/WebKit/Source/core/layout/line/InlineFlowBox.h
@@ -371,9 +371,4 @@ } // namespace blink -#ifndef NDEBUG -// Outside the WebCore namespace for ease of invocation from gdb. -void showTree(const blink::InlineFlowBox*); -#endif - #endif // InlineFlowBox_h
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGRoot.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGRoot.cpp index 2dfe992..1fcbbe02 100644 --- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGRoot.cpp +++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGRoot.cpp
@@ -195,8 +195,6 @@ void LayoutSVGRoot::willBeDestroyed() { - LayoutBlock::removePercentHeightDescendant(const_cast<LayoutSVGRoot*>(this)); - SVGResourcesCache::clientDestroyed(this); LayoutReplaced::willBeDestroyed(); }
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGMarkerData.h b/third_party/WebKit/Source/core/layout/svg/SVGMarkerData.h index 878c45b..5dec45f6 100644 --- a/third_party/WebKit/Source/core/layout/svg/SVGMarkerData.h +++ b/third_party/WebKit/Source/core/layout/svg/SVGMarkerData.h
@@ -137,7 +137,8 @@ switch (element->type) { case PathElementAddQuadCurveToPoint: - // FIXME: https://bugs.webkit.org/show_bug.cgi?id=33115 (PathElementAddQuadCurveToPoint not handled for <marker>) + m_inslopePoints[0] = points[0]; + m_inslopePoints[1] = points[1]; m_origin = points[1]; break; case PathElementAddCurveToPoint:
diff --git a/third_party/WebKit/Source/core/page/EventSource.h b/third_party/WebKit/Source/core/page/EventSource.h index ded020d0..9465113 100644 --- a/third_party/WebKit/Source/core/page/EventSource.h +++ b/third_party/WebKit/Source/core/page/EventSource.h
@@ -63,10 +63,11 @@ String url() const; bool withCredentials() const; - typedef short State; - static const State CONNECTING = 0; - static const State OPEN = 1; - static const State CLOSED = 2; + enum State : unsigned short { + CONNECTING = 0, + OPEN = 1, + CLOSED = 2 + }; State readyState() const;
diff --git a/third_party/WebKit/Source/core/page/Page.cpp b/third_party/WebKit/Source/core/page/Page.cpp index bcad85f..2db6b62f 100644 --- a/third_party/WebKit/Source/core/page/Page.cpp +++ b/third_party/WebKit/Source/core/page/Page.cpp
@@ -381,6 +381,11 @@ return m_visibilityState; } +bool Page::isPageVisible() const +{ + return visibilityState() == PageVisibilityStateVisible; +} + bool Page::isCursorVisible() const { return m_isCursorVisible && settings().deviceSupportsMouse();
diff --git a/third_party/WebKit/Source/core/page/Page.h b/third_party/WebKit/Source/core/page/Page.h index 4296db8..9b02be1 100644 --- a/third_party/WebKit/Source/core/page/Page.h +++ b/third_party/WebKit/Source/core/page/Page.h
@@ -187,8 +187,9 @@ static void allVisitedStateChanged(bool invalidateVisitedLinkHashes); static void visitedStateChanged(LinkHash visitedHash); - PageVisibilityState visibilityState() const; void setVisibilityState(PageVisibilityState, bool); + PageVisibilityState visibilityState() const; + bool isPageVisible() const; bool isCursorVisible() const; void setIsCursorVisible(bool isVisible) { m_isCursorVisible = isVisible; }
diff --git a/third_party/WebKit/Source/core/paint/BackgroundImageGeometry.cpp b/third_party/WebKit/Source/core/paint/BackgroundImageGeometry.cpp index 36909481..c10a2d25 100644 --- a/third_party/WebKit/Source/core/paint/BackgroundImageGeometry.cpp +++ b/third_party/WebKit/Source/core/paint/BackgroundImageGeometry.cpp
@@ -119,16 +119,16 @@ return LayoutSize(); } -IntPoint accumulatedScrollOffset(const LayoutBoxModelObject& object, const LayoutBoxModelObject* container) +IntPoint accumulatedScrollOffsetForFixedBackground(const LayoutBoxModelObject& object, const LayoutBoxModelObject* container) { - const LayoutBlock* block = object.isLayoutBlock() ? toLayoutBlock(&object) : object.containingBlock(); IntPoint result; - while (block) { + if (&object == container) + return result; + for (const LayoutBlock* block = object.containingBlock(); block; block = block->containingBlock()) { if (block->hasOverflowClip()) result += block->scrolledContentOffset(); if (block == container) break; - block = block->containingBlock(); } return result; } @@ -257,7 +257,7 @@ viewportRect.setLocation(frameView->scrollPosition()); // Compensate the translations created by ScrollRecorders. // TODO(trchen): Fix this for SP phase 2. crbug.com/529963. - viewportRect.moveBy(accumulatedScrollOffset(obj, paintContainer)); + viewportRect.moveBy(accumulatedScrollOffsetForFixedBackground(obj, paintContainer)); } if (paintContainer)
diff --git a/third_party/WebKit/Source/core/paint/FramePainter.cpp b/third_party/WebKit/Source/core/paint/FramePainter.cpp index 51f46d8..a6eb08c9 100644 --- a/third_party/WebKit/Source/core/paint/FramePainter.cpp +++ b/third_party/WebKit/Source/core/paint/FramePainter.cpp
@@ -20,6 +20,7 @@ #include "platform/fonts/FontCache.h" #include "platform/graphics/GraphicsContext.h" #include "platform/graphics/paint/ClipRecorder.h" +#include "platform/graphics/paint/ScopedPaintChunkProperties.h" #include "platform/scroll/ScrollbarTheme.h" namespace blink { @@ -34,7 +35,29 @@ IntRect visibleAreaWithoutScrollbars(frameView().location(), frameView().visibleContentRect().size()); documentDirtyRect.intersect(visibleAreaWithoutScrollbars); - if (!documentDirtyRect.isEmpty()) { + bool shouldPaintContents = !documentDirtyRect.isEmpty(); + bool shouldPaintScrollbars = !frameView().scrollbarsSuppressed() && (frameView().horizontalScrollbar() || frameView().verticalScrollbar()); + if (!shouldPaintContents && !shouldPaintScrollbars) + return; + + // TODO(pdr): Creating frame paint properties here will not be needed once + // settings()->rootLayerScrolls() is enabled. + // TODO(pdr): Make this conditional on the rootLayerScrolls setting. + Optional<ScopedPaintChunkProperties> scopedPaintChunkProperties; + if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { + TransformPaintPropertyNode* transform = m_frameView->scrollTranslation() ? m_frameView->scrollTranslation() : m_frameView->preTranslation(); + ClipPaintPropertyNode* clip = m_frameView->contentClip(); + if (transform || clip) { + PaintChunkProperties properties(context.paintController().currentPaintChunkProperties()); + if (transform) + properties.transform = transform; + if (clip) + properties.clip = clip; + scopedPaintChunkProperties.emplace(context.paintController(), properties); + } + } + + if (shouldPaintContents) { TransformRecorder transformRecorder(context, *frameView().layoutView(), AffineTransform::translation(frameView().x() - frameView().scrollX(), frameView().y() - frameView().scrollY())); @@ -44,8 +67,7 @@ paintContents(context, globalPaintFlags, documentDirtyRect); } - // Now paint the scrollbars. - if (!frameView().scrollbarsSuppressed() && (frameView().horizontalScrollbar() || frameView().verticalScrollbar())) { + if (shouldPaintScrollbars) { IntRect scrollViewDirtyRect = rect.m_rect; IntRect visibleAreaWithScrollbars(frameView().location(), frameView().visibleContentRect(IncludeScrollbars).size()); scrollViewDirtyRect.intersect(visibleAreaWithScrollbars);
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp index dcf2d0b2..f48b877 100644 --- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp +++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
@@ -70,6 +70,10 @@ { PaintPropertyTreeBuilderContext localContext(context); + // TODO(pdr): Creating paint properties for FrameView here will not be + // needed once settings()->rootLayerScrolls() is enabled. + // TODO(pdr): Make this conditional on the rootLayerScrolls setting. + TransformationMatrix frameTranslate; frameTranslate.translate(frameView.x(), frameView.y()); // The frame owner applies paint offset already. @@ -83,7 +87,6 @@ RefPtr<ClipPaintPropertyNode> newClipNodeForContentClip = ClipPaintPropertyNode::create(newTransformNodeForPreTranslation.get(), contentClip, localContext.currentClip); localContext.currentClip = localContext.clipForOutOfFlowPositioned = localContext.clipForFixedPositioned = newClipNodeForContentClip.get(); - // This is going away in favor of Settings::rootLayerScrolls. DoubleSize scrollOffset = frameView.scrollOffsetDouble(); TransformationMatrix frameScroll; frameScroll.translate(-scrollOffset.width(), -scrollOffset.height());
diff --git a/third_party/WebKit/Source/core/svg/SVGLength.cpp b/third_party/WebKit/Source/core/svg/SVGLength.cpp index c9902d1..f1e1be0b 100644 --- a/third_party/WebKit/Source/core/svg/SVGLength.cpp +++ b/third_party/WebKit/Source/core/svg/SVGLength.cpp
@@ -142,12 +142,12 @@ CSSParserContext svgParserContext(SVGAttributeMode, 0); RefPtrWillBeRawPtr<CSSValue> parsed = CSSParser::parseSingleValue(CSSPropertyX, string, svgParserContext); if (!parsed || !parsed->isPrimitiveValue()) - return SVGParseStatus::ParsingFailed; + return SVGParseStatus::ExpectedLength; CSSPrimitiveValue* newValue = toCSSPrimitiveValue(parsed.get()); // TODO(fs): Enable calc for SVG lengths if (newValue->isCalculated() || !isSupportedCSSUnitType(newValue->typeWithCalcResolved())) - return SVGParseStatus::ParsingFailed; + return SVGParseStatus::ExpectedLength; m_value = newValue; return SVGParseStatus::NoError;
diff --git a/third_party/WebKit/Source/core/svg/SVGLengthList.cpp b/third_party/WebKit/Source/core/svg/SVGLengthList.cpp index 40f422a..206b3a8a 100644 --- a/third_party/WebKit/Source/core/svg/SVGLengthList.cpp +++ b/third_party/WebKit/Source/core/svg/SVGLengthList.cpp
@@ -71,7 +71,7 @@ template <typename CharType> SVGParsingError SVGLengthList::parseInternal(const CharType*& ptr, const CharType* end) { - clear(); + const CharType* listStart = ptr; while (ptr < end) { const CharType* start = ptr; while (ptr < end && *ptr != ',' && !isHTMLSpace<CharType>(*ptr)) @@ -85,7 +85,7 @@ RefPtrWillBeRawPtr<SVGLength> length = SVGLength::create(m_mode); SVGParsingError lengthParseStatus = length->setValueAsString(valueString); if (lengthParseStatus != SVGParseStatus::NoError) - return lengthParseStatus; + return lengthParseStatus.offsetWith(start - listStart); append(length); skipOptionalSVGSpacesOrDelimiter(ptr, end); } @@ -94,22 +94,19 @@ SVGParsingError SVGLengthList::setValueAsString(const String& value) { - if (value.isEmpty()) { - clear(); - return SVGParseStatus::NoError; - } + clear(); - SVGParsingError parseStatus; + if (value.isEmpty()) + return SVGParseStatus::NoError; + if (value.is8Bit()) { const LChar* ptr = value.characters8(); const LChar* end = ptr + value.length(); - parseStatus = parseInternal(ptr, end); - } else { - const UChar* ptr = value.characters16(); - const UChar* end = ptr + value.length(); - parseStatus = parseInternal(ptr, end); + return parseInternal(ptr, end); } - return parseStatus; + const UChar* ptr = value.characters16(); + const UChar* end = ptr + value.length(); + return parseInternal(ptr, end); } void SVGLengthList::add(PassRefPtrWillBeRawPtr<SVGPropertyBase> other, SVGElement* contextElement)
diff --git a/third_party/WebKit/Source/core/svg/SVGParsingError.cpp b/third_party/WebKit/Source/core/svg/SVGParsingError.cpp index ede273a7..da2345dd 100644 --- a/third_party/WebKit/Source/core/svg/SVGParsingError.cpp +++ b/third_party/WebKit/Source/core/svg/SVGParsingError.cpp
@@ -32,6 +32,8 @@ return std::make_pair("Expected 'true' or 'false', ", "."); case SVGParseStatus::ExpectedEnumeration: return std::make_pair("Unrecognized enumerated value, ", "."); + case SVGParseStatus::ExpectedLength: + return std::make_pair("Expected length, ", "."); case SVGParseStatus::ExpectedNumber: return std::make_pair("Expected number, ", "."); case SVGParseStatus::NegativeValue:
diff --git a/third_party/WebKit/Source/core/svg/SVGParsingError.h b/third_party/WebKit/Source/core/svg/SVGParsingError.h index 6eff092c..c66710af 100644 --- a/third_party/WebKit/Source/core/svg/SVGParsingError.h +++ b/third_party/WebKit/Source/core/svg/SVGParsingError.h
@@ -41,6 +41,7 @@ TrailingGarbage, ExpectedBoolean, ExpectedEnumeration, + ExpectedLength, ExpectedNumber, // Semantic errors @@ -65,6 +66,9 @@ bool hasLocus() const { return m_locus != kNoLocus; } unsigned locus() const { return m_locus; } + // Move the locus of this error by |offset|, returning in a new error. + SVGParsingError offsetWith(size_t offset) const { return SVGParsingError(status(), offset + locus()); } + // Generates a string describing this error for |value| in the context of // an <element, attribute>-name pair. String format(const String& tagName, const QualifiedName&, const AtomicString& value) const;
diff --git a/third_party/WebKit/Source/core/svg/SVGPathBuilder.cpp b/third_party/WebKit/Source/core/svg/SVGPathBuilder.cpp index 32e47dd..0fcd338 100644 --- a/third_party/WebKit/Source/core/svg/SVGPathBuilder.cpp +++ b/third_party/WebKit/Source/core/svg/SVGPathBuilder.cpp
@@ -23,29 +23,194 @@ #include "core/svg/SVGPathBuilder.h" -#include "core/svg/SVGPathData.h" #include "platform/graphics/Path.h" namespace blink { +FloatPoint SVGPathBuilder::smoothControl(bool isCompatibleSegment) const +{ + // The control point is assumed to be the reflection of the control point on + // the previous command relative to the current point. If there is no previous + // command or if the previous command was not a [quad/cubic], assume the control + // point is coincident with the current point. + // [https://www.w3.org/TR/SVG/paths.html#PathDataCubicBezierCommands] + // [https://www.w3.org/TR/SVG/paths.html#PathDataQuadraticBezierCommands] + FloatPoint controlPoint = m_currentPoint; + if (isCompatibleSegment) + controlPoint += m_currentPoint - m_lastControlPoint; + + return controlPoint; +} + +void SVGPathBuilder::emitClose() +{ + m_path.closeSubpath(); + + // At the end of the [closepath] command, the new current + // point is set to the initial point of the current subpath. + // [https://www.w3.org/TR/SVG/paths.html#PathDataClosePathCommand] + m_currentPoint = m_subpathPoint; +} + +void SVGPathBuilder::emitMoveTo(const FloatPoint& p) +{ + m_path.moveTo(p); + + // If a "closepath" is followed immediately by a "moveto", then + // the "moveto" identifies the start point of the next subpath. + // [https://www.w3.org/TR/SVG/paths.html#PathDataClosePathCommand] + if (m_lastCommand == PathSegClosePath) + m_subpathPoint = p; + + m_currentPoint = p; +} + +void SVGPathBuilder::emitLineTo(const FloatPoint& p) +{ + m_path.addLineTo(p); + m_currentPoint = p; +} + +void SVGPathBuilder::emitQuadTo(const FloatPoint& c0, const FloatPoint& p) +{ + m_path.addQuadCurveTo(c0, p); + m_lastControlPoint = c0; + m_currentPoint = p; +} + +void SVGPathBuilder::emitSmoothQuadTo(const FloatPoint& p) +{ + bool lastWasQuadratic = m_lastCommand == PathSegCurveToQuadraticAbs + || m_lastCommand == PathSegCurveToQuadraticRel + || m_lastCommand == PathSegCurveToQuadraticSmoothAbs + || m_lastCommand == PathSegCurveToQuadraticSmoothRel; + + emitQuadTo(smoothControl(lastWasQuadratic), p); +} + +void SVGPathBuilder::emitCubicTo(const FloatPoint& c0, const FloatPoint& c1, const FloatPoint& p) +{ + m_path.addBezierCurveTo(c0, c1, p); + m_lastControlPoint = c1; + m_currentPoint = p; +} + +void SVGPathBuilder::emitSmoothCubicTo(const FloatPoint& c1, const FloatPoint& p) +{ + bool lastWasCubic = m_lastCommand == PathSegCurveToCubicAbs + || m_lastCommand == PathSegCurveToCubicRel + || m_lastCommand == PathSegCurveToCubicSmoothAbs + || m_lastCommand == PathSegCurveToCubicSmoothRel; + + emitCubicTo(smoothControl(lastWasCubic), c1, p); +} + +void SVGPathBuilder::emitArcTo(const FloatPoint& p, const FloatSize& r, float rotate, + bool largeArc, bool sweep) +{ + m_path.addArcTo(p, r, rotate, largeArc, sweep); + m_currentPoint = p; +} + void SVGPathBuilder::emitSegment(const PathSegmentData& segment) { switch (segment.command) { + case PathSegClosePath: + emitClose(); + break; case PathSegMoveToAbs: - m_path.moveTo(segment.targetPoint); + emitMoveTo( + segment.targetPoint); + break; + case PathSegMoveToRel: + emitMoveTo( + m_currentPoint + segment.targetPoint); break; case PathSegLineToAbs: - m_path.addLineTo(segment.targetPoint); + emitLineTo( + segment.targetPoint); break; - case PathSegClosePath: - m_path.closeSubpath(); + case PathSegLineToRel: + emitLineTo( + m_currentPoint + segment.targetPoint); + break; + case PathSegLineToHorizontalAbs: + emitLineTo( + FloatPoint(segment.targetPoint.x(), m_currentPoint.y())); + break; + case PathSegLineToHorizontalRel: + emitLineTo( + m_currentPoint + FloatSize(segment.targetPoint.x(), 0)); + break; + case PathSegLineToVerticalAbs: + emitLineTo( + FloatPoint(m_currentPoint.x(), segment.targetPoint.y())); + break; + case PathSegLineToVerticalRel: + emitLineTo( + m_currentPoint + FloatSize(0, segment.targetPoint.y())); + break; + case PathSegCurveToQuadraticAbs: + emitQuadTo( + segment.point1, + segment.targetPoint); + break; + case PathSegCurveToQuadraticRel: + emitQuadTo( + m_currentPoint + segment.point1, + m_currentPoint + segment.targetPoint); + break; + case PathSegCurveToQuadraticSmoothAbs: + emitSmoothQuadTo( + segment.targetPoint); + break; + case PathSegCurveToQuadraticSmoothRel: + emitSmoothQuadTo( + m_currentPoint + segment.targetPoint); break; case PathSegCurveToCubicAbs: - m_path.addBezierCurveTo(segment.point1, segment.point2, segment.targetPoint); + emitCubicTo( + segment.point1, + segment.point2, + segment.targetPoint); + break; + case PathSegCurveToCubicRel: + emitCubicTo( + m_currentPoint + segment.point1, + m_currentPoint + segment.point2, + m_currentPoint + segment.targetPoint); + break; + case PathSegCurveToCubicSmoothAbs: + emitSmoothCubicTo( + segment.point2, + segment.targetPoint); + break; + case PathSegCurveToCubicSmoothRel: + emitSmoothCubicTo( + m_currentPoint + segment.point2, + m_currentPoint + segment.targetPoint); + break; + case PathSegArcAbs: + emitArcTo( + segment.targetPoint, + toFloatSize(segment.arcRadii()), + segment.arcAngle(), + segment.largeArcFlag(), + segment.sweepFlag()); + break; + case PathSegArcRel: + emitArcTo( + m_currentPoint + segment.targetPoint, + toFloatSize(segment.arcRadii()), + segment.arcAngle(), + segment.largeArcFlag(), + segment.sweepFlag()); break; default: ASSERT_NOT_REACHED(); } + + m_lastCommand = segment.command; } } // namespace blink
diff --git a/third_party/WebKit/Source/core/svg/SVGPathBuilder.h b/third_party/WebKit/Source/core/svg/SVGPathBuilder.h index 6cbe279..522bee4 100644 --- a/third_party/WebKit/Source/core/svg/SVGPathBuilder.h +++ b/third_party/WebKit/Source/core/svg/SVGPathBuilder.h
@@ -25,19 +25,42 @@ #define SVGPathBuilder_h #include "core/svg/SVGPathConsumer.h" +#include "core/svg/SVGPathData.h" +#include "platform/geometry/FloatPoint.h" namespace blink { +class FloatSize; class Path; class SVGPathBuilder final : public SVGPathConsumer { public: - SVGPathBuilder(Path& path) : m_path(path) { } + SVGPathBuilder(Path& path) + : m_path(path) + // Starting in ClosePath state ensures correct handling of the first moveTo. + , m_lastCommand(PathSegClosePath) + { } private: void emitSegment(const PathSegmentData&) override; + void emitClose(); + void emitMoveTo(const FloatPoint&); + void emitLineTo(const FloatPoint&); + void emitQuadTo(const FloatPoint&, const FloatPoint&); + void emitSmoothQuadTo(const FloatPoint&); + void emitCubicTo(const FloatPoint&, const FloatPoint&, const FloatPoint&); + void emitSmoothCubicTo(const FloatPoint&, const FloatPoint&); + void emitArcTo(const FloatPoint&, const FloatSize&, float, bool largeArc, bool sweep); + + FloatPoint smoothControl(bool isSmooth) const; + Path& m_path; + + SVGPathSegType m_lastCommand; + FloatPoint m_subpathPoint; + FloatPoint m_currentPoint; + FloatPoint m_lastControlPoint; }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/svg/SVGPathUtilities.cpp b/third_party/WebKit/Source/core/svg/SVGPathUtilities.cpp index a4b9ddbc..259bf0e 100644 --- a/third_party/WebKit/Source/core/svg/SVGPathUtilities.cpp +++ b/third_party/WebKit/Source/core/svg/SVGPathUtilities.cpp
@@ -36,7 +36,7 @@ SVGPathBuilder builder(result); SVGPathStringSource source(d); SVGPathParser parser(&source, &builder); - return parser.parsePathDataFromSource(NormalizedParsing); + return parser.parsePathDataFromSource(UnalteredParsing); } bool buildPathFromByteStream(const SVGPathByteStream& stream, Path& result) @@ -47,7 +47,7 @@ SVGPathBuilder builder(result); SVGPathByteStreamSource source(stream); SVGPathParser parser(&source, &builder); - return parser.parsePathDataFromSource(NormalizedParsing); + return parser.parsePathDataFromSource(UnalteredParsing); } String buildStringFromByteStream(const SVGPathByteStream& stream)
diff --git a/third_party/WebKit/Source/modules/accessibility/InspectorAccessibilityAgent.cpp b/third_party/WebKit/Source/modules/accessibility/InspectorAccessibilityAgent.cpp index 341d40d6..0d85a80 100644 --- a/third_party/WebKit/Source/modules/accessibility/InspectorAccessibilityAgent.cpp +++ b/third_party/WebKit/Source/modules/accessibility/InspectorAccessibilityAgent.cpp
@@ -9,7 +9,6 @@ #include "core/dom/DOMNodeIds.h" #include "core/dom/Element.h" #include "core/inspector/InspectorDOMAgent.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/InspectorStyleSheet.h" #include "core/page/Page.h" #include "modules/accessibility/AXObject.h"
diff --git a/third_party/WebKit/Source/modules/background_sync/ServiceWorkerGlobalScopeSync.h b/third_party/WebKit/Source/modules/background_sync/ServiceWorkerGlobalScopeSync.h index 42f4b3a3..d5dc737 100644 --- a/third_party/WebKit/Source/modules/background_sync/ServiceWorkerGlobalScopeSync.h +++ b/third_party/WebKit/Source/modules/background_sync/ServiceWorkerGlobalScopeSync.h
@@ -12,7 +12,6 @@ class ServiceWorkerGlobalScopeSync { public: DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(sync); - DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(periodicsync); }; } // namespace blink
diff --git a/third_party/WebKit/Source/modules/background_sync/SyncManager.cpp b/third_party/WebKit/Source/modules/background_sync/SyncManager.cpp index 1c38603..883e379 100644 --- a/third_party/WebKit/Source/modules/background_sync/SyncManager.cpp +++ b/third_party/WebKit/Source/modules/background_sync/SyncManager.cpp
@@ -58,9 +58,7 @@ WebSyncRegistration* webSyncRegistration = new WebSyncRegistration( WebSyncRegistration::UNREGISTERED_SYNC_ID /* id */, - WebSyncRegistration::PeriodicityOneShot, tag, - 0 /* minPeriod */, WebSyncRegistration::NetworkStateOnline /* networkState */ ); backgroundSyncProvider()->registerBackgroundSync(webSyncRegistration, m_registration->webRegistration(), context->isServiceWorkerGlobalScope(), new SyncRegistrationCallbacks(resolver, m_registration)); @@ -73,7 +71,7 @@ ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - backgroundSyncProvider()->getRegistrations(WebSyncRegistration::PeriodicityOneShot, m_registration->webRegistration(), new SyncGetRegistrationsCallbacks(resolver, m_registration)); + backgroundSyncProvider()->getRegistrations(m_registration->webRegistration(), new SyncGetRegistrationsCallbacks(resolver, m_registration)); return promise; }
diff --git a/third_party/WebKit/Source/modules/background_sync/SyncManager.h b/third_party/WebKit/Source/modules/background_sync/SyncManager.h index 2529574..891231f 100644 --- a/third_party/WebKit/Source/modules/background_sync/SyncManager.h +++ b/third_party/WebKit/Source/modules/background_sync/SyncManager.h
@@ -25,8 +25,6 @@ return new SyncManager(registration); } - unsigned long minAllowablePeriod(); - ScriptPromise registerFunction(ScriptState*, ExecutionContext*, const String&); ScriptPromise getTags(ScriptState*);
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothError.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothError.cpp index 2dc39c7..4b33616 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothError.cpp +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothError.cpp
@@ -61,6 +61,7 @@ // SecurityErrors: MAP_ERROR(GATTNotAuthorized, SecurityError, "GATT operation not authorized."); + MAP_ERROR(RequestDeviceWithUniqueOrigin, SecurityError, "requestDevice() called from sandboxed or otherwise unique origin."); MAP_ERROR(RequestDeviceWithoutFrame, SecurityError, "No window to show the requestDevice() dialog."); #undef MAP_ERROR
diff --git a/third_party/WebKit/Source/modules/device_orientation/DeviceOrientationInspectorAgent.cpp b/third_party/WebKit/Source/modules/device_orientation/DeviceOrientationInspectorAgent.cpp index a93380d..09d0884c 100644 --- a/third_party/WebKit/Source/modules/device_orientation/DeviceOrientationInspectorAgent.cpp +++ b/third_party/WebKit/Source/modules/device_orientation/DeviceOrientationInspectorAgent.cpp
@@ -5,7 +5,6 @@ #include "modules/device_orientation/DeviceOrientationInspectorAgent.h" #include "core/frame/LocalFrame.h" -#include "core/inspector/InspectorState.h" #include "core/page/Page.h" #include "modules/device_orientation/DeviceOrientationController.h" @@ -51,9 +50,9 @@ void DeviceOrientationInspectorAgent::setDeviceOrientationOverride(ErrorString* error, double alpha, double beta, double gamma) { m_state->setBoolean(DeviceOrientationInspectorAgentState::overrideEnabled, true); - m_state->setDouble(DeviceOrientationInspectorAgentState::alpha, alpha); - m_state->setDouble(DeviceOrientationInspectorAgentState::beta, beta); - m_state->setDouble(DeviceOrientationInspectorAgentState::gamma, gamma); + m_state->setNumber(DeviceOrientationInspectorAgentState::alpha, alpha); + m_state->setNumber(DeviceOrientationInspectorAgentState::beta, beta); + m_state->setNumber(DeviceOrientationInspectorAgentState::gamma, gamma); controller().setOverride(DeviceOrientationData::create(alpha, beta, gamma)); } @@ -71,10 +70,13 @@ void DeviceOrientationInspectorAgent::restore() { - if (m_state->getBoolean(DeviceOrientationInspectorAgentState::overrideEnabled)) { - double alpha = m_state->getDouble(DeviceOrientationInspectorAgentState::alpha); - double beta = m_state->getDouble(DeviceOrientationInspectorAgentState::beta); - double gamma = m_state->getDouble(DeviceOrientationInspectorAgentState::gamma); + if (m_state->booleanProperty(DeviceOrientationInspectorAgentState::overrideEnabled, false)) { + double alpha = 0; + m_state->getNumber(DeviceOrientationInspectorAgentState::alpha, &alpha); + double beta = 0; + m_state->getNumber(DeviceOrientationInspectorAgentState::beta, &beta); + double gamma = 0; + m_state->getNumber(DeviceOrientationInspectorAgentState::gamma, &gamma); controller().setOverride(DeviceOrientationData::create(alpha, beta, gamma)); } }
diff --git a/third_party/WebKit/Source/modules/filesystem/InspectorFileSystemAgent.cpp b/third_party/WebKit/Source/modules/filesystem/InspectorFileSystemAgent.cpp index f25d5cb76..5d48bc21 100644 --- a/third_party/WebKit/Source/modules/filesystem/InspectorFileSystemAgent.cpp +++ b/third_party/WebKit/Source/modules/filesystem/InspectorFileSystemAgent.cpp
@@ -45,7 +45,6 @@ #include "core/html/VoidCallback.h" #include "core/html/parser/TextResourceDecoder.h" #include "core/inspector/InspectedFrames.h" -#include "core/inspector/InspectorState.h" #include "modules/filesystem/DOMFileSystem.h" #include "modules/filesystem/DirectoryEntry.h" #include "modules/filesystem/DirectoryReader.h" @@ -731,7 +730,7 @@ void InspectorFileSystemAgent::restore() { - m_enabled = m_state->getBoolean(FileSystemAgentState::fileSystemAgentEnabled); + m_enabled = m_state->booleanProperty(FileSystemAgentState::fileSystemAgentEnabled, false); } InspectorFileSystemAgent::InspectorFileSystemAgent(InspectedFrames* inspectedFrames)
diff --git a/third_party/WebKit/Source/modules/gamepad/NavigatorGamepad.cpp b/third_party/WebKit/Source/modules/gamepad/NavigatorGamepad.cpp index bb3ad3ce..efad7b6 100644 --- a/third_party/WebKit/Source/modules/gamepad/NavigatorGamepad.cpp +++ b/third_party/WebKit/Source/modules/gamepad/NavigatorGamepad.cpp
@@ -220,7 +220,7 @@ void NavigatorGamepad::didAddEventListener(LocalDOMWindow*, const AtomicString& eventType) { if (isGamepadEvent(eventType)) { - if (page() && page()->visibilityState() == PageVisibilityStateVisible) + if (page() && page()->isPageVisible()) startUpdatingIfAttached(); m_hasEventListener = true; } @@ -250,7 +250,7 @@ void NavigatorGamepad::pageVisibilityChanged() { // Inform the embedder whether it needs to provide gamepad data for us. - bool visible = page()->visibilityState() == PageVisibilityStateVisible; + bool visible = page()->isPageVisible(); if (visible && (m_hasEventListener || m_gamepads)) startUpdatingIfAttached(); else
diff --git a/third_party/WebKit/Source/modules/geolocation/GeolocationController.cpp b/third_party/WebKit/Source/modules/geolocation/GeolocationController.cpp index e6522021..88a65026 100644 --- a/third_party/WebKit/Source/modules/geolocation/GeolocationController.cpp +++ b/third_party/WebKit/Source/modules/geolocation/GeolocationController.cpp
@@ -90,7 +90,7 @@ if (m_client) { if (enableHighAccuracy) m_client->setEnableHighAccuracy(true); - if (wasEmpty && page() && page()->visibilityState() == PageVisibilityStateVisible) + if (wasEmpty && page() && page()->isPageVisible()) startUpdatingIfNeeded(); } } @@ -170,7 +170,7 @@ if (m_observers.isEmpty() || !m_client) return; - if (page() && page()->visibilityState() == PageVisibilityStateVisible) + if (page() && page()->isPageVisible()) startUpdatingIfNeeded(); else stopUpdatingIfNeeded();
diff --git a/third_party/WebKit/Source/modules/indexeddb/InspectorIndexedDBAgent.cpp b/third_party/WebKit/Source/modules/indexeddb/InspectorIndexedDBAgent.cpp index 6ea1d86..322908a5 100644 --- a/third_party/WebKit/Source/modules/indexeddb/InspectorIndexedDBAgent.cpp +++ b/third_party/WebKit/Source/modules/indexeddb/InspectorIndexedDBAgent.cpp
@@ -40,7 +40,6 @@ #include "core/events/EventListener.h" #include "core/frame/LocalFrame.h" #include "core/inspector/InspectedFrames.h" -#include "core/inspector/InspectorState.h" #include "modules/IndexedDBNames.h" #include "modules/indexeddb/DOMWindowIndexedDatabase.h" #include "modules/indexeddb/IDBCursor.h" @@ -57,6 +56,7 @@ #include "modules/indexeddb/IDBRequest.h" #include "modules/indexeddb/IDBTransaction.h" #include "platform/JSONValues.h" +#include "platform/JSONValuesForV8.h" #include "platform/weborigin/SecurityOrigin.h" #include "public/platform/modules/indexeddb/WebIDBCursor.h" #include "public/platform/modules/indexeddb/WebIDBTypes.h" @@ -496,9 +496,9 @@ ScriptState* scriptState = m_scriptState.get(); v8::Isolate* isolate = scriptState->isolate(); ScriptState::Scope scope(scriptState); - RefPtr<JSONValue> keyJsonValue = ScriptValue::to<JSONValuePtr>(isolate, idbCursor->key(scriptState), exceptionState); - RefPtr<JSONValue> primaryKeyJsonValue = ScriptValue::to<JSONValuePtr>(isolate, idbCursor->primaryKey(scriptState), exceptionState); - RefPtr<JSONValue> valueJsonValue = ScriptValue::to<JSONValuePtr>(isolate, idbCursor->value(scriptState), exceptionState); + RefPtr<JSONValue> keyJsonValue = toJSONValue(isolate, idbCursor->key(scriptState).v8Value()); + RefPtr<JSONValue> primaryKeyJsonValue = toJSONValue(isolate, idbCursor->primaryKey(scriptState).v8Value()); + RefPtr<JSONValue> valueJsonValue = toJSONValue(isolate, idbCursor->value(scriptState).v8Value()); String key = keyJsonValue ? keyJsonValue->toJSONString() : errorMessage; String value = valueJsonValue ? valueJsonValue->toJSONString() : errorMessage; String primaryKey = primaryKeyJsonValue ? primaryKeyJsonValue->toJSONString() : errorMessage; @@ -507,7 +507,6 @@ .setPrimaryKey(primaryKey) .setValue(value); m_result->addItem(dataEntry); - } void end(bool hasMore) @@ -622,7 +621,7 @@ void InspectorIndexedDBAgent::restore() { - if (m_state->getBoolean(IndexedDBAgentState::indexedDBAgentEnabled)) { + if (m_state->booleanProperty(IndexedDBAgentState::indexedDBAgentEnabled, false)) { ErrorString error; enable(&error); }
diff --git a/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationController.cpp b/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationController.cpp index 52457c2..8e3c862 100644 --- a/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationController.cpp +++ b/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationController.cpp
@@ -106,7 +106,7 @@ bool ScreenOrientationController::isActiveAndVisible() const { - return m_orientation && frame() && page() && page()->visibilityState() == PageVisibilityStateVisible; + return m_orientation && frame() && page() && page()->isPageVisible(); } void ScreenOrientationController::pageVisibilityChanged() @@ -230,7 +230,7 @@ void ScreenOrientationController::notifyDispatcher() { - if (m_orientation && page()->visibilityState() == PageVisibilityStateVisible) + if (m_orientation && page()->isPageVisible()) startUpdating(); else stopUpdating();
diff --git a/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationInspectorAgent.cpp b/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationInspectorAgent.cpp index 1ee8add5..862aa667 100644 --- a/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationInspectorAgent.cpp +++ b/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationInspectorAgent.cpp
@@ -6,7 +6,6 @@ #include "core/InspectorTypeBuilder.h" #include "core/frame/LocalFrame.h" -#include "core/inspector/InspectorState.h" #include "modules/screen_orientation/ScreenOrientation.h" #include "modules/screen_orientation/ScreenOrientationController.h" @@ -74,8 +73,8 @@ return; } m_state->setBoolean(ScreenOrientationInspectorAgentState::overrideEnabled, true); - m_state->setLong(ScreenOrientationInspectorAgentState::angle, angle); - m_state->setLong(ScreenOrientationInspectorAgentState::type, type); + m_state->setNumber(ScreenOrientationInspectorAgentState::angle, angle); + m_state->setNumber(ScreenOrientationInspectorAgentState::type, type); controller->setOverride(type, angle); } @@ -99,9 +98,12 @@ void ScreenOrientationInspectorAgent::restore() { - if (m_state->getBoolean(ScreenOrientationInspectorAgentState::overrideEnabled)) { - WebScreenOrientationType type = static_cast<WebScreenOrientationType>(m_state->getLong(ScreenOrientationInspectorAgentState::type)); - int angle = m_state->getLong(ScreenOrientationInspectorAgentState::angle); + if (m_state->booleanProperty(ScreenOrientationInspectorAgentState::overrideEnabled, false)) { + long longType = static_cast<long>(WebScreenOrientationUndefined); + m_state->getNumber(ScreenOrientationInspectorAgentState::type, &longType); + WebScreenOrientationType type = static_cast<WebScreenOrientationType>(longType); + int angle = 0; + m_state->getNumber(ScreenOrientationInspectorAgentState::angle, &angle); if (ScreenOrientationController* controller = ScreenOrientationController::from(*m_frame)) controller->setOverride(type, angle); }
diff --git a/third_party/WebKit/Source/modules/storage/InspectorDOMStorageAgent.cpp b/third_party/WebKit/Source/modules/storage/InspectorDOMStorageAgent.cpp index 0e35c15..c82812e 100644 --- a/third_party/WebKit/Source/modules/storage/InspectorDOMStorageAgent.cpp +++ b/third_party/WebKit/Source/modules/storage/InspectorDOMStorageAgent.cpp
@@ -37,7 +37,6 @@ #include "core/frame/LocalDOMWindow.h" #include "core/frame/LocalFrame.h" #include "core/inspector/InspectedFrames.h" -#include "core/inspector/InspectorState.h" #include "core/page/Page.h" #include "modules/storage/Storage.h" #include "modules/storage/StorageNamespace.h" @@ -85,7 +84,7 @@ void InspectorDOMStorageAgent::restore() { - if (m_state->getBoolean(DOMStorageAgentState::domStorageAgentEnabled)) + if (m_state->booleanProperty(DOMStorageAgentState::domStorageAgentEnabled, false)) enable(0); }
diff --git a/third_party/WebKit/Source/modules/vibration/NavigatorVibration.cpp b/third_party/WebKit/Source/modules/vibration/NavigatorVibration.cpp index a3201a1..357b4ed1 100644 --- a/third_party/WebKit/Source/modules/vibration/NavigatorVibration.cpp +++ b/third_party/WebKit/Source/modules/vibration/NavigatorVibration.cpp
@@ -145,7 +145,7 @@ void NavigatorVibration::pageVisibilityChanged() { - if (page()->visibilityState() != PageVisibilityStateVisible) + if (!page()->isPageVisible()) cancelVibration(); } @@ -176,7 +176,7 @@ if (!page) return false; - if (page->visibilityState() != PageVisibilityStateVisible) + if (!page->isPageVisible()) return false; return NavigatorVibration::from(*page).vibrate(pattern);
diff --git a/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLock.cpp b/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLock.cpp index 2cfef2f..c3fe625ed 100644 --- a/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLock.cpp +++ b/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLock.cpp
@@ -104,8 +104,7 @@ if (!m_client) return; - bool visible = page() && page()->visibilityState() == PageVisibilityStateVisible; - m_client->requestKeepScreenAwake(m_keepAwake && visible); + m_client->requestKeepScreenAwake(m_keepAwake && page() && page()->isPageVisible()); } } // namespace blink
diff --git a/third_party/WebKit/Source/modules/webdatabase/InspectorDatabaseAgent.cpp b/third_party/WebKit/Source/modules/webdatabase/InspectorDatabaseAgent.cpp index c4ff82f7..91c0436 100644 --- a/third_party/WebKit/Source/modules/webdatabase/InspectorDatabaseAgent.cpp +++ b/third_party/WebKit/Source/modules/webdatabase/InspectorDatabaseAgent.cpp
@@ -31,7 +31,6 @@ #include "bindings/core/v8/ExceptionStatePlaceholder.h" #include "core/frame/LocalFrame.h" #include "core/html/VoidCallback.h" -#include "core/inspector/InspectorState.h" #include "core/loader/DocumentLoader.h" #include "core/page/Page.h" #include "modules/webdatabase/Database.h" @@ -272,7 +271,7 @@ void InspectorDatabaseAgent::restore() { - m_enabled = m_state->getBoolean(DatabaseAgentState::databaseAgentEnabled); + m_enabled = m_state->booleanProperty(DatabaseAgentState::databaseAgentEnabled, false); } void InspectorDatabaseAgent::getDatabaseTableNames(ErrorString* error, const String& databaseId, RefPtr<TypeBuilder::Array<String>>& names)
diff --git a/third_party/WebKit/Source/modules/webusb/NavigatorUSB.idl b/third_party/WebKit/Source/modules/webusb/NavigatorUSB.idl index e1bdb68..d916a0e 100644 --- a/third_party/WebKit/Source/modules/webusb/NavigatorUSB.idl +++ b/third_party/WebKit/Source/modules/webusb/NavigatorUSB.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// http://reillyeon.github.io/webusb/#device-enumeration +// http://wicg.github.io/webusb/#device-enumeration [ GarbageCollected,
diff --git a/third_party/WebKit/Source/modules/webusb/USB.idl b/third_party/WebKit/Source/modules/webusb/USB.idl index 40579775..2c7489c 100644 --- a/third_party/WebKit/Source/modules/webusb/USB.idl +++ b/third_party/WebKit/Source/modules/webusb/USB.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// http://reillyeon.github.io/webusb/#device-enumeration +// http://wicg.github.io/webusb/#device-enumeration [ GarbageCollected,
diff --git a/third_party/WebKit/Source/modules/webusb/USBAlternateInterface.idl b/third_party/WebKit/Source/modules/webusb/USBAlternateInterface.idl index 692460d..cbf37fa 100644 --- a/third_party/WebKit/Source/modules/webusb/USBAlternateInterface.idl +++ b/third_party/WebKit/Source/modules/webusb/USBAlternateInterface.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// http://reillyeon.github.io/webusb/#interfaces +// http://wicg.github.io/webusb/#interfaces [ Constructor(USBInterface deviceInterface, octet alternateSetting),
diff --git a/third_party/WebKit/Source/modules/webusb/USBConfiguration.idl b/third_party/WebKit/Source/modules/webusb/USBConfiguration.idl index 135aab7..3cd0ec97 100644 --- a/third_party/WebKit/Source/modules/webusb/USBConfiguration.idl +++ b/third_party/WebKit/Source/modules/webusb/USBConfiguration.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// http://reillyeon.github.io/webusb/#configurations +// http://wicg.github.io/webusb/#configurations [ Constructor(USBDevice device, octet configurationValue),
diff --git a/third_party/WebKit/Source/modules/webusb/USBConnectionEvent.idl b/third_party/WebKit/Source/modules/webusb/USBConnectionEvent.idl index 3080f98..beaba0e 100644 --- a/third_party/WebKit/Source/modules/webusb/USBConnectionEvent.idl +++ b/third_party/WebKit/Source/modules/webusb/USBConnectionEvent.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// http://reillyeon.github.io/webusb/#events +// http://wicg.github.io/webusb/#events [ Constructor(DOMString type, optional USBConnectionEventInit eventInitDict),
diff --git a/third_party/WebKit/Source/modules/webusb/USBConnectionEventInit.idl b/third_party/WebKit/Source/modules/webusb/USBConnectionEventInit.idl index 05115ad..797cf73 100644 --- a/third_party/WebKit/Source/modules/webusb/USBConnectionEventInit.idl +++ b/third_party/WebKit/Source/modules/webusb/USBConnectionEventInit.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// http://reillyeon.github.io/webusb/#events +// http://wicg.github.io/webusb/#events dictionary USBConnectionEventInit : EventInit { USBDevice device;
diff --git a/third_party/WebKit/Source/modules/webusb/USBDevice.idl b/third_party/WebKit/Source/modules/webusb/USBDevice.idl index 6e4c1e9..43d3c608e 100644 --- a/third_party/WebKit/Source/modules/webusb/USBDevice.idl +++ b/third_party/WebKit/Source/modules/webusb/USBDevice.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// http://reillyeon.github.io/webusb/#idl-def-usbtransferstatus +// http://wicg.github.io/webusb/#idl-def-usbtransferstatus enum USBTransferStatus { "ok", @@ -10,7 +10,7 @@ "babble" }; -// http://reillyeon.github.io/webusb/#device-usage +// http://wicg.github.io/webusb/#device-usage [ GarbageCollected,
diff --git a/third_party/WebKit/Source/modules/webusb/USBDeviceFilter.idl b/third_party/WebKit/Source/modules/webusb/USBDeviceFilter.idl index 541fefae..5d593796 100644 --- a/third_party/WebKit/Source/modules/webusb/USBDeviceFilter.idl +++ b/third_party/WebKit/Source/modules/webusb/USBDeviceFilter.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// http://reillyeon.github.io/webusb/#device-enumeration +// http://wicg.github.io/webusb/#device-enumeration dictionary USBDeviceFilter { unsigned short vendorId;
diff --git a/third_party/WebKit/Source/modules/webusb/USBDeviceRequestOptions.idl b/third_party/WebKit/Source/modules/webusb/USBDeviceRequestOptions.idl index e6df164a..eea3c39 100644 --- a/third_party/WebKit/Source/modules/webusb/USBDeviceRequestOptions.idl +++ b/third_party/WebKit/Source/modules/webusb/USBDeviceRequestOptions.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// http://reillyeon.github.io/webusb/#device-enumeration +// http://wicg.github.io/webusb/#device-enumeration dictionary USBDeviceRequestOptions { required sequence<USBDeviceFilter> filters;
diff --git a/third_party/WebKit/Source/modules/webusb/USBEndpoint.idl b/third_party/WebKit/Source/modules/webusb/USBEndpoint.idl index fd2eb48c..9124e6d 100644 --- a/third_party/WebKit/Source/modules/webusb/USBEndpoint.idl +++ b/third_party/WebKit/Source/modules/webusb/USBEndpoint.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// http://reillyeon.github.io/webusb/#endpoints +// http://wicg.github.io/webusb/#endpoints enum USBDirection { "in",
diff --git a/third_party/WebKit/Source/modules/webusb/USBInTransferResult.idl b/third_party/WebKit/Source/modules/webusb/USBInTransferResult.idl index 95f28f6b6..7b097b1 100644 --- a/third_party/WebKit/Source/modules/webusb/USBInTransferResult.idl +++ b/third_party/WebKit/Source/modules/webusb/USBInTransferResult.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// http://reillyeon.github.io/webusb/#idl-def-usbintransferresult +// http://wicg.github.io/webusb/#idl-def-usbintransferresult [ GarbageCollected,
diff --git a/third_party/WebKit/Source/modules/webusb/USBInterface.idl b/third_party/WebKit/Source/modules/webusb/USBInterface.idl index cfe1001..54e3734 100644 --- a/third_party/WebKit/Source/modules/webusb/USBInterface.idl +++ b/third_party/WebKit/Source/modules/webusb/USBInterface.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// http://reillyeon.github.io/webusb/#interfaces +// http://wicg.github.io/webusb/#interfaces [ Constructor(USBConfiguration configuration, octet interfaceNumber),
diff --git a/third_party/WebKit/Source/modules/webusb/USBOutTransferResult.idl b/third_party/WebKit/Source/modules/webusb/USBOutTransferResult.idl index cfbe8c34..b43587a 100644 --- a/third_party/WebKit/Source/modules/webusb/USBOutTransferResult.idl +++ b/third_party/WebKit/Source/modules/webusb/USBOutTransferResult.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// http://reillyeon.github.io/webusb/#idl-def-usbouttransferresult +// http://wicg.github.io/webusb/#idl-def-usbouttransferresult [ GarbageCollected,
diff --git a/third_party/WebKit/Source/platform/JSONValues.cpp b/third_party/WebKit/Source/platform/JSONValues.cpp index 3001d167..2dbca3a 100644 --- a/third_party/WebKit/Source/platform/JSONValues.cpp +++ b/third_party/WebKit/Source/platform/JSONValues.cpp
@@ -372,6 +372,13 @@ return it->value; } +bool JSONObjectBase::booleanProperty(const String& name, bool defaultValue) const +{ + bool result = defaultValue; + getBoolean(name, &result); + return result; +} + void JSONObjectBase::remove(const String& name) { m_data.remove(name);
diff --git a/third_party/WebKit/Source/platform/JSONValues.h b/third_party/WebKit/Source/platform/JSONValues.h index 44e42c1..4a06be7e 100644 --- a/third_party/WebKit/Source/platform/JSONValues.h +++ b/third_party/WebKit/Source/platform/JSONValues.h
@@ -210,6 +210,8 @@ PassRefPtr<JSONArray> getArray(const String& name) const; PassRefPtr<JSONValue> get(const String& name) const; + bool booleanProperty(const String& name, bool defaultValue) const; + void remove(const String& name); void prettyWriteJSONInternal(StringBuilder* output, int depth) const override; @@ -251,6 +253,8 @@ using JSONObjectBase::getArray; using JSONObjectBase::get; + using JSONObjectBase::booleanProperty; + using JSONObjectBase::remove; using JSONObjectBase::begin;
diff --git a/third_party/WebKit/Source/platform/JSONValuesForV8.cpp b/third_party/WebKit/Source/platform/JSONValuesForV8.cpp new file mode 100644 index 0000000..cbbee2c8 --- /dev/null +++ b/third_party/WebKit/Source/platform/JSONValuesForV8.cpp
@@ -0,0 +1,87 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "platform/JSONValuesForV8.h" + +namespace blink { + +static String coreString(v8::Local<v8::String> v8String) +{ + int length = v8String->Length(); + UChar* buffer; + String result = String::createUninitialized(length, buffer); + v8String->Write(reinterpret_cast<uint16_t*>(buffer), 0, length); + return result; +} + +PassRefPtr<JSONValue> toJSONValue(v8::Isolate* isolate, v8::Local<v8::Value> value, int maxDepth) +{ + if (value.IsEmpty()) { + ASSERT_NOT_REACHED(); + return nullptr; + } + + if (!maxDepth) + return nullptr; + maxDepth--; + + v8::Local<v8::Context> context = isolate->GetCurrentContext(); + if (value->IsNull() || value->IsUndefined()) + return JSONValue::null(); + if (value->IsBoolean()) + return JSONBasicValue::create(value.As<v8::Boolean>()->Value()); + if (value->IsNumber()) + return JSONBasicValue::create(value.As<v8::Number>()->Value()); + if (value->IsString()) + return JSONString::create(coreString(value.As<v8::String>())); + if (value->IsArray()) { + v8::Local<v8::Array> array = value.As<v8::Array>(); + RefPtr<JSONArray> inspectorArray = JSONArray::create(); + uint32_t length = array->Length(); + for (uint32_t i = 0; i < length; i++) { + v8::Local<v8::Value> value; + if (!array->Get(context, i).ToLocal(&value)) + return nullptr; + RefPtr<JSONValue> element = toJSONValue(isolate, value, maxDepth); + if (!element) + return nullptr; + inspectorArray->pushValue(element); + } + return inspectorArray; + } + if (value->IsObject()) { + RefPtr<JSONObject> jsonObject = JSONObject::create(); + v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value); + v8::Local<v8::Array> propertyNames; + if (!object->GetPropertyNames(context).ToLocal(&propertyNames)) + return nullptr; + uint32_t length = propertyNames->Length(); + for (uint32_t i = 0; i < length; i++) { + v8::Local<v8::Value> name; + if (!propertyNames->Get(context, i).ToLocal(&name)) + return nullptr; + // FIXME(yurys): v8::Object should support GetOwnPropertyNames + if (name->IsString()) { + v8::Maybe<bool> hasRealNamedProperty = object->HasRealNamedProperty(context, v8::Local<v8::String>::Cast(name)); + if (!hasRealNamedProperty.IsJust() || !hasRealNamedProperty.FromJust()) + continue; + } + v8::Local<v8::String> propertyName; + if (!name->ToString(context).ToLocal(&propertyName)) + continue; + v8::Local<v8::Value> property; + if (!object->Get(context, name).ToLocal(&property)) + return nullptr; + RefPtr<JSONValue> propertyValue = toJSONValue(isolate, property, maxDepth); + if (!propertyValue) + return nullptr; + jsonObject->setValue(coreString(propertyName), propertyValue); + } + return jsonObject; + } + ASSERT_NOT_REACHED(); + return nullptr; +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/JSONValuesForV8.h b/third_party/WebKit/Source/platform/JSONValuesForV8.h new file mode 100644 index 0000000..38c3f841 --- /dev/null +++ b/third_party/WebKit/Source/platform/JSONValuesForV8.h
@@ -0,0 +1,17 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef JSONValuesForV8_h +#define JSONValuesForV8_h + +#include "platform/JSONValues.h" +#include <v8.h> + +namespace blink { + +PLATFORM_EXPORT PassRefPtr<JSONValue> toJSONValue(v8::Isolate*, v8::Local<v8::Value>, int maxDepth = JSONValue::maxDepth); + +} // namespace blink + +#endif // JSONValuesForV8_h
diff --git a/third_party/WebKit/Source/platform/PartitionAllocMemoryDumpProvider.h b/third_party/WebKit/Source/platform/PartitionAllocMemoryDumpProvider.h index 81528529..84601b2 100644 --- a/third_party/WebKit/Source/platform/PartitionAllocMemoryDumpProvider.h +++ b/third_party/WebKit/Source/platform/PartitionAllocMemoryDumpProvider.h
@@ -13,6 +13,7 @@ namespace blink { class BLINK_PLATFORM_EXPORT PartitionAllocMemoryDumpProvider final : public WebMemoryDumpProvider { + USING_FAST_MALLOC(PartitionAllocMemoryDumpProvider); WTF_MAKE_NONCOPYABLE(PartitionAllocMemoryDumpProvider); public: static PartitionAllocMemoryDumpProvider* instance();
diff --git a/third_party/WebKit/Source/platform/blink_platform.gypi b/third_party/WebKit/Source/platform/blink_platform.gypi index ecab3fcb..5a2fbb0f 100644 --- a/third_party/WebKit/Source/platform/blink_platform.gypi +++ b/third_party/WebKit/Source/platform/blink_platform.gypi
@@ -44,6 +44,8 @@ 'HostWindow.h', 'JSONValues.cpp', 'JSONValues.h', + 'JSONValuesForV8.cpp', + 'JSONValuesForV8.h', 'KeyboardCodes.h', 'KillRing.h', 'KillRingNone.cpp',
diff --git a/third_party/WebKit/Source/platform/fonts/FontCacheMemoryDumpProvider.h b/third_party/WebKit/Source/platform/fonts/FontCacheMemoryDumpProvider.h index b7d61d9c..b69e7a5 100644 --- a/third_party/WebKit/Source/platform/fonts/FontCacheMemoryDumpProvider.h +++ b/third_party/WebKit/Source/platform/fonts/FontCacheMemoryDumpProvider.h
@@ -7,10 +7,12 @@ #include "platform/PlatformExport.h" #include "public/platform/WebMemoryDumpProvider.h" +#include "wtf/Allocator.h" namespace blink { class PLATFORM_EXPORT FontCacheMemoryDumpProvider final : public WebMemoryDumpProvider { + USING_FAST_MALLOC(FontCacheMemoryDumpProvider); public: static FontCacheMemoryDumpProvider* instance(); ~FontCacheMemoryDumpProvider() override { }
diff --git a/third_party/WebKit/Source/platform/graphics/Path.cpp b/third_party/WebKit/Source/platform/graphics/Path.cpp index c54308e5..f18b2f2 100644 --- a/third_party/WebKit/Source/platform/graphics/Path.cpp +++ b/third_party/WebKit/Source/platform/graphics/Path.cpp
@@ -331,6 +331,16 @@ m_path.arcTo(p1.data(), p2.data(), WebCoreFloatToSkScalar(radius)); } +void Path::addArcTo(const FloatPoint& p, const FloatSize& r, float xRotate, bool largeArc, bool sweep) +{ + m_path.arcTo( + WebCoreFloatToSkScalar(r.width()), WebCoreFloatToSkScalar(r.height()), + WebCoreFloatToSkScalar(xRotate), + largeArc ? SkPath::kLarge_ArcSize : SkPath::kSmall_ArcSize, + sweep ? SkPath::kCW_Direction : SkPath::kCCW_Direction, + WebCoreFloatToSkScalar(p.x()), WebCoreFloatToSkScalar(p.y())); +} + void Path::closeSubpath() { m_path.close();
diff --git a/third_party/WebKit/Source/platform/graphics/Path.h b/third_party/WebKit/Source/platform/graphics/Path.h index f2a4f72..c46b5ac1 100644 --- a/third_party/WebKit/Source/platform/graphics/Path.h +++ b/third_party/WebKit/Source/platform/graphics/Path.h
@@ -122,6 +122,7 @@ void addQuadCurveTo(const FloatPoint& controlPoint, const FloatPoint& endPoint); void addBezierCurveTo(const FloatPoint& controlPoint1, const FloatPoint& controlPoint2, const FloatPoint& endPoint); void addArcTo(const FloatPoint&, const FloatPoint&, float radius); + void addArcTo(const FloatPoint&, const FloatSize& r, float xRotate, bool largeArc, bool sweep); void closeSubpath(); void addArc(const FloatPoint&, float radius, float startAngle, float endAngle, bool anticlockwise);
diff --git a/third_party/WebKit/Source/platform/heap/BlinkGCInterruptor.h b/third_party/WebKit/Source/platform/heap/BlinkGCInterruptor.h index 8e9454ea..cdf14c6d 100644 --- a/third_party/WebKit/Source/platform/heap/BlinkGCInterruptor.h +++ b/third_party/WebKit/Source/platform/heap/BlinkGCInterruptor.h
@@ -6,6 +6,7 @@ #define BlinkGCInterruptor_h #include "platform/PlatformExport.h" +#include "wtf/Allocator.h" namespace blink { @@ -17,6 +18,7 @@ // to temporarily interrupt and pause this long running loop at // an arbitrary moment creating a safepoint for a GC. class PLATFORM_EXPORT BlinkGCInterruptor { + USING_FAST_MALLOC(BlinkGCInterruptor); public: virtual ~BlinkGCInterruptor() { }
diff --git a/third_party/WebKit/Source/platform/heap/BlinkGCMemoryDumpProvider.h b/third_party/WebKit/Source/platform/heap/BlinkGCMemoryDumpProvider.h index b2d7014..e855ab37 100644 --- a/third_party/WebKit/Source/platform/heap/BlinkGCMemoryDumpProvider.h +++ b/third_party/WebKit/Source/platform/heap/BlinkGCMemoryDumpProvider.h
@@ -7,6 +7,7 @@ #include "platform/PlatformExport.h" #include "public/platform/WebMemoryDumpProvider.h" +#include "wtf/Allocator.h" #include "wtf/OwnPtr.h" #include "wtf/text/WTFString.h" @@ -14,6 +15,7 @@ class WebMemoryAllocatorDump; class PLATFORM_EXPORT BlinkGCMemoryDumpProvider final : public WebMemoryDumpProvider { + USING_FAST_MALLOC(BlinkGCMemoryDumpProvider); public: static BlinkGCMemoryDumpProvider* instance(); ~BlinkGCMemoryDumpProvider() override;
diff --git a/third_party/WebKit/Source/platform/heap/CallbackStack.h b/third_party/WebKit/Source/platform/heap/CallbackStack.h index 0df03543..0d60ebc3 100644 --- a/third_party/WebKit/Source/platform/heap/CallbackStack.h +++ b/third_party/WebKit/Source/platform/heap/CallbackStack.h
@@ -6,6 +6,7 @@ #define CallbackStack_h #include "platform/heap/ThreadState.h" +#include "wtf/Allocator.h" #include "wtf/Assertions.h" namespace blink { @@ -15,9 +16,11 @@ // If more space is needed a new CallbackStack instance is created and chained // together with the former instance. I.e. a logical CallbackStack can be made of // multiple chained CallbackStack object instances. -class CallbackStack { +class CallbackStack final { + USING_FAST_MALLOC(CallbackStack); public: class Item { + DISALLOW_NEW(); public: Item() { } Item(void* object, VisitorCallback callback) @@ -54,6 +57,7 @@ static const size_t blockSize = 8192; class Block { + USING_FAST_MALLOC(Block); public: explicit Block(Block* next) : m_limit(&(m_buffer[blockSize]))
diff --git a/third_party/WebKit/Source/platform/heap/GCInfo.cpp b/third_party/WebKit/Source/platform/heap/GCInfo.cpp index d97508d2..2fb5d195 100644 --- a/third_party/WebKit/Source/platform/heap/GCInfo.cpp +++ b/third_party/WebKit/Source/platform/heap/GCInfo.cpp
@@ -49,7 +49,7 @@ size_t newSize = s_gcInfoTableSize ? 2 * s_gcInfoTableSize : initialSize; ASSERT(newSize < GCInfoTable::maxIndex); - s_gcInfoTable = reinterpret_cast<GCInfo const**>(realloc(s_gcInfoTable, newSize * sizeof(GCInfo))); + s_gcInfoTable = reinterpret_cast<GCInfo const**>(WTF::Partitions::fastRealloc(s_gcInfoTable, newSize * sizeof(GCInfo), "GCInfo")); ASSERT(s_gcInfoTable); memset(reinterpret_cast<uint8_t*>(s_gcInfoTable) + s_gcInfoTableSize * sizeof(GCInfo), gcInfoZapValue, (newSize - s_gcInfoTableSize) * sizeof(GCInfo)); s_gcInfoTableSize = newSize; @@ -63,7 +63,7 @@ void GCInfoTable::shutdown() { - free(s_gcInfoTable); + WTF::Partitions::fastFree(s_gcInfoTable); s_gcInfoTable = nullptr; }
diff --git a/third_party/WebKit/Source/platform/heap/GCInfo.h b/third_party/WebKit/Source/platform/heap/GCInfo.h index 534370d2..0b6c1bbc 100644 --- a/third_party/WebKit/Source/platform/heap/GCInfo.h +++ b/third_party/WebKit/Source/platform/heap/GCInfo.h
@@ -6,6 +6,7 @@ #define GCInfo_h #include "platform/heap/Visitor.h" +#include "wtf/Allocator.h" #include "wtf/Assertions.h" #include "wtf/Atomics.h" #include "wtf/Deque.h" @@ -29,6 +30,7 @@ template<typename T> struct FinalizerTraitImpl<T, true> { + STATIC_ONLY(FinalizerTraitImpl); static void finalize(void* obj) { static_assert(sizeof(T), "T must be fully defined"); @@ -38,6 +40,7 @@ template<typename T> struct FinalizerTraitImpl<T, false> { + STATIC_ONLY(FinalizerTraitImpl); static void finalize(void* obj) { static_assert(sizeof(T), "T must be fully defined"); @@ -53,6 +56,7 @@ // behavior is not desired. template<typename T> struct FinalizerTrait { + STATIC_ONLY(FinalizerTrait); static const bool nonTrivialFinalizer = WTF::IsSubclassOfTemplate<typename std::remove_const<T>::type, GarbageCollectedFinalized>::value; static void finalize(void* obj) { FinalizerTraitImpl<T, nonTrivialFinalizer>::finalize(obj); } }; @@ -64,36 +68,42 @@ template<typename T, typename U, typename V> struct FinalizerTrait<LinkedHashSet<T, U, V, HeapAllocator>> { + STATIC_ONLY(FinalizerTrait); static const bool nonTrivialFinalizer = true; static void finalize(void* obj) { FinalizerTraitImpl<LinkedHashSet<T, U, V, HeapAllocator>, nonTrivialFinalizer>::finalize(obj); } }; template<typename T, typename Allocator> struct FinalizerTrait<WTF::ListHashSetNode<T, Allocator>> { + STATIC_ONLY(FinalizerTrait); static const bool nonTrivialFinalizer = !WTF::IsTriviallyDestructible<T>::value; static void finalize(void* obj) { FinalizerTraitImpl<WTF::ListHashSetNode<T, Allocator>, nonTrivialFinalizer>::finalize(obj); } }; template<typename T, size_t inlineCapacity> struct FinalizerTrait<Vector<T, inlineCapacity, HeapAllocator>> { + STATIC_ONLY(FinalizerTrait); static const bool nonTrivialFinalizer = inlineCapacity && VectorTraits<T>::needsDestruction; static void finalize(void* obj) { FinalizerTraitImpl<Vector<T, inlineCapacity, HeapAllocator>, nonTrivialFinalizer>::finalize(obj); } }; template<typename T, size_t inlineCapacity> struct FinalizerTrait<Deque<T, inlineCapacity, HeapAllocator>> { + STATIC_ONLY(FinalizerTrait); static const bool nonTrivialFinalizer = inlineCapacity && VectorTraits<T>::needsDestruction; static void finalize(void* obj) { FinalizerTraitImpl<Deque<T, inlineCapacity, HeapAllocator>, nonTrivialFinalizer>::finalize(obj); } }; template<typename Table> struct FinalizerTrait<HeapHashTableBacking<Table>> { + STATIC_ONLY(FinalizerTrait); static const bool nonTrivialFinalizer = !WTF::IsTriviallyDestructible<typename Table::ValueType>::value; static void finalize(void* obj) { FinalizerTraitImpl<HeapHashTableBacking<Table>, nonTrivialFinalizer>::finalize(obj); } }; template<typename T, typename Traits> struct FinalizerTrait<HeapVectorBacking<T, Traits>> { + STATIC_ONLY(FinalizerTrait); static const bool nonTrivialFinalizer = Traits::needsDestruction; static void finalize(void* obj) { FinalizerTraitImpl<HeapVectorBacking<T, Traits>, nonTrivialFinalizer>::finalize(obj); } }; @@ -130,6 +140,7 @@ #endif class GCInfoTable { + STATIC_ONLY(GCInfoTable); public: PLATFORM_EXPORT static void ensureGCInfoIndex(const GCInfo*, size_t*); @@ -157,6 +168,7 @@ // for a given gcInfo. template<typename T> struct GCInfoAtBaseType { + STATIC_ONLY(GCInfoAtBaseType); static size_t index() { static_assert(sizeof(T), "T must be fully defined"); @@ -184,16 +196,19 @@ template<typename T> struct GetGarbageCollectedType<T, true> { + STATIC_ONLY(GetGarbageCollectedType); using type = typename T::GarbageCollectedType; }; template<typename T> struct GetGarbageCollectedType<T, false> { + STATIC_ONLY(GetGarbageCollectedType); using type = T; }; template<typename T> struct GCInfoTrait { + STATIC_ONLY(GCInfoTrait); static size_t index() { return GCInfoAtBaseType<typename GetGarbageCollectedType<T>::type>::index();
diff --git a/third_party/WebKit/Source/platform/heap/GCTaskRunner.h b/third_party/WebKit/Source/platform/heap/GCTaskRunner.h index 1e7b904b..631cf59e8 100644 --- a/third_party/WebKit/Source/platform/heap/GCTaskRunner.h +++ b/third_party/WebKit/Source/platform/heap/GCTaskRunner.h
@@ -51,7 +51,8 @@ } private: - class GCTask : public WebTaskRunner::Task { + class GCTask final : public WebTaskRunner::Task { + USING_FAST_MALLOC(GCTask); public: virtual ~GCTask() { } @@ -69,6 +70,7 @@ }; class GCTaskObserver final : public WebThread::TaskObserver { + USING_FAST_MALLOC(GCTaskObserver); public: GCTaskObserver() : m_nesting(0) { } @@ -100,6 +102,7 @@ }; class GCTaskRunner final { + USING_FAST_MALLOC(GCTaskRunner); public: explicit GCTaskRunner(WebThread* thread) : m_gcTaskObserver(adoptPtr(new GCTaskObserver))
diff --git a/third_party/WebKit/Source/platform/heap/Handle.h b/third_party/WebKit/Source/platform/heap/Handle.h index a131ebe..07873b330 100644 --- a/third_party/WebKit/Source/platform/heap/Handle.h +++ b/third_party/WebKit/Source/platform/heap/Handle.h
@@ -38,6 +38,7 @@ #include "platform/heap/ThreadState.h" #include "platform/heap/TraceTraits.h" #include "platform/heap/Visitor.h" +#include "wtf/Allocator.h" #include "wtf/Functional.h" #include "wtf/HashFunctions.h" #include "wtf/Locker.h" @@ -72,6 +73,7 @@ template<typename T, WeaknessPersistentConfiguration weaknessConfiguration, CrossThreadnessPersistentConfiguration crossThreadnessConfiguration> class PersistentBase { + USING_FAST_MALLOC(PersistentBase); IS_PERSISTENT_REFERENCE_TYPE(); public: PersistentBase() : m_raw(nullptr) @@ -701,6 +703,7 @@ // all Member fields of a live object will be traced marked as live as well. template<typename T> class Member { + DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); public: Member() : m_raw(nullptr) { @@ -1198,12 +1201,14 @@ template<typename T, bool = IsGarbageCollectedType<T>::value> class RawPtrOrMemberTrait { + STATIC_ONLY(RawPtrOrMemberTrait) public: using Type = RawPtr<T>; }; template<typename T> class RawPtrOrMemberTrait<T, true> { + STATIC_ONLY(RawPtrOrMemberTrait) public: using Type = Member<T>; }; @@ -1263,7 +1268,8 @@ // // template<typename Self> -class SelfKeepAlive { +class SelfKeepAlive final { + DISALLOW_NEW(); public: SelfKeepAlive() { @@ -1349,6 +1355,7 @@ namespace WTF { template<typename T> struct PtrHash<blink::Member<T>> : PtrHash<T*> { + STATIC_ONLY(PtrHash); template<typename U> static unsigned hash(const U& key) { return PtrHash<T*>::hash(key); } static bool equal(T* a, const blink::Member<T>& b) { return a == b; } @@ -1358,31 +1365,38 @@ }; template<typename T> struct PtrHash<blink::WeakMember<T>> : PtrHash<blink::Member<T>> { + STATIC_ONLY(PtrHash); }; template<typename T> struct PtrHash<blink::UntracedMember<T>> : PtrHash<blink::Member<T>> { + STATIC_ONLY(PtrHash); }; // PtrHash is the default hash for hash tables with members. template<typename T> struct DefaultHash<blink::Member<T>> { + STATIC_ONLY(DefaultHash); using Hash = PtrHash<blink::Member<T>>; }; template<typename T> struct DefaultHash<blink::WeakMember<T>> { + STATIC_ONLY(DefaultHash); using Hash = PtrHash<blink::WeakMember<T>>; }; template<typename T> struct DefaultHash<blink::UntracedMember<T>> { + STATIC_ONLY(DefaultHash); using Hash = PtrHash<blink::UntracedMember<T>>; }; template<typename T> struct NeedsTracing<blink::Member<T>> { + STATIC_ONLY(NeedsTracing); static const bool value = true; }; template<typename T> struct IsWeak<blink::WeakMember<T>> { + STATIC_ONLY(IsWeak); static const bool value = true; }; @@ -1401,6 +1415,7 @@ template<typename T> struct PointerParamStorageTraits<T*, false> { + STATIC_ONLY(PointerParamStorageTraits); static_assert(sizeof(T), "T must be fully defined"); using StorageType = T*; @@ -1410,6 +1425,7 @@ template<typename T> struct PointerParamStorageTraits<T*, true> { + STATIC_ONLY(PointerParamStorageTraits); static_assert(sizeof(T), "T must be fully defined"); using StorageType = blink::CrossThreadPersistent<T>; @@ -1419,16 +1435,19 @@ template<typename T> struct ParamStorageTraits<T*> : public PointerParamStorageTraits<T*, blink::IsGarbageCollectedType<T>::value> { + STATIC_ONLY(ParamStorageTraits); static_assert(sizeof(T), "T must be fully defined"); }; template<typename T> struct ParamStorageTraits<RawPtr<T>> : public PointerParamStorageTraits<T*, blink::IsGarbageCollectedType<T>::value> { + STATIC_ONLY(ParamStorageTraits); static_assert(sizeof(T), "T must be fully defined"); }; template<typename T> struct ParamStorageTraits<blink::CrossThreadWeakPersistentThisPointer<T>> { + STATIC_ONLY(ParamStorageTraits); static_assert(sizeof(T), "T must be fully defined"); using StorageType = blink::CrossThreadWeakPersistent<T>;
diff --git a/third_party/WebKit/Source/platform/heap/Heap.cpp b/third_party/WebKit/Source/platform/heap/Heap.cpp index 4972af8..9932fd4 100644 --- a/third_party/WebKit/Source/platform/heap/Heap.cpp +++ b/third_party/WebKit/Source/platform/heap/Heap.cpp
@@ -51,6 +51,7 @@ namespace blink { class GCForbiddenScope final { + DISALLOW_NEW(); public: explicit GCForbiddenScope(ThreadState* state) : m_state(state) @@ -69,6 +70,7 @@ }; class GCScope final { + STACK_ALLOCATED(); public: GCScope(ThreadState* state, BlinkGC::StackState stackState, BlinkGC::GCType gcType) : m_state(state) @@ -127,7 +129,8 @@ OwnPtr<Visitor> m_visitor; }; -class ResumeThreadScope { +class ResumeThreadScope final { + STACK_ALLOCATED(); public: explicit ResumeThreadScope(BlinkGC::GCType gcType) : m_resumeThreads(gcType != BlinkGC::ThreadTerminationGC)
diff --git a/third_party/WebKit/Source/platform/heap/Heap.h b/third_party/WebKit/Source/platform/heap/Heap.h index 84753b2..d60fef7 100644 --- a/third_party/WebKit/Source/platform/heap/Heap.h +++ b/third_party/WebKit/Source/platform/heap/Heap.h
@@ -38,6 +38,7 @@ #include "platform/heap/ThreadState.h" #include "platform/heap/Visitor.h" #include "wtf/AddressSanitizer.h" +#include "wtf/Allocator.h" #include "wtf/Assertions.h" #include "wtf/Atomics.h" #include "wtf/Forward.h" @@ -53,6 +54,7 @@ template<typename T> class ObjectAliveTrait<T, false> { + STATIC_ONLY(ObjectAliveTrait); public: static bool isHeapObjectAlive(T* object) { @@ -63,6 +65,7 @@ template<typename T> class ObjectAliveTrait<T, true> { + STATIC_ONLY(ObjectAliveTrait); public: static bool isHeapObjectAlive(T* object) { @@ -72,6 +75,7 @@ }; class PLATFORM_EXPORT Heap { + STATIC_ONLY(Heap); public: static void init(); static void shutdown(); @@ -302,6 +306,7 @@ template<typename T> struct IsEagerlyFinalizedType { + STATIC_ONLY(IsEagerlyFinalizedType); private: typedef char YesType; struct NoType { @@ -406,6 +411,7 @@ #define IS_EAGERLY_FINALIZED() (pageFromObject(this)->heap()->heapIndex() == BlinkGC::EagerSweepHeapIndex) #if ENABLE(ASSERT) && ENABLE(OILPAN) class VerifyEagerFinalization { + DISALLOW_NEW(); public: ~VerifyEagerFinalization() {
diff --git a/third_party/WebKit/Source/platform/heap/HeapAllocator.h b/third_party/WebKit/Source/platform/heap/HeapAllocator.h index aaeef62..c5bf937 100644 --- a/third_party/WebKit/Source/platform/heap/HeapAllocator.h +++ b/third_party/WebKit/Source/platform/heap/HeapAllocator.h
@@ -7,6 +7,7 @@ #include "platform/heap/Heap.h" #include "platform/heap/TraceTraits.h" +#include "wtf/Allocator.h" #include "wtf/Assertions.h" #include "wtf/Atomics.h" #include "wtf/Deque.h" @@ -24,6 +25,7 @@ // This is a static-only class used as a trait on collections to make them heap // allocated. However see also HeapListHashSetAllocator. class PLATFORM_EXPORT HeapAllocator { + STATIC_ONLY(HeapAllocator); public: using Visitor = blink::Visitor; static const bool isGarbageCollected = true; @@ -200,11 +202,13 @@ // objects are instantiated. template<typename ValueArg, size_t inlineCapacity> class HeapListHashSetAllocator : public HeapAllocator { + DISALLOW_NEW(); public: using TableAllocator = HeapAllocator; using Node = WTF::ListHashSetNode<ValueArg, HeapListHashSetAllocator>; class AllocatorProvider { + DISALLOW_NEW(); public: // For the heap allocation we don't need an actual allocator object, so // we just return null. @@ -240,6 +244,7 @@ }; template<typename T, typename Traits = WTF::VectorTraits<T>> class HeapVectorBacking { + DISALLOW_NEW(); public: static void finalize(void* pointer); void finalizeGarbageCollectedObject() { finalize(this); } @@ -277,6 +282,7 @@ } template<typename Table> class HeapHashTableBacking { + DISALLOW_NEW(); public: static void finalize(void* pointer); void finalizeGarbageCollectedObject() { finalize(this); } @@ -396,6 +402,7 @@ namespace WTF { template <typename T> struct VectorTraits<blink::Member<T>> : VectorTraitsBase<blink::Member<T>> { + STATIC_ONLY(VectorTraits); static const bool needsDestruction = false; static const bool canInitializeWithMemset = true; static const bool canClearUnusedSlotsWithMemset = true; @@ -403,6 +410,7 @@ }; template <typename T> struct VectorTraits<blink::WeakMember<T>> : VectorTraitsBase<blink::WeakMember<T>> { + STATIC_ONLY(VectorTraits); static const bool needsDestruction = false; static const bool canInitializeWithMemset = true; static const bool canClearUnusedSlotsWithMemset = true; @@ -410,6 +418,7 @@ }; template <typename T> struct VectorTraits<blink::UntracedMember<T>> : VectorTraitsBase<blink::UntracedMember<T>> { + STATIC_ONLY(VectorTraits); static const bool needsDestruction = false; static const bool canInitializeWithMemset = true; static const bool canClearUnusedSlotsWithMemset = true; @@ -417,6 +426,7 @@ }; template <typename T> struct VectorTraits<blink::HeapVector<T, 0>> : VectorTraitsBase<blink::HeapVector<T, 0>> { + STATIC_ONLY(VectorTraits); static const bool needsDestruction = false; static const bool canInitializeWithMemset = true; static const bool canClearUnusedSlotsWithMemset = true; @@ -424,6 +434,7 @@ }; template <typename T> struct VectorTraits<blink::HeapDeque<T, 0>> : VectorTraitsBase<blink::HeapDeque<T, 0>> { + STATIC_ONLY(VectorTraits); static const bool needsDestruction = false; static const bool canInitializeWithMemset = true; static const bool canClearUnusedSlotsWithMemset = true; @@ -431,6 +442,7 @@ }; template <typename T, size_t inlineCapacity> struct VectorTraits<blink::HeapVector<T, inlineCapacity>> : VectorTraitsBase<blink::HeapVector<T, inlineCapacity>> { + STATIC_ONLY(VectorTraits); static const bool needsDestruction = VectorTraits<T>::needsDestruction; static const bool canInitializeWithMemset = VectorTraits<T>::canInitializeWithMemset; static const bool canClearUnusedSlotsWithMemset = VectorTraits<T>::canClearUnusedSlotsWithMemset; @@ -438,6 +450,7 @@ }; template <typename T, size_t inlineCapacity> struct VectorTraits<blink::HeapDeque<T, inlineCapacity>> : VectorTraitsBase<blink::HeapDeque<T, inlineCapacity>> { + STATIC_ONLY(VectorTraits); static const bool needsDestruction = VectorTraits<T>::needsDestruction; static const bool canInitializeWithMemset = VectorTraits<T>::canInitializeWithMemset; static const bool canClearUnusedSlotsWithMemset = VectorTraits<T>::canClearUnusedSlotsWithMemset; @@ -445,6 +458,7 @@ }; template<typename T> struct HashTraits<blink::Member<T>> : SimpleClassHashTraits<blink::Member<T>> { + STATIC_ONLY(HashTraits); // FIXME: The distinction between PeekInType and PassInType is there for // the sake of the reference counting handles. When they are gone the two // types can be merged into PassInType. @@ -471,6 +485,7 @@ }; template<typename T> struct HashTraits<blink::WeakMember<T>> : SimpleClassHashTraits<blink::WeakMember<T>> { + STATIC_ONLY(HashTraits); static const bool needsDestruction = false; // FIXME: The distinction between PeekInType and PassInType is there for // the sake of the reference counting handles. When they are gone the two @@ -508,6 +523,7 @@ }; template<typename T> struct HashTraits<blink::UntracedMember<T>> : SimpleClassHashTraits<blink::UntracedMember<T>> { + STATIC_ONLY(HashTraits); static const bool needsDestruction = false; // FIXME: The distinction between PeekInType and PassInType is there for // the sake of the reference counting handles. When they are gone the two @@ -535,6 +551,7 @@ template<typename T, size_t inlineCapacity> struct NeedsTracing<ListHashSetNode<T, blink::HeapListHashSetAllocator<T, inlineCapacity>> *> { + STATIC_ONLY(NeedsTracing); static_assert(sizeof(T), "T must be fully defined"); // All heap allocated node pointers need visiting to keep the nodes alive, // regardless of whether they contain pointers to other heap allocated
diff --git a/third_party/WebKit/Source/platform/heap/HeapLinkedStack.h b/third_party/WebKit/Source/platform/heap/HeapLinkedStack.h index 4d89073f..dbb7db1 100644 --- a/third_party/WebKit/Source/platform/heap/HeapLinkedStack.h +++ b/third_party/WebKit/Source/platform/heap/HeapLinkedStack.h
@@ -33,6 +33,7 @@ #include "platform/heap/Heap.h" #include "platform/heap/Visitor.h" +#include "wtf/Allocator.h" namespace blink { @@ -112,6 +113,7 @@ template<typename T> class TraceEagerlyTrait<HeapLinkedStack<T>> { + STATIC_ONLY(TraceEagerlyTrait); public: static const bool value = TraceEagerlyTrait<T>::value; };
diff --git a/third_party/WebKit/Source/platform/heap/HeapPage.cpp b/third_party/WebKit/Source/platform/heap/HeapPage.cpp index 48fef56b..637100d 100644 --- a/third_party/WebKit/Source/platform/heap/HeapPage.cpp +++ b/third_party/WebKit/Source/platform/heap/HeapPage.cpp
@@ -1510,16 +1510,17 @@ size_t deadCount = 0; HeapObjectHeader* header = heapObjectHeader(); size_t gcInfoIndex = header->gcInfoIndex(); + size_t payloadSize = header->payloadSize(); if (header->isMarked()) { liveCount = 1; - liveSize += header->payloadSize(); + liveSize += payloadSize; info.liveCount[gcInfoIndex]++; - info.liveSize[gcInfoIndex] += header->size(); + info.liveSize[gcInfoIndex] += payloadSize; } else { deadCount = 1; - deadSize += header->payloadSize(); + deadSize += payloadSize; info.deadCount[gcInfoIndex]++; - info.deadSize[gcInfoIndex] += header->size(); + info.deadSize[gcInfoIndex] += payloadSize; } pageDump->addScalar("live_count", "objects", liveCount);
diff --git a/third_party/WebKit/Source/platform/heap/HeapPage.h b/third_party/WebKit/Source/platform/heap/HeapPage.h index b35988a..bea2e806 100644 --- a/third_party/WebKit/Source/platform/heap/HeapPage.h +++ b/third_party/WebKit/Source/platform/heap/HeapPage.h
@@ -37,6 +37,7 @@ #include "platform/heap/ThreadState.h" #include "platform/heap/Visitor.h" #include "wtf/AddressSanitizer.h" +#include "wtf/Allocator.h" #include "wtf/Assertions.h" #include "wtf/Atomics.h" #include "wtf/ContainerAnnotations.h" @@ -165,6 +166,7 @@ static_assert(nonLargeObjectPageSizeMax >= blinkPageSize, "max size supported by HeapObjectHeader must at least be blinkPageSize"); class PLATFORM_EXPORT HeapObjectHeader { + DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); public: // If gcInfoIndex is 0, this header is interpreted as a free list header. NO_SANITIZE_ADDRESS @@ -348,6 +350,7 @@ // Note: An object whose size is between |largeObjectSizeThreshold| and // |blinkPageSize| can go to either of NormalPage or LargeObjectPage. class BasePage { + DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); public: BasePage(PageMemory*, BaseHeap*); virtual ~BasePage() { } @@ -574,10 +577,10 @@ // The HeapDoesNotContainCache is a negative cache, so it must be flushed when // memory is added to the heap. class HeapDoesNotContainCache { + USING_FAST_MALLOC(HeapDoesNotContainCache); public: HeapDoesNotContainCache() - : m_entries(adoptArrayPtr(new Address[HeapDoesNotContainCache::numberOfEntries])) - , m_hasEntries(false) + : m_hasEntries(false) { // Start by flushing the cache in a non-empty state to initialize all the cache entries. for (int i = 0; i < numberOfEntries; ++i) @@ -606,11 +609,12 @@ static size_t hash(Address); - WTF::OwnPtr<Address[]> m_entries; + Address m_entries[numberOfEntries]; bool m_hasEntries; }; class FreeList { + DISALLOW_NEW(); public: FreeList(); @@ -646,6 +650,7 @@ // NormalPageHeap represents a heap that contains NormalPages // and LargeObjectHeap represents a heap that contains LargeObjectPages. class PLATFORM_EXPORT BaseHeap { + USING_FAST_MALLOC(BaseHeap); public: BaseHeap(ThreadState*, int); virtual ~BaseHeap();
diff --git a/third_party/WebKit/Source/platform/heap/HeapTerminatedArray.h b/third_party/WebKit/Source/platform/heap/HeapTerminatedArray.h index be0bd91..e87ba2c 100644 --- a/third_party/WebKit/Source/platform/heap/HeapTerminatedArray.h +++ b/third_party/WebKit/Source/platform/heap/HeapTerminatedArray.h
@@ -27,7 +27,8 @@ private: // Allocator describes how HeapTerminatedArrayBuilder should create new intances // of TerminateArray and manage their lifetimes. - struct Allocator { + struct Allocator final { + STATIC_ONLY(Allocator); typedef HeapTerminatedArray* PassPtr; typedef RawPtr<HeapTerminatedArray> Ptr;
diff --git a/third_party/WebKit/Source/platform/heap/HeapTerminatedArrayBuilder.h b/third_party/WebKit/Source/platform/heap/HeapTerminatedArrayBuilder.h index ec5077c..192f009 100644 --- a/third_party/WebKit/Source/platform/heap/HeapTerminatedArrayBuilder.h +++ b/third_party/WebKit/Source/platform/heap/HeapTerminatedArrayBuilder.h
@@ -12,7 +12,7 @@ namespace blink { template<typename T> -class HeapTerminatedArrayBuilder : public TerminatedArrayBuilder<T, HeapTerminatedArray> { +class HeapTerminatedArrayBuilder final : public TerminatedArrayBuilder<T, HeapTerminatedArray> { public: explicit HeapTerminatedArrayBuilder(HeapTerminatedArray<T>* array) : TerminatedArrayBuilder<T, HeapTerminatedArray>(array) { } };
diff --git a/third_party/WebKit/Source/platform/heap/MarkingVisitorImpl.h b/third_party/WebKit/Source/platform/heap/MarkingVisitorImpl.h index 99ac12e..47174b3 100644 --- a/third_party/WebKit/Source/platform/heap/MarkingVisitorImpl.h +++ b/third_party/WebKit/Source/platform/heap/MarkingVisitorImpl.h
@@ -8,6 +8,7 @@ #include "platform/heap/Heap.h" #include "platform/heap/ThreadState.h" #include "platform/heap/Visitor.h" +#include "wtf/Allocator.h" #include "wtf/Functional.h" #include "wtf/HashFunctions.h" #include "wtf/Locker.h" @@ -19,6 +20,7 @@ template <typename Derived> class MarkingVisitorImpl { + USING_FAST_MALLOC(MarkingVisitorImpl); protected: inline void markHeader(HeapObjectHeader* header, const void* objectPointer, TraceCallback callback) {
diff --git a/third_party/WebKit/Source/platform/heap/PageMemory.h b/third_party/WebKit/Source/platform/heap/PageMemory.h index 51cfe9a..61b7038 100644 --- a/third_party/WebKit/Source/platform/heap/PageMemory.h +++ b/third_party/WebKit/Source/platform/heap/PageMemory.h
@@ -6,6 +6,7 @@ #define PageMemory_h #include "platform/heap/HeapPage.h" +#include "wtf/Allocator.h" #include "wtf/Assertions.h" #include "wtf/PageAllocator.h" @@ -17,6 +18,7 @@ namespace blink { class MemoryRegion { + USING_FAST_MALLOC(MemoryRegion); public: MemoryRegion(Address base, size_t size) : m_base(base) @@ -118,6 +120,7 @@ // A RegionTree is a simple binary search tree of PageMemoryRegions sorted // by base addresses. class RegionTree { + USING_FAST_MALLOC(RegionTree); public: explicit RegionTree(PageMemoryRegion* region) : m_region(region) @@ -160,6 +163,7 @@ // // Guard pages are created before and after the writable memory. class PageMemory { + USING_FAST_MALLOC(PageMemory); public: ~PageMemory() {
diff --git a/third_party/WebKit/Source/platform/heap/PagePool.h b/third_party/WebKit/Source/platform/heap/PagePool.h index c33a8e2..34633ed 100644 --- a/third_party/WebKit/Source/platform/heap/PagePool.h +++ b/third_party/WebKit/Source/platform/heap/PagePool.h
@@ -6,6 +6,7 @@ #define PagePool_h #include "platform/heap/ThreadState.h" +#include "wtf/Allocator.h" #include "wtf/ThreadingPrimitives.h" namespace blink { @@ -15,6 +16,7 @@ template<typename DataType> class PagePool { + USING_FAST_MALLOC(PagePool); protected: PagePool() { @@ -23,6 +25,7 @@ } class PoolEntry { + USING_FAST_MALLOC(PoolEntry); public: PoolEntry(DataType* data, PoolEntry* next) : data(data)
diff --git a/third_party/WebKit/Source/platform/heap/PersistentNode.h b/third_party/WebKit/Source/platform/heap/PersistentNode.h index f6ebddbfe..5fb806f8 100644 --- a/third_party/WebKit/Source/platform/heap/PersistentNode.h +++ b/third_party/WebKit/Source/platform/heap/PersistentNode.h
@@ -7,6 +7,7 @@ #include "platform/PlatformExport.h" #include "platform/heap/ThreadState.h" +#include "wtf/Allocator.h" #include "wtf/Assertions.h" #include "wtf/MainThread.h" #include "wtf/ThreadingPrimitives.h" @@ -16,6 +17,7 @@ class CrossThreadPersistentRegion; class PersistentNode final { + DISALLOW_NEW(); public: PersistentNode() : m_self(nullptr) @@ -96,6 +98,7 @@ }; struct PersistentNodeSlots final { + USING_FAST_MALLOC(PersistentNodeSlots); private: static const int slotCount = 256; PersistentNodeSlots* m_next; @@ -109,6 +112,7 @@ // a predefined number of PersistentNodes. You can call allocatePersistentNode/ // freePersistentNode to allocate/free a PersistentNode on the region. class PLATFORM_EXPORT PersistentRegion final { + USING_FAST_MALLOC(PersistentRegion); public: PersistentRegion() : m_freeListHead(nullptr) @@ -159,6 +163,7 @@ }; class CrossThreadPersistentRegion final { + USING_FAST_MALLOC(CrossThreadPersistentRegion); public: CrossThreadPersistentRegion() : m_persistentRegion(adoptPtr(new PersistentRegion)) { }
diff --git a/third_party/WebKit/Source/platform/heap/SafePoint.h b/third_party/WebKit/Source/platform/heap/SafePoint.h index 0b96633b..4e3c8f4 100644 --- a/third_party/WebKit/Source/platform/heap/SafePoint.h +++ b/third_party/WebKit/Source/platform/heap/SafePoint.h
@@ -11,6 +11,7 @@ namespace blink { class SafePointScope final { + STACK_ALLOCATED(); WTF_MAKE_NONCOPYABLE(SafePointScope); public: explicit SafePointScope(BlinkGC::StackState stackState, ThreadState* state = ThreadState::current()) @@ -38,6 +39,7 @@ // leaveSafePoint method cannot complete without blocking, see // SafePointBarrier::checkAndPark. class SafePointAwareMutexLocker final { + STACK_ALLOCATED(); WTF_MAKE_NONCOPYABLE(SafePointAwareMutexLocker); public: explicit SafePointAwareMutexLocker(MutexBase& mutex, BlinkGC::StackState stackState = BlinkGC::HeapPointersOnStack) @@ -88,6 +90,7 @@ }; class SafePointBarrier final { + USING_FAST_MALLOC(SafePointBarrier); WTF_MAKE_NONCOPYABLE(SafePointBarrier); public: SafePointBarrier();
diff --git a/third_party/WebKit/Source/platform/heap/StackFrameDepth.h b/third_party/WebKit/Source/platform/heap/StackFrameDepth.h index bb6591f..35a4dc41 100644 --- a/third_party/WebKit/Source/platform/heap/StackFrameDepth.h +++ b/third_party/WebKit/Source/platform/heap/StackFrameDepth.h
@@ -6,6 +6,7 @@ #define StackFrameDepth_h #include "platform/PlatformExport.h" +#include "wtf/Allocator.h" #include "wtf/Assertions.h" #include <cstddef> #include <stdint.h> @@ -16,6 +17,7 @@ // Use isSafeToRecurse() to query if there is a room in current // call stack for more recursive call. class PLATFORM_EXPORT StackFrameDepth final { + STATIC_ONLY(StackFrameDepth); public: inline static bool isSafeToRecurse() { @@ -78,6 +80,8 @@ }; class StackFrameDepthScope { + STACK_ALLOCATED(); + WTF_MAKE_NONCOPYABLE(StackFrameDepthScope); public: StackFrameDepthScope() {
diff --git a/third_party/WebKit/Source/platform/heap/ThreadState.h b/third_party/WebKit/Source/platform/heap/ThreadState.h index b43767d..141f708 100644 --- a/third_party/WebKit/Source/platform/heap/ThreadState.h +++ b/third_party/WebKit/Source/platform/heap/ThreadState.h
@@ -37,6 +37,7 @@ #include "platform/heap/ThreadingTraits.h" #include "public/platform/WebThread.h" #include "wtf/AddressSanitizer.h" +#include "wtf/Allocator.h" #include "wtf/Forward.h" #include "wtf/HashMap.h" #include "wtf/HashSet.h" @@ -119,6 +120,7 @@ #endif class PLATFORM_EXPORT ThreadState { + USING_FAST_MALLOC(ThreadState); WTF_MAKE_NONCOPYABLE(ThreadState); public: typedef std::pair<void*, PreFinalizerCallback> PreFinalizer; @@ -141,6 +143,7 @@ // The NoAllocationScope class is used in debug mode to catch unwanted // allocations. E.g. allocations during GC. class NoAllocationScope final { + STACK_ALLOCATED(); public: explicit NoAllocationScope(ThreadState* state) : m_state(state) { @@ -155,6 +158,7 @@ }; class SweepForbiddenScope final { + STACK_ALLOCATED(); public: explicit SweepForbiddenScope(ThreadState* state) : m_state(state) { @@ -379,6 +383,7 @@ void visitPersistents(Visitor*); struct GCSnapshotInfo { + STACK_ALLOCATED(); GCSnapshotInfo(size_t numObjectTypes); // Map from gcInfoIndex (vector-index) to count/size. @@ -678,6 +683,7 @@ template<ThreadAffinity affinity> class ThreadStateFor; template<> class ThreadStateFor<MainThreadOnly> { + STATIC_ONLY(ThreadStateFor); public: static ThreadState* state() { @@ -688,6 +694,7 @@ }; template<> class ThreadStateFor<AnyThread> { + STATIC_ONLY(ThreadStateFor); public: static ThreadState* state() { return ThreadState::current(); } };
diff --git a/third_party/WebKit/Source/platform/heap/ThreadingTraits.h b/third_party/WebKit/Source/platform/heap/ThreadingTraits.h index fef13ef..0831fd7 100644 --- a/third_party/WebKit/Source/platform/heap/ThreadingTraits.h +++ b/third_party/WebKit/Source/platform/heap/ThreadingTraits.h
@@ -5,6 +5,7 @@ #ifndef ThreadingTraits_h #define ThreadingTraits_h +#include "wtf/Allocator.h" #include "wtf/Deque.h" #include "wtf/HashCountedSet.h" #include "wtf/HashMap.h" @@ -40,11 +41,13 @@ template<typename T> struct DefaultThreadingTrait<T, false> { + STATIC_ONLY(DefaultThreadingTrait); static const ThreadAffinity Affinity = AnyThread; }; template<typename T> struct DefaultThreadingTrait<T, true> { + STATIC_ONLY(DefaultThreadingTrait); static const ThreadAffinity Affinity = MainThreadOnly; }; @@ -56,6 +59,7 @@ template<typename T> struct ThreadingTrait { + STATIC_ONLY(ThreadingTrait); static const ThreadAffinity Affinity = DefaultThreadingTrait<T>::Affinity; }; @@ -63,16 +67,19 @@ template<typename T> struct ThreadingTrait<Member<T>> { + STATIC_ONLY(ThreadingTrait); static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; }; template<typename T> struct ThreadingTrait<WeakMember<T>> { + STATIC_ONLY(ThreadingTrait); static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; }; template<typename Key, typename Value, typename T, typename U, typename V> struct ThreadingTrait<HashMap<Key, Value, T, U, V, HeapAllocator>> { + STATIC_ONLY(ThreadingTrait); static const ThreadAffinity Affinity = (ThreadingTrait<Key>::Affinity == MainThreadOnly) && (ThreadingTrait<Value>::Affinity == MainThreadOnly) ? MainThreadOnly : AnyThread; @@ -80,6 +87,7 @@ template<typename First, typename Second> struct ThreadingTrait<WTF::KeyValuePair<First, Second>> { + STATIC_ONLY(ThreadingTrait); static const ThreadAffinity Affinity = (ThreadingTrait<First>::Affinity == MainThreadOnly) && (ThreadingTrait<Second>::Affinity == MainThreadOnly) ? MainThreadOnly : AnyThread; @@ -87,31 +95,37 @@ template<typename T, typename U, typename V> struct ThreadingTrait<HashSet<T, U, V, HeapAllocator>> { + STATIC_ONLY(ThreadingTrait); static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; }; template<typename T, size_t inlineCapacity> struct ThreadingTrait<Vector<T, inlineCapacity, HeapAllocator>> { + STATIC_ONLY(ThreadingTrait); static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; }; template<typename T, typename Traits> struct ThreadingTrait<HeapVectorBacking<T, Traits>> { + STATIC_ONLY(ThreadingTrait); static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; }; template<typename T, size_t inlineCapacity> struct ThreadingTrait<Deque<T, inlineCapacity, HeapAllocator>> { + STATIC_ONLY(ThreadingTrait); static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; }; template<typename T, typename U, typename V> struct ThreadingTrait<HashCountedSet<T, U, V, HeapAllocator>> { + STATIC_ONLY(ThreadingTrait); static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; }; template<typename Table> struct ThreadingTrait<HeapHashTableBacking<Table>> { + STATIC_ONLY(ThreadingTrait); using Key = typename Table::KeyType; using Value = typename Table::ValueType; static const ThreadAffinity Affinity = @@ -126,15 +140,25 @@ template<typename T, typename U, typename V> class HeapHashCountedSet; template<typename T, typename U, typename V, typename W, typename X> -struct ThreadingTrait<HeapHashMap<T, U, V, W, X>> : public ThreadingTrait<HashMap<T, U, V, W, X, HeapAllocator>> { }; +struct ThreadingTrait<HeapHashMap<T, U, V, W, X>> : public ThreadingTrait<HashMap<T, U, V, W, X, HeapAllocator>> { + STATIC_ONLY(ThreadingTrait); +}; template<typename T, typename U, typename V> -struct ThreadingTrait<HeapHashSet<T, U, V>> : public ThreadingTrait<HashSet<T, U, V, HeapAllocator>> { }; +struct ThreadingTrait<HeapHashSet<T, U, V>> : public ThreadingTrait<HashSet<T, U, V, HeapAllocator>> { + STATIC_ONLY(ThreadingTrait); +}; template<typename T, size_t inlineCapacity> -struct ThreadingTrait<HeapVector<T, inlineCapacity>> : public ThreadingTrait<Vector<T, inlineCapacity, HeapAllocator>> { }; +struct ThreadingTrait<HeapVector<T, inlineCapacity>> : public ThreadingTrait<Vector<T, inlineCapacity, HeapAllocator>> { + STATIC_ONLY(ThreadingTrait); +}; template<typename T, size_t inlineCapacity> -struct ThreadingTrait<HeapDeque<T, inlineCapacity>> : public ThreadingTrait<Deque<T, inlineCapacity, HeapAllocator>> { }; +struct ThreadingTrait<HeapDeque<T, inlineCapacity>> : public ThreadingTrait<Deque<T, inlineCapacity, HeapAllocator>> { + STATIC_ONLY(ThreadingTrait); +}; template<typename T, typename U, typename V> -struct ThreadingTrait<HeapHashCountedSet<T, U, V>> : public ThreadingTrait<HashCountedSet<T, U, V, HeapAllocator>> { }; +struct ThreadingTrait<HeapHashCountedSet<T, U, V>> : public ThreadingTrait<HashCountedSet<T, U, V, HeapAllocator>> { + STATIC_ONLY(ThreadingTrait); +}; } // namespace blink
diff --git a/third_party/WebKit/Source/platform/heap/TraceTraits.h b/third_party/WebKit/Source/platform/heap/TraceTraits.h index 7d35c32..75ecd16 100644 --- a/third_party/WebKit/Source/platform/heap/TraceTraits.h +++ b/third_party/WebKit/Source/platform/heap/TraceTraits.h
@@ -9,6 +9,7 @@ #include "platform/heap/Heap.h" #include "platform/heap/InlinedGlobalMarkingVisitor.h" #include "platform/heap/Visitor.h" +#include "wtf/Allocator.h" #include "wtf/Assertions.h" #include "wtf/Deque.h" #include "wtf/HashCountedSet.h" @@ -33,6 +34,7 @@ template<typename T> class AdjustAndMarkTrait<T, false> { + STATIC_ONLY(AdjustAndMarkTrait); public: template<typename VisitorDispatcher> static void mark(VisitorDispatcher visitor, const T* t) @@ -74,6 +76,7 @@ template<typename T> class AdjustAndMarkTrait<T, true> { + STATIC_ONLY(AdjustAndMarkTrait); public: template<typename VisitorDispatcher> static void mark(VisitorDispatcher visitor, const T* self) @@ -98,6 +101,7 @@ template<typename T> struct TraceIfEnabled<T, false> { + STATIC_ONLY(TraceIfEnabled); template<typename VisitorDispatcher> static void trace(VisitorDispatcher, T&) { @@ -107,6 +111,7 @@ template<typename T> struct TraceIfEnabled<T, true> { + STATIC_ONLY(TraceIfEnabled); template<typename VisitorDispatcher> static void trace(VisitorDispatcher visitor, T& t) { @@ -119,6 +124,7 @@ template<WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits> struct TraceCollectionIfEnabled<false, WTF::NoWeakHandlingInCollections, strongify, T, Traits> { + STATIC_ONLY(TraceCollectionIfEnabled); template<typename VisitorDispatcher> static bool trace(VisitorDispatcher, T&) { @@ -129,6 +135,7 @@ template<bool needsTracing, WTF::WeakHandlingFlag weakHandlingFlag, WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits> struct TraceCollectionIfEnabled { + STATIC_ONLY(TraceCollectionIfEnabled); template<typename VisitorDispatcher> static bool trace(VisitorDispatcher visitor, T& t) { @@ -150,6 +157,7 @@ // that case the pointer has to be adjusted before marking. template<typename T> class TraceTrait { + STATIC_ONLY(TraceTrait); public: static void trace(Visitor*, void* self); static void trace(InlinedGlobalMarkingVisitor, void* self); @@ -184,6 +192,7 @@ template<typename T, typename Traits> struct TraceTrait<HeapVectorBacking<T, Traits>> { + STATIC_ONLY(TraceTrait); using Backing = HeapVectorBacking<T, Traits>; template<typename VisitorDispatcher> @@ -209,6 +218,7 @@ // processing. template<typename Table> struct TraceTrait<HeapHashTableBacking<Table>> { + STATIC_ONLY(TraceTrait); using Backing = HeapHashTableBacking<Table>; using Traits = typename Table::ValueTraits; @@ -231,6 +241,7 @@ // entries from the collection that contain nulled weak members. template<typename T, typename U> class TraceTrait<std::pair<T, U>> { + STATIC_ONLY(TraceTrait); public: static const bool firstNeedsTracing = WTF::NeedsTracing<T>::value || WTF::IsWeak<T>::value; static const bool secondNeedsTracing = WTF::NeedsTracing<U>::value || WTF::IsWeak<U>::value; @@ -266,6 +277,7 @@ // template<typename T> class TraceEagerlyTrait { + STATIC_ONLY(TraceEagerlyTrait); public: static const bool value = true; }; @@ -274,42 +286,49 @@ #define WILL_NOT_BE_EAGERLY_TRACED_CLASS(TYPE) \ template<> \ class TraceEagerlyTrait<TYPE> { \ + STATIC_ONLY(TraceEagerlyTrait); \ public: \ static const bool value = false; \ } template<typename T> class TraceEagerlyTrait<Member<T>> { + STATIC_ONLY(TraceEagerlyTrait); public: static const bool value = TraceEagerlyTrait<T>::value; }; template<typename T> class TraceEagerlyTrait<WeakMember<T>> { + STATIC_ONLY(TraceEagerlyTrait); public: static const bool value = TraceEagerlyTrait<T>::value; }; template<typename T> class TraceEagerlyTrait<Persistent<T>> { + STATIC_ONLY(TraceEagerlyTrait); public: static const bool value = TraceEagerlyTrait<T>::value; }; template<typename T> class TraceEagerlyTrait<WeakPersistent<T>> { + STATIC_ONLY(TraceEagerlyTrait); public: static const bool value = TraceEagerlyTrait<T>::value; }; template<typename T> class TraceEagerlyTrait<CrossThreadPersistent<T>> { + STATIC_ONLY(TraceEagerlyTrait); public: static const bool value = TraceEagerlyTrait<T>::value; }; template<typename T> class TraceEagerlyTrait<CrossThreadWeakPersistent<T>> { + STATIC_ONLY(TraceEagerlyTrait); public: static const bool value = TraceEagerlyTrait<T>::value; }; @@ -317,11 +336,13 @@ template<typename ValueArg, size_t inlineCapacity> class HeapListHashSetAllocator; template<typename T, size_t inlineCapacity> class TraceEagerlyTrait<WTF::ListHashSetNode<T, HeapListHashSetAllocator<T, inlineCapacity>>> { + STATIC_ONLY(TraceEagerlyTrait); public: static const bool value = false; }; template <typename T> struct RemoveHeapPointerWrapperTypes { + STATIC_ONLY(RemoveHeapPointerWrapperTypes); using Type = typename WTF::RemoveTemplate<typename WTF::RemoveTemplate<typename WTF::RemoveTemplate<T, Member>::Type, WeakMember>::Type, RawPtr>::Type; }; @@ -330,7 +351,9 @@ // raw pointer types. To remove these tests, we may need support for // instantiating a template with a RawPtrOrMember'ish template. template<typename T> -struct TraceIfNeeded : public TraceIfEnabled<T, WTF::NeedsTracing<T>::value || IsGarbageCollectedType<typename RemoveHeapPointerWrapperTypes<typename std::remove_pointer<T>::type>::Type>::value> { }; +struct TraceIfNeeded : public TraceIfEnabled<T, WTF::NeedsTracing<T>::value || IsGarbageCollectedType<typename RemoveHeapPointerWrapperTypes<typename std::remove_pointer<T>::type>::Type>::value> { + STATIC_ONLY(TraceIfNeeded); +}; } // namespace blink
diff --git a/third_party/WebKit/Source/platform/heap/Visitor.h b/third_party/WebKit/Source/platform/heap/Visitor.h index c659077..0465bad 100644 --- a/third_party/WebKit/Source/platform/heap/Visitor.h +++ b/third_party/WebKit/Source/platform/heap/Visitor.h
@@ -35,6 +35,7 @@ #include "platform/heap/GarbageCollected.h" #include "platform/heap/StackFrameDepth.h" #include "platform/heap/ThreadState.h" +#include "wtf/Allocator.h" #include "wtf/Assertions.h" #include "wtf/Atomics.h" #include "wtf/Deque.h" @@ -60,6 +61,7 @@ // in header files where we have only forward declarations of classes. template<typename T, void (T::*method)(Visitor*)> struct TraceMethodDelegate { + STATIC_ONLY(TraceMethodDelegate); static void trampoline(Visitor* visitor, void* self) { (reinterpret_cast<T*>(self)->*method)(visitor); @@ -388,6 +390,7 @@ #if ENABLE(DETAILED_MEMORY_INFRA) template<typename T> struct TypenameStringTrait { + STATIC_ONLY(TypenameStringTrait); static const String get() { return WTF::extractTypeNameFromFunctionName(WTF::extractNameFunction<T>());
diff --git a/third_party/WebKit/Source/platform/text/LocaleWin.cpp b/third_party/WebKit/Source/platform/text/LocaleWin.cpp index 121ca52..8c40071 100644 --- a/third_party/WebKit/Source/platform/text/LocaleWin.cpp +++ b/third_party/WebKit/Source/platform/text/LocaleWin.cpp
@@ -46,9 +46,6 @@ namespace blink { -typedef LCID (WINAPI* LocaleNameToLCIDPtr)(LPCWSTR, DWORD); -typedef HashMap<String, LCID> NameToLCIDMap; - static String extractLanguageCode(const String& locale) { size_t dashPosition = locale.find('-'); @@ -57,90 +54,25 @@ return locale.left(dashPosition); } -static String removeLastComponent(const String& name) -{ - size_t lastSeparator = name.reverseFind('-'); - if (lastSeparator == kNotFound) - return emptyString(); - return name.left(lastSeparator); -} - -static void ensureNameToLCIDMap(NameToLCIDMap& map) -{ - if (!map.isEmpty()) - return; - // http://www.microsoft.com/resources/msdn/goglobal/default.mspx - // We add only locales used in layout tests for now. - map.add("ar", 0x0001); - map.add("ar-eg", 0x0C01); - map.add("de", 0x0007); - map.add("de-de", 0x0407); - map.add("el", 0x0008); - map.add("el-gr", 0x0408); - map.add("en", 0x0009); - map.add("en-gb", 0x0809); - map.add("en-us", 0x0409); - map.add("fr", 0x000C); - map.add("fr-fr", 0x040C); - map.add("he", 0x000D); - map.add("he-il", 0x040D); - map.add("hi", 0x0039); - map.add("hi-in", 0x0439); - map.add("ja", 0x0011); - map.add("ja-jp", 0x0411); - map.add("ko", 0x0012); - map.add("ko-kr", 0x0412); - map.add("ru", 0x0019); - map.add("ru-ru", 0x0419); - map.add("zh-cn", 0x0804); - map.add("zh-tw", 0x0404); -} - -// Fallback implementation of LocaleNameToLCID API. This is used for -// testing on Windows XP. -// FIXME: Remove this, ensureNameToLCIDMap, and removeLastComponent when we drop -// Windows XP support. -static LCID WINAPI convertLocaleNameToLCID(LPCWSTR name, DWORD) -{ - if (!name || !name[0]) - return LOCALE_USER_DEFAULT; - DEFINE_STATIC_LOCAL(NameToLCIDMap, map, ()); - ensureNameToLCIDMap(map); - String localeName = String(name).replace('_', '-'); - localeName = localeName.lower(); - do { - NameToLCIDMap::const_iterator iterator = map.find(localeName); - if (iterator != map.end()) - return iterator->value; - localeName = removeLastComponent(localeName); - } while (!localeName.isEmpty()); - return LOCALE_USER_DEFAULT; -} - -static LCID LCIDFromLocaleInternal(LCID userDefaultLCID, const String& userDefaultLanguageCode, LocaleNameToLCIDPtr localeNameToLCID, const String& locale) +static LCID LCIDFromLocaleInternal(LCID userDefaultLCID, const String& userDefaultLanguageCode, const String& locale) { String localeLanguageCode = extractLanguageCode(locale); if (equalIgnoringCase(localeLanguageCode, userDefaultLanguageCode)) return userDefaultLCID; - return localeNameToLCID(locale.charactersWithNullTermination().data(), 0); + return ::LocaleNameToLCID(locale.charactersWithNullTermination().data(), 0); } static LCID LCIDFromLocale(const String& locale, bool defaultsForLocale) { - // LocaleNameToLCID() is available since Windows Vista. - LocaleNameToLCIDPtr localeNameToLCID = reinterpret_cast<LocaleNameToLCIDPtr>(::GetProcAddress(::GetModuleHandle(L"kernel32"), "LocaleNameToLCID")); - if (!localeNameToLCID) - localeNameToLCID = convertLocaleNameToLCID; - // According to MSDN, 9 is enough for LOCALE_SISO639LANGNAME. const size_t languageCodeBufferSize = 9; WCHAR lowercaseLanguageCode[languageCodeBufferSize]; ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME | (defaultsForLocale ? LOCALE_NOUSEROVERRIDE : 0), lowercaseLanguageCode, languageCodeBufferSize); String userDefaultLanguageCode = String(lowercaseLanguageCode); - LCID lcid = LCIDFromLocaleInternal(LOCALE_USER_DEFAULT, userDefaultLanguageCode, localeNameToLCID, locale); + LCID lcid = LCIDFromLocaleInternal(LOCALE_USER_DEFAULT, userDefaultLanguageCode, locale); if (!lcid) - lcid = LCIDFromLocaleInternal(LOCALE_USER_DEFAULT, userDefaultLanguageCode, localeNameToLCID, defaultLanguage()); + lcid = LCIDFromLocaleInternal(LOCALE_USER_DEFAULT, userDefaultLanguageCode, defaultLanguage()); return lcid; }
diff --git a/third_party/WebKit/Source/platform/transforms/TransformationMatrix.cpp b/third_party/WebKit/Source/platform/transforms/TransformationMatrix.cpp index 646607d..d232d0e4 100644 --- a/third_party/WebKit/Source/platform/transforms/TransformationMatrix.cpp +++ b/third_party/WebKit/Source/platform/transforms/TransformationMatrix.cpp
@@ -78,7 +78,7 @@ typedef double Vector4[4]; typedef double Vector3[3]; -const double SMALL_NUMBER = 1.e-8; +const double SmallNumber = 1.e-8; // inverse(original_matrix, inverse_matrix) // @@ -220,7 +220,7 @@ // then the inverse matrix is not unique. double det = determinant4x4(matrix); - if (fabs(det) < SMALL_NUMBER) + if (fabs(det) < SmallNumber) return false; #if CPU(ARM64) @@ -1449,7 +1449,7 @@ double det = blink::determinant4x4(m_matrix); - if (fabs(det) < SMALL_NUMBER) + if (fabs(det) < SmallNumber) return false; return true;
diff --git a/third_party/WebKit/Source/web/InspectorEmulationAgent.cpp b/third_party/WebKit/Source/web/InspectorEmulationAgent.cpp index 4f3475a6c..ab56b7ee 100644 --- a/third_party/WebKit/Source/web/InspectorEmulationAgent.cpp +++ b/third_party/WebKit/Source/web/InspectorEmulationAgent.cpp
@@ -7,7 +7,6 @@ #include "core/frame/FrameHost.h" #include "core/frame/FrameView.h" #include "core/frame/Settings.h" -#include "core/inspector/InspectorState.h" #include "core/page/Page.h" #include "platform/geometry/DoubleRect.h" #include "web/DevToolsEmulator.h" @@ -47,9 +46,11 @@ void InspectorEmulationAgent::restore() { ErrorString error; - setScriptExecutionDisabled(&error, m_state->getBoolean(EmulationAgentState::scriptExecutionDisabled)); - setTouchEmulationEnabled(&error, m_state->getBoolean(EmulationAgentState::touchEventEmulationEnabled), nullptr); - setEmulatedMedia(&error, m_state->getString(EmulationAgentState::emulatedMedia)); + setScriptExecutionDisabled(&error, m_state->booleanProperty(EmulationAgentState::scriptExecutionDisabled, false)); + setTouchEmulationEnabled(&error, m_state->booleanProperty(EmulationAgentState::touchEventEmulationEnabled, false), nullptr); + String emulatedMedia; + m_state->getString(EmulationAgentState::emulatedMedia, &emulatedMedia); + setEmulatedMedia(&error, emulatedMedia); } void InspectorEmulationAgent::disable(ErrorString*)
diff --git a/third_party/WebKit/Source/web/InspectorRenderingAgent.cpp b/third_party/WebKit/Source/web/InspectorRenderingAgent.cpp index 0964cfa..e24e63e 100644 --- a/third_party/WebKit/Source/web/InspectorRenderingAgent.cpp +++ b/third_party/WebKit/Source/web/InspectorRenderingAgent.cpp
@@ -6,7 +6,6 @@ #include "core/frame/FrameView.h" #include "core/frame/Settings.h" -#include "core/inspector/InspectorState.h" #include "core/page/Page.h" #include "web/WebLocalFrameImpl.h" #include "web/WebViewImpl.h" @@ -39,10 +38,10 @@ void InspectorRenderingAgent::restore() { ErrorString error; - setShowDebugBorders(&error, m_state->getBoolean(RenderingAgentState::showDebugBorders)); - setShowFPSCounter(&error, m_state->getBoolean(RenderingAgentState::showFPSCounter)); - setShowPaintRects(&error, m_state->getBoolean(RenderingAgentState::showPaintRects)); - setShowScrollBottleneckRects(&error, m_state->getBoolean(RenderingAgentState::showScrollBottleneckRects)); + setShowDebugBorders(&error, m_state->booleanProperty(RenderingAgentState::showDebugBorders, false)); + setShowFPSCounter(&error, m_state->booleanProperty(RenderingAgentState::showFPSCounter, false)); + setShowPaintRects(&error, m_state->booleanProperty(RenderingAgentState::showPaintRects, false)); + setShowScrollBottleneckRects(&error, m_state->booleanProperty(RenderingAgentState::showScrollBottleneckRects, false)); } void InspectorRenderingAgent::disable(ErrorString*)
diff --git a/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp b/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp index cb315a6..c429619 100644 --- a/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp +++ b/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp
@@ -58,7 +58,6 @@ #include "core/inspector/InspectorProfilerAgent.h" #include "core/inspector/InspectorResourceAgent.h" #include "core/inspector/InspectorResourceContentLoader.h" -#include "core/inspector/InspectorState.h" #include "core/inspector/InspectorTaskRunner.h" #include "core/inspector/InspectorTimelineAgent.h" #include "core/inspector/InspectorTracingAgent.h" @@ -319,7 +318,6 @@ , m_instrumentingAgents(m_webLocalFrameImpl->frame()->instrumentingAgents()) , m_injectedScriptManager(InjectedScriptManager::createForPage()) , m_resourceContentLoader(InspectorResourceContentLoader::create(m_webLocalFrameImpl->frame())) - , m_state(adoptPtr(new InspectorCompositeState(this))) , m_overlay(overlay) , m_inspectedFrames(InspectedFrames::create(m_webLocalFrameImpl->frame())) , m_inspectorAgent(nullptr) @@ -330,9 +328,10 @@ , m_tracingAgent(nullptr) , m_pageRuntimeAgent(nullptr) , m_pageConsoleAgent(nullptr) - , m_agents(m_instrumentingAgents.get(), m_state.get()) + , m_agents(m_instrumentingAgents.get()) , m_deferredAgentsInitialized(false) , m_sessionId(0) + , m_stateMuted(false) { ASSERT(isMainThread()); ASSERT(m_webLocalFrameImpl->frame()); @@ -512,7 +511,7 @@ m_inspectorFrontend = adoptPtr(new InspectorFrontend(this)); // We can reconnect to existing front-end -> unmute state. - m_state->unmute(); + m_stateMuted = false; m_agents.setFrontend(m_inspectorFrontend.get()); InspectorInstrumentation::registerInstrumentingAgents(m_instrumentingAgents.get()); @@ -530,8 +529,7 @@ return; attach(hostId, sessionId); - m_state->loadFromCookie(savedState); - m_agents.restore(); + m_agents.restore(savedState); } void WebDevToolsAgentImpl::detach() @@ -546,7 +544,7 @@ // Destroying agents would change the state, but we don't want that. // Pre-disconnect state will be used to restore inspector agents. - m_state->mute(); + m_stateMuted = true; m_agents.clearFrontend(); m_inspectorFrontend.clear(); @@ -645,8 +643,15 @@ if (!m_attached) return; flushPendingProtocolNotifications(); - m_client->sendProtocolMessage(sessionId, callId, message->toJSONString(), m_stateCookie); - m_stateCookie = String(); + String stateToSend; + if (!m_stateMuted) { + stateToSend = m_agents.state(); + if (stateToSend == m_stateCookie) + stateToSend = String(); + else + m_stateCookie = stateToSend; + } + m_client->sendProtocolMessage(sessionId, callId, message->toJSONString(), stateToSend); } void WebDevToolsAgentImpl::sendProtocolNotification(PassRefPtr<JSONObject> message) @@ -661,11 +666,6 @@ flushPendingProtocolNotifications(); } -void WebDevToolsAgentImpl::updateInspectorStateCookie(const String& state) -{ - m_stateCookie = state; -} - void WebDevToolsAgentImpl::resumeStartup() { m_client->resumeStartup();
diff --git a/third_party/WebKit/Source/web/WebDevToolsAgentImpl.h b/third_party/WebKit/Source/web/WebDevToolsAgentImpl.h index b761b55b..4f97374a 100644 --- a/third_party/WebKit/Source/web/WebDevToolsAgentImpl.h +++ b/third_party/WebKit/Source/web/WebDevToolsAgentImpl.h
@@ -33,7 +33,6 @@ #include "core/inspector/InspectorFrontendChannel.h" #include "core/inspector/InspectorRuntimeAgent.h" -#include "core/inspector/InspectorStateClient.h" #include "core/inspector/InspectorTracingAgent.h" #include "platform/heap/Handle.h" #include "public/platform/WebSize.h" @@ -71,7 +70,6 @@ class WebDevToolsAgentImpl final : public NoBaseWillBeGarbageCollectedFinalized<WebDevToolsAgentImpl> , public WebDevToolsAgent - , public InspectorStateClient , public InspectorEmulationAgent::Client , public InspectorTracingAgent::Client , public InspectorRuntimeAgent::Client @@ -112,9 +110,6 @@ private: WebDevToolsAgentImpl(WebLocalFrameImpl*, WebDevToolsAgentClient*, PassOwnPtrWillBeRawPtr<InspectorOverlay>); - // InspectorStateClient implementation. - void updateInspectorStateCookie(const WTF::String&) override; - // InspectorTracingAgent::Client implementation. void enableTracing(const WTF::String& categoryFilter) override; void disableTracing() override; @@ -146,7 +141,6 @@ RefPtrWillBeMember<InstrumentingAgents> m_instrumentingAgents; OwnPtr<InjectedScriptManager> m_injectedScriptManager; OwnPtrWillBeMember<InspectorResourceContentLoader> m_resourceContentLoader; - OwnPtr<InspectorCompositeState> m_state; OwnPtrWillBeMember<InspectorOverlay> m_overlay; OwnPtrWillBeMember<InspectedFrames> m_inspectedFrames; @@ -168,6 +162,7 @@ NotificationQueue m_notificationQueue; int m_sessionId; String m_stateCookie; + bool m_stateMuted; friend class DebuggerTask; };
diff --git a/third_party/WebKit/Source/web/WebFrameSerializer.cpp b/third_party/WebKit/Source/web/WebFrameSerializer.cpp index 9dbe8c6..7b1b13a 100644 --- a/third_party/WebKit/Source/web/WebFrameSerializer.cpp +++ b/third_party/WebKit/Source/web/WebFrameSerializer.cpp
@@ -107,7 +107,7 @@ if (!frame) return false; - WebString contentID = m_webDelegate.getContentID(*WebFrame::fromFrame(frame)); + WebString contentID = m_webDelegate.getContentID(WebFrame::fromFrame(frame)); if (contentID.isNull()) return false; @@ -171,7 +171,7 @@ serializer.serializeFrame(*frame); // Get Content-ID for the frame being serialized. - String frameContentID = webDelegate->getContentID(*webFrame); + String frameContentID = webDelegate->getContentID(webFrame); // Encode serializer's output as MHTML. RefPtr<SharedBuffer> output = SharedBuffer::create(); @@ -199,9 +199,9 @@ bool WebFrameSerializer::serialize( WebLocalFrame* frame, WebFrameSerializerClient* client, - const WebVector<std::pair<WebURL, WebString>>& urlsToLocalPaths) + WebFrameSerializer::LinkRewritingDelegate* delegate) { - WebFrameSerializerImpl serializerImpl(frame, client, urlsToLocalPaths); + WebFrameSerializerImpl serializerImpl(frame, client, delegate); return serializerImpl.serialize(); }
diff --git a/third_party/WebKit/Source/web/WebFrameSerializerImpl.cpp b/third_party/WebKit/Source/web/WebFrameSerializerImpl.cpp index 49240cb..b1ce352 100644 --- a/third_party/WebKit/Source/web/WebFrameSerializerImpl.cpp +++ b/third_party/WebKit/Source/web/WebFrameSerializerImpl.cpp
@@ -86,6 +86,7 @@ #include "core/html/HTMLAllCollection.h" #include "core/html/HTMLElement.h" #include "core/html/HTMLFormElement.h" +#include "core/html/HTMLFrameOwnerElement.h" #include "core/html/HTMLHtmlElement.h" #include "core/html/HTMLMetaElement.h" #include "core/loader/DocumentLoader.h" @@ -274,6 +275,21 @@ // TODO(yosin): We should utilize |MarkupFormatter| here to share code, // especially escaping attribute values, done by |WebEntities| |m_htmlEntities| // and |m_xmlEntities|. +void WebFrameSerializerImpl::appendAttribute( + StringBuilder& result, + bool isHTMLDocument, + const String& attrName, + const String& attrValue) { + result.append(' '); + result.append(attrName); + result.appendLiteral("=\""); + if (isHTMLDocument) + result.append(m_htmlEntities.convertEntitiesInString(attrValue)); + else + result.append(m_xmlEntities.convertEntitiesInString(attrValue)); + result.append('\"'); +} + void WebFrameSerializerImpl::openTagToString( Element* element, SerializeDomParam* param) @@ -287,42 +303,39 @@ // Add open tag result.append('<'); result.append(element->nodeName().lower()); - // Go through all attributes and serialize them. - AttributeCollection attributes = element->attributes(); - AttributeCollection::iterator end = attributes.end(); - for (AttributeCollection::iterator it = attributes.begin(); it != end; ++it) { - result.append(' '); - // Add attribute pair - result.append(it->name().toString()); - result.appendLiteral("=\""); - if (!it->value().isEmpty()) { - const String& attrValue = it->value(); - // Check whether we need to replace some resource links - // with local resource paths. - const QualifiedName& attrName = it->name(); - if (element->hasLegalLinkAttribute(attrName)) { - // For links start with "javascript:", we do not change it. - if (attrValue.startsWith("javascript:", TextCaseInsensitive)) { - result.append(m_htmlEntities.convertEntitiesInString(attrValue)); + // Find out if this element owns a frame. + WebFrame* frame = nullptr; + if (element->isFrameOwnerElement()) { + frame = WebFrame::fromFrame( + toHTMLFrameOwnerElement(element)->contentFrame()); + } + + // Go through all attributes and serialize them. + for (const auto& it : element->attributes()) { + const QualifiedName& attrName = it.name(); + String attrValue = it.value(); + + // Rewrite the attribute value if requested. + if (element->hasLegalLinkAttribute(attrName)) { + // For links start with "javascript:", we do not change it. + if (!attrValue.startsWith("javascript:", TextCaseInsensitive)) { + // Get the absolute link. + KURL completeURL = param->document->completeURL(attrValue); + + // Check whether we have a local file to link to. + WebString rewrittenLink; + if (frame && m_delegate->rewriteFrameSource(frame, &rewrittenLink)) { + attrValue = rewrittenLink; + } else if (m_delegate->rewriteLink(completeURL, &rewrittenLink)) { + attrValue = rewrittenLink; } else { - // Get the absolute link - String completeURL = param->document->completeURL(attrValue); - // Check whether we have local files for those link. - if (m_localLinks.contains(completeURL)) { - result.append(m_htmlEntities.convertEntitiesInString(m_localLinks.get(completeURL))); - } else { - result.append(m_htmlEntities.convertEntitiesInString(completeURL)); - } + attrValue = completeURL; } - } else { - if (param->isHTMLDocument) - result.append(m_htmlEntities.convertEntitiesInString(attrValue)); - else - result.append(m_xmlEntities.convertEntitiesInString(attrValue)); } } - result.append('\"'); + + appendAttribute(result, param->isHTMLDocument, attrName.toString(), attrValue); } // Do post action for open tag. @@ -410,22 +423,18 @@ WebFrameSerializerImpl::WebFrameSerializerImpl( WebLocalFrame* frame, WebFrameSerializerClient* client, - const WebVector<std::pair<WebURL, WebString>>& urlsToLocalPaths) + WebFrameSerializer::LinkRewritingDelegate* delegate) : m_client(client) + , m_delegate(delegate) , m_htmlEntities(false) , m_xmlEntities(true) { // Must specify available webframe. ASSERT(frame); m_specifiedWebLocalFrameImpl = toWebLocalFrameImpl(frame); - // Make sure we have non 0 client. + // Make sure we have non null client and delegate. ASSERT(client); - // Build local resources map. - for (const auto& it : urlsToLocalPaths) { - KURL url = it.first; - ASSERT(!m_localLinks.contains(url.string())); - m_localLinks.set(url.string(), it.second); - } + ASSERT(delegate); ASSERT(m_dataBuffer.isEmpty()); }
diff --git a/third_party/WebKit/Source/web/WebFrameSerializerImpl.h b/third_party/WebKit/Source/web/WebFrameSerializerImpl.h index 49eb9059..e948769 100644 --- a/third_party/WebKit/Source/web/WebFrameSerializerImpl.h +++ b/third_party/WebKit/Source/web/WebFrameSerializerImpl.h
@@ -74,24 +74,18 @@ // The parameter delegate specifies the pointer of interface // DomSerializerDelegate provide sink interface which can receive the // individual chunks of data to be saved. - // The parameter urlsToLocalPaths contains a mapping between original URLs - // of saved resources and corresponding local file paths. WebFrameSerializerImpl( WebLocalFrame*, WebFrameSerializerClient*, - const WebVector<std::pair<WebURL, WebString>>& urlsToLocalPaths); + WebFrameSerializer::LinkRewritingDelegate*); private: // Specified frame which need to be serialized; RawPtrWillBeMember<WebLocalFrameImpl> m_specifiedWebLocalFrameImpl; // Pointer of WebFrameSerializerClient WebFrameSerializerClient* m_client; - // This hash map is used to map resource URL of original link to its local - // file path. - typedef HashMap<WTF::String, WTF::String> LinkLocalPathMap; - // local_links_ include all pair of local resource path and corresponding - // original link. - LinkLocalPathMap m_localLinks; + // Pointer of WebFrameSerializer::LinkRewritingDelegate + WebFrameSerializer::LinkRewritingDelegate* m_delegate; // Data buffer for saving result of serialized DOM data. StringBuilder m_dataBuffer; @@ -179,6 +173,13 @@ void buildContentForNode( Node*, SerializeDomParam*); + + // Appends attrName="escapedAttrValue" to result. + void appendAttribute( + StringBuilder& result, + bool isHTMLDocument, + const String& attrName, + const String& attrValue); }; } // namespace blink
diff --git a/third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp b/third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp index 819ace7..a2be587 100644 --- a/third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp +++ b/third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp
@@ -427,7 +427,7 @@ // instead. Note that this has the side effect of moving the // caret back to the beginning of the text. Position position(element, 0); - focusedFrame->selection().setSelection(VisibleSelection(position, SEL_DEFAULT_AFFINITY)); + focusedFrame->selection().setSelection(VisibleSelection(position, SelDefaultAffinity)); } } } @@ -1016,8 +1016,7 @@ TRACE_EVENT0("blink", "WebViewImpl::setIsAcceleratedCompositingActive(true)"); m_layerTreeView->setRootLayer(*m_rootLayer); - bool visible = page()->visibilityState() == PageVisibilityStateVisible; - m_layerTreeView->setVisible(visible); + m_layerTreeView->setVisible(page()->isPageVisible()); updateLayerTreeDeviceScaleFactor(); updateLayerTreeBackgroundColor(); m_layerTreeView->setHasTransparentBackground(isTransparent());
diff --git a/third_party/WebKit/Source/web/WebGeolocationController.cpp b/third_party/WebKit/Source/web/WebGeolocationController.cpp index 2d2a966d..c39a4d3 100644 --- a/third_party/WebKit/Source/web/WebGeolocationController.cpp +++ b/third_party/WebKit/Source/web/WebGeolocationController.cpp
@@ -35,23 +35,13 @@ namespace blink { -#if ENABLE(OILPAN) // TODO(Oilpan): once GeolocationController is always on the heap, // shorten out this GeolocationControllerPrivate intermediary. -class GeolocationControllerPrivate : public GeolocationController { +class GeolocationControllerPrivate final : public RefCountedWillBeGarbageCollected<GeolocationControllerPrivate> { public: - static GeolocationController& controller(const WebPrivatePtr<GeolocationControllerPrivate>& controller) + static PassRefPtrWillBeRawPtr<GeolocationControllerPrivate> create(GeolocationController* controller) { - ASSERT(!controller.isNull()); - return *controller; - } -}; -#else -class GeolocationControllerPrivate final : public RefCounted<GeolocationControllerPrivate> { -public: - static PassRefPtr<GeolocationControllerPrivate> create(GeolocationController* controller) - { - return adoptRef(new GeolocationControllerPrivate(controller)); + return adoptRefWillBeNoop(new GeolocationControllerPrivate(controller)); } static GeolocationController& controller(const WebPrivatePtr<GeolocationControllerPrivate>& controller) @@ -61,6 +51,11 @@ return *controller->m_controller; } + DEFINE_INLINE_TRACE() + { + visitor->trace(m_controller); + } + private: explicit GeolocationControllerPrivate(GeolocationController* controller) : m_controller(controller) @@ -70,16 +65,11 @@ // Non-Oilpan, this bare pointer is owned as a supplement and kept alive // by the frame of the WebLocalFrame which creates the WebGeolocationController // object that wraps it all up. - GeolocationController* m_controller; + RawPtrWillBeMember<GeolocationController> m_controller; }; -#endif WebGeolocationController::WebGeolocationController(GeolocationController* controller) -#if ENABLE(OILPAN) - : m_private(static_cast<GeolocationControllerPrivate*>(controller)) -#else : m_private(GeolocationControllerPrivate::create(controller)) -#endif { }
diff --git a/third_party/WebKit/Source/web/WebSelector.cpp b/third_party/WebKit/Source/web/WebSelector.cpp index 7253347..46efec93 100644 --- a/third_party/WebKit/Source/web/WebSelector.cpp +++ b/third_party/WebKit/Source/web/WebSelector.cpp
@@ -38,7 +38,7 @@ WebString canonicalizeSelector(WebString webSelector, WebSelectorType restriction) { - CSSSelectorList selectorList = CSSParser::parseSelector(strictCSSParserContext(), webSelector); + CSSSelectorList selectorList = CSSParser::parseSelector(strictCSSParserContext(), nullptr, webSelector); if (restriction == WebSelectorTypeCompound) { for (const CSSSelector* selector = selectorList.first(); selector; selector = selectorList.next(*selector)) {
diff --git a/third_party/WebKit/Source/web/WebViewImpl.cpp b/third_party/WebKit/Source/web/WebViewImpl.cpp index 3dea6bed..61cce26a 100644 --- a/third_party/WebKit/Source/web/WebViewImpl.cpp +++ b/third_party/WebKit/Source/web/WebViewImpl.cpp
@@ -2295,7 +2295,7 @@ // instead. Note that this has the side effect of moving the // caret back to the beginning of the text. Position position(element, 0); - focusedFrame->selection().setSelection(VisibleSelection(position, SEL_DEFAULT_AFFINITY)); + focusedFrame->selection().setSelection(VisibleSelection(position, SelDefaultAffinity)); } } } @@ -4296,8 +4296,7 @@ // propagated to the WebView in some circumstances. This needs to // be refreshed here when setting a new root layer to avoid being // stuck in a presumed incorrectly invisible state. - bool visible = page()->visibilityState() == PageVisibilityStateVisible; - m_layerTreeView->setVisible(visible); + m_layerTreeView->setVisible(page()->isPageVisible()); } else { m_rootGraphicsLayer = nullptr; m_rootLayer = nullptr; @@ -4624,8 +4623,7 @@ // TODO(jbroman): This is cargo-culted from setRootGraphicsLayer. Is it // necessary? - bool visible = page()->visibilityState() == PageVisibilityStateVisible; - m_layerTreeView->setVisible(visible); + m_layerTreeView->setVisible(page()->isPageVisible()); } void WebViewImpl::detachPaintArtifactCompositor()
diff --git a/third_party/WebKit/Source/web/tests/WebFrameSerializerTest.cpp b/third_party/WebKit/Source/web/tests/WebFrameSerializerTest.cpp index 26838a2..edb39627 100644 --- a/third_party/WebKit/Source/web/tests/WebFrameSerializerTest.cpp +++ b/third_party/WebKit/Source/web/tests/WebFrameSerializerTest.cpp
@@ -79,15 +79,42 @@ URLTestHelpers::registerMockedURLLoad(KURL(ParsedURLString, url), "frameserialization/awesome.png"); } + class SingleLinkRewritingDelegate : public WebFrameSerializer::LinkRewritingDelegate { + public: + SingleLinkRewritingDelegate(const WebURL& url, const WebString& localPath) + : m_url(url) + , m_localPath(localPath) + { + } + + bool rewriteFrameSource(WebFrame* frame, WebString* rewrittenLink) override + { + return false; + } + + bool rewriteLink(const WebURL& url, WebString* rewrittenLink) override + { + if (url != m_url) + return false; + + *rewrittenLink = m_localPath; + return true; + } + + private: + const WebURL m_url; + const WebString m_localPath; + }; + String serializeFile(const String& url, const String& fileName) { KURL parsedURL(ParsedURLString, url); URLTestHelpers::registerMockedURLLoad(parsedURL, fileName, "frameserialization/", "text/html"); FrameTestHelpers::loadFrame(mainFrameImpl(), url.utf8().data()); - std::vector<std::pair<WebURL, WebString>> urlsToLocalPaths; - urlsToLocalPaths.push_back(std::make_pair(parsedURL, WebString("local"))); + SingleLinkRewritingDelegate delegate(parsedURL, WebString("local")); SimpleWebFrameSerializerClient serializerClient; - WebFrameSerializer::serialize(mainFrameImpl(), &serializerClient, urlsToLocalPaths); + WebFrameSerializer::serialize( + mainFrameImpl(), &serializerClient, &delegate); return serializerClient.toString(); }
diff --git a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp index 8f71f28..ebac6d1 100644 --- a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp +++ b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
@@ -6663,8 +6663,8 @@ LayoutBox* percentHeightInAnonymous = toLayoutBox(document->getElementById("percent-height-in-anonymous")->layoutObject()); LayoutBox* percentHeightDirectChild = toLayoutBox(document->getElementById("percent-height-direct-child")->layoutObject()); - EXPECT_TRUE(LayoutBlock::hasPercentHeightDescendant(percentHeightInAnonymous)); - EXPECT_TRUE(LayoutBlock::hasPercentHeightDescendant(percentHeightDirectChild)); + EXPECT_TRUE(container->hasPercentHeightDescendant(percentHeightInAnonymous)); + EXPECT_TRUE(container->hasPercentHeightDescendant(percentHeightDirectChild)); ASSERT_TRUE(container->percentHeightDescendants()); ASSERT_TRUE(container->hasPercentHeightDescendants());
diff --git a/third_party/WebKit/Source/wtf/text/AtomicString.h b/third_party/WebKit/Source/wtf/text/AtomicString.h index fcc3454..f0b5032 100644 --- a/third_party/WebKit/Source/wtf/text/AtomicString.h +++ b/third_party/WebKit/Source/wtf/text/AtomicString.h
@@ -213,6 +213,9 @@ inline bool equalIgnoringCase(const char* a, const AtomicString& b) { return equalIgnoringCase(reinterpret_cast<const LChar*>(a), b.impl()); } inline bool equalIgnoringCase(const String& a, const AtomicString& b) { return equalIgnoringCase(a.impl(), b.impl()); } +inline bool equalIgnoringASCIICase(const AtomicString& a, const AtomicString& b) { return equalIgnoringASCIICase(a.impl(), b.impl()); } +inline bool equalIgnoringASCIICase(const AtomicString& a, const char* b) { return equalIgnoringASCIICase(a.impl(), reinterpret_cast<const LChar*>(b)); } + // Define external global variables for the commonly used atomic strings. // These are only usable from the main thread. WTF_EXPORT extern const AtomicString& nullAtom;
diff --git a/third_party/WebKit/Source/wtf/text/StringImpl.cpp b/third_party/WebKit/Source/wtf/text/StringImpl.cpp index 2a46f3bd..a282e2a 100644 --- a/third_party/WebKit/Source/wtf/text/StringImpl.cpp +++ b/third_party/WebKit/Source/wtf/text/StringImpl.cpp
@@ -2276,6 +2276,34 @@ return equal(a, b); } +bool equalIgnoringASCIICase(const StringImpl* a, const StringImpl* b) +{ + if (!a || !b) + return !a == !b; + unsigned length = b->length(); + if (a->length() != length) + return false; + if (a->is8Bit()) { + if (b->is8Bit()) + return equalIgnoringASCIICase(a->characters8(), b->characters8(), length); + return equalIgnoringASCIICase(a->characters8(), b->characters16(), length); + } + if (b->is8Bit()) + return equalIgnoringASCIICase(a->characters16(), b->characters8(), length); + return equalIgnoringASCIICase(a->characters16(), b->characters16(), length); +} + +bool equalIgnoringASCIICase(const StringImpl* a, const LChar* b) +{ + if (!a || !b) + return !a == !b; + size_t length = strlen(reinterpret_cast<const char*>(b)); + RELEASE_ASSERT(length <= numeric_limits<unsigned>::max()); + if (length != a->length()) + return false; + return equalSubstringIgnoringASCIICase(a, 0, b, length); +} + size_t StringImpl::sizeInBytes() const { size_t size = length();
diff --git a/third_party/WebKit/Source/wtf/text/StringImpl.h b/third_party/WebKit/Source/wtf/text/StringImpl.h index c35fd436..90b8c9b 100644 --- a/third_party/WebKit/Source/wtf/text/StringImpl.h +++ b/third_party/WebKit/Source/wtf/text/StringImpl.h
@@ -513,21 +513,8 @@ return true; } -template<typename CharacterTypeA, typename CharacterTypeB> -inline bool equalIgnoringASCIICase(const CharacterTypeA& a, const CharacterTypeB& b) -{ - unsigned length = b.length(); - if (a.length() != length) - return false; - if (a.is8Bit()) { - if (b.is8Bit()) - return equalIgnoringASCIICase(a.characters8(), b.characters8(), length); - return equalIgnoringASCIICase(a.characters8(), b.characters16(), length); - } - if (b.is8Bit()) - return equalIgnoringASCIICase(a.characters16(), b.characters8(), length); - return equalIgnoringASCIICase(a.characters16(), b.characters16(), length); -} +WTF_EXPORT bool equalIgnoringASCIICase(const StringImpl*, const StringImpl*); +WTF_EXPORT bool equalIgnoringASCIICase(const StringImpl*, const LChar*); template<typename CharacterType> inline size_t find(const CharacterType* characters, unsigned length, CharacterType matchCharacter, unsigned index = 0)
diff --git a/third_party/WebKit/Source/wtf/text/WTFString.h b/third_party/WebKit/Source/wtf/text/WTFString.h index 8643fba..105130c 100644 --- a/third_party/WebKit/Source/wtf/text/WTFString.h +++ b/third_party/WebKit/Source/wtf/text/WTFString.h
@@ -502,6 +502,8 @@ inline bool equalIgnoringCase(const LChar* a, const String& b) { return equalIgnoringCase(a, b.impl()); } inline bool equalIgnoringCase(const char* a, const String& b) { return equalIgnoringCase(reinterpret_cast<const LChar*>(a), b.impl()); } +inline bool equalIgnoringASCIICase(const String& a, const String& b) { return equalIgnoringASCIICase(a.impl(), b.impl()); } + inline bool equalPossiblyIgnoringCase(const String& a, const String& b, bool ignoreCase) { return ignoreCase ? equalIgnoringCase(a, b) : (a == b);
diff --git a/third_party/WebKit/public/platform/modules/background_sync/WebSyncProvider.h b/third_party/WebKit/public/platform/modules/background_sync/WebSyncProvider.h index 890ffbb..92a682f 100644 --- a/third_party/WebKit/public/platform/modules/background_sync/WebSyncProvider.h +++ b/third_party/WebKit/public/platform/modules/background_sync/WebSyncProvider.h
@@ -37,15 +37,15 @@ // Takes ownership of the WebSyncRegistrationCallbacks. // Does not take ownership of the WebServiceWorkerRegistration. - virtual void getRegistration(blink::WebSyncRegistration::Periodicity, const WebString&, WebServiceWorkerRegistration*, WebSyncRegistrationCallbacks*) = 0; + virtual void getRegistration(const WebString&, WebServiceWorkerRegistration*, WebSyncRegistrationCallbacks*) = 0; // Takes ownership of the WebSyncGetRegistrationsCallbacks. // Does not take ownership of the WebServiceWorkerRegistration. - virtual void getRegistrations(blink::WebSyncRegistration::Periodicity, WebServiceWorkerRegistration*, WebSyncGetRegistrationsCallbacks*) = 0; + virtual void getRegistrations(WebServiceWorkerRegistration*, WebSyncGetRegistrationsCallbacks*) = 0; // Takes ownership of the WebSyncGetPermissionStatusCallbacks. // Does not take ownership of the WebServiceWorkerRegistration. - virtual void getPermissionStatus(blink::WebSyncRegistration::Periodicity, WebServiceWorkerRegistration*, WebSyncGetPermissionStatusCallbacks*) = 0; + virtual void getPermissionStatus(WebServiceWorkerRegistration*, WebSyncGetPermissionStatusCallbacks*) = 0; // Takes ownership of the WebSyncNotifyWhenFinishedCallbacks. virtual void notifyWhenFinished(int64_t handleId, WebSyncNotifyWhenFinishedCallbacks*) = 0;
diff --git a/third_party/WebKit/public/platform/modules/background_sync/WebSyncRegistration.h b/third_party/WebKit/public/platform/modules/background_sync/WebSyncRegistration.h index 880aea4..1fabc784 100644 --- a/third_party/WebKit/public/platform/modules/background_sync/WebSyncRegistration.h +++ b/third_party/WebKit/public/platform/modules/background_sync/WebSyncRegistration.h
@@ -20,28 +20,18 @@ enum { UNREGISTERED_SYNC_ID = -1}; - enum Periodicity { - PeriodicityPeriodic = 0, - PeriodicityOneShot, - PeriodicityLast = PeriodicityOneShot - }; - WebSyncRegistration() : id(UNREGISTERED_SYNC_ID) - , periodicity(PeriodicityOneShot) , tag("") - , minPeriodMs(0) , networkState(NetworkState::NetworkStateOnline) { } - WebSyncRegistration(int64_t id, Periodicity periodicity, - const WebString& registrationTag, unsigned long minPeriodMs, + WebSyncRegistration(int64_t id, + const WebString& registrationTag, NetworkState networkState) : id(id) - , periodicity(periodicity) , tag(registrationTag) - , minPeriodMs(minPeriodMs) , networkState(networkState) { } @@ -49,19 +39,7 @@ /* Internal identity; not exposed to JS API. */ int64_t id; - /* Internal flag; not directly exposed to JS API. - * Instead, this determines whether this object is represented in JS as a - * SyncRegistration or a PeriodicSyncRegistration. - */ - Periodicity periodicity; - WebString tag; - - /* Minimum time between periodic sync events, in milliseconds. A 0 value - * here means that the event is a one-shot (not periodic.) - */ - unsigned long minPeriodMs; - NetworkState networkState; };
diff --git a/third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothError.h b/third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothError.h index b8448d62..a67a7fb 100644 --- a/third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothError.h +++ b/third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothError.h
@@ -55,6 +55,7 @@ GATTUntranslatedErrorCode, // SecurityError: GATTNotAuthorized, + RequestDeviceWithUniqueOrigin, RequestDeviceWithoutFrame, // SyntaxError:
diff --git a/third_party/WebKit/public/web/WebFrameSerializer.h b/third_party/WebKit/public/web/WebFrameSerializer.h index 7776d2c..3bba668 100644 --- a/third_party/WebKit/public/web/WebFrameSerializer.h +++ b/third_party/WebKit/public/web/WebFrameSerializer.h
@@ -38,8 +38,6 @@ #include "../platform/WebURL.h" #include "../platform/WebVector.h" -#include <utility> - namespace blink { class WebFrameSerializerClient; @@ -74,7 +72,7 @@ // Format note - the returned string should be of the form "<foo@bar.com>" // (i.e. the strings should include the angle brackets). The method // should return null WebString if the frame doesn't have a content-id. - virtual WebString getContentID(const WebFrame&) = 0; + virtual WebString getContentID(WebFrame*) = 0; }; // Generates and returns MHTML parts for the given frame and the @@ -98,23 +96,41 @@ // The API below is an older implementation of frame serialization that // will be removed soon. + class LinkRewritingDelegate { + public: + // Method allowing the delegate control which URLs are written into the + // generated html document. + // + // When URL of the given frame needs to be rewritten, this method should + // return true and populate |rewrittenLink| with a desired value of the + // html attribute value to be used in place of the original link (i.e. + // in place of the original iframe.src or object.data attribute value). + // + // If no link rewriting is desired, this method should return false. + virtual bool rewriteFrameSource(WebFrame*, WebString* rewrittenLink) = 0; + + // Method allowing the delegate control which URLs are written into the + // generated html document. + // + // When the given URL needs to be rewritten, this method should + // return true and populate |rewrittenLink| with a desired value of the + // html attribute value to be used in place of the original link (i.e. + // in place of the original img.src or blockquote.cite attribute value). + // + // If no link rewriting is desired, this method should return false. + virtual bool rewriteLink(const WebURL&, WebString* rewrittenLink) = 0; + }; + // This function will serialize the specified frame to HTML data. // We have a data buffer to temporary saving generated html data. We will // sequentially call WebFrameSerializerClient once the data buffer is full. // - // Return false means if no data has been serialized (i.e. because + // False is returned if no data has been serialized (i.e. because // the target frame didn't have a valid url). - // - // The parameter frame specifies which frame need to be serialized. - // The parameter client specifies the pointer of interface - // WebFrameSerializerClient providing a sink interface to receive the - // individual chunks of data to be saved. - // The parameter urlsToLocalPaths contains a mapping between original URLs - // of saved resources and corresponding local file paths. BLINK_EXPORT static bool serialize( WebLocalFrame*, WebFrameSerializerClient*, - const WebVector<std::pair<WebURL, WebString>>& urlsToLocalPaths); + LinkRewritingDelegate*); // FIXME: The following are here for unit testing purposes. Consider // changing the unit tests instead.
diff --git a/third_party/polymer/README.chromium b/third_party/polymer/README.chromium index a873957..d90a1d3 100644 --- a/third_party/polymer/README.chromium +++ b/third_party/polymer/README.chromium
@@ -1,26 +1,21 @@ Name: Polymer Short Name: polymer URL: http://www.polymer-project.org -Version: 0.5.2-4 -Revision: (See components/<component>/.bower.json) +Version: 1.2.3 +Revision: (see v1_0/components_summary.txt) License: BSD License File: LICENSE.polymer Security Critical: no Description: -This directory contains a copy of the following components which are a part of -the Polymer project: --polymer --all core elements and their dependencies (except "core-docs", - "core-component-page", and "core-doc-viewer") --all paper elements and their dependencies (except "paper-menu-button") -See bower.json for a full list of components. - -The version can be found in header of polymer/polymer.js. The license can -be found in polymer/LICENSE. +This directory contains a copy of the Polymer framework and some elements from +the Polymer elements catalog (https://elements.polymer-project.org/). See +v1_0/components_summary.txt for a full list of components. The source git repositories can be found at: -https://github.com/Polymer/<component> +https://github.com/Polymer/polymer +https://github.com/PolymerElements/<component-name> +https://github.com/PolymerLabs/polymer-externs Polymer is comprised of two efforts: 1. A set of core platform features (Shadow DOM, Custom Elements, MDV). @@ -31,23 +26,21 @@ technologies called the Polymer. Local Modifications: -- Removed executable bit from the files in 'components/core-list'. -- Created a copy 'components-chromium' of the 'components' directory with the -only difference that all inline JavaScript blocks are extracted from Polymer -HTML elements to external JS files. This version of the Polymer is used in a web -UI, where CSP forbids an execution of inline scripts. The extraction was made -with the help of the Vulcanize tool (https://github.com/Polymer/vulcanize). +- Applied modifications that can be found in v1_0/chromium.patch. +- All inline JavaScript blocks are extracted from Polymer HTML elements to +external JS files. This version of the Polymer is used in a web UI, where CSP +forbids an execution of inline scripts. The extraction was made with the help of +the Crisper tool (https://github.com/PolymerLabs/crisper). +- Removed executable bit from some files. +- Resolved encoding issues. - Replaced CRLF line endings with LF line endings in text files. -To restore a content of the 'components', 'components-chromium' directorires -from scratch, run ./reproduce.sh (requires bower and vulcanize >= 0.7.2). +To restore a content of the 'components-chromium' directory from scratch, run +./v1_0/reproduce.sh (requires bower and crisper) on a Linux machine. Note on Bower: The directory can be updated by running "bower update". A new component can be -installed by running "bower install -S Polymer/<component>#version". Be sure to -add the .bower.json file to the repository as it includes the revision -information of the polymer component. -Also be sure that you listed all the added packages and **all their -dependencies** in bower.json, and specified **exact** versions of every package -explicitly. That is needed because Bower can't handle recursive dependencies -correctly (see http://stackoverflow.com/q/25899532). +installed by running "bower install -S PolymerElements/<component>#version". +Be sure to add the .bower.json file to the repository as it includes the +revision information of the polymer component. +Also be sure that you listed all the added packages in bower.json.
diff --git a/third_party/polymer/v1_0/README.chromium b/third_party/polymer/v1_0/README.chromium deleted file mode 100644 index 25ba3a3..0000000 --- a/third_party/polymer/v1_0/README.chromium +++ /dev/null
@@ -1,57 +0,0 @@ -Name: Polymer -Short Name: polymer -URL: http://www.polymer-project.org -Version: 1.2.1 -Revision: (See components/<component>/.bower.json) -License: BSD -License File: ../LICENSE.polymer -Security Critical: no - -Description: -This directory contains a copy of the following components which are a part of -the Polymer project: --polymer core + externs --Iron elements and their dependencies --Paper elements and their dependencies -See bower.json for a full list of components. - -The version can be found in header of polymer/polymer.js. The license can -be found in polymer/LICENSE. - -The source git repositories can be found at: -Core Library - https://github.com/Polymer/polymer -Elements - https://github.com/PolymerElements/<element name> - -Polymer is comprised of two efforts: -1. A set of core platform features (Shadow DOM, Custom Elements, MDV). -Initially, these core features will be enabled with a set of polyfills. As -browsers begin to implement these new primitives, the polyfill platform layer -becomes smaller and better over time. -2. A next-generation web application framework built upon these core -technologies called the Polymer. - -Local Modifications: -- Removed executable bit from the files in 'components/iron-selector'. -- Created a copy 'components-chromium' of the 'components' directory with the -only difference that all inline JavaScript blocks are extracted from Polymer -HTML elements to external JS files. This version of the Polymer is used in a web -UI, where CSP forbids an execution of inline scripts. The extraction was made -using Crisper (https://github.com/PolymerLabs/crisper). -- Replaced CRLF line endings with LF line endings in text files. -- Apply chromium.patch with local modifications. The patch is applied to -components-chromium (i.e. after extracting the inline scripts) so that the -results of 'git diff' (after any new local changes are applied) can be appended -to chromium.patch. - -To restore the contents of the 'components' and 'components-chromium' -directories from scratch, run ./reproduce.sh (requires bower and crisper). - -Note on Bower: -The directory can be updated by running "bower update". A new component can be -installed by running "bower install -S Polymer/<component>#version". Be sure to -add the .bower.json file to the repository as it includes the revision -information of the polymer component. -Also be sure that you listed all the added packages and **all their -dependencies** in bower.json, and specified **exact** versions of every package -explicitly. That is needed because Bower can't handle recursive dependencies -correctly (see http://stackoverflow.com/q/25899532).
diff --git a/third_party/polymer/v1_0/components_summary.txt b/third_party/polymer/v1_0/components_summary.txt new file mode 100644 index 0000000..2254877 --- /dev/null +++ b/third_party/polymer/v1_0/components_summary.txt
@@ -0,0 +1,399 @@ +Name: font-roboto +Version: 1.0.1 +Repository: git://github.com/PolymerElements/font-roboto.git +Tag: v1.0.1 +Revision: 21ce9b51a417fa9995cf6606e886aba0728f70a1 +Tree link: https://github.com/PolymerElements/font-roboto/tree/v1.0.1 + +Name: iron-a11y-keys +Version: 1.0.4 +Repository: git://github.com/PolymerElements/iron-a11y-keys.git +Tag: v1.0.4 +Revision: 51a34396a392bcfb45592900973c35eceb11f0d7 +Tree link: https://github.com/PolymerElements/iron-a11y-keys/tree/v1.0.4 + +Name: iron-a11y-keys-behavior +Version: 1.1.1 +Repository: git://github.com/PolymerElements/iron-a11y-keys-behavior.git +Tag: v1.1.1 +Revision: 12af7cb19b2c6b3887e37a5ea1501ffe676d1e8a +Tree link: https://github.com/PolymerElements/iron-a11y-keys-behavior/tree/v1.1.1 + +Name: iron-autogrow-textarea +Version: 1.0.10 +Repository: git://github.com/PolymerElements/iron-autogrow-textarea.git +Tag: v1.0.10 +Revision: 1ba4f97e250dc14e9638d95be582dd62b9083736 +Tree link: https://github.com/PolymerElements/iron-autogrow-textarea/tree/v1.0.10 + +Name: iron-behaviors +Version: 1.0.12 +Repository: git://github.com/PolymerElements/iron-behaviors.git +Tag: v1.0.12 +Revision: 657f526a2382a659cdf4e13be87ecc89261588a3 +Tree link: https://github.com/PolymerElements/iron-behaviors/tree/v1.0.12 + +Name: iron-checked-element-behavior +Version: 1.0.4 +Repository: git://github.com/PolymerElements/iron-checked-element-behavior.git +Tag: v1.0.4 +Revision: cc30263ec2871ae8f8f944948f44299d3f3cdf0d +Tree link: https://github.com/PolymerElements/iron-checked-element-behavior/tree/v1.0.4 + +Name: iron-collapse +Version: 1.0.5 +Repository: git://github.com/PolymerElements/iron-collapse.git +Tag: v1.0.5 +Revision: 4d489766568b823d39e5032e2cbb4b85758f1a88 +Tree link: https://github.com/PolymerElements/iron-collapse/tree/v1.0.5 + +Name: iron-dropdown +Version: 1.1.0 +Repository: git://github.com/PolymerElements/iron-dropdown.git +Tag: v1.1.0 +Revision: b09b0d57ba917bac9315de4761373d88e85ac52e +Tree link: https://github.com/PolymerElements/iron-dropdown/tree/v1.1.0 + +Name: iron-fit-behavior +Version: 1.0.5 +Repository: git://github.com/PolymerElements/iron-fit-behavior.git +Tag: v1.0.5 +Revision: 18dec1eb5c7217be4d360c0fb9101fe899136f92 +Tree link: https://github.com/PolymerElements/iron-fit-behavior/tree/v1.0.5 + +Name: iron-flex-layout +Version: 1.2.2 +Repository: git://github.com/PolymerElements/iron-flex-layout.git +Tag: v1.2.2 +Revision: 41c4f35be1368afb770312b907a258175565dbdf +Tree link: https://github.com/PolymerElements/iron-flex-layout/tree/v1.2.2 + +Name: iron-form-element-behavior +Version: 1.0.6 +Repository: git://github.com/PolymerElements/iron-form-element-behavior.git +Tag: v1.0.6 +Revision: cf9e09ded62daf3363852ce98260aaad1ed0fae1 +Tree link: https://github.com/PolymerElements/iron-form-element-behavior/tree/v1.0.6 + +Name: iron-icon +Version: 1.0.7 +Repository: git://github.com/PolymerElements/iron-icon.git +Tag: v1.0.7 +Revision: 6f4d152dc3998a6cc12a5a585a654f893dc99381 +Tree link: https://github.com/PolymerElements/iron-icon/tree/v1.0.7 + +Name: iron-icons +Version: 1.1.2 +Repository: git://github.com/PolymerElements/iron-icons.git +Tag: v1.1.2 +Revision: 14a4138f7da753ee8bebeb9ed4abd6053b2496dd +Tree link: https://github.com/PolymerElements/iron-icons/tree/v1.1.2 + +Name: iron-iconset-svg +Version: 1.0.9 +Repository: git://github.com/PolymerElements/iron-iconset-svg.git +Tag: v1.0.9 +Revision: ce9b2ea1f73d936cffdd05f3fe34b1f69d1d32db +Tree link: https://github.com/PolymerElements/iron-iconset-svg/tree/v1.0.9 + +Name: iron-image +Version: 1.2.0 +Repository: git://github.com/PolymerElements/iron-image.git +Tag: v1.2.0 +Revision: 29ec1efa9af2f7ea17e6b819ae4e9ab941b04c71 +Tree link: https://github.com/PolymerElements/iron-image/tree/v1.2.0 + +Name: iron-input +Version: 1.0.8 +Repository: git://github.com/PolymerElements/iron-input.git +Tag: 1.0.8 +Revision: 55d2b39ead32b8d90da538daa1a6681fd9ae89d9 +Tree link: https://github.com/PolymerElements/iron-input/tree/1.0.8 + +Name: iron-list +Version: 1.1.7 +Repository: git://github.com/PolymerElements/iron-list.git +Tag: v1.1.7 +Revision: a00edace6cac13c16ba6e7a930d29a14b98e44c7 +Tree link: https://github.com/PolymerElements/iron-list/tree/v1.1.7 + +Name: iron-media-query +Version: 1.0.8 +Repository: git://github.com/PolymerElements/iron-media-query.git +Tag: v1.0.8 +Revision: 3f916be171af7a3e03eb019acdfea71055d3c744 +Tree link: https://github.com/PolymerElements/iron-media-query/tree/v1.0.8 + +Name: iron-menu-behavior +Version: 1.0.7 +Repository: git://github.com/PolymerElements/iron-menu-behavior.git +Tag: v1.0.7 +Revision: e5ca054bbe1c24fbc43adb78217ccc50d9223601 +Tree link: https://github.com/PolymerElements/iron-menu-behavior/tree/v1.0.7 + +Name: iron-meta +Version: 1.1.1 +Repository: git://github.com/PolymerElements/iron-meta.git +Tag: v1.1.1 +Revision: e171ee234b482219c9514e6f9551df48ef48bd9f +Tree link: https://github.com/PolymerElements/iron-meta/tree/v1.1.1 + +Name: iron-overlay-behavior +Version: 1.1.2 +Repository: git://github.com/PolymerElements/iron-overlay-behavior.git +Tag: v1.1.2 +Revision: 40e39a971474f48f5c2c8ee7b8568a0ad5426bd8 +Tree link: https://github.com/PolymerElements/iron-overlay-behavior/tree/v1.1.2 + +Name: iron-pages +Version: 1.0.5 +Repository: git://github.com/PolymerElements/iron-pages.git +Tag: v1.0.5 +Revision: e248782cb5595849e08454ae863d1ca3b7b94e0b +Tree link: https://github.com/PolymerElements/iron-pages/tree/v1.0.5 + +Name: iron-range-behavior +Version: 1.0.4 +Repository: git://github.com/PolymerElements/iron-range-behavior.git +Tag: v1.0.4 +Revision: 71774a7d8a8c377496bfe05e60b754e91216e0b9 +Tree link: https://github.com/PolymerElements/iron-range-behavior/tree/v1.0.4 + +Name: iron-resizable-behavior +Version: 1.0.2 +Repository: git://github.com/PolymerElements/iron-resizable-behavior.git +Tag: v1.0.2 +Revision: 85de8ba28be2bf17c81d6436ef1119022b003674 +Tree link: https://github.com/PolymerElements/iron-resizable-behavior/tree/v1.0.2 + +Name: iron-selector +Version: 1.0.8 +Repository: git://github.com/PolymerElements/iron-selector.git +Tag: v1.0.8 +Revision: e9a66727f3da0446f04956d4e4f1dcd51cdec2ff +Tree link: https://github.com/PolymerElements/iron-selector/tree/v1.0.8 + +Name: iron-test-helpers +Version: 1.1.3 +Repository: git://github.com/PolymerElements/iron-test-helpers.git +Tag: v1.1.3 +Revision: 51e03645e9a5a7884b5fadc567508e1d730e9174 +Tree link: https://github.com/PolymerElements/iron-test-helpers/tree/v1.1.3 + +Name: iron-validatable-behavior +Version: 1.0.5 +Repository: git://github.com/PolymerElements/iron-validatable-behavior.git +Tag: v1.0.5 +Revision: c1334b835892b3d7a329a8e6b8741d4be3a8d99c +Tree link: https://github.com/PolymerElements/iron-validatable-behavior/tree/v1.0.5 + +Name: neon-animation +Version: 1.0.9 +Repository: git://github.com/PolymerElements/neon-animation.git +Tag: v1.0.9 +Revision: ab40f4e4a777153cb5c27c9b62ee82b94d53eb76 +Tree link: https://github.com/PolymerElements/neon-animation/tree/v1.0.9 + +Name: paper-behaviors +Version: 1.0.10 +Repository: git://github.com/PolymerElements/paper-behaviors.git +Tag: v1.0.10 +Revision: 4b244a542af2c6c271498dfb98b00ed284df1d6a +Tree link: https://github.com/PolymerElements/paper-behaviors/tree/v1.0.10 + +Name: paper-button +Version: 1.0.11 +Repository: git://github.com/PolymerElements/paper-button.git +Tag: v1.0.11 +Revision: 7d0f75300372d91835ae7298593d50987d4a610f +Tree link: https://github.com/PolymerElements/paper-button/tree/v1.0.11 + +Name: paper-card +Version: 1.0.9 +Repository: git://github.com/PolymerElements/paper-card.git +Tag: v1.0.9 +Revision: 9733d402e93270be96bdafb4b796aea598a7db26 +Tree link: https://github.com/PolymerElements/paper-card/tree/v1.0.9 + +Name: paper-checkbox +Version: 1.1.0 +Repository: git://github.com/PolymerElements/paper-checkbox.git +Tag: v1.1.0 +Revision: ee47421a36034bdf540fabeea713b4b11a7c11ac +Tree link: https://github.com/PolymerElements/paper-checkbox/tree/v1.1.0 + +Name: paper-dialog +Version: 1.0.3 +Repository: git://github.com/PolymerElements/paper-dialog.git +Tag: v1.0.3 +Revision: ec85b110e11e9d390f601e1c88ebf97984b53d82 +Tree link: https://github.com/PolymerElements/paper-dialog/tree/v1.0.3 + +Name: paper-dialog-behavior +Version: 1.1.0 +Repository: git://github.com/PolymerElements/paper-dialog-behavior.git +Tag: v1.1.0 +Revision: e41d36a798df2ee2f9f49fb27dd7712e55366595 +Tree link: https://github.com/PolymerElements/paper-dialog-behavior/tree/v1.1.0 + +Name: paper-drawer-panel +Version: 1.0.6 +Repository: git://github.com/PolymerElements/paper-drawer-panel.git +Tag: v1.0.6 +Revision: 9dd19ef9153ed303a5f8b6d573179cde31b2f5e6 +Tree link: https://github.com/PolymerElements/paper-drawer-panel/tree/v1.0.6 + +Name: paper-dropdown-menu +Version: 1.1.2 +Repository: git://github.com/PolymerElements/paper-dropdown-menu.git +Tag: v1.1.2 +Revision: 704fbc176592da9bb3f23e138ef8f3b0533d865b +Tree link: https://github.com/PolymerElements/paper-dropdown-menu/tree/v1.1.2 + +Name: paper-fab +Version: 1.1.2 +Repository: git://github.com/PolymerElements/paper-fab.git +Tag: v1.1.2 +Revision: 19bf68f79e4ece424bbaf4cfa1c74c62d481c75d +Tree link: https://github.com/PolymerElements/paper-fab/tree/v1.1.2 + +Name: paper-header-panel +Version: 1.1.2 +Repository: git://github.com/PolymerElements/paper-header-panel.git +Tag: v1.1.2 +Revision: ea23746cc0e399e9e4f75f19cf514e261d89cca1 +Tree link: https://github.com/PolymerElements/paper-header-panel/tree/v1.1.2 + +Name: paper-icon-button +Version: 1.0.6 +Repository: git://github.com/PolymerElements/paper-icon-button.git +Tag: v1.0.6 +Revision: 35347d81939093cd2abe2783ac1b17fa57b7b303 +Tree link: https://github.com/PolymerElements/paper-icon-button/tree/v1.0.6 + +Name: paper-input +Version: 1.1.5 +Repository: git://github.com/PolymerElements/paper-input.git +Tag: v1.1.5 +Revision: 0aa8318b5e026688f94c78c7673acabf5bad0f17 +Tree link: https://github.com/PolymerElements/paper-input/tree/v1.1.5 + +Name: paper-item +Version: 1.1.3 +Repository: git://github.com/PolymerElements/paper-item.git +Tag: v1.1.3 +Revision: 280c2e703315a6f1f707bec6fd0b1e0b80fee8f4 +Tree link: https://github.com/PolymerElements/paper-item/tree/v1.1.3 + +Name: paper-material +Version: 1.0.5 +Repository: git://github.com/PolymerElements/paper-material.git +Tag: v1.0.5 +Revision: 8a906004d8d0071004aafcd4bc4536ed2cf14bde +Tree link: https://github.com/PolymerElements/paper-material/tree/v1.0.5 + +Name: paper-menu +Version: 1.2.2 +Repository: git://github.com/PolymerElements/paper-menu.git +Tag: v1.2.2 +Revision: f31a1dbc5b594a84c8c01eca0f23f9bcb8f6ba76 +Tree link: https://github.com/PolymerElements/paper-menu/tree/v1.2.2 + +Name: paper-menu-button +Version: 1.0.4 +Repository: git://github.com/PolymerElements/paper-menu-button.git +Tag: v1.0.4 +Revision: 886c7eb904a5d59652adc0a127a8e0eab7e0f663 +Tree link: https://github.com/PolymerElements/paper-menu-button/tree/v1.0.4 + +Name: paper-progress +Version: 1.0.8 +Repository: git://github.com/PolymerElements/paper-progress.git +Tag: v1.0.8 +Revision: 9d879787a55c95eedaa28cfd65813de4367bc858 +Tree link: https://github.com/PolymerElements/paper-progress/tree/v1.0.8 + +Name: paper-radio-button +Version: 1.0.12 +Repository: git://github.com/PolymerElements/paper-radio-button.git +Tag: v1.0.12 +Revision: d7a5a090968c8448d7568208e05fb626fe74ab64 +Tree link: https://github.com/PolymerElements/paper-radio-button/tree/v1.0.12 + +Name: paper-radio-group +Version: 1.0.9 +Repository: git://github.com/PolymerElements/paper-radio-group.git +Tag: v1.0.9 +Revision: 27a8447ed1709dd1a9bef514acd7dee218604077 +Tree link: https://github.com/PolymerElements/paper-radio-group/tree/v1.0.9 + +Name: paper-ripple +Version: 1.0.5 +Repository: git://github.com/PolymerElements/paper-ripple.git +Tag: v1.0.5 +Revision: d72e7a9a8ab518b901ed18dde492df3b87a93be5 +Tree link: https://github.com/PolymerElements/paper-ripple/tree/v1.0.5 + +Name: paper-slider +Version: 1.0.9 +Repository: git://github.com/PolymerElements/paper-slider.git +Tag: v1.0.9 +Revision: 5814b574e9440cec40619157f00b7aa2ced20c8d +Tree link: https://github.com/PolymerElements/paper-slider/tree/v1.0.9 + +Name: paper-spinner +Version: 1.1.0 +Repository: git://github.com/PolymerElements/paper-spinner.git +Tag: v1.1.0 +Revision: 66d77a91969b5f2deff4f2363740ccf4a47d423b +Tree link: https://github.com/PolymerElements/paper-spinner/tree/v1.1.0 + +Name: paper-styles +Version: 1.1.2 +Repository: git://github.com/PolymerElements/paper-styles.git +Tag: v1.1.2 +Revision: 7b97fa9d2c190bec9ef2d771d91f47b40a27f3be +Tree link: https://github.com/PolymerElements/paper-styles/tree/v1.1.2 + +Name: paper-tabs +Version: 1.2.5 +Repository: git://github.com/PolymerElements/paper-tabs.git +Tag: v1.2.5 +Revision: 3892c715cc89199160a9fe6ba7b19441bb44c192 +Tree link: https://github.com/PolymerElements/paper-tabs/tree/v1.2.5 + +Name: paper-toggle-button +Version: 1.0.14 +Repository: git://github.com/PolymerElements/paper-toggle-button.git +Tag: v1.0.14 +Revision: 131f32adf5ce831f94be7f80c436865b44d7cd95 +Tree link: https://github.com/PolymerElements/paper-toggle-button/tree/v1.0.14 + +Name: paper-toolbar +Version: 1.1.2 +Repository: git://github.com/PolymerElements/paper-toolbar.git +Tag: v1.1.2 +Revision: 1a0b9ec5c97b0751ab237670124d11bfdabcb850 +Tree link: https://github.com/PolymerElements/paper-toolbar/tree/v1.1.2 + +Name: paper-tooltip +Version: 1.1.1 +Repository: git://github.com/PolymerElements/paper-tooltip.git +Tag: v1.1.1 +Revision: 0b274f0ad241877fd316101b43fe48b013a470b6 +Tree link: https://github.com/PolymerElements/paper-tooltip/tree/v1.1.1 + +Name: polymer +Version: 1.2.3 +Repository: git://github.com/Polymer/polymer.git +Tag: v1.2.3 +Revision: aa535d1675342007cbf64dc9c66497cf74cbc616 +Tree link: https://github.com/Polymer/polymer/tree/v1.2.3 + +Name: polymer-externs +Version: 1.0.15 +Repository: git://github.com/PolymerLabs/polymer-externs.git +Tag: v1.0.15 +Revision: 972c43cdc030e2162a2127aac63d24ad67ca679c +Tree link: https://github.com/PolymerLabs/polymer-externs/tree/v1.0.15 +
diff --git a/third_party/polymer/v1_0/create_components_summary.py b/third_party/polymer/v1_0/create_components_summary.py new file mode 100644 index 0000000..a5df89c0 --- /dev/null +++ b/third_party/polymer/v1_0/create_components_summary.py
@@ -0,0 +1,36 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os +import json + +COMPONENTS_DIR = 'components-chromium' +COMPONENT_SUMMARY =\ +"""Name: %(name)s +Version: %(version)s +Repository: %(repository)s +Tag: %(tag)s +Revision: %(revision)s +Tree link: %(tree)s +""" + +for entry in sorted(os.listdir(COMPONENTS_DIR)): + component_path = os.path.join(COMPONENTS_DIR, entry) + if not os.path.isdir(component_path): + continue + bower_path = os.path.join(component_path, '.bower.json') + if not os.path.isfile(bower_path): + raise Exception('%s is not a file.' % bower_path) + with open(bower_path) as stream: + info = json.load(stream) + repository = info['_source'] + tree = 'https%s/tree/%s' % (repository[3:-4], info['_resolution']['tag']) + print COMPONENT_SUMMARY % { + 'name': info['name'], + 'version': info['version'], + 'repository': repository, + 'tag': info['_resolution']['tag'], + 'revision': info['_resolution']['commit'], + 'tree': tree + }
diff --git a/third_party/polymer/v1_0/reproduce.sh b/third_party/polymer/v1_0/reproduce.sh index ef74fd8..b52aba5 100755 --- a/third_party/polymer/v1_0/reproduce.sh +++ b/third_party/polymer/v1_0/reproduce.sh
@@ -6,8 +6,8 @@ # Reproduces the content of 'components' and 'components-chromium' using the # list of dependencies from 'bower.json'. Downloads needed packages and makes -# Chromium specific modifications. To launch the script you need 'bower', -# 'crisper', and 'vulcanize' installed on your system. +# Chromium specific modifications. To launch the script you need 'bower' and +# 'crisper' installed on your system. set -e @@ -61,7 +61,7 @@ patch -p1 < chromium.patch new=$(git status --porcelain components-chromium | grep '^??' | \ - cut -d' ' -f2 | egrep '\.(html|js|css)$') + cut -d' ' -f2 | egrep '\.(html|js|css)$' || true) if [[ ! -z "${new}" ]]; then echo @@ -70,7 +70,7 @@ fi deleted=$(git status --porcelain components-chromium | grep '^.D' | \ - sed 's/^.//' | cut -d' ' -f2 | egrep '\.(html|js|css)$') + sed 's/^.//' | cut -d' ' -f2 | egrep '\.(html|js|css)$' || true) if [[ ! -z "${deleted}" ]]; then echo @@ -81,3 +81,5 @@ if [[ ! -z "${new}${deleted}" ]]; then echo fi + +python create_components_summary.py > components_summary.txt
diff --git a/third_party/tcmalloc/README.chromium b/third_party/tcmalloc/README.chromium index d857d070..881fc58d 100644 --- a/third_party/tcmalloc/README.chromium +++ b/third_party/tcmalloc/README.chromium
@@ -93,7 +93,6 @@ simulated stack from the embedding application. - Inserted spaces around PRIx64, SCNx64 and friends, for c++11 compatibility. - Fix sprintf formatting warning in MaybeDumpProfileLocked -- Added tc_malloc_skip_new_handler. - Fix logging issues in android - Changed DEFINE_foo macros to ignore envname unless ENABLE_PROFILING is defined - Changed DEFINE_string to define const char*s instead of strings @@ -102,3 +101,4 @@ - Add generic.total_physical_bytes property to MallocExtension - Conditionally define HAVE_VDSO_SUPPORT only on linux_x86 to avoid static initializers - Add TC_MALLOPT_IS_OVERRIDDEN_BY_TCMALLOC mallopt() arg +- Added tc_malloc_skip_new_handler.
diff --git a/third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h b/third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h index 501abd6..e62ce7a 100644 --- a/third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h +++ b/third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h
@@ -93,6 +93,7 @@ const char** patch) __THROW; PERFTOOLS_DLL_DECL void* tc_malloc(size_t size) __THROW; + PERFTOOLS_DLL_DECL void* tc_malloc_skip_new_handler(size_t size); PERFTOOLS_DLL_DECL void tc_free(void* ptr) __THROW; PERFTOOLS_DLL_DECL void* tc_realloc(void* ptr, size_t size) __THROW; PERFTOOLS_DLL_DECL void* tc_calloc(size_t nmemb, size_t size) __THROW;
diff --git a/third_party/tcmalloc/chromium/src/tcmalloc.cc b/third_party/tcmalloc/chromium/src/tcmalloc.cc index 3077b75..4ea7cdc 100644 --- a/third_party/tcmalloc/chromium/src/tcmalloc.cc +++ b/third_party/tcmalloc/chromium/src/tcmalloc.cc
@@ -1746,12 +1746,6 @@ #endif // TCMALLOC_USING_DEBUGALLOCATION -#if defined(OS_LINUX) -// Alias the weak symbol in chromium to our implementation. -extern "C" __attribute__((visibility("default"), alias("tc_malloc_skip_new_handler"))) -void* tc_malloc_skip_new_handler_weak(size_t size); -#endif - // --- Validation implementation with an extra mark ---------------------------- // We will put a mark at the extreme end of each allocation block. We make // sure that we always allocate enough "extra memory" that we can fit in the
diff --git a/third_party/tlslite/README.chromium b/third_party/tlslite/README.chromium index e995e95..3bc992d 100644 --- a/third_party/tlslite/README.chromium +++ b/third_party/tlslite/README.chromium
@@ -45,3 +45,7 @@ binding negotiation TLS extension (draft-ietf-tokbind-negotiation-00) - patches/disable_channel_id.patch: Add flag to HandshakeSettings to allow for disabling channel id. +- patches/exported_keying_material.patch: Add method to Session to get + exported keying material (RFC 5705) for use in e.g. Token Binding. +- patches/token_binding_resumption.patch: Fix token binding negotiation + extension to work on session resumption.
diff --git a/third_party/tlslite/patches/exported_keying_material.patch b/third_party/tlslite/patches/exported_keying_material.patch new file mode 100644 index 0000000..9d4ed9c --- /dev/null +++ b/third_party/tlslite/patches/exported_keying_material.patch
@@ -0,0 +1,56 @@ +diff --git a/third_party/tlslite/tlslite/tlsconnection.py b/third_party/tlslite/tlslite/tlsconnection.py +index 7363a30..e42b362 100644 +--- a/third_party/tlslite/tlslite/tlsconnection.py ++++ b/third_party/tlslite/tlslite/tlsconnection.py +@@ -181,6 +181,8 @@ class TLSConnection(TLSRecordLayer): + @type sock: L{socket.socket} + """ + TLSRecordLayer.__init__(self, sock) ++ self.clientRandom = b"" ++ self.serverRandom = b"" + + #********************************************************* + # Client Handshake Functions +@@ -606,6 +608,9 @@ class TLSConnection(TLSRecordLayer): + else: break + masterSecret = result + ++ self.clientRandom = clientHello.random ++ self.serverRandom = serverHello.random ++ + # Create the session object which is used for resumptions + self.session = Session() + self.session.create(masterSecret, serverHello.session_id, cipherSuite, +@@ -1398,6 +1403,9 @@ class TLSConnection(TLSRecordLayer): + else: break + masterSecret = result + ++ self.clientRandom = clientHello.random ++ self.serverRandom = serverHello.random ++ + #Create the session object + self.session = Session() + if cipherSuite in CipherSuite.certAllSuites: +@@ -2013,3 +2025,22 @@ class TLSConnection(TLSRecordLayer): + except: + self._shutdown(False) + raise ++ ++ ++ def exportKeyingMaterial(self, label, context, use_context, length): ++ """Returns the exported keying material as defined in RFC 5705.""" ++ ++ seed = self.clientRandom + self.serverRandom ++ if use_context: ++ if len(context) > 65535: ++ raise ValueError("Context is too long") ++ seed += bytearray(2) ++ seed[len(seed) - 2] = len(context) >> 8 ++ seed[len(seed) - 1] = len(context) & 0xFF ++ seed += context ++ if self.version in ((3,1), (3,2)): ++ return PRF(self.session.masterSecret, label, seed, length) ++ elif self.version == (3,3): ++ return PRF_1_2(self.session.masterSecret, label, seed, length) ++ else: ++ raise AssertionError()
diff --git a/third_party/tlslite/patches/token_binding_resumption.patch b/third_party/tlslite/patches/token_binding_resumption.patch new file mode 100644 index 0000000..5d856b2a --- /dev/null +++ b/third_party/tlslite/patches/token_binding_resumption.patch
@@ -0,0 +1,15 @@ +diff --git a/third_party/tlslite/tlslite/tlsconnection.py b/third_party/tlslite/tlslite/tlsconnection.py +index 6a53282..6e26fdd 100644 +--- a/third_party/tlslite/tlslite/tlsconnection.py ++++ b/third_party/tlslite/tlslite/tlsconnection.py +@@ -1536,6 +1536,10 @@ class TLSConnection(TLSRecordLayer): + serverHello.extended_master_secret = \ + clientHello.extended_master_secret and \ + settings.enableExtendedMasterSecret ++ for param in clientHello.tb_client_params: ++ if param in settings.supportedTokenBindingParams: ++ serverHello.tb_params = param ++ break + for result in self._sendMsg(serverHello): + yield result +
diff --git a/third_party/tlslite/tlslite/tlsconnection.py b/third_party/tlslite/tlslite/tlsconnection.py index 7363a309..e42b362 100644 --- a/third_party/tlslite/tlslite/tlsconnection.py +++ b/third_party/tlslite/tlslite/tlsconnection.py
@@ -181,6 +181,8 @@ @type sock: L{socket.socket} """ TLSRecordLayer.__init__(self, sock) + self.clientRandom = b"" + self.serverRandom = b"" #********************************************************* # Client Handshake Functions @@ -606,6 +608,9 @@ else: break masterSecret = result + self.clientRandom = clientHello.random + self.serverRandom = serverHello.random + # Create the session object which is used for resumptions self.session = Session() self.session.create(masterSecret, serverHello.session_id, cipherSuite, @@ -1398,6 +1403,9 @@ else: break masterSecret = result + self.clientRandom = clientHello.random + self.serverRandom = serverHello.random + #Create the session object self.session = Session() if cipherSuite in CipherSuite.certAllSuites: @@ -1536,6 +1544,10 @@ serverHello.extended_master_secret = \ clientHello.extended_master_secret and \ settings.enableExtendedMasterSecret + for param in clientHello.tb_client_params: + if param in settings.supportedTokenBindingParams: + serverHello.tb_params = param + break for result in self._sendMsg(serverHello): yield result @@ -2013,3 +2025,22 @@ except: self._shutdown(False) raise + + + def exportKeyingMaterial(self, label, context, use_context, length): + """Returns the exported keying material as defined in RFC 5705.""" + + seed = self.clientRandom + self.serverRandom + if use_context: + if len(context) > 65535: + raise ValueError("Context is too long") + seed += bytearray(2) + seed[len(seed) - 2] = len(context) >> 8 + seed[len(seed) - 1] = len(context) & 0xFF + seed += context + if self.version in ((3,1), (3,2)): + return PRF(self.session.masterSecret, label, seed, length) + elif self.version == (3,3): + return PRF_1_2(self.session.masterSecret, label, seed, length) + else: + raise AssertionError()
diff --git a/third_party/wayland/README.chromium b/third_party/wayland/README.chromium index ccf8020..5f1c151 100644 --- a/third_party/wayland/README.chromium +++ b/third_party/wayland/README.chromium
@@ -1,6 +1,6 @@ Name: wayland URL: http://wayland.freedesktop.org/ -Version: 1.9.0 +Version: 1.9.91 License: MIT License File: src/COPYING Security Critical: yes @@ -13,7 +13,7 @@ - None To import a new snapshot of wayland: -- Checkout the latest release tag: git checkout 1.9.0 +- Checkout the latest release tag: git checkout 1.9.91 - Change the DEPS entry to the newly checked out commit. - Update generated files: ./autogen.sh && make
diff --git a/third_party/wayland/include/config.h b/third_party/wayland/include/config.h index 14f40dc1..79a4674 100644 --- a/third_party/wayland/include/config.h +++ b/third_party/wayland/include/config.h
@@ -16,6 +16,9 @@ /* Define to 1 if you have the <inttypes.h> header file. */ #define HAVE_INTTYPES_H 1 +/* libxml-2.0 is available */ +#define HAVE_LIBXML 1 + /* Define to 1 if you have the <memory.h> header file. */ #define HAVE_MEMORY_H 1 @@ -54,13 +57,13 @@ #define PACKAGE "wayland" /* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "https://bugs.freedesktop.org/enter_bug.cgi?product=Wayland&component=wayland&version=1.9.0" +#define PACKAGE_BUGREPORT "https://bugs.freedesktop.org/enter_bug.cgi?product=Wayland&component=wayland&version=1.9.91" /* Define to the full name of this package. */ #define PACKAGE_NAME "wayland" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "wayland 1.9.0" +#define PACKAGE_STRING "wayland 1.9.91" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "wayland" @@ -69,10 +72,10 @@ #define PACKAGE_URL "http://wayland.freedesktop.org/" /* Define to the version of this package. */ -#define PACKAGE_VERSION "1.9.0" +#define PACKAGE_VERSION "1.9.91" /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Version number of package */ -#define VERSION "1.9.0" +#define VERSION "1.9.91"
diff --git a/third_party/wayland/include/protocol/wayland-client-protocol-core.h b/third_party/wayland/include/protocol/wayland-client-protocol-core.h index fbf170f..9927b07 100644 --- a/third_party/wayland/include/protocol/wayland-client-protocol-core.h +++ b/third_party/wayland/include/protocol/wayland-client-protocol-core.h
@@ -1,8 +1,8 @@ -/* +/* * Copyright © 2008-2011 Kristian Høgsberg * Copyright © 2010-2011 Intel Corporation * Copyright © 2012-2013 Collabora, Ltd. - * + * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, @@ -10,11 +10,11 @@ * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: - * + * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial * portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -158,6 +158,9 @@ #define WL_DISPLAY_SYNC 0 #define WL_DISPLAY_GET_REGISTRY 1 +#define WL_DISPLAY_SYNC_SINCE_VERSION 1 +#define WL_DISPLAY_GET_REGISTRY_SINCE_VERSION 1 + static inline void wl_display_set_user_data(struct wl_display *wl_display, void *user_data) { @@ -170,6 +173,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_display); } +static inline uint32_t +wl_display_get_version(struct wl_display *wl_display) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_display); +} + static inline struct wl_callback * wl_display_sync(struct wl_display *wl_display) { @@ -262,6 +271,8 @@ #define WL_REGISTRY_BIND 0 +#define WL_REGISTRY_BIND_SINCE_VERSION 1 + static inline void wl_registry_set_user_data(struct wl_registry *wl_registry, void *user_data) { @@ -274,6 +285,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_registry); } +static inline uint32_t +wl_registry_get_version(struct wl_registry *wl_registry) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_registry); +} + static inline void wl_registry_destroy(struct wl_registry *wl_registry) { @@ -285,8 +302,8 @@ { struct wl_proxy *id; - id = wl_proxy_marshal_constructor((struct wl_proxy *) wl_registry, - WL_REGISTRY_BIND, interface, name, interface->name, version, NULL); + id = wl_proxy_marshal_constructor_versioned((struct wl_proxy *) wl_registry, + WL_REGISTRY_BIND, interface, version, name, interface->name, version, NULL); return (void *) id; } @@ -318,6 +335,7 @@ (void (**)(void)) listener, data); } + static inline void wl_callback_set_user_data(struct wl_callback *wl_callback, void *user_data) { @@ -330,6 +348,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_callback); } +static inline uint32_t +wl_callback_get_version(struct wl_callback *wl_callback) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_callback); +} + static inline void wl_callback_destroy(struct wl_callback *wl_callback) { @@ -339,6 +363,9 @@ #define WL_COMPOSITOR_CREATE_SURFACE 0 #define WL_COMPOSITOR_CREATE_REGION 1 +#define WL_COMPOSITOR_CREATE_SURFACE_SINCE_VERSION 1 +#define WL_COMPOSITOR_CREATE_REGION_SINCE_VERSION 1 + static inline void wl_compositor_set_user_data(struct wl_compositor *wl_compositor, void *user_data) { @@ -351,6 +378,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_compositor); } +static inline uint32_t +wl_compositor_get_version(struct wl_compositor *wl_compositor) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_compositor); +} + static inline void wl_compositor_destroy(struct wl_compositor *wl_compositor) { @@ -383,6 +416,10 @@ #define WL_SHM_POOL_DESTROY 1 #define WL_SHM_POOL_RESIZE 2 +#define WL_SHM_POOL_CREATE_BUFFER_SINCE_VERSION 1 +#define WL_SHM_POOL_DESTROY_SINCE_VERSION 1 +#define WL_SHM_POOL_RESIZE_SINCE_VERSION 1 + static inline void wl_shm_pool_set_user_data(struct wl_shm_pool *wl_shm_pool, void *user_data) { @@ -395,6 +432,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_shm_pool); } +static inline uint32_t +wl_shm_pool_get_version(struct wl_shm_pool *wl_shm_pool) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_shm_pool); +} + static inline struct wl_buffer * wl_shm_pool_create_buffer(struct wl_shm_pool *wl_shm_pool, int32_t offset, int32_t width, int32_t height, int32_t stride, uint32_t format) { @@ -605,6 +648,8 @@ #define WL_SHM_CREATE_POOL 0 +#define WL_SHM_CREATE_POOL_SINCE_VERSION 1 + static inline void wl_shm_set_user_data(struct wl_shm *wl_shm, void *user_data) { @@ -617,6 +662,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_shm); } +static inline uint32_t +wl_shm_get_version(struct wl_shm *wl_shm) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_shm); +} + static inline void wl_shm_destroy(struct wl_shm *wl_shm) { @@ -675,6 +726,8 @@ #define WL_BUFFER_DESTROY 0 +#define WL_BUFFER_DESTROY_SINCE_VERSION 1 + static inline void wl_buffer_set_user_data(struct wl_buffer *wl_buffer, void *user_data) { @@ -687,6 +740,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_buffer); } +static inline uint32_t +wl_buffer_get_version(struct wl_buffer *wl_buffer) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_buffer); +} + static inline void wl_buffer_destroy(struct wl_buffer *wl_buffer) { @@ -696,9 +755,21 @@ wl_proxy_destroy((struct wl_proxy *) wl_buffer); } +#ifndef WL_DATA_OFFER_ERROR_ENUM +#define WL_DATA_OFFER_ERROR_ENUM +enum wl_data_offer_error { + WL_DATA_OFFER_ERROR_INVALID_FINISH = 0, + WL_DATA_OFFER_ERROR_INVALID_ACTION_MASK = 1, + WL_DATA_OFFER_ERROR_INVALID_ACTION = 2, + WL_DATA_OFFER_ERROR_INVALID_OFFER = 3, +}; +#endif /* WL_DATA_OFFER_ERROR_ENUM */ + /** * wl_data_offer - offer to transfer data * @offer: advertise offered mime type + * @source_actions: notify the source-side available actions + * @action: notify the selected action * * A wl_data_offer represents a piece of data offered for transfer by * another client (the source client). It is used by the copy-and-paste and @@ -717,6 +788,65 @@ void (*offer)(void *data, struct wl_data_offer *wl_data_offer, const char *mime_type); + /** + * source_actions - notify the source-side available actions + * @source_actions: (none) + * + * This event indicates the actions offered by the data source. + * It will be sent right after wl_data_device.enter, or anytime the + * source side changes its offered actions through + * wl_data_source.set_actions. + * @since: 3 + */ + void (*source_actions)(void *data, + struct wl_data_offer *wl_data_offer, + uint32_t source_actions); + /** + * action - notify the selected action + * @dnd_action: (none) + * + * This event indicates the action selected by the compositor + * after matching the source/destination side actions. Only one + * action (or none) will be offered here. + * + * This event can be emitted multiple times during the + * drag-and-drop operation in response to destination side action + * changes through wl_data_offer.set_actions. + * + * This event will no longer be emitted after wl_data_device.drop + * happened on the drag-and-drop destination, the client must honor + * the last action received, or the last preferred one set through + * wl_data_offer.set_actions when handling an "ask" action. + * + * Compositors may also change the selected action on the fly, + * mainly in response to keyboard modifier changes during the + * drag-and-drop operation. + * + * The most recent action received is always the valid one. Prior + * to receiving wl_data_device.drop, the chosen action may change + * (e.g. due to keyboard modifiers being pressed). At the time of + * receiving wl_data_device.drop the drag-and-drop destination must + * honor the last action received. + * + * Action changes may still happen after wl_data_device.drop, + * especially on "ask" actions, where the drag-and-drop destination + * may choose another action afterwards. Action changes happening + * at this stage are always the result of inter-client negotiation, + * the compositor shall no longer be able to induce a different + * action. + * + * Upon "ask" actions, it is expected that the drag-and-drop + * destination may potentially choose different a different action + * and/or mime type, based on wl_data_offer.source_actions and + * finally chosen by the user (e.g. popping up a menu with the + * available options). The final wl_data_offer.set_actions and + * wl_data_offer.accept requests must happen before the call to + * wl_data_offer.finish. + * @since: 3 + */ + void (*action)(void *data, + struct wl_data_offer *wl_data_offer, + uint32_t dnd_action); }; static inline int @@ -730,6 +860,14 @@ #define WL_DATA_OFFER_ACCEPT 0 #define WL_DATA_OFFER_RECEIVE 1 #define WL_DATA_OFFER_DESTROY 2 +#define WL_DATA_OFFER_FINISH 3 +#define WL_DATA_OFFER_SET_ACTIONS 4 + +#define WL_DATA_OFFER_ACCEPT_SINCE_VERSION 1 +#define WL_DATA_OFFER_RECEIVE_SINCE_VERSION 1 +#define WL_DATA_OFFER_DESTROY_SINCE_VERSION 1 +#define WL_DATA_OFFER_FINISH_SINCE_VERSION 3 +#define WL_DATA_OFFER_SET_ACTIONS_SINCE_VERSION 3 static inline void wl_data_offer_set_user_data(struct wl_data_offer *wl_data_offer, void *user_data) @@ -743,6 +881,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_data_offer); } +static inline uint32_t +wl_data_offer_get_version(struct wl_data_offer *wl_data_offer) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_data_offer); +} + static inline void wl_data_offer_accept(struct wl_data_offer *wl_data_offer, uint32_t serial, const char *mime_type) { @@ -766,11 +910,36 @@ wl_proxy_destroy((struct wl_proxy *) wl_data_offer); } +static inline void +wl_data_offer_finish(struct wl_data_offer *wl_data_offer) +{ + wl_proxy_marshal((struct wl_proxy *) wl_data_offer, + WL_DATA_OFFER_FINISH); +} + +static inline void +wl_data_offer_set_actions(struct wl_data_offer *wl_data_offer, uint32_t dnd_actions, uint32_t preferred_action) +{ + wl_proxy_marshal((struct wl_proxy *) wl_data_offer, + WL_DATA_OFFER_SET_ACTIONS, dnd_actions, preferred_action); +} + +#ifndef WL_DATA_SOURCE_ERROR_ENUM +#define WL_DATA_SOURCE_ERROR_ENUM +enum wl_data_source_error { + WL_DATA_SOURCE_ERROR_INVALID_ACTION_MASK = 0, + WL_DATA_SOURCE_ERROR_INVALID_SOURCE = 1, +}; +#endif /* WL_DATA_SOURCE_ERROR_ENUM */ + /** * wl_data_source - offer to transfer data * @target: a target accepts an offered mime type * @send: send the data * @cancelled: selection was cancelled + * @dnd_drop_performed: the drag-and-drop operation physically finished + * @dnd_finished: the drag-and-drop operation concluded + * @action: notify the selected action * * The wl_data_source object is the source side of a wl_data_offer. It is * created by the source client in a data transfer and provides a way to @@ -806,11 +975,96 @@ /** * cancelled - selection was cancelled * - * This data source has been replaced by another data source. The - * client should clean up and destroy this data source. + * This data source is no longer valid. There are several reasons + * why this could happen: + * + * - The data source has been replaced by another data source. - + * The drag-and-drop operation was performed, but the drop + * destination did not accept any of the mimetypes offered through + * wl_data_source.target. - The drag-and-drop operation was + * performed, but the drop destination did not select any of the + * actions present in the mask offered through + * wl_data_source.action. - The drag-and-drop operation was + * performed but didn't happen over a surface. - The compositor + * cancelled the drag-and-drop operation (e.g. compositor dependent + * timeouts to avoid stale drag-and-drop transfers). + * + * The client should clean up and destroy this data source. + * + * For objects of version 2 or older, wl_data_source.cancelled will + * only be emitted if the data source was replaced by another data + * source. */ void (*cancelled)(void *data, struct wl_data_source *wl_data_source); + /** + * dnd_drop_performed - the drag-and-drop operation physically + * finished + * + * The user performed the drop action. This event does not + * indicate acceptance, wl_data_source.cancelled may still be + * emitted afterwards if the drop destination does not accept any + * mimetype. + * + * However, this event might however not be received if the + * compositor cancelled the drag-and-drop operation before this + * event could happen. + * + * Note that the data_source may still be used in the future and + * should not be destroyed here. + * @since: 3 + */ + void (*dnd_drop_performed)(void *data, + struct wl_data_source *wl_data_source); + /** + * dnd_finished - the drag-and-drop operation concluded + * + * The drop destination finished interoperating with this data + * source, so the client is now free to destroy this data source + * and free all associated data. + * + * If the action used to perform the operation was "move", the + * source can now delete the transferred data. + * @since: 3 + */ + void (*dnd_finished)(void *data, + struct wl_data_source *wl_data_source); + /** + * action - notify the selected action + * @dnd_action: (none) + * + * This event indicates the action selected by the compositor + * after matching the source/destination side actions. Only one + * action (or none) will be offered here. + * + * This event can be emitted multiple times during the + * drag-and-drop operation, mainly in response to destination side + * changes through wl_data_offer.set_actions, and as the data + * device enters/leaves surfaces. + * + * It is only possible to receive this event after + * wl_data_source.dnd_drop_performed if the drag-and-drop operation + * ended in an "ask" action, in which case the final + * wl_data_source.action event will happen immediately before + * wl_data_source.dnd_finished. + * + * Compositors may also change the selected action on the fly, + * mainly in response to keyboard modifier changes during the + * drag-and-drop operation. + * + * The most recent action received is always the valid one. The + * chosen action may change alongside negotiation (e.g. an "ask" + * action can turn into a "move" operation), so the effects of the + * final action must always be applied in + * wl_data_offer.dnd_finished. + * + * Clients can trigger cursor surface changes from this point, so + * they reflect the current action. + * @since: 3 + */ + void (*action)(void *data, + struct wl_data_source *wl_data_source, + uint32_t dnd_action); }; static inline int @@ -823,6 +1077,11 @@ #define WL_DATA_SOURCE_OFFER 0 #define WL_DATA_SOURCE_DESTROY 1 +#define WL_DATA_SOURCE_SET_ACTIONS 2 + +#define WL_DATA_SOURCE_OFFER_SINCE_VERSION 1 +#define WL_DATA_SOURCE_DESTROY_SINCE_VERSION 1 +#define WL_DATA_SOURCE_SET_ACTIONS_SINCE_VERSION 3 static inline void wl_data_source_set_user_data(struct wl_data_source *wl_data_source, void *user_data) @@ -836,6 +1095,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_data_source); } +static inline uint32_t +wl_data_source_get_version(struct wl_data_source *wl_data_source) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_data_source); +} + static inline void wl_data_source_offer(struct wl_data_source *wl_data_source, const char *mime_type) { @@ -852,6 +1117,13 @@ wl_proxy_destroy((struct wl_proxy *) wl_data_source); } +static inline void +wl_data_source_set_actions(struct wl_data_source *wl_data_source, uint32_t dnd_actions) +{ + wl_proxy_marshal((struct wl_proxy *) wl_data_source, + WL_DATA_SOURCE_SET_ACTIONS, dnd_actions); +} + #ifndef WL_DATA_DEVICE_ERROR_ENUM #define WL_DATA_DEVICE_ERROR_ENUM enum wl_data_device_error { @@ -940,6 +1212,17 @@ * * The event is sent when a drag-and-drop operation is ended * because the implicit grab is removed. + * + * The drag-and-drop destination is expected to honor the last + * action received through wl_data_offer.action, if the resulting + * action is "copy" or "move", the destination can still perform + * wl_data_offer.receive requests, and is expected to end all + * transfers with a wl_data_offer.finish request. + * + * If the resulting action is "ask", the action will not be + * considered final. The drag-and-drop destination is expected to + * perform one last wl_data_offer.set_actions request, or + * wl_data_offer.destroy in order to cancel the operation. */ void (*drop)(void *data, struct wl_data_device *wl_data_device); @@ -975,6 +1258,10 @@ #define WL_DATA_DEVICE_SET_SELECTION 1 #define WL_DATA_DEVICE_RELEASE 2 +#define WL_DATA_DEVICE_START_DRAG_SINCE_VERSION 1 +#define WL_DATA_DEVICE_SET_SELECTION_SINCE_VERSION 1 +#define WL_DATA_DEVICE_RELEASE_SINCE_VERSION 2 + static inline void wl_data_device_set_user_data(struct wl_data_device *wl_data_device, void *user_data) { @@ -987,6 +1274,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_data_device); } +static inline uint32_t +wl_data_device_get_version(struct wl_data_device *wl_data_device) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_data_device); +} + static inline void wl_data_device_destroy(struct wl_data_device *wl_data_device) { @@ -1016,9 +1309,50 @@ wl_proxy_destroy((struct wl_proxy *) wl_data_device); } +#ifndef WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM +#define WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM +/** + * wl_data_device_manager_dnd_action - drag and drop actions + * @WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE: (none) + * @WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY: (none) + * @WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE: (none) + * @WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK: (none) + * + * This is a bitmask of the available/preferred actions in a + * drag-and-drop operation. + * + * In the compositor, the selected action is a result of matching the + * actions offered by the source and destination sides. "action" events + * with a "none" action will be sent to both source and destination if + * there is no match. All further checks will effectively happen on (source + * actions ∩ destination actions). + * + * In addition, compositors may also pick different actions in reaction to + * key modifiers being pressed, one common design that is used in major + * toolkits (and the behavior recommended for compositors) is: + * + * - If no modifiers are pressed, the first match (in bit order) will be + * used. - Pressing Shift selects "move", if enabled in the mask. - + * Pressing Control selects "copy", if enabled in the mask. + * + * Behavior beyond that is considered implementation-dependent. Compositors + * may for example bind other modifiers (like Alt/Meta) or drags initiated + * with other buttons than BTN_LEFT to specific actions (e.g. "ask"). + */ +enum wl_data_device_manager_dnd_action { + WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE = 0, + WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY = 1, + WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE = 2, + WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK = 4, +}; +#endif /* WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM */ + #define WL_DATA_DEVICE_MANAGER_CREATE_DATA_SOURCE 0 #define WL_DATA_DEVICE_MANAGER_GET_DATA_DEVICE 1 +#define WL_DATA_DEVICE_MANAGER_CREATE_DATA_SOURCE_SINCE_VERSION 1 +#define WL_DATA_DEVICE_MANAGER_GET_DATA_DEVICE_SINCE_VERSION 1 + static inline void wl_data_device_manager_set_user_data(struct wl_data_device_manager *wl_data_device_manager, void *user_data) { @@ -1031,6 +1365,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_data_device_manager); } +static inline uint32_t +wl_data_device_manager_get_version(struct wl_data_device_manager *wl_data_device_manager) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_data_device_manager); +} + static inline void wl_data_device_manager_destroy(struct wl_data_device_manager *wl_data_device_manager) { @@ -1068,6 +1408,8 @@ #define WL_SHELL_GET_SHELL_SURFACE 0 +#define WL_SHELL_GET_SHELL_SURFACE_SINCE_VERSION 1 + static inline void wl_shell_set_user_data(struct wl_shell *wl_shell, void *user_data) { @@ -1080,6 +1422,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_shell); } +static inline uint32_t +wl_shell_get_version(struct wl_shell *wl_shell) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_shell); +} + static inline void wl_shell_destroy(struct wl_shell *wl_shell) { @@ -1257,6 +1605,17 @@ #define WL_SHELL_SURFACE_SET_TITLE 8 #define WL_SHELL_SURFACE_SET_CLASS 9 +#define WL_SHELL_SURFACE_PONG_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_MOVE_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_RESIZE_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_SET_TOPLEVEL_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_SET_TRANSIENT_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_SET_FULLSCREEN_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_SET_POPUP_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_SET_MAXIMIZED_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_SET_TITLE_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_SET_CLASS_SINCE_VERSION 1 + static inline void wl_shell_surface_set_user_data(struct wl_shell_surface *wl_shell_surface, void *user_data) { @@ -1269,6 +1628,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_shell_surface); } +static inline uint32_t +wl_shell_surface_get_version(struct wl_shell_surface *wl_shell_surface) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_shell_surface); +} + static inline void wl_shell_surface_destroy(struct wl_shell_surface *wl_shell_surface) { @@ -1446,6 +1811,18 @@ #define WL_SURFACE_COMMIT 6 #define WL_SURFACE_SET_BUFFER_TRANSFORM 7 #define WL_SURFACE_SET_BUFFER_SCALE 8 +#define WL_SURFACE_DAMAGE_BUFFER 9 + +#define WL_SURFACE_DESTROY_SINCE_VERSION 1 +#define WL_SURFACE_ATTACH_SINCE_VERSION 1 +#define WL_SURFACE_DAMAGE_SINCE_VERSION 1 +#define WL_SURFACE_FRAME_SINCE_VERSION 1 +#define WL_SURFACE_SET_OPAQUE_REGION_SINCE_VERSION 1 +#define WL_SURFACE_SET_INPUT_REGION_SINCE_VERSION 1 +#define WL_SURFACE_COMMIT_SINCE_VERSION 1 +#define WL_SURFACE_SET_BUFFER_TRANSFORM_SINCE_VERSION 2 +#define WL_SURFACE_SET_BUFFER_SCALE_SINCE_VERSION 3 +#define WL_SURFACE_DAMAGE_BUFFER_SINCE_VERSION 4 static inline void wl_surface_set_user_data(struct wl_surface *wl_surface, void *user_data) @@ -1459,6 +1836,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_surface); } +static inline uint32_t +wl_surface_get_version(struct wl_surface *wl_surface) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_surface); +} + static inline void wl_surface_destroy(struct wl_surface *wl_surface) { @@ -1528,6 +1911,13 @@ WL_SURFACE_SET_BUFFER_SCALE, scale); } +static inline void +wl_surface_damage_buffer(struct wl_surface *wl_surface, int32_t x, int32_t y, int32_t width, int32_t height) +{ + wl_proxy_marshal((struct wl_proxy *) wl_surface, + WL_SURFACE_DAMAGE_BUFFER, x, y, width, height); +} + #ifndef WL_SEAT_CAPABILITY_ENUM #define WL_SEAT_CAPABILITY_ENUM /** @@ -1564,6 +1954,28 @@ * This is emitted whenever a seat gains or loses the pointer, * keyboard or touch capabilities. The argument is a capability * enum containing the complete set of capabilities this seat has. + * + * When the pointer capability is added, a client may create a + * wl_pointer object using the wl_seat.get_pointer request. This + * object will receive pointer events until the capability is + * removed in the future. + * + * When the pointer capability is removed, a client should destroy + * the wl_pointer objects associated with the seat where the + * capability was removed, using the wl_pointer.release request. No + * further pointer events will be received on these objects. + * + * In some compositors, if a seat regains the pointer capability + * and a client has a previously obtained wl_pointer object of + * version 4 or less, that object may start sending pointer events + * again. This behavior is considered a misinterpretation of the + * intended behavior and must not be relied upon by the client. + * wl_pointer objects of version 5 or later must not send events if + * created before the most recent event notifying the client of an + * added pointer capability. + * + * The above behavior also applies to wl_keyboard and wl_touch with + * the keyboard and touch capabilities, respectively. */ void (*capabilities)(void *data, struct wl_seat *wl_seat, @@ -1593,6 +2005,12 @@ #define WL_SEAT_GET_POINTER 0 #define WL_SEAT_GET_KEYBOARD 1 #define WL_SEAT_GET_TOUCH 2 +#define WL_SEAT_RELEASE 3 + +#define WL_SEAT_GET_POINTER_SINCE_VERSION 1 +#define WL_SEAT_GET_KEYBOARD_SINCE_VERSION 1 +#define WL_SEAT_GET_TOUCH_SINCE_VERSION 1 +#define WL_SEAT_RELEASE_SINCE_VERSION 5 static inline void wl_seat_set_user_data(struct wl_seat *wl_seat, void *user_data) @@ -1606,6 +2024,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_seat); } +static inline uint32_t +wl_seat_get_version(struct wl_seat *wl_seat) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_seat); +} + static inline void wl_seat_destroy(struct wl_seat *wl_seat) { @@ -1645,6 +2069,15 @@ return (struct wl_touch *) id; } +static inline void +wl_seat_release(struct wl_seat *wl_seat) +{ + wl_proxy_marshal((struct wl_proxy *) wl_seat, + WL_SEAT_RELEASE); + + wl_proxy_destroy((struct wl_proxy *) wl_seat); +} + #ifndef WL_POINTER_ERROR_ENUM #define WL_POINTER_ERROR_ENUM enum wl_pointer_error { @@ -1683,6 +2116,34 @@ }; #endif /* WL_POINTER_AXIS_ENUM */ +#ifndef WL_POINTER_AXIS_SOURCE_ENUM +#define WL_POINTER_AXIS_SOURCE_ENUM +/** + * wl_pointer_axis_source - axis source types + * @WL_POINTER_AXIS_SOURCE_WHEEL: A physical wheel + * @WL_POINTER_AXIS_SOURCE_FINGER: Finger on a touch surface + * @WL_POINTER_AXIS_SOURCE_CONTINUOUS: Continuous coordinate space + * + * Describes the source types for axis events. This indicates to the + * client how an axis event was physically generated; a client may adjust + * the user interface accordingly. For example, scroll events from a + * "finger" source may be in a smooth coordinate space with kinetic + * scrolling whereas a "wheel" source may be in discrete steps of a number + * of lines. + * + * The "continuous" axis source is a device generating events in a + * continuous coordinate space, but using something other than a finger. + * One example for this source is button-based scrolling where the vertical + * motion of a device is converted to scroll events while a button is held + * down. + */ +enum wl_pointer_axis_source { + WL_POINTER_AXIS_SOURCE_WHEEL = 0, + WL_POINTER_AXIS_SOURCE_FINGER = 1, + WL_POINTER_AXIS_SOURCE_CONTINUOUS = 2, +}; +#endif /* WL_POINTER_AXIS_SOURCE_ENUM */ + /** * wl_pointer - pointer input device * @enter: enter event @@ -1690,6 +2151,10 @@ * @motion: pointer motion event * @button: pointer button event * @axis: axis event + * @frame: end of a pointer event sequence + * @axis_source: axis source event + * @axis_stop: axis stop event + * @axis_discrete: axis click event * * The wl_pointer interface represents one or more input devices, such as * mice, which control the pointer location and pointer_focus of a seat. @@ -1796,6 +2261,143 @@ uint32_t time, uint32_t axis, wl_fixed_t value); + /** + * frame - end of a pointer event sequence + * + * Indicates the end of a set of events that logically belong + * together. A client is expected to accumulate the data in all + * events within the frame before proceeding. + * + * All wl_pointer events before a wl_pointer.frame event belong + * logically together. For example, in a diagonal scroll motion the + * compositor will send an optional wl_pointer.axis_source event, + * two wl_pointer.axis events (horizontal and vertical) and finally + * a wl_pointer.frame event. The client may use this information to + * calculate a diagonal vector for scrolling. + * + * When multiple wl_pointer.axis events occur within the same + * frame, the motion vector is the combined motion of all events. + * When a wl_pointer.axis and a wl_pointer.axis_stop event occur + * within the same frame, this indicates that axis movement in one + * axis has stopped but continues in the other axis. When multiple + * wl_pointer.axis_stop events occur within in the same frame, this + * indicates that these axes stopped in the same instance. + * + * A wl_pointer.frame event is sent for every logical event group, + * even if the group only contains a single wl_pointer event. + * Specifically, a client may get a sequence: motion, frame, + * button, frame, axis, frame, axis_stop, frame. + * + * The wl_pointer.enter and wl_pointer.leave events are logical + * events generated by the compositor and not the hardware. These + * events are also grouped by a wl_pointer.frame. When a pointer + * moves from one surface to the another, a compositor should group + * the wl_pointer.leave event within the same wl_pointer.frame. + * However, a client must not rely on wl_pointer.leave and + * wl_pointer.enter being in the same wl_pointer.frame. + * Compositor-specific policies may require the wl_pointer.leave + * and wl_pointer.enter event being split across multiple + * wl_pointer.frame groups. + * @since: 5 + */ + void (*frame)(void *data, + struct wl_pointer *wl_pointer); + /** + * axis_source - axis source event + * @axis_source: (none) + * + * Source information for scroll and other axes. + * + * This event does not occur on its own. It is sent before a + * wl_pointer.frame event and carries the source information for + * all events within that frame. + * + * The source specifies how this event was generated. If the source + * is wl_pointer.axis_source.finger, a wl_pointer.axis_stop event + * will be sent when the user lifts the finger off the device. + * + * If the source is wl_pointer axis_source.wheel or + * wl_pointer.axis_source.continuous, a wl_pointer.axis_stop event + * may or may not be sent. Whether a compositor sends a axis_stop + * event for these sources is hardware-specific and + * implementation-dependent; clients must not rely on receiving an + * axis_stop event for these scroll sources and should treat scroll + * sequences from these scroll sources as unterminated by default. + * + * This event is optional. If the source is unknown for a + * particular axis event sequence, no event is sent. Only one + * wl_pointer.axis_source event is permitted per frame. + * + * The order of wl_pointer.axis_discrete and wl_pointer.axis_source + * is not guaranteed. + * @since: 5 + */ + void (*axis_source)(void *data, + struct wl_pointer *wl_pointer, + uint32_t axis_source); + /** + * axis_stop - axis stop event + * @time: timestamp with millisecond granularity + * @axis: the axis stopped with this event + * + * Stop notification for scroll and other axes. + * + * For some wl_pointer.axis_source types, a wl_pointer.axis_stop + * event is sent to notify a client that the axis sequence has + * terminated. This enables the client to implement kinetic + * scrolling. See the wl_pointer.axis_source documentation for + * information on when this event may be generated. + * + * Any wl_pointer.axis events with the same axis_source after this + * event should be considered as the start of a new axis motion. + * + * The timestamp is to be interpreted identical to the timestamp in + * the wl_pointer.axis event. The timestamp value may be the same + * as a preceeding wl_pointer.axis event. + * @since: 5 + */ + void (*axis_stop)(void *data, + struct wl_pointer *wl_pointer, + uint32_t time, + uint32_t axis); + /** + * axis_discrete - axis click event + * @axis: (none) + * @discrete: (none) + * + * Discrete step information for scroll and other axes. + * + * This event carries the axis value of the wl_pointer.axis event + * in discrete steps (e.g. mouse wheel clicks). + * + * This event does not occur on its own, it is coupled with a + * wl_pointer.axis event that represents this axis value on a + * continuous scale. The protocol guarantees that each + * axis_discrete event is always followed by exactly one axis event + * with the same axis number within the same wl_pointer.frame. Note + * that the protocol allows for other events to occur between the + * axis_discrete and its coupled axis event, including other + * axis_discrete or axis events. + * + * This event is optional; continuous scrolling devices like + * two-finger scrolling on touchpads do not have discrete steps and + * do not generate this event. + * + * The discrete value carries the directional information. e.g. a + * value of -2 is two steps towards the negative direction of this + * axis. + * + * The axis number is identical to the axis number in the associate + * axis event. + * + * The order of wl_pointer.axis_discrete and wl_pointer.axis_source + * is not guaranteed. + * @since: 5 + */ + void (*axis_discrete)(void *data, + struct wl_pointer *wl_pointer, + uint32_t axis, + int32_t discrete); }; static inline int @@ -1809,6 +2411,9 @@ #define WL_POINTER_SET_CURSOR 0 #define WL_POINTER_RELEASE 1 +#define WL_POINTER_SET_CURSOR_SINCE_VERSION 1 +#define WL_POINTER_RELEASE_SINCE_VERSION 3 + static inline void wl_pointer_set_user_data(struct wl_pointer *wl_pointer, void *user_data) { @@ -1821,6 +2426,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_pointer); } +static inline uint32_t +wl_pointer_get_version(struct wl_pointer *wl_pointer) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_pointer); +} + static inline void wl_pointer_destroy(struct wl_pointer *wl_pointer) { @@ -2003,6 +2614,8 @@ #define WL_KEYBOARD_RELEASE 0 +#define WL_KEYBOARD_RELEASE_SINCE_VERSION 3 + static inline void wl_keyboard_set_user_data(struct wl_keyboard *wl_keyboard, void *user_data) { @@ -2015,6 +2628,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_keyboard); } +static inline uint32_t +wl_keyboard_get_version(struct wl_keyboard *wl_keyboard) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_keyboard); +} + static inline void wl_keyboard_destroy(struct wl_keyboard *wl_keyboard) { @@ -2131,6 +2750,8 @@ #define WL_TOUCH_RELEASE 0 +#define WL_TOUCH_RELEASE_SINCE_VERSION 3 + static inline void wl_touch_set_user_data(struct wl_touch *wl_touch, void *user_data) { @@ -2143,6 +2764,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_touch); } +static inline uint32_t +wl_touch_get_version(struct wl_touch *wl_touch) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_touch); +} + static inline void wl_touch_destroy(struct wl_touch *wl_touch) { @@ -2347,6 +2974,7 @@ (void (**)(void)) listener, data); } + static inline void wl_output_set_user_data(struct wl_output *wl_output, void *user_data) { @@ -2359,6 +2987,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_output); } +static inline uint32_t +wl_output_get_version(struct wl_output *wl_output) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_output); +} + static inline void wl_output_destroy(struct wl_output *wl_output) { @@ -2369,6 +3003,10 @@ #define WL_REGION_ADD 1 #define WL_REGION_SUBTRACT 2 +#define WL_REGION_DESTROY_SINCE_VERSION 1 +#define WL_REGION_ADD_SINCE_VERSION 1 +#define WL_REGION_SUBTRACT_SINCE_VERSION 1 + static inline void wl_region_set_user_data(struct wl_region *wl_region, void *user_data) { @@ -2381,6 +3019,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_region); } +static inline uint32_t +wl_region_get_version(struct wl_region *wl_region) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_region); +} + static inline void wl_region_destroy(struct wl_region *wl_region) { @@ -2414,6 +3058,9 @@ #define WL_SUBCOMPOSITOR_DESTROY 0 #define WL_SUBCOMPOSITOR_GET_SUBSURFACE 1 +#define WL_SUBCOMPOSITOR_DESTROY_SINCE_VERSION 1 +#define WL_SUBCOMPOSITOR_GET_SUBSURFACE_SINCE_VERSION 1 + static inline void wl_subcompositor_set_user_data(struct wl_subcompositor *wl_subcompositor, void *user_data) { @@ -2426,6 +3073,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_subcompositor); } +static inline uint32_t +wl_subcompositor_get_version(struct wl_subcompositor *wl_subcompositor) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_subcompositor); +} + static inline void wl_subcompositor_destroy(struct wl_subcompositor *wl_subcompositor) { @@ -2460,6 +3113,13 @@ #define WL_SUBSURFACE_SET_SYNC 4 #define WL_SUBSURFACE_SET_DESYNC 5 +#define WL_SUBSURFACE_DESTROY_SINCE_VERSION 1 +#define WL_SUBSURFACE_SET_POSITION_SINCE_VERSION 1 +#define WL_SUBSURFACE_PLACE_ABOVE_SINCE_VERSION 1 +#define WL_SUBSURFACE_PLACE_BELOW_SINCE_VERSION 1 +#define WL_SUBSURFACE_SET_SYNC_SINCE_VERSION 1 +#define WL_SUBSURFACE_SET_DESYNC_SINCE_VERSION 1 + static inline void wl_subsurface_set_user_data(struct wl_subsurface *wl_subsurface, void *user_data) { @@ -2472,6 +3132,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_subsurface); } +static inline uint32_t +wl_subsurface_get_version(struct wl_subsurface *wl_subsurface) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_subsurface); +} + static inline void wl_subsurface_destroy(struct wl_subsurface *wl_subsurface) {
diff --git a/third_party/wayland/include/protocol/wayland-client-protocol.h b/third_party/wayland/include/protocol/wayland-client-protocol.h index 8112d8d..417e674 100644 --- a/third_party/wayland/include/protocol/wayland-client-protocol.h +++ b/third_party/wayland/include/protocol/wayland-client-protocol.h
@@ -1,8 +1,8 @@ -/* +/* * Copyright © 2008-2011 Kristian Høgsberg * Copyright © 2010-2011 Intel Corporation * Copyright © 2012-2013 Collabora, Ltd. - * + * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, @@ -10,11 +10,11 @@ * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: - * + * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial * portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -158,6 +158,9 @@ #define WL_DISPLAY_SYNC 0 #define WL_DISPLAY_GET_REGISTRY 1 +#define WL_DISPLAY_SYNC_SINCE_VERSION 1 +#define WL_DISPLAY_GET_REGISTRY_SINCE_VERSION 1 + static inline void wl_display_set_user_data(struct wl_display *wl_display, void *user_data) { @@ -170,6 +173,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_display); } +static inline uint32_t +wl_display_get_version(struct wl_display *wl_display) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_display); +} + static inline struct wl_callback * wl_display_sync(struct wl_display *wl_display) { @@ -262,6 +271,8 @@ #define WL_REGISTRY_BIND 0 +#define WL_REGISTRY_BIND_SINCE_VERSION 1 + static inline void wl_registry_set_user_data(struct wl_registry *wl_registry, void *user_data) { @@ -274,6 +285,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_registry); } +static inline uint32_t +wl_registry_get_version(struct wl_registry *wl_registry) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_registry); +} + static inline void wl_registry_destroy(struct wl_registry *wl_registry) { @@ -285,8 +302,8 @@ { struct wl_proxy *id; - id = wl_proxy_marshal_constructor((struct wl_proxy *) wl_registry, - WL_REGISTRY_BIND, interface, name, interface->name, version, NULL); + id = wl_proxy_marshal_constructor_versioned((struct wl_proxy *) wl_registry, + WL_REGISTRY_BIND, interface, version, name, interface->name, version, NULL); return (void *) id; } @@ -318,6 +335,7 @@ (void (**)(void)) listener, data); } + static inline void wl_callback_set_user_data(struct wl_callback *wl_callback, void *user_data) { @@ -330,6 +348,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_callback); } +static inline uint32_t +wl_callback_get_version(struct wl_callback *wl_callback) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_callback); +} + static inline void wl_callback_destroy(struct wl_callback *wl_callback) { @@ -339,6 +363,9 @@ #define WL_COMPOSITOR_CREATE_SURFACE 0 #define WL_COMPOSITOR_CREATE_REGION 1 +#define WL_COMPOSITOR_CREATE_SURFACE_SINCE_VERSION 1 +#define WL_COMPOSITOR_CREATE_REGION_SINCE_VERSION 1 + static inline void wl_compositor_set_user_data(struct wl_compositor *wl_compositor, void *user_data) { @@ -351,6 +378,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_compositor); } +static inline uint32_t +wl_compositor_get_version(struct wl_compositor *wl_compositor) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_compositor); +} + static inline void wl_compositor_destroy(struct wl_compositor *wl_compositor) { @@ -383,6 +416,10 @@ #define WL_SHM_POOL_DESTROY 1 #define WL_SHM_POOL_RESIZE 2 +#define WL_SHM_POOL_CREATE_BUFFER_SINCE_VERSION 1 +#define WL_SHM_POOL_DESTROY_SINCE_VERSION 1 +#define WL_SHM_POOL_RESIZE_SINCE_VERSION 1 + static inline void wl_shm_pool_set_user_data(struct wl_shm_pool *wl_shm_pool, void *user_data) { @@ -395,6 +432,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_shm_pool); } +static inline uint32_t +wl_shm_pool_get_version(struct wl_shm_pool *wl_shm_pool) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_shm_pool); +} + static inline struct wl_buffer * wl_shm_pool_create_buffer(struct wl_shm_pool *wl_shm_pool, int32_t offset, int32_t width, int32_t height, int32_t stride, uint32_t format) { @@ -605,6 +648,8 @@ #define WL_SHM_CREATE_POOL 0 +#define WL_SHM_CREATE_POOL_SINCE_VERSION 1 + static inline void wl_shm_set_user_data(struct wl_shm *wl_shm, void *user_data) { @@ -617,6 +662,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_shm); } +static inline uint32_t +wl_shm_get_version(struct wl_shm *wl_shm) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_shm); +} + static inline void wl_shm_destroy(struct wl_shm *wl_shm) { @@ -675,6 +726,8 @@ #define WL_BUFFER_DESTROY 0 +#define WL_BUFFER_DESTROY_SINCE_VERSION 1 + static inline void wl_buffer_set_user_data(struct wl_buffer *wl_buffer, void *user_data) { @@ -687,6 +740,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_buffer); } +static inline uint32_t +wl_buffer_get_version(struct wl_buffer *wl_buffer) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_buffer); +} + static inline void wl_buffer_destroy(struct wl_buffer *wl_buffer) { @@ -696,9 +755,21 @@ wl_proxy_destroy((struct wl_proxy *) wl_buffer); } +#ifndef WL_DATA_OFFER_ERROR_ENUM +#define WL_DATA_OFFER_ERROR_ENUM +enum wl_data_offer_error { + WL_DATA_OFFER_ERROR_INVALID_FINISH = 0, + WL_DATA_OFFER_ERROR_INVALID_ACTION_MASK = 1, + WL_DATA_OFFER_ERROR_INVALID_ACTION = 2, + WL_DATA_OFFER_ERROR_INVALID_OFFER = 3, +}; +#endif /* WL_DATA_OFFER_ERROR_ENUM */ + /** * wl_data_offer - offer to transfer data * @offer: advertise offered mime type + * @source_actions: notify the source-side available actions + * @action: notify the selected action * * A wl_data_offer represents a piece of data offered for transfer by * another client (the source client). It is used by the copy-and-paste and @@ -717,6 +788,65 @@ void (*offer)(void *data, struct wl_data_offer *wl_data_offer, const char *mime_type); + /** + * source_actions - notify the source-side available actions + * @source_actions: (none) + * + * This event indicates the actions offered by the data source. + * It will be sent right after wl_data_device.enter, or anytime the + * source side changes its offered actions through + * wl_data_source.set_actions. + * @since: 3 + */ + void (*source_actions)(void *data, + struct wl_data_offer *wl_data_offer, + uint32_t source_actions); + /** + * action - notify the selected action + * @dnd_action: (none) + * + * This event indicates the action selected by the compositor + * after matching the source/destination side actions. Only one + * action (or none) will be offered here. + * + * This event can be emitted multiple times during the + * drag-and-drop operation in response to destination side action + * changes through wl_data_offer.set_actions. + * + * This event will no longer be emitted after wl_data_device.drop + * happened on the drag-and-drop destination, the client must honor + * the last action received, or the last preferred one set through + * wl_data_offer.set_actions when handling an "ask" action. + * + * Compositors may also change the selected action on the fly, + * mainly in response to keyboard modifier changes during the + * drag-and-drop operation. + * + * The most recent action received is always the valid one. Prior + * to receiving wl_data_device.drop, the chosen action may change + * (e.g. due to keyboard modifiers being pressed). At the time of + * receiving wl_data_device.drop the drag-and-drop destination must + * honor the last action received. + * + * Action changes may still happen after wl_data_device.drop, + * especially on "ask" actions, where the drag-and-drop destination + * may choose another action afterwards. Action changes happening + * at this stage are always the result of inter-client negotiation, + * the compositor shall no longer be able to induce a different + * action. + * + * Upon "ask" actions, it is expected that the drag-and-drop + * destination may potentially choose different a different action + * and/or mime type, based on wl_data_offer.source_actions and + * finally chosen by the user (e.g. popping up a menu with the + * available options). The final wl_data_offer.set_actions and + * wl_data_offer.accept requests must happen before the call to + * wl_data_offer.finish. + * @since: 3 + */ + void (*action)(void *data, + struct wl_data_offer *wl_data_offer, + uint32_t dnd_action); }; static inline int @@ -730,6 +860,14 @@ #define WL_DATA_OFFER_ACCEPT 0 #define WL_DATA_OFFER_RECEIVE 1 #define WL_DATA_OFFER_DESTROY 2 +#define WL_DATA_OFFER_FINISH 3 +#define WL_DATA_OFFER_SET_ACTIONS 4 + +#define WL_DATA_OFFER_ACCEPT_SINCE_VERSION 1 +#define WL_DATA_OFFER_RECEIVE_SINCE_VERSION 1 +#define WL_DATA_OFFER_DESTROY_SINCE_VERSION 1 +#define WL_DATA_OFFER_FINISH_SINCE_VERSION 3 +#define WL_DATA_OFFER_SET_ACTIONS_SINCE_VERSION 3 static inline void wl_data_offer_set_user_data(struct wl_data_offer *wl_data_offer, void *user_data) @@ -743,6 +881,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_data_offer); } +static inline uint32_t +wl_data_offer_get_version(struct wl_data_offer *wl_data_offer) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_data_offer); +} + static inline void wl_data_offer_accept(struct wl_data_offer *wl_data_offer, uint32_t serial, const char *mime_type) { @@ -766,11 +910,36 @@ wl_proxy_destroy((struct wl_proxy *) wl_data_offer); } +static inline void +wl_data_offer_finish(struct wl_data_offer *wl_data_offer) +{ + wl_proxy_marshal((struct wl_proxy *) wl_data_offer, + WL_DATA_OFFER_FINISH); +} + +static inline void +wl_data_offer_set_actions(struct wl_data_offer *wl_data_offer, uint32_t dnd_actions, uint32_t preferred_action) +{ + wl_proxy_marshal((struct wl_proxy *) wl_data_offer, + WL_DATA_OFFER_SET_ACTIONS, dnd_actions, preferred_action); +} + +#ifndef WL_DATA_SOURCE_ERROR_ENUM +#define WL_DATA_SOURCE_ERROR_ENUM +enum wl_data_source_error { + WL_DATA_SOURCE_ERROR_INVALID_ACTION_MASK = 0, + WL_DATA_SOURCE_ERROR_INVALID_SOURCE = 1, +}; +#endif /* WL_DATA_SOURCE_ERROR_ENUM */ + /** * wl_data_source - offer to transfer data * @target: a target accepts an offered mime type * @send: send the data * @cancelled: selection was cancelled + * @dnd_drop_performed: the drag-and-drop operation physically finished + * @dnd_finished: the drag-and-drop operation concluded + * @action: notify the selected action * * The wl_data_source object is the source side of a wl_data_offer. It is * created by the source client in a data transfer and provides a way to @@ -806,11 +975,96 @@ /** * cancelled - selection was cancelled * - * This data source has been replaced by another data source. The - * client should clean up and destroy this data source. + * This data source is no longer valid. There are several reasons + * why this could happen: + * + * - The data source has been replaced by another data source. - + * The drag-and-drop operation was performed, but the drop + * destination did not accept any of the mimetypes offered through + * wl_data_source.target. - The drag-and-drop operation was + * performed, but the drop destination did not select any of the + * actions present in the mask offered through + * wl_data_source.action. - The drag-and-drop operation was + * performed but didn't happen over a surface. - The compositor + * cancelled the drag-and-drop operation (e.g. compositor dependent + * timeouts to avoid stale drag-and-drop transfers). + * + * The client should clean up and destroy this data source. + * + * For objects of version 2 or older, wl_data_source.cancelled will + * only be emitted if the data source was replaced by another data + * source. */ void (*cancelled)(void *data, struct wl_data_source *wl_data_source); + /** + * dnd_drop_performed - the drag-and-drop operation physically + * finished + * + * The user performed the drop action. This event does not + * indicate acceptance, wl_data_source.cancelled may still be + * emitted afterwards if the drop destination does not accept any + * mimetype. + * + * However, this event might however not be received if the + * compositor cancelled the drag-and-drop operation before this + * event could happen. + * + * Note that the data_source may still be used in the future and + * should not be destroyed here. + * @since: 3 + */ + void (*dnd_drop_performed)(void *data, + struct wl_data_source *wl_data_source); + /** + * dnd_finished - the drag-and-drop operation concluded + * + * The drop destination finished interoperating with this data + * source, so the client is now free to destroy this data source + * and free all associated data. + * + * If the action used to perform the operation was "move", the + * source can now delete the transferred data. + * @since: 3 + */ + void (*dnd_finished)(void *data, + struct wl_data_source *wl_data_source); + /** + * action - notify the selected action + * @dnd_action: (none) + * + * This event indicates the action selected by the compositor + * after matching the source/destination side actions. Only one + * action (or none) will be offered here. + * + * This event can be emitted multiple times during the + * drag-and-drop operation, mainly in response to destination side + * changes through wl_data_offer.set_actions, and as the data + * device enters/leaves surfaces. + * + * It is only possible to receive this event after + * wl_data_source.dnd_drop_performed if the drag-and-drop operation + * ended in an "ask" action, in which case the final + * wl_data_source.action event will happen immediately before + * wl_data_source.dnd_finished. + * + * Compositors may also change the selected action on the fly, + * mainly in response to keyboard modifier changes during the + * drag-and-drop operation. + * + * The most recent action received is always the valid one. The + * chosen action may change alongside negotiation (e.g. an "ask" + * action can turn into a "move" operation), so the effects of the + * final action must always be applied in + * wl_data_offer.dnd_finished. + * + * Clients can trigger cursor surface changes from this point, so + * they reflect the current action. + * @since: 3 + */ + void (*action)(void *data, + struct wl_data_source *wl_data_source, + uint32_t dnd_action); }; static inline int @@ -823,6 +1077,11 @@ #define WL_DATA_SOURCE_OFFER 0 #define WL_DATA_SOURCE_DESTROY 1 +#define WL_DATA_SOURCE_SET_ACTIONS 2 + +#define WL_DATA_SOURCE_OFFER_SINCE_VERSION 1 +#define WL_DATA_SOURCE_DESTROY_SINCE_VERSION 1 +#define WL_DATA_SOURCE_SET_ACTIONS_SINCE_VERSION 3 static inline void wl_data_source_set_user_data(struct wl_data_source *wl_data_source, void *user_data) @@ -836,6 +1095,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_data_source); } +static inline uint32_t +wl_data_source_get_version(struct wl_data_source *wl_data_source) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_data_source); +} + static inline void wl_data_source_offer(struct wl_data_source *wl_data_source, const char *mime_type) { @@ -852,6 +1117,13 @@ wl_proxy_destroy((struct wl_proxy *) wl_data_source); } +static inline void +wl_data_source_set_actions(struct wl_data_source *wl_data_source, uint32_t dnd_actions) +{ + wl_proxy_marshal((struct wl_proxy *) wl_data_source, + WL_DATA_SOURCE_SET_ACTIONS, dnd_actions); +} + #ifndef WL_DATA_DEVICE_ERROR_ENUM #define WL_DATA_DEVICE_ERROR_ENUM enum wl_data_device_error { @@ -940,6 +1212,17 @@ * * The event is sent when a drag-and-drop operation is ended * because the implicit grab is removed. + * + * The drag-and-drop destination is expected to honor the last + * action received through wl_data_offer.action, if the resulting + * action is "copy" or "move", the destination can still perform + * wl_data_offer.receive requests, and is expected to end all + * transfers with a wl_data_offer.finish request. + * + * If the resulting action is "ask", the action will not be + * considered final. The drag-and-drop destination is expected to + * perform one last wl_data_offer.set_actions request, or + * wl_data_offer.destroy in order to cancel the operation. */ void (*drop)(void *data, struct wl_data_device *wl_data_device); @@ -975,6 +1258,10 @@ #define WL_DATA_DEVICE_SET_SELECTION 1 #define WL_DATA_DEVICE_RELEASE 2 +#define WL_DATA_DEVICE_START_DRAG_SINCE_VERSION 1 +#define WL_DATA_DEVICE_SET_SELECTION_SINCE_VERSION 1 +#define WL_DATA_DEVICE_RELEASE_SINCE_VERSION 2 + static inline void wl_data_device_set_user_data(struct wl_data_device *wl_data_device, void *user_data) { @@ -987,6 +1274,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_data_device); } +static inline uint32_t +wl_data_device_get_version(struct wl_data_device *wl_data_device) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_data_device); +} + static inline void wl_data_device_destroy(struct wl_data_device *wl_data_device) { @@ -1016,9 +1309,50 @@ wl_proxy_destroy((struct wl_proxy *) wl_data_device); } +#ifndef WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM +#define WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM +/** + * wl_data_device_manager_dnd_action - drag and drop actions + * @WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE: (none) + * @WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY: (none) + * @WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE: (none) + * @WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK: (none) + * + * This is a bitmask of the available/preferred actions in a + * drag-and-drop operation. + * + * In the compositor, the selected action is a result of matching the + * actions offered by the source and destination sides. "action" events + * with a "none" action will be sent to both source and destination if + * there is no match. All further checks will effectively happen on (source + * actions ∩ destination actions). + * + * In addition, compositors may also pick different actions in reaction to + * key modifiers being pressed, one common design that is used in major + * toolkits (and the behavior recommended for compositors) is: + * + * - If no modifiers are pressed, the first match (in bit order) will be + * used. - Pressing Shift selects "move", if enabled in the mask. - + * Pressing Control selects "copy", if enabled in the mask. + * + * Behavior beyond that is considered implementation-dependent. Compositors + * may for example bind other modifiers (like Alt/Meta) or drags initiated + * with other buttons than BTN_LEFT to specific actions (e.g. "ask"). + */ +enum wl_data_device_manager_dnd_action { + WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE = 0, + WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY = 1, + WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE = 2, + WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK = 4, +}; +#endif /* WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM */ + #define WL_DATA_DEVICE_MANAGER_CREATE_DATA_SOURCE 0 #define WL_DATA_DEVICE_MANAGER_GET_DATA_DEVICE 1 +#define WL_DATA_DEVICE_MANAGER_CREATE_DATA_SOURCE_SINCE_VERSION 1 +#define WL_DATA_DEVICE_MANAGER_GET_DATA_DEVICE_SINCE_VERSION 1 + static inline void wl_data_device_manager_set_user_data(struct wl_data_device_manager *wl_data_device_manager, void *user_data) { @@ -1031,6 +1365,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_data_device_manager); } +static inline uint32_t +wl_data_device_manager_get_version(struct wl_data_device_manager *wl_data_device_manager) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_data_device_manager); +} + static inline void wl_data_device_manager_destroy(struct wl_data_device_manager *wl_data_device_manager) { @@ -1068,6 +1408,8 @@ #define WL_SHELL_GET_SHELL_SURFACE 0 +#define WL_SHELL_GET_SHELL_SURFACE_SINCE_VERSION 1 + static inline void wl_shell_set_user_data(struct wl_shell *wl_shell, void *user_data) { @@ -1080,6 +1422,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_shell); } +static inline uint32_t +wl_shell_get_version(struct wl_shell *wl_shell) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_shell); +} + static inline void wl_shell_destroy(struct wl_shell *wl_shell) { @@ -1257,6 +1605,17 @@ #define WL_SHELL_SURFACE_SET_TITLE 8 #define WL_SHELL_SURFACE_SET_CLASS 9 +#define WL_SHELL_SURFACE_PONG_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_MOVE_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_RESIZE_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_SET_TOPLEVEL_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_SET_TRANSIENT_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_SET_FULLSCREEN_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_SET_POPUP_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_SET_MAXIMIZED_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_SET_TITLE_SINCE_VERSION 1 +#define WL_SHELL_SURFACE_SET_CLASS_SINCE_VERSION 1 + static inline void wl_shell_surface_set_user_data(struct wl_shell_surface *wl_shell_surface, void *user_data) { @@ -1269,6 +1628,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_shell_surface); } +static inline uint32_t +wl_shell_surface_get_version(struct wl_shell_surface *wl_shell_surface) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_shell_surface); +} + static inline void wl_shell_surface_destroy(struct wl_shell_surface *wl_shell_surface) { @@ -1446,6 +1811,18 @@ #define WL_SURFACE_COMMIT 6 #define WL_SURFACE_SET_BUFFER_TRANSFORM 7 #define WL_SURFACE_SET_BUFFER_SCALE 8 +#define WL_SURFACE_DAMAGE_BUFFER 9 + +#define WL_SURFACE_DESTROY_SINCE_VERSION 1 +#define WL_SURFACE_ATTACH_SINCE_VERSION 1 +#define WL_SURFACE_DAMAGE_SINCE_VERSION 1 +#define WL_SURFACE_FRAME_SINCE_VERSION 1 +#define WL_SURFACE_SET_OPAQUE_REGION_SINCE_VERSION 1 +#define WL_SURFACE_SET_INPUT_REGION_SINCE_VERSION 1 +#define WL_SURFACE_COMMIT_SINCE_VERSION 1 +#define WL_SURFACE_SET_BUFFER_TRANSFORM_SINCE_VERSION 2 +#define WL_SURFACE_SET_BUFFER_SCALE_SINCE_VERSION 3 +#define WL_SURFACE_DAMAGE_BUFFER_SINCE_VERSION 4 static inline void wl_surface_set_user_data(struct wl_surface *wl_surface, void *user_data) @@ -1459,6 +1836,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_surface); } +static inline uint32_t +wl_surface_get_version(struct wl_surface *wl_surface) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_surface); +} + static inline void wl_surface_destroy(struct wl_surface *wl_surface) { @@ -1528,6 +1911,13 @@ WL_SURFACE_SET_BUFFER_SCALE, scale); } +static inline void +wl_surface_damage_buffer(struct wl_surface *wl_surface, int32_t x, int32_t y, int32_t width, int32_t height) +{ + wl_proxy_marshal((struct wl_proxy *) wl_surface, + WL_SURFACE_DAMAGE_BUFFER, x, y, width, height); +} + #ifndef WL_SEAT_CAPABILITY_ENUM #define WL_SEAT_CAPABILITY_ENUM /** @@ -1564,6 +1954,28 @@ * This is emitted whenever a seat gains or loses the pointer, * keyboard or touch capabilities. The argument is a capability * enum containing the complete set of capabilities this seat has. + * + * When the pointer capability is added, a client may create a + * wl_pointer object using the wl_seat.get_pointer request. This + * object will receive pointer events until the capability is + * removed in the future. + * + * When the pointer capability is removed, a client should destroy + * the wl_pointer objects associated with the seat where the + * capability was removed, using the wl_pointer.release request. No + * further pointer events will be received on these objects. + * + * In some compositors, if a seat regains the pointer capability + * and a client has a previously obtained wl_pointer object of + * version 4 or less, that object may start sending pointer events + * again. This behavior is considered a misinterpretation of the + * intended behavior and must not be relied upon by the client. + * wl_pointer objects of version 5 or later must not send events if + * created before the most recent event notifying the client of an + * added pointer capability. + * + * The above behavior also applies to wl_keyboard and wl_touch with + * the keyboard and touch capabilities, respectively. */ void (*capabilities)(void *data, struct wl_seat *wl_seat, @@ -1593,6 +2005,12 @@ #define WL_SEAT_GET_POINTER 0 #define WL_SEAT_GET_KEYBOARD 1 #define WL_SEAT_GET_TOUCH 2 +#define WL_SEAT_RELEASE 3 + +#define WL_SEAT_GET_POINTER_SINCE_VERSION 1 +#define WL_SEAT_GET_KEYBOARD_SINCE_VERSION 1 +#define WL_SEAT_GET_TOUCH_SINCE_VERSION 1 +#define WL_SEAT_RELEASE_SINCE_VERSION 5 static inline void wl_seat_set_user_data(struct wl_seat *wl_seat, void *user_data) @@ -1606,6 +2024,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_seat); } +static inline uint32_t +wl_seat_get_version(struct wl_seat *wl_seat) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_seat); +} + static inline void wl_seat_destroy(struct wl_seat *wl_seat) { @@ -1645,6 +2069,15 @@ return (struct wl_touch *) id; } +static inline void +wl_seat_release(struct wl_seat *wl_seat) +{ + wl_proxy_marshal((struct wl_proxy *) wl_seat, + WL_SEAT_RELEASE); + + wl_proxy_destroy((struct wl_proxy *) wl_seat); +} + #ifndef WL_POINTER_ERROR_ENUM #define WL_POINTER_ERROR_ENUM enum wl_pointer_error { @@ -1683,6 +2116,34 @@ }; #endif /* WL_POINTER_AXIS_ENUM */ +#ifndef WL_POINTER_AXIS_SOURCE_ENUM +#define WL_POINTER_AXIS_SOURCE_ENUM +/** + * wl_pointer_axis_source - axis source types + * @WL_POINTER_AXIS_SOURCE_WHEEL: A physical wheel + * @WL_POINTER_AXIS_SOURCE_FINGER: Finger on a touch surface + * @WL_POINTER_AXIS_SOURCE_CONTINUOUS: Continuous coordinate space + * + * Describes the source types for axis events. This indicates to the + * client how an axis event was physically generated; a client may adjust + * the user interface accordingly. For example, scroll events from a + * "finger" source may be in a smooth coordinate space with kinetic + * scrolling whereas a "wheel" source may be in discrete steps of a number + * of lines. + * + * The "continuous" axis source is a device generating events in a + * continuous coordinate space, but using something other than a finger. + * One example for this source is button-based scrolling where the vertical + * motion of a device is converted to scroll events while a button is held + * down. + */ +enum wl_pointer_axis_source { + WL_POINTER_AXIS_SOURCE_WHEEL = 0, + WL_POINTER_AXIS_SOURCE_FINGER = 1, + WL_POINTER_AXIS_SOURCE_CONTINUOUS = 2, +}; +#endif /* WL_POINTER_AXIS_SOURCE_ENUM */ + /** * wl_pointer - pointer input device * @enter: enter event @@ -1690,6 +2151,10 @@ * @motion: pointer motion event * @button: pointer button event * @axis: axis event + * @frame: end of a pointer event sequence + * @axis_source: axis source event + * @axis_stop: axis stop event + * @axis_discrete: axis click event * * The wl_pointer interface represents one or more input devices, such as * mice, which control the pointer location and pointer_focus of a seat. @@ -1796,6 +2261,143 @@ uint32_t time, uint32_t axis, wl_fixed_t value); + /** + * frame - end of a pointer event sequence + * + * Indicates the end of a set of events that logically belong + * together. A client is expected to accumulate the data in all + * events within the frame before proceeding. + * + * All wl_pointer events before a wl_pointer.frame event belong + * logically together. For example, in a diagonal scroll motion the + * compositor will send an optional wl_pointer.axis_source event, + * two wl_pointer.axis events (horizontal and vertical) and finally + * a wl_pointer.frame event. The client may use this information to + * calculate a diagonal vector for scrolling. + * + * When multiple wl_pointer.axis events occur within the same + * frame, the motion vector is the combined motion of all events. + * When a wl_pointer.axis and a wl_pointer.axis_stop event occur + * within the same frame, this indicates that axis movement in one + * axis has stopped but continues in the other axis. When multiple + * wl_pointer.axis_stop events occur within in the same frame, this + * indicates that these axes stopped in the same instance. + * + * A wl_pointer.frame event is sent for every logical event group, + * even if the group only contains a single wl_pointer event. + * Specifically, a client may get a sequence: motion, frame, + * button, frame, axis, frame, axis_stop, frame. + * + * The wl_pointer.enter and wl_pointer.leave events are logical + * events generated by the compositor and not the hardware. These + * events are also grouped by a wl_pointer.frame. When a pointer + * moves from one surface to the another, a compositor should group + * the wl_pointer.leave event within the same wl_pointer.frame. + * However, a client must not rely on wl_pointer.leave and + * wl_pointer.enter being in the same wl_pointer.frame. + * Compositor-specific policies may require the wl_pointer.leave + * and wl_pointer.enter event being split across multiple + * wl_pointer.frame groups. + * @since: 5 + */ + void (*frame)(void *data, + struct wl_pointer *wl_pointer); + /** + * axis_source - axis source event + * @axis_source: (none) + * + * Source information for scroll and other axes. + * + * This event does not occur on its own. It is sent before a + * wl_pointer.frame event and carries the source information for + * all events within that frame. + * + * The source specifies how this event was generated. If the source + * is wl_pointer.axis_source.finger, a wl_pointer.axis_stop event + * will be sent when the user lifts the finger off the device. + * + * If the source is wl_pointer axis_source.wheel or + * wl_pointer.axis_source.continuous, a wl_pointer.axis_stop event + * may or may not be sent. Whether a compositor sends a axis_stop + * event for these sources is hardware-specific and + * implementation-dependent; clients must not rely on receiving an + * axis_stop event for these scroll sources and should treat scroll + * sequences from these scroll sources as unterminated by default. + * + * This event is optional. If the source is unknown for a + * particular axis event sequence, no event is sent. Only one + * wl_pointer.axis_source event is permitted per frame. + * + * The order of wl_pointer.axis_discrete and wl_pointer.axis_source + * is not guaranteed. + * @since: 5 + */ + void (*axis_source)(void *data, + struct wl_pointer *wl_pointer, + uint32_t axis_source); + /** + * axis_stop - axis stop event + * @time: timestamp with millisecond granularity + * @axis: the axis stopped with this event + * + * Stop notification for scroll and other axes. + * + * For some wl_pointer.axis_source types, a wl_pointer.axis_stop + * event is sent to notify a client that the axis sequence has + * terminated. This enables the client to implement kinetic + * scrolling. See the wl_pointer.axis_source documentation for + * information on when this event may be generated. + * + * Any wl_pointer.axis events with the same axis_source after this + * event should be considered as the start of a new axis motion. + * + * The timestamp is to be interpreted identical to the timestamp in + * the wl_pointer.axis event. The timestamp value may be the same + * as a preceeding wl_pointer.axis event. + * @since: 5 + */ + void (*axis_stop)(void *data, + struct wl_pointer *wl_pointer, + uint32_t time, + uint32_t axis); + /** + * axis_discrete - axis click event + * @axis: (none) + * @discrete: (none) + * + * Discrete step information for scroll and other axes. + * + * This event carries the axis value of the wl_pointer.axis event + * in discrete steps (e.g. mouse wheel clicks). + * + * This event does not occur on its own, it is coupled with a + * wl_pointer.axis event that represents this axis value on a + * continuous scale. The protocol guarantees that each + * axis_discrete event is always followed by exactly one axis event + * with the same axis number within the same wl_pointer.frame. Note + * that the protocol allows for other events to occur between the + * axis_discrete and its coupled axis event, including other + * axis_discrete or axis events. + * + * This event is optional; continuous scrolling devices like + * two-finger scrolling on touchpads do not have discrete steps and + * do not generate this event. + * + * The discrete value carries the directional information. e.g. a + * value of -2 is two steps towards the negative direction of this + * axis. + * + * The axis number is identical to the axis number in the associate + * axis event. + * + * The order of wl_pointer.axis_discrete and wl_pointer.axis_source + * is not guaranteed. + * @since: 5 + */ + void (*axis_discrete)(void *data, + struct wl_pointer *wl_pointer, + uint32_t axis, + int32_t discrete); }; static inline int @@ -1809,6 +2411,9 @@ #define WL_POINTER_SET_CURSOR 0 #define WL_POINTER_RELEASE 1 +#define WL_POINTER_SET_CURSOR_SINCE_VERSION 1 +#define WL_POINTER_RELEASE_SINCE_VERSION 3 + static inline void wl_pointer_set_user_data(struct wl_pointer *wl_pointer, void *user_data) { @@ -1821,6 +2426,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_pointer); } +static inline uint32_t +wl_pointer_get_version(struct wl_pointer *wl_pointer) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_pointer); +} + static inline void wl_pointer_destroy(struct wl_pointer *wl_pointer) { @@ -2003,6 +2614,8 @@ #define WL_KEYBOARD_RELEASE 0 +#define WL_KEYBOARD_RELEASE_SINCE_VERSION 3 + static inline void wl_keyboard_set_user_data(struct wl_keyboard *wl_keyboard, void *user_data) { @@ -2015,6 +2628,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_keyboard); } +static inline uint32_t +wl_keyboard_get_version(struct wl_keyboard *wl_keyboard) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_keyboard); +} + static inline void wl_keyboard_destroy(struct wl_keyboard *wl_keyboard) { @@ -2131,6 +2750,8 @@ #define WL_TOUCH_RELEASE 0 +#define WL_TOUCH_RELEASE_SINCE_VERSION 3 + static inline void wl_touch_set_user_data(struct wl_touch *wl_touch, void *user_data) { @@ -2143,6 +2764,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_touch); } +static inline uint32_t +wl_touch_get_version(struct wl_touch *wl_touch) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_touch); +} + static inline void wl_touch_destroy(struct wl_touch *wl_touch) { @@ -2347,6 +2974,7 @@ (void (**)(void)) listener, data); } + static inline void wl_output_set_user_data(struct wl_output *wl_output, void *user_data) { @@ -2359,6 +2987,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_output); } +static inline uint32_t +wl_output_get_version(struct wl_output *wl_output) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_output); +} + static inline void wl_output_destroy(struct wl_output *wl_output) { @@ -2369,6 +3003,10 @@ #define WL_REGION_ADD 1 #define WL_REGION_SUBTRACT 2 +#define WL_REGION_DESTROY_SINCE_VERSION 1 +#define WL_REGION_ADD_SINCE_VERSION 1 +#define WL_REGION_SUBTRACT_SINCE_VERSION 1 + static inline void wl_region_set_user_data(struct wl_region *wl_region, void *user_data) { @@ -2381,6 +3019,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_region); } +static inline uint32_t +wl_region_get_version(struct wl_region *wl_region) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_region); +} + static inline void wl_region_destroy(struct wl_region *wl_region) { @@ -2414,6 +3058,9 @@ #define WL_SUBCOMPOSITOR_DESTROY 0 #define WL_SUBCOMPOSITOR_GET_SUBSURFACE 1 +#define WL_SUBCOMPOSITOR_DESTROY_SINCE_VERSION 1 +#define WL_SUBCOMPOSITOR_GET_SUBSURFACE_SINCE_VERSION 1 + static inline void wl_subcompositor_set_user_data(struct wl_subcompositor *wl_subcompositor, void *user_data) { @@ -2426,6 +3073,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_subcompositor); } +static inline uint32_t +wl_subcompositor_get_version(struct wl_subcompositor *wl_subcompositor) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_subcompositor); +} + static inline void wl_subcompositor_destroy(struct wl_subcompositor *wl_subcompositor) { @@ -2460,6 +3113,13 @@ #define WL_SUBSURFACE_SET_SYNC 4 #define WL_SUBSURFACE_SET_DESYNC 5 +#define WL_SUBSURFACE_DESTROY_SINCE_VERSION 1 +#define WL_SUBSURFACE_SET_POSITION_SINCE_VERSION 1 +#define WL_SUBSURFACE_PLACE_ABOVE_SINCE_VERSION 1 +#define WL_SUBSURFACE_PLACE_BELOW_SINCE_VERSION 1 +#define WL_SUBSURFACE_SET_SYNC_SINCE_VERSION 1 +#define WL_SUBSURFACE_SET_DESYNC_SINCE_VERSION 1 + static inline void wl_subsurface_set_user_data(struct wl_subsurface *wl_subsurface, void *user_data) { @@ -2472,6 +3132,12 @@ return wl_proxy_get_user_data((struct wl_proxy *) wl_subsurface); } +static inline uint32_t +wl_subsurface_get_version(struct wl_subsurface *wl_subsurface) +{ + return wl_proxy_get_version((struct wl_proxy *) wl_subsurface); +} + static inline void wl_subsurface_destroy(struct wl_subsurface *wl_subsurface) {
diff --git a/third_party/wayland/include/protocol/wayland-server-protocol-core.h b/third_party/wayland/include/protocol/wayland-server-protocol-core.h index c5353c20..5cc5367 100644 --- a/third_party/wayland/include/protocol/wayland-server-protocol-core.h +++ b/third_party/wayland/include/protocol/wayland-server-protocol-core.h
@@ -1,8 +1,8 @@ -/* +/* * Copyright © 2008-2011 Kristian Høgsberg * Copyright © 2010-2011 Intel Corporation * Copyright © 2012-2013 Collabora, Ltd. - * + * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, @@ -10,11 +10,11 @@ * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: - * + * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial * portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -539,11 +539,23 @@ wl_resource_post_event(resource_, WL_BUFFER_RELEASE); } +#ifndef WL_DATA_OFFER_ERROR_ENUM +#define WL_DATA_OFFER_ERROR_ENUM +enum wl_data_offer_error { + WL_DATA_OFFER_ERROR_INVALID_FINISH = 0, + WL_DATA_OFFER_ERROR_INVALID_ACTION_MASK = 1, + WL_DATA_OFFER_ERROR_INVALID_ACTION = 2, + WL_DATA_OFFER_ERROR_INVALID_OFFER = 3, +}; +#endif /* WL_DATA_OFFER_ERROR_ENUM */ + /** * wl_data_offer - offer to transfer data * @accept: accept one of the offered mime types * @receive: request that the data is transferred * @destroy: destroy data offer + * @finish: the offer will no longer be used + * @set_actions: set the available/preferred drag-and-drop actions * * A wl_data_offer represents a piece of data offered for transfer by * another client (the source client). It is used by the copy-and-paste and @@ -560,7 +572,17 @@ * Indicate that the client can accept the given mime type, or * NULL for not accepted. * - * Used for feedback during drag-and-drop. + * For objects of version 2 or older, this request is used by the + * client to give feedback whether the client can receive the given + * mime type, or NULL if none is accepted; the feedback does not + * determine whether the drag-and-drop operation succeeds or not. + * + * For objects of version 3 or newer, this request determines the + * final result of the drag-and-drop operation. If the end result + * is that no mime types were accepted, the drag-and-drop operation + * will be cancelled and the corresponding drag source will receive + * wl_data_source.cancelled. Clients may still use this event in + * conjunction with wl_data_source.action for feedback. */ void (*accept)(struct wl_client *client, struct wl_resource *resource, @@ -581,6 +603,11 @@ * The receiving client reads from the read end of the pipe until * EOF and then closes its end, at which point the transfer is * complete. + * + * This request may happen multiple times for different mimetypes, + * both before and after wl_data_device.drop. Drag-and-drop + * destination clients may preemptively fetch data or examine it + * more closely to determine acceptance. */ void (*receive)(struct wl_client *client, struct wl_resource *resource, @@ -593,11 +620,77 @@ */ void (*destroy)(struct wl_client *client, struct wl_resource *resource); + /** + * finish - the offer will no longer be used + * + * Notifies the compositor that the drag destination successfully + * finished the drag-and-drop operation. + * + * Upon receiving this request, the compositor will emit + * wl_data_source.dnd_finished on the drag source client. + * + * It is a client error to perform other requests than + * wl_data_offer.destroy after this one. It is also an error to + * perform this request after a NULL mime type has been set in + * wl_data_offer.accept or no action was received through + * wl_data_offer.action. + * @since: 3 + */ + void (*finish)(struct wl_client *client, + struct wl_resource *resource); + /** + * set_actions - set the available/preferred drag-and-drop + * actions + * @dnd_actions: (none) + * @preferred_action: (none) + * + * Sets the actions that the destination side client supports for + * this operation. This request may trigger the emission of + * wl_data_source.action and wl_data_offer.action events if the + * compositor need to change the selected action. + * + * This request can be called multiple times throughout the + * drag-and-drop operation, typically in response to + * wl_data_device.enter or wl_data_device.motion events. + * + * This request determines the final result of the drag-and-drop + * operation. If the end result is that no action is accepted, the + * drag source will receive wl_drag_source.cancelled. + * + * The dnd_actions argument must contain only values expressed in + * the wl_data_device_manager.dnd_actions enum, and the + * preferred_action argument must only contain one of those values + * set, otherwise it will result in a protocol error. + * + * While managing an "ask" action, the destination drag-and-drop + * client may perform further wl_data_offer.receive requests, and + * is expected to perform one last wl_data_offer.set_actions + * request with a preferred action other than "ask" (and optionally + * wl_data_offer.accept) before requesting wl_data_offer.finish, in + * order to convey the action selected by the user. If the + * preferred action is not in the wl_data_offer.source_actions + * mask, an error will be raised. + * + * If the "ask" action is dismissed (e.g. user cancellation), the + * client is expected to perform wl_data_offer.destroy right away. + * + * This request can only be made on drag-and-drop offers, a + * protocol error will be raised otherwise. + * @since: 3 + */ + void (*set_actions)(struct wl_client *client, + struct wl_resource *resource, + uint32_t dnd_actions, + uint32_t preferred_action); }; #define WL_DATA_OFFER_OFFER 0 +#define WL_DATA_OFFER_SOURCE_ACTIONS 1 +#define WL_DATA_OFFER_ACTION 2 #define WL_DATA_OFFER_OFFER_SINCE_VERSION 1 +#define WL_DATA_OFFER_SOURCE_ACTIONS_SINCE_VERSION 3 +#define WL_DATA_OFFER_ACTION_SINCE_VERSION 3 static inline void wl_data_offer_send_offer(struct wl_resource *resource_, const char *mime_type) @@ -605,10 +698,31 @@ wl_resource_post_event(resource_, WL_DATA_OFFER_OFFER, mime_type); } +static inline void +wl_data_offer_send_source_actions(struct wl_resource *resource_, uint32_t source_actions) +{ + wl_resource_post_event(resource_, WL_DATA_OFFER_SOURCE_ACTIONS, source_actions); +} + +static inline void +wl_data_offer_send_action(struct wl_resource *resource_, uint32_t dnd_action) +{ + wl_resource_post_event(resource_, WL_DATA_OFFER_ACTION, dnd_action); +} + +#ifndef WL_DATA_SOURCE_ERROR_ENUM +#define WL_DATA_SOURCE_ERROR_ENUM +enum wl_data_source_error { + WL_DATA_SOURCE_ERROR_INVALID_ACTION_MASK = 0, + WL_DATA_SOURCE_ERROR_INVALID_SOURCE = 1, +}; +#endif /* WL_DATA_SOURCE_ERROR_ENUM */ + /** * wl_data_source - offer to transfer data * @offer: add an offered mime type * @destroy: destroy the data source + * @set_actions: set the available drag-and-drop actions * * The wl_data_source object is the source side of a wl_data_offer. It is * created by the source client in a data transfer and provides a way to @@ -634,15 +748,43 @@ */ void (*destroy)(struct wl_client *client, struct wl_resource *resource); + /** + * set_actions - set the available drag-and-drop actions + * @dnd_actions: (none) + * + * Sets the actions that the source side client supports for this + * operation. This request may trigger wl_data_source.action and + * wl_data_offer.action events if the compositor needs to change + * the selected action. + * + * The dnd_actions argument must contain only values expressed in + * the wl_data_device_manager.dnd_actions enum, otherwise it will + * result in a protocol error. + * + * This request must be made once only, and can only be made on + * sources used in drag-and-drop, so it must be performed before + * wl_data_device.start_drag. Attempting to use the source other + * than for drag-and-drop will raise a protocol error. + * @since: 3 + */ + void (*set_actions)(struct wl_client *client, + struct wl_resource *resource, + uint32_t dnd_actions); }; #define WL_DATA_SOURCE_TARGET 0 #define WL_DATA_SOURCE_SEND 1 #define WL_DATA_SOURCE_CANCELLED 2 +#define WL_DATA_SOURCE_DND_DROP_PERFORMED 3 +#define WL_DATA_SOURCE_DND_FINISHED 4 +#define WL_DATA_SOURCE_ACTION 5 #define WL_DATA_SOURCE_TARGET_SINCE_VERSION 1 #define WL_DATA_SOURCE_SEND_SINCE_VERSION 1 #define WL_DATA_SOURCE_CANCELLED_SINCE_VERSION 1 +#define WL_DATA_SOURCE_DND_DROP_PERFORMED_SINCE_VERSION 3 +#define WL_DATA_SOURCE_DND_FINISHED_SINCE_VERSION 3 +#define WL_DATA_SOURCE_ACTION_SINCE_VERSION 3 static inline void wl_data_source_send_target(struct wl_resource *resource_, const char *mime_type) @@ -662,6 +804,24 @@ wl_resource_post_event(resource_, WL_DATA_SOURCE_CANCELLED); } +static inline void +wl_data_source_send_dnd_drop_performed(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_DATA_SOURCE_DND_DROP_PERFORMED); +} + +static inline void +wl_data_source_send_dnd_finished(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_DATA_SOURCE_DND_FINISHED); +} + +static inline void +wl_data_source_send_action(struct wl_resource *resource_, uint32_t dnd_action) +{ + wl_resource_post_event(resource_, WL_DATA_SOURCE_ACTION, dnd_action); +} + #ifndef WL_DATA_DEVICE_ERROR_ENUM #define WL_DATA_DEVICE_ERROR_ENUM enum wl_data_device_error { @@ -797,6 +957,44 @@ wl_resource_post_event(resource_, WL_DATA_DEVICE_SELECTION, id); } +#ifndef WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM +#define WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM +/** + * wl_data_device_manager_dnd_action - drag and drop actions + * @WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE: (none) + * @WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY: (none) + * @WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE: (none) + * @WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK: (none) + * + * This is a bitmask of the available/preferred actions in a + * drag-and-drop operation. + * + * In the compositor, the selected action is a result of matching the + * actions offered by the source and destination sides. "action" events + * with a "none" action will be sent to both source and destination if + * there is no match. All further checks will effectively happen on (source + * actions ∩ destination actions). + * + * In addition, compositors may also pick different actions in reaction to + * key modifiers being pressed, one common design that is used in major + * toolkits (and the behavior recommended for compositors) is: + * + * - If no modifiers are pressed, the first match (in bit order) will be + * used. - Pressing Shift selects "move", if enabled in the mask. - + * Pressing Control selects "copy", if enabled in the mask. + * + * Behavior beyond that is considered implementation-dependent. Compositors + * may for example bind other modifiers (like Alt/Meta) or drags initiated + * with other buttons than BTN_LEFT to specific actions (e.g. "ask"). + */ +enum wl_data_device_manager_dnd_action { + WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE = 0, + WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY = 1, + WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE = 2, + WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK = 4, +}; +#endif /* WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM */ + /** * wl_data_device_manager - data transfer interface * @create_data_source: create a new data source @@ -1228,6 +1426,8 @@ * @commit: commit pending surface state * @set_buffer_transform: sets the buffer transformation * @set_buffer_scale: sets the buffer scaling factor + * @damage_buffer: mark part of the surface damaged using buffer + * co-ordinates * * A surface is a rectangular area that is displayed on the screen. It * has a location, size and pixel contents. @@ -1334,10 +1534,9 @@ * * This request is used to describe the regions where the pending * buffer is different from the current surface contents, and where - * the surface therefore needs to be repainted. The pending buffer - * must be set by wl_surface.attach before sending damage. The - * compositor ignores the parts of the damage that fall outside of - * the surface. + * the surface therefore needs to be repainted. The compositor + * ignores the parts of the damage that fall outside of the + * surface. * * Damage is double-buffered state, see wl_surface.commit. * @@ -1350,6 +1549,11 @@ * wl_surface.commit assigns pending damage as the current damage, * and clears pending damage. The server will clear the current * damage as it repaints the surface. + * + * Alternatively, damage can be posted with + * wl_surface.damage_buffer which uses buffer co-ordinates instead + * of surface co-ordinates, and is probably the preferred and + * intuitive way of doing this. */ void (*damage)(struct wl_client *client, struct wl_resource *resource, @@ -1561,6 +1765,55 @@ void (*set_buffer_scale)(struct wl_client *client, struct wl_resource *resource, int32_t scale); + /** + * damage_buffer - mark part of the surface damaged using buffer + * co-ordinates + * @x: (none) + * @y: (none) + * @width: (none) + * @height: (none) + * + * This request is used to describe the regions where the pending + * buffer is different from the current surface contents, and where + * the surface therefore needs to be repainted. The compositor + * ignores the parts of the damage that fall outside of the + * surface. + * + * Damage is double-buffered state, see wl_surface.commit. + * + * The damage rectangle is specified in buffer coordinates. + * + * The initial value for pending damage is empty: no damage. + * wl_surface.damage_buffer adds pending damage: the new pending + * damage is the union of old pending damage and the given + * rectangle. + * + * wl_surface.commit assigns pending damage as the current damage, + * and clears pending damage. The server will clear the current + * damage as it repaints the surface. + * + * This request differs from wl_surface.damage in only one way - it + * takes damage in buffer co-ordinates instead of surface local + * co-ordinates. While this generally is more intuitive than + * surface co-ordinates, it is especially desirable when using + * wp_viewport or when a drawing library (like EGL) is unaware of + * buffer scale and buffer transform. + * + * Note: Because buffer transformation changes and damage requests + * may be interleaved in the protocol stream, It is impossible to + * determine the actual mapping between surface and buffer damage + * until wl_surface.commit time. Therefore, compositors wishing to + * take both kinds of damage into account will have to accumulate + * damage from the two requests separately and only transform from + * one to the other after receiving the wl_surface.commit. + * @since: 4 + */ + void (*damage_buffer)(struct wl_client *client, + struct wl_resource *resource, + int32_t x, + int32_t y, + int32_t width, + int32_t height); }; #define WL_SURFACE_ENTER 0 @@ -1604,6 +1857,7 @@ * @get_pointer: return pointer object * @get_keyboard: return keyboard object * @get_touch: return touch object + * @release: release the seat object * * A seat is a group of keyboards, pointer and touch devices. This object * is published as a global during start up, or when such a device is hot @@ -1619,7 +1873,9 @@ * interface for this seat. * * This request only takes effect if the seat has the pointer - * capability. + * capability, or has had the pointer capability in the past. It is + * a protocol violation to issue this request on a seat that has + * never had the pointer capability. */ void (*get_pointer)(struct wl_client *client, struct wl_resource *resource, @@ -1632,7 +1888,9 @@ * interface for this seat. * * This request only takes effect if the seat has the keyboard - * capability. + * capability, or has had the keyboard capability in the past. It + * is a protocol violation to issue this request on a seat that has + * never had the keyboard capability. */ void (*get_keyboard)(struct wl_client *client, struct wl_resource *resource, @@ -1645,11 +1903,22 @@ * for this seat. * * This request only takes effect if the seat has the touch - * capability. + * capability, or has had the touch capability in the past. It is a + * protocol violation to issue this request on a seat that has + * never had the touch capability. */ void (*get_touch)(struct wl_client *client, struct wl_resource *resource, uint32_t id); + /** + * release - release the seat object + * + * Using this request client can tell the server that it is not + * going to use the seat object anymore. + * @since: 5 + */ + void (*release)(struct wl_client *client, + struct wl_resource *resource); }; #define WL_SEAT_CAPABILITIES 0 @@ -1708,6 +1977,34 @@ }; #endif /* WL_POINTER_AXIS_ENUM */ +#ifndef WL_POINTER_AXIS_SOURCE_ENUM +#define WL_POINTER_AXIS_SOURCE_ENUM +/** + * wl_pointer_axis_source - axis source types + * @WL_POINTER_AXIS_SOURCE_WHEEL: A physical wheel + * @WL_POINTER_AXIS_SOURCE_FINGER: Finger on a touch surface + * @WL_POINTER_AXIS_SOURCE_CONTINUOUS: Continuous coordinate space + * + * Describes the source types for axis events. This indicates to the + * client how an axis event was physically generated; a client may adjust + * the user interface accordingly. For example, scroll events from a + * "finger" source may be in a smooth coordinate space with kinetic + * scrolling whereas a "wheel" source may be in discrete steps of a number + * of lines. + * + * The "continuous" axis source is a device generating events in a + * continuous coordinate space, but using something other than a finger. + * One example for this source is button-based scrolling where the vertical + * motion of a device is converted to scroll events while a button is held + * down. + */ +enum wl_pointer_axis_source { + WL_POINTER_AXIS_SOURCE_WHEEL = 0, + WL_POINTER_AXIS_SOURCE_FINGER = 1, + WL_POINTER_AXIS_SOURCE_CONTINUOUS = 2, +}; +#endif /* WL_POINTER_AXIS_SOURCE_ENUM */ + /** * wl_pointer - pointer input device * @set_cursor: set the pointer surface @@ -1785,12 +2082,20 @@ #define WL_POINTER_MOTION 2 #define WL_POINTER_BUTTON 3 #define WL_POINTER_AXIS 4 +#define WL_POINTER_FRAME 5 +#define WL_POINTER_AXIS_SOURCE 6 +#define WL_POINTER_AXIS_STOP 7 +#define WL_POINTER_AXIS_DISCRETE 8 #define WL_POINTER_ENTER_SINCE_VERSION 1 #define WL_POINTER_LEAVE_SINCE_VERSION 1 #define WL_POINTER_MOTION_SINCE_VERSION 1 #define WL_POINTER_BUTTON_SINCE_VERSION 1 #define WL_POINTER_AXIS_SINCE_VERSION 1 +#define WL_POINTER_FRAME_SINCE_VERSION 5 +#define WL_POINTER_AXIS_SOURCE_SINCE_VERSION 5 +#define WL_POINTER_AXIS_STOP_SINCE_VERSION 5 +#define WL_POINTER_AXIS_DISCRETE_SINCE_VERSION 5 static inline void wl_pointer_send_enter(struct wl_resource *resource_, uint32_t serial, struct wl_resource *surface, wl_fixed_t surface_x, wl_fixed_t surface_y) @@ -1822,6 +2127,30 @@ wl_resource_post_event(resource_, WL_POINTER_AXIS, time, axis, value); } +static inline void +wl_pointer_send_frame(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_POINTER_FRAME); +} + +static inline void +wl_pointer_send_axis_source(struct wl_resource *resource_, uint32_t axis_source) +{ + wl_resource_post_event(resource_, WL_POINTER_AXIS_SOURCE, axis_source); +} + +static inline void +wl_pointer_send_axis_stop(struct wl_resource *resource_, uint32_t time, uint32_t axis) +{ + wl_resource_post_event(resource_, WL_POINTER_AXIS_STOP, time, axis); +} + +static inline void +wl_pointer_send_axis_discrete(struct wl_resource *resource_, uint32_t axis, int32_t discrete) +{ + wl_resource_post_event(resource_, WL_POINTER_AXIS_DISCRETE, axis, discrete); +} + #ifndef WL_KEYBOARD_KEYMAP_FORMAT_ENUM #define WL_KEYBOARD_KEYMAP_FORMAT_ENUM /**
diff --git a/third_party/wayland/include/protocol/wayland-server-protocol.h b/third_party/wayland/include/protocol/wayland-server-protocol.h index 16e3d271..a4153b9 100644 --- a/third_party/wayland/include/protocol/wayland-server-protocol.h +++ b/third_party/wayland/include/protocol/wayland-server-protocol.h
@@ -1,8 +1,8 @@ -/* +/* * Copyright © 2008-2011 Kristian Høgsberg * Copyright © 2010-2011 Intel Corporation * Copyright © 2012-2013 Collabora, Ltd. - * + * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, @@ -10,11 +10,11 @@ * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: - * + * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial * portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -539,11 +539,23 @@ wl_resource_post_event(resource_, WL_BUFFER_RELEASE); } +#ifndef WL_DATA_OFFER_ERROR_ENUM +#define WL_DATA_OFFER_ERROR_ENUM +enum wl_data_offer_error { + WL_DATA_OFFER_ERROR_INVALID_FINISH = 0, + WL_DATA_OFFER_ERROR_INVALID_ACTION_MASK = 1, + WL_DATA_OFFER_ERROR_INVALID_ACTION = 2, + WL_DATA_OFFER_ERROR_INVALID_OFFER = 3, +}; +#endif /* WL_DATA_OFFER_ERROR_ENUM */ + /** * wl_data_offer - offer to transfer data * @accept: accept one of the offered mime types * @receive: request that the data is transferred * @destroy: destroy data offer + * @finish: the offer will no longer be used + * @set_actions: set the available/preferred drag-and-drop actions * * A wl_data_offer represents a piece of data offered for transfer by * another client (the source client). It is used by the copy-and-paste and @@ -560,7 +572,17 @@ * Indicate that the client can accept the given mime type, or * NULL for not accepted. * - * Used for feedback during drag-and-drop. + * For objects of version 2 or older, this request is used by the + * client to give feedback whether the client can receive the given + * mime type, or NULL if none is accepted; the feedback does not + * determine whether the drag-and-drop operation succeeds or not. + * + * For objects of version 3 or newer, this request determines the + * final result of the drag-and-drop operation. If the end result + * is that no mime types were accepted, the drag-and-drop operation + * will be cancelled and the corresponding drag source will receive + * wl_data_source.cancelled. Clients may still use this event in + * conjunction with wl_data_source.action for feedback. */ void (*accept)(struct wl_client *client, struct wl_resource *resource, @@ -581,6 +603,11 @@ * The receiving client reads from the read end of the pipe until * EOF and then closes its end, at which point the transfer is * complete. + * + * This request may happen multiple times for different mimetypes, + * both before and after wl_data_device.drop. Drag-and-drop + * destination clients may preemptively fetch data or examine it + * more closely to determine acceptance. */ void (*receive)(struct wl_client *client, struct wl_resource *resource, @@ -593,11 +620,77 @@ */ void (*destroy)(struct wl_client *client, struct wl_resource *resource); + /** + * finish - the offer will no longer be used + * + * Notifies the compositor that the drag destination successfully + * finished the drag-and-drop operation. + * + * Upon receiving this request, the compositor will emit + * wl_data_source.dnd_finished on the drag source client. + * + * It is a client error to perform other requests than + * wl_data_offer.destroy after this one. It is also an error to + * perform this request after a NULL mime type has been set in + * wl_data_offer.accept or no action was received through + * wl_data_offer.action. + * @since: 3 + */ + void (*finish)(struct wl_client *client, + struct wl_resource *resource); + /** + * set_actions - set the available/preferred drag-and-drop + * actions + * @dnd_actions: (none) + * @preferred_action: (none) + * + * Sets the actions that the destination side client supports for + * this operation. This request may trigger the emission of + * wl_data_source.action and wl_data_offer.action events if the + * compositor need to change the selected action. + * + * This request can be called multiple times throughout the + * drag-and-drop operation, typically in response to + * wl_data_device.enter or wl_data_device.motion events. + * + * This request determines the final result of the drag-and-drop + * operation. If the end result is that no action is accepted, the + * drag source will receive wl_drag_source.cancelled. + * + * The dnd_actions argument must contain only values expressed in + * the wl_data_device_manager.dnd_actions enum, and the + * preferred_action argument must only contain one of those values + * set, otherwise it will result in a protocol error. + * + * While managing an "ask" action, the destination drag-and-drop + * client may perform further wl_data_offer.receive requests, and + * is expected to perform one last wl_data_offer.set_actions + * request with a preferred action other than "ask" (and optionally + * wl_data_offer.accept) before requesting wl_data_offer.finish, in + * order to convey the action selected by the user. If the + * preferred action is not in the wl_data_offer.source_actions + * mask, an error will be raised. + * + * If the "ask" action is dismissed (e.g. user cancellation), the + * client is expected to perform wl_data_offer.destroy right away. + * + * This request can only be made on drag-and-drop offers, a + * protocol error will be raised otherwise. + * @since: 3 + */ + void (*set_actions)(struct wl_client *client, + struct wl_resource *resource, + uint32_t dnd_actions, + uint32_t preferred_action); }; #define WL_DATA_OFFER_OFFER 0 +#define WL_DATA_OFFER_SOURCE_ACTIONS 1 +#define WL_DATA_OFFER_ACTION 2 #define WL_DATA_OFFER_OFFER_SINCE_VERSION 1 +#define WL_DATA_OFFER_SOURCE_ACTIONS_SINCE_VERSION 3 +#define WL_DATA_OFFER_ACTION_SINCE_VERSION 3 static inline void wl_data_offer_send_offer(struct wl_resource *resource_, const char *mime_type) @@ -605,10 +698,31 @@ wl_resource_post_event(resource_, WL_DATA_OFFER_OFFER, mime_type); } +static inline void +wl_data_offer_send_source_actions(struct wl_resource *resource_, uint32_t source_actions) +{ + wl_resource_post_event(resource_, WL_DATA_OFFER_SOURCE_ACTIONS, source_actions); +} + +static inline void +wl_data_offer_send_action(struct wl_resource *resource_, uint32_t dnd_action) +{ + wl_resource_post_event(resource_, WL_DATA_OFFER_ACTION, dnd_action); +} + +#ifndef WL_DATA_SOURCE_ERROR_ENUM +#define WL_DATA_SOURCE_ERROR_ENUM +enum wl_data_source_error { + WL_DATA_SOURCE_ERROR_INVALID_ACTION_MASK = 0, + WL_DATA_SOURCE_ERROR_INVALID_SOURCE = 1, +}; +#endif /* WL_DATA_SOURCE_ERROR_ENUM */ + /** * wl_data_source - offer to transfer data * @offer: add an offered mime type * @destroy: destroy the data source + * @set_actions: set the available drag-and-drop actions * * The wl_data_source object is the source side of a wl_data_offer. It is * created by the source client in a data transfer and provides a way to @@ -634,15 +748,43 @@ */ void (*destroy)(struct wl_client *client, struct wl_resource *resource); + /** + * set_actions - set the available drag-and-drop actions + * @dnd_actions: (none) + * + * Sets the actions that the source side client supports for this + * operation. This request may trigger wl_data_source.action and + * wl_data_offer.action events if the compositor needs to change + * the selected action. + * + * The dnd_actions argument must contain only values expressed in + * the wl_data_device_manager.dnd_actions enum, otherwise it will + * result in a protocol error. + * + * This request must be made once only, and can only be made on + * sources used in drag-and-drop, so it must be performed before + * wl_data_device.start_drag. Attempting to use the source other + * than for drag-and-drop will raise a protocol error. + * @since: 3 + */ + void (*set_actions)(struct wl_client *client, + struct wl_resource *resource, + uint32_t dnd_actions); }; #define WL_DATA_SOURCE_TARGET 0 #define WL_DATA_SOURCE_SEND 1 #define WL_DATA_SOURCE_CANCELLED 2 +#define WL_DATA_SOURCE_DND_DROP_PERFORMED 3 +#define WL_DATA_SOURCE_DND_FINISHED 4 +#define WL_DATA_SOURCE_ACTION 5 #define WL_DATA_SOURCE_TARGET_SINCE_VERSION 1 #define WL_DATA_SOURCE_SEND_SINCE_VERSION 1 #define WL_DATA_SOURCE_CANCELLED_SINCE_VERSION 1 +#define WL_DATA_SOURCE_DND_DROP_PERFORMED_SINCE_VERSION 3 +#define WL_DATA_SOURCE_DND_FINISHED_SINCE_VERSION 3 +#define WL_DATA_SOURCE_ACTION_SINCE_VERSION 3 static inline void wl_data_source_send_target(struct wl_resource *resource_, const char *mime_type) @@ -662,6 +804,24 @@ wl_resource_post_event(resource_, WL_DATA_SOURCE_CANCELLED); } +static inline void +wl_data_source_send_dnd_drop_performed(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_DATA_SOURCE_DND_DROP_PERFORMED); +} + +static inline void +wl_data_source_send_dnd_finished(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_DATA_SOURCE_DND_FINISHED); +} + +static inline void +wl_data_source_send_action(struct wl_resource *resource_, uint32_t dnd_action) +{ + wl_resource_post_event(resource_, WL_DATA_SOURCE_ACTION, dnd_action); +} + #ifndef WL_DATA_DEVICE_ERROR_ENUM #define WL_DATA_DEVICE_ERROR_ENUM enum wl_data_device_error { @@ -797,6 +957,44 @@ wl_resource_post_event(resource_, WL_DATA_DEVICE_SELECTION, id); } +#ifndef WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM +#define WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM +/** + * wl_data_device_manager_dnd_action - drag and drop actions + * @WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE: (none) + * @WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY: (none) + * @WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE: (none) + * @WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK: (none) + * + * This is a bitmask of the available/preferred actions in a + * drag-and-drop operation. + * + * In the compositor, the selected action is a result of matching the + * actions offered by the source and destination sides. "action" events + * with a "none" action will be sent to both source and destination if + * there is no match. All further checks will effectively happen on (source + * actions ∩ destination actions). + * + * In addition, compositors may also pick different actions in reaction to + * key modifiers being pressed, one common design that is used in major + * toolkits (and the behavior recommended for compositors) is: + * + * - If no modifiers are pressed, the first match (in bit order) will be + * used. - Pressing Shift selects "move", if enabled in the mask. - + * Pressing Control selects "copy", if enabled in the mask. + * + * Behavior beyond that is considered implementation-dependent. Compositors + * may for example bind other modifiers (like Alt/Meta) or drags initiated + * with other buttons than BTN_LEFT to specific actions (e.g. "ask"). + */ +enum wl_data_device_manager_dnd_action { + WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE = 0, + WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY = 1, + WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE = 2, + WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK = 4, +}; +#endif /* WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM */ + /** * wl_data_device_manager - data transfer interface * @create_data_source: create a new data source @@ -1228,6 +1426,8 @@ * @commit: commit pending surface state * @set_buffer_transform: sets the buffer transformation * @set_buffer_scale: sets the buffer scaling factor + * @damage_buffer: mark part of the surface damaged using buffer + * co-ordinates * * A surface is a rectangular area that is displayed on the screen. It * has a location, size and pixel contents. @@ -1334,10 +1534,9 @@ * * This request is used to describe the regions where the pending * buffer is different from the current surface contents, and where - * the surface therefore needs to be repainted. The pending buffer - * must be set by wl_surface.attach before sending damage. The - * compositor ignores the parts of the damage that fall outside of - * the surface. + * the surface therefore needs to be repainted. The compositor + * ignores the parts of the damage that fall outside of the + * surface. * * Damage is double-buffered state, see wl_surface.commit. * @@ -1350,6 +1549,11 @@ * wl_surface.commit assigns pending damage as the current damage, * and clears pending damage. The server will clear the current * damage as it repaints the surface. + * + * Alternatively, damage can be posted with + * wl_surface.damage_buffer which uses buffer co-ordinates instead + * of surface co-ordinates, and is probably the preferred and + * intuitive way of doing this. */ void (*damage)(struct wl_client *client, struct wl_resource *resource, @@ -1561,6 +1765,55 @@ void (*set_buffer_scale)(struct wl_client *client, struct wl_resource *resource, int32_t scale); + /** + * damage_buffer - mark part of the surface damaged using buffer + * co-ordinates + * @x: (none) + * @y: (none) + * @width: (none) + * @height: (none) + * + * This request is used to describe the regions where the pending + * buffer is different from the current surface contents, and where + * the surface therefore needs to be repainted. The compositor + * ignores the parts of the damage that fall outside of the + * surface. + * + * Damage is double-buffered state, see wl_surface.commit. + * + * The damage rectangle is specified in buffer coordinates. + * + * The initial value for pending damage is empty: no damage. + * wl_surface.damage_buffer adds pending damage: the new pending + * damage is the union of old pending damage and the given + * rectangle. + * + * wl_surface.commit assigns pending damage as the current damage, + * and clears pending damage. The server will clear the current + * damage as it repaints the surface. + * + * This request differs from wl_surface.damage in only one way - it + * takes damage in buffer co-ordinates instead of surface local + * co-ordinates. While this generally is more intuitive than + * surface co-ordinates, it is especially desirable when using + * wp_viewport or when a drawing library (like EGL) is unaware of + * buffer scale and buffer transform. + * + * Note: Because buffer transformation changes and damage requests + * may be interleaved in the protocol stream, It is impossible to + * determine the actual mapping between surface and buffer damage + * until wl_surface.commit time. Therefore, compositors wishing to + * take both kinds of damage into account will have to accumulate + * damage from the two requests separately and only transform from + * one to the other after receiving the wl_surface.commit. + * @since: 4 + */ + void (*damage_buffer)(struct wl_client *client, + struct wl_resource *resource, + int32_t x, + int32_t y, + int32_t width, + int32_t height); }; #define WL_SURFACE_ENTER 0 @@ -1604,6 +1857,7 @@ * @get_pointer: return pointer object * @get_keyboard: return keyboard object * @get_touch: return touch object + * @release: release the seat object * * A seat is a group of keyboards, pointer and touch devices. This object * is published as a global during start up, or when such a device is hot @@ -1619,7 +1873,9 @@ * interface for this seat. * * This request only takes effect if the seat has the pointer - * capability. + * capability, or has had the pointer capability in the past. It is + * a protocol violation to issue this request on a seat that has + * never had the pointer capability. */ void (*get_pointer)(struct wl_client *client, struct wl_resource *resource, @@ -1632,7 +1888,9 @@ * interface for this seat. * * This request only takes effect if the seat has the keyboard - * capability. + * capability, or has had the keyboard capability in the past. It + * is a protocol violation to issue this request on a seat that has + * never had the keyboard capability. */ void (*get_keyboard)(struct wl_client *client, struct wl_resource *resource, @@ -1645,11 +1903,22 @@ * for this seat. * * This request only takes effect if the seat has the touch - * capability. + * capability, or has had the touch capability in the past. It is a + * protocol violation to issue this request on a seat that has + * never had the touch capability. */ void (*get_touch)(struct wl_client *client, struct wl_resource *resource, uint32_t id); + /** + * release - release the seat object + * + * Using this request client can tell the server that it is not + * going to use the seat object anymore. + * @since: 5 + */ + void (*release)(struct wl_client *client, + struct wl_resource *resource); }; #define WL_SEAT_CAPABILITIES 0 @@ -1708,6 +1977,34 @@ }; #endif /* WL_POINTER_AXIS_ENUM */ +#ifndef WL_POINTER_AXIS_SOURCE_ENUM +#define WL_POINTER_AXIS_SOURCE_ENUM +/** + * wl_pointer_axis_source - axis source types + * @WL_POINTER_AXIS_SOURCE_WHEEL: A physical wheel + * @WL_POINTER_AXIS_SOURCE_FINGER: Finger on a touch surface + * @WL_POINTER_AXIS_SOURCE_CONTINUOUS: Continuous coordinate space + * + * Describes the source types for axis events. This indicates to the + * client how an axis event was physically generated; a client may adjust + * the user interface accordingly. For example, scroll events from a + * "finger" source may be in a smooth coordinate space with kinetic + * scrolling whereas a "wheel" source may be in discrete steps of a number + * of lines. + * + * The "continuous" axis source is a device generating events in a + * continuous coordinate space, but using something other than a finger. + * One example for this source is button-based scrolling where the vertical + * motion of a device is converted to scroll events while a button is held + * down. + */ +enum wl_pointer_axis_source { + WL_POINTER_AXIS_SOURCE_WHEEL = 0, + WL_POINTER_AXIS_SOURCE_FINGER = 1, + WL_POINTER_AXIS_SOURCE_CONTINUOUS = 2, +}; +#endif /* WL_POINTER_AXIS_SOURCE_ENUM */ + /** * wl_pointer - pointer input device * @set_cursor: set the pointer surface @@ -1785,12 +2082,20 @@ #define WL_POINTER_MOTION 2 #define WL_POINTER_BUTTON 3 #define WL_POINTER_AXIS 4 +#define WL_POINTER_FRAME 5 +#define WL_POINTER_AXIS_SOURCE 6 +#define WL_POINTER_AXIS_STOP 7 +#define WL_POINTER_AXIS_DISCRETE 8 #define WL_POINTER_ENTER_SINCE_VERSION 1 #define WL_POINTER_LEAVE_SINCE_VERSION 1 #define WL_POINTER_MOTION_SINCE_VERSION 1 #define WL_POINTER_BUTTON_SINCE_VERSION 1 #define WL_POINTER_AXIS_SINCE_VERSION 1 +#define WL_POINTER_FRAME_SINCE_VERSION 5 +#define WL_POINTER_AXIS_SOURCE_SINCE_VERSION 5 +#define WL_POINTER_AXIS_STOP_SINCE_VERSION 5 +#define WL_POINTER_AXIS_DISCRETE_SINCE_VERSION 5 static inline void wl_pointer_send_enter(struct wl_resource *resource_, uint32_t serial, struct wl_resource *surface, wl_fixed_t surface_x, wl_fixed_t surface_y) @@ -1822,6 +2127,30 @@ wl_resource_post_event(resource_, WL_POINTER_AXIS, time, axis, value); } +static inline void +wl_pointer_send_frame(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, WL_POINTER_FRAME); +} + +static inline void +wl_pointer_send_axis_source(struct wl_resource *resource_, uint32_t axis_source) +{ + wl_resource_post_event(resource_, WL_POINTER_AXIS_SOURCE, axis_source); +} + +static inline void +wl_pointer_send_axis_stop(struct wl_resource *resource_, uint32_t time, uint32_t axis) +{ + wl_resource_post_event(resource_, WL_POINTER_AXIS_STOP, time, axis); +} + +static inline void +wl_pointer_send_axis_discrete(struct wl_resource *resource_, uint32_t axis, int32_t discrete) +{ + wl_resource_post_event(resource_, WL_POINTER_AXIS_DISCRETE, axis, discrete); +} + #ifndef WL_KEYBOARD_KEYMAP_FORMAT_ENUM #define WL_KEYBOARD_KEYMAP_FORMAT_ENUM /**
diff --git a/third_party/wayland/include/src/wayland-version.h b/third_party/wayland/include/src/wayland-version.h index 34aeaf6..31e7c17 100644 --- a/third_party/wayland/include/src/wayland-version.h +++ b/third_party/wayland/include/src/wayland-version.h
@@ -28,7 +28,7 @@ #define WAYLAND_VERSION_MAJOR 1 #define WAYLAND_VERSION_MINOR 9 -#define WAYLAND_VERSION_MICRO 0 -#define WAYLAND_VERSION "1.9.0" +#define WAYLAND_VERSION_MICRO 91 +#define WAYLAND_VERSION "1.9.91" #endif
diff --git a/third_party/wayland/protocol/wayland-protocol.c b/third_party/wayland/protocol/wayland-protocol.c index 5ce57be..e082b61 100644 --- a/third_party/wayland/protocol/wayland-protocol.c +++ b/third_party/wayland/protocol/wayland-protocol.c
@@ -1,8 +1,8 @@ -/* +/* * Copyright © 2008-2011 Kristian Høgsberg * Copyright © 2010-2011 Intel Corporation * Copyright © 2012-2013 Collabora, Ltd. - * + * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, @@ -10,11 +10,11 @@ * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: - * + * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial * portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -191,7 +191,7 @@ }; WL_EXPORT const struct wl_interface wl_compositor_interface = { - "wl_compositor", 3, + "wl_compositor", 4, 2, wl_compositor_requests, 0, NULL, }; @@ -240,33 +240,41 @@ { "accept", "u?s", types + 0 }, { "receive", "sh", types + 0 }, { "destroy", "", types + 0 }, + { "finish", "3", types + 0 }, + { "set_actions", "3uu", types + 0 }, }; static const struct wl_message wl_data_offer_events[] = { { "offer", "s", types + 0 }, + { "source_actions", "3u", types + 0 }, + { "action", "3u", types + 0 }, }; WL_EXPORT const struct wl_interface wl_data_offer_interface = { - "wl_data_offer", 1, - 3, wl_data_offer_requests, - 1, wl_data_offer_events, + "wl_data_offer", 3, + 5, wl_data_offer_requests, + 3, wl_data_offer_events, }; static const struct wl_message wl_data_source_requests[] = { { "offer", "s", types + 0 }, { "destroy", "", types + 0 }, + { "set_actions", "3u", types + 0 }, }; static const struct wl_message wl_data_source_events[] = { { "target", "?s", types + 0 }, { "send", "sh", types + 0 }, { "cancelled", "", types + 0 }, + { "dnd_drop_performed", "3", types + 0 }, + { "dnd_finished", "3", types + 0 }, + { "action", "3u", types + 0 }, }; WL_EXPORT const struct wl_interface wl_data_source_interface = { - "wl_data_source", 1, - 2, wl_data_source_requests, - 3, wl_data_source_events, + "wl_data_source", 3, + 3, wl_data_source_requests, + 6, wl_data_source_events, }; static const struct wl_message wl_data_device_requests[] = { @@ -285,7 +293,7 @@ }; WL_EXPORT const struct wl_interface wl_data_device_interface = { - "wl_data_device", 2, + "wl_data_device", 3, 3, wl_data_device_requests, 6, wl_data_device_events, }; @@ -296,7 +304,7 @@ }; WL_EXPORT const struct wl_interface wl_data_device_manager_interface = { - "wl_data_device_manager", 2, + "wl_data_device_manager", 3, 2, wl_data_device_manager_requests, 0, NULL, }; @@ -346,6 +354,7 @@ { "commit", "", types + 0 }, { "set_buffer_transform", "2i", types + 0 }, { "set_buffer_scale", "3i", types + 0 }, + { "damage_buffer", "4iiii", types + 0 }, }; static const struct wl_message wl_surface_events[] = { @@ -354,8 +363,8 @@ }; WL_EXPORT const struct wl_interface wl_surface_interface = { - "wl_surface", 3, - 9, wl_surface_requests, + "wl_surface", 4, + 10, wl_surface_requests, 2, wl_surface_events, }; @@ -363,6 +372,7 @@ { "get_pointer", "n", types + 66 }, { "get_keyboard", "n", types + 67 }, { "get_touch", "n", types + 68 }, + { "release", "5", types + 0 }, }; static const struct wl_message wl_seat_events[] = { @@ -371,8 +381,8 @@ }; WL_EXPORT const struct wl_interface wl_seat_interface = { - "wl_seat", 4, - 3, wl_seat_requests, + "wl_seat", 5, + 4, wl_seat_requests, 2, wl_seat_events, }; @@ -387,12 +397,16 @@ { "motion", "uff", types + 0 }, { "button", "uuuu", types + 0 }, { "axis", "uuf", types + 0 }, + { "frame", "5", types + 0 }, + { "axis_source", "5u", types + 0 }, + { "axis_stop", "5uu", types + 0 }, + { "axis_discrete", "5ui", types + 0 }, }; WL_EXPORT const struct wl_interface wl_pointer_interface = { - "wl_pointer", 3, + "wl_pointer", 5, 2, wl_pointer_requests, - 5, wl_pointer_events, + 9, wl_pointer_events, }; static const struct wl_message wl_keyboard_requests[] = { @@ -409,7 +423,7 @@ }; WL_EXPORT const struct wl_interface wl_keyboard_interface = { - "wl_keyboard", 4, + "wl_keyboard", 5, 1, wl_keyboard_requests, 6, wl_keyboard_events, }; @@ -427,7 +441,7 @@ }; WL_EXPORT const struct wl_interface wl_touch_interface = { - "wl_touch", 3, + "wl_touch", 5, 1, wl_touch_requests, 5, wl_touch_events, };
diff --git a/tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp b/tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp index 9bcf3c12..7279070 100644 --- a/tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp +++ b/tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp
@@ -49,7 +49,9 @@ constexpr char kBlinkFieldPrefix[] = "m_"; constexpr char kBlinkStaticMemberPrefix[] = "s_"; -bool GetNameForDecl(const clang::FunctionDecl& decl, std::string& name) { +bool GetNameForDecl(const clang::FunctionDecl& decl, + const clang::ASTContext& context, + std::string& name) { name = decl.getNameAsString(); name[0] = clang::toUppercase(name[0]); return true; @@ -89,7 +91,9 @@ return output; } -bool GetNameForDecl(const clang::FieldDecl& decl, std::string& name) { +bool GetNameForDecl(const clang::FieldDecl& decl, + const clang::ASTContext& context, + std::string& name) { StringRef original_name = decl.getName(); // Blink style field names are prefixed with `m_`. If this prefix isn't // present, assume it's already been converted to Google style. @@ -105,7 +109,8 @@ return true; } -bool IsProbablyConst(const clang::VarDecl& decl) { +bool IsProbablyConst(const clang::VarDecl& decl, + const clang::ASTContext& context) { clang::QualType type = decl.getType(); if (!type.isConstQualified()) return false; @@ -118,30 +123,18 @@ if (decl.getStorageDuration() == clang::SD_Static) return true; - // Otherwise, use a simple heuristic: if it's initialized with a literal of - // some sort, also use kConstantStyle naming. const clang::Expr* initializer = decl.getInit(); if (!initializer) return false; - // Ignore implicit casts, so the literal check below still matches on - // array-to-pointer decay, e.g. - // const char* const kConst = "..."; - if (const clang::ImplicitCastExpr* cast_expr = - clang::dyn_cast<clang::ImplicitCastExpr>(initializer)) - initializer = cast_expr->getSubExprAsWritten(); - - return clang::isa<clang::CharacterLiteral>(initializer) || - clang::isa<clang::CompoundLiteralExpr>(initializer) || - clang::isa<clang::CXXBoolLiteralExpr>(initializer) || - clang::isa<clang::CXXNullPtrLiteralExpr>(initializer) || - clang::isa<clang::FloatingLiteral>(initializer) || - clang::isa<clang::IntegerLiteral>(initializer) || - clang::isa<clang::StringLiteral>(initializer) || - clang::isa<clang::UserDefinedLiteral>(initializer); + // If the expression can be evaluated at compile time, then it should have a + // kFoo style name. Otherwise, not. + return initializer->isEvaluatable(context); } -bool GetNameForDecl(const clang::VarDecl& decl, std::string& name) { +bool GetNameForDecl(const clang::VarDecl& decl, + const clang::ASTContext& context, + std::string& name) { StringRef original_name = decl.getName(); // Nothing to do for unnamed parameters. @@ -156,7 +149,7 @@ else if (original_name.startswith(kBlinkFieldPrefix)) original_name = original_name.substr(strlen(kBlinkFieldPrefix)); - if (IsProbablyConst(decl)) { + if (IsProbablyConst(decl, context)) { // Don't try to rename constants that already conform to Chrome style. if (original_name.size() >= 2 && original_name[0] == 'k' && clang::isUppercase(original_name[1])) @@ -224,7 +217,8 @@ void run(const MatchFinder::MatchResult& result) override { std::string name; const DeclNode* decl = result.Nodes.getNodeAs<DeclNode>("decl"); - if (!GetNameForDecl(*decl, name)) + clang::ASTContext* context = result.Context; + if (!GetNameForDecl(*decl, *context, name)) return; auto r = replacements_->emplace( *result.SourceManager, TargetNodeTraits<TargetNode>::GetRange(
diff --git a/tools/clang/rewrite_to_chrome_style/tests/constants-expected.cc b/tools/clang/rewrite_to_chrome_style/tests/constants-expected.cc index 0d02e9b..e6b233bab 100644 --- a/tools/clang/rewrite_to_chrome_style/tests/constants-expected.cc +++ b/tools/clang/rewrite_to_chrome_style/tests/constants-expected.cc
@@ -25,6 +25,19 @@ // Not a constant even though it has static storage duration. static const char* current_event_; + + static int Function(); + + static void FunctionWithConstant() { + const int kFunctionConstant = 4; + const int kFunctionConstantFromExpression = 4 + 6; + const int kFunctionConstantFromOtherConsts = + kFunctionConstant + kFunctionConstantFromExpression; + const int kShouldBeRenamedToAConst = 9 - 2; + const int kShouldAlsoBeRenamedToAConst = + kFunctionConstant + kFunctionConstantFromOtherConsts; + const int not_compile_time_const = kFunctionConstant + Function(); + } }; void F() {
diff --git a/tools/clang/rewrite_to_chrome_style/tests/constants-original.cc b/tools/clang/rewrite_to_chrome_style/tests/constants-original.cc index e9e21126..96d974d 100644 --- a/tools/clang/rewrite_to_chrome_style/tests/constants-original.cc +++ b/tools/clang/rewrite_to_chrome_style/tests/constants-original.cc
@@ -25,6 +25,19 @@ // Not a constant even though it has static storage duration. static const char* m_currentEvent; + + static int Function(); + + static void FunctionWithConstant() { + const int kFunctionConstant = 4; + const int kFunctionConstantFromExpression = 4 + 6; + const int kFunctionConstantFromOtherConsts = + kFunctionConstant + kFunctionConstantFromExpression; + const int should_be_renamed_to_a_const = 9 - 2; + const int should_also_be_renamed_to_a_const = + kFunctionConstant + kFunctionConstantFromOtherConsts; + const int not_compile_time_const = kFunctionConstant + Function(); + } }; void F() {
diff --git a/tools/md_browser/md_browser.py b/tools/md_browser/md_browser.py index 6473eca9..5ee2fa2 100644 --- a/tools/md_browser/md_browser.py +++ b/tools/md_browser/md_browser.py
@@ -30,6 +30,7 @@ try: s = Server(args.port, SRC_DIR) print("Listening on http://localhost:%s/" % args.port) + print(" Try loading http://localhost:%s/docs/README.md" % args.port) s.serve_forever() s.shutdown() return 0 @@ -96,6 +97,8 @@ self._DoNotFound() elif path.lower().endswith('.md'): self._DoMD(path) + elif os.path.exists(full_path + '/README.md'): + self._DoMD(path + '/README.md') else: self._DoUnknown()
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 30d2aac..b5a898b6 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -2811,9 +2811,9 @@ <summary> Records the number of sync events which were fired in a batch. A batch is defined as the set of sync events dispatched at the same time by the - BackgroundSyncManager. Periodic syncs often run in a batch. One-shots - usually run individually (a batch of one), unless the device was offline and - multiple are waiting for the device to go back online. + BackgroundSyncManager. One-shots usually run individually (a batch of one), + unless the device was offline and multiple are waiting for the device to go + back online. </summary> </histogram> @@ -2860,6 +2860,9 @@ <histogram name="BackgroundSync.Event.PeriodicResultPattern" enum="BackgroundSyncResultPattern"> <owner>jkarlin@chromium.org</owner> + <obsolete> + Stopped recording as of 1/2016. + </obsolete> <summary> Records whether a one-shot sync event succeeded or failed and whether the sync event finished in the foreground or background. @@ -2873,6 +2876,9 @@ <histogram name="BackgroundSync.Event.PeriodicStartedInForeground" enum="BooleanInForeground"> <owner>jkarlin@chromium.org</owner> + <obsolete> + Stopped recording as of 1/2016. + </obsolete> <summary> Records whether a periodic sync event started firing in the foreground or background. Called shortly before the event is fired. @@ -2956,6 +2962,9 @@ <histogram name="BackgroundSync.Registration.Periodic" enum="BackgroundSyncStatus"> <owner>iclelland@chromium.org</owner> + <obsolete> + Stopped recording as of 1/2016. + </obsolete> <summary> Records the result of attempting to register a periodic sync. </summary> @@ -2964,6 +2973,9 @@ <histogram name="BackgroundSync.Registration.Periodic.IsDuplicate" enum="BooleanRegistrationIsDuplicate"> <owner>iclelland@chromium.org</owner> + <obsolete> + Stopped recording as of 1/2016. + </obsolete> <summary> Records whether a periodic sync registration exactly duplicates an existing registered sync. @@ -2981,6 +2993,9 @@ <histogram name="BackgroundSync.Unregistration.Periodic" enum="BackgroundSyncStatus"> <owner>iclelland@chromium.org</owner> + <obsolete> + Stopped recording as of 1/2016. + </obsolete> <summary> Records the result of attempting to unregister a periodic sync. </summary> @@ -7696,6 +7711,10 @@ </histogram> <histogram name="DiskBasedCertCache.CertIo" enum="CertificateChainPosition"> + <obsolete> + Deprecated as of 01/2016. CertCacheTrial has been removed. + https://crbug.com/522312 + </obsolete> <owner>brandonsalmon@chromium.org</owner> <summary> Records information about DiskBasedCertCache operations with respect to @@ -7705,6 +7724,10 @@ </histogram> <histogram name="DiskBasedCertCache.CertIoCacheResult" enum="CacheResult"> + <obsolete> + Deprecated as of 01/2016. CertCacheTrial has been removed. + https://crbug.com/522312 + </obsolete> <owner>brandonsalmon@chromium.org</owner> <summary> Records the outcome of requests to retrieve certificates from the disk @@ -7714,6 +7737,10 @@ <histogram name="DiskBasedCertCache.CertIoReadSuccessLeaf" enum="BooleanSuccess"> + <obsolete> + Deprecated as of 01/2016. CertCacheTrial has been removed. + https://crbug.com/522312 + </obsolete> <owner>brandonsalmon@chromium.org</owner> <summary> Whether or not the leaf certificate of a certificate chain was successfuly @@ -7723,6 +7750,10 @@ <histogram name="DiskBasedCertCache.CertIoWriteSuccessLeaf" enum="BooleanSuccess"> + <obsolete> + Deprecated as of 01/2016. CertCacheTrial has been removed. + https://crbug.com/522312 + </obsolete> <owner>brandonsalmon@chromium.org</owner> <summary> Whether or not the leaf certificate of a certificate chain was successfully @@ -7731,6 +7762,10 @@ </histogram> <histogram name="DiskBasedCertCache.ChainReadTime" units="ms"> + <obsolete> + Deprecated as of 01/2016. CertCacheTrial has been removed. + https://crbug.com/522312 + </obsolete> <owner>brandonsalmon@chromium.org</owner> <summary> Measures the wall clock time spent reading a certificate chain. The starting @@ -7740,6 +7775,10 @@ </histogram> <histogram name="DiskBasedCertCache.ChainWriteTime" units="ms"> + <obsolete> + Deprecated as of 01/2016. CertCacheTrial has been removed. + https://crbug.com/522312 + </obsolete> <owner>brandonsalmon@chromium.org</owner> <summary> Measures the wall clock time spent writing a certificate chain to disk. The @@ -19153,6 +19192,13 @@ </summary> </histogram> +<histogram name="Media.InputErrorMac" units="OSStatus"> + <owner>tommi@chromium.org</owner> + <summary> + Error codes that we encounter while setting up an AUAudioInputStream on Mac. + </summary> +</histogram> + <histogram name="Media.InputStreamDuration" units="ms"> <owner>henrika@chromium.org</owner> <summary> @@ -27587,6 +27633,15 @@ </summary> </histogram> +<histogram name="Net.TokenBinding.Support" enum="TokenBinding.Support"> + <owner>nharper@chromium.org</owner> + <summary> + The number of secure HTTP requests broken down by support for Token Binding, + indicating if Token Binding was negotiated and supported by both client and + server, or why it wasn't if not. + </summary> +</histogram> + <histogram name="Net.Transaction_Bandwidth" units="KB/s"> <obsolete> Discontinued as of 4/12/09 @@ -45452,6 +45507,15 @@ </summary> </histogram> +<histogram name="Signin.SignoutDeleteProfile" enum="BooleanDeletedOrNot"> + <owner>skym@chromium.org</owner> + <summary> + If the user chose to delete their profile or not when signing out of an + unmanaged account. When the user is not given a choice this metric is not + recorded. + </summary> +</histogram> + <histogram name="Signin.SignoutProfile" enum="SigninSignoutProfile"> <owner>mlerman@chromium.org</owner> <summary>Track how a profile gets signed out.</summary> @@ -58007,6 +58071,11 @@ <int value="1" label="Deleted"/> </enum> +<enum name="BooleanDeletedOrNot" type="int"> + <int value="0" label="Not deleted"/> + <int value="1" label="Deleted"/> +</enum> + <enum name="BooleanDeprecatedCiphers" type="int"> <int value="0" label="Deprecated ciphers disabled"/> <int value="1" label="Deprecated ciphers enabled"/> @@ -58566,6 +58635,10 @@ </enum> <enum name="CertificateChainPosition" type="int"> + <obsolete> + Deprecated as of 01/2016. CertCacheTrial has been removed. + https://crbug.com/522312 + </obsolete> <int value="0" label="Root Certificate"/> </enum> @@ -65704,6 +65777,24 @@ <int value="1119" label="MediaDevicesEnumerateDevices"/> <int value="1120" label="NonSecureSharedWorkerAccessedFromSecureContext"/> <int value="1121" label="SecureSharedWorkerAccessedFromNonSecureContext"/> + <int value="1122" label="NonCSSStyleSheetType"/> + <int value="1123" label="EventDeepPath"/> + <int value="1124" label="LinkHeaderPreload"/> + <int value="1125" label="MouseWheelEvent"/> + <int value="1126" label="WheelEvent"/> + <int value="1127" label="MouseWheelAndWheelEvent"/> + <int value="1128" label="BodyScrollsInAdditionToViewport"/> + <int value="1129" label="DocumentDesignModeEnabeld"/> + <int value="1130" label="ContentEditableTrue"/> + <int value="1131" label="ContentEditableTrueOnHTML"/> + <int value="1132" label="ContentEditablePlainTextOnly"/> + <int value="1133" label="V8RegExpPrototypeUnicodeGetter"/> + <int value="1134" label="V8IntlV8Parse"/> + <int value="1135" label="V8IntlPattern"/> + <int value="1136" label="V8IntlResolved"/> + <int value="1137" label="V8PromiseChain"/> + <int value="1138" label="V8PromiseAccept"/> + <int value="1139" label="V8PromiseDefer"/> </enum> <enum name="FetchRequestMode" type="int"> @@ -67316,9 +67407,6 @@ CAUSE_FOR_GPU_LAUNCH_JPEGDECODEACCELERATOR_INITIALIZE </int> <int value="13" label="Mojo Setup">CAUSE_FOR_GPU_LAUNCH_MOJO_SETUP</int> - <int value="14" label="Create arc video accelerator"> - CAUSE_FOR_GPU_LAUNCH_ARCVIDEOACCELERATOR - </int> </enum> <enum name="GzipEncodingFixupResult" type="int"> @@ -79752,6 +79840,13 @@ <int value="1" label="Renegotiation patched"/> </enum> +<enum name="TokenBinding.Support" type="int"> + <int value="0" label="DISABLED"/> + <int value="1" label="CLIENT_ONLY"/> + <int value="2" label="CLIENT_AND_SERVER"/> + <int value="3" label="CLIENT_NO_CHANNEL_ID_SERVICE"/> +</enum> + <enum name="TouchEventsState" type="int"> <int value="0" label="Enabled"/> <int value="1" label="Automatic - enabled"/> @@ -81811,6 +81906,10 @@ </histogram_suffixes> <histogram_suffixes name="CertIo" separator=""> + <obsolete> + Deprecated as of 01/2016. CertCacheTrial has been removed. + https://crbug.com/522312 + </obsolete> <suffix name="ReadSuccess" label="success rate of reading a certificate from the disk cache"/> <suffix name="ReadFailure"
diff --git a/tools/perf/benchmarks/memory.py b/tools/perf/benchmarks/memory.py index 0dd9650..c09656c 100644 --- a/tools/perf/benchmarks/memory.py +++ b/tools/perf/benchmarks/memory.py
@@ -9,7 +9,7 @@ from telemetry import benchmark -@benchmark.Enabled('android') +@benchmark.Disabled('all') # crbug.com/581147 class MemoryMobile(perf_benchmark.PerfBenchmark): test = memory.Memory page_set = page_sets.MobileMemoryPageSet
diff --git a/tools/perf/benchmarks/memory_infra.py b/tools/perf/benchmarks/memory_infra.py index 675e0f6..cead2ea 100644 --- a/tools/perf/benchmarks/memory_infra.py +++ b/tools/perf/benchmarks/memory_infra.py
@@ -79,7 +79,7 @@ # TODO(bashi): Workaround for http://crbug.com/532075 # @benchmark.Enabled('android') shouldn't be needed. -@benchmark.Enabled('android') +@benchmark.Disabled('all') # crbug.com/581119 class RendererMemoryBlinkMemoryMobile(_MemoryInfra): """Timeline based benchmark for measuring memory consumption on mobile sites on which blink's memory consumption is relatively high."""
diff --git a/tools/perf/benchmarks/smoothness.py b/tools/perf/benchmarks/smoothness.py index 37c0e0a..3590d5fd 100644 --- a/tools/perf/benchmarks/smoothness.py +++ b/tools/perf/benchmarks/smoothness.py
@@ -187,6 +187,7 @@ return 'smoothness.gpu_rasterization.key_mobile_sites_smooth' +@benchmark.Disabled('yosemite') # crbug.com/581219 class SmoothnessGpuRasterizationToughPathRenderingCases(_Smoothness): """Tests a selection of pages with SVG and 2D canvas paths with GPU rasterization.
diff --git a/tools/perf/scripts_smoke_unittest.py b/tools/perf/scripts_smoke_unittest.py index 503d389..43f683c 100644 --- a/tools/perf/scripts_smoke_unittest.py +++ b/tools/perf/scripts_smoke_unittest.py
@@ -9,6 +9,8 @@ import tempfile import unittest +from telemetry import decorators + class ScriptsSmokeTest(unittest.TestCase): @@ -48,6 +50,7 @@ self.assertEquals(return_code, 0, stdout) self.assertIn('optional arguments:', stdout) + @decorators.Disabled('all') # crbug.com/581103 def testRunRecordWprList(self): return_code, stdout = self.RunPerfScript('record_wpr --list-benchmarks') # TODO(nednguyen): Remove this once we figure out why importing
diff --git a/tools/telemetry/telemetry/__init__.py b/tools/telemetry/telemetry/__init__.py index 2586c257..a77b39e 100644 --- a/tools/telemetry/telemetry/__init__.py +++ b/tools/telemetry/telemetry/__init__.py
@@ -3,6 +3,7 @@ # found in the LICENSE file. """A library for cross-platform browser tests.""" +import logging import os import sys @@ -55,3 +56,8 @@ # Install Telemtry global hooks. global_hooks.InstallHooks() + +logging.warn( + 'Telemetry has moved to Catapult, and will be deleted from Chromium on ' + '2016-01-29. Please use Telemetry from third_party/catapult/telemetry ' + 'instead.')
diff --git a/tools/valgrind/gtest_exclude/ash_unittests.gtest-drmemory.txt b/tools/valgrind/gtest_exclude/ash_unittests.gtest-drmemory.txt deleted file mode 100644 index 901a0f6..0000000 --- a/tools/valgrind/gtest_exclude/ash_unittests.gtest-drmemory.txt +++ /dev/null
@@ -1,2 +0,0 @@ -# ash will be removed on Window soon. http://crbug.com/558054 -*
diff --git a/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory.txt b/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory.txt index e40afa7d..95a0c408 100644 --- a/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory.txt +++ b/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory.txt
@@ -46,10 +46,11 @@ PluginPowerSaverBrowserTest.LargeCrossOriginObscured # https://crbug.com/504885 -# The test takes too long. +# The test takes too long. Excluding with and without PRE_ to crbug.com/581105. SmartSessionRestoreMRUTest.PRE_CorrectLoadingOrder SmartSessionRestoreMRUTest.CorrectLoadingOrder SmartSessionRestoreTest.PRE_CorrectLoadingOrder +SmartSessionRestoreTest.CorrectLoadingOrder # https://crbug.com/516368 PushMessagingBrowserTest.PushEventSuccess @@ -104,9 +105,6 @@ # https://crbug.com/577853 OnStartupSettingsBrowserTest.uiTests -# https://crbug.com/493167 -SmartSessionRestoreTest.PRE_CorrectLoadingOrder - # https://579666 SearchEngineManagerWebUITest.testOpenSearchEngineManager
diff --git a/tools/valgrind/memcheck/suppressions.txt b/tools/valgrind/memcheck/suppressions.txt index 4deeac34..c53e889 100644 --- a/tools/valgrind/memcheck/suppressions.txt +++ b/tools/valgrind/memcheck/suppressions.txt
@@ -3405,3 +3405,55 @@ fun:_ZN2cc10GLRenderer18DrawRenderPassQuadEPNS_14DirectRenderer12DrawingFrameEPKNS_18RenderPassDrawQuadEPKN3gfx5QuadFE fun:_ZN2cc10GLRenderer10DoDrawQuadEPNS_14DirectRenderer12DrawingFrameEPKNS_8DrawQuadEPKN3gfx5QuadFE } +{ + bug_562431_a + Memcheck:Leak + fun:malloc + fun:_ZN3WTF10Partitions10fastMallocEmPKc + fun:_ZN5blink14PersistentBaseINS_15StyleFilterDataELNS_31WeaknessPersistentConfigurationE0ELNS_38CrossThreadnessPersistentConfigurationE0EEnwEm + fun:_ZN5blink26RefCountedGarbageCollectedINS_15StyleFilterDataEE13makeKeepAliveEv + fun:_ZN5blink26RefCountedGarbageCollectedINS_15StyleFilterDataEE3refEv + fun:_ZN3WTF6RefPtrIN5blink15StyleFilterDataEEC2IS2_EERKNS_6RawPtrIT_EEPNSt9enable_ifIXsr3std10is_base_ofIS2_S6_EE5valueEvE4typeE + fun:_ZN5blink7DataRefINS_15StyleFilterDataEE4initEv + fun:_ZN5blink13ComputedStyle18createInitialStyleEv + fun:_ZN5blink13ComputedStyle12initialStyleEv + fun:_ZN5blink13ComputedStyle6createEv + fun:_ZN5blink13StyleResolver16styleForDocumentERNS_8DocumentE + fun:_ZN5blink8Document6attachERKNS_4Node13AttachContextE + fun:_ZN5blink14LocalDOMWindow18installNewDocumentERKN3WTF6StringERKNS_12DocumentInitEb + fun:_ZN5blink14DocumentLoader15createWriterForEPKNS_8DocumentERKNS_12DocumentInitERKN3WTF12AtomicStringESA_bNS_27ParserSynchronizationPolicyE + fun:_ZN5blink14DocumentLoader12ensureWriterERKN3WTF12AtomicStringERKNS_4KURLE + fun:_ZN5blink14DocumentLoader10commitDataEPKcm + fun:_ZN5blink14DocumentLoader15finishedLoadingEd + fun:_ZN5blink14DocumentLoader14maybeLoadEmptyEv + fun:_ZN5blink14DocumentLoader24startLoadingMainResourceEv + fun:_ZN5blink11FrameLoader4initEv + fun:_ZN5blink10LocalFrame4initEv + fun:_ZN5blink17WebLocalFrameImpl19initializeCoreFrameEPNS_9FrameHostEPNS_10FrameOwnerERKN3WTF12AtomicStringES8_ +} +{ + bug_562431_b + Memcheck:Leak + fun:malloc + fun:_ZN3WTF10Partitions10fastMallocEmPKc + fun:_ZN5blink21ContextFeaturesClientnwEm + fun:_ZN5blink21ContextFeaturesClient5emptyEv + fun:_ZN5blink15ContextFeatures13defaultSwitchEv + fun:_ZN5blink8DocumentC2ERKNS_12DocumentInitEh + fun:_ZN5blink12HTMLDocumentC1ERKNS_12DocumentInitEh + fun:_ZN5blink12HTMLDocument6createERKNS_12DocumentInitE + fun:_ZN5blink17DOMImplementation14createDocumentERKN3WTF6StringERKNS_12DocumentInitEb + fun:_ZN5blink14LocalDOMWindow14createDocumentERKN3WTF6StringERKNS_12DocumentInitEb + fun:_ZN5blink14LocalDOMWindow18installNewDocumentERKN3WTF6StringERKNS_12DocumentInitEb + fun:_ZN5blink14DocumentLoader15createWriterForEPKNS_8DocumentERKNS_12DocumentInitERKN3WTF12AtomicStringESA_bNS_27ParserSynchronizationPolicyE + fun:_ZN5blink14DocumentLoader12ensureWriterERKN3WTF12AtomicStringERKNS_4KURLE + fun:_ZN5blink14DocumentLoader10commitDataEPKcm + fun:_ZN5blink14DocumentLoader15finishedLoadingEd + fun:_ZN5blink14DocumentLoader14maybeLoadEmptyEv + fun:_ZN5blink14DocumentLoader24startLoadingMainResourceEv + fun:_ZN5blink11FrameLoader4initEv + fun:_ZN5blink10LocalFrame4initEv + fun:_ZN5blink17WebLocalFrameImpl19initializeCoreFrameEPNS_9FrameHostEPNS_10FrameOwnerERKN3WTF12AtomicStringES8_ + fun:_ZN5blink11WebViewImpl12setMainFrameEPNS_8WebFrameE + fun:_ZN10extensions14ScopedWebFrameC1Ev +}
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn index 85a4e92..bf13e75 100644 --- a/ui/android/BUILD.gn +++ b/ui/android/BUILD.gn
@@ -150,6 +150,17 @@ ] } +# GYP: //ui/android/ui_android.gyp:ui_junit_tests +junit_binary("ui_junit_tests") { + java_files = + [ "junit/src/org/chromium/ui/picker/DateDialogNormalizerTest.java" ] + deps = [ + "//base:base_java", + "//base:base_junit_test_support", + "//ui/android:ui_java", + ] +} + test("ui_android_unittests") { sources = [ "overscroll_refresh_unittest.cc",
diff --git a/ui/android/java/src/org/chromium/ui/picker/DateDialogNormalizer.java b/ui/android/java/src/org/chromium/ui/picker/DateDialogNormalizer.java index 5f00124..2faa6d6 100644 --- a/ui/android/java/src/org/chromium/ui/picker/DateDialogNormalizer.java +++ b/ui/android/java/src/org/chromium/ui/picker/DateDialogNormalizer.java
@@ -4,92 +4,125 @@ package org.chromium.ui.picker; +import android.os.Build; import android.widget.DatePicker; import android.widget.DatePicker.OnDateChangedListener; -import org.chromium.base.VisibleForTesting; - import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; import java.util.TimeZone; /** - * Normalize a date dialog so that it respect min and max. + * Sets the current, min, and max values on the given DatePicker. */ public class DateDialogNormalizer { - @VisibleForTesting - static void setLimits(DatePicker picker, long minMillis, long maxMillis) { - // DatePicker intervals are non inclusive, the DatePicker will throw an - // exception when setting the min/max attribute to the current date - // so make sure this never happens - if (maxMillis <= minMillis) { - return; + + /** + * Stores a date (year-month-day) and the number of milliseconds corresponding to that date + * according to the DatePicker's calendar. + */ + private static class DateAndMillis { + /** + * Number of milliseconds from the epoch (1970-01-01) to the beginning of year-month-day + * in the default time zone (TimeZone.getDefault()) using the Julian/Gregorian split + * calendar. This value is interopable with {@link DatePicker#getMinDate} and + * {@link DatePicker#setMinDate}. + */ + public final long millisForPicker; + + public final int year; + public final int month; // 0-based + public final int day; + + DateAndMillis(long millisForPicker, int year, int month, int day) { + this.millisForPicker = millisForPicker; + this.year = year; + this.month = month; + this.day = day; } - Calendar minCal = trimToDate(minMillis); - Calendar maxCal = trimToDate(maxMillis); - int currentYear = picker.getYear(); - int currentMonth = picker.getMonth(); - int currentDayOfMonth = picker.getDayOfMonth(); - TimeZone timeZone = TimeZone.getDefault(); - picker.updateDate(maxCal.get(Calendar.YEAR), - maxCal.get(Calendar.MONTH), - maxCal.get(Calendar.DAY_OF_MONTH)); - // setMinDate() requires milliseconds since 1970-01-01 00:00 in the - // default time zone, and minCal.getTimeInMillis() represents - // millisecnods since 1970-01-01 00:00 UTC. We need to adjust it. - picker.setMinDate(minCal.getTimeInMillis() - timeZone.getOffset(minCal.getTimeInMillis())); - picker.updateDate(minCal.get(Calendar.YEAR), - minCal.get(Calendar.MONTH), - minCal.get(Calendar.DAY_OF_MONTH)); - // setMaxDate() requires milliseconds since 1970-01-01 00:00 in the - // default time zone, and maxCal.getTimeInMillis() represents - // millisecnods since 1970-01-01 00:00 UTC. We need to adjust it. - picker.setMaxDate(maxCal.getTimeInMillis() - timeZone.getOffset(maxCal.getTimeInMillis())); + static DateAndMillis create(long millisUtc) { + // millisUtc uses the Gregorian calendar only, so disable the Julian changeover date. + GregorianCalendar utcCal = new GregorianCalendar(TimeZone.getTimeZone("UTC")); + utcCal.setGregorianChange(new Date(Long.MIN_VALUE)); + utcCal.setTimeInMillis(millisUtc); + int year = utcCal.get(Calendar.YEAR); + int month = utcCal.get(Calendar.MONTH); + int day = utcCal.get(Calendar.DAY_OF_MONTH); + return create(year, month, day); + } - // Restore the current date, only if within the accepted range - // This will keep the min/max settings - // previously set into account. - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - cal.clear(); - cal.set(currentYear, currentMonth, currentDayOfMonth); - if (cal.getTimeInMillis() > minCal.getTimeInMillis() - && cal.getTimeInMillis() < maxCal.getTimeInMillis()) { - picker.updateDate(currentYear, currentMonth, currentDayOfMonth); + static DateAndMillis create(int year, int month, int day) { + // By contrast, millisForPicker uses the default Gregorian/Julian changeover date. + Calendar defaultTimeZoneCal = Calendar.getInstance(TimeZone.getDefault()); + defaultTimeZoneCal.clear(); + defaultTimeZoneCal.set(year, month, day); + long millisForPicker = defaultTimeZoneCal.getTimeInMillis(); + return new DateAndMillis(millisForPicker, year, month, day); } } - @VisibleForTesting - static Calendar trimToDate(long time) { - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - cal.clear(); - cal.setTimeInMillis(time); - Calendar result = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - result.clear(); - result.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), - 0, 0, 0); - return result; + private static void setLimits(DatePicker picker, long currentMillisForPicker, + long minMillisForPicker, long maxMillisForPicker) { + // On Lollipop only (not KitKat or Marshmallow), DatePicker has terrible performance for + // large date ranges. This causes problems when the min or max date isn't set in HTML, in + // which case these values default to the min and max possible values for the JavaScript + // Date object (1CE and 275760CE). As a workaround, limit the date range to 5000 years + // before and after the current date. In practice, this doesn't limit users since scrolling + // through 5000 years in the DatePicker is highly impractical anyway. See + // http://crbug.com/441060 + if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP + || Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP_MR1) { + final long maxRangeMillis = 5000L * 365 * 24 * 60 * 60 * 1000; + minMillisForPicker = Math.max(minMillisForPicker, + currentMillisForPicker - maxRangeMillis); + maxMillisForPicker = Math.min(maxMillisForPicker, + currentMillisForPicker + maxRangeMillis); + } + + // On KitKat and earlier, DatePicker requires the minDate is always less than maxDate, even + // during the process of setting those values (eek), so set them in an order that preserves + // this invariant throughout. + if (minMillisForPicker > picker.getMaxDate()) { + picker.setMaxDate(maxMillisForPicker); + picker.setMinDate(minMillisForPicker); + } else { + picker.setMinDate(minMillisForPicker); + picker.setMaxDate(maxMillisForPicker); + } } /** - * Normalizes an existing DateDialogPicker changing the default date if - * needed to comply with the {@code min} and {@code max} attributes. + * Sets the current, min, and max values on the given DatePicker and ensures that + * min <= current <= max, adjusting current and max if needed. + * + * @param year The current year to set. + * @param month The current month to set. 0-based. + * @param day The current day to set. + * @param minMillisUtc The minimum allowed date, in milliseconds from the epoch according to a + * proleptic Gregorian calendar (no Julian switch). + * @param maxMillisUtc The maximum allowed date, in milliseconds from the epoch according to a + * proleptic Gregorian calendar (no Julian switch). */ - public static void normalize(DatePicker picker, OnDateChangedListener listener, - int year, int month, int day, int hour, int minute, long minMillis, long maxMillis) { - Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - calendar.clear(); - calendar.set(year, month, day, hour, minute, 0); - if (calendar.getTimeInMillis() < minMillis) { - calendar.clear(); - calendar.setTimeInMillis(minMillis); - } else if (calendar.getTimeInMillis() > maxMillis) { - calendar.clear(); - calendar.setTimeInMillis(maxMillis); - } - picker.init( - calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), - calendar.get(Calendar.DAY_OF_MONTH), listener); + public static void normalize(DatePicker picker, final OnDateChangedListener listener, + int year, int month, int day, long minMillisUtc, long maxMillisUtc) { + DateAndMillis currentDate = DateAndMillis.create(year, month, day); + DateAndMillis minDate = DateAndMillis.create(minMillisUtc); + DateAndMillis maxDate = DateAndMillis.create(maxMillisUtc); - setLimits(picker, minMillis, maxMillis); + // Ensure min <= current <= max, adjusting current and max if needed. + if (maxDate.millisForPicker < minDate.millisForPicker) { + maxDate = minDate; + } + if (currentDate.millisForPicker < minDate.millisForPicker) { + currentDate = minDate; + } else if (currentDate.millisForPicker > maxDate.millisForPicker) { + currentDate = maxDate; + } + + setLimits(picker, currentDate.millisForPicker, minDate.millisForPicker, + maxDate.millisForPicker); + picker.init(currentDate.year, currentDate.month, currentDate.day, listener); } }
diff --git a/ui/android/java/src/org/chromium/ui/picker/DateTimePickerDialog.java b/ui/android/java/src/org/chromium/ui/picker/DateTimePickerDialog.java index cd1b884..77a100a 100644 --- a/ui/android/java/src/org/chromium/ui/picker/DateTimePickerDialog.java +++ b/ui/android/java/src/org/chromium/ui/picker/DateTimePickerDialog.java
@@ -88,7 +88,7 @@ setView(view); mDatePicker = (DatePicker) view.findViewById(R.id.date_picker); DateDialogNormalizer.normalize(mDatePicker, this, - year, monthOfYear, dayOfMonth, hourOfDay, minute, mMinTimeMillis, mMaxTimeMillis); + year, monthOfYear, dayOfMonth, mMinTimeMillis, mMaxTimeMillis); mTimePicker = (TimePicker) view.findViewById(R.id.time_picker); mTimePicker.setIs24HourView(is24HourView);
diff --git a/ui/android/java/src/org/chromium/ui/picker/InputDialogContainer.java b/ui/android/java/src/org/chromium/ui/picker/InputDialogContainer.java index b79b198c..704c5e0 100644 --- a/ui/android/java/src/org/chromium/ui/picker/InputDialogContainer.java +++ b/ui/android/java/src/org/chromium/ui/picker/InputDialogContainer.java
@@ -205,7 +205,6 @@ year, month, monthDay); DateDialogNormalizer.normalize(dialog.getDatePicker(), dialog, year, month, monthDay, - 0, 0, (long) min, (long) max); dialog.setTitle(mContext.getText(R.string.date_picker_dialog_title));
diff --git a/ui/android/javatests/src/org/chromium/ui/picker/DateDialogNormalizerTest.java b/ui/android/javatests/src/org/chromium/ui/picker/DateDialogNormalizerTest.java deleted file mode 100644 index 22aeb0f..0000000 --- a/ui/android/javatests/src/org/chromium/ui/picker/DateDialogNormalizerTest.java +++ /dev/null
@@ -1,82 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.ui.picker; - -import android.test.InstrumentationTestCase; -import android.test.suitebuilder.annotation.SmallTest; -import android.widget.DatePicker; - -import java.util.Calendar; -import java.util.TimeZone; - -/** - * Tests methods in DateDialogNormalizer. - */ -public class DateDialogNormalizerTest extends InstrumentationTestCase { - @SmallTest - public void testTrimToDate() { - Calendar cal = DateDialogNormalizer.trimToDate(1501542000000L); - assertEquals(2017, cal.get(Calendar.YEAR)); - assertEquals(6, cal.get(Calendar.MONTH)); // getMonth returns a 0 based range - assertEquals(31, cal.get(Calendar.DAY_OF_MONTH)); - assertEquals(0, cal.get(Calendar.HOUR)); - assertEquals(0, cal.get(Calendar.MINUTE)); - assertEquals(0, cal.get(Calendar.SECOND)); - - cal = DateDialogNormalizer.trimToDate(1501542002365L); - assertEquals(2017, cal.get(Calendar.YEAR)); - assertEquals(6, cal.get(Calendar.MONTH)); - assertEquals(31, cal.get(Calendar.DAY_OF_MONTH)); - assertEquals(0, cal.get(Calendar.HOUR)); - assertEquals(0, cal.get(Calendar.MINUTE)); - assertEquals(0, cal.get(Calendar.SECOND)); - } - - @SmallTest - public void testSetLimits() { - DatePicker picker = new DatePicker(getInstrumentation().getContext()); - picker.updateDate(2015, 5, 25); - - // if min && max are the same does nothing - DateDialogNormalizer.setLimits(picker, 5, 5); - assertEquals(2015, picker.getYear()); - assertEquals(5, picker.getMonth()); - assertEquals(25, picker.getDayOfMonth()); - - // min > max does nothing - DateDialogNormalizer.setLimits(picker, 6, 5); - assertEquals(2015, picker.getYear()); - assertEquals(5, picker.getMonth()); - assertEquals(25, picker.getDayOfMonth()); - - // If the picker date is not within range it is not respected - // July 31 2017 to July 31 2018 - DateDialogNormalizer.setLimits(picker, 1501542000000L, 1533078000000L); - assertEquals(2017, picker.getYear()); - assertEquals(6, picker.getMonth()); // getMonth returns a 0 based range - assertEquals(31, picker.getDayOfMonth()); - - picker.updateDate(2015, 5, 25); - - TimeZone defaultTimeZone = TimeZone.getDefault(); - // "Japan" timezone: earlier than UTC by 9 hours, no DST. - TimeZone.setDefault(TimeZone.getTimeZone("Japan")); - - // Same thing if it's not respected because it's in the future of the range - // July 31 2012 to July 31 2014 - DateDialogNormalizer.setLimits(picker, 1343775600000L, 1406847600000L); - assertEquals(2012, picker.getYear()); - assertEquals(6, picker.getMonth()); - assertEquals(31, picker.getDayOfMonth()); - - // MinDate and MaxDate should be translated to the defalut time zone. - final long millisPerHour = 60 * 60 * 1000; - // 1343692800000: July 31 2012 00:00 UTC - assertEquals(1343692800000L - 9 * millisPerHour, picker.getMinDate()); - // 1406764800000: July 31 2014 00:00 UTC - assertEquals(1406764800000L - 9 * millisPerHour, picker.getMaxDate()); - TimeZone.setDefault(defaultTimeZone); - } -}
diff --git a/ui/android/junit/src/org/chromium/ui/picker/DateDialogNormalizerTest.java b/ui/android/junit/src/org/chromium/ui/picker/DateDialogNormalizerTest.java new file mode 100644 index 0000000..7f62480 --- /dev/null +++ b/ui/android/junit/src/org/chromium/ui/picker/DateDialogNormalizerTest.java
@@ -0,0 +1,159 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.ui.picker; + +import static org.junit.Assert.assertEquals; + +import android.app.Activity; +import android.widget.DatePicker; + +import org.chromium.testing.local.LocalRobolectricTestRunner; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.Robolectric; +import org.robolectric.annotation.Config; + +import java.util.TimeZone; + +/** + * Tests for DateDialogNormalizer. + */ +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class DateDialogNormalizerTest { + + private static final long MILLIS_PER_MINUTE = 60 * 1000; + private static final long MILLIS_PER_HOUR = 60 * 60 * 1000; + private static final long PST_OFFSET_MILLIS = 8 * MILLIS_PER_HOUR; + private static final long JAPAN_OFFSET_MILLIS = -9 * MILLIS_PER_HOUR; + + private static final TimeZone GMT_TIME_ZONE = TimeZone.getTimeZone("GMT"); + private static final TimeZone PST_TIME_ZONE = TimeZone.getTimeZone("GMT-08"); + private static final TimeZone JAPAN_TIME_ZONE = TimeZone.getTimeZone("Japan"); // GMT+09 + + // Times are milliseconds since the epoch. The time zone is GMT, unless marked as PST or Japan. + // The time of day is midnight unless marked otherwise. The calendar is Gregorian, unless + // marked with _JULIAN, which indicates a hybrid Julian/Gregorian calendar. + private static final long JULY_31_2012 = 1343692800000L; + private static final long JULY_31_2012_PST = JULY_31_2012 + PST_OFFSET_MILLIS; + private static final long JULY_31_2012_JAPAN = JULY_31_2012 + JAPAN_OFFSET_MILLIS; + private static final long JULY_31_2014 = 1406764800000L; + private static final long JULY_31_2014_1201AM = JULY_31_2014 + 1 * MILLIS_PER_MINUTE; + private static final long JULY_31_2014_9PM = JULY_31_2014 + 21 * MILLIS_PER_HOUR; + private static final long JULY_31_2014_PST = JULY_31_2014 + PST_OFFSET_MILLIS; + private static final long JULY_31_2014_JAPAN = JULY_31_2014 + JAPAN_OFFSET_MILLIS; + private static final long JULY_31_2017 = 1501459200000L; + private static final long JULY_31_2017_PST = JULY_31_2017 + PST_OFFSET_MILLIS; + private static final long JULY_31_2017_JAPAN = JULY_31_2017 + JAPAN_OFFSET_MILLIS; + private static final long JULY_31_2017_5AM = JULY_31_2017 + 5 * MILLIS_PER_HOUR; + private static final long JULY_31_2017_1159PM = JULY_31_2017 + 23 * MILLIS_PER_HOUR + + 59 * MILLIS_PER_MINUTE; + private static final long JULY_31_2018 = 1532995200000L; + private static final long JULY_31_2018_PST = JULY_31_2018 + PST_OFFSET_MILLIS; + + private static final long JANUARY_1_0476 = -47146060800000L; + private static final long JANUARY_1_0476_JULIAN = -47145974400000L; + private static final long AUGUST_2_1580 = -12288758400000L; + private static final long AUGUST_2_1580_JULIAN = -12287894400000L; + private static final long MARCH_15_3456 = 46899993600000L; + private static final long DECEMBER_31_5000 = 95649033600000L; + + private Activity mActivity; + + @Before + public void setUp() { + mActivity = Robolectric.buildActivity(Activity.class).setup().get(); + } + + /** + * Asserts that after the input* params are passed to DateDialogNormalize.normalize(), that + * the DatePicker's state matches the output* params. + */ + private void run(TimeZone defaultTimeZone, + int inputYear, int inputMonth, int inputDay, long inputMinMillis, long inputMaxMillis, + int outputYear, int outputMonth, int outputDay, long outputMinMillis, + long outputMaxMillis) { + TimeZone.setDefault(defaultTimeZone); + DatePicker picker = new DatePicker(mActivity); + DateDialogNormalizer.normalize(picker, null, inputYear, inputMonth, inputDay, + inputMinMillis, inputMaxMillis); + + String pickerDate = String.format("%04d-%02d-%02d", picker.getYear(), picker.getMonth() + 1, + picker.getDayOfMonth()); + String expectedDate = String.format("%04d-%02d-%02d", outputYear, outputMonth + 1, + outputDay); + assertEquals(expectedDate, pickerDate); + assertEquals(outputMinMillis, picker.getMinDate()); + assertEquals(outputMaxMillis, picker.getMaxDate()); + } + + @Test + public void testNormalize() { + TimeZone originalDefaultTimeZone = TimeZone.getDefault(); + + // Typical case: value is between min and max. + run(GMT_TIME_ZONE, + 2015, 5, 25, JULY_31_2012, JULY_31_2017, + 2015, 5, 25, JULY_31_2012, JULY_31_2017); + run(PST_TIME_ZONE, + 2015, 5, 25, JULY_31_2012, JULY_31_2017, + 2015, 5, 25, JULY_31_2012_PST, JULY_31_2017_PST); + + // Hours/minutes/seconds on min and max dates should be truncated. + run(PST_TIME_ZONE, + 2015, 5, 25, JULY_31_2014_1201AM, JULY_31_2017_1159PM, + 2015, 5, 25, JULY_31_2014_PST, JULY_31_2017_PST); + run(JAPAN_TIME_ZONE, + 2015, 5, 25, JULY_31_2014_9PM, JULY_31_2017_5AM, + 2015, 5, 25, JULY_31_2014_JAPAN, JULY_31_2017_JAPAN); + + // If max < min, then max should be changed to min. + run(PST_TIME_ZONE, + 2015, 5, 25, JULY_31_2017, JULY_31_2012, + 2017, 6, 31, JULY_31_2017_PST, JULY_31_2017_PST); + + // If the picker date is before min, it should be changed to min. + run(PST_TIME_ZONE, + 2015, 5, 25, JULY_31_2017, JULY_31_2018, + 2017, 6, 31, JULY_31_2017_PST, JULY_31_2018_PST); + + // If the picker date is after max, it should be changed to max. + run(PST_TIME_ZONE, + 2025, 5, 25, JULY_31_2017, JULY_31_2018, + 2018, 6, 31, JULY_31_2017_PST, JULY_31_2018_PST); + run(JAPAN_TIME_ZONE, + 2025, 5, 25, JULY_31_2012, JULY_31_2014, + 2014, 6, 31, JULY_31_2012_JAPAN, JULY_31_2014_JAPAN); + + // Ensure that dates before the Julian/Gregorian changeover in 1582 are treated correctly, + // as proleptic Gregorian dates, not as Julian dates. + run(GMT_TIME_ZONE, + 1581, 3, 4, AUGUST_2_1580, MARCH_15_3456, + 1581, 3, 4, AUGUST_2_1580_JULIAN, MARCH_15_3456); + + // Ensure time ranges in the distant past and future work correctly. + run(GMT_TIME_ZONE, + 1215, 5, 15, JANUARY_1_0476, AUGUST_2_1580, + 1215, 5, 15, JANUARY_1_0476_JULIAN, AUGUST_2_1580_JULIAN); + run(GMT_TIME_ZONE, + 1608, 3, 10, JANUARY_1_0476, AUGUST_2_1580, + 1580, 7, 2, JANUARY_1_0476_JULIAN, AUGUST_2_1580_JULIAN); + run(GMT_TIME_ZONE, + 14, 7, 19, JANUARY_1_0476, AUGUST_2_1580, + 476, 0, 1, JANUARY_1_0476_JULIAN, AUGUST_2_1580_JULIAN); + run(GMT_TIME_ZONE, + 4444, 3, 4, MARCH_15_3456, DECEMBER_31_5000, + 4444, 3, 4, MARCH_15_3456, DECEMBER_31_5000); + run(GMT_TIME_ZONE, + 2001, 3, 4, MARCH_15_3456, DECEMBER_31_5000, + 3456, 2, 15, MARCH_15_3456, DECEMBER_31_5000); + run(GMT_TIME_ZONE, + 10001, 3, 4, MARCH_15_3456, DECEMBER_31_5000, + 5000, 11, 31, MARCH_15_3456, DECEMBER_31_5000); + + TimeZone.setDefault(originalDefaultTimeZone); + } +}
diff --git a/ui/android/ui_android.gyp b/ui/android/ui_android.gyp index b1d2857a..081d0d0e 100644 --- a/ui/android/ui_android.gyp +++ b/ui/android/ui_android.gyp
@@ -167,6 +167,26 @@ ], }, { + # GN: //ui/android:ui_junit_tests + 'target_name': 'ui_junit_tests', + 'type': 'none', + 'dependencies': [ + 'ui_java', + '../../base/base.gyp:base', + '../../base/base.gyp:base_junit_test_support', + '../../testing/android/junit/junit_test.gyp:junit_test_support', + ], + 'variables': { + 'main_class': 'org.chromium.testing.local.JunitTestMain', + 'src_paths': [ + 'junit/', + ], + }, + 'includes': [ + '../../build/host_jar.gypi', + ], + }, + { # GN version: //ui/android:ui_android_unittests 'target_name': 'ui_android_unittests', 'type': '<(gtest_target_type)',
diff --git a/ui/chromeos/network/network_state_notifier.cc b/ui/chromeos/network/network_state_notifier.cc index 6147798a..af5a2b82 100644 --- a/ui/chromeos/network/network_state_notifier.cc +++ b/ui/chromeos/network/network_state_notifier.cc
@@ -103,7 +103,6 @@ NetworkStateNotifier::NetworkStateNotifier(NetworkConnect* network_connect) : network_connect_(network_connect), did_show_out_of_credits_(false), - need_vpn_disconnection_notify_(false), weak_ptr_factory_(this) { if (!NetworkHandler::IsInitialized()) return; @@ -123,6 +122,12 @@ void NetworkStateNotifier::ConnectToNetworkRequested( const std::string& service_path) { + const NetworkState* network = + NetworkHandler::Get()->network_state_handler()->GetNetworkState( + service_path); + if (network && network->type() == shill::kTypeVPN) + connected_vpn_.clear(); + RemoveConnectNotification(); } @@ -152,7 +157,7 @@ NetworkHandler::Get()->network_state_handler()->GetNetworkState( service_path); if (network && network->type() == shill::kTypeVPN) - need_vpn_disconnection_notify_ = false; + connected_vpn_.clear(); } void NetworkStateNotifier::DefaultNetworkChanged(const NetworkState* network) { @@ -191,9 +196,14 @@ } void NetworkStateNotifier::UpdateVpnConnectionState(const NetworkState* vpn) { - if (!vpn->IsConnectedState() && need_vpn_disconnection_notify_) - ShowVpnDisconnectedNotification(vpn); - need_vpn_disconnection_notify_ = vpn->IsConnectedState(); + if (vpn->path() == connected_vpn_) { + if (!vpn->IsConnectedState()) { + ShowVpnDisconnectedNotification(vpn); + connected_vpn_.clear(); + } + } else if (vpn->IsConnectedState()) { + connected_vpn_ = vpn->path(); + } } void NetworkStateNotifier::UpdateCellularOutOfCredits(
diff --git a/ui/chromeos/network/network_state_notifier.h b/ui/chromeos/network/network_state_notifier.h index 2d25fa09..057a7aa 100644 --- a/ui/chromeos/network/network_state_notifier.h +++ b/ui/chromeos/network/network_state_notifier.h
@@ -6,6 +6,7 @@ #define UI_CHROMEOS_NETWORK_NETWORK_STATE_NOTIFIER_H_ #include <set> +#include <string> #include "base/compiler_specific.h" #include "base/macros.h" @@ -108,7 +109,7 @@ bool did_show_out_of_credits_; base::Time out_of_credits_notify_time_; std::set<std::string> cellular_activating_; - bool need_vpn_disconnection_notify_; + std::string connected_vpn_; base::WeakPtrFactory<NetworkStateNotifier> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(NetworkStateNotifier);
diff --git a/ui/events/null_event_targeter.h b/ui/events/null_event_targeter.h index c22e7a7..8d9ea43 100644 --- a/ui/events/null_event_targeter.h +++ b/ui/events/null_event_targeter.h
@@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#ifndef UI_EVENTS_NULL_EVENT_TARGETER_H_ +#define UI_EVENTS_NULL_EVENT_TARGETER_H_ + #include "base/compiler_specific.h" #include "base/macros.h" #include "ui/events/event_targeter.h" @@ -26,3 +29,5 @@ }; } // namespace ui + +#endif // UI_EVENTS_NULL_EVENT_TARGETER_H_
diff --git a/ui/file_manager/audio_player/assets/100/bottom_base_center.png b/ui/file_manager/audio_player/assets/100/bottom_base_center.png deleted file mode 100644 index bb41a0b..0000000 --- a/ui/file_manager/audio_player/assets/100/bottom_base_center.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/bottom_base_left.png b/ui/file_manager/audio_player/assets/100/bottom_base_left.png deleted file mode 100644 index 97305c2..0000000 --- a/ui/file_manager/audio_player/assets/100/bottom_base_left.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/bottom_base_right.png b/ui/file_manager/audio_player/assets/100/bottom_base_right.png deleted file mode 100644 index 52ffe90d..0000000 --- a/ui/file_manager/audio_player/assets/100/bottom_base_right.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_timeline_handler.png b/ui/file_manager/audio_player/assets/100/player_timeline_handler.png deleted file mode 100644 index c59a529..0000000 --- a/ui/file_manager/audio_player/assets/100/player_timeline_handler.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_volume_base_bottom.png b/ui/file_manager/audio_player/assets/100/player_volume_base_bottom.png deleted file mode 100644 index 70dac11..0000000 --- a/ui/file_manager/audio_player/assets/100/player_volume_base_bottom.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_volume_base_center.png b/ui/file_manager/audio_player/assets/100/player_volume_base_center.png deleted file mode 100644 index 0d74ad0..0000000 --- a/ui/file_manager/audio_player/assets/100/player_volume_base_center.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_volume_base_top.png b/ui/file_manager/audio_player/assets/100/player_volume_base_top.png deleted file mode 100644 index 70dac11..0000000 --- a/ui/file_manager/audio_player/assets/100/player_volume_base_top.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_volume_level_bottom.png b/ui/file_manager/audio_player/assets/100/player_volume_level_bottom.png deleted file mode 100644 index aeb0f62e..0000000 --- a/ui/file_manager/audio_player/assets/100/player_volume_level_bottom.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_volume_level_center.png b/ui/file_manager/audio_player/assets/100/player_volume_level_center.png deleted file mode 100644 index 7b3b7ef..0000000 --- a/ui/file_manager/audio_player/assets/100/player_volume_level_center.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_volume_level_top.png b/ui/file_manager/audio_player/assets/100/player_volume_level_top.png deleted file mode 100644 index aeb0f62e..0000000 --- a/ui/file_manager/audio_player/assets/100/player_volume_level_top.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/bottom_base_center.png b/ui/file_manager/audio_player/assets/200/bottom_base_center.png deleted file mode 100644 index 4d3e9fd..0000000 --- a/ui/file_manager/audio_player/assets/200/bottom_base_center.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/bottom_base_left.png b/ui/file_manager/audio_player/assets/200/bottom_base_left.png deleted file mode 100644 index 04fc3697..0000000 --- a/ui/file_manager/audio_player/assets/200/bottom_base_left.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/bottom_base_right.png b/ui/file_manager/audio_player/assets/200/bottom_base_right.png deleted file mode 100644 index e351ae1..0000000 --- a/ui/file_manager/audio_player/assets/200/bottom_base_right.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_timeline_handler.png b/ui/file_manager/audio_player/assets/200/player_timeline_handler.png deleted file mode 100644 index 8a54c4b..0000000 --- a/ui/file_manager/audio_player/assets/200/player_timeline_handler.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_volume_base_bottom.png b/ui/file_manager/audio_player/assets/200/player_volume_base_bottom.png deleted file mode 100644 index beaa8aa..0000000 --- a/ui/file_manager/audio_player/assets/200/player_volume_base_bottom.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_volume_base_center.png b/ui/file_manager/audio_player/assets/200/player_volume_base_center.png deleted file mode 100644 index d4ed370..0000000 --- a/ui/file_manager/audio_player/assets/200/player_volume_base_center.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_volume_base_top.png b/ui/file_manager/audio_player/assets/200/player_volume_base_top.png deleted file mode 100644 index c6b68c2..0000000 --- a/ui/file_manager/audio_player/assets/200/player_volume_base_top.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_volume_level_bottom.png b/ui/file_manager/audio_player/assets/200/player_volume_level_bottom.png deleted file mode 100644 index b4707bd..0000000 --- a/ui/file_manager/audio_player/assets/200/player_volume_level_bottom.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_volume_level_center.png b/ui/file_manager/audio_player/assets/200/player_volume_level_center.png deleted file mode 100644 index 1a1143b..0000000 --- a/ui/file_manager/audio_player/assets/200/player_volume_level_center.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_volume_level_top.png b/ui/file_manager/audio_player/assets/200/player_volume_level_top.png deleted file mode 100644 index 261037a0..0000000 --- a/ui/file_manager/audio_player/assets/200/player_volume_level_top.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/css/common.css b/ui/file_manager/file_manager/foreground/css/common.css index 868fa94..6b146732 100644 --- a/ui/file_manager/file_manager/foreground/css/common.css +++ b/ui/file_manager/file_manager/foreground/css/common.css
@@ -7,114 +7,6 @@ display: none !important; } -/* This file contains "borrowed" copy of standard styles. To simplify merging, - * when altering, please preserve original property value by adding comments. */ -input.common[type='checkbox'], -input.common[type='radio'] { - -webkit-appearance: none; - border: 1px solid #555; - border-radius: 1px; - box-sizing: border-box; - cursor: default; - height: 13px; - margin: 0; - opacity: 0.4; - width: 13px; -} - -input.common[type='checkbox']:hover, -input.common[type='checkbox']:checked, -input.common[type='radio']:hover, -input.common[type='radio']:checked { - opacity: 1; -} - -input.common[type='checkbox'] { - position: relative; -} - -input.common[type='checkbox']:checked::after { - background-image: -webkit-image-set( - url(../images/common/check_no_box.png) 1x, - url(../images/common/2x/check_no_box.png) 2x); - background-position: -3px -4px; - background-repeat: no-repeat; -} - -input.common[type='checkbox'].white { - border: none; -} - -input.common[type='checkbox'].white:not(:checked)::after { - background-image: -webkit-image-set( - url(../images/common/checkbox_white_unchecked.png) 1x, - url(../images/common/2x/checkbox_white_unchecked.png) 2x); - background-position: -1px 0; -} - -input.common[type='checkbox'].white:checked::after { - background-image: -webkit-image-set( - url(../images/common/checkbox_white_checked.png) 1x, - url(../images/common/2x/checkbox_white_checked.png) 2x); - background-position: -1px 0; -} - -input.common[type='checkbox']::after { - content: ''; - display: flex; - height: 15px; - left: -2px; - position: absolute; - top: -2px; - width: 17px; -} - -.bubble { - background: #FFF; - border-radius: 2px; - cursor: default; - outline: 1px solid rgba(0, 0, 0, 0.2); - padding: 16px; -} - -.bubble .pointer { - background: -webkit-image-set( - url(../images/common/bubble_point_white.png) 1x, - url(../images/common/2x/bubble_point_white.png) 2x); - display: block; - height: 11px; - left: 24px; - margin: 0 0 0 -5px; - outline: none; - position: absolute; - width: 17px; -} - -.bubble .pointer:not(.bottom) { - top: -11px; -} - -.bubble .pointer.bottom { - -webkit-transform: rotate(180deg); - bottom: -11px; -} - -.bubble .close-x { - background: -webkit-image-set( - url(../images/common/close_x_gray.png) 1x, - url(../images/common/2x/close_x_gray.png) 2x); - height: 21px; - opacity: 0.3; - position: absolute; - right: 3px; - top: 3px; - width: 21px; -} - -.bubble .close-x:hover { - opacity: 0.7; -} - /* "chrome-menu" class overrides some standard menu.css styles, to make custom menus in FileBrowser look like native ChromeOS menus. */
diff --git a/ui/file_manager/file_manager/foreground/images/common/2x/checkbox_white_checked.png b/ui/file_manager/file_manager/foreground/images/common/2x/checkbox_white_checked.png deleted file mode 100644 index 466fa22..0000000 --- a/ui/file_manager/file_manager/foreground/images/common/2x/checkbox_white_checked.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/common/2x/checkbox_white_unchecked.png b/ui/file_manager/file_manager/foreground/images/common/2x/checkbox_white_unchecked.png deleted file mode 100644 index 88d97d7..0000000 --- a/ui/file_manager/file_manager/foreground/images/common/2x/checkbox_white_unchecked.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/common/2x/disclosure_arrow_dk_grey.png b/ui/file_manager/file_manager/foreground/images/common/2x/disclosure_arrow_dk_grey.png deleted file mode 100644 index 8f353196..0000000 --- a/ui/file_manager/file_manager/foreground/images/common/2x/disclosure_arrow_dk_grey.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/common/checkbox_white_checked.png b/ui/file_manager/file_manager/foreground/images/common/checkbox_white_checked.png deleted file mode 100644 index b24de30..0000000 --- a/ui/file_manager/file_manager/foreground/images/common/checkbox_white_checked.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/common/checkbox_white_unchecked.png b/ui/file_manager/file_manager/foreground/images/common/checkbox_white_unchecked.png deleted file mode 100644 index c92eaaa..0000000 --- a/ui/file_manager/file_manager/foreground/images/common/checkbox_white_unchecked.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/common/disclosure_arrow_dk_grey.png b/ui/file_manager/file_manager/foreground/images/common/disclosure_arrow_dk_grey.png deleted file mode 100644 index dd2f925b..0000000 --- a/ui/file_manager/file_manager/foreground/images/common/disclosure_arrow_dk_grey.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/common/spinner.svg b/ui/file_manager/file_manager/foreground/images/common/spinner.svg deleted file mode 100644 index 66b05c38a..0000000 --- a/ui/file_manager/file_manager/foreground/images/common/spinner.svg +++ /dev/null
@@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg viewBox="0 0 32 32" version="1.1" - xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - -<g> - <animateTransform attributeName="transform" type="translate" - values="0 0; -32 0; -64 0; -96 0; -128 0; -160 0; -192 0; -224 0; -256 0; -288 0; -320 0; -352 0; -384 0; -416 0; -448 0; -480 0; -512 0; -544 0; -576 0; -608 0; -640 0; -672 0; -704 0; -736 0; -768 0; -800 0; -832 0; -864 0; -896 0; -928 0; -960 0; -992 0; -1024 0; -1056 0; -1088 0; -1120 0" - dur="1s" calcMode="discrete" repeatCount="indefinite" /> - <image width="1152" height="32" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABIAAAAAgCAYAAABq+wOnAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAQa9JREFUeNrsnQd8FFX+wKduTTaFQAghhBZ6R5oCFkBUBJWTZgHP3u487Hf27p2eXTw8CzZAxIKCgBRBOJVDEAXpoff0um3K//dLXnAz+ybZ3ew87q87Hx5JdmfmO6/+yrz3e3xGRgsuwoOH5IBkgyRnDX8iN6XLpc8JkqM/fGXjdK1M1/X9nK7+xAnCMp6XFsF5FY3ddOuMNjHxIUn4We64D/o6W552B8+Lybqu/KyrgVW6pi2QnOkVkdy0qXzynQ5JgRTsMHFpji2tg86Ltq3kc6Z8SAFIvm43H9BPRf7r+JHkPcojwU/wE/wEP8FP8BP8BD9mPuhGUcNBTzql/GDVcZdoS7qe0/Ucb8HPn+9fMHkHS76/eKdNcmVcIMjuqYBtpVYXfLbzvSHvsOIHyg86IP8X8pJ9JOj63TlBbAs/m6PtoQWrPt332cRbfQWbqyNtf9E+g+ItTuYF4SLQ688C26YX2DgteU5Iwa90XS0B++cY/NwJ9bMJymamnNLW35B+HS1fC1Rm6Jx2MS/IZ/KC1IXj+RaQ/wz4SgRmqa4pe3UtuEFX/SvUQNVimyfH15CeHwO/GfAnAP8M4PerYfNCGhSzDv/KgJ8P9tdPuuJfrqmBL2V3ZnVj9kY0z6Ap3tZQxsCXzoG67w58MFx5d02b07ViKPvjkP8fdTW4QtfUzxqz//A5ouFDuXaCPI6H/J8Fdd8N2kBOyLdB+G432r6a4v8K6uYz0eYpidT2iuQ5IE9DOF0Zz/ES1L/QjeQ99IQCeIaNUAYroF7mCpLzYCz2n8mz8MAfDvyJwD+bF8Q8Mv6FPkAl2N2/6Jp/KZTNPOgnv8Rqf1KeAfnDgD8Fyv9syB/yBQPfD/zNcM438P0cOO+Hptq/oc8B5ToA/rsS8j+K5F80nK7C97vgvK/hnNlwztp42d/4HCh/2l78UVtny35vQ95OJzLI2Ejygb8K+JB/cWUkMliK4BnxnCRIzhCBw6V0ufR5aGTDfq0iIYPnORiQxP7w19XA9kKF/Bse5B/w9+EmCH4qH4+M/rdmuLPPmAvs5FoNwTaAk1zXANsHQmG25it9QkrO3tNExcOUb1BObJ2v3fIydPzJpMNuhXHhWV50oJDUWPBJwoFBP7zsVq3FoLsdsqfNflb5D+VD8kKqhMarNLEDNIlPFJNTlv8EP8FP8BP8BD/BT/CjN/xAPzil+Q+W7WstJWW93O2mfedoqv+Xyr1L7z207M+72fH354iujDtkV/OrQM9FhwPnzh5yS+64OZfu/3zKRkb8u+1pHa8AfurJRpGcPajD5OXF+XNHLrSSr3iLOgqS4x6bp/VEwHho5wiye3zOuTO+3fXBsDnx5qu+km5gzP5FcqZNMuPzvJAOPzpAIZxR84GLGwXt9sq48P1lfYB/u2BzT6p50U5/gEw4B9NgTnbfItpTyzXFuwiMwefAHvmhSfxA+WmCaL8P+BfQ+TzymwO7Odhfg8H+ukHUtTK0vxRfyTO25NZ7m8KH+5zFC9J9YGueE2701xwytMtMHpMg94LRaho6I+C6D8H+e7Kp9p+mVI+B+97Di/ahkEzGH16Gc7rCo3QVRQfYf/qrcN08Leh7SnKm72iK01tXfVPg9n8DO7p7uM8h9EwB62A0JvjrKV31L4bx6iGo/41N4UM7mswLtoeB36lBPscnwTmDeME1CP54ANreal0NPA59c0UT+ROBfz/cu0cjfDuccxqcA4m7HfjfA/9h4C9tSv2j/Ol8zeYHRHvKg42cKkIddIE20gV+vwns/826FngU2u38pspfeIYa+edo3uM1dAA30AY6AL8D/HZNrTMq8CgvOj5oyBEkNFSikHDAa14zpBmELwzK/RqpOydUyJ/hl3xITxMBHlXlN8THIzXvkjPqnD+GSx1Q8VdLya22a4HKf4IQt8fS+Brjhx65F83tX+f8qa0LEQSH4y1oCBuhIfa0mh96gGAelz3q5d2yp80+4H8H/B4s+eRcvKY5NF4PeXt2SvjkHgl+gp/gJ/gJfoL/u+ejA6axdKrzjzMuFG/hTR0vW31TcttRGaz5VUe+k1R/6X1ySu52UKovBoXOA8r8kOT2F7zMgu87sVlWAxUPyylttoEue1ud86fO2AFjYLKVfNSZCX8n8G8Ndf6ctEzcmcOt4uOMI9DdnwUDeivwrzVzvpwE2pLaxTX/VcddWrDqedGR9hPwr2uMb3BIXdis7w2tm8KvmXGj+t4Hw3MjtLsrTZ0/dEMQ2+oUUU5aXr7rs7xY9G/Ie3Nd9c8Dm2ZdTfuPjp8CZXCTLTl7K+TjHzh7KQbHSxbwP4f7fA38kY3YqmHOCLjuGrD/fgH2U9iWouVD2bfRteBXguRaCEb3sOjqkHfCddMkZ9pm4D+Hs9ei5/s7gu32LRrwtc6fqA4RyuxCqLv1UI6v41gaY/5XQzuaXev8iU524UwpqIPl2IZiqX9ss9AGXwD+3FrnT5QPIMiDgb8E+J9iW45F/qLt6kjv1Eq0e+6Jni/2hGf/CMpwJZRlbjzkPy/Z+0bxAHnQdt6DNrQWyiAvWgcQvnXBSksya/ia4ovUs4jOFyhAfR387Bip16sxPh6BykP7GikFWbAl3S4lZ/8XOkHnaLxukfDruaGdzXNMGkJvXpTXQSP4o5X8uiOl49gke3reP3EQJPzBwF/Pih96dLryu+u63rRnR9cb9+7QFO8k1nxybRK5l2Si6DLjn+r8J/gJfoKf4Cf4CX4jyreU1Obs7FPFB4OtJRi+GyRnxgxbaruXWo9+bYGr1SA7K36gdE+2K7Pf16I99XHjUgtetPWwmh8sP5Brb9Z5rWhLfihsqUedgaap1Zbxy/ZDA2hVxzc1XvVA5S4r+KirQ72vA939DtThI7hE9Rfv+CpefDVQ3k9yNfsFDMi/RNlv60rGW7X/6/JY+WAwDxFk189gwF3epP7HCymOjJ7nR80PVp0JxutPvGifEJ3jJewBHFCHd/Gy4/vKA197ouCfI4iOX4A/lmvSUcO/F9rS99HYfzWzfkT7Jl6QRzWRj/bndDmp5bpg5ZEOUfAvhHHmR7TdmsbnBEFyXYdjqeor7hpF/8/hBdtG4vhqWglAG4L63wB9qn808seZ2b8V9IGb4sC/GNryZjVQMTAm+SvYsP+JsXdB+Wwoyx+hTY9sqvzXg751MTiiToe2hI7AMWagMF8GpGYmHV/laqdW+mGQmgYF+zr8jm8BIvCw8jgLBtfF4YD0Y0O+lEj4KCcOLJy2pNtN+x6BXN7X0ACHUwMlR+p/YBA4T3KmNzYlMmI+9+vSLlENVH4OVfQI0CjeTt4Jg/mbuur3QIN80Qo+SXZP3kUdwpUG3lHLD+A0wX9YyedqZ3qJ7ScsOkdKzn6EiOGWvOCcA/nPgvy/wIIfelFqp0vS03pOHQqK5QZ7eqcDrPnkntguirjadfIJfoKf4Cf4Cf7vkN/QEihQfk9p/sFQGNT1pj1zeV7K1VXf+hPrX7i2aOOMIlb8QPnBtmCwLQPFtWOI06Vb1vAnRubPHfm51fxg5dE8OaXNcsh/GxPHywZyH0v4SvWJ7lJyqyXAb92Ag+EwpytPwi9HreDLnhyMI5LZiJNjvqZrfyd1Ecf2VzIYdPUva+PLNHjgvTC8QYGmeF/fv2Dy0rjwA+WjRFvyp2aON0NfxPvhMi8PuX9NEYIBfb+veKcSCx/sqrGCzT2vIceb4RnKCZ9qpAarj++NgT8/qhk/jVl+vNTBltR6Ioxt7zTGhzHnMjD8Z0Xo+IvUCO8rOdN+hLY1QnSkfdcI/wpBcr3F0WKsxM7vJblbrFW8RedLzmabGnb+eCcD//0InQ56JA5CjFkj2lPXRGL/ovzJm/r9lXBRs8b8RKTty8RR0VD9t4E+tVL1l40V7SnfRCJ/9WCFSNq3WT1gjKsS0udTG3RUwlgm2pJWQN++RLR5lkcj/32FW4Kqr/QdaDfXGM4r4GpjHNvJ+Y4G+GnQphdB35og2JI+j1X/KN4862/N+lwvgTwcAn9Wk2fA81BWNDBe8imC5PwU2hb6bOY05ACSTOB1A403RHnBgaXOQ4oV0I44gy6GdKZJw0ShggM1BjHabeKQapBf90HIczwM6RVIZ0NCj/VFVIcUNGgQLEuUisMDG1gXGjE/9CBxbg6RfD8HaTS1H4j256ESThgroal8oowo8BwojGGA0/cBrm043/a0rgWLYEB6M958UgbIL4dBxCknZ59Gyz8MsKW86JgVLz5pBwpJJ/l1QjH3orkD3K0Gv8XVrNPWgzgTiqyLjJlPUeBN+aHeeHLvwtC4SIYYSE2q/zo+UYJM+Zz5uvQEP8FP8BP8BP8U8Em8G1M+yA1TPlzbZL7vxOYMe/Ou8+qcHyAnB2b0u/n+oo0z/mzGJ/IrLvn3FWxpbs/oshL47cIqxt2iCvjHTeRmXPiBkvxWcmruauBnmZTz12BMXUP0rNBniA+/4lA7Oanlsgb4aLy9BjUzT3K1qCTBQePGBwM1T3SmL2/A+YMbmzwDCYwYvtjmyakLUBoXPhjo3cFAXFJ/uVu9A2OJvgrpY0g7T95YctbpZH54lpj5YKCdDobqAnxha8Ivg4ROjPmkLkL7AxpgvSDt2vXB8JKY+Djzxeb+uAHnRymk2ZAw7hKuwDhBnAAisb+GQsJZQyOwOJXqEy/sXzB5QxT8EY3wsWw/gfQFyf8xrjboNua1C7F/cKZ/2GwPNVhV3Shfqb5AkFzvNuD8wPzPg/QlpE2ErxHnFs6wOQvSZZAos10wJIl8B7SPyWZxSXHmDfBnNcBHBxraDjjbbDOkI2Rsxp2UukE6h5R/O4oTpKXkTF+jBirQwfi9SfmfKciudxrgo42Jz7cK0s+kLPHc5oQ/ivBbm9q/3qLBkrPZ7obknx6oKjX5fj3J/3LS/+qceVj/uDwJJ3dMg9SSUv4e0e75QvUVDxYd6dsak7/oQFWqC16Cce7ukO/XQML2sZr4D+pi2zgJ/0JIUyFlU/hJUO6fqYHyM0WbZ0M08j9/zlkPdLjsm9UwNnUm9b6SOF9Cr0P+BZCupZY/x9ugb82FMWakYEv6Nhb9I6P/rUcIg3Zg/7uEw/g/tX3ByJcFyfEOtLFjuKwydFA6eQYZxASKp+1EA8pPXcfEWT0vEkdMP9JJaUdzMoAbB9mm8LEjfARpIimID008cc1Ed4uPg5VHaQN8U/ihAvI8Ugb51CeQambidLOIT5QB/lzSUMPHIUF6VdeCfSzkozD2CnYP1dMOSuVM4Pe1ml93jatlv/trnT+1nYAX7W8CvzcrfujnLc94sHX2iOd6mqzJjhufnEu7RiCMBD/BT/AT/N81nxLzxpSPY3qEsXMa5dPGf4wT0eW6be92u3n/vq435n/b7pJPTzfy45V/Gr9g/fOCvVne+8aZL2Bcd2HGT+/4Ec35g7qMaE/91Eo+xtyRPTmfmThfjhG9Dg28vVbwMeaO7M5cYMIvI4r9AEg4O6Ey3vyaXbbsnvloqJro97dA6k0M0OJ488HYc4Nh9LGJ8wf7AMbhwFlhT4U6f+I1/mCcEDC+PzFx/gQJtxWk24gharx3CTFMj5jpfw3ylepW0Nc+NHG+oGPtCUi5pB4WQzoeYgCrxCCeRZwAzRVvcfrOWac9GQU/q/bFtCn/ScL/I3ECHSDOnzrH0H+Jc/A04ojZElK2yw4smvpNo/kXHWYzX7AcH4KEY9MNkBZwtbO//KRucCYcri55HBLGy8GlY2HBl3Vd9Zm1P9xlDPL/ngkfZ3rcCSmH1P8ikn+F1AHWBRrVD5A2OoU8X5gTghfEh2h8/AxssydMZl6hs+FqSG0JYwX5rG73vaPks3uJ8+lG0mfD7V+75zOTmEQn5d+h5bctgqL6b8h3O4lzZyCx8X/h6s/kKidt/17SRv5MxqwwJ5BgS1mAfT0S+Q/t90V/8c5xnK5NJ05FnGDyBjpZufqBjbF9oFPlb8T5cZsJ3w19fL5JTCRT+a94S46J9hRsG/cT30IB5QUQOsceIeU/3YTv5GXHnGj5Ecrf7WSM6kLqv4TuBHLOgf7YItTjVHfgQxk7fxU9I40e6J0dQ4TWDC58Rk4vUlh3W8BHAT2ZDBKzjGxekPtAJ3iSVBJnUf5XkYFwPvHG12sEHC++Db8MNjTiePJ3kc46m3gFQ/l2aGNvEWVCtYiPHu95ZCC+3PCVjedF7Ex9DG8C4sqHDqPXdAJdSzPmH/gfsOLDwK4KkiM576ofnq0LEu7pOHY+aaMRl38MW6ee5HP1p2giIxnuV04EjyX5r+OTPIbxidCwqv8l+Al+gp/gR8V3pHdyGpZu4KwTJnzRkfpXQXZPITpKrrNl33+n5I3rkj3qlWIW/LQeU2/hRcfocJtBXkJkmaX89J5XTQc+bYcTnDE+MUoHYNR8ObXtA7xoG0C5Dxo7FxCDz7r6d2Y8DmXd00SxR+Nrn5V8yZn+dM0uSuEHGn8XEp3SMr5gc78EfFqcFjSkcVb/T1bywfh+3WTmE26njasaotpNKVT/i4jPSzhLnRYs9wDh/xgFvgjqs252VqT8t3EnKRN7alyoQyeCA50BOAlgeKBkt7h7zjlbIuSnmbQ/zP+2KOp9IXGI/Puk/aFrBZX7lv/LnC/CuXwqzflM+JHuJoYzkuZytRMg3iVt12B/mco/mmNkJRn/iiLko/yaCWkJVztb5wzDeN5dcqQ9ThxaVPmLy57y546akHvh+/3klFwfeYZAhHw872VSB/NJOwjhi3mC7Ho8Uvvbnt7piyj7PToFX+JqZ6l9QRyCoe2srSA7MAzKTZHwY5D/WP4vECfh58QhE8pvEw0f9Z8obb+6+l9KnqGbQaBnQh28ROzPk94midL4vE1QvuoOXGo0iaOv+/wL9+tUJSv4c0jnC2u4oGjdoniLQyObW8EvJQPnf8KVKnGgpnjHW8zHjjuBdEQjv6+u+q60mK8Tr/USiie6u64Fr7OYX8f6wIR/PQs+Olo6TFo2vN4OcaL9UuBfxYpPUZ7dZLmB9eVPXzrhNjifE/wEP8FP8E8J31+4rUWX67fPbz95+Z6uN+avyR03B5VWbxOcP43yQ8ffin3LkkXZfaNBRqVmj3olnQUfl36BUfCIifHxkNX8QPGuLNGRSuPgW+jxFGMpvvyKQ+1EW9KdlGvR6XJmDM6fqPg1W53b3H+mXIuzOobH4PyJkl/c2STgKnJHxOD8iYqv+st6465JlGtxycuwGJw/UfExQGvtTlem/I2W8muCDttGmzifhkbp/Ila/8OlZyb8XYS/JQY02nwrbGkdv2ps/AX+ecA/l3KPLYS/LQY+Mq+ANChYfuDKo6vuHnZ4xfQ9JvyzgH8e5R7rSf3vibHe/8DVvoSvM4kUf9GON4zlT353K5XHjKFB0Il0fhTOH6PjdCRHWYmDY40WqBzakPwNlO2vkFNyPyP2WyAGPjoOz4K0jmJ/34rLTRuT/02Uv3tJ3YWthIGx5lpDUHAr+LvI2L2bwr8uEn4T9R8cu8+hjd286JioBspP40I6gXG3B5WjTSGL7fiM0zXcxnKG4XP0duG0zust5GPjvZ2rjRFUjy3IDpwudpXF+cd1r+i9xfWazerrdxJOl/vYYj7eZxoRoPXXJfIy8mdZzMeB41Ku9i1abn1PqHgn8VRqFre/J4kjsLeBfwf8+BcDPid7csKmVQP/IVL+qtV8ci9bmzHv9HVlDbgR4C61unAmg/ZXj8/9Or22bneM0gQ/wU/wf598ULBKiQJM5ccw67HeETK7scH8yyltHgelbFStXJbbu7IHzcy9+MNcVuXvatn/TwBuYbjmCEePkxh3vuxpfSvl7TsaHRhPw2c1X0zKBB2NN06Lx2VOk4gOZSlfcqTdS1n64yMGXJHVfEF2PUhZ+hEgumOB9XzHXyn8INHdDlnOlxyPceFLb5B/CXGCWMoH45/mfMSZBOM46lKeOPMF+X4T22Eco/w/ZuLAGEvGIav591KuwdlbF8ah/f931/tD0ZHTwrz8pdsp1x0n5d8UIxzl2BW6rsxXqgt7eY+u/+bQV7fsMJO/uz4Y9n77CYuOyJ42Z4u25PXwYG9yjW9a0NBRNwkA4zV1DTX+OEHECRhrLZb/FaQPI79VqMMD+jyMOTUTBKzkYxu6gDhQM+rxZQe2uT9azC8gDjx0IIfKN1GQ7NjmbrCYf5z0Ycy/s575KchY/n+QCNhJ6fw6F6+DF/6la+olvCAat9W7ovM1P9+1481eVvJfJY1wRH0vnHOS6i+9jfs1aJ1VfBxAHyTPEVIk8mm6GuhFPJRW8nEKOTq73q3PFzvrWnAQV/uWzUo+TmPD6X6fGNpEe2gTZ3G1a2et5KMgx7drqyl89JAvY9D+0RH5z3qdnBdyCP8rq/k4Hbn6yDqXq9XAj3Adck37T3GfA3z0kH/fEL+pRhg5dBKcMdTIcIYIV2vLv/ZeCX6Cn+BHyI9x2Y+ZI4bKh89r+B0mLRsvp7S5mtO1ssr9K58FJfn7ePLN8l/H73rTnnp6Cc9LrdythqDCeIwJ/8b8qyjX3NVE5T8ifvMB0/mM0/50HeWaR4gCaSk/9+IPRXfWoKmUa3CHqX1W8ztdtcEluTIup1zzHNe0mR8R8TtfuyUVjL1LKde8yDVh5kek/C7Xbk0XbO5JlGtwmcAGy/nXbWshyG7a7ItXiOFoKb/rDbs786JtKOWaJ1mUP/C7A3+wCX9TvPQ/mv5Vy9/ViRftp1Muw/AcO6zn72zDi47hlMumx8n51iAff+ly/Y4kSlC62+I0/usgTz7d9c7AJZHI3z0fjcFZlx9HGXOtoQMdiTi+rq/3qaYKIbGIrJT/GJ/oZg4ngoTa37Lr0mDl0VuIk8pKPjqw8WX/Owb7/1KluuBWUj5W6l/4EuevnGESCuT/csVbjJMgKi3mYx++n9ifIfl3jFUDFem4BMxB8T7Fq/H92gkEETuUZvjcqauBixjw76FY5ZBvfhyj/L/B/bpl56+FoivjGfFxGVT4NEZdY8XHzh8euE9XJjLiYwC6NRT+pYz4OIV1aThfncSIz7laDTq7zvlDDhHyP5UVnwg0Nef8f3fNm7ruhvYTFo2Q3S2drPjknqExl3jCTvAT/AQ/hB9H5bNRft609aPszTq/AQrZGWAIXuDpMOYj4MvM+JevOQ3jAhjO3RNH50fD/CvWDuAFOY+itM5jwU/tOvlMdHgZzi0mOovlfHtqh1GU2U+VxAFhOZ8X5YsoW35XEQeQ9f1P1y+mzD7Cc59mwdc51AHDthxnxudql+nIFKP1MSb515UplHOLjQaThfyJlHOPsOOrfzAxWt+0Qv8z8jXFN5QLDwqNm+m8x4KPKVi69z2Dwb0k3uNvQ3wG8hcdqf8KMTwqq47+dyZD/oJw+4tPFmTnRYz4WL+GZaQYkFsaw0j/wrI2vEnn3TxfMymFBR+dT4cNfBns/3E4A8hOGSisOLbpWnA1KDtn13eCaPj3cov5+CYDPaD1gvxBA8DB5wsG+cfpvLgW9I56fF4cxKj8NeIEeqB+GxCGMeLj4DqLq32rEcKXBjNsfzigD6ufffkshnws//pvunhxCEN+2FReyP8IhnwOjL2RsjuzZptLOSmL63DZ14O3/7vr/TR+nGYe1dcqZrTBe4c6wewmipJVR4Kf4P9P8V1ZA+XsUS/fIto9/VV/+Q9HVt7+PEs+KIGjuPozI3GpNMrlL5nw7ckjKOfN4eI7A8ucb0ui8XFprsKG7x5JOe9TzjonZD0+LzlHUc7D4JnlTPiijZZ/1AmLGPHPNcl/MRO+INP4+MKukA1fGkY5D4PHljDK/1km/b+KEZ+Wf9wNy8eEz4tnUM57k9X4EyjO3+PM6q8bjOAXuPDJApbJ3/x55y3NvWjuJfb0zqN4XtgrOtJeZTX+M5T/NwXL9n8B9nZexd6la45/9+Qxxvy3jPaXIDkxDu0SRvbnDOKICTG/bDjz7CsGfOxLr3G1u3SF8O0Yo2cVI/8Dbjx1f32+PBwdQJLhZL9V2p+uBecbHUDwGL0Z8T8LcwDV7vrAKv/LwhxAtbs+sOKvNDqAQPh2Zcj/JtwBIXRhyP+aC3+ADq6Wp7mqj/3Agr8mHC928nQY4ynPX6Qw4H9LyX9eWrcpaSVb5/hZ9H/Z3QKn9Z5c6y/Irmuh/J9kVP4195bdLVNaDLm3bfXhb0+UbJtHC25nKd+gAEgJfoJvPMcK5yceW2e0CePnjHnrcdHmub62P7pHt7nwXVz6dCOr/IMBkk057ygzvmjvTTlvBTO+5Ogfiaywii+INhp/FUN+n1Na/oLcj3LeV+z4Eq39LWbHt9F2HlvCsPxPo5y3iGH59zSxFViNfz0o533ETP7Qdz5jlv+9n16yK+/yNffKnpy7OZ736JryOrSJt1jL3/0LJuMEAUxFIH/9rPks9I9dHwzDcXXTKeJ/ThwhIUzdwdD+wzaNs6D4EPt/IEP+4jAHkCCz5C8McwDxUneaA0jhrDu+p7iF2jDih7Fh8G3DMP+bKQZ4luRMsyneEhZ8SiR/PjW53eiUir1LvQz4Wyl8e3LuOZ6K/St9DPi09cxCUtuRWdXHfjjKgI/rmXFqsyuU78oa2Ko8f9EBBnx8o4pe/3oBqZ2ZfXNKts7Zzab/8x5j/Xs6jsmB8j/Igp83bX2m5ExfBgNvp5RO45WMAbc/suvdwW8wHP+M95YiOCfB/43zs0e+0MGZ0bOn98SPmw6vvPM4S74gu84zKCWXW+gACuPzgtiKct52hvw2lPN2M+PzUjsTWcGm/fFiu8hktUV8gcrfzK78qfxt7Nqf1J5y3iaG7b8D5bwNLPio+8KAQ+v//2XB97Q/H/QRnrb1+EYWfGeL3k7K1u9BlvUfrDo+x5bcOsQJrK+GMmE2/hLHBM54el90pAqqr/Rot5sPqKdS/odsHvC75FvELuZ07RVo73+p4/iLd7/B0P4+wdUurc4J0XX6M7S/UaZhzKeUX60/IYth/sPjmQlCdl0Q6NBDs6r1cbp+mPKphxH/EMUBk8Yw/yeoDoics5JLd35awYBPndJrS22L69+9DPjYy3Bgr7fbgzNrYLOK/SsPM+ArYR0QDtmVgX8fZdL+a8vAVW8EdjXDNniAEb/A6AAS7J4UZv2fsqOC5MzA/B9kwZfdmegB71SHlpNaPdis381fFG2cEbrThGbhDAxj3iixBy0t/wQ/Aj7L+u84ZeU4W1pHnHIu2tLzFE/n8eiAmccs/7ruNZRCgG35CzQDzMuMz4vNKOeVs+PzKZHKaov4nlPJ5zkhlXJeEbv8C54IdbW4892thmAcStoyjKMs+J4OY5JMjMBjLPgpXaekmYzBTPLvzh6SbqKjFLPgOzP7uk3yrrBq/7vfO312h0lflcvJrc9Vg5W7ecH2pORMPyXyV/WVagn947fL3/pa29vbT1i0QXRmdPCe2LTm0JIbtjH1P9TO8Mr51R2hHFC8Jcblh5qFZY+KZc9fhZ+YyjD/ASLXM0L4yRLH8Kg68HVhcocLw9xCjPCU7UR1lWH2qYN69fGN1Yz41MCagZI9rPg2LnyrT4xGrzOsA0cYPljtZ8h3hTdBnWX+KQoHzzPkO8M+EW02hvxexj7hTO+MU6ALWMA7/XFTEgw59wi2pB6g7Kzbv2Dia4Gy/WHjgoUOCC5xmAwM6Z2kQPkBVVN8TLlySu4dIeMizgjB4KvzGD6CUeFIYloAPC+bjFNVrJ6A8pmHa9r2v03ly8yKnxNoDgg7w/qn6aBMZKLoSBNMvmKiEwh2j2jyFRO9VLS5xWh01bjnX3Ka2R9BFvxA1THvqap7PIo3zyrLPOOB3bwgdwz5eBVr2Zf/4bm45K5u2V2lVfpHQk9JHGSXs5Wngq0p3r/wvNiRF229dF054T22cTrjRzC8XOPdjoweNl/hliAjPupUGSG2p18iwjZUCRGsEkC2tE60t13Gt21W8WnGdwXD/GdR9JwKMACDhGk1vzlN0FbsW1bJiN+C2iIPrS1kVP/NaYotGH2ljPjJXP1tIGs1reqCYkZ8dLS0DtM0vYVFjPiobLY/hXw8csPK31dcxoovOdPegqGmZstfIcl5TrtLv8jY8WavB1mNv4Z+Hmpo/U/xrZoCDoplGF9OyhLbT1zyuOhIvRzkgU/X1Xu52oCBbPLP80YHaDvSVwNM+LpaYvA32IisOsqIX0Hxd+Bbuu1s+DrN0YTLUg4y4tOC3eIszV0s+DqnlfHhs7AyWfFryp/nkyj532s1X/WVqJyulZCZ4EZd5bDV/Iq9S6u4sLgYNQcq6UVW8ysPrqmk6L944JvpMqv53mMbzBiY/xOWl3/+l2WZg+81zkpPs9AAC2v/FfuWX5Oce87zvCDnasHqb4OVR6bb0zsx49PkL8jJ37X+8Xvn/1brf/vrnXEjnPOb9b42DexetL0DbMtfP1YPpWvlvsItfkb2Nx7u+sJfLRW4yNYFxqf2bUmU9cb8Pkb8vHD/j7qXYf67hfE1ZQ9Dfv9wvnpK+fAAR6uOfFfJiE8J9qiXFP30xnFGfEqwQ726ePOs/Qz5RmNTLd+9iFX/w4DjxhlAWsXe5azyn8sZlr9h24f8H2TEB6OCHx/6gWjzjGU5/na+5ufzu1y79dXOV//0WNbwJ9oQNjM+R1/vfEr5uRfPHys60q6q2RaTF5JBEX+ZtFUmfF3x/4dy3mBmfE2lOTqGMuPr2sHIxkqr+ArtdfcQdu1foxm6A5jxNe1IZLLSqvKntr++7Pg6bblbb4btj1b+3Vnwg5VH/aCD0RxdPVjwKw+sqkQdkHJeRxb8QNk+H5S/If+6Vcu/qPV/aMkNW7fNzBu79bW2vba/0e3G/Lkjq1jyf+/yP8H//fHB5ishM++Z8mG8fRjGuzp5owSrjj/EkI+2T4bB/j4ikQcINQxxloQl0yAFyUnZclD/xfCBVfzTw/0PwZ8Z5j9su1NdDWxgyD87PP9M+edSyp8lP3ztoaZsZMi/iML/OVBes+OAiwH//HC+uq3q8LdVjPjjKPydlQe+rmTEv4TGrz72QzXD/Nd7AwLGzyGW/U+0p+JODDWvIFK7TzkvULZ3IAjDKiPfql0wts5oY6coAJzsbulsN2Hhn+D5YIzQ0Sl/F2dNIN4wvuhIMc5Kwzq6mLMmEGwYX1P8Pwqy+zLD51M5yq6JVvB11f8zVMAkSl/5iAlf8W3iJNcfDJ+jo/R9NvkHHUAKG5tHc7VbEVtf/2rgF1F0GMfmMZCeY5J/0IF40WbUjS6A9BIbvrKNshMU1scMNvzABl5wGl8OngVpFgs+p6k/c6JkXPOCW9N/wqj+t/Ki3TgzeARnzU5cNP5m4GdR+N+y4CvVhY+C/PkXMbxU+Pt+ydXcKhuQKv9Y2V8JfoL//4FPdiv9zeV/17uDd3ran396eq+re3qP/7jv+HdP7mHIR71fC7VBdF0rkggs1ADCt/SWBEEUZOellOdaZvjACj5mfiLFAbOSUf6xnC+jOECWMeJjo5pC4X/NiO+klr+mLGXEd1PLXw0sZ8THKe5XnML6x9hH14R9qisrGPFxgLuBwl/IiI9rTG6i8Fcx4uOge2s4X1vNcPx9mAvdApOXWmX0vxUdQEsY8ft1vubn67Wgt7Bww0vvl/zyQXmdoGv7hwV3Sa4Wd5Hz8O07voHuwsV/KqxxBppfC1R9Kdo8dxk+x7byPCSf5Xxv0UouPOjmZEh3Qiq1nO+vWCY60p8wfI4OGSuWgYXx1WD1CuA/RnGA4DKwg5bnP1i9WrSnPEBxAOGM3a1W83XFt4qzee40fI4va3AWxG7L+agDye4bKQY4OiUOMOB/zUnOKyn5x2Vox63mwxj8H9LfjO0fx+tKy/OvKV/zot34cmoCJIwN5mXEN76cQ10Rl8IGGPBXUPjogH7MAhkUxt/1zsDZ2SOe3+Fq2f+06qPr1x9eecduC2PghLe/2qOe/AUDuPxU8jnrguAn+An+75pfvmdxFaTvTwH/qBqomCfakoms032qr/QViSi5oeuARfIQcRU+MKg5u928v4/hY1WQ7AtJAVjJv4ALm1aqV+matoBR/i/jQqKPE+OvDIwhVvxbuLDlL7qP0/X5jPg3c8bpZ5yOsY9Y8THYl9HKUjhe+IAR/3ZIYbvN8Lz4HiP+vRwtBhUvvMuI/ydiUBj5sxm2v/CF9bw0l8avHasOxJM/laMtK+ClTxjxcUZF2LIWQU7aFcrPPP3+rJROF0/WVZ+fFx2vx9EAHAZpuWhPtUHiWg59ZLz3xM/n+Qo21zhYREfqMMP5OFZfDenf8ZQ/XP1YD5hn3653B63uesPubbxoC132lUP67JNW83fPHfFj1xvzd/CC3DnkO3RYPwrpz1bzS3d+siGj/617gR+6HTY6bHF6cjy3g6fyy7Z/tC7jtD8d4nmptYGPBuBVVvMD5ftWy+7MEzAWhcaow754P0d5aRBvvh6sXg66QCnwUw38xymOibjzNTWwSOT0akCGKqGoF6JT7Dqr+SADP4dfA8APfQuKDvu7iRPEUn6tDqI/V7ME9NcjifT/Ry3PvyCiDvQMV392KOpK10N6kQF/Dvx8wsBvScbff1le/rU62ONc/UBgeRYZf7T65w6vmJ4PP/ZYKH8b5LOwvxL8BD/Bj44f52DkpzT/OKYJkuPOduM/+0pwpLXzHvth+aGvbllTFwTaa/BCeUIMg3jAMXMeTfFtFCRnqLK/ZsebvcpI5q3iyzRBCs/yieRMr9t+3cr8o+H/93C+d5aclOVlwM8hylx9frB6tmhPKWXAR2PuYVr5C7L7GAM+vsm9z/ihrvoXQ1s8yIDfx4S/nBftuxjwBxAHkMH/GFwPRt9GRvxHw/nqRuD/aMaHMcMHSlg8+L1ohjwufwPld63Z+BdHPiqzL1D4vwD/Wwb5R8P6NWr5i7Ytdfxmva/NhrQYFPK6+e84YwuXZuxvIh/v9x4XMs0VnS2tR77Yy5bWscbBpAYqNhAnUejxLCR8O9/UWRiCrivj8qau61a5b/nKo9/cV+fU8taVr+ItfhNkwbOG69ABgjPk1sVL/hk+PslXfcVviY70v1OclgvIM1jJ11VfyduiI83YR9EA/RLS53Fogw3zA+XvijbP3yhOUzSOF1rMV6D9vS/akm83fI/OFzSOv7CY79eCVe+BLPyT4XucMTubQflXa0r1PEFyGZ1t6ADAZXirLeYXgS60EGTxeMP3fyb532Ax/xjI4i9BFhuXAd4DCV8Q7LSYfwD4OAtnhOF71Jk+5eLjhG+Ivx/4K4E/0vD94yT/pRbzD0P9fxFa/9Afvt7+7658nOSfKT9Ev6HKXy5+u9FFzY+n/ZXgJ/gJ/u+XH+J/0fPnnbeUfFyN42ud17/SAEMvVGocHVB4L7F06+w7YLBfw9W8cdJRsb2KAR/jDhmDTwe1YHWowmsV306UKOPsmyq1uuBZBnxsVB+F30uvBv5DDPi46xvOcjDu8qHoivdhBvwWxIgybv+O2z0/wIDfmuTfGHxZ19Xggwz4bQjfHu6ACrDgtyV8Vzjfdw8DfntiQIXztcBjIUyr+DnEgEyh8J+g5T+pzdnOTn/c9FjXG/PR8YBvYJs10fmykKPswAf8p0L56T2mnRvi/MEjg5RdiybwPST/Ybuvie7MgrrfAyX5j1OCoeK1i2jXRnFgv1/A89KnclLWE2k9rliRe9Hc/qSsTy7v8B75diaFbyPP3i1e8i+0+EP5vsKtM6FCjMGA8fyPuVoHsqX8YPmh12p2QwpXWtAB0tdqvlJ++EXcEIfCR9nZz2o+yMLnanUSav4HWZ5/X8nz8JGfwp/FxScgb4N8Leh7mgsPRikQB0AHq/m6FnyKouxKRHfJtpyvBp+h8F3EAZnCgP8IhY/XvBZP/TtKPsqdSSz4wbIDN6uB8tmgk2xR/aXvH1/70F1W2B9mfFb2T4Kf4Cf4CX60fJyJ1JRkxsfv6hxAKPyN0eed8RB+APGQe3HH1j5yePvrnSdvnZGbBfoNvnHYbzW/+tgPlRTjc7bkbBa6vt4qPr5FOc/4oeov/7uc0vaQxXw04JbSFFg1UPkMAz46vdDJ19P4hRaofFF0pG+3mI/G/xqOsqOEplS/LtpTfrKYjzNPcAZDO0r7myPYkr6zmI+zN9ZylK3fddW/QJDdSyzmDzHnB74E/vLG+DB2NIWPgU2/pTkQwOBYLUjOOQ3xHRk9PMGqYxg36U8xGiF1+e9M4a8F/lwaP/vclx+TnOnX8YKMM6duIH0olinxPUn7603hfwP8+XV/d7v5gMJJjhMmbZg2OyeSAw3HVbTxB2NfibbkkzNrnJl9ipTqortNHIjrOUoA+QjHn6+4esHfeZezea9pWNY1eSZHcocLK1VvyQMmDjQcQ0bHwMfthF/QNXVD52u3vNKs1x9DFYp6fHfroWWKt+ivlHtg+1/NUQLYxyJ/zfiOFj0LVX/ZE5TL0QjGOHkXWMm3Z3Q9ATLxWZP8L4+x/EMdiWH8UIeHLbX9YZCJtKDLuBQPZ0GdH29+aP5tya33aoGqV03aEOZ/qJV8GG92gEycadKHvuaatitWo3zR5vkBZOK7lGvbkfbXw0o+yOL/AP9DkzH0Cy58++J489cAfy7l2vMp11rBXwv8D4wXBquOa3Ewfhrv/806H9/xRo+bts3sOHrHm73uKdk2ryIO8j/i/m+l/ZHgJ/gJfoL/v8oPFWw46AYpChDGTuFj8EbxkFCBMc7+QEZFiHcqKn4UimcNf98n44+o/tKTyoWuK+j4eIhySdz5YOiMoBj/q3xFW5+ymI8Fu5GmOILx/b2vcMvjFvLx3HHEcKRsPR/cqHoL77OQj236GpL/ThT+VtVfcaeFfJxtg8bc9xwl7g20v72a4r/FQn4yVxtTAB1MOVx4ARzRNeW6SPnQjtPJFMJID5wx8gpxfmRT+AVQBtdGw9eCVS2IERDJFonocHqJGM6ZFH4xdIJpDfFFR6rQdvzHs2V3yzfIvdBZeR9HmUlEObJI/r+h1T/yofwxtohO4wuy60zD52h8obPyWeKQaOxAx+8/IP1AdxzpJbT8q1Un5sHYtMKkPNEIe5GjxZEKP9DRgTMKNnPU2SN6GfDD6n/XOwNmQz3PM3HCLIb0NhfZbAQUdti/tlAdV4IgkbKud+yc1f9tMII/o9wvnfDfpPan8APftFxJ8n8bL4j9wMC9rPmgu18MlX8m/MUmAhyN0HeIQyyS8XcEtLOHgmX7LzOTv8aLijfPel5X/WtM6hNnkb0bYf3Xk7+R8kEmPgmyaZ2JEwSdMDMibP8n+eTaiPiat+hxkA2bTOof8/8cFxbHrtF6iJivBqseAP52yn0yiRPmMcq94sbXgr6/wrhMW+6JbR4d6RhHT7aMrwamE93MeKAMx3ZxdZQ6UFR8XVVuNeEP0zV1SAyKd7T5vwX4BwyyomjXOwPdUcrfGOvfi/zdIXriliMrpq+IQf7HxI+j/hFXfqz6f4Kf4Cf4Cf7/Oj/UoEKDpIQoOaGOIQcx6jAydaSBiZxEcRWNcoYwaGvb4sYnAS9P8ne82euvrUe9/Lac3CZDDZR+ldTm7HIWfF3x7+Ntct8Q4/9AoHT/ZHerIYqVfFDk7+FFew7N+QBGwXgL+VjeaERR31hj/oOVx/5gS2nrt4CPbysvI86fbib8o8AfY/PkVMeZLxBD/RLCb0WvGK1YC1ReJNpTS6Pl484QDQQmRCMNZ1qMJWWQZtIyytUg8G2eghj5WK64JAXjsuA22aWkr2NbQyX5PFIGdhO+VwtWXyzYko5Gys+7/Jupgux6mtwTFWScubMKfQZot5JBMpOU/xhSBiaGiu7XFO9kQXbvb4jfevS/ThMkZ+jWyDiIotP0LtK+VxAHQxlp85nE2YEzVUZHwA/b3QjX40IZl+hqcCcvSa0o4ykGRMW4MLhzHM7e+gXSCTKgY9vH2TqjSB2YvDXWg8C/UpBc+4zfOFr0DFYe+Hq8O3vIYl50GLeFRjmBMTlwd6ylJG0ifIHkvwthn9uAo0wF/hTgH6DlH/jXubPPyONFW19K/7qKq91JbylxCKCDpYAIszTSLtHhM5Eznb6r+zlNe4YWW4LwpwF/NfD7UIQpGqDTiDNoEXGwocHoJ0K6E2l742mOR6jzsyRnGqd4S6jyD/ne45uudDTvvoYX5K6Uh8eYOFNI3WMbxJlR2I4qSf7xmuFcbeya7hwvcHJKLtfpjz++vPPtvk83Jn+bD5iuBYp3TZLT2q3jeSmHkn90auHuRJ+QMkBnEfbjABkjOpPy76D6ir8hToOI5T/KpED5wclycta3wM+i1P9NpAwwLgrOXsPZbYUh3+MzVNPkfyR8GWSS4i2aKDnSvoOya0bhTydtAGdqfEScEpWx6D+09ie7M6sVb/HFkiP1v8D3UPofBqW+kTgisQzwBYsSLz7GQ1T9ZReLdg/UHZ9s+NpFHGB/4WrjCb7bFP2PxgeZVKIGyi8RbcnId1L4b5L8NsaOiQ8yqUgNVIwXbUnLgV+v/KuPfO/c//mUaAIDx5Z/f9k4yP9SqP9M0BXKfYXb7gxWHbNFIP+bzneklVcd+W6A7GwxRVcDwcMr71jmK9wSjFD/iFr/pwRYbVT/+P9ifyT4CX6Cn+D/f+DzGRlhIR7QeGnG0ae9quQh/EQYayEKkkSMNCcFXAcvoni5mPJBiAUNzhrL+LirTnrPaW/wor0Pvl3T/OWTREf6Oqv5Xa7d+jooNOPq+x6Cu5TqwgvkpKzdVvE7Xvnthbbk1vNNnC/7laqCUcDfFW9+pz9ubCc5m30Pzdn0DTE6f1RvybmSq/mWePG73rC7CxiLb3G1M53EBp1yyPeVjwVFe0NT+MltR6qtz5v5LBiJfyDGl5OLZJq4rpWCgj1OtKeuiYXf8Yr/TLV5cp6M0RuND1AJCvbFoOiuiJSf1nVictbZz/xs2CEmxkOv1gJVk6BfLGyMn3vR3JHu7NO/5OJ66D41UHkpKPiLaPy6rWeDlUc6SM6Mz6Bd9Ygvn0PnzxWC5Jxn5IduewtGQIYrs++XvOgYYAF/mmHpXdjhPbqhhaNFz+WQ/55xLn/g+8Lybzz8xTvb2FLbLYb+1S2udBj/tr3WPg/lj7HMQw+l4nB7MSlzJc9LuXEi+3d/MLxToGx/IFT+mvGDVce7SK5mK4DfKkIA3jesfwbKD/5t9/tnvGMm/03z7y3sJTnSlxl25TI7qgg/raaIteB/Cje8ckPB+udLI9E/aM+g+ooHwBi5BPjpjRUscUDtAoP5xW0zOy6IVP9paJtp1V86FMbIRRQnkPE4AW3qFmhTH0erfzXMLztTtHs+NzpB6p0TqLh8xxvdP4xV/2uQHyg/B8bILwy7kpEXW75V22Z2uqip+mc05a8Fq1bufLvvVAygGS/9tyF+6bYPkyV35sCy7R8dLNv9RaUV+ndDfBibftP6f4Kf4Cf4CX6CX3vQllQEiWKTxoW/ycYbJ3HRTUWuu2cJZ/7Gihk/gq3d4sY//u3jRyGN8XQYI5XnLzoSuu7ZSr6/JP8jZ2bvsXXGOiio/w2U5I/FWAtW8nlNoRotoLitCZTun4Brva3h89MbdP6o/jVK5bEr5JTcA3Hl8zwq/Y0uS4Hy36BUHh0fD37WWU/fDsbptKhMQC24TcO3m/XjLkXFtyVn3xWr80fX1F1asOIPYFhtjobvaNEnPR7OH5zargW9l4Fhsb6xc4mBvqzL9dsXC5LrfC4eh64d0YLVk4C/trFT5aRW+RX5C4e4c856VbAlTY0T/4SmeCcIsvubxk51txpSCPxz3G3OfgvOnxAnfjHwLzfEnaK/usjqf6LqyHfDnS16z45j+ZcA/7JI+Pb0Tgd8JzafaW+W9yEvOs6JV/nrin+a8eUD7ZCSs/cEy/YNlZJafcyLtoHxoGPEb9KnGpU/sjtze6Di0FD4+SmMM5HEfrHR23HLq7jaZWtRyX/JmfGz4i0eJtqTFwC/S2PNlaTa0ViQhzbrfd2jBeuf/3Os+geMketVX8lwAfm81NDYjmMhypzmWE+tz5s5+tCSG7Y3Vf+BMXItOmEEmxv5DSkrLXhe/KBZv5t3FG2cURQv/Uu0p6xWA+UjBNn1sRmf5/hLudpZmHHX/0SbZyXwzwT+p8CvFz9OUwMFVuufWP6Kt7CfrimXav7y0sPL/7KEOH+Y6L+pXSdheITVVurfjejAv2n9P8FP8BP8BD/B/9VzRDsU8hDG6NTRK5+19yiMMPO/SX55/qKDETp/4sLf+/HYld5jGyeDIjlLDVQ8AmlEhM6fJvFLt3+8Ateth2S/HJTp2ws3vnZWhM6fWPm8meGp+kvvrdy37OwInS8R89O6X+4Bg6MR549eCfx7Kvd9NShefDBio9gVSPdpgcq/ByuP9YvQ+UPlC5KD56KL/1DHD2rBqpdAoe4TofOnHv/o6r/9oqu+b5vQ/5D/glJd1DsS50+IE0ip2r9ybLDy6BW6FtzTBL6iKdVvqMGqnhhoM9KLMCjx9je6XVXD15XDTfJ9qb7ZmuLtGYnzpx7/310nKdUnpuHMtSZ5H9TAF5rq7x2J8yXECVVa9OPMC1Vf8W2U3ami5S/VtUCfaPgYFBnGrFHQd/9K2Z0qWv5iTfX1BX7E22ljgP7q4xvOgHH7IcruUFEdGPA/UH7weDTyB4MSK9WFQ7DvRCk3Q1teIFb5KznTd6q+0tOg77wWLZ+X7D2aKv9FR9ovMG72h77zToTyR3K26DMsXvqHaE/ZpAWr+2DfbZjP25JyhreLt/6DQZm1QFVv4L9H48N4st9K/Yvwe0L947IvrbY5Kccq8hc/z0L/k5wZ+bveGfiP/Lkj5/gKtwTirX9GsGtLQv9O8BP8BD/BT/At5UuNXIzrzqqJx8nJRT4DAK/1ErjShIf/zfAjmHkUV/7eTy7GHXA+idLx1CR+wYYXC6SkzLGeDhdcwYt2TVP8L6My33zAdEv5lfuWf5DaZcKVddO2MZgjKJBvBssOvILGHBi0ceeX7fi4ouWwR3fzgtwx3PYBfrD6XdzeGB1v8eSDUfYTGJPnNmx7Kce1oHe25i1+AR1PNltSk/ia4ktSvIUzJVeLOyO7UisEI+FDxVfyTzQm4XmjhpM4BeW+E5svklNz7xJEx2hetPWOkF8O/LeB/2KsfKgznG75QcH65z9O6375NaI99bqI+ZyO/E90xff3KB1vxvx/UJG/cIEza9C1oiP1JmhrnSLkB6DOvsDtlcGY2sCLMfPfBf4nruzTbxXsnluMb+Qb8jvoqn+5rilPoeMjlmljGJMGfrwE9T8b61+Uk66G/h1pEF5cDrQG0tOC5FrMxc5/2l+8c5acnH2fIDlxfIl4VwZgfw/pMeB/yXPRT2IjcdoeDZQffBfG0PsF2XU5dH9HFPw1uhp4RLQlr2hoyYepEyopC+XXdNVf+haM5Q9C/nHpTaRO4GCw+gTGHSpA+ROD7OMkV3Nc3nWz6it+iZecjwAfl7w22pJhfFwfD/kP/R3je12lBSpf50X5figDjO1luhuUUnl0ezz1D4wJAz8uVwPl/xRE+8PAHxPG17UCGJ82W6H/iPYUXEY3VQ1UvCqItrth7BsL7U+Gfr2x6MfX3rBa/yL8axVv0dOar6TLsbUP/1J58JtInaEN8iNsjwn9N8FP8BP8BD/B/83yaTGATM/lagMS2YnjSAp5IJ2AMKGQ9jXRc5Xg/z/n0wIN0o4ojIMG+a3OfiYzqe2oUbwgngiWHZiDQW2t5rce9XJecvvRT3OC1B6MrR/A4F8Hhvfq0m0f/ocYkHHnJ+UMT84ePeMRMAjHcJqGHRw4WglYvMd1NbhNC1avCJTvW2sS6Dtqfp3xiDtxdLrqh/N4QR4IqT0niNk8L6bXlolWpuMyF03ZDPzVmr98tT29U6ApfKPRivz2ExZ1kdwtzwNjsB8vSrkcL7aoKRddLSL8nbriX6MHq76S6YHGG+WbGcvI7zBxaXfRnQl8e18ogzyO51Mh2Thd98EzHNY19RdoB6s1NbAYg7pGw2/MSEd+3hVrBwi25NG8ZB/A8xLUgZDKc4JN19UKeIZjYPRvgTJYC93hc2LARsSPxEFQkb9QdGT2x6UpI8Ag7A9lnwf1n0KcAgG9Jv/KNniG1bwgfS5IriPxHHx8JzbLoitjKPDPF0THcGC043iheW39Q/vntGJo/5vg9zXw3UIwmPPjyQ9WHXdBvY8DQxj7QB9g5NWLU6Jrh3GHQSiHVVA3n8B525ta5vU8av4ybGsTgX0OL9j6wTjXjgt9gVPT/oObgP8d1MscyP+Ohtp6tHwtWIWBrSdAmZ8piPbB8LOlgQ99UN0E7X85PNtcXnTsa6iPR81XvNnAmALlPrJmaVot/+TXNcssVf+qsh3z7zi6+r4CElQ9orEtIo1K9eVC/4byl87moO/xgtCGBCtWVF/J27veG3IfjH3BSORvLA45yH9ryCPyh8HY2wM+OF51+LtHDyyctjla+R8TP1jVPFhxuNW+Ty45oAYqxKboH7HwyU5QCf0rwU/wE/wEP8FP8OPA/z8BBgB0NyAnicwKswAAAABJRU5ErkJggg==" /> -</g> - -</svg>
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/arrow_right.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/arrow_right.png deleted file mode 100644 index 6446342..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/arrow_right.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/back_white.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/back_white.png deleted file mode 100644 index 214bb03c..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/back_white.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/black_folder.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/black_folder.png deleted file mode 100644 index 01ac492..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/black_folder.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/button_list_view_white.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/button_list_view_white.png deleted file mode 100644 index f89199a..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/button_list_view_white.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/button_mosaic_view_white.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/button_mosaic_view_white.png deleted file mode 100644 index ad6f856..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/button_mosaic_view_white.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/copied_badge.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/copied_badge.png deleted file mode 100644 index a9e2bda..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/copied_badge.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/copied_badge_gray.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/copied_badge_gray.png deleted file mode 100644 index a983ecd..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/copied_badge_gray.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/drive_badge.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/drive_badge.png deleted file mode 100644 index daa3a50..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/drive_badge.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/drive_badge_white.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/drive_badge_white.png deleted file mode 100644 index a3b63fb..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/drive_badge_white.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/hashed_bg.gif b/ui/file_manager/file_manager/foreground/images/files/ui/2x/hashed_bg.gif deleted file mode 100644 index 03651e6..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/hashed_bg.gif +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/menu.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/menu.png deleted file mode 100644 index c2a2e87..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/menu.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/offline.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/offline.png deleted file mode 100644 index 6fe2d25..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/offline.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/onbutton_trash.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/onbutton_trash.png deleted file mode 100644 index 593f53f..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/onbutton_trash.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/search_icon_active.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/search_icon_active.png deleted file mode 100644 index d58cd10..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/search_icon_active.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/search_icon_inactive.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/search_icon_inactive.png deleted file mode 100644 index 553ebbb1..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/search_icon_inactive.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/search_icon_white.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/search_icon_white.png deleted file mode 100644 index b49fc5f4..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/search_icon_white.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/view_list.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/view_list.png deleted file mode 100644 index 9ad2901..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/view_list.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/view_thumbnail.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/view_thumbnail.png deleted file mode 100644 index 45d3a9ae..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/view_thumbnail.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/2x/white_folder.png b/ui/file_manager/file_manager/foreground/images/files/ui/2x/white_folder.png deleted file mode 100644 index 9124621..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/2x/white_folder.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/arrow_right.png b/ui/file_manager/file_manager/foreground/images/files/ui/arrow_right.png deleted file mode 100644 index cd6886b..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/arrow_right.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/back_white.png b/ui/file_manager/file_manager/foreground/images/files/ui/back_white.png deleted file mode 100644 index 8c4f0160..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/back_white.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/black_folder.png b/ui/file_manager/file_manager/foreground/images/files/ui/black_folder.png deleted file mode 100644 index 539f677..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/black_folder.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/button_list_view_white.png b/ui/file_manager/file_manager/foreground/images/files/ui/button_list_view_white.png deleted file mode 100644 index 798df51..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/button_list_view_white.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/button_mosaic_view_white.png b/ui/file_manager/file_manager/foreground/images/files/ui/button_mosaic_view_white.png deleted file mode 100644 index 9d4d518bf..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/button_mosaic_view_white.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/copied_badge.png b/ui/file_manager/file_manager/foreground/images/files/ui/copied_badge.png deleted file mode 100644 index deb929e..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/copied_badge.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/copied_badge_gray.png b/ui/file_manager/file_manager/foreground/images/files/ui/copied_badge_gray.png deleted file mode 100644 index 55b489a9..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/copied_badge_gray.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/drive_badge.png b/ui/file_manager/file_manager/foreground/images/files/ui/drive_badge.png deleted file mode 100644 index 789df29c..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/drive_badge.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/drive_badge_white.png b/ui/file_manager/file_manager/foreground/images/files/ui/drive_badge_white.png deleted file mode 100644 index 6628f9c..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/drive_badge_white.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/hashed_bg.gif b/ui/file_manager/file_manager/foreground/images/files/ui/hashed_bg.gif deleted file mode 100644 index 1e5bcfa..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/hashed_bg.gif +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/menu.png b/ui/file_manager/file_manager/foreground/images/files/ui/menu.png deleted file mode 100644 index f070a0e..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/menu.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/offline.png b/ui/file_manager/file_manager/foreground/images/files/ui/offline.png deleted file mode 100644 index 259d3b20..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/offline.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/onbutton_trash.png b/ui/file_manager/file_manager/foreground/images/files/ui/onbutton_trash.png deleted file mode 100644 index 20ab756..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/onbutton_trash.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/search_icon_active.png b/ui/file_manager/file_manager/foreground/images/files/ui/search_icon_active.png deleted file mode 100644 index f59dfe3..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/search_icon_active.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/search_icon_inactive.png b/ui/file_manager/file_manager/foreground/images/files/ui/search_icon_inactive.png deleted file mode 100644 index 2f17e7c..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/search_icon_inactive.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/search_icon_white.png b/ui/file_manager/file_manager/foreground/images/files/ui/search_icon_white.png deleted file mode 100644 index dcc0f40b..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/search_icon_white.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/view_list.png b/ui/file_manager/file_manager/foreground/images/files/ui/view_list.png deleted file mode 100644 index 4c30e4d..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/view_list.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/view_thumbnail.png b/ui/file_manager/file_manager/foreground/images/files/ui/view_thumbnail.png deleted file mode 100644 index 093f1d03..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/view_thumbnail.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/view_thumbs_black.png b/ui/file_manager/file_manager/foreground/images/files/ui/view_thumbs_black.png deleted file mode 100644 index 54448ae..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/view_thumbs_black.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/file_manager/foreground/images/files/ui/white_folder.png b/ui/file_manager/file_manager/foreground/images/files/ui/white_folder.png deleted file mode 100644 index 07b6aa2..0000000 --- a/ui/file_manager/file_manager/foreground/images/files/ui/white_folder.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/gallery/css/gallery.css b/ui/file_manager/gallery/css/gallery.css index 8c1f468d..c058dc7 100644 --- a/ui/file_manager/gallery/css/gallery.css +++ b/ui/file_manager/gallery/css/gallery.css
@@ -16,24 +16,52 @@ outline: 1px solid rgb(77, 144, 254); } -input[type='checkbox'] { - width: 15px; - height: 15px; - background: -webkit-image-set( - url(../../file_manager/foreground/images/common/checkbox_white_unchecked.png) 1x, - url(../../file_manager/foreground/images/common/2x/checkbox_white_unchecked.png) 2x) - -1px -1px; - -webkit-appearance: none; - display: inline-block; - margin: 1px 6px 1px 1px; - vertical-align: text-bottom; +/* TODO(fukino): This style for the bubble is old. Apply new design and remove + * these styles. */ +.bubble { + background: #FFF; + border-radius: 2px; + cursor: default; + outline: 1px solid rgba(0, 0, 0, 0.2); + padding: 16px; } -input[type='checkbox']:checked { +.bubble .pointer { background: -webkit-image-set( - url(../../file_manager/foreground/images/common/checkbox_white_checked.png) 1x, - url(../../file_manager/foreground/images/common/2x/checkbox_white_checked.png) 2x) - -1px -1px; + url(../../file_manager/foreground/images/common/bubble_point_white.png) 1x, + url(../../file_manager/foreground/images/common/2x/bubble_point_white.png) 2x); + display: block; + height: 11px; + left: 24px; + margin: 0 0 0 -5px; + outline: none; + position: absolute; + width: 17px; +} + +.bubble .pointer:not(.bottom) { + top: -11px; +} + +.bubble .pointer.bottom { + -webkit-transform: rotate(180deg); + bottom: -11px; +} + +.bubble .close-x { + background: -webkit-image-set( + url(../../file_manager/foreground/images/common/close_x_gray.png) 1x, + url(../../file_manager/foreground/images/common/2x/close_x_gray.png) 2x); + height: 21px; + opacity: 0.3; + position: absolute; + right: 3px; + top: 3px; + width: 21px; +} + +.bubble .close-x:hover { + opacity: 0.7; } paper-ripple,
diff --git a/ui/file_manager/gallery/images/100/butterbar_close_button.png b/ui/file_manager/gallery/images/100/butterbar_close_button.png deleted file mode 100644 index 3c65c23..0000000 --- a/ui/file_manager/gallery/images/100/butterbar_close_button.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/gallery/images/100/slider_thumb.png b/ui/file_manager/gallery/images/100/slider_thumb.png deleted file mode 100644 index cb2d712..0000000 --- a/ui/file_manager/gallery/images/100/slider_thumb.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/gallery/images/200/butterbar_close_button.png b/ui/file_manager/gallery/images/200/butterbar_close_button.png deleted file mode 100644 index aa6c816..0000000 --- a/ui/file_manager/gallery/images/200/butterbar_close_button.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/gallery/images/200/slider_thumb.png b/ui/file_manager/gallery/images/200/slider_thumb.png deleted file mode 100644 index e100da626..0000000 --- a/ui/file_manager/gallery/images/200/slider_thumb.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/video_player/images/media/2x/drive.png b/ui/file_manager/video_player/images/media/2x/drive.png deleted file mode 100644 index b2cef71..0000000 --- a/ui/file_manager/video_player/images/media/2x/drive.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/video_player/images/media/2x/media_close.png b/ui/file_manager/video_player/images/media/2x/media_close.png deleted file mode 100644 index 2e19603..0000000 --- a/ui/file_manager/video_player/images/media/2x/media_close.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/video_player/images/media/2x/media_collapse.png b/ui/file_manager/video_player/images/media/2x/media_collapse.png deleted file mode 100644 index a940061..0000000 --- a/ui/file_manager/video_player/images/media/2x/media_collapse.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/video_player/images/media/2x/media_expand.png b/ui/file_manager/video_player/images/media/2x/media_expand.png deleted file mode 100644 index 20c2340..0000000 --- a/ui/file_manager/video_player/images/media/2x/media_expand.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/video_player/images/media/drive.png b/ui/file_manager/video_player/images/media/drive.png deleted file mode 100644 index 8f4b64e..0000000 --- a/ui/file_manager/video_player/images/media/drive.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/video_player/images/media/media_close.png b/ui/file_manager/video_player/images/media/media_close.png deleted file mode 100644 index 5980ea75..0000000 --- a/ui/file_manager/video_player/images/media/media_close.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/video_player/images/media/media_collapse.png b/ui/file_manager/video_player/images/media/media_collapse.png deleted file mode 100644 index 3ab1add2..0000000 --- a/ui/file_manager/video_player/images/media/media_collapse.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/video_player/images/media/media_expand.png b/ui/file_manager/video_player/images/media/media_expand.png deleted file mode 100644 index a228fbdf..0000000 --- a/ui/file_manager/video_player/images/media/media_expand.png +++ /dev/null Binary files differ
diff --git a/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc b/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc index 402d3c0..6a521c1 100644 --- a/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc +++ b/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc
@@ -99,6 +99,17 @@ return params_list; } +void DrmGpuDisplayManager::GetScanoutFormats( + gfx::AcceleratedWidget widget, + std::vector<gfx::BufferFormat>* scanout_formats) { + const std::vector<uint32_t>& fourcc_formats = + drm_device_manager_->GetDrmDevice(widget) + ->plane_manager() + ->GetSupportedFormats(); + for (auto& fourcc : fourcc_formats) + scanout_formats->push_back(GetBufferFormatFromFourCCFormat(fourcc)); +} + bool DrmGpuDisplayManager::TakeDisplayControl() { const DrmDeviceVector& devices = drm_device_manager_->GetDrmDevices(); bool status = true;
diff --git a/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h b/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h index 681a7cd..641286c2 100644 --- a/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h +++ b/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h
@@ -29,6 +29,11 @@ // displays is refreshed. std::vector<DisplaySnapshot_Params> GetDisplays(); + // Returns all scanout formats for |widget| representing a particular display + // controller or default display controller for kNullAcceleratedWidget. + void GetScanoutFormats(gfx::AcceleratedWidget widget, + std::vector<gfx::BufferFormat>* scanout_formats); + // Takes/releases the control of the DRM devices. bool TakeDisplayControl(); void RelinquishDisplayControl();
diff --git a/ui/ozone/platform/drm/gpu/drm_thread.cc b/ui/ozone/platform/drm/gpu/drm_thread.cc index 63ec6f96..e95883c9 100644 --- a/ui/ozone/platform/drm/gpu/drm_thread.cc +++ b/ui/ozone/platform/drm/gpu/drm_thread.cc
@@ -106,6 +106,12 @@ *buffer = GbmBuffer::CreateBuffer(gbm, format, size, usage); } +void DrmThread::GetScanoutFormats( + gfx::AcceleratedWidget widget, + std::vector<gfx::BufferFormat>* scanout_formats) { + display_manager_->GetScanoutFormats(widget, scanout_formats); +} + void DrmThread::SchedulePageFlip(gfx::AcceleratedWidget widget, const std::vector<OverlayPlane>& planes, const SwapCompletionCallback& callback) {
diff --git a/ui/ozone/platform/drm/gpu/drm_thread.h b/ui/ozone/platform/drm/gpu/drm_thread.h index 130b0dc..0edd26c7 100644 --- a/ui/ozone/platform/drm/gpu/drm_thread.h +++ b/ui/ozone/platform/drm/gpu/drm_thread.h
@@ -59,6 +59,8 @@ gfx::BufferUsage usage, scoped_refptr<GbmBuffer>* buffer); + void GetScanoutFormats(gfx::AcceleratedWidget widget, + std::vector<gfx::BufferFormat>* scanout_formats); void SchedulePageFlip(gfx::AcceleratedWidget widget, const std::vector<OverlayPlane>& planes, const SwapCompletionCallback& callback);
diff --git a/ui/ozone/platform/drm/gpu/drm_thread_proxy.cc b/ui/ozone/platform/drm/gpu/drm_thread_proxy.cc index b46e116..8ae223c 100644 --- a/ui/ozone/platform/drm/gpu/drm_thread_proxy.cc +++ b/ui/ozone/platform/drm/gpu/drm_thread_proxy.cc
@@ -39,4 +39,13 @@ return buffer; } +void DrmThreadProxy::GetScanoutFormats( + gfx::AcceleratedWidget widget, + std::vector<gfx::BufferFormat>* scanout_formats) { + PostSyncTask( + drm_thread_.task_runner(), + base::Bind(&DrmThread::GetScanoutFormats, base::Unretained(&drm_thread_), + widget, scanout_formats)); +} + } // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/drm_thread_proxy.h b/ui/ozone/platform/drm/gpu/drm_thread_proxy.h index 05e4b530..e603662 100644 --- a/ui/ozone/platform/drm/gpu/drm_thread_proxy.h +++ b/ui/ozone/platform/drm/gpu/drm_thread_proxy.h
@@ -33,6 +33,9 @@ gfx::BufferFormat format, gfx::BufferUsage usage); + void GetScanoutFormats(gfx::AcceleratedWidget widget, + std::vector<gfx::BufferFormat>* scanout_formats); + private: DrmThread drm_thread_;
diff --git a/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc b/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc index fb9157b..e9300cf 100644 --- a/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc +++ b/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
@@ -10,6 +10,7 @@ #include "build/build_config.h" #include "third_party/khronos/EGL/egl.h" #include "ui/ozone/common/egl_util.h" +#include "ui/ozone/platform/drm/common/drm_util.h" #include "ui/ozone/platform/drm/gpu/drm_thread_proxy.h" #include "ui/ozone/platform/drm/gpu/drm_window_proxy.h" #include "ui/ozone/platform/drm/gpu/gbm_buffer.h" @@ -103,6 +104,13 @@ new GbmSurfaceless(drm_thread_->CreateDrmWindowProxy(widget), this)); } +std::vector<gfx::BufferFormat> GbmSurfaceFactory::GetScanoutFormats( + gfx::AcceleratedWidget widget) { + std::vector<gfx::BufferFormat> scanout_formats; + drm_thread_->GetScanoutFormats(widget, &scanout_formats); + return scanout_formats; +} + scoped_refptr<ui::NativePixmap> GbmSurfaceFactory::CreateNativePixmap( gfx::AcceleratedWidget widget, gfx::Size size,
diff --git a/ui/ozone/platform/drm/gpu/gbm_surface_factory.h b/ui/ozone/platform/drm/gpu/gbm_surface_factory.h index 5beb886..107f9a6 100644 --- a/ui/ozone/platform/drm/gpu/gbm_surface_factory.h +++ b/ui/ozone/platform/drm/gpu/gbm_surface_factory.h
@@ -31,6 +31,8 @@ // SurfaceFactoryOzone: intptr_t GetNativeDisplay() override; const int32_t* GetEGLSurfaceProperties(const int32_t* desired_list) override; + std::vector<gfx::BufferFormat> GetScanoutFormats( + gfx::AcceleratedWidget widget) override; bool LoadEGLGLES2Bindings( AddGLLibraryCallback add_gl_library, SetGLGetProcAddressProcCallback set_gl_get_proc_address) override;
diff --git a/ui/ozone/public/surface_factory_ozone.cc b/ui/ozone/public/surface_factory_ozone.cc index b4930453..59d6d4f5 100644 --- a/ui/ozone/public/surface_factory_ozone.cc +++ b/ui/ozone/public/surface_factory_ozone.cc
@@ -44,6 +44,11 @@ return desired_attributes; } +std::vector<gfx::BufferFormat> SurfaceFactoryOzone::GetScanoutFormats( + gfx::AcceleratedWidget widget) { + return std::vector<gfx::BufferFormat>(); +} + scoped_refptr<ui::NativePixmap> SurfaceFactoryOzone::CreateNativePixmap( gfx::AcceleratedWidget widget, gfx::Size size,
diff --git a/ui/ozone/public/surface_factory_ozone.h b/ui/ozone/public/surface_factory_ozone.h index eaa353b..423048c 100644 --- a/ui/ozone/public/surface_factory_ozone.h +++ b/ui/ozone/public/surface_factory_ozone.h
@@ -100,6 +100,11 @@ // caller. desired_list contains list of desired EGL properties and values. virtual const int32_t* GetEGLSurfaceProperties(const int32_t* desired_list); + // Returns all scanout formats for |widget| representing a particular display + // controller or default display controller for kNullAcceleratedWidget. + virtual std::vector<gfx::BufferFormat> GetScanoutFormats( + gfx::AcceleratedWidget widget); + // Create a single native buffer to be used for overlay planes or zero copy // for |widget| representing a particular display controller or default // display controller for kNullAcceleratedWidget.
diff --git a/ui/views/window/frame_background.cc b/ui/views/window/frame_background.cc index a325dbf9b..0b2d4ae 100644 --- a/ui/views/window/frame_background.cc +++ b/ui/views/window/frame_background.cc
@@ -51,7 +51,8 @@ bottom_right_corner_ = bottom_right; } -void FrameBackground::PaintRestored(gfx::Canvas* canvas, View* view) const { +void FrameBackground::PaintRestored(gfx::Canvas* canvas, + const View* view) const { // Fill with the frame color first so we have a constant background for // areas not covered by the theme image. PaintFrameColor(canvas, view); @@ -119,7 +120,8 @@ left_edge_->width(), left_edge_height); } -void FrameBackground::PaintMaximized(gfx::Canvas* canvas, View* view) const { +void FrameBackground::PaintMaximized(gfx::Canvas* canvas, + const View* view) const { // We will be painting from -|maximized_top_inset_| to // -|maximized_top_inset_| + |theme_image_|->height(). If this is less than // |top_area_height_|, we need to paint the frame color to fill in the area @@ -141,7 +143,8 @@ canvas->DrawImageInt(*theme_overlay_image_, 0, -maximized_top_inset_); } -void FrameBackground::PaintFrameColor(gfx::Canvas* canvas, View* view) const { +void FrameBackground::PaintFrameColor(gfx::Canvas* canvas, + const View* view) const { // Fill the top area. canvas->FillRect(gfx::Rect(0, 0, view->width(), top_area_height_), frame_color_);
diff --git a/ui/views/window/frame_background.h b/ui/views/window/frame_background.h index c2278c1..757b6d4b 100644 --- a/ui/views/window/frame_background.h +++ b/ui/views/window/frame_background.h
@@ -64,15 +64,15 @@ // Paints the border for a standard, non-maximized window. Also paints the // background of the title bar area, since the top frame border and the // title bar background are a contiguous component. - void PaintRestored(gfx::Canvas* canvas, View* view) const; + void PaintRestored(gfx::Canvas* canvas, const View* view) const; // Paints the border for a maximized window, which does not include the // window edges. - void PaintMaximized(gfx::Canvas* canvas, View* view) const; + void PaintMaximized(gfx::Canvas* canvas, const View* view) const; private: // Fills the frame area with the frame color. - void PaintFrameColor(gfx::Canvas* canvas, View* view) const; + void PaintFrameColor(gfx::Canvas* canvas, const View* view) const; SkColor frame_color_; const gfx::ImageSkia* theme_image_;
diff --git a/ui/webui/resources/js/cr.js b/ui/webui/resources/js/cr.js index a38c59f..984a5c2 100644 --- a/ui/webui/resources/js/cr.js +++ b/ui/webui/resources/js/cr.js
@@ -313,48 +313,50 @@ } /** - * The mapping used by the sendWithCallback mechanism to tie the callback - * supplied to an invocation of sendWithCallback with the WebUI response - * sent by the browser in response to the chrome.send call. The mapping is - * from ID to callback function; the ID is generated by sendWithCallback and - * is unique across all invocations of said method. - * @type {!Object<Function>} + * The mapping used by the sendWithPromise mechanism to tie the Promise + * returned to callers with the corresponding WebUI response. The mapping is + * from ID to the Promise resolver function; the ID is generated by + * sendWithPromise and is unique across all invocations of said method. + * @type {!Object<!Function>} */ - var chromeSendCallbackMap = Object.create(null); + var chromeSendResolverMap = {}; /** * The named method the WebUI handler calls directly in response to a - * chrome.send call that expects a callback. The handler requires no knowledge + * chrome.send call that expects a response. The handler requires no knowledge * of the specific name of this method, as the name is passed to the handler * as the first argument in the arguments list of chrome.send. The handler * must pass the ID, also sent via the chrome.send arguments list, as the * first argument of the JS invocation; additionally, the handler may - * supply any number of other arguments that will be forwarded to the - * callback. - * @param {string} id The unique ID identifying the callback method this - * response is tied to. + * supply any number of other arguments that will be included in the response. + * @param {string} id The unique ID identifying the Promise this response is + * tied to. + * @param {...*} var_args Variable number of arguments to be included in the + * response. */ - function webUIResponse(id) { - chromeSendCallbackMap[id].apply( - null, Array.prototype.slice.call(arguments, 1)); - delete chromeSendCallbackMap[id]; + function webUIResponse(id, var_args) { + var resolverFn = chromeSendResolverMap[id]; + delete chromeSendResolverMap[id]; + // Promise#resolve accepts only one value, therefore wrapping all arguments + // passed from C++ to JS in an array. + resolverFn(Array.prototype.slice.call(arguments, 1)); } /** - * A variation of chrome.send which allows the client to receive a direct - * callback without requiring the handler to have specific knowledge of any - * JS internal method names or state. The callback will be removed from the - * mapping once it has fired. + * A variation of chrome.send, suitable for messages that expect a single + * response from C++. * @param {string} methodName The name of the WebUI handler API. - * @param {Array|undefined} args Arguments for the method call sent to the - * WebUI handler. Pass undefined if no args should be sent to the handler. - * @param {Function} callback A callback function which is called (indirectly) - * by the WebUI handler. + * @param {...*} var_args Varibale number of arguments to be forwarded to the + * C++ call. + * @return {!Promise} */ - function sendWithCallback(methodName, args, callback) { - var id = methodName + createUid(); - chromeSendCallbackMap[id] = callback; - chrome.send(methodName, ['cr.webUIResponse', id].concat(args || [])); + function sendWithPromise(methodName, var_args) { + var args = Array.prototype.slice.call(arguments, 1); + return new Promise(function(resolve, reject) { + var id = methodName + '_' + createUid(); + chromeSendResolverMap[id] = resolve; + chrome.send(methodName, ['cr.webUIResponse', id].concat(args)); + }); } /** @@ -403,7 +405,7 @@ getUid: getUid, makePublic: makePublic, webUIResponse: webUIResponse, - sendWithCallback: sendWithCallback, + sendWithPromise: sendWithPromise, webUIListenerCallback: webUIListenerCallback, addWebUIListener: addWebUIListener, PropertyKind: PropertyKind,