diff --git a/AUTHORS b/AUTHORS index 5c1cbd3..a54b0ae 100644 --- a/AUTHORS +++ b/AUTHORS
@@ -953,6 +953,7 @@ The Chromium Authors <*@chromium.org> The MathWorks, Inc. <binod.pant@mathworks.com> Torchmobile Inc. +Upwork <*@cloud.upwork.com> Venture 3 Systems LLC <*@venture3systems.com> Vewd Software AS <*@vewd.com> Yandex LLC <*@yandex-team.ru>
diff --git a/DEPS b/DEPS index d6d965d7..969c720 100644 --- a/DEPS +++ b/DEPS
@@ -79,11 +79,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': '1267efac7f0a530a9c93e2d20662d62bd9ccb542', + 'skia_revision': '904b08cf1fc00d188503531a98f68ffb14cb46eb', # 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': '8f392095a952a7e2218863a8a619163671659cc5', + 'v8_revision': '853bb1878452ccba1846c7e3ddfb3b2f9febde7d', # 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. @@ -91,7 +91,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': '3c43b4d1e6d08a74a61775b1b6013fe3ac266985', + 'angle_revision': '3582c0e2c3c12391f1a3f4a3a222e8d3920d9ba1', # 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. @@ -99,11 +99,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': 'b1d452eaeeb8272e37b87446511f2e0e95d27e6f', + 'swiftshader_revision': '680bcf50597a8a6939f9023a4c8ebed597f9c4ae', # 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': '26820b47434313b187d664ef702f48b1059bacb5', + 'pdfium_revision': '1dbea185e70973739d58b11b0e46bd361d6cf0d5', # 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. @@ -135,7 +135,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '8a42ad3cb185e340c32b20f657980fd057e3769f', + 'catapult_revision': '534191e5068d883cfcbf61085e1dc44f708373ba', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other.
diff --git a/android_webview/lib/aw_main_delegate.cc b/android_webview/lib/aw_main_delegate.cc index 50d03fa..c34cf1d0 100644 --- a/android_webview/lib/aw_main_delegate.cc +++ b/android_webview/lib/aw_main_delegate.cc
@@ -157,8 +157,6 @@ CommandLineHelper::AddDisabledFeature(*cl, media::kMediaDrmPersistentLicense.name); - CommandLineHelper::AddDisabledFeature(*cl, features::kMojoInputMessages.name); - CommandLineHelper::AddEnabledFeature( *cl, autofill::features::kAutofillSkipComparingInferredLabels.name);
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc index 35722e09..ce547c0 100644 --- a/ash/accelerators/accelerator_controller.cc +++ b/ash/accelerators/accelerator_controller.cc
@@ -178,6 +178,7 @@ new DeprecatedAcceleratorNotificationDelegate, kNotificationKeyboardIcon, SystemNotificationWarningLevel::NORMAL); notification->set_clickable(true); + notification->set_priority(message_center::SYSTEM_PRIORITY); message_center::MessageCenter::Get()->AddNotification( std::move(notification)); } @@ -821,6 +822,7 @@ message_center::RichNotificationData(), nullptr, kNotificationAccessibilityIcon, SystemNotificationWarningLevel::NORMAL); + notification->set_priority(message_center::SYSTEM_PRIORITY); message_center::MessageCenter::Get()->AddNotification( std::move(notification)); } else {
diff --git a/ash/display/display_util.cc b/ash/display/display_util.cc index 52260c1..97bb803 100644 --- a/ash/display/display_util.cc +++ b/ash/display/display_util.cc
@@ -185,6 +185,7 @@ data, new DisplayErrorNotificationDelegate, kNotificationMonitorWarningIcon, message_center::SystemNotificationWarningLevel::WARNING); + notification->set_priority(message_center::SYSTEM_PRIORITY); message_center::MessageCenter::Get()->AddNotification( std::move(notification)); }
diff --git a/ash/highlighter/OWNERS b/ash/highlighter/OWNERS new file mode 100644 index 0000000..b611d65 --- /dev/null +++ b/ash/highlighter/OWNERS
@@ -0,0 +1,4 @@ +kaznacheev@chromium.org +reveman@chromium.org + +# COMPONENT: UI>Shell
diff --git a/ash/laser/OWNERS b/ash/laser/OWNERS new file mode 100644 index 0000000..7d1762be --- /dev/null +++ b/ash/laser/OWNERS
@@ -0,0 +1,4 @@ +reveman@chromium.org +sammiequon@chromium.org + +# COMPONENT: UI>Shell
diff --git a/ash/system/power/tray_power.cc b/ash/system/power/tray_power.cc index 90bf73e..7abdb3b8 100644 --- a/ash/system/power/tray_power.cc +++ b/ash/system/power/tray_power.cc
@@ -235,6 +235,7 @@ message_center::RichNotificationData(), new UsbNotificationDelegate(this), kNotificationLowPowerChargerIcon, message_center::SystemNotificationWarningLevel::WARNING); + notification->set_priority(message_center::SYSTEM_PRIORITY); message_center_->AddNotification(std::move(notification)); return true; } else if (!usb_charger_is_connected && usb_charger_was_connected_) {
diff --git a/ash/system/screen_layout_observer.cc b/ash/system/screen_layout_observer.cc index f6a10ab0..72cf608 100644 --- a/ash/system/screen_layout_observer.cc +++ b/ash/system/screen_layout_observer.cc
@@ -375,6 +375,7 @@ kNotificationScreenIcon, message_center::SystemNotificationWarningLevel::NORMAL); notification->set_clickable(true); + notification->set_priority(message_center::SYSTEM_PRIORITY); Shell::Get()->metrics()->RecordUserMetricsAction( UMA_STATUS_AREA_DISPLAY_NOTIFICATION_CREATED);
diff --git a/ash/system/tray_accessibility.cc b/ash/system/tray_accessibility.cc index 7621477..9525744 100644 --- a/ash/system/tray_accessibility.cc +++ b/ash/system/tray_accessibility.cc
@@ -609,6 +609,7 @@ kNotifierAccessibility), options, nullptr, GetNotificationIcon(being_enabled), message_center::SystemNotificationWarningLevel::NORMAL); + notification->set_priority(message_center::SYSTEM_PRIORITY); message_center->AddNotification(std::move(notification)); }
diff --git a/base/memory/raw_scoped_refptr_mismatch_checker.h b/base/memory/raw_scoped_refptr_mismatch_checker.h index c4633d95..ab8b2ab 100644 --- a/base/memory/raw_scoped_refptr_mismatch_checker.h +++ b/base/memory/raw_scoped_refptr_mismatch_checker.h
@@ -26,7 +26,9 @@ struct IsRefCountedType : std::false_type {}; template <typename T> -struct IsRefCountedType<T, void_t<decltype(&T::AddRef), decltype(&T::Release)>> +struct IsRefCountedType<T, + void_t<decltype(std::declval<T*>()->AddRef()), + decltype(std::declval<T*>()->Release())>> : std::true_type {}; template <typename T>
diff --git a/base/task_scheduler/scheduler_worker.cc b/base/task_scheduler/scheduler_worker.cc index 899cd53..7ed7746 100644 --- a/base/task_scheduler/scheduler_worker.cc +++ b/base/task_scheduler/scheduler_worker.cc
@@ -99,6 +99,9 @@ wake_up_event_.Reset(); } + // Important: It is unsafe to access unowned state (e.g. |task_tracker_|) + // after invoking OnMainExit(). + outer_->delegate_->OnMainExit(outer_.get()); // Break the ownership circle between SchedulerWorker and Thread.
diff --git a/base/task_scheduler/scheduler_worker.h b/base/task_scheduler/scheduler_worker.h index 1d28cc5..98d982d 100644 --- a/base/task_scheduler/scheduler_worker.h +++ b/base/task_scheduler/scheduler_worker.h
@@ -76,7 +76,10 @@ // SchedulerWorker::WakeUp() virtual void WaitForWork(WaitableEvent* wake_up_event); - // Called by |worker|'s thread right before the main function exits. + // Called by |worker|'s thread right before the main function exits. The + // Delegate is free to release any associated resources in this call. It is + // guaranteed that SchedulerWorker won't access the Delegate or the + // TaskTracker after calling OnMainExit() on the Delegate. virtual void OnMainExit(SchedulerWorker* worker) {} };
diff --git a/base/task_scheduler/scheduler_worker_pool_impl.cc b/base/task_scheduler/scheduler_worker_pool_impl.cc index 00f32c6a..6ecf6bcd 100644 --- a/base/task_scheduler/scheduler_worker_pool_impl.cc +++ b/base/task_scheduler/scheduler_worker_pool_impl.cc
@@ -24,6 +24,7 @@ #include "base/task_scheduler/task_traits.h" #include "base/threading/platform_thread.h" #include "base/threading/scoped_blocking_call.h" +#include "base/threading/thread_checker.h" #include "base/threading/thread_restrictions.h" #if defined(OS_WIN) @@ -112,13 +113,15 @@ // pool. Called from GetWork() when no work is available. bool CanCleanupLockRequired(SchedulerWorker* worker); - // Calls cleanup on |worker| and removes it from the pool. + // Calls cleanup on |worker| and removes it from the pool. Called from + // GetWork() when no work is available and CanCleanupLockRequired() returns + // true. void CleanupLockRequired(SchedulerWorker* worker); // Called in GetWork() when a worker becomes idle. void OnWorkerBecomesIdleLockRequired(SchedulerWorker* worker); - SchedulerWorkerPoolImpl* outer_; + SchedulerWorkerPoolImpl* const outer_; // Time of the last detach. TimeTicks last_detach_time_; @@ -151,6 +154,9 @@ std::unique_ptr<win::ScopedWindowsThreadEnvironment> win_thread_environment_; #endif // defined(OS_WIN) + // Verifies that specific calls are always made from the worker thread. + THREAD_CHECKER(worker_thread_checker_); + DISALLOW_COPY_AND_ASSIGN(SchedulerWorkerDelegateImpl); }; @@ -213,6 +219,7 @@ worker_capacity_ = params.max_threads(); initial_worker_capacity_ = worker_capacity_; + DCHECK_LE(initial_worker_capacity_, kMaxNumberOfWorkers); suggested_reclaim_time_ = params.suggested_reclaim_time(); backward_compatibility_ = params.backward_compatibility(); worker_environment_ = worker_environment; @@ -300,6 +307,8 @@ { AutoSchedulerLock auto_lock(lock_); + DCHECK_GT(workers_.size(), size_t(0)) << "Joined an unstarted worker pool."; + DCHECK(!CanWorkerCleanupForTestingLockRequired() || suggested_reclaim_time_.is_max()) << "Workers can cleanup during join."; @@ -313,10 +322,20 @@ worker->JoinForTesting(); #if DCHECK_IS_ON() - AutoSchedulerLock auto_lock(lock_); - DCHECK(workers_ == workers_copy); + { + AutoSchedulerLock auto_lock(lock_); + DCHECK(workers_ == workers_copy); + } #endif + // Make sure recently cleaned up workers (ref. + // SchedulerWorkerDelegateImpl::CleanupLockRequired()) had time to exit as + // they have a raw reference to |this| (and to TaskTracker) which can + // otherwise result in racy use-after-frees per no longer being part of + // |workers_| and hence not being explicitly joined above : + // https://crbug.com/810464. + no_workers_remaining_for_testing_.Wait(); + DCHECK(!join_for_testing_returned_.IsSignaled()); join_for_testing_returned_.Signal(); } @@ -347,8 +366,15 @@ SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl:: SchedulerWorkerDelegateImpl(SchedulerWorkerPoolImpl* outer) - : outer_(outer) {} + : outer_(outer) { + // Bound in OnMainEntry(). + DETACH_FROM_THREAD(worker_thread_checker_); + outer_->live_workers_count_for_testing_.Increment(); +} + +// OnMainExit() handles the thread-affine cleanup; SchedulerWorkerDelegateImpl +// can thereafter safely be deleted from any thread. SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl:: ~SchedulerWorkerDelegateImpl() = default; @@ -359,6 +385,8 @@ void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::OnMainEntry( SchedulerWorker* worker) { + DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); + { #if DCHECK_IS_ON() AutoSchedulerLock auto_lock(outer_->lock_); @@ -390,6 +418,8 @@ scoped_refptr<Sequence> SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::GetWork( SchedulerWorker* worker) { + DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); + DCHECK(!is_running_task_); { AutoSchedulerLock auto_lock(outer_->lock_); @@ -455,6 +485,8 @@ } void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::DidRunTask() { + DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); + DCHECK(may_block_start_time_.is_null()); DCHECK(!incremented_worker_capacity_since_blocked_); DCHECK(is_running_task_); @@ -466,27 +498,34 @@ void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl:: ReEnqueueSequence(scoped_refptr<Sequence> sequence) { + DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); + const SequenceSortKey sequence_sort_key = sequence->GetSortKey(); outer_->shared_priority_queue_.BeginTransaction()->Push(std::move(sequence), sequence_sort_key); - // The thread calling this method will soon call GetWork(). Therefore, there - // is no need to wake up a worker to run the sequence that was just inserted - // into |outer_->shared_priority_queue_|. + // This worker will soon call GetWork(). Therefore, there is no need to wake + // up a worker to run the sequence that was just inserted into + // |outer_->shared_priority_queue_|. } TimeDelta SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl:: GetSleepTimeout() { + DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); return outer_->suggested_reclaim_time_; } bool SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl:: CanCleanupLockRequired(SchedulerWorker* worker) { + DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); + return worker != outer_->PeekAtIdleWorkersStackLockRequired() && LIKELY(outer_->CanWorkerCleanupForTestingLockRequired()); } void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::CleanupLockRequired( SchedulerWorker* worker) { + DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); + outer_->lock_.AssertAcquired(); outer_->num_tasks_before_detach_histogram_->Add(num_tasks_since_last_detach_); outer_->cleanup_timestamps_.push(TimeTicks::Now()); @@ -502,6 +541,8 @@ void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl:: OnWorkerBecomesIdleLockRequired(SchedulerWorker* worker) { + DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); + outer_->lock_.AssertAcquired(); // Record the TaskScheduler.NumTasksBetweenWaits histogram. After GetWork() // returns nullptr, the SchedulerWorker will perform a wait on its @@ -515,23 +556,32 @@ void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::OnMainExit( SchedulerWorker* worker) { -#if DCHECK_IS_ON() - bool shutdown_complete = outer_->task_tracker_->IsShutdownComplete(); - AutoSchedulerLock auto_lock(outer_->lock_); + DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); - // |worker| should already have been removed from the idle workers stack and - // |workers_| by the time the thread is about to exit. (except in the cases - // where the pool is no longer going to be used - in which case, it's fine for - // there to be invalid workers in the pool. - if (!shutdown_complete && !outer_->join_for_testing_started_.IsSet()) { - DCHECK(!outer_->idle_workers_stack_.Contains(worker)); - DCHECK(!ContainsWorker(outer_->workers_, worker)); +#if DCHECK_IS_ON() + { + bool shutdown_complete = outer_->task_tracker_->IsShutdownComplete(); + AutoSchedulerLock auto_lock(outer_->lock_); + + // |worker| should already have been removed from the idle workers stack and + // |workers_| by the time the thread is about to exit. (except in the cases + // where the pool is no longer going to be used - in which case, it's fine + // for there to be invalid workers in the pool. + if (!shutdown_complete && !outer_->join_for_testing_started_.IsSet()) { + DCHECK(!outer_->idle_workers_stack_.Contains(worker)); + DCHECK(!ContainsWorker(outer_->workers_, worker)); + } } #endif #if defined(OS_WIN) win_thread_environment_.reset(); #endif // defined(OS_WIN) + + if (!outer_->live_workers_count_for_testing_.Decrement()) { + DCHECK(!outer_->no_workers_remaining_for_testing_.IsSignaled()); + outer_->no_workers_remaining_for_testing_.Signal(); + } } void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl:: @@ -561,6 +611,8 @@ void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::BlockingStarted( BlockingType blocking_type) { + DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); + // Blocking calls made outside of tasks should not influence the capacity // count as no task is running. if (!is_running_task_) @@ -578,6 +630,8 @@ void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl:: BlockingTypeUpgraded() { + DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); + { AutoSchedulerLock auto_lock(outer_->lock_); @@ -598,6 +652,8 @@ } void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::BlockingEnded() { + DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); + // Ignore blocking calls made outside of tasks. if (!is_running_task_) return; @@ -615,6 +671,8 @@ } void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::MayBlockEntered() { + DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); + { AutoSchedulerLock auto_lock(outer_->lock_); @@ -627,6 +685,8 @@ } void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::WillBlockEntered() { + DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); + bool wake_up_allowed = false; { std::unique_ptr<PriorityQueue::Transaction> shared_transaction(
diff --git a/base/task_scheduler/scheduler_worker_pool_impl.h b/base/task_scheduler/scheduler_worker_pool_impl.h index b424e759..b9583d2 100644 --- a/base/task_scheduler/scheduler_worker_pool_impl.h +++ b/base/task_scheduler/scheduler_worker_pool_impl.h
@@ -11,6 +11,7 @@ #include <string> #include <vector> +#include "base/atomic_ref_count.h" #include "base/base_export.h" #include "base/containers/stack.h" #include "base/logging.h" @@ -19,6 +20,7 @@ #include "base/strings/string_piece.h" #include "base/synchronization/atomic_flag.h" #include "base/synchronization/condition_variable.h" +#include "base/synchronization/waitable_event.h" #include "base/task_runner.h" #include "base/task_scheduler/priority_queue.h" #include "base/task_scheduler/scheduler_lock.h" @@ -239,6 +241,22 @@ // All workers owned by this worker pool. std::vector<scoped_refptr<SchedulerWorker>> workers_; + // The number of live worker threads with a reference to this + // SchedulerWorkerPoolImpl. This is always greater-than-or-equal to + // |workers_.size()| as it includes those as well as reclaimed threads that + // haven't yet completed their exit. JoinForTesting() must wait for this count + // to reach 0 before returning. + AtomicRefCount live_workers_count_for_testing_{0}; + // Signaled when |live_workers_count_| reaches 0 (which can only happen after + // initiating JoinForTesting() as the pool always keeps at least one idle + // worker otherwise). Note: a Semaphore would be a better suited construct + // than |live_workers_count_for_testing_| + + // |no_workers_remaining_for_testing_| but //base currently doesn't provide it + // and this use case doesn't justify it. + WaitableEvent no_workers_remaining_for_testing_{ + WaitableEvent::ResetPolicy::MANUAL, + WaitableEvent::InitialState::NOT_SIGNALED}; + // Workers can be added as needed up until there are |worker_capacity_| // workers. size_t worker_capacity_ = 0;
diff --git a/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc b/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc index 117d6e8..54b54ce 100644 --- a/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc +++ b/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc
@@ -1536,5 +1536,62 @@ task_tracker_.FlushForTesting(); } +// Verify that worker detachement doesn't race with worker cleanup, regression +// test for https://crbug.com/810464. +TEST(TaskSchedulerWorkerPoolTest, RacyCleanup) { + constexpr size_t kWorkerCapacity = 256; + constexpr TimeDelta kReclaimTimeForRacyCleanupTest = + TimeDelta::FromMilliseconds(10); + + TaskTracker task_tracker("Test"); + DelayedTaskManager delayed_task_manager; + scoped_refptr<TaskRunner> service_thread_task_runner = + MakeRefCounted<TestSimpleTaskRunner>(); + delayed_task_manager.Start(service_thread_task_runner); + SchedulerWorkerPoolImpl worker_pool("RacyCleanupTestWorkerPool", "A", + ThreadPriority::NORMAL, &task_tracker, + &delayed_task_manager); + worker_pool.Start(SchedulerWorkerPoolParams(kWorkerCapacity, + kReclaimTimeForRacyCleanupTest), + service_thread_task_runner, + SchedulerWorkerPoolImpl::WorkerEnvironment::NONE); + + scoped_refptr<TaskRunner> task_runner = + worker_pool.CreateTaskRunnerWithTraits({WithBaseSyncPrimitives()}); + + WaitableEvent threads_running(WaitableEvent::ResetPolicy::AUTOMATIC, + WaitableEvent::InitialState::NOT_SIGNALED); + WaitableEvent unblock_threads(WaitableEvent::ResetPolicy::MANUAL, + WaitableEvent::InitialState::NOT_SIGNALED); + RepeatingClosure threads_running_barrier = BarrierClosure( + kWorkerCapacity, + BindOnce(&WaitableEvent::Signal, Unretained(&threads_running))); + + for (size_t i = 0; i < kWorkerCapacity; ++i) { + task_runner->PostTask( + FROM_HERE, + BindOnce( + [](OnceClosure on_running, WaitableEvent* unblock_threads) { + std::move(on_running).Run(); + unblock_threads->Wait(); + }, + threads_running_barrier, Unretained(&unblock_threads))); + } + + // Wait for all workers to be ready and release them all at once. + threads_running.Wait(); + unblock_threads.Signal(); + + // Sleep to wakeup precisely when all workers are going to try to cleanup per + // being idle. + PlatformThread::Sleep(kReclaimTimeForRacyCleanupTest); + + worker_pool.DisallowWorkerCleanupForTesting(); + worker_pool.JoinForTesting(); + + // Unwinding this test will be racy if worker cleanup can race with + // SchedulerWorkerPoolImpl destruction : https://crbug.com/810464. +} + } // namespace internal } // namespace base
diff --git a/base/test/launcher/test_launcher_nacl_nonsfi.cc b/base/test/launcher/test_launcher_nacl_nonsfi.cc index 2199e5a..bdc4f67 100644 --- a/base/test/launcher/test_launcher_nacl_nonsfi.cc +++ b/base/test/launcher/test_launcher_nacl_nonsfi.cc
@@ -80,13 +80,15 @@ } private: - bool CreateTemporaryFile(base::FilePath* path) override { + bool CreateResultsFile(base::FilePath* path) override { if (!base::CreateNewTempDirectory(base::FilePath::StringType(), path)) return false; *path = path->AppendASCII("test_results.xml"); return true; } + bool CreateTemporaryFile(base::FilePath* path) override { return false; } + bool GetTests(std::vector<base::TestIdentifier>* output) override { base::FilePath output_file; if (!base::CreateTemporaryFile(&output_file)) { @@ -112,7 +114,8 @@ base::CommandLine GetCommandLineForChildGTestProcess( const std::vector<std::string>& test_names, - const base::FilePath& output_file) override { + const base::FilePath& output_file, + const base::FilePath& flag_file) override { base::CommandLine cmd_line(test_path_); cmd_line.AppendSwitchPath( switches::kTestLauncherOutput, output_file);
diff --git a/base/test/launcher/unit_test_launcher.cc b/base/test/launcher/unit_test_launcher.cc index 17be529..f7bae466 100644 --- a/base/test/launcher/unit_test_launcher.cc +++ b/base/test/launcher/unit_test_launcher.cc
@@ -121,31 +121,36 @@ return true; } - bool CreateTemporaryFile(base::FilePath* path) override { + bool CreateResultsFile(base::FilePath* path) override { if (!CreateNewTempDirectory(FilePath::StringType(), path)) return false; *path = path->AppendASCII("test_results.xml"); return true; } + bool CreateTemporaryFile(base::FilePath* path) override { + if (!temp_dir_.IsValid() && !temp_dir_.CreateUniqueTempDir()) + return false; + return CreateTemporaryFileInDir(temp_dir_.GetPath(), path); + } + CommandLine GetCommandLineForChildGTestProcess( const std::vector<std::string>& test_names, - const base::FilePath& output_file) override { + const base::FilePath& output_file, + const base::FilePath& flag_file) override { CommandLine new_cmd_line(*CommandLine::ForCurrentProcess()); - CHECK(temp_dir_.IsValid() || temp_dir_.CreateUniqueTempDir()); - FilePath temp_file; - CHECK(CreateTemporaryFileInDir(temp_dir_.GetPath(), &temp_file)); + CHECK(base::PathExists(flag_file)); + std::string long_flags( std::string("--") + kGTestFilterFlag + "=" + JoinString(test_names, ":")); CHECK_EQ(static_cast<int>(long_flags.size()), - WriteFile(temp_file, - long_flags.data(), + WriteFile(flag_file, long_flags.data(), static_cast<int>(long_flags.size()))); new_cmd_line.AppendSwitchPath(switches::kTestLauncherOutput, output_file); - new_cmd_line.AppendSwitchPath(kGTestFlagfileFlag, temp_file); + new_cmd_line.AppendSwitchPath(kGTestFlagfileFlag, flag_file); new_cmd_line.AppendSwitch(kSingleProcessTestsFlag); return new_cmd_line; @@ -417,19 +422,22 @@ const std::vector<std::string>& test_names() { return test_names_; } int launch_flags() { return launch_flags_; } const FilePath& output_file() { return output_file_; } + const FilePath& flag_file() { return flag_file_; } protected: UnitTestProcessLifetimeObserver(TestLauncher* test_launcher, UnitTestPlatformDelegate* platform_delegate, const std::vector<std::string>& test_names, int launch_flags, - const FilePath& output_file) + const FilePath& output_file, + const FilePath& flag_file) : ProcessLifetimeObserver(), test_launcher_(test_launcher), platform_delegate_(platform_delegate), test_names_(test_names), launch_flags_(launch_flags), - output_file_(output_file) {} + output_file_(output_file), + flag_file_(flag_file) {} SEQUENCE_CHECKER(sequence_checker_); @@ -439,6 +447,7 @@ const std::vector<std::string> test_names_; const int launch_flags_; const FilePath output_file_; + const FilePath flag_file_; DISALLOW_COPY_AND_ASSIGN(UnitTestProcessLifetimeObserver); }; @@ -451,12 +460,14 @@ UnitTestPlatformDelegate* platform_delegate, const std::vector<std::string>& test_names, int launch_flags, - const FilePath& output_file) + const FilePath& output_file, + const FilePath& flag_file) : UnitTestProcessLifetimeObserver(test_launcher, platform_delegate, test_names, launch_flags, - output_file) {} + output_file, + flag_file) {} ~ParallelUnitTestProcessLifetimeObserver() override = default; private: @@ -486,6 +497,8 @@ // The temporary file's directory is also temporary. DeleteFile(output_file().DirName(), true); + if (!flag_file().empty()) + DeleteFile(flag_file(), false); } class SerialUnitTestProcessLifetimeObserver @@ -497,12 +510,14 @@ const std::vector<std::string>& test_names, int launch_flags, const FilePath& output_file, + const FilePath& flag_file, std::vector<std::string>&& next_test_names) : UnitTestProcessLifetimeObserver(test_launcher, platform_delegate, test_names, launch_flags, - output_file), + output_file, + flag_file), next_test_names_(std::move(next_test_names)) {} ~SerialUnitTestProcessLifetimeObserver() override = default; @@ -539,6 +554,9 @@ // The temporary file's directory is also temporary. DeleteFile(output_file().DirName(), true); + if (!flag_file().empty()) + DeleteFile(flag_file(), false); + ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, BindOnce(&RunUnitTestsSerially, test_launcher(), platform_delegate(), @@ -609,15 +627,18 @@ // per run to ensure clean state and make it possible to launch multiple // processes in parallel. FilePath output_file; - CHECK(platform_delegate->CreateTemporaryFile(&output_file)); + CHECK(platform_delegate->CreateResultsFile(&output_file)); + FilePath flag_file; + platform_delegate->CreateTemporaryFile(&flag_file); auto observer = std::make_unique<SerialUnitTestProcessLifetimeObserver>( test_launcher, platform_delegate, std::vector<std::string>(1, test_names.back()), launch_flags, output_file, + flag_file, std::vector<std::string>(test_names.begin(), test_names.end() - 1)); CommandLine cmd_line(platform_delegate->GetCommandLineForChildGTestProcess( - observer->test_names(), output_file)); + observer->test_names(), output_file, flag_file)); TestLauncher::LaunchOptions launch_options; launch_options.flags = launch_flags; @@ -639,13 +660,16 @@ // per run to ensure clean state and make it possible to launch multiple // processes in parallel. FilePath output_file; - CHECK(platform_delegate->CreateTemporaryFile(&output_file)); + CHECK(platform_delegate->CreateResultsFile(&output_file)); + FilePath flag_file; + platform_delegate->CreateTemporaryFile(&flag_file); auto observer = std::make_unique<ParallelUnitTestProcessLifetimeObserver>( - test_launcher, platform_delegate, test_names, launch_flags, output_file); + test_launcher, platform_delegate, test_names, launch_flags, output_file, + flag_file); CommandLine cmd_line(platform_delegate->GetCommandLineForChildGTestProcess( - test_names, output_file)); + test_names, output_file, flag_file)); // Adjust the timeout depending on how many tests we're running // (note that e.g. the last batch of tests will be smaller).
diff --git a/base/test/launcher/unit_test_launcher.h b/base/test/launcher/unit_test_launcher.h index 2ae2a48..219e136 100644 --- a/base/test/launcher/unit_test_launcher.h +++ b/base/test/launcher/unit_test_launcher.h
@@ -59,7 +59,11 @@ // must put the result in |output| and return true on success. virtual bool GetTests(std::vector<TestIdentifier>* output) = 0; - // Called to create a temporary file. The delegate must put the resulting + // Called to create a temporary for storing test results. The delegate + // must put the resulting path in |path| and return true on success. + virtual bool CreateResultsFile(base::FilePath* path) = 0; + + // Called to create a new temporary file. The delegate must put the resulting // path in |path| and return true on success. virtual bool CreateTemporaryFile(base::FilePath* path) = 0; @@ -68,7 +72,8 @@ // (e.g. "A.B"), |output_file| is path to the GTest XML output file. virtual CommandLine GetCommandLineForChildGTestProcess( const std::vector<std::string>& test_names, - const base::FilePath& output_file) = 0; + const base::FilePath& output_file, + const base::FilePath& flag_file) = 0; // Returns wrapper to use for child GTest process. Empty string means // no wrapper.
diff --git a/base/threading/thread_restrictions.h b/base/threading/thread_restrictions.h index 7090f2a..e63c406 100644 --- a/base/threading/thread_restrictions.h +++ b/base/threading/thread_restrictions.h
@@ -306,6 +306,8 @@ ThreadRestrictionsTest, ScopedAllowBaseSyncPrimitivesOutsideBlockingScopeResetsState); friend class ::KeyStorageLinux; + friend class content::SynchronousCompositor; + friend class content::SynchronousCompositorHost; friend class content::SynchronousCompositorSyncCallBridge; friend class midi::TaskService; // https://crbug.com/796830 @@ -409,8 +411,6 @@ friend class content::NestedMessagePumpAndroid; friend class content::ScopedAllowWaitForAndroidLayoutTests; friend class content::ScopedAllowWaitForDebugURL; - friend class content::SynchronousCompositor; - friend class content::SynchronousCompositorHost; friend class ::HistogramSynchronizer; friend class internal::TaskTracker; friend class cc::CompletionEvent;
diff --git a/base/unguessable_token.cc b/base/unguessable_token.cc index 489bf62..0d8aad3 100644 --- a/base/unguessable_token.cc +++ b/base/unguessable_token.cc
@@ -14,7 +14,7 @@ : high_(high), low_(low) {} std::string UnguessableToken::ToString() const { - return base::StringPrintf("%08" PRIX64 "%08" PRIX64, high_, low_); + return base::StringPrintf("%016" PRIX64 "%016" PRIX64, high_, low_); } // static
diff --git a/base/unguessable_token_unittest.cc b/base/unguessable_token_unittest.cc index 287fca31..b70cc724 100644 --- a/base/unguessable_token_unittest.cc +++ b/base/unguessable_token_unittest.cc
@@ -78,18 +78,41 @@ EXPECT_EQ(token, deserialized); } -TEST(UnguessableTokenTest, VerifyToString) { - UnguessableToken token = UnguessableToken::Deserialize(0x123, 0xABC); - std::string expected = "0000012300000ABC"; +// Common case (~88% of the time) - no leading zeroes in high_ nor low_. +TEST(UnguessableTokenTest, VerifyToString1) { + UnguessableToken token = + UnguessableToken::Deserialize(0x1234567890ABCDEF, 0xFEDCBA0987654321); + std::string expected = "1234567890ABCDEFFEDCBA0987654321"; EXPECT_EQ(expected, token.ToString()); - std::string expected_stream = "(0000012300000ABC)"; + std::string expected_stream = "(1234567890ABCDEFFEDCBA0987654321)"; std::stringstream stream; stream << token; EXPECT_EQ(expected_stream, stream.str()); } +// Less common case - leading zeroes in high_ or low_ (testing with both). +TEST(UnguessableTokenTest, VerifyToString2) { + UnguessableToken token = UnguessableToken::Deserialize(0x123, 0xABC); + std::string expected = "00000000000001230000000000000ABC"; + + EXPECT_EQ(expected, token.ToString()); + + std::string expected_stream = "(00000000000001230000000000000ABC)"; + std::stringstream stream; + stream << token; + EXPECT_EQ(expected_stream, stream.str()); +} + +TEST(UnguessableTokenTest, VerifyToStringUniqueness) { + const UnguessableToken token1 = + UnguessableToken::Deserialize(0x0000000012345678, 0x0000000123456789); + const UnguessableToken token2 = + UnguessableToken::Deserialize(0x0000000123456781, 0x0000000023456789); + EXPECT_NE(token1.ToString(), token2.ToString()); +} + TEST(UnguessableTokenTest, VerifySmallerThanOperator) { // Deserialize is used for testing purposes. // Use UnguessableToken::Create() in production code instead.
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 2836144..4dad904f 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -364,8 +364,8 @@ java_cpp_enum("chrome_vr_android_java_enums_srcjar") { sources = [ - "//chrome/browser/android/vr_shell/vr_core_info.h", - "//chrome/browser/android/vr_shell/vr_shell_delegate.h", + "//chrome/browser/android/vr/vr_core_info.h", + "//chrome/browser/android/vr/vr_shell_delegate.h", "//chrome/browser/vr/text_edit_action.h", "//chrome/browser/vr/ui_unsupported_mode.h", ]
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java index c759875..11d0855 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -87,6 +87,7 @@ import org.chromium.chrome.browser.init.AsyncInitializationActivity; import org.chromium.chrome.browser.init.ProcessInitializationHandler; import org.chromium.chrome.browser.locale.LocaleManager; +import org.chromium.chrome.browser.media.PictureInPicture; import org.chromium.chrome.browser.media.PictureInPictureController; import org.chromium.chrome.browser.metrics.LaunchMetrics; import org.chromium.chrome.browser.metrics.StartupMetrics; @@ -855,6 +856,11 @@ FeatureUtilities.setIsInMultiWindowMode( MultiWindowUtils.getInstance().isInMultiWindowMode(this)); + if (getActivityTab() != null) { + getActivityTab().setPictureInPictureEnabled( + PictureInPicture.isEnabled(getApplicationContext())); + } + if (mPictureInPictureController != null) { mPictureInPictureController.cleanup(this); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPicture.java b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPicture.java new file mode 100644 index 0000000..cefcc79 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPicture.java
@@ -0,0 +1,38 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.media; + +import android.app.AppOpsManager; +import android.content.Context; +import android.os.Build; + +/** + * Utility for determining if Picture-in-Picture is available and whether the user has disabled + * Picture-in-Picture for Chrome using the system's per-application settings. + */ +public abstract class PictureInPicture { + private PictureInPicture() {} + + /** + * Determines whether Picture-is-Picture is enabled for the app represented by |context|. + * Picture-in-Picture may be disabled because either the user, or a management tool, has + * explicitly disallowed the Chrome App to enter Picture-in-Picture. + * + * @param context The context to check of whether it can enter Picture-in-Picture. + * @return boolean true if Picture-In-Picture is enabled, otherwise false. + */ + public static boolean isEnabled(Context context) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + return false; + } + + final AppOpsManager appOpsManager = + (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); + final int status = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_PICTURE_IN_PICTURE, + context.getApplicationInfo().uid, context.getPackageName()); + + return (status == AppOpsManager.MODE_ALLOWED); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureController.java b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureController.java index d31dd23..9235dfe8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureController.java
@@ -102,9 +102,10 @@ assert LibraryLoader.isInitialized(); if (!ChromeFeatureList.isEnabled(ChromeFeatureList.VIDEO_PERSISTENCE)) return false; - // Only auto-PiP if there is a playing fullscreen video. + // Only auto-PiP if there is a playing fullscreen video that allows PiP. if (!AppHooks.get().shouldDetectVideoFullscreen() - || !webContents.hasActiveEffectivelyFullscreenVideo()) { + || !webContents.hasActiveEffectivelyFullscreenVideo() + || !webContents.isPictureInPictureAllowedForFullscreenVideo()) { recordAttemptResult(METRICS_ATTEMPT_RESULT_NO_VIDEO); return false; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java index f73d005..9c0c511 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -3370,6 +3370,15 @@ } /** + * Configures web preferences for enabling Picture-in-Picture. + * @param enabled Whether Picture-in-Picture should be enabled. + */ + public void setPictureInPictureEnabled(boolean enabled) { + if (mNativeTabAndroid == 0) return; + nativeSetPictureInPictureEnabled(mNativeTabAndroid, enabled); + } + + /** * Configures web preferences for viewing downloaded media. * @param enabled Whether embedded media experience should be enabled. */ @@ -3505,6 +3514,7 @@ private native void nativeClearThumbnailPlaceholder(long nativeTabAndroid); private native boolean nativeHasPrerenderedUrl(long nativeTabAndroid, String url); private native void nativeSetWebappManifestScope(long nativeTabAndroid, String scope); + private native void nativeSetPictureInPictureEnabled(long nativeTabAndroid, boolean enabled); private native void nativeEnableEmbeddedMediaExperience(long nativeTabAndroid, boolean enabled); private native void nativeAttachDetachedTab(long nativeTabAndroid); private native void nativeMediaDownloadInProductHelpDismissed(long nativeTabAndroid);
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index cbd35f7..88aac433 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -571,6 +571,7 @@ "java/src/org/chromium/chrome/browser/locale/SpecialLocaleHandler.java", "java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java", "java/src/org/chromium/chrome/browser/media/MediaViewerUtils.java", + "java/src/org/chromium/chrome/browser/media/PictureInPicture.java", "java/src/org/chromium/chrome/browser/media/PictureInPictureController.java", "java/src/org/chromium/chrome/browser/media/cdm/MediaDrmCredentialManager.java", "java/src/org/chromium/chrome/browser/media/remote/AbstractMediaRouteController.java",
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index 5a2769d..d4ad760 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-66.0.3354.0_rc-r2.afdo.bz2 \ No newline at end of file +chromeos-chrome-amd64-66.0.3355.0_rc-r1.afdo.bz2 \ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index fbc3260..84217628 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -4105,9 +4105,9 @@ if (enable_vr) { if (enable_gvr_services) { - deps += [ "android/vr_shell:vr_android" ] + deps += [ "android/vr:vr_android" ] configs += [ "//third_party/gvr-android-sdk:libgvr_config" ] - allow_circular_includes_from += [ "android/vr_shell:vr_android" ] + allow_circular_includes_from += [ "android/vr:vr_android" ] } sources += [ @@ -4152,6 +4152,7 @@ deps += [ "//components/webrtc_logging/browser", "//components/webrtc_logging/common", + "//services/audio/public/cpp", "//third_party/webrtc_overrides", "//third_party/webrtc_overrides:init_webrtc", ]
diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc index 57c4c177..f936cde 100644 --- a/chrome/browser/android/tab_android.cc +++ b/chrome/browser/android/tab_android.cc
@@ -166,6 +166,7 @@ content_layer_(cc::Layer::Create()), tab_content_manager_(NULL), synced_tab_delegate_(new browser_sync::SyncedTabDelegateAndroid(this)), + picture_in_picture_enabled_(false), embedded_media_experience_enabled_(false), weak_factory_(this) { Java_Tab_setNativePtr(env, obj, reinterpret_cast<intptr_t>(this)); @@ -797,6 +798,22 @@ return embedded_media_experience_enabled_; } +void TabAndroid::SetPictureInPictureEnabled( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + jboolean enabled) { + picture_in_picture_enabled_ = enabled; + + if (!web_contents() || !web_contents()->GetRenderViewHost()) + return; + + web_contents()->GetRenderViewHost()->OnWebkitPreferencesChanged(); +} + +bool TabAndroid::IsPictureInPictureEnabled() const { + return picture_in_picture_enabled_; +} + void TabAndroid::AttachDetachedTab( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj) {
diff --git a/chrome/browser/android/tab_android.h b/chrome/browser/android/tab_android.h index 2352d462..695d9e42 100644 --- a/chrome/browser/android/tab_android.h +++ b/chrome/browser/android/tab_android.h
@@ -253,6 +253,13 @@ return webapp_manifest_scope_; } + void SetPictureInPictureEnabled( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + jboolean enabled); + + bool IsPictureInPictureEnabled() const; + void EnableEmbeddedMediaExperience( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, @@ -316,6 +323,7 @@ std::unique_ptr<browser_sync::SyncedTabDelegateAndroid> synced_tab_delegate_; std::string webapp_manifest_scope_; + bool picture_in_picture_enabled_; bool embedded_media_experience_enabled_; std::unique_ptr<MediaDownloadInProductHelp> media_in_product_help_;
diff --git a/chrome/browser/android/vr_shell/BUILD.gn b/chrome/browser/android/vr/BUILD.gn similarity index 100% rename from chrome/browser/android/vr_shell/BUILD.gn rename to chrome/browser/android/vr/BUILD.gn
diff --git a/chrome/browser/android/vr_shell/DEPS b/chrome/browser/android/vr/DEPS similarity index 100% rename from chrome/browser/android/vr_shell/DEPS rename to chrome/browser/android/vr/DEPS
diff --git a/chrome/browser/android/vr_shell/OWNERS b/chrome/browser/android/vr/OWNERS similarity index 100% rename from chrome/browser/android/vr_shell/OWNERS rename to chrome/browser/android/vr/OWNERS
diff --git a/chrome/browser/android/vr_shell/PRESUBMIT.py b/chrome/browser/android/vr/PRESUBMIT.py similarity index 98% rename from chrome/browser/android/vr_shell/PRESUBMIT.py rename to chrome/browser/android/vr/PRESUBMIT.py index 70b0a60..9985330 100644 --- a/chrome/browser/android/vr_shell/PRESUBMIT.py +++ b/chrome/browser/android/vr/PRESUBMIT.py
@@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -"""Presubmit script for changes affecting chrome/browser/android/vr_shell +"""Presubmit script for changes affecting chrome/browser/android/vr See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for more details about the presubmit API built into depot_tools.
diff --git a/chrome/browser/android/vr_shell/android_ui_gesture_target.cc b/chrome/browser/android/vr/android_ui_gesture_target.cc similarity index 98% rename from chrome/browser/android/vr_shell/android_ui_gesture_target.cc rename to chrome/browser/android/vr/android_ui_gesture_target.cc index 48300b3..f12c20e 100644 --- a/chrome/browser/android/vr_shell/android_ui_gesture_target.cc +++ b/chrome/browser/android/vr/android_ui_gesture_target.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/vr_shell/android_ui_gesture_target.h" +#include "chrome/browser/android/vr/android_ui_gesture_target.h" #include "jni/AndroidUiGestureTarget_jni.h" #include "third_party/WebKit/public/platform/WebGestureEvent.h"
diff --git a/chrome/browser/android/vr_shell/android_ui_gesture_target.h b/chrome/browser/android/vr/android_ui_gesture_target.h similarity index 85% rename from chrome/browser/android/vr_shell/android_ui_gesture_target.h rename to chrome/browser/android/vr/android_ui_gesture_target.h index 2296435..e5bd4ef8 100644 --- a/chrome/browser/android/vr_shell/android_ui_gesture_target.h +++ b/chrome/browser/android/vr/android_ui_gesture_target.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_ANDROID_UI_GESTURE_TARGET_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_ANDROID_UI_GESTURE_TARGET_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_ANDROID_UI_GESTURE_TARGET_H_ +#define CHROME_BROWSER_ANDROID_VR_ANDROID_UI_GESTURE_TARGET_H_ #include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" @@ -46,4 +46,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_ANDROID_UI_GESTURE_TARGET_H_ +#endif // CHROME_BROWSER_ANDROID_VR_ANDROID_UI_GESTURE_TARGET_H_
diff --git a/chrome/browser/android/vr_shell/android_vsync_helper.cc b/chrome/browser/android/vr/android_vsync_helper.cc similarity index 93% rename from chrome/browser/android/vr_shell/android_vsync_helper.cc rename to chrome/browser/android/vr/android_vsync_helper.cc index a62b152..8eb104a6 100644 --- a/chrome/browser/android/vr_shell/android_vsync_helper.cc +++ b/chrome/browser/android/vr/android_vsync_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 "chrome/browser/android/vr_shell/android_vsync_helper.h" +#include "chrome/browser/android/vr/android_vsync_helper.h" #include "base/android/jni_android.h" #include "base/callback_helpers.h" @@ -44,7 +44,7 @@ } void AndroidVSyncHelper::RequestVSync( - const base::Callback<void(base::TimeTicks)>& callback) { + const base::RepeatingCallback<void(base::TimeTicks)>& callback) { DCHECK(callback_.is_null()); DCHECK(!callback.is_null()); callback_ = callback;
diff --git a/chrome/browser/android/vr_shell/android_vsync_helper.h b/chrome/browser/android/vr/android_vsync_helper.h similarity index 77% rename from chrome/browser/android/vr_shell/android_vsync_helper.h rename to chrome/browser/android/vr/android_vsync_helper.h index 8a052c6..0241812 100644 --- a/chrome/browser/android/vr_shell/android_vsync_helper.h +++ b/chrome/browser/android/vr/android_vsync_helper.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_ANDROID_VSYNC_HELPER_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_ANDROID_VSYNC_HELPER_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_ANDROID_VSYNC_HELPER_H_ +#define CHROME_BROWSER_ANDROID_VR_ANDROID_VSYNC_HELPER_H_ #include <jni.h> @@ -22,7 +22,8 @@ const base::android::JavaParamRef<jobject>& obj, jlong time_nanos); - void RequestVSync(const base::Callback<void(base::TimeTicks)>& callback); + void RequestVSync( + const base::RepeatingCallback<void(base::TimeTicks)>& callback); void CancelVSyncRequest(); // The last interval will be a multiple of the actual refresh interval, use @@ -36,7 +37,7 @@ base::TimeTicks last_vsync_; base::TimeDelta last_interval_; base::TimeDelta display_vsync_interval_; - base::Callback<void(base::TimeTicks)> callback_; + base::RepeatingCallback<void(base::TimeTicks)> callback_; base::android::ScopedJavaGlobalRef<jobject> j_object_; @@ -45,4 +46,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_ANDROID_VSYNC_HELPER_H_ +#endif // CHROME_BROWSER_ANDROID_VR_ANDROID_VSYNC_HELPER_H_
diff --git a/chrome/browser/android/vr_shell/autocomplete_controller.cc b/chrome/browser/android/vr/autocomplete_controller.cc similarity index 98% rename from chrome/browser/android/vr_shell/autocomplete_controller.cc rename to chrome/browser/android/vr/autocomplete_controller.cc index 38800b6..979ad91 100644 --- a/chrome/browser/android/vr_shell/autocomplete_controller.cc +++ b/chrome/browser/android/vr/autocomplete_controller.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/vr_shell/autocomplete_controller.h" +#include "chrome/browser/android/vr/autocomplete_controller.h" #include "base/strings/string16.h" #include "base/strings/utf_string_conversions.h"
diff --git a/chrome/browser/android/vr_shell/autocomplete_controller.h b/chrome/browser/android/vr/autocomplete_controller.h similarity index 90% rename from chrome/browser/android/vr_shell/autocomplete_controller.h rename to chrome/browser/android/vr/autocomplete_controller.h index 562dc74..04d6fb2 100644 --- a/chrome/browser/android/vr_shell/autocomplete_controller.h +++ b/chrome/browser/android/vr/autocomplete_controller.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_AUTOCOMPLETE_CONTROLLER_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_AUTOCOMPLETE_CONTROLLER_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_AUTOCOMPLETE_CONTROLLER_H_ +#define CHROME_BROWSER_ANDROID_VR_AUTOCOMPLETE_CONTROLLER_H_ #include <memory> @@ -60,4 +60,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_AUTOCOMPLETE_CONTROLLER_H_ +#endif // CHROME_BROWSER_ANDROID_VR_AUTOCOMPLETE_CONTROLLER_H_
diff --git a/chrome/browser/android/vr_shell/gl_browser_interface.h b/chrome/browser/android/vr/gl_browser_interface.h similarity index 88% rename from chrome/browser/android/vr_shell/gl_browser_interface.h rename to chrome/browser/android/vr/gl_browser_interface.h index 59291db..604ce2d 100644 --- a/chrome/browser/android/vr_shell/gl_browser_interface.h +++ b/chrome/browser/android/vr/gl_browser_interface.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_GL_BROWSER_INTERFACE_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_GL_BROWSER_INTERFACE_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_GL_BROWSER_INTERFACE_H_ +#define CHROME_BROWSER_ANDROID_VR_GL_BROWSER_INTERFACE_H_ #include <memory> @@ -43,4 +43,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_GL_BROWSER_INTERFACE_H_ +#endif // CHROME_BROWSER_ANDROID_VR_GL_BROWSER_INTERFACE_H_
diff --git a/chrome/browser/android/vr_shell/gvr_keyboard_delegate.cc b/chrome/browser/android/vr/gvr_keyboard_delegate.cc similarity index 98% rename from chrome/browser/android/vr_shell/gvr_keyboard_delegate.cc rename to chrome/browser/android/vr/gvr_keyboard_delegate.cc index 2aca084..b65e3e9 100644 --- a/chrome/browser/android/vr_shell/gvr_keyboard_delegate.cc +++ b/chrome/browser/android/vr/gvr_keyboard_delegate.cc
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/vr_shell/gvr_keyboard_delegate.h" +#include "chrome/browser/android/vr/gvr_keyboard_delegate.h" #include "base/bind.h" #include "base/memory/ptr_util.h" #include "base/strings/utf_string_conversions.h" -#include "chrome/browser/android/vr_shell/gvr_util.h" +#include "chrome/browser/android/vr/gvr_util.h" #include "chrome/browser/vr/model/camera_model.h" #include "chrome/browser/vr/model/text_input_info.h" #include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/gvr.h"
diff --git a/chrome/browser/android/vr_shell/gvr_keyboard_delegate.h b/chrome/browser/android/vr/gvr_keyboard_delegate.h similarity index 92% rename from chrome/browser/android/vr_shell/gvr_keyboard_delegate.h rename to chrome/browser/android/vr/gvr_keyboard_delegate.h index c08631c..f3ee730 100644 --- a/chrome/browser/android/vr_shell/gvr_keyboard_delegate.h +++ b/chrome/browser/android/vr/gvr_keyboard_delegate.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_GVR_KEYBOARD_DELEGATE_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_GVR_KEYBOARD_DELEGATE_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_GVR_KEYBOARD_DELEGATE_H_ +#define CHROME_BROWSER_ANDROID_VR_GVR_KEYBOARD_DELEGATE_H_ #include "base/callback.h" #include "base/macros.h" @@ -68,4 +68,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_GVR_KEYBOARD_DELEGATE_H_ +#endif // CHROME_BROWSER_ANDROID_VR_GVR_KEYBOARD_DELEGATE_H_
diff --git a/chrome/browser/android/vr_shell/gvr_keyboard_shim.cc b/chrome/browser/android/vr/gvr_keyboard_shim.cc similarity index 100% rename from chrome/browser/android/vr_shell/gvr_keyboard_shim.cc rename to chrome/browser/android/vr/gvr_keyboard_shim.cc
diff --git a/chrome/browser/android/vr_shell/gvr_util.cc b/chrome/browser/android/vr/gvr_util.cc similarity index 98% rename from chrome/browser/android/vr_shell/gvr_util.cc rename to chrome/browser/android/vr/gvr_util.cc index e026ceb..5aa303d 100644 --- a/chrome/browser/android/vr_shell/gvr_util.cc +++ b/chrome/browser/android/vr/gvr_util.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/vr_shell/gvr_util.h" +#include "chrome/browser/android/vr/gvr_util.h" #include <cmath>
diff --git a/chrome/browser/android/vr_shell/gvr_util.h b/chrome/browser/android/vr/gvr_util.h similarity index 91% rename from chrome/browser/android/vr_shell/gvr_util.h rename to chrome/browser/android/vr/gvr_util.h index bf20544..7956d50 100644 --- a/chrome/browser/android/vr_shell/gvr_util.h +++ b/chrome/browser/android/vr/gvr_util.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_GVR_UTIL_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_GVR_UTIL_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_GVR_UTIL_H_ +#define CHROME_BROWSER_ANDROID_VR_GVR_UTIL_H_ #include <vector> @@ -45,4 +45,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_GVR_UTIL_H_ +#endif // CHROME_BROWSER_ANDROID_VR_GVR_UTIL_H_
diff --git a/chrome/browser/android/vr_shell/mailbox_to_surface_bridge.cc b/chrome/browser/android/vr/mailbox_to_surface_bridge.cc similarity index 95% rename from chrome/browser/android/vr_shell/mailbox_to_surface_bridge.cc rename to chrome/browser/android/vr/mailbox_to_surface_bridge.cc index b28e6e1f..0347eb8 100644 --- a/chrome/browser/android/vr_shell/mailbox_to_surface_bridge.cc +++ b/chrome/browser/android/vr/mailbox_to_surface_bridge.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/vr_shell/mailbox_to_surface_bridge.h" +#include "chrome/browser/android/vr/mailbox_to_surface_bridge.h" #include <memory> #include <string> @@ -186,16 +186,17 @@ // The callback to run in this thread. It is necessary to keep |surface| alive // until the context becomes available. So pass it on to the callback, so that // it stays alive, and is destroyed on the same thread once done. - auto callback = - base::Bind(&MailboxToSurfaceBridge::OnContextAvailable, - weak_ptr_factory_.GetWeakPtr(), base::Passed(&surface)); + auto callback = base::BindRepeating( + &MailboxToSurfaceBridge::OnContextAvailable, + weak_ptr_factory_.GetWeakPtr(), base::Passed(&surface)); // The callback that runs in the UI thread, and triggers |callback| to be run // in this thread. - auto relay_callback = base::Bind( + auto relay_callback = base::BindRepeating( [](scoped_refptr<base::SequencedTaskRunner> runner, const content::Compositor::ContextProviderCallback& callback, scoped_refptr<viz::ContextProvider> provider) { - runner->PostTask(FROM_HERE, base::Bind(callback, std::move(provider))); + runner->PostTask(FROM_HERE, + base::BindRepeating(callback, std::move(provider))); }, base::SequencedTaskRunnerHandle::Get(), std::move(callback)); @@ -210,7 +211,7 @@ // properly - it assumes a shared underlying GL context. // See GetCompositorContextAttributes in // content/browser/renderer_host/compositor_impl_android.cc - // and crbug.com/699330. + // and https://crbug.com/699330. gpu::ContextCreationAttribs attributes; attributes.alpha_size = -1; attributes.red_size = 8; @@ -242,8 +243,7 @@ resize_height_ = height; return; } - DVLOG(1) << __FUNCTION__ << ": resize Surface to " << - width << "x" << height; + DVLOG(1) << __FUNCTION__ << ": resize Surface to " << width << "x" << height; gl_->ResizeCHROMIUM(width, height, 1.f, GL_COLOR_SPACE_UNSPECIFIED_CHROMIUM, false); gl_->Viewport(0, 0, width, height); @@ -352,7 +352,7 @@ void MailboxToSurfaceBridge::DrawQuad(unsigned int texture_handle) { // We're redrawing over the entire viewport, but it's generally more // efficient on mobile tiling GPUs to clear anyway as a hint that - // we're done with the old content. TODO(klausw,crbug.com/700389): + // we're done with the old content. TODO(klausw, https://crbug.com/700389): // investigate using gl_->DiscardFramebufferEXT here since that's more // efficient on desktop, but it would need a capability check since // it's not supported on older devices such as Nexus 5X.
diff --git a/chrome/browser/android/vr_shell/mailbox_to_surface_bridge.h b/chrome/browser/android/vr/mailbox_to_surface_bridge.h similarity index 86% rename from chrome/browser/android/vr_shell/mailbox_to_surface_bridge.h rename to chrome/browser/android/vr/mailbox_to_surface_bridge.h index 0a218101..fc844b8 100644 --- a/chrome/browser/android/vr_shell/mailbox_to_surface_bridge.h +++ b/chrome/browser/android/vr/mailbox_to_surface_bridge.h
@@ -2,22 +2,22 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_MAILBOX_TO_SURFACE_BRIDGE_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_MAILBOX_TO_SURFACE_BRIDGE_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_MAILBOX_TO_SURFACE_BRIDGE_H_ +#define CHROME_BROWSER_ANDROID_VR_MAILBOX_TO_SURFACE_BRIDGE_H_ #include "base/memory/weak_ptr.h" namespace gl { class ScopedJavaSurface; class SurfaceTexture; -} +} // namespace gl namespace gpu { struct MailboxHolder; namespace gles2 { class GLES2Interface; } -} +} // namespace gpu namespace viz { class ContextProvider; @@ -62,4 +62,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_MAILBOX_TO_SURFACE_BRIDGE_H_ +#endif // CHROME_BROWSER_ANDROID_VR_MAILBOX_TO_SURFACE_BRIDGE_H_
diff --git a/chrome/browser/android/vr_shell/vr_controller.cc b/chrome/browser/android/vr/vr_controller.cc similarity index 99% rename from chrome/browser/android/vr_shell/vr_controller.cc rename to chrome/browser/android/vr/vr_controller.cc index cd9f30d..5574fdc 100644 --- a/chrome/browser/android/vr_shell/vr_controller.cc +++ b/chrome/browser/android/vr/vr_controller.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/vr_shell/vr_controller.h" +#include "chrome/browser/android/vr/vr_controller.h" #include <algorithm> #include <utility>
diff --git a/chrome/browser/android/vr_shell/vr_controller.h b/chrome/browser/android/vr/vr_controller.h similarity index 96% rename from chrome/browser/android/vr_shell/vr_controller.h rename to chrome/browser/android/vr/vr_controller.h index 7d3da38..025b382 100644 --- a/chrome/browser/android/vr_shell/vr_controller.h +++ b/chrome/browser/android/vr/vr_controller.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_VR_CONTROLLER_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_VR_CONTROLLER_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_VR_CONTROLLER_H_ +#define CHROME_BROWSER_ANDROID_VR_VR_CONTROLLER_H_ #include <memory> #include <vector> @@ -198,4 +198,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_VR_CONTROLLER_H_ +#endif // CHROME_BROWSER_ANDROID_VR_VR_CONTROLLER_H_
diff --git a/chrome/browser/android/vr_shell/vr_core_info.cc b/chrome/browser/android/vr/vr_core_info.cc similarity index 95% rename from chrome/browser/android/vr_shell/vr_core_info.cc rename to chrome/browser/android/vr/vr_core_info.cc index ce1aa44..43ffa84d 100644 --- a/chrome/browser/android/vr_shell/vr_core_info.cc +++ b/chrome/browser/android/vr/vr_core_info.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/vr_shell/vr_core_info.h" +#include "chrome/browser/android/vr/vr_core_info.h" #include "base/android/jni_android.h" #include "jni/VrCoreInfo_jni.h"
diff --git a/chrome/browser/android/vr_shell/vr_core_info.h b/chrome/browser/android/vr/vr_core_info.h similarity index 84% rename from chrome/browser/android/vr_shell/vr_core_info.h rename to chrome/browser/android/vr/vr_core_info.h index 6f081262..04c59db 100644 --- a/chrome/browser/android/vr_shell/vr_core_info.h +++ b/chrome/browser/android/vr/vr_core_info.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_VR_CORE_INFO_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_VR_CORE_INFO_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_VR_CORE_INFO_H_ +#define CHROME_BROWSER_ANDROID_VR_VR_CORE_INFO_H_ #include <jni.h> @@ -33,4 +33,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_VR_CORE_INFO_H_ +#endif // CHROME_BROWSER_ANDROID_VR_VR_CORE_INFO_H_
diff --git a/chrome/browser/android/vr_shell/vr_dialog.cc b/chrome/browser/android/vr/vr_dialog.cc similarity index 95% rename from chrome/browser/android/vr_shell/vr_dialog.cc rename to chrome/browser/android/vr/vr_dialog.cc index a47b5ed1..1079ec5d8 100644 --- a/chrome/browser/android/vr_shell/vr_dialog.cc +++ b/chrome/browser/android/vr/vr_dialog.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/vr_shell/vr_dialog.h" +#include "chrome/browser/android/vr/vr_dialog.h" #include <utility> @@ -10,7 +10,7 @@ #include "base/android/jni_string.h" #include "base/callback_helpers.h" #include "base/memory/ptr_util.h" -#include "chrome/browser/android/vr_shell/vr_shell_delegate.h" +#include "chrome/browser/android/vr/vr_shell_delegate.h" #include "third_party/WebKit/public/platform/WebMouseEvent.h"
diff --git a/chrome/browser/android/vr_shell/vr_dialog.h b/chrome/browser/android/vr/vr_dialog.h similarity index 92% rename from chrome/browser/android/vr_shell/vr_dialog.h rename to chrome/browser/android/vr/vr_dialog.h index 52bd0b1..fd7e86f 100644 --- a/chrome/browser/android/vr_shell/vr_dialog.h +++ b/chrome/browser/android/vr/vr_dialog.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_VR_DIALOG_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_VR_DIALOG_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_VR_DIALOG_H_ +#define CHROME_BROWSER_ANDROID_VR_VR_DIALOG_H_ #include <jni.h> @@ -62,4 +62,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_VR_DIALOG_H_ +#endif // CHROME_BROWSER_ANDROID_VR_VR_DIALOG_H_
diff --git a/chrome/browser/android/vr_shell/vr_gl_thread.cc b/chrome/browser/android/vr/vr_gl_thread.cc similarity index 70% rename from chrome/browser/android/vr_shell/vr_gl_thread.cc rename to chrome/browser/android/vr/vr_gl_thread.cc index 7b34ab04..3734ad4 100644 --- a/chrome/browser/android/vr_shell/vr_gl_thread.cc +++ b/chrome/browser/android/vr/vr_gl_thread.cc
@@ -2,16 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/vr_shell/vr_gl_thread.h" +#include "chrome/browser/android/vr/vr_gl_thread.h" #include <utility> #include "base/message_loop/message_loop.h" #include "base/strings/string16.h" #include "base/version.h" -#include "chrome/browser/android/vr_shell/vr_input_connection.h" -#include "chrome/browser/android/vr_shell/vr_shell.h" -#include "chrome/browser/android/vr_shell/vr_shell_gl.h" +#include "chrome/browser/android/vr/vr_input_connection.h" +#include "chrome/browser/android/vr/vr_shell.h" +#include "chrome/browser/android/vr/vr_shell_gl.h" #include "chrome/browser/vr/assets_loader.h" #include "chrome/browser/vr/browser_ui_interface.h" #include "chrome/browser/vr/model/assets.h" @@ -117,8 +117,8 @@ gl::SurfaceTexture* texture) { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, base::Bind(&VrShell::DialogSurfaceCreated, weak_vr_shell_, - surface, base::Unretained(texture))); + FROM_HERE, base::BindOnce(&VrShell::DialogSurfaceCreated, weak_vr_shell_, + surface, base::Unretained(texture))); } void VrGLThread::GvrDelegateReady( @@ -133,15 +133,16 @@ void VrGLThread::UpdateGamepadData(device::GvrGamepadData pad) { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, base::Bind(&VrShell::UpdateGamepadData, weak_vr_shell_, pad)); + FROM_HERE, + base::BindOnce(&VrShell::UpdateGamepadData, weak_vr_shell_, pad)); } void VrGLThread::ForwardEvent(std::unique_ptr<blink::WebInputEvent> event, int content_id) { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, base::Bind(&VrShell::ProcessContentGesture, weak_vr_shell_, - base::Passed(std::move(event)), content_id)); + FROM_HERE, base::BindOnce(&VrShell::ProcessContentGesture, weak_vr_shell_, + base::Passed(std::move(event)), content_id)); } void VrGLThread::OnWebInputEdited(const TextEdits& edits) { @@ -166,20 +167,20 @@ std::unique_ptr<blink::WebInputEvent> event) { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, base::Bind(&VrShell::ProcessDialogGesture, weak_vr_shell_, - base::Passed(std::move(event)))); + FROM_HERE, base::BindOnce(&VrShell::ProcessDialogGesture, weak_vr_shell_, + base::Passed(std::move(event)))); } void VrGLThread::ForceExitVr() { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, base::Bind(&VrShell::ForceExitVr, weak_vr_shell_)); + FROM_HERE, base::BindOnce(&VrShell::ForceExitVr, weak_vr_shell_)); } void VrGLThread::ExitPresent() { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, base::Bind(&VrShell::ExitPresent, weak_vr_shell_)); + FROM_HERE, base::BindOnce(&VrShell::ExitPresent, weak_vr_shell_)); // TODO(vollick): Ui should hang onto the appropriate pointer rather than // bouncing through VrGLThread. vr_shell_gl_->OnExitPresent(); @@ -188,87 +189,87 @@ void VrGLThread::ExitFullscreen() { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, base::Bind(&VrShell::ExitFullscreen, weak_vr_shell_)); + FROM_HERE, base::BindOnce(&VrShell::ExitFullscreen, weak_vr_shell_)); } void VrGLThread::OnContentPaused(bool enabled) { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( FROM_HERE, - base::Bind(&VrShell::OnContentPaused, weak_vr_shell_, enabled)); + base::BindOnce(&VrShell::OnContentPaused, weak_vr_shell_, enabled)); } void VrGLThread::Navigate(GURL gurl) { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, base::Bind(&VrShell::Navigate, weak_vr_shell_, gurl)); + FROM_HERE, base::BindOnce(&VrShell::Navigate, weak_vr_shell_, gurl)); } void VrGLThread::NavigateBack() { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, base::Bind(&VrShell::NavigateBack, weak_vr_shell_)); + FROM_HERE, base::BindOnce(&VrShell::NavigateBack, weak_vr_shell_)); } void VrGLThread::ExitCct() { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, base::Bind(&VrShell::ExitCct, weak_vr_shell_)); + FROM_HERE, base::BindOnce(&VrShell::ExitCct, weak_vr_shell_)); } void VrGLThread::CloseHostedDialog() { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, - base::BindRepeating(&VrShell::CloseHostedDialog, weak_vr_shell_)); + FROM_HERE, base::BindOnce(&VrShell::CloseHostedDialog, weak_vr_shell_)); } void VrGLThread::ToggleCardboardGamepad(bool enabled) { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, - base::Bind(&VrShell::ToggleCardboardGamepad, weak_vr_shell_, enabled)); + FROM_HERE, base::BindOnce(&VrShell::ToggleCardboardGamepad, + weak_vr_shell_, enabled)); } void VrGLThread::OnUnsupportedMode(UiUnsupportedMode mode) { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, base::Bind(&VrShell::OnUnsupportedMode, weak_vr_shell_, mode)); + FROM_HERE, + base::BindOnce(&VrShell::OnUnsupportedMode, weak_vr_shell_, mode)); } void VrGLThread::OnExitVrPromptResult(ExitVrPromptChoice choice, UiUnsupportedMode reason) { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, base::Bind(&VrShell::OnExitVrPromptResult, weak_vr_shell_, - reason, choice)); + FROM_HERE, base::BindOnce(&VrShell::OnExitVrPromptResult, weak_vr_shell_, + reason, choice)); } void VrGLThread::OnContentScreenBoundsChanged(const gfx::SizeF& bounds) { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, base::Bind(&VrShell::OnContentScreenBoundsChanged, - weak_vr_shell_, bounds)); + FROM_HERE, base::BindOnce(&VrShell::OnContentScreenBoundsChanged, + weak_vr_shell_, bounds)); } void VrGLThread::SetVoiceSearchActive(bool active) { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( FROM_HERE, - base::Bind(&VrShell::SetVoiceSearchActive, weak_vr_shell_, active)); + base::BindOnce(&VrShell::SetVoiceSearchActive, weak_vr_shell_, active)); } void VrGLThread::StartAutocomplete(const AutocompleteRequest& request) { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, base::BindRepeating(&VrShell::StartAutocomplete, - weak_vr_shell_, request)); + FROM_HERE, + base::BindOnce(&VrShell::StartAutocomplete, weak_vr_shell_, request)); } void VrGLThread::StopAutocomplete() { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask( - FROM_HERE, base::Bind(&VrShell::StopAutocomplete, weak_vr_shell_)); + FROM_HERE, base::BindOnce(&VrShell::StopAutocomplete, weak_vr_shell_)); } void VrGLThread::LoadAssets() { @@ -279,92 +280,93 @@ void VrGLThread::SetFullscreen(bool enabled) { DCHECK(OnMainThread()); task_runner()->PostTask(FROM_HERE, - base::Bind(&BrowserUiInterface::SetFullscreen, - weak_browser_ui_, enabled)); + base::BindOnce(&BrowserUiInterface::SetFullscreen, + weak_browser_ui_, enabled)); } void VrGLThread::SetIncognito(bool incognito) { DCHECK(OnMainThread()); - task_runner()->PostTask( - FROM_HERE, base::Bind(&BrowserUiInterface::SetIncognito, weak_browser_ui_, - incognito)); + task_runner()->PostTask(FROM_HERE, + base::BindOnce(&BrowserUiInterface::SetIncognito, + weak_browser_ui_, incognito)); } void VrGLThread::SetHistoryButtonsEnabled(bool can_go_back, bool can_go_forward) { DCHECK(OnMainThread()); task_runner()->PostTask( - FROM_HERE, base::Bind(&BrowserUiInterface::SetHistoryButtonsEnabled, - weak_browser_ui_, can_go_back, can_go_forward)); + FROM_HERE, base::BindOnce(&BrowserUiInterface::SetHistoryButtonsEnabled, + weak_browser_ui_, can_go_back, can_go_forward)); } void VrGLThread::SetLoadProgress(float progress) { DCHECK(OnMainThread()); task_runner()->PostTask(FROM_HERE, - base::Bind(&BrowserUiInterface::SetLoadProgress, - weak_browser_ui_, progress)); + base::BindOnce(&BrowserUiInterface::SetLoadProgress, + weak_browser_ui_, progress)); } void VrGLThread::SetLoading(bool loading) { DCHECK(OnMainThread()); - task_runner()->PostTask(FROM_HERE, base::Bind(&BrowserUiInterface::SetLoading, - weak_browser_ui_, loading)); + task_runner()->PostTask(FROM_HERE, + base::BindOnce(&BrowserUiInterface::SetLoading, + weak_browser_ui_, loading)); } void VrGLThread::SetToolbarState(const ToolbarState& state) { DCHECK(OnMainThread()); task_runner()->PostTask(FROM_HERE, - base::Bind(&BrowserUiInterface::SetToolbarState, - weak_browser_ui_, state)); + base::BindOnce(&BrowserUiInterface::SetToolbarState, + weak_browser_ui_, state)); } void VrGLThread::SetWebVrMode(bool enabled, bool show_toast) { DCHECK(OnMainThread()); task_runner()->PostTask( - FROM_HERE, base::Bind(&BrowserUiInterface::SetWebVrMode, weak_browser_ui_, - enabled, show_toast)); + FROM_HERE, base::BindOnce(&BrowserUiInterface::SetWebVrMode, + weak_browser_ui_, enabled, show_toast)); } void VrGLThread::SetAudioCaptureEnabled(bool enabled) { DCHECK(OnMainThread()); task_runner()->PostTask( - FROM_HERE, base::Bind(&BrowserUiInterface::SetAudioCaptureEnabled, - weak_browser_ui_, enabled)); + FROM_HERE, base::BindOnce(&BrowserUiInterface::SetAudioCaptureEnabled, + weak_browser_ui_, enabled)); } void VrGLThread::SetLocationAccessEnabled(bool enabled) { DCHECK(OnMainThread()); task_runner()->PostTask( - FROM_HERE, base::Bind(&BrowserUiInterface::SetLocationAccessEnabled, - weak_browser_ui_, enabled)); + FROM_HERE, base::BindOnce(&BrowserUiInterface::SetLocationAccessEnabled, + weak_browser_ui_, enabled)); } void VrGLThread::SetVideoCaptureEnabled(bool enabled) { DCHECK(OnMainThread()); task_runner()->PostTask( - FROM_HERE, base::Bind(&BrowserUiInterface::SetVideoCaptureEnabled, - weak_browser_ui_, enabled)); + FROM_HERE, base::BindOnce(&BrowserUiInterface::SetVideoCaptureEnabled, + weak_browser_ui_, enabled)); } void VrGLThread::SetScreenCaptureEnabled(bool enabled) { DCHECK(OnMainThread()); task_runner()->PostTask( - FROM_HERE, base::Bind(&BrowserUiInterface::SetScreenCaptureEnabled, - weak_browser_ui_, enabled)); + FROM_HERE, base::BindOnce(&BrowserUiInterface::SetScreenCaptureEnabled, + weak_browser_ui_, enabled)); } void VrGLThread::SetBluetoothConnected(bool enabled) { DCHECK(OnMainThread()); - task_runner()->PostTask(FROM_HERE, - base::Bind(&BrowserUiInterface::SetBluetoothConnected, - weak_browser_ui_, enabled)); + task_runner()->PostTask( + FROM_HERE, base::BindOnce(&BrowserUiInterface::SetBluetoothConnected, + weak_browser_ui_, enabled)); } void VrGLThread::SetIsExiting() { DCHECK(OnMainThread()); task_runner()->PostTask( FROM_HERE, - base::Bind(&BrowserUiInterface::SetIsExiting, weak_browser_ui_)); + base::BindOnce(&BrowserUiInterface::SetIsExiting, weak_browser_ui_)); } void VrGLThread::ShowExitVrPrompt(UiUnsupportedMode reason) { @@ -377,23 +379,24 @@ void VrGLThread::SetSpeechRecognitionEnabled(bool enabled) { DCHECK(OnMainThread()); task_runner()->PostTask( - FROM_HERE, base::Bind(&BrowserUiInterface::SetSpeechRecognitionEnabled, - weak_browser_ui_, enabled)); + FROM_HERE, + base::BindOnce(&BrowserUiInterface::SetSpeechRecognitionEnabled, + weak_browser_ui_, enabled)); } void VrGLThread::SetRecognitionResult(const base::string16& result) { DCHECK(OnMainThread()); - task_runner()->PostTask(FROM_HERE, - base::Bind(&BrowserUiInterface::SetRecognitionResult, - weak_browser_ui_, result)); + task_runner()->PostTask( + FROM_HERE, base::BindOnce(&BrowserUiInterface::SetRecognitionResult, + weak_browser_ui_, result)); } void VrGLThread::OnSpeechRecognitionStateChanged(int new_state) { DCHECK(OnMainThread()); task_runner()->PostTask( FROM_HERE, - base::Bind(&BrowserUiInterface::OnSpeechRecognitionStateChanged, - weak_browser_ui_, new_state)); + base::BindOnce(&BrowserUiInterface::OnSpeechRecognitionStateChanged, + weak_browser_ui_, new_state)); } void VrGLThread::SetOmniboxSuggestions( @@ -401,23 +404,22 @@ DCHECK(OnMainThread()); task_runner()->PostTask( FROM_HERE, - base::Bind(&BrowserUiInterface::SetOmniboxSuggestions, weak_browser_ui_, - base::Passed(std::move(suggestions)))); + base::BindOnce(&BrowserUiInterface::SetOmniboxSuggestions, + weak_browser_ui_, base::Passed(std::move(suggestions)))); } void VrGLThread::OnAssetsComponentReady() { DCHECK(OnMainThread()); task_runner()->PostTask( - FROM_HERE, - base::BindRepeating(&BrowserUiInterface::OnAssetsComponentReady, - weak_browser_ui_)); + FROM_HERE, base::BindOnce(&BrowserUiInterface::OnAssetsComponentReady, + weak_browser_ui_)); } void VrGLThread::ShowSoftInput(bool show) { DCHECK(OnMainThread()); - task_runner()->PostTask( - FROM_HERE, base::BindRepeating(&BrowserUiInterface::ShowSoftInput, - weak_browser_ui_, show)); + task_runner()->PostTask(FROM_HERE, + base::BindOnce(&BrowserUiInterface::ShowSoftInput, + weak_browser_ui_, show)); } void VrGLThread::UpdateWebInputIndices(int selection_start,
diff --git a/chrome/browser/android/vr_shell/vr_gl_thread.h b/chrome/browser/android/vr/vr_gl_thread.h similarity index 94% rename from chrome/browser/android/vr_shell/vr_gl_thread.h rename to chrome/browser/android/vr/vr_gl_thread.h index 214f5dd8..93ed448 100644 --- a/chrome/browser/android/vr_shell/vr_gl_thread.h +++ b/chrome/browser/android/vr/vr_gl_thread.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_VR_GL_THREAD_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_VR_GL_THREAD_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_VR_GL_THREAD_H_ +#define CHROME_BROWSER_ANDROID_VR_VR_GL_THREAD_H_ #include <memory> @@ -11,8 +11,8 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/single_thread_task_runner.h" -#include "chrome/browser/android/vr_shell/gl_browser_interface.h" -#include "chrome/browser/android/vr_shell/gvr_keyboard_delegate.h" +#include "chrome/browser/android/vr/gl_browser_interface.h" +#include "chrome/browser/android/vr/gvr_keyboard_delegate.h" #include "chrome/browser/vr/browser_ui_interface.h" #include "chrome/browser/vr/content_input_delegate.h" #include "chrome/browser/vr/model/omnibox_suggestions.h" @@ -150,4 +150,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_VR_GL_THREAD_H_ +#endif // CHROME_BROWSER_ANDROID_VR_VR_GL_THREAD_H_
diff --git a/chrome/browser/android/vr_shell/vr_input_connection.cc b/chrome/browser/android/vr/vr_input_connection.cc similarity index 97% rename from chrome/browser/android/vr_shell/vr_input_connection.cc rename to chrome/browser/android/vr/vr_input_connection.cc index e285def..b28efd9 100644 --- a/chrome/browser/android/vr_shell/vr_input_connection.cc +++ b/chrome/browser/android/vr/vr_input_connection.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/vr_shell/vr_input_connection.h" +#include "chrome/browser/android/vr/vr_input_connection.h" #include "base/android/jni_android.h" #include "base/android/jni_string.h"
diff --git a/chrome/browser/android/vr_shell/vr_input_connection.h b/chrome/browser/android/vr/vr_input_connection.h similarity index 86% rename from chrome/browser/android/vr_shell/vr_input_connection.h rename to chrome/browser/android/vr/vr_input_connection.h index fcaae6ba..a5709bf 100644 --- a/chrome/browser/android/vr_shell/vr_input_connection.h +++ b/chrome/browser/android/vr/vr_input_connection.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_VR_INPUT_CONNECTION_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_VR_INPUT_CONNECTION_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_VR_INPUT_CONNECTION_H_ +#define CHROME_BROWSER_ANDROID_VR_VR_INPUT_CONNECTION_H_ #include <jni.h> @@ -45,4 +45,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_VR_INPUT_CONNECTION_H_ +#endif // CHROME_BROWSER_ANDROID_VR_VR_INPUT_CONNECTION_H_
diff --git a/chrome/browser/android/vr_shell/vr_metrics_util.cc b/chrome/browser/android/vr/vr_metrics_util.cc similarity index 97% rename from chrome/browser/android/vr_shell/vr_metrics_util.cc rename to chrome/browser/android/vr/vr_metrics_util.cc index 56b2de7..a74a95c 100644 --- a/chrome/browser/android/vr_shell/vr_metrics_util.cc +++ b/chrome/browser/android/vr/vr_metrics_util.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/vr_shell/vr_metrics_util.h" +#include "chrome/browser/android/vr/vr_metrics_util.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h"
diff --git a/chrome/browser/android/vr_shell/vr_metrics_util.h b/chrome/browser/android/vr/vr_metrics_util.h similarity index 82% rename from chrome/browser/android/vr_shell/vr_metrics_util.h rename to chrome/browser/android/vr/vr_metrics_util.h index 757167c..60e7be0 100644 --- a/chrome/browser/android/vr_shell/vr_metrics_util.h +++ b/chrome/browser/android/vr/vr_metrics_util.h
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_VR_METRICS_UTIL_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_VR_METRICS_UTIL_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_VR_METRICS_UTIL_H_ +#define CHROME_BROWSER_ANDROID_VR_VR_METRICS_UTIL_H_ #include "base/macros.h" -#include "chrome/browser/android/vr_shell/vr_core_info.h" +#include "chrome/browser/android/vr/vr_core_info.h" #include "chrome/browser/vr/ui_suppressed_element.h" #include "device/vr/vr_device.h" #include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/gvr_types.h" @@ -42,4 +42,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_VR_METRICS_UTIL_H_ +#endif // CHROME_BROWSER_ANDROID_VR_VR_METRICS_UTIL_H_
diff --git a/chrome/browser/android/vr_shell/vr_shell.cc b/chrome/browser/android/vr/vr_shell.cc similarity index 95% rename from chrome/browser/android/vr_shell/vr_shell.cc rename to chrome/browser/android/vr/vr_shell.cc index 06ff871..22d3521 100644 --- a/chrome/browser/android/vr_shell/vr_shell.cc +++ b/chrome/browser/android/vr/vr_shell.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/vr_shell/vr_shell.h" +#include "chrome/browser/android/vr/vr_shell.h" #include <android/native_window_jni.h> @@ -20,14 +20,14 @@ #include "base/trace_event/trace_event.h" #include "base/values.h" #include "chrome/browser/android/tab_android.h" -#include "chrome/browser/android/vr_shell/android_ui_gesture_target.h" -#include "chrome/browser/android/vr_shell/autocomplete_controller.h" -#include "chrome/browser/android/vr_shell/vr_gl_thread.h" -#include "chrome/browser/android/vr_shell/vr_input_connection.h" -#include "chrome/browser/android/vr_shell/vr_shell_delegate.h" -#include "chrome/browser/android/vr_shell/vr_shell_gl.h" -#include "chrome/browser/android/vr_shell/vr_usage_monitor.h" -#include "chrome/browser/android/vr_shell/vr_web_contents_observer.h" +#include "chrome/browser/android/vr/android_ui_gesture_target.h" +#include "chrome/browser/android/vr/autocomplete_controller.h" +#include "chrome/browser/android/vr/vr_gl_thread.h" +#include "chrome/browser/android/vr/vr_input_connection.h" +#include "chrome/browser/android/vr/vr_shell_delegate.h" +#include "chrome/browser/android/vr/vr_shell_gl.h" +#include "chrome/browser/android/vr/vr_usage_monitor.h" +#include "chrome/browser/android/vr/vr_web_contents_observer.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/component_updater/vr_assets_component_installer.h" #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" @@ -184,8 +184,8 @@ const JavaParamRef<jobject>& tab) { content_id_++; PostToGlThread(FROM_HERE, - base::Bind(&VrShellGl::OnSwapContents, - gl_thread_->GetVrShellGl(), content_id_)); + base::BindOnce(&VrShellGl::OnSwapContents, + gl_thread_->GetVrShellGl(), content_id_)); TabAndroid* active_tab = tab.is_null() ? nullptr @@ -221,7 +221,7 @@ } // TODO(billorr): Make VrMetricsHelper tab-aware and able to track multiple - // tabs. crbug.com/684661 + // tabs. https://crbug.com/684661 metrics_helper_ = std::make_unique<VrMetricsHelper>( GetNonNativePageWebContents(), webvr_mode_ ? Mode::kWebVr : Mode::kVrBrowsingRegular, @@ -400,8 +400,8 @@ } void VrShell::OnPause(JNIEnv* env, const JavaParamRef<jobject>& obj) { - PostToGlThread(FROM_HERE, - base::Bind(&VrShellGl::OnPause, gl_thread_->GetVrShellGl())); + PostToGlThread(FROM_HERE, base::BindOnce(&VrShellGl::OnPause, + gl_thread_->GetVrShellGl())); // exit vr session if (metrics_helper_) @@ -412,8 +412,8 @@ } void VrShell::OnResume(JNIEnv* env, const JavaParamRef<jobject>& obj) { - PostToGlThread(FROM_HERE, - base::Bind(&VrShellGl::OnResume, gl_thread_->GetVrShellGl())); + PostToGlThread(FROM_HERE, base::BindOnce(&VrShellGl::OnResume, + gl_thread_->GetVrShellGl())); if (metrics_helper_) metrics_helper_->SetVRActive(true); @@ -430,9 +430,9 @@ return; gfx::AcceleratedWidget window = ANativeWindow_fromSurface(base::android::AttachCurrentThread(), surface); - PostToGlThread(FROM_HERE, base::Bind(&VrShellGl::InitializeGl, - gl_thread_->GetVrShellGl(), - base::Unretained(window))); + PostToGlThread(FROM_HERE, base::BindOnce(&VrShellGl::InitializeGl, + gl_thread_->GetVrShellGl(), + base::Unretained(window))); } void VrShell::SetWebVrMode(JNIEnv* env, @@ -442,8 +442,9 @@ webvr_mode_ = enabled; if (metrics_helper_) metrics_helper_->SetWebVREnabled(enabled); - PostToGlThread(FROM_HERE, base::Bind(&VrShellGl::SetWebVrMode, - gl_thread_->GetVrShellGl(), enabled)); + PostToGlThread(FROM_HERE, + base::BindOnce(&VrShellGl::SetWebVrMode, + gl_thread_->GetVrShellGl(), enabled)); ui_->SetWebVrMode(enabled, show_toast); if (!webvr_mode_ && !web_vr_autopresentation_expected_) { @@ -715,11 +716,11 @@ void VrShell::ExitVrDueToUnsupportedMode(UiUnsupportedMode mode) { ui_->SetIsExiting(); - PostToGlThread(FROM_HERE, base::Bind(&VrShellGl::set_is_exiting, - gl_thread_->GetVrShellGl(), true)); + PostToGlThread(FROM_HERE, base::BindOnce(&VrShellGl::set_is_exiting, + gl_thread_->GetVrShellGl(), true)); main_thread_task_runner_->PostDelayedTask( FROM_HERE, - base::Bind(&VrShell::ForceExitVr, weak_ptr_factory_.GetWeakPtr()), + base::BindOnce(&VrShell::ForceExitVr, weak_ptr_factory_.GetWeakPtr()), kExitVrDueToUnsupportedModeDelay); LogUnsupportedModeUserMetric(mode); } @@ -858,8 +859,8 @@ void VrShell::PollMediaAccessFlag() { poll_capturing_media_task_.Cancel(); - poll_capturing_media_task_.Reset( - base::Bind(&VrShell::PollMediaAccessFlag, base::Unretained(this))); + poll_capturing_media_task_.Reset(base::BindRepeating( + &VrShell::PollMediaAccessFlag, base::Unretained(this))); main_thread_task_runner_->PostDelayedTask( FROM_HERE, poll_capturing_media_task_.callback(), poll_media_access_interval_); @@ -899,8 +900,8 @@ content::ServiceManagerConnection::GetForProcess()->GetConnector(); connector->BindInterface(device::mojom::kServiceName, &geolocation_config_); - geolocation_config_->IsHighAccuracyLocationBeingCaptured( - base::Bind(&VrShell::SetHighAccuracyLocation, base::Unretained(this))); + geolocation_config_->IsHighAccuracyLocationBeingCaptured(base::BindRepeating( + &VrShell::SetHighAccuracyLocation, base::Unretained(this))); bool is_capturing_audio = num_tabs_capturing_audio > 0; bool is_capturing_video = num_tabs_capturing_video > 0;
diff --git a/chrome/browser/android/vr_shell/vr_shell.h b/chrome/browser/android/vr/vr_shell.h similarity index 98% rename from chrome/browser/android/vr_shell/vr_shell.h rename to chrome/browser/android/vr/vr_shell.h index 07754d5..a0b1195 100644 --- a/chrome/browser/android/vr_shell/vr_shell.h +++ b/chrome/browser/android/vr/vr_shell.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_VR_SHELL_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_VR_SHELL_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_VR_SHELL_H_ +#define CHROME_BROWSER_ANDROID_VR_VR_SHELL_H_ #include <jni.h> @@ -332,4 +332,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_VR_SHELL_H_ +#endif // CHROME_BROWSER_ANDROID_VR_VR_SHELL_H_
diff --git a/chrome/browser/android/vr_shell/vr_shell_delegate.cc b/chrome/browser/android/vr/vr_shell_delegate.cc similarity index 94% rename from chrome/browser/android/vr_shell/vr_shell_delegate.cc rename to chrome/browser/android/vr/vr_shell_delegate.cc index 6b2c9f4..1a528304 100644 --- a/chrome/browser/android/vr_shell/vr_shell_delegate.cc +++ b/chrome/browser/android/vr/vr_shell_delegate.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 "chrome/browser/android/vr_shell/vr_shell_delegate.h" +#include "chrome/browser/android/vr/vr_shell_delegate.h" #include <utility> #include "base/android/jni_android.h" #include "base/callback_helpers.h" -#include "chrome/browser/android/vr_shell/vr_metrics_util.h" -#include "chrome/browser/android/vr_shell/vr_shell.h" +#include "chrome/browser/android/vr/vr_metrics_util.h" +#include "chrome/browser/android/vr/vr_shell.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/component_updater/vr_assets_component_installer.h" #include "chrome/browser/vr/assets_loader.h" @@ -151,9 +151,10 @@ const JavaParamRef<jobject>& obj) { device::GvrDevice* device = static_cast<device::GvrDevice*>(GetDevice()); if (device) { - device->Activate(device::mojom::VRDisplayEventReason::MOUNTED, - base::Bind(&VrShellDelegate::OnActivateDisplayHandled, - weak_ptr_factory_.GetWeakPtr())); + device->Activate( + device::mojom::VRDisplayEventReason::MOUNTED, + base::BindRepeating(&VrShellDelegate::OnActivateDisplayHandled, + weak_ptr_factory_.GetWeakPtr())); } else { OnActivateDisplayHandled(true /* will_not_present */); } @@ -256,8 +257,8 @@ // onPause in java, so we know that the pause is the cause of the focus // loss, and that the page is still listening for activate. clear_activate_task_.Reset( - base::Bind(&VrShellDelegate::SetListeningForActivate, - weak_ptr_factory_.GetWeakPtr(), false)); + base::BindRepeating(&VrShellDelegate::SetListeningForActivate, + weak_ptr_factory_.GetWeakPtr(), false)); task_runner_->PostTask(FROM_HERE, clear_activate_task_.callback()); } }
diff --git a/chrome/browser/android/vr_shell/vr_shell_delegate.h b/chrome/browser/android/vr/vr_shell_delegate.h similarity index 93% rename from chrome/browser/android/vr_shell/vr_shell_delegate.h rename to chrome/browser/android/vr/vr_shell_delegate.h index 06087601..ab3bc70 100644 --- a/chrome/browser/android/vr_shell/vr_shell_delegate.h +++ b/chrome/browser/android/vr/vr_shell_delegate.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_VR_SHELL_DELEGATE_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_VR_SHELL_DELEGATE_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_VR_SHELL_DELEGATE_H_ +#define CHROME_BROWSER_ANDROID_VR_VR_SHELL_DELEGATE_H_ #include <jni.h> @@ -14,7 +14,7 @@ #include "base/callback.h" #include "base/cancelable_callback.h" #include "base/macros.h" -#include "chrome/browser/android/vr_shell/vr_core_info.h" +#include "chrome/browser/android/vr/vr_core_info.h" #include "chrome/browser/vr/content_input_delegate.h" #include "device/vr/android/gvr/gvr_delegate_provider.h" #include "device/vr/public/mojom/vr_service.mojom.h" @@ -105,4 +105,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_VR_SHELL_DELEGATE_H_ +#endif // CHROME_BROWSER_ANDROID_VR_VR_SHELL_DELEGATE_H_
diff --git a/chrome/browser/android/vr_shell/vr_shell_gl.cc b/chrome/browser/android/vr/vr_shell_gl.cc similarity index 97% rename from chrome/browser/android/vr_shell/vr_shell_gl.cc rename to chrome/browser/android/vr/vr_shell_gl.cc index ea4fe03..31aef53 100644 --- a/chrome/browser/android/vr_shell/vr_shell_gl.cc +++ b/chrome/browser/android/vr/vr_shell_gl.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/vr_shell/vr_shell_gl.h" +#include "chrome/browser/android/vr/vr_shell_gl.h" #include <algorithm> #include <chrono> @@ -18,13 +18,13 @@ #include "base/task_scheduler/post_task.h" #include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/trace_event_argument.h" -#include "chrome/browser/android/vr_shell/gl_browser_interface.h" -#include "chrome/browser/android/vr_shell/gvr_util.h" -#include "chrome/browser/android/vr_shell/mailbox_to_surface_bridge.h" -#include "chrome/browser/android/vr_shell/vr_controller.h" -#include "chrome/browser/android/vr_shell/vr_metrics_util.h" -#include "chrome/browser/android/vr_shell/vr_shell.h" -#include "chrome/browser/android/vr_shell/vr_usage_monitor.h" +#include "chrome/browser/android/vr/gl_browser_interface.h" +#include "chrome/browser/android/vr/gvr_util.h" +#include "chrome/browser/android/vr/mailbox_to_surface_bridge.h" +#include "chrome/browser/android/vr/vr_controller.h" +#include "chrome/browser/android/vr/vr_metrics_util.h" +#include "chrome/browser/android/vr/vr_shell.h" +#include "chrome/browser/android/vr/vr_usage_monitor.h" #include "chrome/browser/vr/assets_loader.h" #include "chrome/browser/vr/elements/ui_element.h" #include "chrome/browser/vr/model/assets.h" @@ -262,12 +262,12 @@ browser_->DialogSurfaceCreated(ui_surface_->j_surface().obj(), ui_surface_texture_.get()); - content_surface_texture_->SetFrameAvailableCallback(base::Bind( + content_surface_texture_->SetFrameAvailableCallback(base::BindRepeating( &VrShellGl::OnContentFrameAvailable, weak_ptr_factory_.GetWeakPtr())); content_overlay_surface_texture_->SetFrameAvailableCallback( base::BindRepeating(&VrShellGl::OnContentOverlayFrameAvailable, weak_ptr_factory_.GetWeakPtr())); - ui_surface_texture_->SetFrameAvailableCallback(base::Bind( + ui_surface_texture_->SetFrameAvailableCallback(base::BindRepeating( &VrShellGl::OnUiFrameAvailable, weak_ptr_factory_.GetWeakPtr())); webvr_surface_texture_->SetFrameAvailableCallback(base::BindRepeating( &VrShellGl::OnWebVRFrameAvailable, weak_ptr_factory_.GetWeakPtr())); @@ -539,13 +539,13 @@ return; } if (ui_->CanSendWebVrVSync() && submit_client_) { - webvr_spinner_timeout_.Reset(base::BindRepeating( + webvr_spinner_timeout_.Reset(base::BindOnce( &VrShellGl::OnWebVrTimeoutImminent, base::Unretained(this))); task_runner_->PostDelayedTask( FROM_HERE, webvr_spinner_timeout_.callback(), base::TimeDelta::FromSeconds(kWebVrSpinnerTimeoutSeconds)); - webvr_frame_timeout_.Reset(base::BindRepeating( - &VrShellGl::OnWebVrFrameTimedOut, base::Unretained(this))); + webvr_frame_timeout_.Reset(base::BindOnce(&VrShellGl::OnWebVrFrameTimedOut, + base::Unretained(this))); task_runner_->PostDelayedTask( FROM_HERE, webvr_frame_timeout_.callback(), base::TimeDelta::FromSeconds(kWebVrInitialFrameTimeoutSeconds)); @@ -803,14 +803,15 @@ // Post a task, rather than calling the UI directly, so as not to modify // UI state in the midst of frame rendering. base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::Bind(&Ui::OnAppButtonGesturePerformed, - base::Unretained(ui_.get()), direction)); + FROM_HERE, + base::BindRepeating(&Ui::OnAppButtonGesturePerformed, + base::Unretained(ui_.get()), direction)); } } if (direction == PlatformController::kSwipeDirectionNone) { base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::Bind(&Ui::OnAppButtonClicked, base::Unretained(ui_.get()))); + FROM_HERE, base::BindRepeating(&Ui::OnAppButtonClicked, + base::Unretained(ui_.get()))); } } } @@ -1008,7 +1009,7 @@ // We're redrawing over the entire viewport, but it's generally more // efficient on mobile tiling GPUs to clear anyway as a hint that - // we're done with the old content. TODO(klausw,crbug.com/700389): + // we're done with the old content. TODO(klausw, https://crbug.com/700389): // investigate using glDiscardFramebufferEXT here since that's more // efficient on desktop, but it would need a capability check since // it's not supported on older devices such as Nexus 5X. @@ -1126,7 +1127,7 @@ } } if (fence) { - webvr_delayed_frame_submit_.Reset(base::Bind( + webvr_delayed_frame_submit_.Reset(base::BindRepeating( &VrShellGl::DrawFrameSubmitWhenReady, base::Unretained(this))); task_runner_->PostTask( FROM_HERE, @@ -1146,7 +1147,7 @@ fence->ClientWaitWithTimeoutNanos(kWebVRFenceCheckTimeout.InMicroseconds() * 1000); if (!fence->HasCompleted()) { - webvr_delayed_frame_submit_.Reset(base::Bind( + webvr_delayed_frame_submit_.Reset(base::BindRepeating( &VrShellGl::DrawFrameSubmitWhenReady, base::Unretained(this))); task_runner_->PostTask( FROM_HERE, @@ -1354,7 +1355,7 @@ OnWebVRFrameAvailable(); } vsync_helper_.RequestVSync( - base::Bind(&VrShellGl::OnVSync, base::Unretained(this))); + base::BindRepeating(&VrShellGl::OnVSync, base::Unretained(this))); bool can_send_webvr_vsync = ui_->CanSendWebVrVSync(); if (!last_should_send_webvr_vsync_ && can_send_webvr_vsync) {
diff --git a/chrome/browser/android/vr_shell/vr_shell_gl.h b/chrome/browser/android/vr/vr_shell_gl.h similarity index 95% rename from chrome/browser/android/vr_shell/vr_shell_gl.h rename to chrome/browser/android/vr/vr_shell_gl.h index 56fb96b..872c358 100644 --- a/chrome/browser/android/vr_shell/vr_shell_gl.h +++ b/chrome/browser/android/vr/vr_shell_gl.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_VR_SHELL_GL_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_VR_SHELL_GL_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_VR_SHELL_GL_H_ +#define CHROME_BROWSER_ANDROID_VR_VR_SHELL_GL_H_ #include <memory> #include <utility> @@ -15,9 +15,9 @@ #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/single_thread_task_runner.h" -#include "chrome/browser/android/vr_shell/android_vsync_helper.h" -#include "chrome/browser/android/vr_shell/vr_controller.h" -#include "chrome/browser/android/vr_shell/vr_dialog.h" +#include "chrome/browser/android/vr/android_vsync_helper.h" +#include "chrome/browser/android/vr/vr_controller.h" +#include "chrome/browser/android/vr/vr_dialog.h" #include "chrome/browser/vr/assets_load_status.h" #include "chrome/browser/vr/content_input_delegate.h" #include "chrome/browser/vr/fps_meter.h" @@ -321,8 +321,8 @@ AndroidVSyncHelper vsync_helper_; - base::CancelableCallback<void()> webvr_frame_timeout_; - base::CancelableCallback<void()> webvr_spinner_timeout_; + base::CancelableOnceCallback<void()> webvr_frame_timeout_; + base::CancelableOnceCallback<void()> webvr_spinner_timeout_; base::CancelableCallback< void(int16_t, const gfx::Transform&, std::unique_ptr<gl::GLFenceEGL>)> webvr_delayed_frame_submit_; @@ -345,4 +345,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_VR_SHELL_GL_H_ +#endif // CHROME_BROWSER_ANDROID_VR_VR_SHELL_GL_H_
diff --git a/chrome/browser/android/vr_shell/vr_usage_monitor.cc b/chrome/browser/android/vr/vr_usage_monitor.cc similarity index 99% rename from chrome/browser/android/vr_shell/vr_usage_monitor.cc rename to chrome/browser/android/vr/vr_usage_monitor.cc index 7197f4f..6fc74cd 100644 --- a/chrome/browser/android/vr_shell/vr_usage_monitor.cc +++ b/chrome/browser/android/vr/vr_usage_monitor.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/vr_shell/vr_usage_monitor.h" +#include "chrome/browser/android/vr/vr_usage_monitor.h" #include "base/logging.h" #include "base/metrics/histogram_macros.h"
diff --git a/chrome/browser/android/vr_shell/vr_usage_monitor.h b/chrome/browser/android/vr/vr_usage_monitor.h similarity index 94% rename from chrome/browser/android/vr_shell/vr_usage_monitor.h rename to chrome/browser/android/vr/vr_usage_monitor.h index 680cfec..36bde9fd5 100644 --- a/chrome/browser/android/vr_shell/vr_usage_monitor.h +++ b/chrome/browser/android/vr/vr_usage_monitor.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_VR_USAGE_MONITOR_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_VR_USAGE_MONITOR_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_VR_USAGE_MONITOR_H_ +#define CHROME_BROWSER_ANDROID_VR_VR_USAGE_MONITOR_H_ #include <memory> @@ -101,4 +101,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_VR_USAGE_MONITOR_H_ +#endif // CHROME_BROWSER_ANDROID_VR_VR_USAGE_MONITOR_H_
diff --git a/chrome/browser/android/vr_shell/vr_web_contents_observer.cc b/chrome/browser/android/vr/vr_web_contents_observer.cc similarity index 94% rename from chrome/browser/android/vr_shell/vr_web_contents_observer.cc rename to chrome/browser/android/vr/vr_web_contents_observer.cc index e8026bd..c1674d6 100644 --- a/chrome/browser/android/vr_shell/vr_web_contents_observer.cc +++ b/chrome/browser/android/vr/vr_web_contents_observer.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 "chrome/browser/android/vr_shell/vr_web_contents_observer.h" +#include "chrome/browser/android/vr/vr_web_contents_observer.h" -#include "chrome/browser/android/vr_shell/vr_shell.h" +#include "chrome/browser/android/vr/vr_shell.h" #include "chrome/browser/vr/toolbar_helper.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/render_widget_host.h"
diff --git a/chrome/browser/android/vr_shell/vr_web_contents_observer.h b/chrome/browser/android/vr/vr_web_contents_observer.h similarity index 89% rename from chrome/browser/android/vr_shell/vr_web_contents_observer.h rename to chrome/browser/android/vr/vr_web_contents_observer.h index b224362..8b80b298 100644 --- a/chrome/browser/android/vr_shell/vr_web_contents_observer.h +++ b/chrome/browser/android/vr/vr_web_contents_observer.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_VR_WEB_CONTENTS_OBSERVER_H_ -#define CHROME_BROWSER_ANDROID_VR_SHELL_VR_WEB_CONTENTS_OBSERVER_H_ +#ifndef CHROME_BROWSER_ANDROID_VR_VR_WEB_CONTENTS_OBSERVER_H_ +#define CHROME_BROWSER_ANDROID_VR_VR_WEB_CONTENTS_OBSERVER_H_ #include "base/macros.h" #include "content/public/browser/web_contents_observer.h" @@ -56,4 +56,4 @@ } // namespace vr -#endif // CHROME_BROWSER_ANDROID_VR_SHELL_VR_WEB_CONTENTS_OBSERVER_H_ +#endif // CHROME_BROWSER_ANDROID_VR_VR_WEB_CONTENTS_OBSERVER_H_
diff --git a/chrome/browser/browsing_data/counters/site_data_counting_helper.cc b/chrome/browser/browsing_data/counters/site_data_counting_helper.cc index e1a0db7..3470aef 100644 --- a/chrome/browser/browsing_data/counters/site_data_counting_helper.cc +++ b/chrome/browser/browsing_data/counters/site_data_counting_helper.cc
@@ -56,9 +56,9 @@ if (quota_manager) { // Count origins with filesystem, websql, appcache, indexeddb, // serviceworkers and cachestorage using quota manager. - storage::GetOriginsCallback origins_callback = - base::Bind(&SiteDataCountingHelper::GetQuotaOriginsCallback, - base::Unretained(this)); + auto origins_callback = + base::BindRepeating(&SiteDataCountingHelper::GetQuotaOriginsCallback, + base::Unretained(this)); const blink::mojom::StorageType types[] = { blink::mojom::StorageType::kTemporary, blink::mojom::StorageType::kPersistent,
diff --git a/chrome/browser/browsing_data/navigation_entry_remover_browsertest.cc b/chrome/browser/browsing_data/navigation_entry_remover_browsertest.cc index a3a05b2..1387383 100644 --- a/chrome/browser/browsing_data/navigation_entry_remover_browsertest.cc +++ b/chrome/browser/browsing_data/navigation_entry_remover_browsertest.cc
@@ -260,7 +260,7 @@ EXPECT_EQ(1U, tab_service->entries().size()); auto* tab = static_cast<sessions::TabRestoreService::Tab*>( tab_service->entries().front().get()); - EXPECT_EQ(url_d_, tab->navigations.back().virtual_url()); + EXPECT_EQ(url_d_, tab->navigations.front().virtual_url()); EXPECT_TRUE(tab_service->IsLoaded()); browsing_data::RemoveNavigationEntries( @@ -268,3 +268,51 @@ {history::URLResult(url_d_, base::Time())}); EXPECT_EQ(0U, tab_service->entries().size()); } + +IN_PROC_BROWSER_TEST_F(NavigationEntryRemoverTest, RecentTabWindowDeletion) { + AddBrowser(browser(), {url_a_}); + Browser* new_browser = BrowserList::GetInstance()->GetLastActive(); + AddTab(new_browser, {url_b_, url_c_}); + AddTab(new_browser, {url_d_}); + chrome::CloseWindow(new_browser); + + sessions::TabRestoreService* tab_service = + TabRestoreServiceFactory::GetForProfile(browser()->profile()); + EXPECT_EQ(1U, tab_service->entries().size()); + ASSERT_EQ(sessions::TabRestoreService::WINDOW, + tab_service->entries().front()->type); + auto* window = static_cast<sessions::TabRestoreService::Window*>( + tab_service->entries().front().get()); + EXPECT_EQ(3U, window->tabs.size()); + + // Delete b and d. + browsing_data::RemoveNavigationEntries( + browser()->profile(), history::DeletionTimeRange::Invalid(), + {history::URLResult(url_b_, base::Time()), + history::URLResult(url_d_, base::Time())}); + content::RunAllTasksUntilIdle(); + EXPECT_EQ(1U, tab_service->entries().size()); + ASSERT_EQ(sessions::TabRestoreService::WINDOW, + tab_service->entries().front()->type); + window = static_cast<sessions::TabRestoreService::Window*>( + tab_service->entries().front().get()); + EXPECT_EQ(2U, window->tabs.size()); + EXPECT_EQ(2U, window->tabs.size()); + EXPECT_EQ(0, window->selected_tab_index); + EXPECT_EQ(0, window->tabs[0]->tabstrip_index); + EXPECT_EQ(1, window->tabs[1]->tabstrip_index); + EXPECT_EQ(url_a_, window->tabs[0]->navigations.front().virtual_url()); + EXPECT_EQ(url_c_, window->tabs[1]->navigations.front().virtual_url()); + + // Delete a. The Window should be converted to a Tab. + browsing_data::RemoveNavigationEntries( + browser()->profile(), history::DeletionTimeRange::Invalid(), + {history::URLResult(url_a_, base::Time())}); + EXPECT_EQ(1U, tab_service->entries().size()); + ASSERT_EQ(sessions::TabRestoreService::TAB, + tab_service->entries().front()->type); + auto* tab = static_cast<sessions::TabRestoreService::Tab*>( + tab_service->entries().front().get()); + EXPECT_EQ(url_c_, tab->navigations.front().virtual_url()); + EXPECT_EQ(0, tab->tabstrip_index); +}
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index b72d5af..cd7bd900 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -2721,6 +2721,9 @@ web_prefs->embedded_media_experience_enabled = tab_android->ShouldEnableEmbeddedMediaExperience(); + web_prefs->picture_in_picture_enabled = + tab_android->IsPictureInPictureEnabled(); + if (base::FeatureList::IsEnabled( features::kAllowAutoplayUnmutedInWebappManifestScope)) { web_prefs->media_playback_gesture_whitelist_scope =
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index ef2e07a..c13b059 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -1750,6 +1750,7 @@ "accessibility/spoken_feedback_event_rewriter_unittest.cc", "app_mode/startup_app_launcher_unittest.cc", "arc/accessibility/arc_accessibility_helper_bridge_unittest.cc", + "arc/accessibility/ax_tree_source_arc_unittest.cc", "arc/arc_play_store_enabled_preference_handler_unittest.cc", "arc/arc_session_manager_unittest.cc", "arc/arc_support_host_unittest.cc",
diff --git a/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.cc b/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.cc index 11b2595f..40a50db 100644 --- a/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.cc +++ b/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.cc
@@ -408,6 +408,12 @@ return true; } +void AXTreeSourceArc::GetChildrenForTest( + mojom::AccessibilityNodeInfoData* node, + std::vector<mojom::AccessibilityNodeInfoData*>* out_children) const { + GetChildren(node, out_children); +} + mojom::AccessibilityNodeInfoData* AXTreeSourceArc::GetRoot() const { mojom::AccessibilityNodeInfoData* root = GetFromId(root_id_); return root; @@ -437,9 +443,43 @@ if (it == node->int_list_properties->end()) return; - for (size_t i = 0; i < it->second.size(); ++i) { + for (size_t i = 0; i < it->second.size(); ++i) out_children->push_back(GetFromId(it->second[i])); - } + + // Sort children based on their enclosing bounding rectangles, based on their + // descendants. + std::sort(out_children->begin(), out_children->end(), + [this](auto left, auto right) { + auto left_bounds = ComputeEnclosingBounds(left); + auto right_bounds = ComputeEnclosingBounds(right); + + // Top to bottom sort (non-overlapping). + if (!left_bounds.Intersects(right_bounds)) + return left_bounds.y() < right_bounds.y(); + + // Overlapping + // Left to right. + int left_difference = left_bounds.x() - right_bounds.x(); + if (left_difference != 0) + return left_difference < 0; + + // Top to bottom. + int top_difference = left_bounds.y() - right_bounds.y(); + if (top_difference != 0) + return top_difference < 0; + + // Larger to smaller. + int height_difference = + left_bounds.height() - right_bounds.height(); + if (height_difference != 0) + return height_difference > 0; + + int width_difference = left_bounds.width() - right_bounds.width(); + if (width_difference != 0) + return width_difference > 0; + + return true; + }); } mojom::AccessibilityNodeInfoData* AXTreeSourceArc::GetParent( @@ -529,7 +569,7 @@ if (root_id_ != -1 && wm_helper) { aura::Window* focused_window = is_notification_ ? nullptr : wm_helper->GetFocusedWindow(); - const gfx::Rect local_bounds = GetBounds(node, focused_window); + const gfx::Rect& local_bounds = GetBounds(node, focused_window); out_data->location.SetRect(local_bounds.x(), local_bounds.y(), local_bounds.width(), local_bounds.height()); } @@ -595,6 +635,44 @@ return node_bounds; } +gfx::Rect AXTreeSourceArc::ComputeEnclosingBounds( + mojom::AccessibilityNodeInfoData* node) const { + gfx::Rect computed_bounds; + ComputeEnclosingBoundsInternal(node, computed_bounds); + return computed_bounds.IsEmpty() ? node->bounds_in_screen : computed_bounds; +} + +void AXTreeSourceArc::ComputeEnclosingBoundsInternal( + mojom::AccessibilityNodeInfoData* node, + gfx::Rect& computed_bounds) const { + // Only consider nodes that can possibly be accessibility focused. In Chrome, + // this amounts to nodes with a non-generic container role. + ui::AXNodeData data; + PopulateAXRole(node, &data); + const gfx::Rect& bounds = node->bounds_in_screen; + if (data.role != ax::mojom::Role::kGenericContainer && + data.role != ax::mojom::Role::kGroup && !bounds.IsEmpty() && + GetBooleanProperty( + node, arc::mojom::AccessibilityBooleanProperty::VISIBLE_TO_USER)) { + computed_bounds.Union(bounds); + return; + } + + if (!node->int_list_properties) + return; + + auto it = node->int_list_properties->find( + arc::mojom::AccessibilityIntListProperty::CHILD_NODE_IDS); + if (it == node->int_list_properties->end()) + return; + + for (size_t i = 0; i < it->second.size(); ++i) { + ComputeEnclosingBoundsInternal(GetFromId(it->second[i]), computed_bounds); + } + + return; +} + void AXTreeSourceArc::PerformAction(const ui::AXActionData& data) { delegate_->OnAction(data); }
diff --git a/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h b/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h index bfbabcc78..0efbf11 100644 --- a/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h +++ b/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h
@@ -59,6 +59,11 @@ // Gets the window id of this tree. int32_t window_id() const { return window_id_; } + // Gets children for testing. + void GetChildrenForTest( + mojom::AccessibilityNodeInfoData* node, + std::vector<mojom::AccessibilityNodeInfoData*>* out_children) const; + private: class FocusStealer; @@ -88,6 +93,15 @@ const gfx::Rect GetBounds(mojom::AccessibilityNodeInfoData* node, aura::Window* focused_window) const; + // Computes the smallest rect that encloses all of the descendants of |node|. + gfx::Rect ComputeEnclosingBounds( + mojom::AccessibilityNodeInfoData* node) const; + + // Helper to recursively compute bounds for |node|. Returns true if non-empty + // bounds were encountered. + void ComputeEnclosingBoundsInternal(mojom::AccessibilityNodeInfoData* node, + gfx::Rect& computed_bounds) const; + // AXHostDelegate overrides. void PerformAction(const ui::AXActionData& data) override;
diff --git a/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc_unittest.cc b/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc_unittest.cc new file mode 100644 index 0000000..ba960ecb --- /dev/null +++ b/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc_unittest.cc
@@ -0,0 +1,162 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h" + +#include "components/arc/common/accessibility_helper.mojom.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/accessibility/platform/ax_android_constants.h" + +namespace arc { + +class AXTreeSourceArcTest : public testing::Test, + public AXTreeSourceArc::Delegate { + public: + AXTreeSourceArcTest() = default; + + private: + void OnAction(const ui::AXActionData& data) const override {} + + DISALLOW_COPY_AND_ASSIGN(AXTreeSourceArcTest); +}; + +TEST_F(AXTreeSourceArcTest, ReorderChildrenByLayout) { + AXTreeSourceArc tree(this); + + auto event1 = arc::mojom::AccessibilityEventData::New(); + event1->source_id = 0; + event1->task_id = 1; + event1->event_type = arc::mojom::AccessibilityEventType::VIEW_FOCUSED; + event1->node_data.push_back(arc::mojom::AccessibilityNodeInfoData::New()); + event1->node_data[0]->id = 0; + event1->node_data[0]->int_list_properties = + std::unordered_map<arc::mojom::AccessibilityIntListProperty, + std::vector<int>>(); + event1->node_data[0]->int_list_properties.value().insert( + std::make_pair(arc::mojom::AccessibilityIntListProperty::CHILD_NODE_IDS, + std::vector<int>({1, 2}))); + + // Child button. + event1->node_data.push_back(arc::mojom::AccessibilityNodeInfoData::New()); + event1->node_data[1]->id = 1; + event1->node_data[1]->string_properties = + std::unordered_map<arc::mojom::AccessibilityStringProperty, + std::string>(); + event1->node_data[1]->string_properties.value().insert( + std::make_pair(arc::mojom::AccessibilityStringProperty::CLASS_NAME, + ui::kAXButtonClassname)); + event1->node_data[1]->boolean_properties = + std::unordered_map<arc::mojom::AccessibilityBooleanProperty, bool>(); + event1->node_data[1]->boolean_properties.value().insert(std::make_pair( + arc::mojom::AccessibilityBooleanProperty::VISIBLE_TO_USER, true)); + + // Another child button. + event1->node_data.push_back(arc::mojom::AccessibilityNodeInfoData::New()); + event1->node_data[2]->id = 2; + event1->node_data[2]->string_properties = + std::unordered_map<arc::mojom::AccessibilityStringProperty, + std::string>(); + event1->node_data[2]->string_properties.value().insert( + std::make_pair(arc::mojom::AccessibilityStringProperty::CLASS_NAME, + ui::kAXButtonClassname)); + event1->node_data[2]->boolean_properties = + std::unordered_map<arc::mojom::AccessibilityBooleanProperty, bool>(); + event1->node_data[2]->boolean_properties.value().insert(std::make_pair( + arc::mojom::AccessibilityBooleanProperty::VISIBLE_TO_USER, true)); + + // Populate the tree source with the data. + tree.NotifyAccessibilityEvent(event1.get()); + + // Live edit the data sources to exercise each layout. + + // Non-overlapping, bottom to top. + event1->node_data[1]->bounds_in_screen = gfx::Rect(100, 100, 100, 100); + event1->node_data[2]->bounds_in_screen = gfx::Rect(0, 0, 50, 50); + std::vector<mojom::AccessibilityNodeInfoData*> top_to_bottom; + tree.GetChildrenForTest(event1->node_data[0].get(), &top_to_bottom); + ASSERT_EQ(2U, top_to_bottom.size()); + ASSERT_EQ(2, top_to_bottom[0]->id); + ASSERT_EQ(1, top_to_bottom[1]->id); + + // Non-overlapping, top to bottom. + event1->node_data[1]->bounds_in_screen = gfx::Rect(0, 0, 50, 50); + event1->node_data[2]->bounds_in_screen = gfx::Rect(100, 100, 100, 100); + top_to_bottom.clear(); + tree.GetChildrenForTest(event1->node_data[0].get(), &top_to_bottom); + ASSERT_EQ(2U, top_to_bottom.size()); + ASSERT_EQ(1, top_to_bottom[0]->id); + ASSERT_EQ(2, top_to_bottom[1]->id); + + // Overlapping; right to left. + event1->node_data[1]->bounds_in_screen = gfx::Rect(101, 100, 99, 100); + event1->node_data[2]->bounds_in_screen = gfx::Rect(100, 100, 100, 100); + std::vector<mojom::AccessibilityNodeInfoData*> left_to_right; + tree.GetChildrenForTest(event1->node_data[0].get(), &left_to_right); + ASSERT_EQ(2U, left_to_right.size()); + ASSERT_EQ(2, left_to_right[0]->id); + ASSERT_EQ(1, left_to_right[1]->id); + + // Overlapping; left to right. + event1->node_data[1]->bounds_in_screen = gfx::Rect(100, 100, 100, 100); + event1->node_data[2]->bounds_in_screen = gfx::Rect(101, 100, 99, 100); + left_to_right.clear(); + tree.GetChildrenForTest(event1->node_data[0].get(), &left_to_right); + ASSERT_EQ(2U, left_to_right.size()); + ASSERT_EQ(1, left_to_right[0]->id); + ASSERT_EQ(2, left_to_right[1]->id); + + // Overlapping, bottom to top. + event1->node_data[1]->bounds_in_screen = gfx::Rect(100, 100, 100, 100); + event1->node_data[2]->bounds_in_screen = gfx::Rect(100, 99, 100, 100); + top_to_bottom.clear(); + tree.GetChildrenForTest(event1->node_data[0].get(), &top_to_bottom); + ASSERT_EQ(2U, top_to_bottom.size()); + ASSERT_EQ(2, top_to_bottom[0]->id); + ASSERT_EQ(1, top_to_bottom[1]->id); + + // Overlapping, top to bottom. + event1->node_data[1]->bounds_in_screen = gfx::Rect(100, 99, 100, 100); + event1->node_data[2]->bounds_in_screen = gfx::Rect(100, 100, 100, 100); + top_to_bottom.clear(); + tree.GetChildrenForTest(event1->node_data[0].get(), &top_to_bottom); + ASSERT_EQ(2U, top_to_bottom.size()); + ASSERT_EQ(1, top_to_bottom[0]->id); + ASSERT_EQ(2, top_to_bottom[1]->id); + + // Identical. smaller to larger. + event1->node_data[1]->bounds_in_screen = gfx::Rect(100, 100, 100, 10); + event1->node_data[2]->bounds_in_screen = gfx::Rect(100, 100, 100, 100); + std::vector<mojom::AccessibilityNodeInfoData*> dimension; + tree.GetChildrenForTest(event1->node_data[0].get(), &dimension); + ASSERT_EQ(2U, dimension.size()); + ASSERT_EQ(2, dimension[0]->id); + ASSERT_EQ(1, dimension[1]->id); + + event1->node_data[1]->bounds_in_screen = gfx::Rect(100, 100, 10, 100); + event1->node_data[2]->bounds_in_screen = gfx::Rect(100, 100, 100, 100); + dimension.clear(); + tree.GetChildrenForTest(event1->node_data[0].get(), &dimension); + ASSERT_EQ(2U, dimension.size()); + ASSERT_EQ(2, dimension[0]->id); + ASSERT_EQ(1, dimension[1]->id); + + // Identical. Larger to smaller. + event1->node_data[1]->bounds_in_screen = gfx::Rect(100, 100, 100, 100); + event1->node_data[2]->bounds_in_screen = gfx::Rect(100, 100, 100, 10); + dimension.clear(); + tree.GetChildrenForTest(event1->node_data[0].get(), &dimension); + ASSERT_EQ(2U, dimension.size()); + ASSERT_EQ(1, dimension[0]->id); + ASSERT_EQ(2, dimension[1]->id); + + event1->node_data[1]->bounds_in_screen = gfx::Rect(100, 100, 100, 100); + event1->node_data[2]->bounds_in_screen = gfx::Rect(100, 100, 10, 100); + dimension.clear(); + tree.GetChildrenForTest(event1->node_data[0].get(), &dimension); + ASSERT_EQ(2U, dimension.size()); + ASSERT_EQ(1, dimension[0]->id); + ASSERT_EQ(2, dimension[1]->id); +} + +} // namespace arc
diff --git a/chrome/browser/chromeos/file_system_provider/fileapi/provider_async_file_util_unittest.cc b/chrome/browser/chromeos/file_system_provider/fileapi/provider_async_file_util_unittest.cc index 07932d2..9b44a43 100644 --- a/chrome/browser/chromeos/file_system_provider/fileapi/provider_async_file_util_unittest.cc +++ b/chrome/browser/chromeos/file_system_provider/fileapi/provider_async_file_util_unittest.cc
@@ -53,8 +53,7 @@ result_.reset(new base::File::Error(error)); } - void OnCreateOrOpen(base::File file, - const base::Closure& on_close_callback) { + void OnCreateOrOpen(base::File file, base::OnceClosure on_close_callback) { if (file.IsValid()) result_.reset(new base::File::Error(base::File::FILE_OK));
diff --git a/chrome/browser/chromeos/power/ml/idle_event_notifier.cc b/chrome/browser/chromeos/power/ml/idle_event_notifier.cc index 96218f0..58bf275 100644 --- a/chrome/browser/chromeos/power/ml/idle_event_notifier.cc +++ b/chrome/browser/chromeos/power/ml/idle_event_notifier.cc
@@ -112,11 +112,16 @@ } void IdleEventNotifier::SuspendDone(const base::TimeDelta& sleep_duration) { - // TODO(jiameng): consider check sleep_duration to decide whether to log - // event. - DCHECK(!idle_delay_timer_.IsRunning()); + if (idle_delay_timer_.IsRunning()) { + idle_delay_timer_.AbandonAndStop(); + } + // SuspendDone is triggered by user opening the lid (or other user // activities). + if (sleep_duration >= idle_delay_) { + internal_data_->last_activity_since_boot = base::TimeDelta(); + internal_data_->earliest_activity_since_boot = base::nullopt; + } UpdateActivityData(ActivityType::USER_OTHER); ResetIdleDelayTimer(); } @@ -208,7 +213,11 @@ for (auto& observer : observers_) observer.OnIdleEventObserved(data); - internal_data_ = std::make_unique<ActivityDataInternal>(); + // Only clears out |last_activity_since_boot| and + // |earliest_activity_since_boot because they are used to calculate recent + // time active, which should be reset between idle events. + internal_data_->last_activity_since_boot = base::TimeDelta(); + internal_data_->earliest_activity_since_boot = base::nullopt; } void IdleEventNotifier::UpdateActivityData(ActivityType type) {
diff --git a/chrome/browser/chromeos/power/ml/idle_event_notifier_unittest.cc b/chrome/browser/chromeos/power/ml/idle_event_notifier_unittest.cc index 6005d38..fb00ad1 100644 --- a/chrome/browser/chromeos/power/ml/idle_event_notifier_unittest.cc +++ b/chrome/browser/chromeos/power/ml/idle_event_notifier_unittest.cc
@@ -216,17 +216,48 @@ FastForwardAndCheckResults(0, data); } -// SuspendDone means user is back to active, hence it will trigger a future idle -// event. -TEST_F(IdleEventNotifierTest, SuspendDone) { - base::Time now = task_runner_->Now(); - idle_event_notifier_->SuspendDone(base::TimeDelta::FromSeconds(1)); +// Short sleep duration behaves as if there was no idle period. +TEST_F(IdleEventNotifierTest, ShortSuspendDone) { + base::Time now_1 = task_runner_->Now(); + idle_event_notifier_->PowerChanged(ac_power_); + + task_runner_->FastForwardBy(base::TimeDelta::FromSeconds(10)); + idle_event_notifier_->SuspendImminent( + power_manager::SuspendImminent_Reason_LID_CLOSED); + idle_event_notifier_->SuspendDone(idle_event_notifier_->idle_delay() / 2); + task_runner_->FastForwardBy(idle_event_notifier_->idle_delay() / 2); + base::Time now_2 = task_runner_->Now(); + idle_event_notifier_->PowerChanged(disconnected_power_); + IdleEventNotifier::ActivityData data; - data.last_activity_day = GetDayOfWeek(now); - const base::TimeDelta time_of_day = GetTimeSinceMidnight(now); + data.last_activity_day = GetDayOfWeek(now_2); + const base::TimeDelta time_of_day = GetTimeSinceMidnight(now_2); data.last_activity_time_of_day = time_of_day; data.last_user_activity_time_of_day = time_of_day; - data.recent_time_active = base::TimeDelta(); + data.recent_time_active = now_2 - now_1; + FastForwardAndCheckResults(1, data); +} + +// Long sleep duration behaves as if there was an idle period. +TEST_F(IdleEventNotifierTest, LongSuspendDone) { + idle_event_notifier_->PowerChanged(ac_power_); + + task_runner_->FastForwardBy(base::TimeDelta::FromSeconds(10)); + idle_event_notifier_->SuspendImminent( + power_manager::SuspendImminent_Reason_LID_CLOSED); + idle_event_notifier_->SuspendDone(idle_event_notifier_->idle_delay() + + base::TimeDelta::FromSeconds(10)); + base::Time now_1 = task_runner_->Now(); + task_runner_->FastForwardBy(idle_event_notifier_->idle_delay() / 2); + base::Time now_2 = task_runner_->Now(); + idle_event_notifier_->PowerChanged(disconnected_power_); + + IdleEventNotifier::ActivityData data; + data.last_activity_day = GetDayOfWeek(now_2); + const base::TimeDelta time_of_day = GetTimeSinceMidnight(now_2); + data.last_activity_time_of_day = time_of_day; + data.last_user_activity_time_of_day = time_of_day; + data.recent_time_active = now_2 - now_1; FastForwardAndCheckResults(1, data); } @@ -349,6 +380,44 @@ FastForwardAndCheckResults(1, data); } +TEST_F(IdleEventNotifierTest, IdleEventFieldReset) { + base::Time now_1 = task_runner_->Now(); + ui::KeyEvent key_event(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_NONE); + idle_event_notifier_->OnUserActivity(&key_event); + + task_runner_->FastForwardBy(base::TimeDelta::FromSeconds(10)); + base::Time now_2 = task_runner_->Now(); + ui::MouseEvent mouse_event(ui::ET_MOUSE_EXITED, gfx::Point(0, 0), + gfx::Point(0, 0), base::TimeTicks(), 0, 0); + idle_event_notifier_->OnUserActivity(&mouse_event); + + IdleEventNotifier::ActivityData data_1; + data_1.last_activity_day = GetDayOfWeek(now_2); + const base::TimeDelta time_of_day_2 = GetTimeSinceMidnight(now_2); + data_1.last_activity_time_of_day = time_of_day_2; + data_1.last_user_activity_time_of_day = time_of_day_2; + data_1.recent_time_active = now_2 - now_1; + data_1.time_since_last_key = + idle_event_notifier_->idle_delay() + now_2 - now_1; + data_1.time_since_last_mouse = idle_event_notifier_->idle_delay(); + FastForwardAndCheckResults(1, data_1); + + idle_event_notifier_->PowerChanged(ac_power_); + base::Time now_3 = task_runner_->Now(); + + IdleEventNotifier::ActivityData data_2; + data_2.last_activity_day = GetDayOfWeek(now_3); + const base::TimeDelta time_of_day_3 = GetTimeSinceMidnight(now_3); + data_2.last_activity_time_of_day = time_of_day_3; + data_2.last_user_activity_time_of_day = time_of_day_3; + data_2.recent_time_active = base::TimeDelta(); + data_2.time_since_last_key = + idle_event_notifier_->idle_delay() + now_3 - now_1; + data_2.time_since_last_mouse = + idle_event_notifier_->idle_delay() + now_3 - now_2; + FastForwardAndCheckResults(2, data_2); +} + } // namespace ml } // namespace power } // namespace chromeos
diff --git a/chrome/browser/extensions/api/notifications/extension_notification_handler.cc b/chrome/browser/extensions/api/notifications/extension_notification_handler.cc index 317f3e2..da8e0798 100644 --- a/chrome/browser/extensions/api/notifications/extension_notification_handler.cc +++ b/chrome/browser/extensions/api/notifications/extension_notification_handler.cc
@@ -12,6 +12,8 @@ #include "chrome/browser/extensions/api/notifications/extension_notification_display_helper.h" #include "chrome/browser/extensions/api/notifications/extension_notification_display_helper_factory.h" #include "chrome/browser/notifications/notification_common.h" +#include "chrome/browser/notifications/notifier_state_tracker.h" +#include "chrome/browser/notifications/notifier_state_tracker_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/extensions/api/notifications.h" #include "extensions/browser/app_window/app_window.h" @@ -107,6 +109,14 @@ std::move(completed_closure).Run(); } +void ExtensionNotificationHandler::DisableNotifications(Profile* profile, + const GURL& origin) { + message_center::NotifierId notifier_id( + message_center::NotifierId::APPLICATION, origin.host()); + NotifierStateTrackerFactory::GetForProfile(profile)->SetNotifierEnabled( + notifier_id, false /* enabled */); +} + void ExtensionNotificationHandler::SendEvent( Profile* profile, const std::string& extension_id,
diff --git a/chrome/browser/extensions/api/notifications/extension_notification_handler.h b/chrome/browser/extensions/api/notifications/extension_notification_handler.h index 062dab0..60464d79 100644 --- a/chrome/browser/extensions/api/notifications/extension_notification_handler.h +++ b/chrome/browser/extensions/api/notifications/extension_notification_handler.h
@@ -36,6 +36,7 @@ const base::Optional<int>& action_index, const base::Optional<base::string16>& reply, base::OnceClosure completed_closure) override; + void DisableNotifications(Profile* profile, const GURL& origin) override; protected: // Overriden in unit tests.
diff --git a/chrome/browser/extensions/api/notifications/notifications_api.cc b/chrome/browser/extensions/api/notifications/notifications_api.cc index f147dc3e..0958ae1 100644 --- a/chrome/browser/extensions/api/notifications/notifications_api.cc +++ b/chrome/browser/extensions/api/notifications/notifications_api.cc
@@ -48,6 +48,7 @@ #include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/image/image_skia_rep.h" #include "ui/gfx/skia_util.h" +#include "ui/message_center/public/cpp/features.h" #include "ui/message_center/public/cpp/message_center_constants.h" #include "ui/message_center/public/cpp/notification.h" #include "ui/message_center/public/cpp/notification_delegate.h" @@ -360,6 +361,11 @@ if (options->is_clickable.get()) optional_fields.clickable = *options->is_clickable; + optional_fields.settings_button_handler = + base::FeatureList::IsEnabled(message_center::kNewStyleNotifications) + ? message_center::SettingsButtonHandler::INLINE + : message_center::SettingsButtonHandler::DELEGATE; + // TODO(crbug.com/772004): Remove the manual limitation in favor of an IDL // annotation once supported. if (id.size() > kNotificationIdLengthLimit) {
diff --git a/chrome/browser/extensions/app_data_migrator_unittest.cc b/chrome/browser/extensions/app_data_migrator_unittest.cc index 37881e8..4dc482a2 100644 --- a/chrome/browser/extensions/app_data_migrator_unittest.cc +++ b/chrome/browser/extensions/app_data_migrator_unittest.cc
@@ -180,8 +180,7 @@ content::RunAllTasksUntilIdle(); } -void VerifyFileContents(base::File file, - const base::Closure& on_close_callback) { +void VerifyFileContents(base::File file, base::OnceClosure on_close_callback) { ASSERT_EQ(14, file.GetLength()); std::unique_ptr<char[]> buffer(new char[15]); @@ -194,7 +193,7 @@ file.Close(); if (!on_close_callback.is_null()) - on_close_callback.Run(); + std::move(on_close_callback).Run(); base::RunLoop::QuitCurrentWhenIdleDeprecated(); }
diff --git a/chrome/browser/extensions/bookmark_app_navigation_throttle.cc b/chrome/browser/extensions/bookmark_app_navigation_throttle.cc index 3cbf67d..f136622 100644 --- a/chrome/browser/extensions/bookmark_app_navigation_throttle.cc +++ b/chrome/browser/extensions/bookmark_app_navigation_throttle.cc
@@ -415,7 +415,7 @@ switch (result.action()) { case content::NavigationThrottle::DEFER: open_in_app_result = - ProcessNavigationResult::kDeferOpenAppCloseEmptyWebContents; + ProcessNavigationResult::kDeferMovingContentsToNewAppWindow; break; case content::NavigationThrottle::CANCEL_AND_IGNORE: open_in_app_result = ProcessNavigationResult::kCancelOpenedApp; @@ -423,7 +423,7 @@ default: NOTREACHED(); open_in_app_result = - ProcessNavigationResult::kDeferOpenAppCloseEmptyWebContents; + ProcessNavigationResult::kDeferMovingContentsToNewAppWindow; } RecordProcessNavigationResult(open_in_app_result); @@ -454,26 +454,16 @@ scoped_refptr<const Extension> target_app) { content::WebContents* source = navigation_handle()->GetWebContents(); if (source->GetController().IsInitialNavigation()) { - // When a new WebContents has no opener, the first navigation will happen - // synchronously. This could result in us opening the app and then focusing - // the original WebContents. To avoid this we open the app asynchronously. - if (!source->HasOpener()) { - DVLOG(1) << "Deferring opening app."; - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(&BookmarkAppNavigationThrottle::OpenBookmarkApp, - weak_ptr_factory_.GetWeakPtr(), target_app)); - } else { - OpenBookmarkApp(target_app); - } - - // According to NavigationThrottle::WillStartRequest's documentation closing - // a WebContents should be done asynchronously to avoid UAFs. Closing the - // WebContents will cancel the navigation. + // The first navigation might happen synchronously. This could result in us + // trying to reparent a WebContents that hasn't been attached to a browser + // yet. To avoid this we post a task to wait for the WebContents to be + // attached to a browser window. + DVLOG(1) << "Defer reparenting WebContents into app window."; base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, - base::BindOnce(&BookmarkAppNavigationThrottle::CloseWebContents, - weak_ptr_factory_.GetWeakPtr())); + base::BindOnce( + &BookmarkAppNavigationThrottle::ReparentWebContentsAndResume, + weak_ptr_factory_.GetWeakPtr(), target_app)); return content::NavigationThrottle::DEFER; } @@ -524,6 +514,13 @@ CancelDeferredNavigation(content::NavigationThrottle::CANCEL_AND_IGNORE); } +void BookmarkAppNavigationThrottle::ReparentWebContentsAndResume( + scoped_refptr<const Extension> target_app) { + ReparentWebContentsIntoAppBrowser(navigation_handle()->GetWebContents(), + target_app.get()); + Resume(); +} + scoped_refptr<const Extension> BookmarkAppNavigationThrottle::GetAppForWindow() { SCOPED_UMA_HISTOGRAM_TIMER("Extensions.BookmarkApp.GetAppForWindowDuration");
diff --git a/chrome/browser/extensions/bookmark_app_navigation_throttle.h b/chrome/browser/extensions/bookmark_app_navigation_throttle.h index 4cc3e67..d1400f4c 100644 --- a/chrome/browser/extensions/bookmark_app_navigation_throttle.h +++ b/chrome/browser/extensions/bookmark_app_navigation_throttle.h
@@ -43,7 +43,7 @@ kProceedInBrowserFormSubmission, kProceedInBrowserSameScope, kCancelPrerenderContents, - kDeferOpenAppCloseEmptyWebContents, + kDeferMovingContentsToNewAppWindow, kCancelOpenedApp, kDeferOpenNewTabInAppOutOfScope, kProceedDispositionSingletonTab, @@ -84,6 +84,7 @@ void OpenBookmarkApp(scoped_refptr<const Extension> bookmark_app); void CloseWebContents(); void OpenInNewTab(); + void ReparentWebContentsAndResume(scoped_refptr<const Extension> target_app); // Retrieves the Bookmark App corresponding to the current window only // if the app is for an installable website.
diff --git a/chrome/browser/extensions/bookmark_app_navigation_throttle_browsertest.cc b/chrome/browser/extensions/bookmark_app_navigation_throttle_browsertest.cc index d33d4ec2..c946d1f4 100644 --- a/chrome/browser/extensions/bookmark_app_navigation_throttle_browsertest.cc +++ b/chrome/browser/extensions/bookmark_app_navigation_throttle_browsertest.cc
@@ -119,6 +119,22 @@ scoped_refptr<network::ResourceRequestBody> last_resource_request_body_; }; +bool HasOpenedWindowAndOpener(content::WebContents* opener_contents, + content::WebContents* opened_contents) { + bool has_opener; + CHECK(content::ExecuteScriptAndExtractBool( + opened_contents, "window.domAutomationController.send(!!window.opener);", + &has_opener)); + + bool has_openedWindow; + CHECK(content::ExecuteScriptAndExtractBool( + opener_contents, + "window.domAutomationController.send(!!window.openedWindow.window)", + &has_openedWindow)); + + return has_opener && has_openedWindow; +} + void ExpectNavigationResultHistogramEquals( const base::HistogramTester& histogram_tester, const std::vector<std::pair<ProcessNavigationResult, @@ -204,7 +220,7 @@ auto observer = GetTestNavigationObserver(target_url); const std::string script = base::StringPrintf( "(() => {" - " window.open('%s');" + " window.openedWindow = window.open('%s');" "})();", target_url.spec().c_str()); ASSERT_TRUE(content::ExecuteScript(web_contents, script)); @@ -610,14 +626,13 @@ base::OnceClosure action) { TestTabActionOpensAppWindow(target_url, std::move(action)); + content::WebContents* initial_web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); content::WebContents* app_web_contents = chrome::FindLastActive()->tab_strip_model()->GetActiveWebContents(); - bool has_opener; - ASSERT_TRUE(content::ExecuteScriptAndExtractBool( - app_web_contents, - "window.domAutomationController.send(!!window.opener);", &has_opener)); - EXPECT_TRUE(has_opener); + EXPECT_TRUE( + HasOpenedWindowAndOpener(initial_web_contents, app_web_contents)); } // Checks that no new windows are opened after running |action| and that the @@ -712,11 +727,8 @@ new_app_browser->tab_strip_model()->GetActiveWebContents(); EXPECT_EQ(target_url, new_app_web_contents->GetLastCommittedURL()); - bool has_opener; - ASSERT_TRUE(content::ExecuteScriptAndExtractBool( - new_app_web_contents, - "window.domAutomationController.send(!!window.opener);", &has_opener)); - EXPECT_TRUE(has_opener); + EXPECT_TRUE( + HasOpenedWindowAndOpener(app_web_contents, new_app_web_contents)); } // Checks that no new windows are opened after running |action| and that the @@ -1045,8 +1057,7 @@ ExpectNavigationResultHistogramEquals( global_histogram(), - {{ProcessNavigationResult::kDeferOpenAppCloseEmptyWebContents, 1}, - GetAppLaunchedEntry()}); + {{ProcessNavigationResult::kDeferMovingContentsToNewAppWindow, 1}}); } // Tests that Ctrl + Clicking a link to the app's app_url opens a new background @@ -1107,8 +1118,7 @@ ExpectNavigationResultHistogramEquals( global_histogram(), - {{ProcessNavigationResult::kDeferOpenAppCloseEmptyWebContents, 1}, - GetAppLaunchedEntry()}); + {{ProcessNavigationResult::kDeferMovingContentsToNewAppWindow, 1}}); } // Tests that clicking a link with target="_self" and for which the client @@ -1555,9 +1565,8 @@ ExpectNavigationResultHistogramEquals(global_histogram(), {}); } -// Tests that clicking a target=_self link with from a URL out of the Web App's -// scope but with the same origin to an in-scope URL results in a new App -// window. +// Tests that clicking a target=_self link from a URL out of the Web App's scope +// but with the same origin to an in-scope URL results in a new App window. IN_PROC_BROWSER_TEST_P(BookmarkAppNavigationThrottleLinkBrowserTest, FromOutOfScopeUrlToInScopeUrlSelf) { InstallTestBookmarkApp(); @@ -1582,7 +1591,7 @@ {{ProcessNavigationResult::kCancelOpenedApp, 1}, GetAppLaunchedEntry()}); } -// Tests that clicking a target=_blank link with from a URL out of the Web App's +// Tests that clicking a target=_blank link from a URL out of the Web App's // scope but with the same origin to an in-scope URL results in a new App // window. IN_PROC_BROWSER_TEST_P(BookmarkAppNavigationThrottleLinkBrowserTest, @@ -1606,8 +1615,7 @@ ExpectNavigationResultHistogramEquals( global_histogram(), - {{ProcessNavigationResult::kDeferOpenAppCloseEmptyWebContents, 1}, - GetAppLaunchedEntry()}); + {{ProcessNavigationResult::kDeferMovingContentsToNewAppWindow, 1}}); } // Tests that clicking links inside a website for an installed app doesn't open @@ -1827,6 +1835,6 @@ INSTANTIATE_TEST_CASE_P( /* no prefix */, BookmarkAppNavigationThrottleLinkBrowserTest, - testing::Values("noopener", "noreferrer", "nofollow")); + testing::Values("", "noopener", "noreferrer", "nofollow")); } // namespace extensions
diff --git a/chrome/browser/extensions/extension_special_storage_policy.cc b/chrome/browser/extensions/extension_special_storage_policy.cc index 4b61172..f67c1d5 100644 --- a/chrome/browser/extensions/extension_special_storage_policy.cc +++ b/chrome/browser/extensions/extension_special_storage_policy.cc
@@ -112,11 +112,11 @@ return cookie_settings_->IsCookieSessionOnly(origin); } -bool ExtensionSpecialStoragePolicy::IsStorageSessionOnlyOrBlocked( +bool ExtensionSpecialStoragePolicy::ShouldDeleteCookieOnExit( const GURL& origin) { if (cookie_settings_.get() == NULL) return false; - return cookie_settings_->IsCookieSessionOnlyOrBlocked(origin); + return cookie_settings_->ShouldDeleteCookieOnExit(origin); } bool ExtensionSpecialStoragePolicy::HasSessionOnlyOrigins() {
diff --git a/chrome/browser/extensions/extension_special_storage_policy.h b/chrome/browser/extensions/extension_special_storage_policy.h index 334bc5f..b39a09e 100644 --- a/chrome/browser/extensions/extension_special_storage_policy.h +++ b/chrome/browser/extensions/extension_special_storage_policy.h
@@ -39,7 +39,7 @@ bool IsStorageProtected(const GURL& origin) override; bool IsStorageUnlimited(const GURL& origin) override; bool IsStorageSessionOnly(const GURL& origin) override; - bool IsStorageSessionOnlyOrBlocked(const GURL& origin) override; + bool ShouldDeleteCookieOnExit(const GURL& origin) override; bool HasIsolatedStorage(const GURL& origin) override; bool HasSessionOnlyOrigins() override; bool IsStorageDurable(const GURL& origin) override;
diff --git a/chrome/browser/extensions/mock_extension_special_storage_policy.cc b/chrome/browser/extensions/mock_extension_special_storage_policy.cc index ca5e367..7ff427f 100644 --- a/chrome/browser/extensions/mock_extension_special_storage_policy.cc +++ b/chrome/browser/extensions/mock_extension_special_storage_policy.cc
@@ -20,7 +20,7 @@ return false; } -bool MockExtensionSpecialStoragePolicy::IsStorageSessionOnlyOrBlocked( +bool MockExtensionSpecialStoragePolicy::ShouldDeleteCookieOnExit( const GURL& origin) { return false; }
diff --git a/chrome/browser/extensions/mock_extension_special_storage_policy.h b/chrome/browser/extensions/mock_extension_special_storage_policy.h index 1b42b7cf..ecbe07a 100644 --- a/chrome/browser/extensions/mock_extension_special_storage_policy.h +++ b/chrome/browser/extensions/mock_extension_special_storage_policy.h
@@ -23,7 +23,7 @@ bool IsStorageProtected(const GURL& origin) override; bool IsStorageUnlimited(const GURL& origin) override; bool IsStorageSessionOnly(const GURL& origin) override; - bool IsStorageSessionOnlyOrBlocked(const GURL& origin) override; + bool ShouldDeleteCookieOnExit(const GURL& origin) override; bool HasSessionOnlyOrigins() override; void AddProtected(const GURL& origin) {
diff --git a/chrome/browser/media/webrtc/DEPS b/chrome/browser/media/webrtc/DEPS index f6e252e..294a4e5d 100644 --- a/chrome/browser/media/webrtc/DEPS +++ b/chrome/browser/media/webrtc/DEPS
@@ -1,6 +1,7 @@ include_rules = [ # TODO(mash): Remove. http://crbug.com/723880 "+ash/shell.h", + "+services/audio/public/cpp", "+third_party/libyuv", "+third_party/webrtc", ]
diff --git a/chrome/browser/media/webrtc/audio_debug_recordings_handler.cc b/chrome/browser/media/webrtc/audio_debug_recordings_handler.cc index 1fea2a93..bc9da52 100644 --- a/chrome/browser/media/webrtc/audio_debug_recordings_handler.cc +++ b/chrome/browser/media/webrtc/audio_debug_recordings_handler.cc
@@ -17,7 +17,10 @@ #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_process_host.h" +#include "content/public/common/service_manager_connection.h" #include "media/audio/audio_debug_recording_session.h" +#include "services/audio/public/cpp/debug_recording_session_factory.h" +#include "services/service_manager/public/cpp/connector.h" using content::BrowserThread; @@ -106,8 +109,10 @@ log_directory, ++current_audio_debug_recordings_id_); host->EnableAudioDebugRecordings(prefix_path); - audio_debug_recording_session_ = - media::AudioDebugRecordingSession::Create(prefix_path); + audio_debug_recording_session_ = audio::CreateAudioDebugRecordingSession( + prefix_path, content::ServiceManagerConnection::GetForProcess() + ->GetConnector() + ->Clone()); if (delay.is_zero()) { const bool is_stopped = false, is_manual_stop = false;
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc index 1616e7e..bc23d68 100644 --- a/chrome/browser/password_manager/password_manager_browsertest.cc +++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -493,6 +493,27 @@ } IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, + NoPromptForActionMutation) { + NavigateToFile("/password/password_form_action_mutation.html"); + + // Need to pay attention for a message that XHR has finished since there + // is no navigation to wait for. + content::DOMMessageQueue message_queue; + BubbleObserver prompt_observer(WebContents()); + std::string fill_and_submit = + "document.getElementById('username_action_mutation').value = 'temp';" + "document.getElementById('password_action_mutation').value = 'random';" + "document.getElementById('submit_action_mutation').click()"; + ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); + std::string message; + while (message_queue.WaitForMessage(&message)) { + if (message == "\"XHR_FINISHED\"") + break; + } + EXPECT_FALSE(prompt_observer.IsSavePromptShownAutomatically()); +} + +IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, NoPromptForFormWithEnteredUsername) { // Log in, see a form on the landing page. That form is not related to the // login form but has the same username as was entered previously, so we
diff --git a/chrome/browser/permissions/permission_context_base.cc b/chrome/browser/permissions/permission_context_base.cc index 11e24c2f..bef84f0 100644 --- a/chrome/browser/permissions/permission_context_base.cc +++ b/chrome/browser/permissions/permission_context_base.cc
@@ -44,17 +44,33 @@ const char kPermissionBlockedKillSwitchMessage[] = "%s permission has been blocked."; +#if defined(OS_ANDROID) const char kPermissionBlockedRepeatedDismissalsMessage[] = "%s permission has been blocked as the user has dismissed the permission " - "prompt several times. See " + "prompt several times. This can be reset in Site Settings. See " "https://www.chromestatus.com/features/6443143280984064 for more " "information."; const char kPermissionBlockedRepeatedIgnoresMessage[] = "%s permission has been blocked as the user has ignored the permission " - "prompt several times. See " + "prompt several times. This can be reset in Site Settings. See " "https://www.chromestatus.com/features/6443143280984064 for more " "information."; +#else +const char kPermissionBlockedRepeatedDismissalsMessage[] = + "%s permission has been blocked as the user has dismissed the permission " + "prompt several times. This can be reset in Page Info which can be " + "accessed by clicking the lock icon next to the URL. See " + "https://www.chromestatus.com/features/6443143280984064 for more " + "information."; + +const char kPermissionBlockedRepeatedIgnoresMessage[] = + "%s permission has been blocked as the user has ignored the permission " + "prompt several times. This can be reset in Page Info which can be " + "accessed by clicking the lock icon next to the URL. See " + "https://www.chromestatus.com/features/6443143280984064 for more " + "information."; +#endif const char kPermissionBlockedBlacklistMessage[] = "this origin is not allowed to request %s permission.";
diff --git a/chrome/browser/picture_in_picture/picture_in_picture_window_controller.cc b/chrome/browser/picture_in_picture/picture_in_picture_window_controller.cc index df88073..2541302 100644 --- a/chrome/browser/picture_in_picture/picture_in_picture_window_controller.cc +++ b/chrome/browser/picture_in_picture/picture_in_picture_window_controller.cc
@@ -4,7 +4,9 @@ #include "chrome/browser/picture_in_picture/picture_in_picture_window_controller.h" +#include "chrome/browser/ui/overlay/overlay_surface_embedder.h" #include "chrome/browser/ui/overlay/overlay_window.h" +#include "components/viz/common/surfaces/surface_id.h" #include "content/public/browser/web_contents.h" DEFINE_WEB_CONTENTS_USER_DATA_KEY(PictureInPictureWindowController); @@ -21,7 +23,8 @@ } PictureInPictureWindowController::~PictureInPictureWindowController() { - window_->Close(); + if (window_) + window_->Close(); } PictureInPictureWindowController::PictureInPictureWindowController( @@ -30,14 +33,14 @@ DCHECK(initiator_); } -void PictureInPictureWindowController::Show() { - if (window_ && window_->IsActive()) - return; - - if (!window_) { +void PictureInPictureWindowController::Init() { + if (!window_) window_ = OverlayWindow::Create(); - window_->Init(); - } + window_->Init(); +} + +void PictureInPictureWindowController::Show() { + DCHECK(window_); window_->Show(); } @@ -45,3 +48,16 @@ if (window_->IsActive()) window_->Close(); } + +void PictureInPictureWindowController::EmbedSurface(viz::SurfaceId surface_id) { + DCHECK(window_); + DCHECK(surface_id.is_valid()); + + embedder_.reset(new OverlaySurfaceEmbedder(window_.get())); + surface_id_ = surface_id; + embedder_->SetPrimarySurfaceId(surface_id_); +} + +OverlayWindow* PictureInPictureWindowController::GetWindowForTesting() { + return window_.get(); +}
diff --git a/chrome/browser/picture_in_picture/picture_in_picture_window_controller.h b/chrome/browser/picture_in_picture/picture_in_picture_window_controller.h index 0705ac5..de4eab64 100644 --- a/chrome/browser/picture_in_picture/picture_in_picture_window_controller.h +++ b/chrome/browser/picture_in_picture/picture_in_picture_window_controller.h
@@ -6,13 +6,19 @@ #define CHROME_BROWSER_PICTURE_IN_PICTURE_PICTURE_IN_PICTURE_WINDOW_CONTROLLER_H_ #include "base/memory/weak_ptr.h" +#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h" #include "content/public/browser/web_contents_user_data.h" namespace content { class WebContents; } +namespace viz { +class SurfaceId; +} // namespace viz + class OverlayWindow; +class OverlaySurfaceEmbedder; // Class for Picture in Picture window controllers. This is currently tied to a // WebContents |initiator| and created when a Picture in Picture window is to @@ -30,8 +36,11 @@ static PictureInPictureWindowController* GetOrCreateForWebContents( content::WebContents* initiator); + void Init(); void Show(); void Close(); + void EmbedSurface(viz::SurfaceId); + OverlayWindow* GetWindowForTesting(); private: friend class content::WebContentsUserData<PictureInPictureWindowController>; @@ -42,6 +51,9 @@ content::WebContents* const initiator_; std::unique_ptr<OverlayWindow> window_; + std::unique_ptr<OverlaySurfaceEmbedder> embedder_; + + viz::SurfaceId surface_id_; DISALLOW_COPY_AND_ASSIGN(PictureInPictureWindowController); };
diff --git a/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc b/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc new file mode 100644 index 0000000..13214eb --- /dev/null +++ b/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
@@ -0,0 +1,53 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/picture_in_picture/picture_in_picture_window_controller.h" + +#include "build/build_config.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/overlay/overlay_window.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "content/public/browser/web_contents.h" + +class PictureInPictureWindowControllerBrowserTest + : public InProcessBrowserTest { + public: + PictureInPictureWindowControllerBrowserTest() = default; + + void SetUpWindowController(content::WebContents* web_contents) { + pip_window_controller_ = + PictureInPictureWindowController::GetOrCreateForWebContents( + web_contents); + } + + PictureInPictureWindowController* window_controller() { + return pip_window_controller_; + } + + private: + PictureInPictureWindowController* pip_window_controller_ = nullptr; + + DISALLOW_COPY_AND_ASSIGN(PictureInPictureWindowControllerBrowserTest); +}; + +// Checks the creation of the window controller, as well as basic window +// creation and visibility. The window is currently only implemented in views. +#if defined(USE_AURA) +IN_PROC_BROWSER_TEST_F(PictureInPictureWindowControllerBrowserTest, + CreationAndVisibility) { + content::WebContents* active_web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + ASSERT_TRUE(active_web_contents != nullptr); + + SetUpWindowController(active_web_contents); + ASSERT_TRUE(window_controller() != nullptr); + + ASSERT_TRUE(window_controller()->GetWindowForTesting() == nullptr); + window_controller()->Init(); + ASSERT_FALSE(window_controller()->GetWindowForTesting()->IsVisible()); + window_controller()->Show(); + ASSERT_TRUE(window_controller()->GetWindowForTesting()->IsVisible()); +} +#endif
diff --git a/chrome/browser/sessions/session_data_deleter.cc b/chrome/browser/sessions/session_data_deleter.cc index 3f3e553..539e9e4 100644 --- a/chrome/browser/sessions/session_data_deleter.cc +++ b/chrome/browser/sessions/session_data_deleter.cc
@@ -108,7 +108,7 @@ for (const auto& cookie : cookies) { GURL url = net::cookie_util::CookieOriginToURL(cookie.Domain(), cookie.IsSecure()); - if (!storage_policy_->IsStorageSessionOnlyOrBlocked(url)) + if (!storage_policy_->ShouldDeleteCookieOnExit(url)) continue; // Delete a single cookie by setting its expiration time into the past.
diff --git a/chrome/browser/storage/storage_info_fetcher.cc b/chrome/browser/storage/storage_info_fetcher.cc index 0b18d77..9bca124 100644 --- a/chrome/browser/storage/storage_info_fetcher.cc +++ b/chrome/browser/storage/storage_info_fetcher.cc
@@ -55,10 +55,9 @@ this))); } -void StorageInfoFetcher::GetUsageInfo( - const storage::GetUsageInfoCallback& callback) { +void StorageInfoFetcher::GetUsageInfo(storage::GetUsageInfoCallback callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - quota_manager_->GetUsageInfo(callback); + quota_manager_->GetUsageInfo(std::move(callback)); } void StorageInfoFetcher::OnGetUsageInfoInternal(
diff --git a/chrome/browser/storage/storage_info_fetcher.h b/chrome/browser/storage/storage_info_fetcher.h index a773ff95..89fdce6a 100644 --- a/chrome/browser/storage/storage_info_fetcher.h +++ b/chrome/browser/storage/storage_info_fetcher.h
@@ -40,7 +40,7 @@ friend class base::RefCountedThreadSafe<StorageInfoFetcher>; // Fetches the usage information. - void GetUsageInfo(const storage::GetUsageInfoCallback& callback); + void GetUsageInfo(storage::GetUsageInfoCallback callback); // Called when usage information is available. void OnGetUsageInfoInternal(const storage::UsageInfoEntries& entries);
diff --git a/chrome/browser/sync_file_system/local/canned_syncable_file_system.cc b/chrome/browser/sync_file_system/local/canned_syncable_file_system.cc index b0b18248..4a63bd1 100644 --- a/chrome/browser/sync_file_system/local/canned_syncable_file_system.cc +++ b/chrome/browser/sync_file_system/local/canned_syncable_file_system.cc
@@ -193,7 +193,7 @@ DISALLOW_COPY_AND_ASSIGN(WriteHelper); }; -void DidGetUsageAndQuota(const storage::StatusCallback& callback, +void DidGetUsageAndQuota(storage::StatusCallback callback, int64_t* usage_out, int64_t* quota_out, blink::mojom::QuotaStatusCode status, @@ -201,7 +201,7 @@ int64_t quota) { *usage_out = usage; *quota_out = quota; - callback.Run(status); + std::move(callback).Run(status); } void EnsureLastTaskRuns(base::SingleThreadTaskRunner* runner) { @@ -668,7 +668,7 @@ void CannedSyncableFileSystem::DoGetUsageAndQuota( int64_t* usage, int64_t* quota, - const storage::StatusCallback& callback) { + storage::StatusCallback callback) { // crbug.com/349708 TRACE_EVENT0("io", "CannedSyncableFileSystem::DoGetUsageAndQuota"); @@ -677,7 +677,7 @@ DCHECK(quota_manager_.get()); quota_manager_->GetUsageAndQuota( origin_, storage_type(), - base::Bind(&DidGetUsageAndQuota, callback, usage, quota)); + base::BindOnce(&DidGetUsageAndQuota, std::move(callback), usage, quota)); } void CannedSyncableFileSystem::DidOpenFileSystem(
diff --git a/chrome/browser/sync_file_system/local/canned_syncable_file_system.h b/chrome/browser/sync_file_system/local/canned_syncable_file_system.h index 77fec33..1bd3ba2 100644 --- a/chrome/browser/sync_file_system/local/canned_syncable_file_system.h +++ b/chrome/browser/sync_file_system/local/canned_syncable_file_system.h
@@ -213,7 +213,7 @@ const WriteCallback& callback); void DoGetUsageAndQuota(int64_t* usage, int64_t* quota, - const storage::StatusCallback& callback); + storage::StatusCallback callback); private: typedef base::ObserverListThreadSafe<LocalFileSyncStatus::Observer>
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 6d651c5..91f4596 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -3053,6 +3053,7 @@ "views/frame/browser_root_view.h", "views/frame/browser_view.cc", "views/frame/browser_view.h", + "views/frame/browser_view_button_provider.h", "views/frame/browser_view_layout.cc", "views/frame/browser_view_layout.h", "views/frame/browser_view_layout_delegate.h",
diff --git a/chrome/browser/ui/ash/network/network_state_notifier.cc b/chrome/browser/ui/ash/network/network_state_notifier.cc index 35f23128..be5c957 100644 --- a/chrome/browser/ui/ash/network/network_state_notifier.cc +++ b/chrome/browser/ui/ash/network/network_state_notifier.cc
@@ -89,6 +89,7 @@ new message_center::HandleNotificationClickDelegate(callback), GetErrorNotificationVectorIcon(network_type), message_center::SystemNotificationWarningLevel::CRITICAL_WARNING); + notification->set_priority(message_center::SYSTEM_PRIORITY); SystemNotificationHelper::GetInstance()->Display(*notification); }
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index ea6c686c..835e615f 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -66,6 +66,7 @@ #include "chrome/browser/notifications/notification_ui_manager.h" #include "chrome/browser/pepper_broker_infobar_delegate.h" #include "chrome/browser/permissions/permission_request_manager.h" +#include "chrome/browser/picture_in_picture/picture_in_picture_window_controller.h" #include "chrome/browser/plugins/plugin_finder.h" #include "chrome/browser/plugins/plugin_metadata.h" #include "chrome/browser/prefs/incognito_mode_prefs.h" @@ -1406,6 +1407,18 @@ url, FramebustBlockTabHelper::ClickCallback()); } +void Browser::UpdatePictureInPictureSurfaceId(viz::SurfaceId surface_id) { + if (!surface_id.is_valid()) + return; + + pip_window_controller_.reset( + PictureInPictureWindowController::GetOrCreateForWebContents( + tab_strip_model_->GetActiveWebContents())); + pip_window_controller_->Init(); + pip_window_controller_->EmbedSurface(surface_id); + pip_window_controller_->Show(); +} + bool Browser::IsMouseLocked() const { return exclusive_access_manager_->mouse_lock_controller()->IsMouseLocked(); }
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h index a4b04bb..78cf5b6e 100644 --- a/chrome/browser/ui/browser.h +++ b/chrome/browser/ui/browser.h
@@ -70,6 +70,7 @@ class BrowserWindow; class FastUnloadController; class FindBarController; +class PictureInPictureWindowController; class Profile; class ScopedKeepAlive; class StatusBubble; @@ -104,6 +105,10 @@ class WebContentsModalDialogHost; } +namespace viz { +class SurfaceId; +} + class Browser : public TabStripModelObserver, public content::WebContentsDelegate, public CoreTabHelperDelegate, @@ -490,6 +495,7 @@ bool is_audible) override; void OnDidBlockFramebust(content::WebContents* web_contents, const GURL& url) override; + void UpdatePictureInPictureSurfaceId(viz::SurfaceId surface_id) override; bool is_type_tabbed() const { return type_ == TYPE_TABBED; } bool is_type_popup() const { return type_ == TYPE_POPUP; } @@ -983,6 +989,8 @@ std::unique_ptr<chrome::BrowserCommandController> command_controller_; + std::unique_ptr<PictureInPictureWindowController> pip_window_controller_; + // True if the browser window has been shown at least once. bool window_has_shown_;
diff --git a/chrome/browser/ui/extensions/hosted_app_menu_model.cc b/chrome/browser/ui/extensions/hosted_app_menu_model.cc index 76d32af..b19f6024 100644 --- a/chrome/browser/ui/extensions/hosted_app_menu_model.cc +++ b/chrome/browser/ui/extensions/hosted_app_menu_model.cc
@@ -22,6 +22,7 @@ HostedAppMenuModel::~HostedAppMenuModel() {} void HostedAppMenuModel::Build() { + CreateActionToolbarOverflowMenu(); AddItemWithStringId(IDC_HOSTED_APP_MENU_APP_INFO, IDS_APP_CONTEXT_MENU_SHOW_INFO); int app_info_index = GetItemCount() - 1; @@ -37,7 +38,6 @@ AddSeparator(ui::NORMAL_SEPARATOR); AddItemWithStringId(IDC_COPY_URL, IDS_COPY_URL); AddItemWithStringId(IDC_OPEN_IN_CHROME, IDS_OPEN_IN_CHROME); - CreateActionToolbarOverflowMenu(); CreateZoomMenu(); AddItemWithStringId(IDC_PRINT, IDS_PRINT); AddItemWithStringId(IDC_FIND, IDS_FIND);
diff --git a/chrome/browser/ui/overlay/overlay_surface_embedder.cc b/chrome/browser/ui/overlay/overlay_surface_embedder.cc index c90f435..888c17c 100644 --- a/chrome/browser/ui/overlay/overlay_surface_embedder.cc +++ b/chrome/browser/ui/overlay/overlay_surface_embedder.cc
@@ -8,12 +8,14 @@ OverlaySurfaceEmbedder::OverlaySurfaceEmbedder(OverlayWindow* window) : window_(window) { + DCHECK(window_); surface_layer_ = std::make_unique<ui::Layer>(ui::LAYER_TEXTURED); surface_layer_->SetMasksToBounds(true); // The frame provided by the parent window's layer needs to show through // the surface layer. surface_layer_->SetFillsBoundsOpaquely(false); + surface_layer_->SetBounds(window_->GetBounds()); window_->GetLayer()->Add(surface_layer_.get()); }
diff --git a/chrome/browser/ui/overlay/overlay_window.h b/chrome/browser/ui/overlay/overlay_window.h index de20aef..7705424 100644 --- a/chrome/browser/ui/overlay/overlay_window.h +++ b/chrome/browser/ui/overlay/overlay_window.h
@@ -34,6 +34,7 @@ virtual void Hide() = 0; virtual void Close() = 0; virtual void Activate() = 0; + virtual bool IsVisible() = 0; virtual bool IsAlwaysOnTop() const = 0; virtual ui::Layer* GetLayer() = 0; virtual gfx::NativeWindow GetNativeWindow() const = 0;
diff --git a/chrome/browser/ui/toolbar/toolbar_actions_bar.h b/chrome/browser/ui/toolbar/toolbar_actions_bar.h index 7c9f7e9..ff58f0d 100644 --- a/chrome/browser/ui/toolbar/toolbar_actions_bar.h +++ b/chrome/browser/ui/toolbar/toolbar_actions_bar.h
@@ -106,8 +106,9 @@ // Returns the number of icons that can fit within the given width. size_t WidthToIconCount(int width) const; - // Returns the number of icons that should be displayed if space allows. - size_t GetIconCount() const; + // Returns the number of icons that should be displayed if space allows. Can + // be overridden by children to impose a smaller limit on the number of icons. + virtual size_t GetIconCount() const; // Returns the starting index (inclusive) for displayable icons. size_t GetStartIndexInBounds() const; @@ -238,7 +239,7 @@ return platform_settings_; } ToolbarActionViewController* popup_owner() { return popup_owner_; } - ToolbarActionViewController* popped_out_action() { + ToolbarActionViewController* popped_out_action() const { return popped_out_action_; } bool in_overflow_mode() const { return main_bar_ != nullptr; }
diff --git a/chrome/browser/ui/views/accessibility/invert_bubble_view.cc b/chrome/browser/ui/views/accessibility/invert_bubble_view.cc index 4fc6ef66..a30d51d 100644 --- a/chrome/browser/ui/views/accessibility/invert_bubble_view.cc +++ b/chrome/browser/ui/views/accessibility/invert_bubble_view.cc
@@ -9,10 +9,9 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_dialogs.h" #include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/frame/browser_view_button_provider.h" #include "chrome/browser/ui/views/harmony/chrome_layout_provider.h" #include "chrome/browser/ui/views/harmony/chrome_typography.h" -#include "chrome/browser/ui/views/toolbar/app_menu_button.h" -#include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" #include "components/prefs/pref_service.h" @@ -26,6 +25,7 @@ #include "ui/views/bubble/bubble_dialog_delegate.h" #include "ui/views/controls/button/image_button.h" #include "ui/views/controls/button/image_button_factory.h" +#include "ui/views/controls/button/menu_button.h" #include "ui/views/controls/label.h" #include "ui/views/controls/link.h" #include "ui/views/controls/link_listener.h" @@ -184,7 +184,7 @@ void MaybeShowInvertBubbleView(BrowserView* browser_view) { Browser* browser = browser_view->browser(); PrefService* pref_service = browser->profile()->GetPrefs(); - views::View* anchor = browser_view->toolbar()->app_menu_button(); + views::View* anchor = browser_view->button_provider()->GetAppMenuButton(); if (color_utils::IsInvertedColorScheme() && anchor && anchor->GetWidget() && !pref_service->GetBoolean(prefs::kInvertNotificationShown)) { pref_service->SetBoolean(prefs::kInvertNotificationShown, true);
diff --git a/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.cc b/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.cc index 3bcd24d..f8424ee 100644 --- a/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.cc +++ b/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.cc
@@ -100,7 +100,8 @@ BrowserView::GetBrowserViewForBrowser(controller_->browser()) ->toolbar() ->app_menu_button(); - if (app_menu_button->IsMenuShowing()) + // TODO(calamity): Determine if this is necessary for hosted app windows. + if (app_menu_button && app_menu_button->IsMenuShowing()) app_menu_button->CloseMenu(); }
diff --git a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc index 07ecefe8..e0418b0f 100644 --- a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc +++ b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc
@@ -99,7 +99,7 @@ // Default case. if (!reference_view || !reference_view->visible()) - return browser_view->toolbar()->app_menu_button(); + return browser_view->button_provider()->GetAppMenuButton(); return reference_view; } #else
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc index b6ff31c..476d295 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
@@ -25,7 +25,6 @@ #include "build/build_config.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/command_updater.h" -#include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/browser/profiles/profile_avatar_icon_util.h" #include "chrome/browser/ui/ash/multi_user/multi_user_util.h" #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager_test.h" @@ -36,6 +35,7 @@ #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h" #include "chrome/browser/ui/exclusive_access/fullscreen_controller_test.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/ui/toolbar/browser_actions_bar_browsertest.h" #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/hosted_app_button_container.h" @@ -44,6 +44,7 @@ #include "chrome/browser/ui/views/profiles/profile_indicator_icon.h" #include "chrome/browser/ui/views/tabs/tab.h" #include "chrome/browser/ui/views/toolbar/app_menu.h" +#include "chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.h" #include "chrome/common/chrome_features.h" #include "chrome/common/web_application_info.h" #include "chrome/test/base/in_process_browser_test.h" @@ -133,7 +134,7 @@ using BrowserNonClientFrameViewAshTest = TouchOptimizedUiParamTest<InProcessBrowserTest>; using HostedAppNonClientFrameViewAshTest = - TouchOptimizedUiParamTest<ExtensionBrowserTest>; + TouchOptimizedUiParamTest<BrowserActionsBarBrowserTest>; IN_PROC_BROWSER_TEST_P(BrowserNonClientFrameViewAshTest, NonClientHitTest) { BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); @@ -559,15 +560,6 @@ EXPECT_EQ(SK_ColorBLUE, frame_header->GetInactiveFrameColor()); EXPECT_EQ(SK_ColorWHITE, button_container->active_icon_color_); - // Show the menu. - HostedAppButtonContainer::AppMenuButton* menu_button = - button_container->app_menu_button_; - - ui::MouseEvent e(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), - ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0); - menu_button->OnMousePressed(e); - EXPECT_TRUE(menu_button->menu()->IsShowing()); - // Show a content setting icon. auto& content_setting_views = frame_view->hosted_app_button_container_->content_setting_views_; @@ -609,6 +601,35 @@ histograms.ExpectBucketCount( "ContentSettings.ImagePressed", static_cast<int>(ContentSettingImageModel::ImageType::GEOLOCATION), 1); + + // Even though 2 are visible in the browser, no extension actions should show. + BrowserActionsContainer* browser_actions = + frame_view->hosted_app_button_container_->browser_actions_container_; + ToolbarActionsBar* toolbar_actions_bar = + browser_actions->toolbar_actions_bar(); + LoadExtensions(); + toolbar_model()->SetVisibleIconCount(2); + EXPECT_EQ(0u, browser_actions->VisibleBrowserActions()); + + // Show the menu. + HostedAppButtonContainer::AppMenuButton* menu_button = + button_container->app_menu_button_; + + ui::MouseEvent e(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), + ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0); + menu_button->OnMousePressed(e); + EXPECT_TRUE(menu_button->menu()->IsShowing()); + + // All extension actions should always be showing in the menu. + EXPECT_EQ(3u, menu_button->menu() + ->extension_toolbar_for_testing() + ->container_for_testing() + ->VisibleBrowserActions()); + + // Popping out an extension makes its action show in the bar. + toolbar_actions_bar->PopOutAction(toolbar_actions_bar->GetActions()[2], false, + base::DoNothing()); + EXPECT_EQ(1u, browser_actions->VisibleBrowserActions()); } namespace {
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 031e95d..72c9ff1 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -937,6 +937,12 @@ ProcessFullscreen(false, GURL(), EXCLUSIVE_ACCESS_BUBBLE_TYPE_NONE); } +void BrowserView::SetButtonProvider(BrowserViewButtonProvider* provider) { + // There should only be one button provider. + DCHECK(!button_provider_); + button_provider_ = provider; +} + LocationBar* BrowserView::GetLocationBar() const { return GetLocationBarView(); } @@ -1007,8 +1013,9 @@ } ToolbarActionsBar* BrowserView::GetToolbarActionsBar() { - return toolbar_ && toolbar_->browser_actions() ? - toolbar_->browser_actions()->toolbar_actions_bar() : nullptr; + BrowserActionsContainer* container = + button_provider_->GetBrowserActionsContainer(); + return container ? container->toolbar_actions_bar() : nullptr; } void BrowserView::ToolbarSizeChanged(bool is_animating) { @@ -1180,7 +1187,7 @@ if (card_view && card_view->visible()) anchor_view = card_view; else - anchor_view = toolbar()->app_menu_button(); + anchor_view = button_provider()->GetAppMenuButton(); } autofill::SaveCardBubbleViews* bubble = new autofill::SaveCardBubbleViews( @@ -1266,7 +1273,7 @@ } void BrowserView::ShowAppMenu() { - if (!toolbar_->app_menu_button()) + if (!button_provider_->GetAppMenuButton()) return; // Keep the top-of-window views revealed as long as the app menu is visible. @@ -1274,7 +1281,7 @@ immersive_mode_controller_->GetRevealedLock( ImmersiveModeController::ANIMATE_REVEAL_NO)); - toolbar_->app_menu_button()->Activate(nullptr); + button_provider_->GetAppMenuButton()->Activate(nullptr); } content::KeyboardEventProcessingResult BrowserView::PreHandleKeyboardEvent( @@ -2140,6 +2147,11 @@ top_container_->AddChildView(toolbar_); toolbar_->Init(); + // This browser view may already have a custom button provider set (e.g the + // hosted app frame). + if (!button_provider_) + SetButtonProvider(toolbar_); + // The infobar container must come after the toolbar so its arrow paints on // top. infobar_container_ = new InfoBarContainerView(this);
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h index 9adf414..6227cc17 100644 --- a/chrome/browser/ui/views/frame/browser_view.h +++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -53,6 +53,7 @@ // view: http://dev.chromium.org/developers/design-documents/browser-window class BookmarkBarView; +class BrowserViewButtonProvider; class Browser; class BrowserViewLayout; class ContentsLayoutManager; @@ -260,6 +261,11 @@ // Only exiting fullscreen in this way is currently supported. void FullscreenStateChanged(); + // Sets the button provider for this BrowserView. Must be called before + // InitViews() which sets the ToolbarView as the default button provider. + void SetButtonProvider(BrowserViewButtonProvider* provider); + BrowserViewButtonProvider* button_provider() { return button_provider_; } + // Overridden from BrowserWindow: void Show() override; void ShowInactive() override; @@ -690,6 +696,10 @@ // Handled by ContentsLayoutManager. views::View* contents_container_ = nullptr; + // Provides access to the buttons this browser view uses. Buttons may appear + // in the frame or in the toolbar. + BrowserViewButtonProvider* button_provider_ = nullptr; + // Tracks and stores the last focused view which is not the // devtools_web_view_ or any of its children. Used to restore focus once // the devtools_web_view_ is hidden.
diff --git a/chrome/browser/ui/views/frame/browser_view_button_provider.h b/chrome/browser/ui/views/frame/browser_view_button_provider.h new file mode 100644 index 0000000..617618f --- /dev/null +++ b/chrome/browser/ui/views/frame/browser_view_button_provider.h
@@ -0,0 +1,29 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_VIEW_BUTTON_PROVIDER_H_ +#define CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_VIEW_BUTTON_PROVIDER_H_ + +class BrowserActionsContainer; + +namespace views { +class MenuButton; +} + +// An interface implemented by a class that provides buttons that a BrowserView +// uses. +class BrowserViewButtonProvider { + public: + // Returns the container for extension icons. + virtual BrowserActionsContainer* GetBrowserActionsContainer() = 0; + + // Get the app menu button for the BrowserView. + virtual views::MenuButton* GetAppMenuButton() = 0; + + // TODO(calamity): Move other buttons and button actions into here. + protected: + virtual ~BrowserViewButtonProvider() {} +}; + +#endif // CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_VIEW_BUTTON_PROVIDER_H_
diff --git a/chrome/browser/ui/views/frame/hosted_app_button_container.cc b/chrome/browser/ui/views/frame/hosted_app_button_container.cc index b136919..d542f62 100644 --- a/chrome/browser/ui/views/frame/hosted_app_button_container.cc +++ b/chrome/browser/ui/views/frame/hosted_app_button_container.cc
@@ -12,6 +12,7 @@ #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/location_bar/content_setting_image_view.h" #include "chrome/browser/ui/views/toolbar/app_menu.h" +#include "chrome/browser/ui/views/toolbar/browser_actions_container.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/color_palette.h" #include "ui/gfx/color_utils.h" @@ -24,6 +25,20 @@ // Padding around content setting icons. constexpr int kContentSettingIconInteriorPadding = 4; +class HostedAppToolbarActionsBar : public ToolbarActionsBar { + public: + using ToolbarActionsBar::ToolbarActionsBar; + + size_t GetIconCount() const override { + // Only show an icon when an extension action is popped out due to + // activation, and none otherwise. + return popped_out_action() ? 1 : 0; + } + + private: + DISALLOW_COPY_AND_ASSIGN(HostedAppToolbarActionsBar); +}; + } // namespace HostedAppButtonContainer::AppMenuButton::AppMenuButton( @@ -60,7 +75,12 @@ : browser_view_(browser_view), active_icon_color_(active_icon_color), inactive_icon_color_(inactive_icon_color), - app_menu_button_(new AppMenuButton(browser_view)) { + app_menu_button_(new AppMenuButton(browser_view)), + browser_actions_container_( + new BrowserActionsContainer(browser_view->browser(), + nullptr, + this, + false /* interactive */)) { DCHECK(browser_view_); auto layout = std::make_unique<views::BoxLayout>(views::BoxLayout::kHorizontal); @@ -83,12 +103,29 @@ AddChildView(image_view.release()); } + AddChildView(browser_actions_container_); + app_menu_button_->SetIconColor(active_icon_color); AddChildView(app_menu_button_); + + browser_view_->SetButtonProvider(this); } HostedAppButtonContainer::~HostedAppButtonContainer() {} +void HostedAppButtonContainer::RefreshContentSettingViews() { + for (auto* v : content_setting_views_) + v->Update(); +} + +void HostedAppButtonContainer::SetPaintAsActive(bool active) { + for (auto* v : content_setting_views_) + v->SetIconColor(active ? active_icon_color_ : inactive_icon_color_); + + app_menu_button_->SetIconColor(active ? active_icon_color_ + : inactive_icon_color_); +} + content::WebContents* HostedAppButtonContainer::GetContentSettingWebContents() { return browser_view_->GetActiveWebContents(); } @@ -105,9 +142,11 @@ ContentSettingImageModel::ImageType::NUM_IMAGE_TYPES); } -void HostedAppButtonContainer::RefreshContentSettingViews() { - for (auto* v : content_setting_views_) - v->Update(); +void HostedAppButtonContainer::ChildPreferredSizeChanged(views::View* child) { + if (child != browser_actions_container_) + return; + + PreferredSizeChanged(); } void HostedAppButtonContainer::ChildVisibilityChanged(views::View* child) { @@ -115,10 +154,31 @@ PreferredSizeChanged(); } -void HostedAppButtonContainer::SetPaintAsActive(bool active) { - for (auto* v : content_setting_views_) - v->SetIconColor(active ? active_icon_color_ : inactive_icon_color_); +views::MenuButton* HostedAppButtonContainer::GetOverflowReferenceView() { + return app_menu_button_; +} - app_menu_button_->SetIconColor(active ? active_icon_color_ - : inactive_icon_color_); +base::Optional<int> HostedAppButtonContainer::GetMaxBrowserActionsWidth() + const { + // Our maximum size is 1 icon so don't specify a pixel-width max here. + return base::Optional<int>(); +} + +std::unique_ptr<ToolbarActionsBar> +HostedAppButtonContainer::CreateToolbarActionsBar( + ToolbarActionsBarDelegate* delegate, + Browser* browser, + ToolbarActionsBar* main_bar) const { + DCHECK_EQ(browser_view_->browser(), browser); + return std::make_unique<HostedAppToolbarActionsBar>(delegate, browser, + main_bar); +} + +BrowserActionsContainer* +HostedAppButtonContainer::GetBrowserActionsContainer() { + return browser_actions_container_; +} + +views::MenuButton* HostedAppButtonContainer::GetAppMenuButton() { + return app_menu_button_; }
diff --git a/chrome/browser/ui/views/frame/hosted_app_button_container.h b/chrome/browser/ui/views/frame/hosted_app_button_container.h index 3af6c0d2..4187f43 100644 --- a/chrome/browser/ui/views/frame/hosted_app_button_container.h +++ b/chrome/browser/ui/views/frame/hosted_app_button_container.h
@@ -8,7 +8,9 @@ #include <memory> #include "base/macros.h" +#include "chrome/browser/ui/views/frame/browser_view_button_provider.h" #include "chrome/browser/ui/views/location_bar/content_setting_image_view.h" +#include "chrome/browser/ui/views/toolbar/browser_actions_container.h" #include "ui/views/controls/button/menu_button.h" #include "ui/views/controls/button/menu_button_listener.h" #include "ui/views/view.h" @@ -19,7 +21,9 @@ // A container for hosted app buttons in the title bar. class HostedAppButtonContainer : public views::View, - public ContentSettingImageView::Delegate { + public ContentSettingImageView::Delegate, + public BrowserActionsContainer::Delegate, + public BrowserViewButtonProvider { public: // |active_icon_color| and |inactive_icon_color| indicate the colors to use // for button icons when the window is focused and blurred respectively. @@ -75,8 +79,21 @@ ContentSettingImageModel::ImageType type) const override; // views::View: + void ChildPreferredSizeChanged(views::View* child) override; void ChildVisibilityChanged(views::View* child) override; + // BrowserActionsContainer::Delegate: + views::MenuButton* GetOverflowReferenceView() override; + base::Optional<int> GetMaxBrowserActionsWidth() const override; + std::unique_ptr<ToolbarActionsBar> CreateToolbarActionsBar( + ToolbarActionsBarDelegate* delegate, + Browser* browser, + ToolbarActionsBar* main_bar) const override; + + // BrowserViewButtonProvider: + BrowserActionsContainer* GetBrowserActionsContainer() override; + views::MenuButton* GetAppMenuButton() override; + // The containing browser view. BrowserView* browser_view_; @@ -87,6 +104,7 @@ // Owned by the views hierarchy. AppMenuButton* app_menu_button_; std::vector<ContentSettingImageView*> content_setting_views_; + BrowserActionsContainer* browser_actions_container_; DISALLOW_COPY_AND_ASSIGN(HostedAppButtonContainer); };
diff --git a/chrome/browser/ui/views/global_error_bubble_view.cc b/chrome/browser/ui/views/global_error_bubble_view.cc index 0104aac..d714e74 100644 --- a/chrome/browser/ui/views/global_error_bubble_view.cc +++ b/chrome/browser/ui/views/global_error_bubble_view.cc
@@ -48,7 +48,8 @@ Browser* browser, const base::WeakPtr<GlobalErrorWithStandardBubble>& error) { BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser); - views::View* app_menu_button = browser_view->toolbar()->app_menu_button(); + views::View* app_menu_button = + browser_view->button_provider()->GetAppMenuButton(); GlobalErrorBubbleView* bubble_view = new GlobalErrorBubbleView(app_menu_button, gfx::Point(), views::BubbleBorder::TOP_RIGHT, browser, error);
diff --git a/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc b/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc index 5d3b2e1..afe5b78 100644 --- a/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc +++ b/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc
@@ -12,9 +12,9 @@ #include "chrome/browser/ui/browser_dialogs.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/frame/browser_view_button_provider.h" #include "chrome/browser/ui/views/harmony/chrome_layout_provider.h" #include "chrome/browser/ui/views/harmony/chrome_typography.h" -#include "chrome/browser/ui/views/toolbar/app_menu_button.h" #include "chrome/browser/ui/views/toolbar/browser_actions_container.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/grit/generated_resources.h" @@ -139,7 +139,7 @@ } if (!reference_view || !reference_view->visible()) { // Anchors the bubble to the app menu. - reference_view = browser_view_->toolbar()->app_menu_button(); + reference_view = browser_view_->button_provider()->GetAppMenuButton(); } SetAnchorView(reference_view); set_arrow(views::BubbleBorder::TOP_RIGHT);
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views.cc b/chrome/browser/ui/views/overlay/overlay_window_views.cc index 9ea5ca9..593e11ac 100644 --- a/chrome/browser/ui/views/overlay/overlay_window_views.cc +++ b/chrome/browser/ui/views/overlay/overlay_window_views.cc
@@ -25,12 +25,13 @@ } ~OverlayWindowWidgetDelegate() override = default; - // WidgetDelegate: + // views::WidgetDelegate: bool CanResize() const override { return false; } ui::ModalType GetModalType() const override { return ui::MODAL_TYPE_SYSTEM; } base::string16 GetWindowTitle() const override { return l10n_util::GetStringUTF16(IDS_PICTURE_IN_PICTURE_TITLE_TEXT); } + void DeleteDelegate() override { delete this; } views::Widget* GetWidget() override { return widget_; } const views::Widget* GetWidget() const override { return widget_; } @@ -77,7 +78,6 @@ params.delegate = new OverlayWindowWidgetDelegate(widget_.get()); widget_->Init(params); - widget_->Show(); } bool OverlayWindowViews::IsActive() const { @@ -100,6 +100,10 @@ widget_->Activate(); } +bool OverlayWindowViews::IsVisible() { + return widget_->IsVisible(); +} + bool OverlayWindowViews::IsAlwaysOnTop() const { return true; }
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views.h b/chrome/browser/ui/views/overlay/overlay_window_views.h index 32649328..519030a 100644 --- a/chrome/browser/ui/views/overlay/overlay_window_views.h +++ b/chrome/browser/ui/views/overlay/overlay_window_views.h
@@ -24,6 +24,7 @@ void Hide() override; void Close() override; void Activate() override; + bool IsVisible() override; bool IsAlwaysOnTop() const override; ui::Layer* GetLayer() override; gfx::NativeWindow GetNativeWindow() const override;
diff --git a/chrome/browser/ui/views/passwords/password_update_pending_view.cc b/chrome/browser/ui/views/passwords/password_update_pending_view.cc index 1532c8d..8150c99 100644 --- a/chrome/browser/ui/views/passwords/password_update_pending_view.cc +++ b/chrome/browser/ui/views/passwords/password_update_pending_view.cc
@@ -26,7 +26,8 @@ // Credential row. if (model()->ShouldShowMultipleAccountUpdateUI()) { SetLayoutManager(std::make_unique<views::FillLayout>()); - AddChildView(new CredentialsSelectionView(model())); + selection_view_ = new CredentialsSelectionView(model()); + AddChildView(selection_view_); } else { const autofill::PasswordForm& password_form = model()->pending_password(); views::GridLayout* layout =
diff --git a/chrome/browser/ui/views/session_crashed_bubble_view.cc b/chrome/browser/ui/views/session_crashed_bubble_view.cc index 2d8eeae2..81f303b 100644 --- a/chrome/browser/ui/views/session_crashed_bubble_view.cc +++ b/chrome/browser/ui/views/session_crashed_bubble_view.cc
@@ -23,9 +23,9 @@ #include "chrome/browser/ui/browser_list_observer.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/frame/browser_view_button_provider.h" #include "chrome/browser/ui/views/harmony/chrome_layout_provider.h" #include "chrome/browser/ui/views/harmony/chrome_typography.h" -#include "chrome/browser/ui/views/toolbar/app_menu_button.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/browser/ui/views_mode_controller.h" #include "chrome/grit/chromium_strings.h" @@ -37,6 +37,7 @@ #include "content/public/browser/browser_thread.h" #include "ui/base/l10n/l10n_util.h" #include "ui/views/controls/button/checkbox.h" +#include "ui/views/controls/button/menu_button.h" #include "ui/views/controls/label.h" #include "ui/views/controls/separator.h" #include "ui/views/controls/styled_label.h" @@ -152,8 +153,8 @@ } views::View* anchor_view = BrowserView::GetBrowserViewForBrowser(browser) - ->toolbar() - ->app_menu_button(); + ->button_provider() + ->GetAppMenuButton(); SessionCrashedBubbleView* crash_bubble = new SessionCrashedBubbleView(anchor_view, browser, offer_uma_optin); views::BubbleDialogDelegateView::CreateBubble(crash_bubble)->Show();
diff --git a/chrome/browser/ui/views/toolbar/browser_action_test_util_views.cc b/chrome/browser/ui/views/toolbar/browser_action_test_util_views.cc index bafe687..db04e72 100644 --- a/chrome/browser/ui/views/toolbar/browser_action_test_util_views.cc +++ b/chrome/browser/ui/views/toolbar/browser_action_test_util_views.cc
@@ -29,12 +29,14 @@ // The views-specific implementation of the TestToolbarActionsBarHelper, which // creates and owns a BrowserActionsContainer. -class TestToolbarActionsBarHelperViews : public TestToolbarActionsBarHelper { +class TestToolbarActionsBarHelperViews + : public TestToolbarActionsBarHelper, + public BrowserActionsContainer::Delegate { public: TestToolbarActionsBarHelperViews(Browser* browser, BrowserActionsContainer* main_bar) : browser_actions_container_( - new BrowserActionsContainer(browser, main_bar)) { + new BrowserActionsContainer(browser, main_bar, this, true)) { container_parent_.set_owned_by_client(); container_parent_.SetSize(gfx::Size(1000, 1000)); container_parent_.Layout(); @@ -45,6 +47,18 @@ return browser_actions_container_; } + // Overridden from BrowserActionsContainer::Delegate: + views::MenuButton* GetOverflowReferenceView() override { return nullptr; } + base::Optional<int> GetMaxBrowserActionsWidth() const override { + return base::Optional<int>(); + } + std::unique_ptr<ToolbarActionsBar> CreateToolbarActionsBar( + ToolbarActionsBarDelegate* delegate, + Browser* browser, + ToolbarActionsBar* main_bar) const override { + return std::make_unique<ToolbarActionsBar>(delegate, browser, main_bar); + } + private: // The created BrowserActionsContainer. Owned by |container_parent_|. BrowserActionsContainer* browser_actions_container_;
diff --git a/chrome/browser/ui/views/toolbar/browser_actions_container.cc b/chrome/browser/ui/views/toolbar/browser_actions_container.cc index 13dc3fb..78b6f07 100644 --- a/chrome/browser/ui/views/toolbar/browser_actions_container.cc +++ b/chrome/browser/ui/views/toolbar/browser_actions_container.cc
@@ -39,15 +39,6 @@ #include "ui/views/painter.h" #include "ui/views/widget/widget.h" -namespace { - -// Returns the ToolbarView for the given |browser|. -ToolbarView* GetToolbarView(Browser* browser) { - return BrowserView::GetBrowserViewForBrowser(browser)->toolbar(); -} - -} // namespace - //////////////////////////////////////////////////////////////////////////////// // BrowserActionsContainer::DropPosition @@ -71,21 +62,25 @@ BrowserActionsContainer::BrowserActionsContainer( Browser* browser, - BrowserActionsContainer* main_container) - : toolbar_actions_bar_(new ToolbarActionsBar( - this, - browser, - main_container ? main_container->toolbar_actions_bar_.get() - : nullptr)), + BrowserActionsContainer* main_container, + Delegate* delegate, + bool interactive) + : delegate_(delegate), browser_(browser), - main_container_(main_container) { + main_container_(main_container), + interactive_(interactive) { set_id(VIEW_ID_BROWSER_ACTION_TOOLBAR); - if (!ShownInsideMenu()) { - resize_animation_.reset(new gfx::SlideAnimation(this)); - resize_area_ = new views::ResizeArea(this); - AddChildView(resize_area_); + toolbar_actions_bar_ = delegate_->CreateToolbarActionsBar( + this, browser, + main_container ? main_container->toolbar_actions_bar_.get() : nullptr); + if (!ShownInsideMenu()) { + if (interactive_) { + resize_area_ = new views::ResizeArea(this); + AddChildView(resize_area_); + } + resize_animation_.reset(new gfx::SlideAnimation(this)); const int kWarningImages[] = IMAGE_GRID(IDR_DEVELOPER_MODE_HIGHLIGHT); warning_highlight_painter_ = views::Painter::CreateImageGridPainter(kWarningImages); @@ -146,8 +141,7 @@ } views::MenuButton* BrowserActionsContainer::GetOverflowReferenceView() { - return static_cast<views::MenuButton*>( - GetToolbarView(browser_)->app_menu_button()); + return delegate_->GetOverflowReferenceView(); } void BrowserActionsContainer::AddViewForAction( @@ -214,9 +208,9 @@ if (resize_animation_ && !toolbar_actions_bar_->suppress_animation()) { if (!ShownInsideMenu()) { // Make sure we don't try to animate to wider than the allowed width. - int max_width = GetToolbarView(browser_)->GetMaxBrowserActionsWidth(); - if (target_width > max_width) - target_width = GetWidthForMaxWidth(max_width); + base::Optional<int> max_width = delegate_->GetMaxBrowserActionsWidth(); + if (max_width && target_width > max_width.value()) + target_width = GetWidthForMaxWidth(max_width.value()); } // Animate! We have to set the animation_target_size_ after calling Reset(), // because that could end up calling AnimationEnded which clears the value. @@ -264,8 +258,8 @@ anchored_to_action_view = true; } else { anchor_view = BrowserView::GetBrowserViewForBrowser(browser_) - ->toolbar() - ->app_menu_button(); + ->button_provider() + ->GetAppMenuButton(); } } else { anchor_view = this; @@ -375,7 +369,8 @@ } bool BrowserActionsContainer::CanDrop(const OSExchangeData& data) { - return BrowserActionDragData::CanDrop(data, browser_->profile()); + return interactive_ && + BrowserActionDragData::CanDrop(data, browser_->profile()); } int BrowserActionsContainer::OnDragUpdated( @@ -534,7 +529,7 @@ const gfx::Point& press_pt, const gfx::Point& p) { // We don't allow dragging while we're highlighting. - return !toolbar_actions_bar_->is_highlighting(); + return interactive_ && !toolbar_actions_bar_->is_highlighting(); } void BrowserActionsContainer::OnResize(int resize_amount, bool done_resizing) {
diff --git a/chrome/browser/ui/views/toolbar/browser_actions_container.h b/chrome/browser/ui/views/toolbar/browser_actions_container.h index d75d5ad..15d619f 100644 --- a/chrome/browser/ui/views/toolbar/browser_actions_container.h +++ b/chrome/browser/ui/views/toolbar/browser_actions_container.h
@@ -11,6 +11,7 @@ #include "base/macros.h" #include "base/observer_list.h" +#include "base/optional.h" #include "chrome/browser/ui/toolbar/toolbar_actions_bar.h" #include "chrome/browser/ui/toolbar/toolbar_actions_bar_delegate.h" #include "chrome/browser/ui/views/toolbar/toolbar_action_view.h" @@ -108,10 +109,32 @@ public ToolbarActionView::Delegate, public views::WidgetObserver { public: + class Delegate { + public: + // Returns the view of the toolbar actions overflow menu to use as a + // reference point for a popup when this view isn't visible. + virtual views::MenuButton* GetOverflowReferenceView() = 0; + + // Returns the maximum width the browser actions container can have. An + // empty value means there is no maximum. + virtual base::Optional<int> GetMaxBrowserActionsWidth() const = 0; + + // Creates a ToolbarActionsBar for the BrowserActionsContainer to use. + virtual std::unique_ptr<ToolbarActionsBar> CreateToolbarActionsBar( + ToolbarActionsBarDelegate* delegate, + Browser* browser, + ToolbarActionsBar* main_bar) const = 0; + }; + // Constructs a BrowserActionContainer for a particular |browser| object. For // documentation of |main_container|, see class comments. + // + // |interactive| determines whether the bar can be dragged to resize it or do + // drag and drop. BrowserActionsContainer(Browser* browser, - BrowserActionsContainer* main_container); + BrowserActionsContainer* main_container, + Delegate* delegate, + bool interactive = true); ~BrowserActionsContainer() override; // Get the number of toolbar actions being displayed. @@ -120,6 +143,8 @@ // Returns the browser this container is associated with. Browser* browser() const { return browser_; } + Delegate* delegate() { return delegate_; } + ToolbarActionsBar* toolbar_actions_bar() { return toolbar_actions_bar_.get(); } @@ -235,6 +260,8 @@ return toolbar_actions_bar_->platform_settings(); } + Delegate* const delegate_ = nullptr; + // The controlling ToolbarActionsBar, which handles most non-view logic. std::unique_ptr<ToolbarActionsBar> toolbar_actions_bar_; @@ -278,6 +305,9 @@ // is none. std::unique_ptr<DropPosition> drop_position_; + // Whether the container can be interacted with (e.g drag/drop, resize). + const bool interactive_ = true; + // The extension bubble that is actively showing, if any. views::BubbleDialogDelegateView* active_bubble_ = nullptr;
diff --git a/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc b/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc index be3b6b46..9a9d0f4 100644 --- a/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc +++ b/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc
@@ -296,7 +296,9 @@ ->toolbar()->browser_actions(); overflow_parent_.reset(new views::ResizeAwareParentView()); overflow_parent_->set_owned_by_client(); - overflow_bar_ = new BrowserActionsContainer(browser(), main_bar_); + overflow_bar_ = new BrowserActionsContainer( + browser(), main_bar_, + BrowserView::GetBrowserViewForBrowser(browser())->toolbar(), true); overflow_parent_->AddChildView(overflow_bar_); }
diff --git a/chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.cc b/chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.cc index addcf47..d066520 100644 --- a/chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.cc +++ b/chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.cc
@@ -38,8 +38,9 @@ SetBackgroundColor(SK_ColorTRANSPARENT); BrowserActionsContainer* main = BrowserView::GetBrowserViewForBrowser(browser_) - ->toolbar()->browser_actions(); - container_ = new BrowserActionsContainer(browser_, main); + ->button_provider() + ->GetBrowserActionsContainer(); + container_ = new BrowserActionsContainer(browser_, main, main->delegate()); SetContents(container_); // Listen for the drop to finish so we can close the app menu, if necessary.
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.cc b/chrome/browser/ui/views/toolbar/toolbar_view.cc index a779f24..125d618 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_view.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_view.cc
@@ -188,9 +188,10 @@ home_->set_id(VIEW_ID_HOME_BUTTON); home_->Init(); - browser_actions_ = new BrowserActionsContainer( - browser_, - nullptr); // No master container for this one (it is master). + // No master container for this one (it is master). + BrowserActionsContainer* main_container = nullptr; + browser_actions_ = + new BrowserActionsContainer(browser_, main_container, this); app_menu_button_ = new AppMenuButton(this); app_menu_button_->EnableCanvasFlippingForRTLUI(true); @@ -321,14 +322,6 @@ translate_icon_view->OnBubbleWidgetCreated(bubble_widget); } -int ToolbarView::GetMaxBrowserActionsWidth() const { - // The browser actions container is allowed to grow, but only up until the - // omnibox reaches its minimum size. So its maximum allowed width is its - // current size, plus any that the omnibox could give up. - return browser_actions_->width() + - (location_bar_->width() - location_bar_->GetMinimumSize().width()); -} - //////////////////////////////////////////////////////////////////////////////// // ToolbarView, AccessiblePaneView overrides: @@ -379,6 +372,29 @@ } //////////////////////////////////////////////////////////////////////////////// +// ToolbarView, BrowserActionsContainer::Delegate implementation: + +views::MenuButton* ToolbarView::GetOverflowReferenceView() { + return app_menu_button_; +} + +base::Optional<int> ToolbarView::GetMaxBrowserActionsWidth() const { + // The browser actions container is allowed to grow, but only up until the + // omnibox reaches its minimum size. So its maximum allowed width is its + // current size, plus any that the omnibox could give up. + return browser_actions_->width() + + (location_bar_->width() - location_bar_->GetMinimumSize().width()); +} + +std::unique_ptr<ToolbarActionsBar> ToolbarView::CreateToolbarActionsBar( + ToolbarActionsBarDelegate* delegate, + Browser* browser, + ToolbarActionsBar* main_bar) const { + DCHECK_EQ(browser_, browser); + return std::make_unique<ToolbarActionsBar>(delegate, browser, main_bar); +} + +//////////////////////////////////////////////////////////////////////////////// // ToolbarView, CommandObserver implementation: void ToolbarView::EnabledStateChangedForCommand(int id, bool enabled) { @@ -643,6 +659,15 @@ } } +// BrowserViewButtonProvider: +BrowserActionsContainer* ToolbarView::GetBrowserActionsContainer() { + return browser_actions_; +} + +views::MenuButton* ToolbarView::GetAppMenuButton() { + return app_menu_button_; +} + gfx::Size ToolbarView::GetSizeInternal( gfx::Size (View::*get_size)() const) const { gfx::Size size((location_bar_->*get_size)());
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.h b/chrome/browser/ui/views/toolbar/toolbar_view.h index e09a467f..c0f8b33 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_view.h +++ b/chrome/browser/ui/views/toolbar/toolbar_view.h
@@ -13,7 +13,9 @@ #include "chrome/browser/command_observer.h" #include "chrome/browser/ui/toolbar/app_menu_icon_controller.h" #include "chrome/browser/ui/toolbar/back_forward_menu_model.h" +#include "chrome/browser/ui/views/frame/browser_view_button_provider.h" #include "chrome/browser/ui/views/location_bar/location_bar_view.h" +#include "chrome/browser/ui/views/toolbar/browser_actions_container.h" #include "chrome/browser/upgrade_observer.h" #include "components/prefs/pref_member.h" #include "components/translate/core/browser/translate_step.h" @@ -33,7 +35,6 @@ class AppMenuButton; class Browser; -class BrowserActionsContainer; class HomeButton; class ReloadButton; class ToolbarButton; @@ -47,10 +48,12 @@ public views::MenuButtonListener, public ui::AcceleratorProvider, public LocationBarView::Delegate, + public BrowserActionsContainer::Delegate, public CommandObserver, public views::ButtonListener, public AppMenuIconController::Delegate, - public UpgradeObserver { + public UpgradeObserver, + public BrowserViewButtonProvider { public: // The view class name. static const char kViewClassName[]; @@ -97,9 +100,6 @@ translate::TranslateErrors::Type error_type, bool is_user_gesture); - // Returns the maximum width the browser actions container can have. - int GetMaxBrowserActionsWidth() const; - // Accessors. Browser* browser() const { return browser_; } BrowserActionsContainer* browser_actions() const { return browser_actions_; } @@ -127,6 +127,14 @@ ContentSettingBubbleModelDelegate* GetContentSettingBubbleModelDelegate() override; + // BrowserActionsContainer::Delegate: + views::MenuButton* GetOverflowReferenceView() override; + base::Optional<int> GetMaxBrowserActionsWidth() const override; + std::unique_ptr<ToolbarActionsBar> CreateToolbarActionsBar( + ToolbarActionsBarDelegate* delegate, + Browser* browser, + ToolbarActionsBar* main_bar) const override; + // CommandObserver: void EnabledStateChangedForCommand(int id, bool enabled) override; @@ -156,6 +164,10 @@ bool SetPaneFocusAndFocusDefault() override; void RemovePaneFocus() override; + bool is_display_mode_normal() const { + return display_mode_ == DISPLAYMODE_NORMAL; + } + private: // Types of display mode this toolbar can have. enum DisplayMode { @@ -169,6 +181,10 @@ AppMenuIconController::Severity severity, bool animate) override; + // BrowserViewButtonProvider: + BrowserActionsContainer* GetBrowserActionsContainer() override; + views::MenuButton* GetAppMenuButton() override; + // Used to avoid duplicating the near-identical logic of // ToolbarView::CalculatePreferredSize() and ToolbarView::GetMinimumSize(). // These two functions call through to GetSizeInternal(), passing themselves @@ -181,10 +197,6 @@ // Loads the images for all the child views. void LoadImages(); - bool is_display_mode_normal() const { - return display_mode_ == DISPLAYMODE_NORMAL; - } - // Shows the critical notification bubble against the app menu. void ShowCriticalNotification();
diff --git a/chrome/browser/vr/databinding/vector_binding_unittest.cc b/chrome/browser/vr/databinding/vector_binding_unittest.cc index 6d5861b..d758e3d 100644 --- a/chrome/browser/vr/databinding/vector_binding_unittest.cc +++ b/chrome/browser/vr/databinding/vector_binding_unittest.cc
@@ -56,8 +56,8 @@ std::unique_ptr<View> view = std::make_unique<View>(); element->set_view(view.get()); element->bindings().push_back(std::make_unique<Binding<int>>( - base::Bind(&GetValue, base::Unretained(element)), - base::Bind(&SetValue, base::Unretained(element)))); + base::BindRepeating(&GetValue, base::Unretained(element)), + base::BindRepeating(&SetValue, base::Unretained(element)))); registry->AddView(std::move(view)); } @@ -72,10 +72,10 @@ ViewRegistry registry; TestVectorBinding::ModelAddedCallback added_callback = - base::Bind(&OnModelAdded, base::Unretained(®istry)); + base::BindRepeating(&OnModelAdded, base::Unretained(®istry)); TestVectorBinding::ModelRemovedCallback removed_callback = - base::Bind(&OnModelRemoved, base::Unretained(®istry)); + base::BindRepeating(&OnModelRemoved, base::Unretained(®istry)); TestVectorBinding binding(&models, added_callback, removed_callback);
diff --git a/chrome/browser/vr/elements/ui_element_unittest.cc b/chrome/browser/vr/elements/ui_element_unittest.cc index 797bd33..0a33d2b 100644 --- a/chrome/browser/vr/elements/ui_element_unittest.cc +++ b/chrome/browser/vr/elements/ui_element_unittest.cc
@@ -206,16 +206,16 @@ explicit ElementEventHandlers(UiElement* element) { DCHECK(element); EventHandlers event_handlers; - event_handlers.hover_enter = base::Bind( + event_handlers.hover_enter = base::BindRepeating( &ElementEventHandlers::HandleHoverEnter, base::Unretained(this)); - event_handlers.hover_move = base::Bind( + event_handlers.hover_move = base::BindRepeating( &ElementEventHandlers::HandleHoverMove, base::Unretained(this)); - event_handlers.hover_leave = base::Bind( + event_handlers.hover_leave = base::BindRepeating( &ElementEventHandlers::HandleHoverLeave, base::Unretained(this)); - event_handlers.button_down = base::Bind( + event_handlers.button_down = base::BindRepeating( &ElementEventHandlers::HandleButtonDown, base::Unretained(this)); - event_handlers.button_up = base::Bind(&ElementEventHandlers::HandleButtonUp, - base::Unretained(this)); + event_handlers.button_up = base::BindRepeating( + &ElementEventHandlers::HandleButtonUp, base::Unretained(this)); element->set_event_handlers(event_handlers); } void HandleHoverEnter() { hover_enter_ = true; }
diff --git a/chrome/browser/vr/elements/url_bar_texture_unittest.cc b/chrome/browser/vr/elements/url_bar_texture_unittest.cc index 22752a6e..9507035 100644 --- a/chrome/browser/vr/elements/url_bar_texture_unittest.cc +++ b/chrome/browser/vr/elements/url_bar_texture_unittest.cc
@@ -103,8 +103,9 @@ }; TestUrlBarTexture::TestUrlBarTexture() - : UrlBarTexture(base::Bind(&TestUrlBarTexture::OnUnsupportedFeature, - base::Unretained(this))) { + : UrlBarTexture( + base::BindRepeating(&TestUrlBarTexture::OnUnsupportedFeature, + base::Unretained(this))) { gfx::FontList::SetDefaultFontDescription("Arial, Times New Roman, 15px"); SetColors(ColorScheme::GetColorScheme(ColorScheme::kModeNormal).url_bar); SetBackgroundColor(SK_ColorBLACK);
diff --git a/chrome/browser/vr/service/vr_device_manager.cc b/chrome/browser/vr/service/vr_device_manager.cc index 109c23b..7be2198 100644 --- a/chrome/browser/vr/service/vr_device_manager.cc +++ b/chrome/browser/vr/service/vr_device_manager.cc
@@ -188,11 +188,12 @@ return; for (const auto& provider : providers_) { - provider->Initialize( - base::Bind(&VRDeviceManager::AddDevice, base::Unretained(this)), - base::Bind(&VRDeviceManager::RemoveDevice, base::Unretained(this)), - base::BindOnce(&VRDeviceManager::OnProviderInitialized, - base::Unretained(this))); + provider->Initialize(base::BindRepeating(&VRDeviceManager::AddDevice, + base::Unretained(this)), + base::BindRepeating(&VRDeviceManager::RemoveDevice, + base::Unretained(this)), + base::BindOnce(&VRDeviceManager::OnProviderInitialized, + base::Unretained(this))); } providers_initialized_ = true;
diff --git a/chrome/browser/vr/service/vr_device_manager_unittest.cc b/chrome/browser/vr/service/vr_device_manager_unittest.cc index 11d3b6c0b5..7b6e5da8 100644 --- a/chrome/browser/vr/service/vr_device_manager_unittest.cc +++ b/chrome/browser/vr/service/vr_device_manager_unittest.cc
@@ -68,9 +68,10 @@ device::mojom::VRServiceClientPtr proxy; device::FakeVRServiceClient client(mojo::MakeRequest(&proxy)); auto service = base::WrapUnique(new VRServiceImplForTesting()); - service->SetClient(std::move(proxy), - base::Bind(&VRDeviceManagerTest::onDisplaySynced, - base::Unretained(this))); + service->SetClient( + std::move(proxy), + base::BindRepeating(&VRDeviceManagerTest::onDisplaySynced, + base::Unretained(this))); return service; }
diff --git a/chrome/browser/vr/speech_recognizer.cc b/chrome/browser/vr/speech_recognizer.cc index d45f367..7f35c49 100644 --- a/chrome/browser/vr/speech_recognizer.cc +++ b/chrome/browser/vr/speech_recognizer.cc
@@ -172,16 +172,16 @@ SpeechRecognitionState new_state) { content::BrowserThread::PostTask( content::BrowserThread::UI, FROM_HERE, - base::Bind(&IOBrowserUIInterface::OnSpeechRecognitionStateChanged, - browser_ui_, new_state)); + base::BindOnce(&IOBrowserUIInterface::OnSpeechRecognitionStateChanged, + browser_ui_, new_state)); } void SpeechRecognizerOnIO::StartSpeechTimeout(int timeout_seconds) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - speech_timeout_->Start(FROM_HERE, - base::TimeDelta::FromSeconds(timeout_seconds), - base::Bind(&SpeechRecognizerOnIO::SpeechTimeout, - weak_factory_.GetWeakPtr())); + speech_timeout_->Start( + FROM_HERE, base::TimeDelta::FromSeconds(timeout_seconds), + base::BindRepeating(&SpeechRecognizerOnIO::SpeechTimeout, + weak_factory_.GetWeakPtr())); } void SpeechRecognizerOnIO::SpeechTimeout() { @@ -214,8 +214,8 @@ } content::BrowserThread::PostTask( content::BrowserThread::UI, FROM_HERE, - base::Bind(&IOBrowserUIInterface::OnSpeechResult, browser_ui_, result_str, - final_count == results.size())); + base::BindOnce(&IOBrowserUIInterface::OnSpeechResult, browser_ui_, + result_str, final_count == results.size())); if (result_str != last_result_str_) { StartSpeechTimeout(kNoNewSpeechTimeoutInSeconds); @@ -258,8 +258,8 @@ volume = std::max(0.0f, volume - noise_volume); content::BrowserThread::PostTask( content::BrowserThread::UI, FROM_HERE, - base::Bind(&IOBrowserUIInterface::OnSpeechSoundLevelChanged, browser_ui_, - volume)); + base::BindOnce(&IOBrowserUIInterface::OnSpeechSoundLevelChanged, + browser_ui_, volume)); } void SpeechRecognizerOnIO::OnEnvironmentEstimationComplete(int session_id) {}
diff --git a/chrome/browser/vr/test/run_all_perftests.cc b/chrome/browser/vr/test/run_all_perftests.cc index e16ae6c..9b7663af 100644 --- a/chrome/browser/vr/test/run_all_perftests.cc +++ b/chrome/browser/vr/test/run_all_perftests.cc
@@ -11,5 +11,6 @@ return base::LaunchUnitTestsSerially( argc, argv, - base::Bind(&vr::VrTestSuite::Run, base::Unretained(&test_suite))); + base::BindRepeating(&vr::VrTestSuite::Run, + base::Unretained(&test_suite))); }
diff --git a/chrome/browser/vr/test/run_all_pixeltests.cc b/chrome/browser/vr/test/run_all_pixeltests.cc index f2c76e5..58c04a1 100644 --- a/chrome/browser/vr/test/run_all_pixeltests.cc +++ b/chrome/browser/vr/test/run_all_pixeltests.cc
@@ -11,5 +11,6 @@ return base::LaunchUnitTests( argc, argv, - base::Bind(&vr::VrTestSuite::Run, base::Unretained(&test_suite))); + base::BindRepeating(&vr::VrTestSuite::Run, + base::Unretained(&test_suite))); }
diff --git a/chrome/browser/vr/test/run_all_unittests.cc b/chrome/browser/vr/test/run_all_unittests.cc index f2c76e5..58c04a1 100644 --- a/chrome/browser/vr/test/run_all_unittests.cc +++ b/chrome/browser/vr/test/run_all_unittests.cc
@@ -11,5 +11,6 @@ return base::LaunchUnitTests( argc, argv, - base::Bind(&vr::VrTestSuite::Run, base::Unretained(&test_suite))); + base::BindRepeating(&vr::VrTestSuite::Run, + base::Unretained(&test_suite))); }
diff --git a/chrome/browser/vr/testapp/gl_renderer.cc b/chrome/browser/vr/testapp/gl_renderer.cc index 8580bf1c..b9b1076 100644 --- a/chrome/browser/vr/testapp/gl_renderer.cc +++ b/chrome/browser/vr/testapp/gl_renderer.cc
@@ -57,7 +57,7 @@ void GlRenderer::PostRenderFrameTask(gfx::SwapResult result) { base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, - base::Bind(&GlRenderer::RenderFrame, weak_ptr_factory_.GetWeakPtr()), + base::BindOnce(&GlRenderer::RenderFrame, weak_ptr_factory_.GetWeakPtr()), base::TimeDelta::FromSecondsD(1.0 / 60)); }
diff --git a/chrome/browser/vr/testapp/vr_testapp.cc b/chrome/browser/vr/testapp/vr_testapp.cc index de3c175f1..7303f55 100644 --- a/chrome/browser/vr/testapp/vr_testapp.cc +++ b/chrome/browser/vr/testapp/vr_testapp.cc
@@ -121,7 +121,7 @@ void Start() { base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, - base::Bind(&AppWindow::StartOnGpu, weak_ptr_factory_.GetWeakPtr())); + base::BindOnce(&AppWindow::StartOnGpu, weak_ptr_factory_.GetWeakPtr())); } void Quit() { window_manager_->Quit(); } @@ -226,8 +226,8 @@ } is_configuring_ = true; - delegate_->GetDisplays( - base::Bind(&WindowManager::OnDisplaysAquired, base::Unretained(this))); + delegate_->GetDisplays(base::BindRepeating(&WindowManager::OnDisplaysAquired, + base::Unretained(this))); } void WindowManager::OnDisplaySnapshotsInvalidated() {} @@ -246,8 +246,9 @@ delegate_->Configure( *display, display->native_mode(), origin, - base::Bind(&WindowManager::OnDisplayConfigured, base::Unretained(this), - gfx::Rect(origin, display->native_mode()->size()))); + base::BindRepeating(&WindowManager::OnDisplayConfigured, + base::Unretained(this), + gfx::Rect(origin, display->native_mode()->size()))); origin.Offset(display->native_mode()->size().width(), 0); } is_configuring_ = false; @@ -255,8 +256,8 @@ if (should_configure_) { should_configure_ = false; base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::Bind(&WindowManager::OnConfigurationChanged, - base::Unretained(this))); + FROM_HERE, base::BindOnce(&WindowManager::OnConfigurationChanged, + base::Unretained(this))); } }
diff --git a/chrome/browser/vr/ui_scene_creator.cc b/chrome/browser/vr/ui_scene_creator.cc index 29f41fbb..8b987970 100644 --- a/chrome/browser/vr/ui_scene_creator.cc +++ b/chrome/browser/vr/ui_scene_creator.cc
@@ -609,9 +609,10 @@ VR_BIND_FUNC(unsigned int, Model, model_, model->native_ui.texture_id, ContentElement, hosted_ui.get(), SetTextureId)); hosted_ui->AddBinding(std::make_unique<Binding<bool>>( - base::Bind([](Model* m) { return m->native_ui.hosted_ui_enabled; }, - base::Unretained(model_)), - base::Bind( + base::BindRepeating( + [](Model* m) { return m->native_ui.hosted_ui_enabled; }, + base::Unretained(model_)), + base::BindRepeating( [](ContentElement* dialog, const bool& enabled) { dialog->SetVisible(enabled); dialog->set_requires_layout(enabled); @@ -620,9 +621,9 @@ base::Unretained(hosted_ui.get())))); hosted_ui->AddBinding(std::make_unique<Binding<float>>( - base::Bind([](Model* m) { return m->native_ui.size_ratio; }, - base::Unretained(model_)), - base::Bind( + base::BindRepeating([](Model* m) { return m->native_ui.size_ratio; }, + base::Unretained(model_)), + base::BindRepeating( [](ContentElement* dialog, const float& value) { dialog->SetSize(kContentWidth * kHostedUiWidthRatio, kContentWidth * kHostedUiWidthRatio * value);
diff --git a/chrome/child/pdf_child_init.cc b/chrome/child/pdf_child_init.cc index a1657df3..ea5944e 100644 --- a/chrome/child/pdf_child_init.cc +++ b/chrome/child/pdf_child_init.cc
@@ -4,21 +4,19 @@ #include "chrome/child/pdf_child_init.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/path_service.h" #include "build/build_config.h" -#include "chrome/common/chrome_paths.h" -#include "content/public/child/child_thread.h" #if defined(OS_WIN) #include "base/win/current_module.h" #include "base/win/iat_patch_function.h" +#include "content/public/child/child_thread.h" #endif namespace { + #if defined(OS_WIN) -static base::win::IATPatchFunction g_iat_patch_createdca; +base::win::IATPatchFunction g_iat_patch_createdca; + HDC WINAPI CreateDCAPatch(LPCSTR driver_name, LPCSTR device_name, LPCSTR output, @@ -37,8 +35,10 @@ DWORD offset, LPVOID buffer, DWORD length); -GetFontDataPtr g_original_get_font_data = NULL; -static base::win::IATPatchFunction g_iat_patch_get_font_data; +GetFontDataPtr g_original_get_font_data = nullptr; + +base::win::IATPatchFunction g_iat_patch_get_font_data; + DWORD WINAPI GetFontDataPatch(HDC hdc, DWORD table, DWORD offset, @@ -50,7 +50,6 @@ LOGFONT logfont; if (GetObject(font, sizeof(LOGFONT), &logfont)) { - std::vector<char> font_data; if (content::ChildThread::Get()) content::ChildThread::Get()->PreCacheFont(logfont); rv = g_original_get_font_data(hdc, table, offset, buffer, length); @@ -60,7 +59,7 @@ } return rv; } -#endif // OS_WIN +#endif // defined(OS_WIN) } // namespace @@ -75,6 +74,5 @@ "GetFontData", GetFontDataPatch); g_original_get_font_data = reinterpret_cast<GetFontDataPtr>( g_iat_patch_get_font_data.original_function()); -#endif // OS_WIN +#endif // defined(OS_WIN) } -
diff --git a/chrome/common/extensions/docs/static/images/hello_extensions.png b/chrome/common/extensions/docs/static/images/hello_extensions.png new file mode 100644 index 0000000..63ea0d20 --- /dev/null +++ b/chrome/common/extensions/docs/static/images/hello_extensions.png Binary files differ
diff --git a/chrome/common/extensions/docs/templates/articles/extensions_index.html b/chrome/common/extensions/docs/templates/articles/extensions_index.html index f1c07fb..ece50b6 100644 --- a/chrome/common/extensions/docs/templates/articles/extensions_index.html +++ b/chrome/common/extensions/docs/templates/articles/extensions_index.html
@@ -55,14 +55,13 @@ <h2 id="hello-extensions">Hello Extensions</h2> <p> Take a small step into extensions with this quick Hello Extensions example. -Create a new directory to store files or download them -<a href="examples/tutorials/hello_extensions" download="hello_extensions"> - here. -</a> +Start by creating a new directory to store the extension's files, +or download them from the +<a href="/extensions/samples#search:hello">sample page</a>. </p> <p> -Start by creating a file called <code>manifest.json</code> +Next, add a file called <code>manifest.json</code> and include the following code: </p> <pre data-filename="manifest.json"> @@ -94,7 +93,7 @@ </pre> <p> Download - <a href="examples/tutorials/hello_extensions/hello_extensions.png" + <a href="{{static}}/images/index/hello_extensions.png" download="hello_extensions.png"> <code>hello_extensions.png</code> here</a> and then create a file titled <code>hello.html</code>:
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 093df1fb0..e904dea7 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -619,6 +619,7 @@ "../browser/permissions/permission_request_manager_browsertest.cc", "../browser/permissions/permissions_browsertest.cc", "../browser/permissions/permissions_browsertest.h", + "../browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc", "../browser/plugins/flash_permission_browsertest.cc", "../browser/plugins/plugin_power_saver_browsertest.cc", "../browser/policy/cloud/cloud_policy_browsertest.cc",
diff --git a/chrome/test/data/password/password_form_action_mutation.html b/chrome/test/data/password/password_form_action_mutation.html new file mode 100644 index 0000000..454b352 --- /dev/null +++ b/chrome/test/data/password/password_form_action_mutation.html
@@ -0,0 +1,44 @@ +<!doctype html> +<html> +<head> + <base href="done"> + +<script> + +function state_changed(xhr) { + if (xhr.readyState == 4) { + // Make form action mutation delayed so as that AjaxSucceeded handler + // can be run first. AjaxSucceded handler should start observing form + // mutations by form tracker. + setTimeout(function() { + document.getElementById('form_with_action_mutation').setAttribute('action', 'done.html'); + + // Event on XHR finish should be sent a bit later to make browser react + // on form action mutation. + setTimeout(function() { + window.domAutomationController.send("XHR_FINISHED"); + }, 0) + }, 0); + } +} + +function send_xhr() { + var xhr = new XMLHttpRequest(); + xhr.onreadystatechange = function() { state_changed(xhr); }; + xhr.open("GET", "password_form_action_mutation.html", true); + xhr.send(null); +} + +</script> +</head> +<body> + +<form method="POST" action="dummy" id="form_with_action_mutation" + onsubmit="send_xhr(); return false;"> + <input type="text" id="username_action_mutation" name="username_action_mutation"> + <input type="password" id="password_action_mutation" name="password_action_mutation"> + <input type="submit" id="submit_action_mutation" name="submit_action_mutation"> +</form> + +</body> +</html>
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index 64f5192b..a364c30c 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -10435.0.0 \ No newline at end of file +10436.0.0 \ No newline at end of file
diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc index bce04c5..456dd63e 100644 --- a/components/autofill/content/renderer/autofill_agent.cc +++ b/components/autofill/content/renderer/autofill_agent.cc
@@ -192,16 +192,7 @@ return; // Navigation to a new page or a page refresh. - - // Do Finch testing to see how much regressions are caused by this leak fix - // (crbug/753071). - std::string group_name = - base::FieldTrialList::FindFullName("FixDocumentLeakInAutofillAgent"); - if (base::StartsWith(group_name, "enabled", - base::CompareCase::INSENSITIVE_ASCII)) { - element_.Reset(); - } - + element_.Reset(); form_cache_.Reset(); ResetLastInteractedElements(); OnFormNoLongerSubmittable();
diff --git a/components/autofill/core/browser/personal_data_manager.h b/components/autofill/core/browser/personal_data_manager.h index ce8f498..cc35be6 100644 --- a/components/autofill/core/browser/personal_data_manager.h +++ b/components/autofill/core/browser/personal_data_manager.h
@@ -149,7 +149,7 @@ // Updates the use stats and billing address id for the server |credit_card|. // Looks up the card by server_id. - void UpdateServerCardMetadata(const CreditCard& credit_card); + virtual void UpdateServerCardMetadata(const CreditCard& credit_card); // Resets the card for |guid| to the masked state. void ResetFullServerCard(const std::string& guid);
diff --git a/components/autofill/core/common/autofill_regexes.cc b/components/autofill/core/common/autofill_regexes.cc index db66dd4..3c289e3 100644 --- a/components/autofill/core/common/autofill_regexes.cc +++ b/components/autofill/core/common/autofill_regexes.cc
@@ -8,18 +8,23 @@ #include <unordered_map> #include <utility> +#include "base/lazy_instance.h" #include "base/logging.h" #include "base/macros.h" -#include "base/memory/singleton.h" #include "base/strings/string16.h" +#include "base/threading/thread_local.h" #include "third_party/icu/source/i18n/unicode/regex.h" namespace { -// A singleton class that serves as a cache of compiled regex patterns. +// A thread-local class that serves as a cache of compiled regex patterns. +// +// The regexp state can be accessed from multiple threads in single process +// mode, and this class offers per-thread instance instead of per-process +// singleton instance (https://crbug.com/812182). class AutofillRegexes { public: - static AutofillRegexes* GetInstance(); + static AutofillRegexes* ThreadSpecificInstance(); // Returns the compiled regex matcher corresponding to |pattern|. icu::RegexMatcher* GetMatcher(const base::string16& pattern); @@ -27,7 +32,6 @@ private: AutofillRegexes(); ~AutofillRegexes(); - friend struct base::DefaultSingletonTraits<AutofillRegexes>; // Maps patterns to their corresponding regex matchers. std::unordered_map<base::string16, std::unique_ptr<icu::RegexMatcher>> @@ -36,15 +40,22 @@ DISALLOW_COPY_AND_ASSIGN(AutofillRegexes); }; +base::LazyInstance<base::ThreadLocalPointer<AutofillRegexes>>::Leaky + g_autofill_regexes_tls = LAZY_INSTANCE_INITIALIZER; + // static -AutofillRegexes* AutofillRegexes::GetInstance() { - return base::Singleton<AutofillRegexes>::get(); +AutofillRegexes* AutofillRegexes::ThreadSpecificInstance() { + if (g_autofill_regexes_tls.Pointer()->Get()) + return g_autofill_regexes_tls.Pointer()->Get(); + return new AutofillRegexes; } AutofillRegexes::AutofillRegexes() { + g_autofill_regexes_tls.Pointer()->Set(this); } AutofillRegexes::~AutofillRegexes() { + g_autofill_regexes_tls.Pointer()->Set(nullptr); } icu::RegexMatcher* AutofillRegexes::GetMatcher(const base::string16& pattern) { @@ -72,7 +83,7 @@ bool MatchesPattern(const base::string16& input, const base::string16& pattern) { icu::RegexMatcher* matcher = - AutofillRegexes::GetInstance()->GetMatcher(pattern); + AutofillRegexes::ThreadSpecificInstance()->GetMatcher(pattern); icu::UnicodeString icu_input(FALSE, input.data(), input.length()); matcher->reset(icu_input);
diff --git a/components/content_settings/core/browser/cookie_settings.cc b/components/content_settings/core/browser/cookie_settings.cc index 0deb011..124c51b 100644 --- a/components/content_settings/core/browser/cookie_settings.cc +++ b/components/content_settings/core/browser/cookie_settings.cc
@@ -32,6 +32,12 @@ setting == CONTENT_SETTING_SESSION_ONLY); } +GURL ToHttps(GURL url) { + GURL::Replacements replace_scheme; + replace_scheme.SetSchemeStr(url::kHttpsScheme); + return url.ReplaceComponents(replace_scheme); +} + } // namespace namespace content_settings { @@ -71,10 +77,16 @@ return (setting == CONTENT_SETTING_SESSION_ONLY); } -bool CookieSettings::IsCookieSessionOnlyOrBlocked(const GURL& origin) const { +bool CookieSettings::ShouldDeleteCookieOnExit(const GURL& origin) const { ContentSetting setting; GetCookieSetting(origin, origin, nullptr, &setting); DCHECK(IsValidSetting(setting)); + + if (setting == CONTENT_SETTING_BLOCK && origin.SchemeIs(url::kHttpScheme)) { + // Keep blocked, non-secure cookies if the secure origin is set to ALLOW. + GURL https_origin = ToHttps(origin); + return ShouldDeleteCookieOnExit(https_origin); + } return (setting == CONTENT_SETTING_SESSION_ONLY) || (setting == CONTENT_SETTING_BLOCK); }
diff --git a/components/content_settings/core/browser/cookie_settings.h b/components/content_settings/core/browser/cookie_settings.h index f7f2b8b..7a15d8d 100644 --- a/components/content_settings/core/browser/cookie_settings.h +++ b/components/content_settings/core/browser/cookie_settings.h
@@ -61,9 +61,12 @@ // Returns true if the cookie set by a page identified by |url| should be // session only or blocked. + // If an http |url| is BLOCKED, but the https version of |url| is ALLOWED, + // the cookie will not be deleted to allow blocking http cookie without + // affecting cookies from https sites that are not marked as "Secure". // // This may be called on any thread. - bool IsCookieSessionOnlyOrBlocked(const GURL& url) const; + bool ShouldDeleteCookieOnExit(const GURL& url) const; // Returns all patterns with a non-default cookie setting, mapped to their // actual settings, in the precedence order of the setting rules. |settings|
diff --git a/components/content_settings/core/browser/cookie_settings_unittest.cc b/components/content_settings/core/browser/cookie_settings_unittest.cc index f606004..b073e79 100644 --- a/components/content_settings/core/browser/cookie_settings_unittest.cc +++ b/components/content_settings/core/browser/cookie_settings_unittest.cc
@@ -113,6 +113,29 @@ EXPECT_TRUE(cookie_settings_->IsCookieSessionOnly(kBlockedSite)); } +TEST_F(CookieSettingsTest, CookiesDeleteSessionOnlyAndBlocked) { + // Delete blocked cookies. + cookie_settings_->SetCookieSetting(kBlockedSite, CONTENT_SETTING_BLOCK); + EXPECT_FALSE(cookie_settings_->ShouldDeleteCookieOnExit(kHttpSite)); + EXPECT_TRUE(cookie_settings_->ShouldDeleteCookieOnExit(kBlockedSite)); + + // Delete session_only cookies. + cookie_settings_->SetCookieSetting(kHttpSite, CONTENT_SETTING_SESSION_ONLY); + cookie_settings_->SetCookieSetting(kHttpsSite, CONTENT_SETTING_ALLOW); + EXPECT_TRUE(cookie_settings_->ShouldDeleteCookieOnExit(kHttpSite)); + EXPECT_FALSE(cookie_settings_->ShouldDeleteCookieOnExit(kHttpsSite)); + + // Keep blocked http cookies if https is allowed. + cookie_settings_->SetCookieSetting(kHttpSite, CONTENT_SETTING_BLOCK); + EXPECT_FALSE(cookie_settings_->ShouldDeleteCookieOnExit(kHttpSite)); + EXPECT_FALSE(cookie_settings_->ShouldDeleteCookieOnExit(kHttpsSite)); + + // Delete cookies if http is blocked and https session only. + cookie_settings_->SetCookieSetting(kHttpsSite, CONTENT_SETTING_SESSION_ONLY); + EXPECT_TRUE(cookie_settings_->ShouldDeleteCookieOnExit(kHttpSite)); + EXPECT_TRUE(cookie_settings_->ShouldDeleteCookieOnExit(kHttpsSite)); +} + TEST_F(CookieSettingsTest, CookiesThirdPartyBlockedExplicitAllow) { cookie_settings_->SetCookieSetting(kAllowedSite, CONTENT_SETTING_ALLOW); prefs_.SetBoolean(prefs::kBlockThirdPartyCookies, true);
diff --git a/components/password_manager/core/browser/export/password_manager_exporter.cc b/components/password_manager/core/browser/export/password_manager_exporter.cc index 3265add7..2a330d3 100644 --- a/components/password_manager/core/browser/export/password_manager_exporter.cc +++ b/components/password_manager/core/browser/export/password_manager_exporter.cc
@@ -31,13 +31,12 @@ // A wrapper for |write_function|, which can be bound and keep a copy of its // data on the closure. -bool Write(int (*write_function)(const base::FilePath& filename, - const char* data, - int size), - const base::FilePath& destination, - const std::string& serialised) { +bool Write( + password_manager::PasswordManagerExporter::WriteCallback write_function, + const base::FilePath& destination, + const std::string& serialised) { int written = - write_function(destination, serialised.c_str(), serialised.size()); + write_function.Run(destination, serialised.c_str(), serialised.size()); return written == static_cast<int>(serialised.size()); } @@ -54,7 +53,7 @@ : credential_provider_interface_(credential_provider_interface), on_progress_(std::move(on_progress)), last_progress_status_(ExportProgressStatus::NOT_STARTED), - write_function_(&base::WriteFile), + write_function_(base::BindRepeating(&base::WriteFile)), delete_function_(base::BindRepeating(&base::DeleteFile)), task_runner_(g_task_runner.Get()), weak_factory_(this) {} @@ -127,16 +126,13 @@ return last_progress_status_; } -void PasswordManagerExporter::SetWriteForTesting( - int (*write_function)(const base::FilePath& filename, - const char* data, - int size)) { - write_function_ = write_function; +void PasswordManagerExporter::SetWriteForTesting(WriteCallback write_function) { + write_function_ = std::move(write_function); } void PasswordManagerExporter::SetDeleteForTesting( DeleteCallback delete_callback) { - delete_function_ = delete_callback; + delete_function_ = std::move(delete_callback); } bool PasswordManagerExporter::IsReadyForExport() {
diff --git a/components/password_manager/core/browser/export/password_manager_exporter.h b/components/password_manager/core/browser/export/password_manager_exporter.h index 72ba42d..e4b685a423 100644 --- a/components/password_manager/core/browser/export/password_manager_exporter.h +++ b/components/password_manager/core/browser/export/password_manager_exporter.h
@@ -29,6 +29,8 @@ using ProgressCallback = base::RepeatingCallback<void(password_manager::ExportProgressStatus, const std::string&)>; + using WriteCallback = + base::RepeatingCallback<int(const base::FilePath&, const char*, int)>; using DeleteCallback = base::RepeatingCallback<bool(const base::FilePath&, bool)>; @@ -55,9 +57,7 @@ // Replace the function which writes to the filesystem with a custom action. // The return value is -1 on error, otherwise the number of bytes written. - void SetWriteForTesting(int (*write_function)(const base::FilePath& filename, - const char* data, - int size)); + void SetWriteForTesting(WriteCallback write_callback); // Replace the function which writes to the filesystem with a custom action. // The return value is true when deleting successfully. @@ -112,11 +112,9 @@ // list. Useful for metrics. base::Time export_preparation_started_; - // The function which does the actual writing. It should point to + // The function which does the actual writing. It should wrap // base::WriteFile, unless it's changed for testing purposes. - int (*write_function_)(const base::FilePath& filename, - const char* data, - int size); + WriteCallback write_function_; // The function which does the actual deleting of a file. It should wrap // base::DeleteFile, unless it's changed for testing purposes.
diff --git a/components/password_manager/core/browser/export/password_manager_exporter_unittest.cc b/components/password_manager/core/browser/export/password_manager_exporter_unittest.cc index ba31cc8e..3de7778f 100644 --- a/components/password_manager/core/browser/export/password_manager_exporter_unittest.cc +++ b/components/password_manager/core/browser/export/password_manager_exporter_unittest.cc
@@ -78,17 +78,6 @@ DISALLOW_COPY_AND_ASSIGN(FakeCredentialProvider); }; -// WriteFunction will delegate to this callback, if set. Use for setting -// expectations for base::WriteFile in PasswordManagerExporter. -base::MockCallback<WriteCallback>* g_write_callback = nullptr; - -// Mock for base::WriteFile. Expectations should be set on |g_write_callback|. -int WriteFunction(const base::FilePath& filename, const char* data, int size) { - if (g_write_callback) - return g_write_callback->Get().Run(filename, data, size); - return size; -} - // Creates a hardcoded set of credentials for tests. std::vector<std::unique_ptr<autofill::PasswordForm>> CreatePasswordList() { auto password_form = std::make_unique<autofill::PasswordForm>(); @@ -108,15 +97,17 @@ base::test::ScopedTaskEnvironment::MainThreadType::UI), exporter_(&fake_credential_provider_, mock_on_progress_.Get()), destination_path_(kNullFileName) { - g_write_callback = &mock_write_file_; - exporter_.SetWriteForTesting(&WriteFunction); + exporter_.SetWriteForTesting(mock_write_file_.Get()); exporter_.SetDeleteForTesting(mock_delete_file_.Get()); + password_list_ = CreatePasswordList(); + fake_credential_provider_.SetPasswordList(password_list_); } - ~PasswordManagerExporterTest() override { g_write_callback = nullptr; } + ~PasswordManagerExporterTest() override = default; protected: base::test::ScopedTaskEnvironment scoped_task_environment_; + std::vector<std::unique_ptr<autofill::PasswordForm>> password_list_; FakeCredentialProvider fake_credential_provider_; base::MockCallback<base::RepeatingCallback< void(password_manager::ExportProgressStatus, const std::string&)>> @@ -132,11 +123,8 @@ }; TEST_F(PasswordManagerExporterTest, PasswordExportSetPasswordListFirst) { - std::vector<std::unique_ptr<autofill::PasswordForm>> password_list = - CreatePasswordList(); - fake_credential_provider_.SetPasswordList(password_list); const std::string serialised( - password_manager::PasswordCSVWriter::SerializePasswords(password_list)); + password_manager::PasswordCSVWriter::SerializePasswords(password_list_)); EXPECT_CALL(mock_write_file_, Run(destination_path_, StrEq(serialised), serialised.size())) @@ -153,7 +141,8 @@ scoped_task_environment_.RunUntilIdle(); histogram_tester_.ExpectUniqueSample( - "PasswordManager.ExportedPasswordsPerUserInCSV", password_list.size(), 1); + "PasswordManager.ExportedPasswordsPerUserInCSV", password_list_.size(), + 1); histogram_tester_.ExpectTotalCount( "PasswordManager.TimeReadingExportedPasswords", 1); histogram_tester_.ExpectUniqueSample( @@ -164,9 +153,6 @@ // When writing fails, we should notify the UI of the failure and try to cleanup // a possibly partial passwords file. TEST_F(PasswordManagerExporterTest, WriteFileFailed) { - std::vector<std::unique_ptr<autofill::PasswordForm>> password_list = - CreatePasswordList(); - fake_credential_provider_.SetPasswordList(password_list); const std::string destination_folder_name( destination_path_.DirName().BaseName().AsUTF8Unsafe()); @@ -193,11 +179,8 @@ // Test that GetProgressStatus() returns the last ExportProgressStatus sent // to the callback. TEST_F(PasswordManagerExporterTest, GetProgressReturnsLastCallbackStatus) { - std::vector<std::unique_ptr<autofill::PasswordForm>> password_list = - CreatePasswordList(); - fake_credential_provider_.SetPasswordList(password_list); const std::string serialised( - password_manager::PasswordCSVWriter::SerializePasswords(password_list)); + password_manager::PasswordCSVWriter::SerializePasswords(password_list_)); const std::string destination_folder_name( destination_path_.DirName().BaseName().AsUTF8Unsafe()); @@ -218,10 +201,6 @@ } TEST_F(PasswordManagerExporterTest, DontExportWithOnlyDestination) { - std::vector<std::unique_ptr<autofill::PasswordForm>> password_list = - CreatePasswordList(); - fake_credential_provider_.SetPasswordList(password_list); - EXPECT_CALL(mock_write_file_, Run(_, _, _)).Times(0); EXPECT_CALL( mock_on_progress_, @@ -239,10 +218,6 @@ } TEST_F(PasswordManagerExporterTest, CancelAfterPasswords) { - std::vector<std::unique_ptr<autofill::PasswordForm>> password_list = - CreatePasswordList(); - fake_credential_provider_.SetPasswordList(password_list); - EXPECT_CALL(mock_write_file_, Run(_, _, _)).Times(0); EXPECT_CALL( mock_on_progress_, @@ -260,10 +235,6 @@ } TEST_F(PasswordManagerExporterTest, CancelWhileExporting) { - std::vector<std::unique_ptr<autofill::PasswordForm>> password_list = - CreatePasswordList(); - fake_credential_provider_.SetPasswordList(password_list); - EXPECT_CALL(mock_write_file_, Run(_, _, _)).Times(0); EXPECT_CALL(mock_delete_file_, Run(destination_path_, false)); EXPECT_CALL( @@ -288,10 +259,6 @@ // The "Cancel" button may still be visible on the UI after we've completed // exporting. If they choose to cancel, we should clear the file. TEST_F(PasswordManagerExporterTest, CancelAfterExporting) { - std::vector<std::unique_ptr<autofill::PasswordForm>> password_list = - CreatePasswordList(); - fake_credential_provider_.SetPasswordList(password_list); - EXPECT_CALL(mock_write_file_, Run(_, _, _)).WillOnce(ReturnArg<2>()); EXPECT_CALL(mock_delete_file_, Run(destination_path_, false)); EXPECT_CALL(
diff --git a/components/policy/proto/chrome_device_policy.proto b/components/policy/proto/chrome_device_policy.proto index 6ee86cdc..05fdb7db 100644 --- a/components/policy/proto/chrome_device_policy.proto +++ b/components/policy/proto/chrome_device_policy.proto
@@ -993,12 +993,18 @@ message DeviceLoginScreenIsolateOriginsProto { // A comma-separated list of the origins to be run in a separate process on // the sign-in screen. + // If the value of this policy does not match the value of the user policy + // IsolateOrigins, the chrome process will be restarted on user sign-in to + // apply the value specified by the user policy. optional string isolate_origins = 1; } // Specifies if each site should run in its own process on the sign-in screen. message DeviceLoginScreenSitePerProcessProto { // If true, each site will run in its own process on the sign-in screen. + // If the value of this policy does not match the value of the user policy + // SitePerProcess, the chrome process will be restarted on user sign-in to + // apply the value specified by the user policy. optional bool site_per_process = 1; }
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index a4adc11b..e1a2196 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -5878,7 +5878,14 @@ 'id': 127, 'caption': '''Enable metrics reporting''', 'tags': ['admin-sharing'], - 'desc': '''Controls whether usage metrics and diagnostic data, including crash reports, are reported back to Google. If set to true, <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> will report usage metrics and diagnostic data. If not configured or set to false, metrics and diagnostic data reporting will be disabled.''', + 'desc': '''Controls whether usage metrics and diagnostic data, including crash reports, are reported back to Google. + + If set to true, <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> will report usage metrics and diagnostic data. + + If set to false, metrics and diagnostic data reporting will be disabled. + + If not configured, metrics and diagnostic data reporting will be disabled on unmanaged devices and enabled on managed devices.''', + 'arc_support': 'This policy also controls Android usage and diagnostic data collection.', }, { @@ -10893,6 +10900,7 @@ https://example.com/ site. If the policy is disabled, the per-Site Isolation process management logic will take effect. If the policy is not configured, the user will be able to change this setting. + On <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph>, it is recommended to also set the <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME">DeviceLoginScreenIsolateOrigins</ph> device policy to the same value. If the values specified by the two policies don't match, a delay may be incurred when entering a user session while the value specified by user policy is being applied. ''', }, { @@ -10918,6 +10926,7 @@ If the policy is enabled, each site will run in its own process. If the policy is disabled, the per-Site Isolation process management logic will take effect. If the policy is not configured, the user will be able to change this setting. + On <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph>, it is recommended to also set the <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME">DeviceLoginScreenSitePerProcess</ph> device policy to the same value. If the values specified by the two policies don't match, a delay may be incurred when entering a user session while the value specified by user policy is being applied. ''', }, { @@ -10936,7 +10945,7 @@ 'tags': ['system-security'], 'desc': ''' NOTE: This policy is experimental and may break functionality! - This policy applies to the sign-in screen. Please see also the 'IsolateOrigins' policy which applies to the user session. It is recommended to set both policies to the same value. + This policy applies to the sign-in screen. Please see also the <ph name="ISOLATE_ORIGINS_POLICY_NAME">IsolateOrigins</ph> policy which applies to the user session. It is recommended to set both policies to the same value. If the values don't match, a delay may be incurred when entering a user session while the value specified by user policy is being applied. If the policy is enabled, each of the named origins in a comma-separated list will run in its own process. This will also isolate origins named by subdomains; e.g. specifying https://example.com/ will @@ -10962,7 +10971,7 @@ 'tags': ['system-security'], 'desc': ''' NOTE: This policy is experimental and may break functionality! - This policy applies to the sign-in screen. Please see also the 'SitePerProcess' policy which applies to the user session. It is recommended to set both policies to the same value. + This policy applies to the sign-in screen. Please see also the <ph name="SITE_PER_PROCESS_POLICY_NAME">SitePerProcess</ph> policy which applies to the user session. It is recommended to set both policies to the same value. If the values don't match, a delay may be incurred when entering a user session while the value specified by user policy is being applied. You might want to look at the IsolateOrigins policy setting to get the best of both worlds, isolation and limited impact for users, by using IsolateOrigins with a list of the sites you want to isolate. This setting,
diff --git a/components/sessions/core/tab_restore_service_helper.cc b/components/sessions/core/tab_restore_service_helper.cc index 89c61dabad..3d00472c 100644 --- a/components/sessions/core/tab_restore_service_helper.cc +++ b/components/sessions/core/tab_restore_service_helper.cc
@@ -172,7 +172,7 @@ int deleted_tabs = 0; for (auto& tab : window->tabs) { if (DeleteFromTab(predicate, tab.get())) { - if (window->selected_tab_index == tab->tabstrip_index) + if (window->tabs[window->selected_tab_index] == tab) window->selected_tab_index = 0; deleted_tabs++; } else { @@ -202,8 +202,13 @@ } case TabRestoreService::WINDOW: { Window* window = static_cast<Window*>(entry.get()); - if (!DeleteFromWindow(predicate, window)) - new_entries.push_back(std::move(entry)); + if (!DeleteFromWindow(predicate, window)) { + // If only a single tab is left, just keep the tab. + if (window->tabs.size() == 1U) + new_entries.push_back(std::move(window->tabs.front())); + else + new_entries.push_back(std::move(entry)); + } break; } }
diff --git a/components/viz/common/surfaces/local_surface_id_unittest.cc b/components/viz/common/surfaces/local_surface_id_unittest.cc index e280167f..ce97c746 100644 --- a/components/viz/common/surfaces/local_surface_id_unittest.cc +++ b/components/viz/common/surfaces/local_surface_id_unittest.cc
@@ -22,16 +22,19 @@ const viz::LocalSurfaceId small_local_surface_id(11, 22, small_token); const std::string verbose_expected = - "LocalSurfaceId(11, 22, 0011111100000000)"; - const std::string brief_expected = "LocalSurfaceId(11, 22, 0011...)"; + "LocalSurfaceId(11, 22, " + token.ToString() + ")"; + const std::string brief_expected = + "LocalSurfaceId(11, 22, " + token.ToString().substr(0, 4) + "...)"; const std::string big_verbose_expected = - "LocalSurfaceId(11, 22, 123456789ABCABCABC)"; - const std::string big_brief_expected = "LocalSurfaceId(11, 22, 1234...)"; + "LocalSurfaceId(11, 22, " + big_token.ToString() + ")"; + const std::string big_brief_expected = + "LocalSurfaceId(11, 22, " + big_token.ToString().substr(0, 4) + "...)"; const std::string small_verbose_expected = - "LocalSurfaceId(11, 22, 0000000000000001)"; - const std::string small_brief_expected = "LocalSurfaceId(11, 22, 0000...)"; + "LocalSurfaceId(11, 22, " + small_token.ToString() + ")"; + const std::string small_brief_expected = + "LocalSurfaceId(11, 22, " + small_token.ToString().substr(0, 4) + "...)"; int previous_log_lvl = logging::GetMinLogLevel();
diff --git a/content/browser/DEPS b/content/browser/DEPS index c5db0361..40031be2a 100644 --- a/content/browser/DEPS +++ b/content/browser/DEPS
@@ -74,6 +74,7 @@ "+third_party/WebKit/public/platform/WebDisplayMode.h", "+third_party/WebKit/public/platform/WebDragOperation.h", "+third_party/WebKit/public/platform/WebFocusType.h", + "+third_party/WebKit/public/platform/WebFullscreenVideoStatus.h", "+third_party/WebKit/public/platform/WebGestureEvent.h", "+third_party/WebKit/public/platform/WebInputEvent.h", "+third_party/WebKit/public/platform/WebInsecureRequestPolicy.h",
diff --git a/content/browser/android/synchronous_compositor_browser_filter.cc b/content/browser/android/synchronous_compositor_browser_filter.cc index 76ad3aef..67e716a 100644 --- a/content/browser/android/synchronous_compositor_browser_filter.cc +++ b/content/browser/android/synchronous_compositor_browser_filter.cc
@@ -59,8 +59,9 @@ base::Optional<viz::CompositorFrame>& compositor_frame = std::get<1>(param); if (!itr->second->ReceiveFrameOnIOThread(frame_sink_id, - std::move(compositor_frame))) + std::move(compositor_frame))) { bad_message::ReceivedBadMessage(this, bad_message::SCO_INVALID_ARGUMENT); + } return true; }
diff --git a/content/browser/android/synchronous_compositor_host.cc b/content/browser/android/synchronous_compositor_host.cc index 380a89b..95075885 100644 --- a/content/browser/android/synchronous_compositor_host.cc +++ b/content/browser/android/synchronous_compositor_host.cc
@@ -4,6 +4,7 @@ #include "content/browser/android/synchronous_compositor_host.h" +#include <atomic> #include <utility> #include "base/command_line.h" @@ -14,6 +15,7 @@ #include "base/trace_event/trace_event_argument.h" #include "content/browser/android/synchronous_compositor_browser_filter.h" #include "content/browser/android/synchronous_compositor_sync_call_bridge.h" +#include "content/browser/bad_message.h" #include "content/browser/renderer_host/render_widget_host_view_android.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/common/android/sync_compositor_statics.h" @@ -21,8 +23,10 @@ #include "content/public/browser/android/synchronous_compositor_client.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_view_host.h" +#include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" #include "ipc/ipc_sender.h" +#include "mojo/public/cpp/bindings/strong_binding.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkImageInfo.h" @@ -32,6 +36,170 @@ namespace content { +class SynchronousCompositorLegacyChromeIPC + : public mojom::SynchronousCompositor { + public: + SynchronousCompositorLegacyChromeIPC(IPC::Sender* sender, int routing_id) + : sender_(sender), routing_id_(routing_id) {} + + void ComputeScroll(base::TimeTicks animation_time) override { + sender_->Send( + new SyncCompositorMsg_ComputeScroll(routing_id_, animation_time)); + } + + void DemandDrawHwAsync( + const SyncCompositorDemandDrawHwParams& draw_params) override { + sender_->Send( + new SyncCompositorMsg_DemandDrawHwAsync(routing_id_, draw_params)); + } + + bool DemandDrawHw( + const content::SyncCompositorDemandDrawHwParams& draw_params, + content::SyncCompositorCommonRendererParams* out_result, + uint32_t* out_layer_tree_frame_sink_id, + base::Optional<viz::CompositorFrame>* out_frame) override { + return sender_->Send(new SyncCompositorMsg_DemandDrawHw( + routing_id_, draw_params, out_result, out_layer_tree_frame_sink_id, + out_frame)); + } + + void DemandDrawHw(const SyncCompositorDemandDrawHwParams& params, + DemandDrawHwCallback callback) override { + NOTREACHED(); + } + + bool SetSharedMemory( + const content::SyncCompositorSetSharedMemoryParams& params, + bool* out_success, + content::SyncCompositorCommonRendererParams* out_result) override { + return sender_->Send(new SyncCompositorMsg_SetSharedMemory( + routing_id_, params, out_success, out_result)); + } + + void SetSharedMemory(const SyncCompositorSetSharedMemoryParams& params, + SetSharedMemoryCallback callback) override { + NOTREACHED(); + } + + bool DemandDrawSw( + const content::SyncCompositorDemandDrawSwParams& draw_params, + content::SyncCompositorCommonRendererParams* out_result, + base::Optional<viz::CompositorFrameMetadata>* out_meta_data) override { + return sender_->Send(new SyncCompositorMsg_DemandDrawSw( + routing_id_, draw_params, out_result, out_meta_data)); + } + + void DemandDrawSw(const SyncCompositorDemandDrawSwParams& params, + DemandDrawSwCallback callback) override { + NOTREACHED(); + } + + void ZeroSharedMemory() override { + sender_->Send(new SyncCompositorMsg_ZeroSharedMemory(routing_id_)); + } + + bool ZoomBy( + float delta, + const gfx::Point& anchor, + content::SyncCompositorCommonRendererParams* out_result) override { + return sender_->Send( + new SyncCompositorMsg_ZoomBy(routing_id_, delta, anchor, out_result)); + } + + void ZoomBy(float zoom_delta, + const gfx::Point& anchor, + ZoomByCallback) override { + NOTREACHED(); + } + + void SetMemoryPolicy(uint32_t bytes_limit) override { + sender_->Send( + new SyncCompositorMsg_SetMemoryPolicy(routing_id_, bytes_limit)); + } + + void ReclaimResources( + uint32_t layer_tree_frame_sink_id, + const std::vector<viz::ReturnedResource>& resources) override { + sender_->Send(new SyncCompositorMsg_ReclaimResources( + routing_id_, layer_tree_frame_sink_id, resources)); + } + + void SetScroll(const gfx::ScrollOffset& total_scroll_offset) override { + sender_->Send( + new SyncCompositorMsg_SetScroll(routing_id_, total_scroll_offset)); + } + + void BeginFrame(const viz::BeginFrameArgs& args) override { + sender_->Send(new SyncCompositorMsg_BeginFrame(routing_id_, args)); + } + + void SetBeginFrameSourcePaused(bool paused) override { + sender_->Send( + new SyncCompositorMsg_SetBeginFramePaused(routing_id_, paused)); + } + + private: + IPC::Sender* const sender_; + int routing_id_; +}; + +// This class runs on the IO thread and is destroyed when the renderer +// side closes the mojo channel. +class SynchronousCompositorControlHost + : public mojom::SynchronousCompositorControlHost { + public: + SynchronousCompositorControlHost( + scoped_refptr<SynchronousCompositorSyncCallBridge> bridge, + int process_id) + : bridge_(std::move(bridge)), process_id_(process_id) {} + + ~SynchronousCompositorControlHost() override { + bridge_->RemoteClosedOnIOThread(); + } + + static void Create(mojom::SynchronousCompositorControlHostRequest request, + scoped_refptr<SynchronousCompositorSyncCallBridge> bridge, + int process_id) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::BindOnce(&CreateOnIOThread, std::move(request), std::move(bridge), + process_id)); + } + + static void CreateOnIOThread( + mojom::SynchronousCompositorControlHostRequest request, + scoped_refptr<SynchronousCompositorSyncCallBridge> bridge, + int process_id) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + mojo::MakeStrongBinding(std::make_unique<SynchronousCompositorControlHost>( + std::move(bridge), process_id), + std::move(request)); + } + + // SynchronousCompositorControlHost overrides. + void ReturnFrame(uint32_t layer_tree_frame_sink_id, + base::Optional<viz::CompositorFrame> frame) override { + if (!bridge_->ReceiveFrameOnIOThread(layer_tree_frame_sink_id, + std::move(frame))) { + bad_message::ReceivedBadMessage( + process_id_, bad_message::SYNC_COMPOSITOR_NO_FUTURE_FRAME); + } + } + + void BeginFrameResponse( + const content::SyncCompositorCommonRendererParams& params) override { + if (!bridge_->BeginFrameResponseOnIOThread(params)) { + bad_message::ReceivedBadMessage( + process_id_, bad_message::SYNC_COMPOSITOR_NO_BEGIN_FRAME); + } + } + + private: + scoped_refptr<SynchronousCompositorSyncCallBridge> bridge_; + const int process_id_; +}; + // static std::unique_ptr<SynchronousCompositorHost> SynchronousCompositorHost::Create( RenderWidgetHostViewAndroid* rwhva) { @@ -50,11 +218,11 @@ bool use_in_proc_software_draw) : rwhva_(rwhva), client_(rwhva->synchronous_compositor_client()), - ui_task_runner_(BrowserThread::GetTaskRunnerForThread(BrowserThread::UI)), process_id_(rwhva_->GetRenderWidgetHost()->GetProcess()->GetID()), routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()), - sender_(rwhva_->GetRenderWidgetHost()), + use_mojo_(base::FeatureList::IsEnabled(features::kMojoInputMessages)), use_in_process_zero_copy_software_draw_(use_in_proc_software_draw), + host_binding_(this), bytes_limit_(0u), renderer_param_version_(0u), need_animate_scroll_(false), @@ -62,7 +230,12 @@ did_activate_pending_tree_count_(0u) { client_->DidInitializeCompositor(this, process_id_, routing_id_); bridge_ = new SynchronousCompositorSyncCallBridge(this); - bridge_->BindFilterOnUIThread(); + + if (!use_mojo_) { + bridge_->BindFilterOnUIThread(); + legacy_compositor_ = std::make_unique<SynchronousCompositorLegacyChromeIPC>( + rwhva_->GetRenderWidgetHost(), routing_id_); + } } SynchronousCompositorHost::~SynchronousCompositorHost() { @@ -70,14 +243,43 @@ bridge_->HostDestroyedOnUIThread(); } +void SynchronousCompositorHost::InitMojo() { + if (!use_mojo_) + return; + + mojom::SynchronousCompositorControlHostPtr host_control; + mojom::SynchronousCompositorControlHostRequest host_request = + mojo::MakeRequest(&host_control); + + SynchronousCompositorControlHost::Create(std::move(host_request), bridge_, + process_id_); + mojom::SynchronousCompositorHostAssociatedPtr host; + host_binding_.Bind(mojo::MakeRequest(&host)); + + mojom::SynchronousCompositorAssociatedRequest compositor_request = + mojo::MakeRequest(&sync_compositor_); + + rwhva_->GetRenderWidgetHostImpl() + ->GetWidgetInputHandler() + ->AttachSynchronousCompositor(std::move(host_control), + host.PassInterface(), + std::move(compositor_request)); +} + +bool SynchronousCompositorHost::IsReadyForSynchronousCall() { + bool res = bridge_->IsRemoteReadyOnUIThread(); + DCHECK(!res || GetSynchronousCompositor()); + return res; +} + bool SynchronousCompositorHost::OnMessageReceived(const IPC::Message& message) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message) IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_LayerTreeFrameSinkCreated, LayerTreeFrameSinkCreated) - IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams) IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_SetNeedsBeginFrames, SetNeedsBeginFrames) + IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, UpdateState) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; @@ -101,8 +303,13 @@ SyncCompositorDemandDrawHwParams params(viewport_size, viewport_rect_for_tile_priority, transform_for_tile_priority); - bridge_->SetFrameFutureOnUIThread(frame_future); - sender_->Send(new SyncCompositorMsg_DemandDrawHwAsync(routing_id_, params)); + mojom::SynchronousCompositor* compositor = GetSynchronousCompositor(); + if (!bridge_->SetFrameFutureOnUIThread(frame_future)) { + frame_future->SetFrame(nullptr); + } else { + DCHECK(compositor); + compositor->DemandDrawHwAsync(params); + } return frame_future; } @@ -118,15 +325,18 @@ SyncCompositorCommonRendererParams common_renderer_params; { - base::ThreadRestrictions::ScopedAllowWait wait; - if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw( - routing_id_, params, &common_renderer_params, - &layer_tree_frame_sink_id, &compositor_frame))) { + mojo::SyncCallRestrictions::ScopedAllowSyncCall allow_sync_call; + base::ScopedAllowBaseSyncPrimitivesOutsideBlockingScope + allow_base_sync_primitives; + if (!IsReadyForSynchronousCall() || + !GetSynchronousCompositor()->DemandDrawHw( + params, &common_renderer_params, &layer_tree_frame_sink_id, + &compositor_frame)) { return SynchronousCompositor::Frame(); } } - ProcessCommonParams(common_renderer_params); + UpdateState(common_renderer_params); if (!compositor_frame) return SynchronousCompositor::Frame(); @@ -163,20 +373,20 @@ } bool SynchronousCompositorHost::DemandDrawSwInProc(SkCanvas* canvas) { + mojo::SyncCallRestrictions::ScopedAllowSyncCall allow_sync_call; + base::ScopedAllowBaseSyncPrimitivesOutsideBlockingScope + allow_base_sync_primitives; SyncCompositorCommonRendererParams common_renderer_params; base::Optional<viz::CompositorFrameMetadata> metadata; ScopedSetSkCanvas set_sk_canvas(canvas); SyncCompositorDemandDrawSwParams params; // Unused. - { - base::ThreadRestrictions::ScopedAllowWait wait; - if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw( - routing_id_, params, &common_renderer_params, &metadata))) { - return false; - } - } + if (!IsReadyForSynchronousCall() || + !GetSynchronousCompositor()->DemandDrawSw(params, &common_renderer_params, + &metadata)) + return false; if (!metadata) return false; - ProcessCommonParams(common_renderer_params); + UpdateState(common_renderer_params); UpdateFrameMetaData(std::move(*metadata)); return true; } @@ -232,9 +442,12 @@ base::Optional<viz::CompositorFrameMetadata> metadata; SyncCompositorCommonRendererParams common_renderer_params; { - base::ThreadRestrictions::ScopedAllowWait wait; - if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw( - routing_id_, params, &common_renderer_params, &metadata))) { + mojo::SyncCallRestrictions::ScopedAllowSyncCall allow_sync_call; + base::ScopedAllowBaseSyncPrimitivesOutsideBlockingScope + allow_base_sync_primitives; + if (!IsReadyForSynchronousCall() || + !GetSynchronousCompositor()->DemandDrawSw( + params, &common_renderer_params, &metadata)) { return false; } } @@ -242,7 +455,7 @@ if (!metadata) return false; - ProcessCommonParams(common_renderer_params); + UpdateState(common_renderer_params); UpdateFrameMetaData(std::move(*metadata)); SkBitmap bitmap; @@ -284,38 +497,41 @@ bool success = false; SyncCompositorCommonRendererParams common_renderer_params; { - base::ThreadRestrictions::ScopedAllowWait wait; - if (!sender_->Send(new SyncCompositorMsg_SetSharedMemory( - routing_id_, set_shm_params, &success, &common_renderer_params)) || + mojo::SyncCallRestrictions::ScopedAllowSyncCall allow_sync_call; + base::ScopedAllowBaseSyncPrimitivesOutsideBlockingScope + allow_base_sync_primitives; + if (!IsReadyForSynchronousCall() || + !GetSynchronousCompositor()->SetSharedMemory(set_shm_params, &success, + &common_renderer_params) || !success) { return; } } software_draw_shm_ = std::move(software_draw_shm); - ProcessCommonParams(common_renderer_params); + UpdateState(common_renderer_params); } void SynchronousCompositorHost::SendZeroMemory() { // No need to check return value. - sender_->Send(new SyncCompositorMsg_ZeroSharedMemory(routing_id_)); + if (mojom::SynchronousCompositor* compositor = GetSynchronousCompositor()) + compositor->ZeroSharedMemory(); } void SynchronousCompositorHost::ReturnResources( uint32_t layer_tree_frame_sink_id, const std::vector<viz::ReturnedResource>& resources) { DCHECK(!resources.empty()); - sender_->Send(new SyncCompositorMsg_ReclaimResources( - routing_id_, layer_tree_frame_sink_id, resources)); + if (mojom::SynchronousCompositor* compositor = GetSynchronousCompositor()) + compositor->ReclaimResources(layer_tree_frame_sink_id, resources); } void SynchronousCompositorHost::SetMemoryPolicy(size_t bytes_limit) { if (bytes_limit_ == bytes_limit) return; - if (sender_->Send( - new SyncCompositorMsg_SetMemoryPolicy(routing_id_, bytes_limit))) { - bytes_limit_ = bytes_limit; - } + bytes_limit_ = bytes_limit; + if (mojom::SynchronousCompositor* compositor = GetSynchronousCompositor()) + compositor->SetMemoryPolicy(bytes_limit_); } void SynchronousCompositorHost::DidChangeRootLayerScrollOffset( @@ -323,21 +539,24 @@ if (root_scroll_offset_ == root_offset) return; root_scroll_offset_ = root_offset; - sender_->Send( - new SyncCompositorMsg_SetScroll(routing_id_, root_scroll_offset_)); + if (mojom::SynchronousCompositor* compositor = GetSynchronousCompositor()) + compositor->SetScroll(root_scroll_offset_); } void SynchronousCompositorHost::SynchronouslyZoomBy(float zoom_delta, const gfx::Point& anchor) { SyncCompositorCommonRendererParams common_renderer_params; { - base::ThreadRestrictions::ScopedAllowWait wait; - if (!sender_->Send(new SyncCompositorMsg_ZoomBy( - routing_id_, zoom_delta, anchor, &common_renderer_params))) { + mojo::SyncCallRestrictions::ScopedAllowSyncCall allow_sync_call; + base::ScopedAllowBaseSyncPrimitivesOutsideBlockingScope + allow_base_sync_primitives; + if (!IsReadyForSynchronousCall() || + !GetSynchronousCompositor()->ZoomBy(zoom_delta, anchor, + &common_renderer_params)) { return; } } - ProcessCommonParams(common_renderer_params); + UpdateState(common_renderer_params); } void SynchronousCompositorHost::OnComputeScroll( @@ -346,9 +565,8 @@ return; need_animate_scroll_ = false; - SyncCompositorCommonRendererParams common_renderer_params; - sender_->Send( - new SyncCompositorMsg_ComputeScroll(routing_id_, animation_time)); + if (mojom::SynchronousCompositor* compositor = GetSynchronousCompositor()) + compositor->ComputeScroll(animation_time); compute_scroll_needs_synchronous_draw_ = true; } @@ -359,18 +577,20 @@ over_scroll_params.current_fling_velocity); } -void SynchronousCompositorHost::SendBeginFrame( - ui::WindowAndroid* window_android, - const viz::BeginFrameArgs& args) { +void SynchronousCompositorHost::BeginFrame(ui::WindowAndroid* window_android, + const viz::BeginFrameArgs& args) { compute_scroll_needs_synchronous_draw_ = false; - bridge_->BindFilterOnUIThread(); if (!bridge_->WaitAfterVSyncOnUIThread(window_android)) return; - sender_->Send(new SyncCompositorMsg_BeginFrame(routing_id_, args)); + mojom::SynchronousCompositor* compositor = GetSynchronousCompositor(); + DCHECK(compositor); + compositor->BeginFrame(args); } void SynchronousCompositorHost::SetBeginFramePaused(bool paused) { - sender_->Send(new SyncCompositorMsg_SetBeginFramePaused(routing_id_, paused)); + begin_frame_paused_ = paused; + if (mojom::SynchronousCompositor* compositor = GetSynchronousCompositor()) + compositor->SetBeginFrameSourcePaused(paused); } void SynchronousCompositorHost::SetNeedsBeginFrames(bool needs_begin_frames) { @@ -378,13 +598,20 @@ } void SynchronousCompositorHost::LayerTreeFrameSinkCreated() { + if (use_mojo_) + bridge_->RemoteReady(); + // New LayerTreeFrameSink is not aware of state from Browser side. So need to // re-send all browser side state here. - sender_->Send( - new SyncCompositorMsg_SetMemoryPolicy(routing_id_, bytes_limit_)); + mojom::SynchronousCompositor* compositor = GetSynchronousCompositor(); + DCHECK(compositor); + compositor->SetMemoryPolicy(bytes_limit_); + + if (begin_frame_paused_) + compositor->SetBeginFrameSourcePaused(begin_frame_paused_); } -void SynchronousCompositorHost::ProcessCommonParams( +void SynchronousCompositorHost::UpdateState( const SyncCompositorCommonRendererParams& params) { // Ignore if |renderer_param_version_| is newer than |params.version|. This // comparison takes into account when the unsigned int wraps. @@ -424,4 +651,15 @@ ->synchronous_compositor_filter(); } +RenderProcessHost* SynchronousCompositorHost::GetRenderProcessHost() { + return rwhva_->GetRenderWidgetHost()->GetProcess(); +} + +mojom::SynchronousCompositor* +SynchronousCompositorHost::GetSynchronousCompositor() { + if (legacy_compositor_) + return legacy_compositor_.get(); + return sync_compositor_.get(); +} + } // namespace content
diff --git a/content/browser/android/synchronous_compositor_host.h b/content/browser/android/synchronous_compositor_host.h index ac74bed..f9e8e90 100644 --- a/content/browser/android/synchronous_compositor_host.h +++ b/content/browser/android/synchronous_compositor_host.h
@@ -15,14 +15,16 @@ #include "base/memory/weak_ptr.h" #include "base/single_thread_task_runner.h" #include "components/viz/common/quads/compositor_frame.h" +#include "content/common/input/synchronous_compositor.mojom.h" #include "content/public/browser/android/synchronous_compositor.h" #include "content/public/common/input_event_ack_state.h" +#include "mojo/public/cpp/bindings/associated_binding.h" +#include "mojo/public/cpp/bindings/binding.h" #include "ui/gfx/geometry/scroll_offset.h" #include "ui/gfx/geometry/size_f.h" namespace IPC { class Message; -class Sender; } namespace ui { @@ -32,13 +34,16 @@ namespace content { +class RenderProcessHost; class RenderWidgetHostViewAndroid; class SynchronousCompositorClient; class SynchronousCompositorBrowserFilter; +class SynchronousCompositorLegacyChromeIPC; class SynchronousCompositorSyncCallBridge; struct SyncCompositorCommonRendererParams; -class SynchronousCompositorHost : public SynchronousCompositor { +class SynchronousCompositorHost : public SynchronousCompositor, + public mojom::SynchronousCompositorHost { public: static std::unique_ptr<SynchronousCompositorHost> Create( RenderWidgetHostViewAndroid* rwhva); @@ -65,20 +70,27 @@ void OnComputeScroll(base::TimeTicks animation_time) override; void DidOverscroll(const ui::DidOverscrollParams& over_scroll_params); - void SendBeginFrame(ui::WindowAndroid* window_android, - const viz::BeginFrameArgs& args); + void BeginFrame(ui::WindowAndroid* window_android, + const viz::BeginFrameArgs& args); void SetBeginFramePaused(bool paused); - void SetNeedsBeginFrames(bool needs_begin_frames); bool OnMessageReceived(const IPC::Message& message); // Called by SynchronousCompositorSyncCallBridge. int routing_id() const { return routing_id_; } void UpdateFrameMetaData(viz::CompositorFrameMetadata frame_metadata); - void ProcessCommonParams(const SyncCompositorCommonRendererParams& params); + + // Called when the mojo channel should be created. + void InitMojo(); SynchronousCompositorClient* client() { return client_; } SynchronousCompositorBrowserFilter* GetFilter(); + RenderProcessHost* GetRenderProcessHost(); + + // mojom::SynchronousCompositorHost overrides. + void LayerTreeFrameSinkCreated() override; + void UpdateState(const SyncCompositorCommonRendererParams& params) override; + void SetNeedsBeginFrames(bool needs_begin_frames) override; private: class ScopedSendZeroMemory; @@ -88,18 +100,23 @@ SynchronousCompositorHost(RenderWidgetHostViewAndroid* rwhva, bool use_in_proc_software_draw); - void LayerTreeFrameSinkCreated(); bool DemandDrawSwInProc(SkCanvas* canvas); void SetSoftwareDrawSharedMemoryIfNeeded(size_t stride, size_t buffer_size); void SendZeroMemory(); + mojom::SynchronousCompositor* GetSynchronousCompositor(); + // Whether the synchronous compositor host is ready to + // handle blocking calls. + bool IsReadyForSynchronousCall(); RenderWidgetHostViewAndroid* const rwhva_; SynchronousCompositorClient* const client_; - const scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; const int process_id_; const int routing_id_; - IPC::Sender* const sender_; + const bool use_mojo_; const bool use_in_process_zero_copy_software_draw_; + std::unique_ptr<SynchronousCompositorLegacyChromeIPC> legacy_compositor_; + mojom::SynchronousCompositorAssociatedPtr sync_compositor_; + mojo::AssociatedBinding<mojom::SynchronousCompositorHost> host_binding_; bool registered_with_filter_ = false; @@ -109,6 +126,9 @@ // Indicates the next draw needs to be synchronous bool compute_scroll_needs_synchronous_draw_ = false; + // Indicates begin frames are paused from the browser. + bool begin_frame_paused_ = false; + // Updated by both renderer and browser. gfx::ScrollOffset root_scroll_offset_;
diff --git a/content/browser/android/synchronous_compositor_sync_call_bridge.cc b/content/browser/android/synchronous_compositor_sync_call_bridge.cc index 54bc2a8..c54c559 100644 --- a/content/browser/android/synchronous_compositor_sync_call_bridge.cc +++ b/content/browser/android/synchronous_compositor_sync_call_bridge.cc
@@ -8,6 +8,7 @@ #include "content/browser/android/synchronous_compositor_host.h" #include "content/browser/renderer_host/render_process_host_impl.h" #include "content/public/browser/browser_thread.h" +#include "content/public/common/content_features.h" #include "ui/android/window_android.h" namespace content { @@ -16,6 +17,7 @@ SynchronousCompositorHost* host) : routing_id_(host->routing_id()), host_(host), + mojo_enabled_(base::FeatureList::IsEnabled(features::kMojoInputMessages)), begin_frame_condition_(&lock_) { DCHECK(host); } @@ -28,7 +30,7 @@ void SynchronousCompositorSyncCallBridge::BindFilterOnUIThread() { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(host_); - if (bound_to_filter_) + if (mojo_enabled_ || bound_to_filter_) return; scoped_refptr<SynchronousCompositorBrowserFilter> filter = host_->GetFilter(); if (!filter) @@ -44,7 +46,9 @@ void SynchronousCompositorSyncCallBridge::RemoteReady() { base::AutoLock lock(lock_); - remote_closed_ = false; + if (remote_state_ != RemoteState::INIT) + return; + remote_state_ = RemoteState::READY; } void SynchronousCompositorSyncCallBridge::RemoteClosedOnIOThread() { @@ -59,7 +63,7 @@ base::Optional<viz::CompositorFrame> compositor_frame) { DCHECK_CURRENTLY_ON(BrowserThread::IO); base::AutoLock lock(lock_); - if (remote_closed_ || frame_futures_.empty()) + if (remote_state_ != RemoteState::READY || frame_futures_.empty()) return false; auto frame_ptr = std::make_unique<SynchronousCompositor::Frame>(); frame_ptr->layer_tree_frame_sink_id = layer_tree_frame_sink_id; @@ -99,10 +103,12 @@ ui::WindowAndroid* window_android) { DCHECK_CURRENTLY_ON(BrowserThread::UI); base::AutoLock lock(lock_); - if (remote_closed_) + if (!mojo_enabled_ && !bound_to_filter_) + BindFilterOnUIThread(); + if (remote_state_ != RemoteState::READY) return false; DCHECK(!begin_frame_response_valid_); - DCHECK(bound_to_filter_); + DCHECK(mojo_enabled_ || bound_to_filter_); if (window_android_in_vsync_) { DCHECK_EQ(window_android_in_vsync_, window_android); return true; @@ -113,18 +119,16 @@ return true; } -void SynchronousCompositorSyncCallBridge::SetFrameFutureOnUIThread( +bool SynchronousCompositorSyncCallBridge::SetFrameFutureOnUIThread( scoped_refptr<SynchronousCompositor::FrameFuture> frame_future) { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(frame_future); base::AutoLock lock(lock_); - if (remote_closed_) { - frame_future->SetFrame(nullptr); - return; - } + if (remote_state_ != RemoteState::READY) + return false; BindFilterOnUIThread(); - DCHECK(bound_to_filter_); + DCHECK(mojo_enabled_ || bound_to_filter_); // Allowing arbitrary number of pending futures can lead to increase in frame // latency. Due to this, Android platform already ensures that here that there // can be at most 2 pending frames. Here, we rely on Android to do the @@ -132,6 +136,7 @@ // latency. But DCHECK Android blocking is working. DCHECK_LT(frame_futures_.size(), 2u); frame_futures_.emplace_back(std::move(frame_future)); + return true; } void SynchronousCompositorSyncCallBridge::HostDestroyedOnUIThread() { @@ -153,13 +158,19 @@ } } +bool SynchronousCompositorSyncCallBridge::IsRemoteReadyOnUIThread() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + base::AutoLock lock(lock_); + return remote_state_ == RemoteState::READY; +} + void SynchronousCompositorSyncCallBridge::VSyncCompleteOnUIThread() { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(window_android_in_vsync_); window_android_in_vsync_ = nullptr; base::AutoLock lock(lock_); - if (remote_closed_) + if (remote_state_ != RemoteState::READY) return; // If we haven't received a response yet. Wait for it. @@ -168,10 +179,10 @@ allow_base_sync_primitives; begin_frame_condition_.Wait(); } - DCHECK(begin_frame_response_valid_ || remote_closed_); + DCHECK(begin_frame_response_valid_ || remote_state_ != RemoteState::READY); begin_frame_response_valid_ = false; - if (!remote_closed_) - host_->ProcessCommonParams(last_render_params_); + if (remote_state_ == RemoteState::READY) + host_->UpdateState(last_render_params_); } void SynchronousCompositorSyncCallBridge::ProcessFrameMetadataOnUIThread( @@ -187,7 +198,7 @@ { base::AutoLock lock(lock_); - if (!remote_closed_) + if (remote_state_ == RemoteState::READY) SignalRemoteClosedToAllWaitersOnIOThread(); } if (filter) @@ -198,7 +209,7 @@ SignalRemoteClosedToAllWaitersOnIOThread() { DCHECK_CURRENTLY_ON(BrowserThread::IO); lock_.AssertAcquired(); - remote_closed_ = true; + remote_state_ = RemoteState::CLOSED; for (auto& future_ptr : frame_futures_) { future_ptr->SetFrame(nullptr); }
diff --git a/content/browser/android/synchronous_compositor_sync_call_bridge.h b/content/browser/android/synchronous_compositor_sync_call_bridge.h index d04057ad..14dd011 100644 --- a/content/browser/android/synchronous_compositor_sync_call_bridge.h +++ b/content/browser/android/synchronous_compositor_sync_call_bridge.h
@@ -75,7 +75,7 @@ void BindFilterOnUIThread(); // Indicatation that the remote is now ready to process requests. Called - // on either thread. + // on either UI or IO thread. void RemoteReady(); // Remote channel is closed signal all waiters. @@ -85,7 +85,7 @@ bool ReceiveFrameOnIOThread(int frame_sink_id, base::Optional<viz::CompositorFrame>); - // Receive a BeginFrameResponse. Return if handling the response was + // Receive a BeginFrameResponse. Returns true if handling the response was // successful or not. bool BeginFrameResponseOnIOThread( const SyncCompositorCommonRendererParams& render_params); @@ -94,13 +94,17 @@ // BeginFrameResponse callback. bool WaitAfterVSyncOnUIThread(ui::WindowAndroid* window_android); - // Store a FrameFuture for a later ReceiveFrame callback. - void SetFrameFutureOnUIThread( + // Store a FrameFuture for a later ReceiveFrame callback. Return if the + // future was stored for further handling. + bool SetFrameFutureOnUIThread( scoped_refptr<SynchronousCompositor::FrameFuture> frame_future); // Indicate the host is destroyed. void HostDestroyedOnUIThread(); + // Return whether the remote side is ready. + bool IsRemoteReadyOnUIThread(); + private: friend class base::RefCountedThreadSafe<SynchronousCompositorSyncCallBridge>; ~SynchronousCompositorSyncCallBridge(); @@ -124,12 +128,15 @@ using FrameFutureQueue = base::circular_deque<scoped_refptr<SynchronousCompositor::FrameFuture>>; + enum class RemoteState { INIT, READY, CLOSED }; + const int routing_id_; // UI thread only. ui::WindowAndroid* window_android_in_vsync_ = nullptr; SynchronousCompositorHost* host_; bool bound_to_filter_ = false; + bool mojo_enabled_; // Shared variables between the IO thread and UI thread. base::Lock lock_; @@ -137,7 +144,7 @@ bool begin_frame_response_valid_ = false; SyncCompositorCommonRendererParams last_render_params_; base::ConditionVariable begin_frame_condition_; - bool remote_closed_ = true; + RemoteState remote_state_ = RemoteState::INIT; // IO thread based callback that will unbind this object from // the SynchronousCompositorBrowserFilter. Only called once
diff --git a/content/browser/appcache/appcache_host_unittest.cc b/content/browser/appcache/appcache_host_unittest.cc index 58119a42..85c3528 100644 --- a/content/browser/appcache/appcache_host_unittest.cc +++ b/content/browser/appcache/appcache_host_unittest.cc
@@ -108,7 +108,7 @@ void GetUsageAndQuota(base::SequencedTaskRunner* original_task_runner, const url::Origin& origin, blink::mojom::StorageType type, - const UsageAndQuotaCallback& callback) override {} + UsageAndQuotaCallback callback) override {} void NotifyOriginInUse(const url::Origin& origin) override { inuse_[origin] += 1;
diff --git a/content/browser/appcache/appcache_storage_impl_unittest.cc b/content/browser/appcache/appcache_storage_impl_unittest.cc index 2db7019..6693b44 100644 --- a/content/browser/appcache/appcache_storage_impl_unittest.cc +++ b/content/browser/appcache/appcache_storage_impl_unittest.cc
@@ -256,19 +256,21 @@ void GetUsageAndQuota(const GURL& origin, StorageType type, - const UsageAndQuotaCallback& callback) override { + UsageAndQuotaCallback callback) override { EXPECT_EQ(StorageType::kTemporary, type); if (async_) { base::SequencedTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(&MockQuotaManager::CallCallback, - base::Unretained(this), callback)); + FROM_HERE, + base::BindOnce(&MockQuotaManager::CallCallback, + base::Unretained(this), std::move(callback))); return; } - CallCallback(callback); + CallCallback(std::move(callback)); } - void CallCallback(const UsageAndQuotaCallback& callback) { - callback.Run(blink::mojom::QuotaStatusCode::kOk, 0, kMockQuota); + void CallCallback(UsageAndQuotaCallback callback) { + std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk, 0, + kMockQuota); } bool async_; @@ -319,7 +321,7 @@ void GetUsageAndQuota(base::SequencedTaskRunner* original_task_runner, const url::Origin& origin, StorageType type, - const UsageAndQuotaCallback& callback) override {} + UsageAndQuotaCallback callback) override {} int notify_storage_accessed_count_; int notify_storage_modified_count_;
diff --git a/content/browser/bad_message.h b/content/browser/bad_message.h index f455604..d3603cc 100644 --- a/content/browser/bad_message.h +++ b/content/browser/bad_message.h
@@ -222,6 +222,8 @@ AUTH_INVALID_EFFECTIVE_DOMAIN = 195, AUTH_INVALID_RELYING_PARTY = 196, RWH_COPY_REQUEST_ATTEMPT = 197, + SYNC_COMPOSITOR_NO_FUTURE_FRAME = 198, + SYNC_COMPOSITOR_NO_BEGIN_FRAME = 199, // Please add new elements here. The naming convention is abbreviated class // name (e.g. RenderFrameHost becomes RFH) plus a unique description of the
diff --git a/content/browser/fileapi/file_system_operation_runner_unittest.cc b/content/browser/fileapi/file_system_operation_runner_unittest.cc index fd4444df..68bc445 100644 --- a/content/browser/fileapi/file_system_operation_runner_unittest.cc +++ b/content/browser/fileapi/file_system_operation_runner_unittest.cc
@@ -53,7 +53,7 @@ *status_out = status; } -void DidOpenFile(base::File file, const base::Closure& on_close_callback) {} +void DidOpenFile(base::File file, base::OnceClosure on_close_callback) {} } // namespace
diff --git a/content/browser/frame_host/render_frame_host_delegate.h b/content/browser/frame_host/render_frame_host_delegate.h index 6212b94..9d38f94 100644 --- a/content/browser/frame_host/render_frame_host_delegate.h +++ b/content/browser/frame_host/render_frame_host_delegate.h
@@ -12,6 +12,7 @@ #include "base/i18n/rtl.h" #include "build/build_config.h" +#include "components/viz/common/surfaces/surface_id.h" #include "content/browser/webui/web_ui_impl.h" #include "content/common/content_export.h" #include "content/common/frame_message_enums.h" @@ -354,6 +355,10 @@ int document_cookie, RenderFrameHost* render_frame_host) {} + // Updates the Picture-in-Picture controller with the relevant viz::SurfaceId + // of the video to be in Picture-in-Picture mode. + virtual void UpdatePictureInPictureSurfaceId(viz::SurfaceId surface_id) {} + protected: virtual ~RenderFrameHostDelegate() {} };
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index ad70d28..c3d1a5be 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -2377,6 +2377,12 @@ frame_rect_ = frame_rect; } +void RenderFrameHostImpl::OnUpdatePictureInPictureSurfaceId( + const viz::SurfaceId& surface_id) { + if (delegate_) + delegate_->UpdatePictureInPictureSurfaceId(surface_id); +} + void RenderFrameHostImpl::OnDidBlockFramebust(const GURL& url) { delegate_->OnDidBlockFramebust(url); }
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index ae1307a..a300aea 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -906,6 +906,8 @@ void CancelInitialHistoryLoad() override; void UpdateEncoding(const std::string& encoding) override; void FrameRectsChanged(const gfx::Rect& frame_rect) override; + void OnUpdatePictureInPictureSurfaceId( + const viz::SurfaceId& surface_id) override; // Registers Mojo interfaces that this frame host makes available. void RegisterMojoInterfaces();
diff --git a/content/browser/media/cdm_file_impl.cc b/content/browser/media/cdm_file_impl.cc index 434071b..12e6e826 100644 --- a/content/browser/media/cdm_file_impl.cc +++ b/content/browser/media/cdm_file_impl.cc
@@ -200,9 +200,8 @@ std::move(callback)); } -void CdmFileImpl::OnFileOpenedForReading( - base::File file, - const base::Closure& on_close_callback) { +void CdmFileImpl::OnFileOpenedForReading(base::File file, + base::OnceClosure on_close_callback) { DVLOG(3) << __func__ << " file: " << file_name_; DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_EQ(LockState::kFileLocked, lock_state_); @@ -255,7 +254,7 @@ void CdmFileImpl::OnTempFileOpenedForWriting( base::File file, - const base::Closure& on_close_callback) { + base::OnceClosure on_close_callback) { DVLOG(3) << __func__ << " file: " << file_name_; DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_EQ(LockState::kFileAndTempFileLocked, lock_state_);
diff --git a/content/browser/media/cdm_file_impl.h b/content/browser/media/cdm_file_impl.h index bbf3c9a..9d9b1a48 100644 --- a/content/browser/media/cdm_file_impl.h +++ b/content/browser/media/cdm_file_impl.h
@@ -72,9 +72,9 @@ CreateOrOpenCallback callback); void OnFileOpenedForReading(base::File file, - const base::Closure& on_close_callback); + base::OnceClosure on_close_callback); void OnTempFileOpenedForWriting(base::File file, - const base::Closure& on_close_callback); + base::OnceClosure on_close_callback); void OnFileRenamed(base::File::Error move_result); // Returns the FileSystemURL for the specified |file_name|. @@ -109,8 +109,8 @@ // storage::AsyncFileUtil::CreateOrOpen() returns this callback on a // successful open along with the base::File object, which should be // called when the file is closed. - base::Closure on_close_callback_; - base::Closure temporary_file_on_close_callback_; + base::OnceClosure on_close_callback_; + base::OnceClosure temporary_file_on_close_callback_; THREAD_CHECKER(thread_checker_); base::WeakPtrFactory<CdmFileImpl> weak_factory_;
diff --git a/content/browser/media/media_web_contents_observer.cc b/content/browser/media/media_web_contents_observer.cc index fb5d5b3de..5c6a772 100644 --- a/content/browser/media/media_web_contents_observer.cc +++ b/content/browser/media/media_web_contents_observer.cc
@@ -16,6 +16,7 @@ #include "ipc/ipc_message_macros.h" #include "mojo/public/cpp/bindings/interface_request.h" #include "services/device/public/mojom/wake_lock_context.mojom.h" +#include "third_party/WebKit/public/platform/WebFullscreenVideoStatus.h" #include "ui/gfx/geometry/size.h" namespace content { @@ -44,8 +45,6 @@ MediaWebContentsObserver::MediaWebContentsObserver(WebContents* web_contents) : WebContentsObserver(web_contents), - has_audio_wake_lock_for_testing_(false), - has_video_wake_lock_for_testing_(false), session_controllers_manager_(this) {} MediaWebContentsObserver::~MediaWebContentsObserver() = default; @@ -61,6 +60,8 @@ if (fullscreen_player_ && fullscreen_player_->first == render_frame_host) fullscreen_player_.reset(); + + picture_in_picture_allowed_in_fullscreen_.reset(); } void MediaWebContentsObserver::MaybeUpdateAudibleState() { @@ -91,6 +92,13 @@ return true; } +bool MediaWebContentsObserver::IsPictureInPictureAllowedForFullscreenVideo() + const { + DCHECK(picture_in_picture_allowed_in_fullscreen_.has_value()); + + return *picture_in_picture_allowed_in_fullscreen_; +} + const base::Optional<WebContentsObserver::MediaPlayerId>& MediaWebContentsObserver::GetFullscreenVideoMediaPlayerId() const { CheckFullscreenDetectionEnabled(web_contents_impl()); @@ -224,17 +232,31 @@ void MediaWebContentsObserver::OnMediaEffectivelyFullscreenChanged( RenderFrameHost* render_frame_host, int delegate_id, - bool is_fullscreen) { + blink::WebFullscreenVideoStatus fullscreen_status) { const MediaPlayerId id(render_frame_host, delegate_id); - if (is_fullscreen) { - fullscreen_player_ = id; - } else { - if (!fullscreen_player_ || *fullscreen_player_ != id) - return; + switch (fullscreen_status) { + case blink::WebFullscreenVideoStatus::kFullscreenAndPictureInPictureEnabled: + fullscreen_player_ = id; + picture_in_picture_allowed_in_fullscreen_ = true; + break; + case blink::WebFullscreenVideoStatus:: + kFullscreenAndPictureInPictureDisabled: + fullscreen_player_ = id; + picture_in_picture_allowed_in_fullscreen_ = false; + break; + case blink::WebFullscreenVideoStatus::kNotEffectivelyFullscreen: + picture_in_picture_allowed_in_fullscreen_.reset(); + if (!fullscreen_player_ || *fullscreen_player_ != id) + return; - fullscreen_player_.reset(); + fullscreen_player_.reset(); + break; } + + bool is_fullscreen = + (fullscreen_status != + blink::WebFullscreenVideoStatus::kNotEffectivelyFullscreen); web_contents_impl()->MediaEffectivelyFullscreenChanged(is_fullscreen); }
diff --git a/content/browser/media/media_web_contents_observer.h b/content/browser/media/media_web_contents_observer.h index 4352e2a..7012c14 100644 --- a/content/browser/media/media_web_contents_observer.h +++ b/content/browser/media/media_web_contents_observer.h
@@ -21,6 +21,10 @@ #include "ui/android/view_android.h" #endif // OS_ANDROID +namespace blink { +enum class WebFullscreenVideoStatus; +} // namespace blink + namespace media { enum class MediaContentType; } // namespace media @@ -50,6 +54,11 @@ // It should only be called while the WebContents is fullscreen. bool HasActiveEffectivelyFullscreenVideo() const; + // Called by WebContentsImpl to know if Picture-in-Picture can be triggered + // for the current active effectively fullscreen player. + // It should only be called while the WebContents is fullscreen. + bool IsPictureInPictureAllowedForFullscreenVideo() const; + // Gets the MediaPlayerId of the fullscreen video if it exists. const base::Optional<MediaPlayerId>& GetFullscreenVideoMediaPlayerId() const; @@ -90,9 +99,10 @@ bool has_audio, bool is_remote, media::MediaContentType media_content_type); - void OnMediaEffectivelyFullscreenChanged(RenderFrameHost* render_frame_host, - int delegate_id, - bool is_fullscreen); + void OnMediaEffectivelyFullscreenChanged( + RenderFrameHost* render_frame_host, + int delegate_id, + blink::WebFullscreenVideoStatus fullscreen_status); void OnMediaSizeChanged(RenderFrameHost* render_frame_host, int delegate_id, const gfx::Size& size); @@ -136,8 +146,9 @@ device::mojom::WakeLockPtr audio_wake_lock_; device::mojom::WakeLockPtr video_wake_lock_; base::Optional<MediaPlayerId> fullscreen_player_; - bool has_audio_wake_lock_for_testing_; - bool has_video_wake_lock_for_testing_; + base::Optional<bool> picture_in_picture_allowed_in_fullscreen_; + bool has_audio_wake_lock_for_testing_ = false; + bool has_video_wake_lock_for_testing_ = false; MediaSessionControllersManager session_controllers_manager_;
diff --git a/content/browser/net/quota_policy_cookie_store.cc b/content/browser/net/quota_policy_cookie_store.cc index 822e507..9eaa19e 100644 --- a/content/browser/net/quota_policy_cookie_store.cc +++ b/content/browser/net/quota_policy_cookie_store.cc
@@ -47,7 +47,7 @@ const GURL url(net::cookie_util::CookieOriginToURL(cookie.first.first, cookie.first.second)); if (!url.is_valid() || - !special_storage_policy_->IsStorageSessionOnlyOrBlocked(url)) + !special_storage_policy_->ShouldDeleteCookieOnExit(url)) continue; session_only_cookies.push_back(cookie.first);
diff --git a/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.cc b/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.cc index 79f49e0e4..afe47ce 100644 --- a/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.cc +++ b/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.cc
@@ -118,4 +118,11 @@ NOTREACHED(); } +void LegacyIPCWidgetInputHandler::AttachSynchronousCompositor( + mojom::SynchronousCompositorControlHostPtr control_host, + mojom::SynchronousCompositorHostAssociatedPtrInfo host, + mojom::SynchronousCompositorAssociatedRequest compositor_request) { + NOTREACHED(); +} + } // namespace content
diff --git a/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.h b/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.h index 7bfd9e7..c4773667 100644 --- a/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.h +++ b/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.h
@@ -44,6 +44,11 @@ DispatchEventCallback callback) override; void DispatchNonBlockingEvent( std::unique_ptr<content::InputEvent> event) override; + void AttachSynchronousCompositor( + mojom::SynchronousCompositorControlHostPtr control_host, + mojom::SynchronousCompositorHostAssociatedPtrInfo host, + mojom::SynchronousCompositorAssociatedRequest compositor_request) + override; private: void SendInput(std::unique_ptr<IPC::Message> message);
diff --git a/content/browser/renderer_host/input/mouse_latency_browsertest.cc b/content/browser/renderer_host/input/mouse_latency_browsertest.cc index 5980ee9..e899b03 100644 --- a/content/browser/renderer_host/input/mouse_latency_browsertest.cc +++ b/content/browser/renderer_host/input/mouse_latency_browsertest.cc
@@ -259,7 +259,8 @@ // Disabled on Android because we don't support synthetic mouse input on // Android (crbug.com/723618). // Disabled on Windows due to flakyness (https://crbug.com/800303). -#if defined(OS_ANDROID) || defined(OS_WIN) +// Disabled on Linux due to flakyness (https://crbug.com/815363). +#if defined(OS_ANDROID) || defined(OS_WIN) || defined(OS_LINUX) #define MAYBE_MouseDownAndUpRecordedWithoutSwap \ DISABLED_MouseDownAndUpRecordedWithoutSwap #else
diff --git a/content/browser/renderer_host/pepper/pepper_file_io_host.cc b/content/browser/renderer_host/pepper/pepper_file_io_host.cc index 41722ed..68f4da1 100644 --- a/content/browser/renderer_host/pepper/pepper_file_io_host.cc +++ b/content/browser/renderer_host/pepper/pepper_file_io_host.cc
@@ -84,22 +84,22 @@ void FileCloser(base::File auto_close) { } -void DidCloseFile(const base::Closure& on_close_callback) { +void DidCloseFile(base::OnceClosure on_close_callback) { if (!on_close_callback.is_null()) - on_close_callback.Run(); + std::move(on_close_callback).Run(); } void DidOpenFile(base::WeakPtr<PepperFileIOHost> file_host, scoped_refptr<base::SequencedTaskRunner> task_runner, storage::FileSystemOperation::OpenFileCallback callback, base::File file, - const base::Closure& on_close_callback) { + base::OnceClosure on_close_callback) { if (file_host) { - callback.Run(std::move(file), on_close_callback); + callback.Run(std::move(file), std::move(on_close_callback)); } else { task_runner->PostTaskAndReply( FROM_HERE, base::BindOnce(&FileCloser, std::move(file)), - base::BindOnce(&DidCloseFile, on_close_callback)); + base::BindOnce(&DidCloseFile, std::move(on_close_callback))); } } @@ -264,9 +264,9 @@ void PepperFileIOHost::DidOpenInternalFile( ppapi::host::ReplyMessageContext reply_context, base::File file, - const base::Closure& on_close_callback) { + base::OnceClosure on_close_callback) { if (file.IsValid()) { - on_close_callback_ = on_close_callback; + on_close_callback_ = std::move(on_close_callback); if (FileOpenForWrite(open_flags_) && file_system_host_->ChecksQuota()) { check_quota_ = true; @@ -395,8 +395,7 @@ void PepperFileIOHost::DidCloseFile(base::File::Error /*error*/) { // Silently ignore if we fail to close the file. if (!on_close_callback_.is_null()) { - on_close_callback_.Run(); - on_close_callback_.Reset(); + std::move(on_close_callback_).Run(); } }
diff --git a/content/browser/renderer_host/pepper/pepper_file_io_host.h b/content/browser/renderer_host/pepper/pepper_file_io_host.h index 7b92232..ac97fe7b 100644 --- a/content/browser/renderer_host/pepper/pepper_file_io_host.h +++ b/content/browser/renderer_host/pepper/pepper_file_io_host.h
@@ -105,7 +105,7 @@ UIThreadStuff ui_thread_stuff); void DidOpenInternalFile(ppapi::host::ReplyMessageContext reply_context, base::File file, - const base::Closure& on_close_callback); + base::OnceClosure on_close_callback); void GotResolvedRenderProcessId( ppapi::host::ReplyMessageContext reply_context, base::FilePath path, @@ -145,7 +145,7 @@ // Valid only for PP_FILESYSTEMTYPE_LOCAL{PERSISTENT,TEMPORARY}. scoped_refptr<storage::FileSystemContext> file_system_context_; storage::FileSystemURL file_system_url_; - base::Closure on_close_callback_; + base::OnceClosure on_close_callback_; int64_t max_written_offset_; bool check_quota_;
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 38d514b..34c29c3 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -1801,9 +1801,11 @@ AddFilter(notification_message_filter_.get()); #if defined(OS_ANDROID) - synchronous_compositor_filter_ = - new SynchronousCompositorBrowserFilter(GetID()); - AddFilter(synchronous_compositor_filter_.get()); + if (!base::FeatureList::IsEnabled(features::kMojoInputMessages)) { + synchronous_compositor_filter_ = + new SynchronousCompositorBrowserFilter(GetID()); + AddFilter(synchronous_compositor_filter_.get()); + } #endif }
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 3f3d7686..2937655 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -313,6 +313,13 @@ std::unique_ptr<content::InputEvent> event) override { DLOG(WARNING) << "Input request on unbound interface"; } + void AttachSynchronousCompositor( + mojom::SynchronousCompositorControlHostPtr control_host, + mojom::SynchronousCompositorHostAssociatedPtrInfo host, + mojom::SynchronousCompositorAssociatedRequest compositor_request) + override { + NOTREACHED() << "Input request on unbound interface"; + } }; } // namespace @@ -554,11 +561,17 @@ if (owner_delegate_) owner_delegate_->RenderWidgetDidInit(); + + if (view_) + view_->OnRenderWidgetInit(); } void RenderWidgetHostImpl::InitForFrame() { DCHECK(process_->HasConnection()); renderer_initialized_ = true; + + if (view_) + view_->OnRenderWidgetInit(); } void RenderWidgetHostImpl::ShutdownAndDestroyWidget(bool also_delete) {
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index c8e23b0b..03fcc5a 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -1427,7 +1427,7 @@ args.deadline = sync_compositor_ ? base::TimeTicks() : args.frame_time + (args.interval * 0.6); if (sync_compositor_) { - sync_compositor_->SendBeginFrame(view_.GetWindowAndroid(), args); + sync_compositor_->BeginFrame(view_.GetWindowAndroid(), args); } else if (renderer_compositor_frame_sink_) { renderer_compositor_frame_sink_->OnBeginFrame(args); } @@ -1887,6 +1887,11 @@ return viz::LocalSurfaceId(); } +void RenderWidgetHostViewAndroid::OnRenderWidgetInit() { + if (sync_compositor_) + sync_compositor_->InitMojo(); +} + bool RenderWidgetHostViewAndroid::OnMouseEvent( const ui::MotionEventAndroid& event) { RecordToolTypeForActionDown(event);
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h index d40f548..3013a5a 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.h +++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -186,6 +186,7 @@ TouchSelectionControllerClientManager* GetTouchSelectionControllerClientManager() override; viz::LocalSurfaceId GetLocalSurfaceId() const override; + void OnRenderWidgetInit() override; // ui::ViewClient implementation. bool OnTouchEvent(const ui::MotionEventAndroid& m) override;
diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h index 27ef5b4..4a977af1 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.h +++ b/content/browser/renderer_host/render_widget_host_view_base.h
@@ -509,6 +509,9 @@ virtual void DidNavigate() {} + // Called when the RenderWidgetHostImpl has be initialized. + virtual void OnRenderWidgetInit() {} + protected: // Interface class only, do not construct. RenderWidgetHostViewBase();
diff --git a/content/browser/storage_partition_impl_unittest.cc b/content/browser/storage_partition_impl_unittest.cc index 04828d2..3107f25 100644 --- a/content/browser/storage_partition_impl_unittest.cc +++ b/content/browser/storage_partition_impl_unittest.cc
@@ -455,7 +455,7 @@ void OnFileOpened(base::File* file_result, AwaitCompletionHelper* await_completion, base::File file, - const base::Closure& on_close_callback) { + base::OnceClosure on_close_callback) { *file_result = std::move(file); await_completion->Notify(); }
diff --git a/content/browser/web_contents/web_contents_android.cc b/content/browser/web_contents/web_contents_android.cc index d9c1cca..459fd9c 100644 --- a/content/browser/web_contents/web_contents_android.cc +++ b/content/browser/web_contents/web_contents_android.cc
@@ -658,6 +658,12 @@ return web_contents_->HasActiveEffectivelyFullscreenVideo(); } +bool WebContentsAndroid::IsPictureInPictureAllowedForFullscreenVideo( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj) { + return web_contents_->IsPictureInPictureAllowedForFullscreenVideo(); +} + base::android::ScopedJavaLocalRef<jobject> WebContentsAndroid::GetFullscreenVideoSize( JNIEnv* env,
diff --git a/content/browser/web_contents/web_contents_android.h b/content/browser/web_contents/web_contents_android.h index 37cdcb4..fe9fe57a 100644 --- a/content/browser/web_contents/web_contents_android.h +++ b/content/browser/web_contents/web_contents_android.h
@@ -203,6 +203,9 @@ bool HasActiveEffectivelyFullscreenVideo( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); + bool IsPictureInPictureAllowedForFullscreenVideo( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj); base::android::ScopedJavaLocalRef<jobject> GetFullscreenVideoSize( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 5274d1a6..0185340 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -4050,6 +4050,12 @@ subframe_host); } +void WebContentsImpl::UpdatePictureInPictureSurfaceId( + viz::SurfaceId surface_id) { + if (delegate_) + delegate_->UpdatePictureInPictureSurfaceId(surface_id); +} + #if defined(OS_ANDROID) base::android::ScopedJavaLocalRef<jobject> WebContentsImpl::GetJavaRenderFrameHostDelegate() { @@ -4800,6 +4806,11 @@ return media_web_contents_observer_->HasActiveEffectivelyFullscreenVideo(); } +bool WebContentsImpl::IsPictureInPictureAllowedForFullscreenVideo() const { + return media_web_contents_observer_ + ->IsPictureInPictureAllowedForFullscreenVideo(); +} + bool WebContentsImpl::IsFocusedElementEditable() { RenderFrameHostImpl* frame = GetFocusedFrame(); return frame && frame->has_focused_editable_element();
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index 3b030ca..84a01a83 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h
@@ -576,6 +576,7 @@ ResourceType resource_type, const std::string& ip, net::CertStatus cert_status) override; + void UpdatePictureInPictureSurfaceId(viz::SurfaceId surface_id) override; // RenderViewHostDelegate ---------------------------------------------------- RenderViewHostDelegateView* GetDelegateView() override; @@ -904,6 +905,11 @@ // |IsFullscreen| must return |true| when this method is called. bool HasActiveEffectivelyFullscreenVideo() const; + // Whether the WebContents effectively fullscreen active player allows + // Picture-in-Picture. + // |IsFullscreen| must return |true| when this method is called. + bool IsPictureInPictureAllowedForFullscreenVideo() const; + // When inner or outer WebContents are present, become the focused // WebContentsImpl. This will activate this content's main frame RenderWidget // and indirectly all its subframe widgets. GetFocusedRenderWidgetHost will
diff --git a/content/browser/webrtc/webrtc_internals.cc b/content/browser/webrtc/webrtc_internals.cc index 1d269fc..8e4be205 100644 --- a/content/browser/webrtc/webrtc_internals.cc +++ b/content/browser/webrtc/webrtc_internals.cc
@@ -23,6 +23,7 @@ #include "media/audio/audio_debug_recording_session.h" #include "media/audio/audio_manager.h" #include "media/media_features.h" +#include "services/audio/public/cpp/debug_recording_session_factory.h" #include "services/device/public/mojom/constants.mojom.h" #include "services/device/public/mojom/wake_lock_provider.mojom.h" #include "services/service_manager/public/cpp/connector.h" @@ -518,8 +519,11 @@ void WebRTCInternals::EnableAudioDebugRecordingsOnAllRenderProcessHosts() { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(!audio_debug_recording_session_); - audio_debug_recording_session_ = media::AudioDebugRecordingSession::Create( - audio_debug_recordings_file_path_); + audio_debug_recording_session_ = audio::CreateAudioDebugRecordingSession( + audio_debug_recordings_file_path_, + content::ServiceManagerConnection::GetForProcess() + ->GetConnector() + ->Clone()); for (RenderProcessHost::iterator i( content::RenderProcessHost::AllHostsIterator());
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn index bbb311c..b5deaf60 100644 --- a/content/common/BUILD.gn +++ b/content/common/BUILD.gn
@@ -553,6 +553,7 @@ "indexed_db/indexed_db.mojom", "input/input_handler.mojom", "input/input_injector.mojom", + "input/synchronous_compositor.mojom", "leveldb_wrapper.mojom", "manifest_observer.mojom", "media/media_stream.mojom",
diff --git a/content/common/DEPS b/content/common/DEPS index be2420e..8e7edb259 100644 --- a/content/common/DEPS +++ b/content/common/DEPS
@@ -28,6 +28,7 @@ "+third_party/WebKit/public/platform/WebFloatPoint.h", "+third_party/WebKit/public/platform/WebFloatRect.h", "+third_party/WebKit/public/platform/WebFocusType.h", + "+third_party/WebKit/public/platform/WebFullscreenVideoStatus.h", "+third_party/WebKit/public/platform/WebGestureEvent.h", "+third_party/WebKit/public/platform/WebHTTPBody.h", "+third_party/WebKit/public/platform/WebHistoryScrollRestorationType.h",
diff --git a/content/common/frame.mojom b/content/common/frame.mojom index 7732f32..911a26b6 100644 --- a/content/common/frame.mojom +++ b/content/common/frame.mojom
@@ -13,6 +13,7 @@ import "mojo/public/mojom/base/string16.mojom"; import "services/network/public/mojom/url_loader.mojom"; import "services/service_manager/public/mojom/interface_provider.mojom"; +import "services/viz/public/interfaces/compositing/surface_id.mojom"; import "third_party/WebKit/public/mojom/feature_policy/feature_policy.mojom"; import "third_party/WebKit/public/platform/referrer.mojom"; import "third_party/WebKit/public/web/commit_result.mojom"; @@ -314,4 +315,8 @@ // replicated in the browser so that the browser can correctly set the initial // size of the frame in case of a cross-process navigation. FrameRectsChanged(gfx.mojom.Rect rect); + + // Sent by the renderer to update Picture-in-Picture with SurfaceId information + // to be used to show content in the Picture-in-Picture window. + OnUpdatePictureInPictureSurfaceId(viz.mojom.SurfaceId surface_id); };
diff --git a/content/common/input/OWNERS b/content/common/input/OWNERS index 5cf2271b..8f20012 100644 --- a/content/common/input/OWNERS +++ b/content/common/input/OWNERS
@@ -11,7 +11,8 @@ per-file *_messages.cc=file://ipc/SECURITY_OWNERS per-file *_messages*.h=set noparent per-file *_messages*.h=file://ipc/SECURITY_OWNERS - +per-file *.typemap=set noparent +per-file *.typemap=file://ipc/SECURITY_OWNERS # TEAM: input-dev@chromium.org # COMPONENT: Blink>Input
diff --git a/content/common/input/input_handler.mojom b/content/common/input/input_handler.mojom index 164def6..200dac4 100644 --- a/content/common/input/input_handler.mojom +++ b/content/common/input/input_handler.mojom
@@ -4,6 +4,7 @@ module content.mojom; +import "content/common/input/synchronous_compositor.mojom"; import "content/common/native_types.mojom"; import "mojo/public/mojom/base/string16.mojom"; import "services/ui/public/interfaces/ime/ime.mojom"; @@ -251,6 +252,13 @@ // of this API is the same as DispatchEvent just that there is no callback // after the event is processed. DispatchNonBlockingEvent(Event event); + + // Attach the synchronous compositor interface. This method only + // should be called for Android WebView. + AttachSynchronousCompositor( + SynchronousCompositorControlHost control_host, + associated SynchronousCompositorHost host, + associated SynchronousCompositor& compositor_request); }; // This interface provides the input actions associated with the RenderFrame.
diff --git a/content/common/input/synchronous_compositor.mojom b/content/common/input/synchronous_compositor.mojom new file mode 100644 index 0000000..5e72242 --- /dev/null +++ b/content/common/input/synchronous_compositor.mojom
@@ -0,0 +1,117 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module content.mojom; + +import "mojo/common/time.mojom"; +import "ui/gfx/geometry/mojo/geometry.mojom"; +import "services/viz/public/interfaces/compositing/begin_frame_args.mojom"; +import "services/viz/public/interfaces/compositing/compositor_frame.mojom"; +import "services/viz/public/interfaces/compositing/compositor_frame_metadata.mojom"; +import "services/viz/public/interfaces/compositing/returned_resource.mojom"; + +[Native] +struct SyncCompositorDemandDrawHwParams; + +[Native] +struct SyncCompositorSetSharedMemoryParams; + +[Native] +struct SyncCompositorDemandDrawSwParams; + +[Native] +struct SyncCompositorCommonRendererParams; + +// The SynchronousCompositor is an interface that is used by Android Webview +// which must control the compositor synchronously. It does this so that +// java UI is drawn in lock step with content renderer by the webview. +// The SynchronousCompositor is an associated interface with WidgetInputHandler +// because input must be delivered in order with the compositing events. +interface SynchronousCompositor { + // Computes the scroll at given time. + ComputeScroll(mojo.common.mojom.TimeTicks time); + + // Hardware draw asynchronously, ReturnFrame will return the result on + // the associated SynchronousCompositorControlHost. + DemandDrawHwAsync(SyncCompositorDemandDrawHwParams draw_params); + + // Synchronously hardware draws. + [Sync] + DemandDrawHw(SyncCompositorDemandDrawHwParams draw_params) => + (SyncCompositorCommonRendererParams result, + uint32 layer_tree_frame_sink_id, + viz.mojom.CompositorFrame? frame); + + // Synchronously sets the shared memory used for resourceless software + // drawing. This mode just has the renderer send over a single bitmap of the + // final frame, rather than sending over individual tiles (ie. resources) + // that are then composited by the browser. + [Sync] SetSharedMemory(SyncCompositorSetSharedMemoryParams params) => + (bool success, SyncCompositorCommonRendererParams result); + + // Synchronously does a software based draw. + [Sync] DemandDrawSw(SyncCompositorDemandDrawSwParams draw_params) => + (SyncCompositorCommonRendererParams result, + viz.mojom.CompositorFrameMetadata? meta_data); + + // Zero out the shared memory. This is necessary since most of the time, + // viewport size doesn't change between draws, it's cheaper to zero out + // and reuse the shared memory, instead of allocating and mapping a new + // one each frame. + ZeroSharedMemory(); + + // Synchronously zoom by adjusting the page scale factor by delta around + // the anchor point. + [Sync] ZoomBy(float delta, gfx.mojom.Point anchor) => + (SyncCompositorCommonRendererParams result); + + // Adjust the memory policy of the compositor. Explicitly how much the + // compositor can use without changing visibility. ie. The limit on + // amount of memory used for caching tiles. + SetMemoryPolicy(uint32 bytes_limit); + + // Attempt to reclaim resources. + ReclaimResources(uint32 layer_tree_frame_sink_id, + array<viz.mojom.ReturnedResource> resources); + + // Adjust the scroll to the given offset. + SetScroll(gfx.mojom.ScrollOffset offset); + + // BeginFrame, update will be pushed via SynchronousCompositorControlHost + // BeginFrameResponse. + BeginFrame(viz.mojom.BeginFrameArgs args); + + // Indicates BeginFrame messages are paused. + SetBeginFrameSourcePaused(bool paused); +}; + +// Interface that runs on the UI thread of the browser. To be used +// for responses to most messages. +interface SynchronousCompositorHost { + // Indicates the layer tree was created. + LayerTreeFrameSinkCreated(); + + // Notification of new compositor information. + UpdateState(SyncCompositorCommonRendererParams params); + + // Notifies the that a begin frame is needed or not. + SetNeedsBeginFrames(bool needs_begin_frames); +}; + +// Interface that runs on the IO thread of the browser. To be used for responses +// to messages that need to wait for the response to be available before +// execution continues. Typically the browser UI thread will dispatch some +// messages asynchronously via the SynchronousCompositor interface but then +// reach a point at which a response must be available. For example the +// BeginFrame is sent to all attached WebViews but before the Android VSync +// execution flow (from java) returns the responses from BeginFrames must be +// received. +interface SynchronousCompositorControlHost { + // Response from DrawHwAsync. + ReturnFrame(uint32 layer_tree_frame_sink_id, + viz.mojom.CompositorFrame? frame); + + // Response from BeginFrame. + BeginFrameResponse(SyncCompositorCommonRendererParams params); +}; \ No newline at end of file
diff --git a/content/common/input/synchronous_compositor.typemap b/content/common/input/synchronous_compositor.typemap new file mode 100644 index 0000000..6adbf16 --- /dev/null +++ b/content/common/input/synchronous_compositor.typemap
@@ -0,0 +1,17 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +mojom = "//content/common/input/synchronous_compositor.mojom" +public_headers = [ "//content/common/input/sync_compositor_messages.h" ] +traits_headers = [ "//content/common/input/sync_compositor_messages.h" ] +deps = [ + "//cc/ipc", + "//ui/gfx/ipc", +] +type_mappings = [ + "content.mojom.SyncCompositorDemandDrawHwParams=content::SyncCompositorDemandDrawHwParams", + "content.mojom.SyncCompositorSetSharedMemoryParams=content::SyncCompositorSetSharedMemoryParams", + "content.mojom.SyncCompositorDemandDrawSwParams=content::SyncCompositorDemandDrawSwParams", + "content.mojom.SyncCompositorCommonRendererParams=content::SyncCompositorCommonRendererParams", +]
diff --git a/content/common/media/media_player_delegate_messages.h b/content/common/media/media_player_delegate_messages.h index 3791fc1..14824d1 100644 --- a/content/common/media/media_player_delegate_messages.h +++ b/content/common/media/media_player_delegate_messages.h
@@ -13,6 +13,7 @@ #include "content/common/content_export.h" #include "ipc/ipc_message_macros.h" #include "media/base/media_content_type.h" +#include "third_party/WebKit/public/platform/WebFullscreenVideoStatus.h" #include "ui/gfx/ipc/geometry/gfx_param_traits.h" #undef IPC_MESSAGE_EXPORT @@ -20,6 +21,8 @@ #define IPC_MESSAGE_START MediaPlayerDelegateMsgStart IPC_ENUM_TRAITS_MAX_VALUE(media::MediaContentType, media::MediaContentType::Max) +IPC_ENUM_TRAITS_MAX_VALUE(blink::WebFullscreenVideoStatus, + blink::WebFullscreenVideoStatus::kMax) // ---------------------------------------------------------------------------- // Messages from the browser to the renderer requesting playback state changes. @@ -74,7 +77,7 @@ IPC_MESSAGE_ROUTED2( MediaPlayerDelegateHostMsg_OnMediaEffectivelyFullscreenChanged, int /* delegate_id, distinguishes instances */, - bool /* is_fullscreen */) + blink::WebFullscreenVideoStatus /* fullscreen_video_status */) IPC_MESSAGE_ROUTED2(MediaPlayerDelegateHostMsg_OnMediaSizeChanged, int /* delegate_id, distinguishes instances */,
diff --git a/content/common/typemaps.gni b/content/common/typemaps.gni index bc1e111..2772179 100644 --- a/content/common/typemaps.gni +++ b/content/common/typemaps.gni
@@ -7,6 +7,7 @@ "//content/common/cache_storage/cache_storage.typemap", "//content/common/frame.typemap", "//content/common/frame_messages.typemap", + "//content/common/input/synchronous_compositor.typemap", "//content/common/media/media_devices.typemap", "//content/common/media/media_stream.typemap", "//content/common/native_types.typemap",
diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java index 5ffa5f5..927beb4e8 100644 --- a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
@@ -644,6 +644,11 @@ } @Override + public boolean isPictureInPictureAllowedForFullscreenVideo() { + return nativeIsPictureInPictureAllowedForFullscreenVideo(mNativeWebContentsAndroid); + } + + @Override public @Nullable Rect getFullscreenVideoSize() { return nativeGetFullscreenVideoSize(mNativeWebContentsAndroid); } @@ -807,6 +812,8 @@ long nativeWebContentsAndroid, int x, int y); private native void nativeSetHasPersistentVideo(long nativeWebContentsAndroid, boolean value); private native boolean nativeHasActiveEffectivelyFullscreenVideo(long nativeWebContentsAndroid); + private native boolean nativeIsPictureInPictureAllowedForFullscreenVideo( + long nativeWebContentsAndroid); private native Rect nativeGetFullscreenVideoSize(long nativeWebContentsAndroid); private native void nativeSetSize(long nativeWebContentsAndroid, int width, int height); private native int nativeGetWidth(long nativeWebContentsAndroid);
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java index 630f5b0..86434c2 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java
@@ -451,6 +451,14 @@ boolean hasActiveEffectivelyFullscreenVideo(); /** + * Whether the WebContents is allowed to enter Picture-in-Picture when it has an active + * fullscreen video with native or custom controls. + * This should only be called if AppHooks.shouldDetectVideoFullscreen() + * returns true. + */ + boolean isPictureInPictureAllowedForFullscreenVideo(); + + /** * Gets a Rect containing the size of the currently playing fullscreen video. The position of * the rectangle is meaningless. Will return null if there is no such video. Fullscreen videos * may take a moment to register. This should only be called if
diff --git a/content/public/app/mojo/content_browser_manifest.json b/content/public/app/mojo/content_browser_manifest.json index 832ecec..5b8933c 100644 --- a/content/public/app/mojo/content_browser_manifest.json +++ b/content/public/app/mojo/content_browser_manifest.json
@@ -71,7 +71,7 @@ }, "requires": { "*": [ "app" ], - "audio": [ "info" ], + "audio": [ "info", "debug_recording"], "cdm": [ "media:cdm" ], "content_gpu": [ "browser" ], "content_plugin": [ "browser" ],
diff --git a/content/public/browser/android/synchronous_compositor.cc b/content/public/browser/android/synchronous_compositor.cc index 2d7e555e..2d50df9b 100644 --- a/content/public/browser/android/synchronous_compositor.cc +++ b/content/public/browser/android/synchronous_compositor.cc
@@ -37,7 +37,8 @@ DCHECK(!waited_); waited_ = true; #endif - base::ThreadRestrictions::ScopedAllowWait wait; + base::ScopedAllowBaseSyncPrimitivesOutsideBlockingScope + allow_base_sync_primitives; waitable_event_.Wait(); return std::move(frame_); }
diff --git a/content/public/browser/web_contents_delegate.cc b/content/public/browser/web_contents_delegate.cc index a838373..ed99743 100644 --- a/content/public/browser/web_contents_delegate.cc +++ b/content/public/browser/web_contents_delegate.cc
@@ -10,6 +10,7 @@ #include "base/logging.h" #include "base/memory/singleton.h" #include "build/build_config.h" +#include "components/viz/common/surfaces/surface_id.h" #include "content/public/browser/keyboard_event_processing_result.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/security_style_explanations.h" @@ -268,4 +269,7 @@ return false; } +void WebContentsDelegate::UpdatePictureInPictureSurfaceId( + viz::SurfaceId surface_id) {} + } // namespace content
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h index 4b512a0..6f0c02b0 100644 --- a/content/public/browser/web_contents_delegate.h +++ b/content/public/browser/web_contents_delegate.h
@@ -44,6 +44,7 @@ class ColorChooser; class JavaScriptDialogManager; class RenderFrameHost; +class RenderProcessHost; class RenderWidgetHost; class SessionStorageNamespace; class SiteInstance; @@ -66,6 +67,10 @@ class Origin; } +namespace viz { +class SurfaceId; +} // namespace viz + namespace blink { class WebGestureEvent; } @@ -566,6 +571,10 @@ RenderFrameHost* subframe_host) const { } + // Updates the Picture-in-Picture controller with the relevant viz::SurfaceId + // of the video to be in Picture-in-Picture mode. + virtual void UpdatePictureInPictureSurfaceId(viz::SurfaceId surface_id); + protected: virtual ~WebContentsDelegate();
diff --git a/content/public/common/common_param_traits_macros.h b/content/public/common/common_param_traits_macros.h index d3b57f4..6b1fa1ce 100644 --- a/content/public/common/common_param_traits_macros.h +++ b/content/public/common/common_param_traits_macros.h
@@ -199,6 +199,7 @@ IPC_STRUCT_TRAITS_MEMBER(force_enable_zoom) IPC_STRUCT_TRAITS_MEMBER(fullscreen_supported) IPC_STRUCT_TRAITS_MEMBER(double_tap_to_zoom_enabled) + IPC_STRUCT_TRAITS_MEMBER(picture_in_picture_enabled) IPC_STRUCT_TRAITS_MEMBER(media_playback_gesture_whitelist_scope) IPC_STRUCT_TRAITS_MEMBER(default_video_poster_url) IPC_STRUCT_TRAITS_MEMBER(support_deprecated_target_density_dpi)
diff --git a/content/public/common/web_preferences.h b/content/public/common/web_preferences.h index f0308abc..43606a7 100644 --- a/content/public/common/web_preferences.h +++ b/content/public/common/web_preferences.h
@@ -219,6 +219,7 @@ bool force_enable_zoom; bool fullscreen_supported; bool double_tap_to_zoom_enabled; + bool picture_in_picture_enabled; std::string media_playback_gesture_whitelist_scope; GURL default_video_poster_url; bool support_deprecated_target_density_dpi;
diff --git a/content/public/test/android/javatests/src/org/chromium/content/browser/test/mock/MockWebContents.java b/content/public/test/android/javatests/src/org/chromium/content/browser/test/mock/MockWebContents.java index 445cb893..40f93c9 100644 --- a/content/public/test/android/javatests/src/org/chromium/content/browser/test/mock/MockWebContents.java +++ b/content/public/test/android/javatests/src/org/chromium/content/browser/test/mock/MockWebContents.java
@@ -251,6 +251,11 @@ } @Override + public boolean isPictureInPictureAllowedForFullscreenVideo() { + return false; + } + + @Override public Rect getFullscreenVideoSize() { return null; }
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn index e3a6bece..150ea58 100644 --- a/content/renderer/BUILD.gn +++ b/content/renderer/BUILD.gn
@@ -46,6 +46,10 @@ "android/synchronous_compositor_filter.h", "android/synchronous_compositor_proxy.cc", "android/synchronous_compositor_proxy.h", + "android/synchronous_compositor_proxy_chrome_ipc.cc", + "android/synchronous_compositor_proxy_chrome_ipc.h", + "android/synchronous_compositor_proxy_mojo.cc", + "android/synchronous_compositor_proxy_mojo.h", "android/synchronous_compositor_registry.h", "android/synchronous_layer_tree_frame_sink.cc", "android/synchronous_layer_tree_frame_sink.h",
diff --git a/content/renderer/android/synchronous_compositor_filter.cc b/content/renderer/android/synchronous_compositor_filter.cc index ed31fe3..44ca976ea 100644 --- a/content/renderer/android/synchronous_compositor_filter.cc +++ b/content/renderer/android/synchronous_compositor_filter.cc
@@ -12,7 +12,7 @@ #include "base/threading/thread_task_runner_handle.h" #include "content/common/input/sync_compositor_messages.h" #include "content/common/input_messages.h" -#include "content/renderer/android/synchronous_compositor_proxy.h" +#include "content/renderer/android/synchronous_compositor_proxy_chrome_ipc.h" #include "ipc/ipc_message_macros.h" #include "ui/events/blink/synchronous_input_handler_proxy.h" @@ -59,7 +59,7 @@ return result; } -SynchronousCompositorProxy* SynchronousCompositorFilter::FindProxy( +SynchronousCompositorProxyChromeIPC* SynchronousCompositorFilter::FindProxy( int routing_id) { auto itr = sync_compositor_map_.find(routing_id); if (itr == sync_compositor_map_.end()) { @@ -78,7 +78,7 @@ const IPC::Message& message) { DCHECK(compositor_task_runner_->BelongsToCurrentThread()); - SynchronousCompositorProxy* proxy = FindProxy(message.routing_id()); + SynchronousCompositorProxyChromeIPC* proxy = FindProxy(message.routing_id()); if (proxy) { proxy->OnMessageReceived(message); return; @@ -152,10 +152,6 @@ SynchronousLayerTreeFrameSink* layer_tree_frame_sink) { DCHECK(compositor_task_runner_->BelongsToCurrentThread()); DCHECK(layer_tree_frame_sink); - SynchronousCompositorProxy* proxy = FindProxy(routing_id); - if (proxy) { - proxy->SetLayerTreeFrameSink(nullptr); - } auto entry = layer_tree_frame_sink_map_.find(routing_id); if (entry != layer_tree_frame_sink_map_.end()) layer_tree_frame_sink_map_.erase(entry); @@ -165,9 +161,9 @@ int routing_id, ui::SynchronousInputHandlerProxy* synchronous_input_handler_proxy) { DCHECK(sync_compositor_map_.find(routing_id) == sync_compositor_map_.end()); - std::unique_ptr<SynchronousCompositorProxy> proxy = - std::make_unique<SynchronousCompositorProxy>( - routing_id, this, synchronous_input_handler_proxy); + auto proxy = std::make_unique<SynchronousCompositorProxyChromeIPC>( + routing_id, this, synchronous_input_handler_proxy); + proxy->Init(); sync_compositor_map_[routing_id] = std::move(proxy); }
diff --git a/content/renderer/android/synchronous_compositor_filter.h b/content/renderer/android/synchronous_compositor_filter.h index 4b8fef2..4e1637fb 100644 --- a/content/renderer/android/synchronous_compositor_filter.h +++ b/content/renderer/android/synchronous_compositor_filter.h
@@ -24,7 +24,7 @@ namespace content { -class SynchronousCompositorProxy; +class SynchronousCompositorProxyChromeIPC; class SynchronousCompositorFilter : public IPC::MessageFilter, @@ -78,7 +78,7 @@ SynchronousLayerTreeFrameSink* layer_tree_frame_sink); void UnregisterObjects(int routing_id); void RemoveEntryIfNeeded(int routing_id); - SynchronousCompositorProxy* FindProxy(int routing_id); + SynchronousCompositorProxyChromeIPC* FindProxy(int routing_id); const scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_; @@ -89,7 +89,7 @@ // Compositor thread-only fields. using SyncCompositorMap = std::unordered_map<int /* routing_id */, - std::unique_ptr<SynchronousCompositorProxy>>; + std::unique_ptr<SynchronousCompositorProxyChromeIPC>>; SyncCompositorMap sync_compositor_map_; bool filter_ready_;
diff --git a/content/renderer/android/synchronous_compositor_proxy.cc b/content/renderer/android/synchronous_compositor_proxy.cc index effddcd..2e0301b 100644 --- a/content/renderer/android/synchronous_compositor_proxy.cc +++ b/content/renderer/android/synchronous_compositor_proxy.cc
@@ -22,25 +22,11 @@ namespace content { SynchronousCompositorProxy::SynchronousCompositorProxy( - int routing_id, - IPC::Sender* sender, ui::SynchronousInputHandlerProxy* input_handler_proxy) - : routing_id_(routing_id), - sender_(sender), - input_handler_proxy_(input_handler_proxy), + : input_handler_proxy_(input_handler_proxy), use_in_process_zero_copy_software_draw_( base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kSingleProcess)), - layer_tree_frame_sink_(nullptr), - inside_receive_(false), - hardware_draw_reply_(nullptr), - software_draw_reply_(nullptr), - hardware_draw_reply_async_(false), - compute_scroll_called_via_ipc_(false), - browser_needs_begin_frame_state_(false), - needs_begin_frame_for_frame_sink_(false), - needs_begin_frame_for_animate_input_(false), - version_(0u), page_scale_factor_(0.f), min_page_scale_factor_(0.f), max_page_scale_factor_(0.f), @@ -48,7 +34,6 @@ need_invalidate_count_(0u), did_activate_pending_tree_count_(0u) { DCHECK(input_handler_proxy_); - input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(this); } SynchronousCompositorProxy::~SynchronousCompositorProxy() { @@ -58,18 +43,22 @@ input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(nullptr); } +void SynchronousCompositorProxy::Init() { + input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(this); +} + void SynchronousCompositorProxy::SetLayerTreeFrameSink( SynchronousLayerTreeFrameSink* layer_tree_frame_sink) { DCHECK_NE(layer_tree_frame_sink_, layer_tree_frame_sink); + DCHECK(layer_tree_frame_sink); if (layer_tree_frame_sink_) { layer_tree_frame_sink_->SetSyncClient(nullptr); } layer_tree_frame_sink_ = layer_tree_frame_sink; - if (layer_tree_frame_sink_) { - layer_tree_frame_sink_->SetSyncClient(this); - if (begin_frame_paused_) - layer_tree_frame_sink_->SetBeginFrameSourcePaused(true); - } + layer_tree_frame_sink_->SetSyncClient(this); + LayerTreeFrameSinkCreated(); + if (begin_frame_paused_) + layer_tree_frame_sink_->SetBeginFrameSourcePaused(true); } void SynchronousCompositorProxy::SetNeedsSynchronousAnimateInput() { @@ -116,16 +105,8 @@ SendAsyncRendererStateIfNeeded(); } -void SynchronousCompositorProxy::SendAsyncRendererStateIfNeeded() { - if (inside_receive_) - return; - SyncCompositorCommonRendererParams params; - PopulateCommonParams(¶ms); - Send(new SyncCompositorHostMsg_UpdateState(routing_id_, params)); -} - void SynchronousCompositorProxy::PopulateCommonParams( - SyncCompositorCommonRendererParams* params) const { + SyncCompositorCommonRendererParams* params) { params->version = ++version_; params->total_scroll_offset = total_scroll_offset_; params->max_scroll_offset = max_scroll_offset_; @@ -139,115 +120,36 @@ params->need_animate_scroll = need_animate_scroll_; } -void SynchronousCompositorProxy::OnMessageReceived( - const IPC::Message& message) { - if (layer_tree_frame_sink_ && - layer_tree_frame_sink_->OnMessageReceived(message)) - return; - - IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) - IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) - IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawHw, - DemandDrawHw) - IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHwAsync, DemandDrawHwAsync) - IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetSharedMemory, SetSharedMemory) - IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZeroSharedMemory, ZeroSharedMemory) - IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawSw, - DemandDrawSw) - IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZoomBy, SynchronouslyZoomBy) - IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetScroll, SetScroll) - IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetBeginFramePaused, - OnSetBeginFrameSourcePaused) - IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, OnBeginFrame) - IPC_END_MESSAGE_MAP() -} - -bool SynchronousCompositorProxy::Send(IPC::Message* message) { - return sender_->Send(message); -} - void SynchronousCompositorProxy::DemandDrawHwAsync( const SyncCompositorDemandDrawHwParams& params) { - DoDemandDrawHw(params, nullptr); + DemandDrawHw( + params, + base::BindOnce(&SynchronousCompositorProxy::SendDemandDrawHwAsyncReply, + base::Unretained(this))); } void SynchronousCompositorProxy::DemandDrawHw( const SyncCompositorDemandDrawHwParams& params, - IPC::Message* reply_message) { - DCHECK(reply_message); - DoDemandDrawHw(params, reply_message); -} - -void SynchronousCompositorProxy::DoDemandDrawHw( - const SyncCompositorDemandDrawHwParams& params, - IPC::Message* reply_message) { - DCHECK(!inside_receive_); - inside_receive_ = true; + DemandDrawHwCallback callback) { + hardware_draw_reply_ = std::move(callback); if (layer_tree_frame_sink_) { - if (!reply_message) { - base::AutoReset<bool> scoped_hardware_draw_reply_async( - &hardware_draw_reply_async_, true); - layer_tree_frame_sink_->DemandDrawHw( - params.viewport_size, params.viewport_rect_for_tile_priority, - params.transform_for_tile_priority); - } else { - base::AutoReset<IPC::Message*> scoped_hardware_draw_reply( - &hardware_draw_reply_, reply_message); - layer_tree_frame_sink_->DemandDrawHw( - params.viewport_size, params.viewport_rect_for_tile_priority, - params.transform_for_tile_priority); - } + layer_tree_frame_sink_->DemandDrawHw(params.viewport_size, + params.viewport_rect_for_tile_priority, + params.transform_for_tile_priority); } - if (inside_receive_) { + // Ensure that a response is always sent even if the reply hasn't + // generated a compostior frame. + if (hardware_draw_reply_) { + SyncCompositorCommonRendererParams common_renderer_params; + PopulateCommonParams(&common_renderer_params); // Did not swap. - if (!reply_message) { - SendDemandDrawHwReplyAsync(base::nullopt, 0u); - } else { - SendDemandDrawHwReply(base::nullopt, 0u, reply_message); - } - inside_receive_ = false; + std::move(hardware_draw_reply_) + .Run(common_renderer_params, 0u, base::nullopt); } } -void SynchronousCompositorProxy::SubmitCompositorFrameHwAsync( - uint32_t layer_tree_frame_sink_id, - viz::CompositorFrame frame) { - DCHECK(inside_receive_); - DCHECK(hardware_draw_reply_async_); - SendDemandDrawHwReplyAsync(std::move(frame), layer_tree_frame_sink_id); - inside_receive_ = false; -} - -void SynchronousCompositorProxy::SubmitCompositorFrameHw( - uint32_t layer_tree_frame_sink_id, - viz::CompositorFrame frame) { - DCHECK(inside_receive_); - DCHECK(hardware_draw_reply_); - SendDemandDrawHwReply(std::move(frame), layer_tree_frame_sink_id, - hardware_draw_reply_); - inside_receive_ = false; -} - -void SynchronousCompositorProxy::SendDemandDrawHwReplyAsync( - base::Optional<viz::CompositorFrame> frame, - uint32_t layer_tree_frame_sink_id) { - Send(new SyncCompositorHostMsg_ReturnFrame(routing_id_, - layer_tree_frame_sink_id, frame)); -} - -void SynchronousCompositorProxy::SendDemandDrawHwReply( - base::Optional<viz::CompositorFrame> frame, - uint32_t layer_tree_frame_sink_id, - IPC::Message* reply_message) { - SyncCompositorCommonRendererParams common_renderer_params; - PopulateCommonParams(&common_renderer_params); - SyncCompositorMsg_DemandDrawHw::WriteReplyParams( - reply_message, common_renderer_params, layer_tree_frame_sink_id, frame); - Send(reply_message); -} - struct SynchronousCompositorProxy::SharedMemoryWithSize { base::SharedMemory shm; const size_t buffer_size; @@ -257,26 +159,6 @@ : shm(shm_handle, false), buffer_size(buffer_size), zeroed(true) {} }; -void SynchronousCompositorProxy::SetSharedMemory( - const SyncCompositorSetSharedMemoryParams& params, - bool* success, - SyncCompositorCommonRendererParams* common_renderer_params) { - DCHECK(!inside_receive_); - base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); - - *success = false; - if (!base::SharedMemory::IsHandleValid(params.shm_handle)) - return; - - software_draw_shm_.reset( - new SharedMemoryWithSize(params.shm_handle, params.buffer_size)); - if (!software_draw_shm_->shm.Map(params.buffer_size)) - return; - DCHECK(software_draw_shm_->shm.memory()); - PopulateCommonParams(common_renderer_params); - *success = true; -} - void SynchronousCompositorProxy::ZeroSharedMemory() { // It is possible for this to get called twice, eg. if draw is called before // the LayerTreeFrameSink is ready. Just ignore duplicated calls rather than @@ -290,12 +172,9 @@ void SynchronousCompositorProxy::DemandDrawSw( const SyncCompositorDemandDrawSwParams& params, - IPC::Message* reply_message) { - DCHECK(!inside_receive_); - inside_receive_ = true; + DemandDrawSwCallback callback) { + software_draw_reply_ = std::move(callback); if (layer_tree_frame_sink_) { - base::AutoReset<IPC::Message*> scoped_software_draw_reply( - &software_draw_reply_, reply_message); SkCanvas* sk_canvas_for_draw = SynchronousCompositorGetSkCanvas(); if (use_in_process_zero_copy_software_draw_) { DCHECK(sk_canvas_for_draw); @@ -305,10 +184,14 @@ DoDemandDrawSw(params); } } - if (inside_receive_) { + + // Ensure that a response is always sent even if the reply hasn't + // generated a compostior frame. + if (software_draw_reply_) { + SyncCompositorCommonRendererParams common_renderer_params; + PopulateCommonParams(&common_renderer_params); // Did not swap. - SendDemandDrawSwReply(base::nullopt, reply_message); - inside_receive_ = false; + std::move(software_draw_reply_).Run(common_renderer_params, base::nullopt); } } @@ -334,39 +217,23 @@ layer_tree_frame_sink_->DemandDrawSw(&canvas); } -void SynchronousCompositorProxy::SubmitCompositorFrameSw( - viz::CompositorFrame frame) { - DCHECK(inside_receive_); - DCHECK(software_draw_reply_); - SendDemandDrawSwReply(std::move(frame.metadata), software_draw_reply_); - inside_receive_ = false; -} - -void SynchronousCompositorProxy::SendDemandDrawSwReply( - base::Optional<viz::CompositorFrameMetadata> metadata, - IPC::Message* reply_message) { - SyncCompositorCommonRendererParams common_renderer_params; - PopulateCommonParams(&common_renderer_params); - SyncCompositorMsg_DemandDrawSw::WriteReplyParams( - reply_message, common_renderer_params, metadata); - Send(reply_message); -} - void SynchronousCompositorProxy::SubmitCompositorFrame( uint32_t layer_tree_frame_sink_id, viz::CompositorFrame frame) { // Verify that exactly one of these is true. - DCHECK(hardware_draw_reply_async_ || hardware_draw_reply_ || - software_draw_reply_); - DCHECK(!((hardware_draw_reply_ && software_draw_reply_) || - (hardware_draw_reply_ && hardware_draw_reply_async_) || - (software_draw_reply_ && hardware_draw_reply_async_))); - if (hardware_draw_reply_async_) { - SubmitCompositorFrameHwAsync(layer_tree_frame_sink_id, std::move(frame)); - } else if (hardware_draw_reply_) { - SubmitCompositorFrameHw(layer_tree_frame_sink_id, std::move(frame)); + DCHECK(hardware_draw_reply_.is_null() ^ software_draw_reply_.is_null()); + SyncCompositorCommonRendererParams common_renderer_params; + PopulateCommonParams(&common_renderer_params); + + if (hardware_draw_reply_) { + std::move(hardware_draw_reply_) + .Run(common_renderer_params, layer_tree_frame_sink_id, + std::move(frame)); } else if (software_draw_reply_) { - SubmitCompositorFrameSw(std::move(frame)); + std::move(software_draw_reply_) + .Run(common_renderer_params, std::move(frame.metadata)); + } else { + NOTREACHED(); } } @@ -374,8 +241,7 @@ bool needs_begin_frames = needs_begin_frame_for_frame_sink_ || needs_begin_frame_for_animate_input_; if (browser_needs_begin_frame_state_ != needs_begin_frames) - Send(new SyncCompositorHostMsg_SetNeedsBeginFrames(routing_id_, - needs_begin_frames)); + SendSetNeedsBeginFrames(needs_begin_frames); browser_needs_begin_frame_state_ = needs_begin_frames; } @@ -384,8 +250,11 @@ SendSetNeedsBeginFramesIfNeeded(); } -void SynchronousCompositorProxy::OnComputeScroll( - base::TimeTicks animation_time) { +void SynchronousCompositorProxy::SinkDestroyed() { + layer_tree_frame_sink_ = nullptr; +} + +void SynchronousCompositorProxy::ComputeScroll(base::TimeTicks animation_time) { compute_scroll_called_via_ipc_ = true; if (need_animate_scroll_) { @@ -394,13 +263,13 @@ } } -void SynchronousCompositorProxy::OnSetBeginFrameSourcePaused(bool paused) { +void SynchronousCompositorProxy::SetBeginFrameSourcePaused(bool paused) { begin_frame_paused_ = paused; if (layer_tree_frame_sink_) layer_tree_frame_sink_->SetBeginFrameSourcePaused(paused); } -void SynchronousCompositorProxy::OnBeginFrame(const viz::BeginFrameArgs& args) { +void SynchronousCompositorProxy::BeginFrame(const viz::BeginFrameArgs& args) { if (needs_begin_frame_for_animate_input_) { needs_begin_frame_for_animate_input_ = false; input_handler_proxy_->SynchronouslyAnimate(args.frame_time); @@ -410,17 +279,7 @@ SyncCompositorCommonRendererParams param; PopulateCommonParams(¶m); - Send(new SyncCompositorHostMsg_BeginFrameResponse(routing_id_, param)); -} - -void SynchronousCompositorProxy::SynchronouslyZoomBy( - float zoom_delta, - const gfx::Point& anchor, - SyncCompositorCommonRendererParams* common_renderer_params) { - DCHECK(!inside_receive_); - base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); - input_handler_proxy_->SynchronouslyZoomBy(zoom_delta, anchor); - PopulateCommonParams(common_renderer_params); + SendBeginFrameResponse(param); } void SynchronousCompositorProxy::SetScroll( @@ -431,4 +290,45 @@ input_handler_proxy_->SynchronouslySetRootScrollOffset(total_scroll_offset_); } +void SynchronousCompositorProxy::SetMemoryPolicy(uint32_t bytes_limit) { + if (!layer_tree_frame_sink_) + return; + layer_tree_frame_sink_->SetMemoryPolicy(bytes_limit); +} + +void SynchronousCompositorProxy::ReclaimResources( + uint32_t layer_tree_frame_sink_id, + const std::vector<viz::ReturnedResource>& resources) { + if (!layer_tree_frame_sink_) + return; + layer_tree_frame_sink_->ReclaimResources(layer_tree_frame_sink_id, resources); +} + +void SynchronousCompositorProxy::SetSharedMemory( + const SyncCompositorSetSharedMemoryParams& params, + SetSharedMemoryCallback callback) { + bool success = false; + SyncCompositorCommonRendererParams common_renderer_params; + if (base::SharedMemory::IsHandleValid(params.shm_handle)) { + software_draw_shm_.reset( + new SharedMemoryWithSize(params.shm_handle, params.buffer_size)); + if (software_draw_shm_->shm.Map(params.buffer_size)) { + DCHECK(software_draw_shm_->shm.memory()); + PopulateCommonParams(&common_renderer_params); + success = true; + } + } + std::move(callback).Run(success, common_renderer_params); +} + +void SynchronousCompositorProxy::ZoomBy(float zoom_delta, + const gfx::Point& anchor, + ZoomByCallback callback) { + zoom_by_reply_ = std::move(callback); + input_handler_proxy_->SynchronouslyZoomBy(zoom_delta, anchor); + SyncCompositorCommonRendererParams common_renderer_params; + PopulateCommonParams(&common_renderer_params); + std::move(zoom_by_reply_).Run(common_renderer_params); +} + } // namespace content
diff --git a/content/renderer/android/synchronous_compositor_proxy.h b/content/renderer/android/synchronous_compositor_proxy.h index cf388677..b71546b5 100644 --- a/content/renderer/android/synchronous_compositor_proxy.h +++ b/content/renderer/android/synchronous_compositor_proxy.h
@@ -8,22 +8,22 @@ #include <stddef.h> #include <stdint.h> +#include "base/callback.h" #include "base/macros.h" #include "base/optional.h" +#include "content/common/input/synchronous_compositor.mojom.h" #include "content/public/common/input_event_ack_state.h" #include "content/renderer/android/synchronous_layer_tree_frame_sink.h" +#include "mojo/public/cpp/bindings/associated_binding.h" #include "ui/events/blink/synchronous_input_handler_proxy.h" #include "ui/gfx/geometry/scroll_offset.h" #include "ui/gfx/geometry/size_f.h" -namespace IPC { -class Message; -class Sender; -} // namespace IPC - namespace viz { +namespace cc { class CompositorFrame; } // namespace cc +} // namespace viz namespace content { @@ -34,100 +34,93 @@ struct SyncCompositorSetSharedMemoryParams; class SynchronousCompositorProxy : public ui::SynchronousInputHandler, - public SynchronousLayerTreeFrameSinkClient { + public SynchronousLayerTreeFrameSinkClient, + public mojom::SynchronousCompositor { public: SynchronousCompositorProxy( - int routing_id, - IPC::Sender* sender, ui::SynchronousInputHandlerProxy* input_handler_proxy); ~SynchronousCompositorProxy() override; + void Init(); + // ui::SynchronousInputHandler overrides. - void SetNeedsSynchronousAnimateInput() override; + void SetNeedsSynchronousAnimateInput() final; void UpdateRootLayerState(const gfx::ScrollOffset& total_scroll_offset, const gfx::ScrollOffset& max_scroll_offset, const gfx::SizeF& scrollable_size, float page_scale_factor, float min_page_scale_factor, - float max_page_scale_factor) override; + float max_page_scale_factor) final; // SynchronousLayerTreeFrameSinkClient overrides. - void DidActivatePendingTree() override; - void Invalidate() override; + void DidActivatePendingTree() final; + void Invalidate() final; void SubmitCompositorFrame(uint32_t layer_tree_frame_sink_id, - viz::CompositorFrame frame) override; - void SetNeedsBeginFrames(bool needs_begin_frames) override; + viz::CompositorFrame frame) final; + void SetNeedsBeginFrames(bool needs_begin_frames) final; + void SinkDestroyed() final; void SetLayerTreeFrameSink( SynchronousLayerTreeFrameSink* layer_tree_frame_sink); - void OnMessageReceived(const IPC::Message& message); - bool Send(IPC::Message* message); - void PopulateCommonParams(SyncCompositorCommonRendererParams* params) const; - - private: - struct SharedMemoryWithSize; + void PopulateCommonParams(SyncCompositorCommonRendererParams* params); void SendSetNeedsBeginFramesIfNeeded(); - // IPC handlers. - void OnComputeScroll(base::TimeTicks animation_time); - void OnSetBeginFrameSourcePaused(bool paused); - void OnBeginFrame(const viz::BeginFrameArgs& args); - void DemandDrawHwAsync(const SyncCompositorDemandDrawHwParams& params); + // mojom::SynchronousCompositor overrides. + void ComputeScroll(base::TimeTicks animation_time) final; + void DemandDrawHwAsync( + const SyncCompositorDemandDrawHwParams& draw_params) final; void DemandDrawHw(const SyncCompositorDemandDrawHwParams& params, - IPC::Message* reply_message); - void SetSharedMemory( - const SyncCompositorSetSharedMemoryParams& params, - bool* success, - SyncCompositorCommonRendererParams* common_renderer_params); - void ZeroSharedMemory(); + DemandDrawHwCallback callback) final; + void SetSharedMemory(const SyncCompositorSetSharedMemoryParams& params, + SetSharedMemoryCallback callback) final; void DemandDrawSw(const SyncCompositorDemandDrawSwParams& params, - IPC::Message* reply_message); - void SynchronouslyZoomBy( - float zoom_delta, - const gfx::Point& anchor, - SyncCompositorCommonRendererParams* common_renderer_params); - void SetScroll(const gfx::ScrollOffset& total_scroll_offset); + DemandDrawSwCallback callback) final; + void ZeroSharedMemory() final; + void ZoomBy(float zoom_delta, const gfx::Point& anchor, ZoomByCallback) final; + void SetMemoryPolicy(uint32_t bytes_limit) final; + void ReclaimResources( + uint32_t layer_tree_frame_sink_id, + const std::vector<viz::ReturnedResource>& resources) final; + void SetScroll(const gfx::ScrollOffset& total_scroll_offset) final; + void BeginFrame(const viz::BeginFrameArgs& args) final; + void SetBeginFrameSourcePaused(bool paused) final; - void SubmitCompositorFrameHwAsync(uint32_t layer_tree_frame_sink_id, - viz::CompositorFrame frame); - void SubmitCompositorFrameHw(uint32_t layer_tree_frame_sink_id, - viz::CompositorFrame frame); - void SendDemandDrawHwReply(base::Optional<viz::CompositorFrame> frame, - uint32_t layer_tree_frame_sink_id, - IPC::Message* reply_message); - void SendDemandDrawHwReplyAsync(base::Optional<viz::CompositorFrame> frame, - uint32_t layer_tree_frame_sink_id); - void DoDemandDrawSw(const SyncCompositorDemandDrawSwParams& params); - void SubmitCompositorFrameSw(viz::CompositorFrame frame); - void SendDemandDrawSwReply( - base::Optional<viz::CompositorFrameMetadata> metadata, - IPC::Message* reply_message); - void SendAsyncRendererStateIfNeeded(); - void DoDemandDrawHw(const SyncCompositorDemandDrawHwParams& params, - IPC::Message* reply_message); + protected: + virtual void SendSetNeedsBeginFrames(bool needs_begin_frames) = 0; + virtual void SendAsyncRendererStateIfNeeded() = 0; + virtual void LayerTreeFrameSinkCreated() = 0; + virtual void SendBeginFrameResponse( + const content::SyncCompositorCommonRendererParams&) = 0; + virtual void SendDemandDrawHwAsyncReply( + const content::SyncCompositorCommonRendererParams&, + uint32_t, + base::Optional<viz::CompositorFrame>) = 0; - const int routing_id_; - IPC::Sender* const sender_; - ui::SynchronousInputHandlerProxy* const input_handler_proxy_; - const bool use_in_process_zero_copy_software_draw_; - SynchronousLayerTreeFrameSink* layer_tree_frame_sink_; - bool inside_receive_; - IPC::Message* hardware_draw_reply_; - IPC::Message* software_draw_reply_; - bool hardware_draw_reply_async_; + DemandDrawHwCallback hardware_draw_reply_; + DemandDrawSwCallback software_draw_reply_; + ZoomByCallback zoom_by_reply_; + SynchronousLayerTreeFrameSink* layer_tree_frame_sink_ = nullptr; bool begin_frame_paused_ = false; - bool compute_scroll_called_via_ipc_; - bool browser_needs_begin_frame_state_; - bool needs_begin_frame_for_frame_sink_; - bool needs_begin_frame_for_animate_input_; + private: + void DoDemandDrawSw(const SyncCompositorDemandDrawSwParams& params); + + struct SharedMemoryWithSize; + + ui::SynchronousInputHandlerProxy* const input_handler_proxy_; + const bool use_in_process_zero_copy_software_draw_; + + bool compute_scroll_called_via_ipc_ = false; + bool browser_needs_begin_frame_state_ = false; + bool needs_begin_frame_for_frame_sink_ = false; + bool needs_begin_frame_for_animate_input_ = false; // From browser. std::unique_ptr<SharedMemoryWithSize> software_draw_shm_; // To browser. - mutable uint32_t version_; // Mustable so PopulateCommonParams can be const. + uint32_t version_ = 0; gfx::ScrollOffset total_scroll_offset_; // Modified by both. gfx::ScrollOffset max_scroll_offset_; gfx::SizeF scrollable_size_;
diff --git a/content/renderer/android/synchronous_compositor_proxy_chrome_ipc.cc b/content/renderer/android/synchronous_compositor_proxy_chrome_ipc.cc new file mode 100644 index 0000000..4a9475e --- /dev/null +++ b/content/renderer/android/synchronous_compositor_proxy_chrome_ipc.cc
@@ -0,0 +1,167 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/renderer/android/synchronous_compositor_proxy_chrome_ipc.h" + +#include "base/auto_reset.h" +#include "base/command_line.h" +#include "base/memory/shared_memory.h" +#include "cc/ipc/cc_param_traits.h" +#include "content/common/android/sync_compositor_statics.h" +#include "content/common/input/sync_compositor_messages.h" +#include "content/public/common/content_switches.h" +#include "ipc/ipc_message.h" +#include "ipc/ipc_sender.h" +#include "third_party/skia/include/core/SkBitmap.h" +#include "third_party/skia/include/core/SkCanvas.h" +#include "third_party/skia/include/core/SkImageInfo.h" +#include "third_party/skia/include/core/SkRegion.h" +#include "ui/gfx/skia_util.h" + +namespace content { + +SynchronousCompositorProxyChromeIPC::SynchronousCompositorProxyChromeIPC( + int routing_id, + IPC::Sender* sender, + ui::SynchronousInputHandlerProxy* input_handler_proxy) + : SynchronousCompositorProxy(input_handler_proxy), + routing_id_(routing_id), + sender_(sender) {} + +SynchronousCompositorProxyChromeIPC::~SynchronousCompositorProxyChromeIPC() {} + +void SynchronousCompositorProxyChromeIPC::Send(IPC::Message* message) { + sender_->Send(message); +} + +void SynchronousCompositorProxyChromeIPC::OnMessageReceived( + const IPC::Message& message) { + IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxyChromeIPC, message) + IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, ComputeScroll) + IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawHw, + OnDemandDrawHw) + IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHwAsync, DemandDrawHwAsync) + IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetSharedMemory, OnSetSharedMemory) + IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZeroSharedMemory, ZeroSharedMemory) + IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawSw, + OnDemandDrawSw) + IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZoomBy, OnZoomBy) + IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetScroll, SetScroll) + IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetMemoryPolicy, SetMemoryPolicy) + IPC_MESSAGE_HANDLER(SyncCompositorMsg_ReclaimResources, ReclaimResources) + IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetBeginFramePaused, + SetBeginFrameSourcePaused) + IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame) + IPC_END_MESSAGE_MAP() +} + +void SynchronousCompositorProxyChromeIPC::OnDemandDrawHw( + const SyncCompositorDemandDrawHwParams& params, + IPC::Message* reply_message) { + DCHECK(reply_message); + DemandDrawHw(params, + base::BindOnce( + &SynchronousCompositorProxyChromeIPC::SendDemandDrawHwReply, + base::Unretained(this), reply_message)); +} + +void SynchronousCompositorProxyChromeIPC::OnDemandDrawSw( + const SyncCompositorDemandDrawSwParams& params, + IPC::Message* reply_message) { + DemandDrawSw(params, + base::BindOnce( + &SynchronousCompositorProxyChromeIPC::SendDemandDrawSwReply, + base::Unretained(this), reply_message)); +} + +void SynchronousCompositorProxyChromeIPC::SendDemandDrawHwAsyncReply( + const SyncCompositorCommonRendererParams& common_renderer_params, + uint32_t layer_tree_frame_sink_id, + base::Optional<viz::CompositorFrame> frame) { + Send(new SyncCompositorHostMsg_ReturnFrame(routing_id_, + layer_tree_frame_sink_id, frame)); +} + +void SynchronousCompositorProxyChromeIPC::SendDemandDrawHwReply( + IPC::Message* reply_message, + const SyncCompositorCommonRendererParams& common_renderer_params, + uint32_t layer_tree_frame_sink_id, + base::Optional<viz::CompositorFrame> frame) { + SyncCompositorMsg_DemandDrawHw::WriteReplyParams( + reply_message, common_renderer_params, layer_tree_frame_sink_id, frame); + Send(reply_message); +} + +void SynchronousCompositorProxyChromeIPC::SendDemandDrawSwReply( + IPC::Message* reply_message, + const SyncCompositorCommonRendererParams& common_renderer_params, + base::Optional<viz::CompositorFrameMetadata> metadata) { + SyncCompositorMsg_DemandDrawSw::WriteReplyParams( + reply_message, common_renderer_params, metadata); + Send(reply_message); +} + +void SynchronousCompositorProxyChromeIPC::SendAsyncRendererStateIfNeeded() { + // If any of the sync IPCs are in flight avoid pushing an asynch update + // state message as that is pointless as we will send the updated state + // with the response when the compositor frame is submitted. + if (hardware_draw_reply_ || software_draw_reply_ || zoom_by_reply_) + return; + SyncCompositorCommonRendererParams params; + PopulateCommonParams(¶ms); + + Send(new SyncCompositorHostMsg_UpdateState(routing_id_, params)); +} + +void SynchronousCompositorProxyChromeIPC::OnSetSharedMemory( + const SyncCompositorSetSharedMemoryParams& params, + bool* success, + SyncCompositorCommonRendererParams* common_renderer_params) { + *success = false; + SetSharedMemory( + params, + base::BindOnce(&SynchronousCompositorProxyChromeIPC::SetSharedMemoryReply, + base::Unretained(this), success, common_renderer_params)); +} + +void SynchronousCompositorProxyChromeIPC::SetSharedMemoryReply( + bool* out_success, + SyncCompositorCommonRendererParams* out_common_renderer_params, + bool success, + const SyncCompositorCommonRendererParams& common_renderer_params) { + *out_success = success; + *out_common_renderer_params = common_renderer_params; +} + +void SynchronousCompositorProxyChromeIPC::OnZoomBy( + float zoom_delta, + const gfx::Point& anchor, + SyncCompositorCommonRendererParams* common_renderer_params) { + ZoomBy(zoom_delta, anchor, + base::BindOnce(&SynchronousCompositorProxyChromeIPC::ZoomByReply, + base::Unretained(this), common_renderer_params)); +} + +void SynchronousCompositorProxyChromeIPC::ZoomByReply( + SyncCompositorCommonRendererParams* output_params, + const SyncCompositorCommonRendererParams& params) { + *output_params = params; +} + +void SynchronousCompositorProxyChromeIPC::LayerTreeFrameSinkCreated() { + Send(new SyncCompositorHostMsg_LayerTreeFrameSinkCreated(routing_id_)); +} + +void SynchronousCompositorProxyChromeIPC::SendBeginFrameResponse( + const content::SyncCompositorCommonRendererParams& param) { + Send(new SyncCompositorHostMsg_BeginFrameResponse(routing_id_, param)); +} + +void SynchronousCompositorProxyChromeIPC::SendSetNeedsBeginFrames( + bool needs_begin_frames) { + Send(new SyncCompositorHostMsg_SetNeedsBeginFrames(routing_id_, + needs_begin_frames)); +} + +} // namespace content
diff --git a/content/renderer/android/synchronous_compositor_proxy_chrome_ipc.h b/content/renderer/android/synchronous_compositor_proxy_chrome_ipc.h new file mode 100644 index 0000000..5961728 --- /dev/null +++ b/content/renderer/android/synchronous_compositor_proxy_chrome_ipc.h
@@ -0,0 +1,81 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_RENDERER_ANDROID_SYNCHRONOUS_COMPOSITOR_PROXY_CHROME_IPC_H_ +#define CONTENT_RENDERER_ANDROID_SYNCHRONOUS_COMPOSITOR_PROXY_CHROME_IPC_H_ + +#include "content/renderer/android/synchronous_compositor_proxy.h" + +namespace IPC { +class Message; +class Sender; +} // namespace IPC + +namespace content { + +// This class implements the SynchronousCompositorProxy with +// IPC messaging backed by Chrome IPC. +class SynchronousCompositorProxyChromeIPC : public SynchronousCompositorProxy { + public: + SynchronousCompositorProxyChromeIPC( + int routing_id, + IPC::Sender* sender, + ui::SynchronousInputHandlerProxy* input_handler_proxy); + ~SynchronousCompositorProxyChromeIPC() override; + + void Send(IPC::Message* message); + void OnMessageReceived(const IPC::Message& message); + + protected: + void SendSetNeedsBeginFrames(bool needs_begin_frames) final; + void SendAsyncRendererStateIfNeeded() final; + void LayerTreeFrameSinkCreated() final; + void SendBeginFrameResponse( + const content::SyncCompositorCommonRendererParams&) final; + void SendDemandDrawHwAsyncReply( + const content::SyncCompositorCommonRendererParams&, + uint32_t, + base::Optional<viz::CompositorFrame>) final; + + private: + // IPC handlers. + void OnSetSharedMemory( + const SyncCompositorSetSharedMemoryParams& params, + bool* success, + SyncCompositorCommonRendererParams* common_renderer_params); + void OnDemandDrawHw(const SyncCompositorDemandDrawHwParams& params, + IPC::Message* reply_message); + void OnDemandDrawSw(const SyncCompositorDemandDrawSwParams& params, + IPC::Message* reply_message); + + void OnZoomBy(float zoom_delta, + const gfx::Point& anchor, + SyncCompositorCommonRendererParams* common_renderer_params); + + void SendDemandDrawHwReply( + IPC::Message* reply_message, + const SyncCompositorCommonRendererParams& common_renderer_params, + uint32_t layer_tree_frame_sink_id, + base::Optional<viz::CompositorFrame> frame); + void SendDemandDrawSwReply( + IPC::Message* reply_message, + const SyncCompositorCommonRendererParams& common_renderer_params, + base::Optional<viz::CompositorFrameMetadata> metadata); + void ZoomByReply(SyncCompositorCommonRendererParams* output_params, + const SyncCompositorCommonRendererParams& params); + void SetSharedMemoryReply( + bool* out_success, + SyncCompositorCommonRendererParams* out_common_renderer_params, + bool success, + const SyncCompositorCommonRendererParams& common_renderer_params); + + const int routing_id_; + IPC::Sender* const sender_; + + DISALLOW_COPY_AND_ASSIGN(SynchronousCompositorProxyChromeIPC); +}; + +} // namespace content + +#endif // CONTENT_RENDERER_ANDROID_SYNCHRONOUS_COMPOSITOR_PROXY_CHROME_IPC_H_
diff --git a/content/renderer/android/synchronous_compositor_proxy_mojo.cc b/content/renderer/android/synchronous_compositor_proxy_mojo.cc new file mode 100644 index 0000000..01f1b74 --- /dev/null +++ b/content/renderer/android/synchronous_compositor_proxy_mojo.cc
@@ -0,0 +1,64 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/renderer/android/synchronous_compositor_proxy_mojo.h" + +namespace content { + +SynchronousCompositorProxyMojo::SynchronousCompositorProxyMojo( + ui::SynchronousInputHandlerProxy* input_handler_proxy) + : SynchronousCompositorProxy(input_handler_proxy), binding_(this) {} + +SynchronousCompositorProxyMojo::~SynchronousCompositorProxyMojo() {} + +void SynchronousCompositorProxyMojo::SendDemandDrawHwAsyncReply( + const content::SyncCompositorCommonRendererParams&, + uint32_t layer_tree_frame_sink_id, + base::Optional<viz::CompositorFrame> frame) { + control_host_->ReturnFrame(layer_tree_frame_sink_id, std::move(frame)); +} + +void SynchronousCompositorProxyMojo::SendBeginFrameResponse( + const content::SyncCompositorCommonRendererParams& param) { + control_host_->BeginFrameResponse(param); +} + +void SynchronousCompositorProxyMojo::SendAsyncRendererStateIfNeeded() { + if (hardware_draw_reply_ || software_draw_reply_ || zoom_by_reply_ || !host_) + return; + + SyncCompositorCommonRendererParams params; + PopulateCommonParams(¶ms); + host_->UpdateState(params); +} + +void SynchronousCompositorProxyMojo::SendSetNeedsBeginFrames( + bool needs_begin_frames) { + needs_begin_frame_ = needs_begin_frames; + if (host_) + host_->SetNeedsBeginFrames(needs_begin_frames); +} + +void SynchronousCompositorProxyMojo::LayerTreeFrameSinkCreated() { + DCHECK(layer_tree_frame_sink_); + if (host_) + host_->LayerTreeFrameSinkCreated(); +} + +void SynchronousCompositorProxyMojo::BindChannel( + mojom::SynchronousCompositorControlHostPtr control_host, + mojom::SynchronousCompositorHostAssociatedPtrInfo host, + mojom::SynchronousCompositorAssociatedRequest compositor_request) { + control_host_ = std::move(control_host); + host_.Bind(std::move(host)); + binding_.Bind(std::move(compositor_request)); + + if (layer_tree_frame_sink_) + LayerTreeFrameSinkCreated(); + + if (needs_begin_frame_) + host_->SetNeedsBeginFrames(true); +} + +} // namespace content
diff --git a/content/renderer/android/synchronous_compositor_proxy_mojo.h b/content/renderer/android/synchronous_compositor_proxy_mojo.h new file mode 100644 index 0000000..03cb014 --- /dev/null +++ b/content/renderer/android/synchronous_compositor_proxy_mojo.h
@@ -0,0 +1,47 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_RENDERER_ANDROID_SYNCHRONOUS_COMPOSITOR_PROXY_MOJO_H_ +#define CONTENT_RENDERER_ANDROID_SYNCHRONOUS_COMPOSITOR_PROXY_MOJO_H_ + +#include "content/renderer/android/synchronous_compositor_proxy.h" + +namespace content { + +// This class implements the SynchronousCompositorProxy with +// IPC messaging backed by mojo. +class SynchronousCompositorProxyMojo : public SynchronousCompositorProxy { + public: + SynchronousCompositorProxyMojo( + ui::SynchronousInputHandlerProxy* input_handler_proxy); + ~SynchronousCompositorProxyMojo() override; + + void BindChannel( + mojom::SynchronousCompositorControlHostPtr control_host, + mojom::SynchronousCompositorHostAssociatedPtrInfo host, + mojom::SynchronousCompositorAssociatedRequest compositor_request); + + protected: + void SendSetNeedsBeginFrames(bool needs_begin_frames) final; + void SendAsyncRendererStateIfNeeded() final; + void LayerTreeFrameSinkCreated() final; + void SendBeginFrameResponse( + const content::SyncCompositorCommonRendererParams&) final; + void SendDemandDrawHwAsyncReply( + const content::SyncCompositorCommonRendererParams&, + uint32_t, + base::Optional<viz::CompositorFrame>) final; + + private: + mojom::SynchronousCompositorControlHostPtr control_host_; + mojom::SynchronousCompositorHostAssociatedPtr host_; + mojo::AssociatedBinding<mojom::SynchronousCompositor> binding_; + bool needs_begin_frame_ = false; + + DISALLOW_COPY_AND_ASSIGN(SynchronousCompositorProxyMojo); +}; + +} // namespace content + +#endif // CONTENT_RENDERER_ANDROID_SYNCHRONOUS_COMPOSITOR_PROXY_MOJO_H_
diff --git a/content/renderer/android/synchronous_layer_tree_frame_sink.cc b/content/renderer/android/synchronous_layer_tree_frame_sink.cc index 2d85c71..b631c52 100644 --- a/content/renderer/android/synchronous_layer_tree_frame_sink.cc +++ b/content/renderer/android/synchronous_layer_tree_frame_sink.cc
@@ -27,7 +27,6 @@ #include "components/viz/service/display/texture_deleter.h" #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h" #include "components/viz/service/frame_sinks/frame_sink_manager_impl.h" -#include "content/common/input/sync_compositor_messages.h" #include "content/common/view_messages.h" #include "content/renderer/android/synchronous_compositor_filter.h" #include "content/renderer/android/synchronous_compositor_registry.h" @@ -114,6 +113,7 @@ scoped_refptr<viz::RasterContextProvider> worker_context_provider, scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner, gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, + IPC::Sender* sender, int routing_id, uint32_t layer_tree_frame_sink_id, std::unique_ptr<viz::BeginFrameSource> synthetic_begin_frame_source, @@ -127,7 +127,7 @@ routing_id_(routing_id), layer_tree_frame_sink_id_(layer_tree_frame_sink_id), registry_(registry), - sender_(RenderThreadImpl::current()->sync_compositor_message_filter()), + sender_(sender), memory_policy_(0u), frame_swap_message_queue_(frame_swap_message_queue), parent_local_surface_id_allocator_( @@ -148,21 +148,7 @@ void SynchronousLayerTreeFrameSink::SetSyncClient( SynchronousLayerTreeFrameSinkClient* compositor) { - DCHECK(CalledOnValidThread()); sync_client_ = compositor; - if (sync_client_) - Send(new SyncCompositorHostMsg_LayerTreeFrameSinkCreated(routing_id_)); -} - -bool SynchronousLayerTreeFrameSink::OnMessageReceived( - const IPC::Message& message) { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(SynchronousLayerTreeFrameSink, message) - IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetMemoryPolicy, SetMemoryPolicy) - IPC_MESSAGE_HANDLER(SyncCompositorMsg_ReclaimResources, OnReclaimResources) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; } bool SynchronousLayerTreeFrameSink::BindToClient( @@ -221,6 +207,8 @@ // Destroy the begin frame source on the same thread it was bound on. synthetic_begin_frame_source_ = nullptr; external_begin_frame_source_ = nullptr; + if (sync_client_) + sync_client_->SinkDestroyed(); registry_->UnregisterLayerTreeFrameSink(routing_id_, this); client_->SetTreeActivationCallback(base::Closure()); root_support_.reset(); @@ -450,7 +438,7 @@ } } -void SynchronousLayerTreeFrameSink::OnReclaimResources( +void SynchronousLayerTreeFrameSink::ReclaimResources( uint32_t layer_tree_frame_sink_id, const std::vector<viz::ReturnedResource>& resources) { // Ignore message if it's a stale one coming from a different output surface
diff --git a/content/renderer/android/synchronous_layer_tree_frame_sink.h b/content/renderer/android/synchronous_layer_tree_frame_sink.h index ba1ca97..fe175ca 100644 --- a/content/renderer/android/synchronous_layer_tree_frame_sink.h +++ b/content/renderer/android/synchronous_layer_tree_frame_sink.h
@@ -53,6 +53,7 @@ virtual void SubmitCompositorFrame(uint32_t layer_tree_frame_sink_id, viz::CompositorFrame frame) = 0; virtual void SetNeedsBeginFrames(bool needs_begin_frames) = 0; + virtual void SinkDestroyed() = 0; protected: virtual ~SynchronousLayerTreeFrameSinkClient() {} @@ -76,6 +77,7 @@ scoped_refptr<viz::RasterContextProvider> worker_context_provider, scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner, gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, + IPC::Sender* sender, int routing_id, uint32_t layer_tree_frame_sink_id, std::unique_ptr<viz::BeginFrameSource> begin_frame_source, @@ -84,7 +86,6 @@ ~SynchronousLayerTreeFrameSink() override; void SetSyncClient(SynchronousLayerTreeFrameSinkClient* compositor); - bool OnMessageReceived(const IPC::Message& message); // cc::LayerTreeFrameSink implementation. bool BindToClient(cc::LayerTreeFrameSinkClient* sink_client) override; @@ -120,6 +121,9 @@ void BeginFrame(const viz::BeginFrameArgs& args); void SetBeginFrameSourcePaused(bool paused); + void SetMemoryPolicy(size_t bytes_limit); + void ReclaimResources(uint32_t layer_tree_frame_sink_id, + const std::vector<viz::ReturnedResource>& resources); private: class SoftwareOutputSurface; @@ -134,11 +138,6 @@ void CancelFallbackTick(); void FallbackTickFired(); - // IPC handlers. - void SetMemoryPolicy(size_t bytes_limit); - void OnReclaimResources(uint32_t layer_tree_frame_sink_id, - const std::vector<viz::ReturnedResource>& resources); - const int routing_id_; const uint32_t layer_tree_frame_sink_id_; SynchronousCompositorRegistry* const registry_; // Not owned.
diff --git a/content/renderer/input/widget_input_handler_impl.cc b/content/renderer/input/widget_input_handler_impl.cc index c06b9b0a..2d0b1d2 100644 --- a/content/renderer/input/widget_input_handler_impl.cc +++ b/content/renderer/input/widget_input_handler_impl.cc
@@ -157,6 +157,14 @@ DispatchEvent(std::move(event), DispatchEventCallback()); } +void WidgetInputHandlerImpl::AttachSynchronousCompositor( + mojom::SynchronousCompositorControlHostPtr control_host, + mojom::SynchronousCompositorHostAssociatedPtrInfo host, + mojom::SynchronousCompositorAssociatedRequest compositor_request) { + input_handler_manager_->AttachSynchronousCompositor( + std::move(control_host), std::move(host), std::move(compositor_request)); +} + void WidgetInputHandlerImpl::RunOnMainThread(base::OnceClosure closure) { if (input_event_queue_) { input_event_queue_->QueueClosure(base::BindOnce(
diff --git a/content/renderer/input/widget_input_handler_impl.h b/content/renderer/input/widget_input_handler_impl.h index 5c5cddc2..8184618 100644 --- a/content/renderer/input/widget_input_handler_impl.h +++ b/content/renderer/input/widget_input_handler_impl.h
@@ -52,6 +52,11 @@ void DispatchEvent(std::unique_ptr<content::InputEvent>, DispatchEventCallback callback) override; void DispatchNonBlockingEvent(std::unique_ptr<content::InputEvent>) override; + void AttachSynchronousCompositor( + mojom::SynchronousCompositorControlHostPtr control_host, + mojom::SynchronousCompositorHostAssociatedPtrInfo host, + mojom::SynchronousCompositorAssociatedRequest compositor_request) + override; private: bool ShouldProxyToMainThread() const;
diff --git a/content/renderer/input/widget_input_handler_manager.cc b/content/renderer/input/widget_input_handler_manager.cc index 423b403..572bb7b 100644 --- a/content/renderer/input/widget_input_handler_manager.cc +++ b/content/renderer/input/widget_input_handler_manager.cc
@@ -22,6 +22,12 @@ #include "third_party/WebKit/public/web/WebLocalFrame.h" #include "ui/events/base_event_utils.h" +#if defined(OS_ANDROID) +#include "content/public/common/content_client.h" +#include "content/renderer/android/synchronous_compositor_proxy_mojo.h" +#include "content/renderer/android/synchronous_compositor_registry.h" +#endif + namespace content { namespace { void CallCallback(mojom::WidgetInputHandler::DispatchEventCallback callback, @@ -39,6 +45,68 @@ } // namespace +#if defined(OS_ANDROID) +class SynchronousCompositorProxyRegistry + : public SynchronousCompositorRegistry { + public: + explicit SynchronousCompositorProxyRegistry( + scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner) + : compositor_task_runner_(std::move(compositor_task_runner)) {} + + ~SynchronousCompositorProxyRegistry() override { + DCHECK(compositor_task_runner_->BelongsToCurrentThread()); + } + + using ProxyAutoDeleted = std::unique_ptr<SynchronousCompositorProxyRegistry, + base::OnTaskRunnerDeleter>; + + static ProxyAutoDeleted Create( + scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner) { + if (!compositor_task_runner) + return ProxyAutoDeleted(nullptr, base::OnTaskRunnerDeleter(nullptr)); + + return ProxyAutoDeleted( + new SynchronousCompositorProxyRegistry(compositor_task_runner), + base::OnTaskRunnerDeleter(compositor_task_runner)); + } + + void CreateProxy(ui::SynchronousInputHandlerProxy* handler) { + DCHECK(compositor_task_runner_->BelongsToCurrentThread()); + proxy_ = std::make_unique<SynchronousCompositorProxyMojo>(handler); + proxy_->Init(); + + if (sink_) + proxy_->SetLayerTreeFrameSink(sink_); + } + + SynchronousCompositorProxyMojo* proxy() { return proxy_.get(); } + + void RegisterLayerTreeFrameSink( + int routing_id, + SynchronousLayerTreeFrameSink* layer_tree_frame_sink) override { + DCHECK(compositor_task_runner_->BelongsToCurrentThread()); + DCHECK_EQ(nullptr, sink_); + sink_ = layer_tree_frame_sink; + if (proxy_) + proxy_->SetLayerTreeFrameSink(layer_tree_frame_sink); + } + + void UnregisterLayerTreeFrameSink( + int routing_id, + SynchronousLayerTreeFrameSink* layer_tree_frame_sink) override { + DCHECK(compositor_task_runner_->BelongsToCurrentThread()); + DCHECK_EQ(layer_tree_frame_sink, sink_); + sink_ = nullptr; + } + + private: + scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_; + std::unique_ptr<SynchronousCompositorProxyMojo> proxy_; + SynchronousLayerTreeFrameSink* sink_ = nullptr; +}; + +#endif + scoped_refptr<WidgetInputHandlerManager> WidgetInputHandlerManager::Create( base::WeakPtr<RenderWidget> render_widget, scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner, @@ -59,21 +127,33 @@ renderer_scheduler_(renderer_scheduler), input_event_queue_(render_widget->GetInputEventQueue()), main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()), - compositor_task_runner_(compositor_task_runner) { + compositor_task_runner_(std::move(compositor_task_runner)) +#if defined(OS_ANDROID) + , + synchronous_compositor_registry_( + SynchronousCompositorProxyRegistry::Create(compositor_task_runner_)) +#endif +{ } void WidgetInputHandlerManager::Init() { if (compositor_task_runner_) { + bool sync_compositing = false; +#if defined(OS_ANDROID) + sync_compositing = GetContentClient()->UsingSynchronousCompositing(); +#endif + compositor_task_runner_->PostTask( FROM_HERE, base::BindOnce( &WidgetInputHandlerManager::InitOnCompositorThread, this, render_widget_->compositor()->GetInputHandler(), - render_widget_->compositor_deps()->IsScrollAnimatorEnabled())); + render_widget_->compositor_deps()->IsScrollAnimatorEnabled(), + sync_compositing)); } } -WidgetInputHandlerManager::~WidgetInputHandlerManager() {} +WidgetInputHandlerManager::~WidgetInputHandlerManager() = default; void WidgetInputHandlerManager::AddAssociatedInterface( mojom::WidgetInputHandlerAssociatedRequest request, @@ -214,6 +294,17 @@ return nullptr; } +void WidgetInputHandlerManager::AttachSynchronousCompositor( + mojom::SynchronousCompositorControlHostPtr control_host, + mojom::SynchronousCompositorHostAssociatedPtrInfo host, + mojom::SynchronousCompositorAssociatedRequest compositor_request) { +#if defined(OS_ANDROID) + DCHECK(synchronous_compositor_registry_); + synchronous_compositor_registry_->proxy()->BindChannel( + std::move(control_host), std::move(host), std::move(compositor_request)); +#endif +} + void WidgetInputHandlerManager::ObserveGestureEventOnMainThread( const blink::WebGestureEvent& gesture_event, const cc::InputHandlerScrollResult& scroll_result) { @@ -272,12 +363,20 @@ void WidgetInputHandlerManager::InitOnCompositorThread( const base::WeakPtr<cc::InputHandler>& input_handler, - bool smooth_scroll_enabled) { + bool smooth_scroll_enabled, + bool sync_compositing) { input_handler_proxy_ = std::make_unique<ui::InputHandlerProxy>( input_handler.get(), this, base::FeatureList::IsEnabled(features::kTouchpadAndWheelScrollLatching), base::FeatureList::IsEnabled(features::kAsyncWheelEvents)); input_handler_proxy_->set_smooth_scroll_enabled(smooth_scroll_enabled); + +#if defined(OS_ANDROID) + if (sync_compositing) { + DCHECK(synchronous_compositor_registry_); + synchronous_compositor_registry_->CreateProxy(input_handler_proxy_.get()); + } +#endif } void WidgetInputHandlerManager::BindAssociatedChannel( @@ -415,4 +514,12 @@ ->ObserveGestureEventAndResult(gesture_event, scroll_result); } +#if defined(OS_ANDROID) +content::SynchronousCompositorRegistry* +WidgetInputHandlerManager::GetSynchronousCompositorRegistry() { + DCHECK(synchronous_compositor_registry_); + return synchronous_compositor_registry_.get(); +} +#endif + } // namespace content
diff --git a/content/renderer/input/widget_input_handler_manager.h b/content/renderer/input/widget_input_handler_manager.h index 6c44b42..bee80b0e 100644 --- a/content/renderer/input/widget_input_handler_manager.h +++ b/content/renderer/input/widget_input_handler_manager.h
@@ -5,6 +5,7 @@ #ifndef CONTENT_RENDERER_INPUT_WIDGET_INPUT_HANDLER_MANAGER_H_ #define CONTENT_RENDERER_INPUT_WIDGET_INPUT_HANDLER_MANAGER_H_ +#include "build/build_config.h" #include "content/common/content_export.h" #include "content/common/input/input_handler.mojom.h" #include "content/renderer/render_frame_impl.h" @@ -21,6 +22,8 @@ namespace content { class MainThreadEventQueue; +class SynchronousCompositorRegistry; +class SynchronousCompositorProxyRegistry; // This class maintains the compositor InputHandlerProxy and is // responsible for passing input events on the compositor and main threads. @@ -76,6 +79,15 @@ mojom::WidgetInputHandlerHost* GetWidgetInputHandlerHost(); + void AttachSynchronousCompositor( + mojom::SynchronousCompositorControlHostPtr control_host, + mojom::SynchronousCompositorHostAssociatedPtrInfo host, + mojom::SynchronousCompositorAssociatedRequest compositor_request); + +#if defined(OS_ANDROID) + content::SynchronousCompositorRegistry* GetSynchronousCompositorRegistry(); +#endif + protected: friend class base::RefCountedThreadSafe<WidgetInputHandlerManager>; ~WidgetInputHandlerManager() override; @@ -88,7 +100,8 @@ void Init(); void InitOnCompositorThread( const base::WeakPtr<cc::InputHandler>& input_handler, - bool smooth_scroll_enabled); + bool smooth_scroll_enabled, + bool sync_compositing); void BindAssociatedChannel( mojom::WidgetInputHandlerAssociatedRequest request); void BindChannel(mojom::WidgetInputHandlerRequest request); @@ -136,6 +149,11 @@ scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_; +#if defined(OS_ANDROID) + std::unique_ptr<SynchronousCompositorProxyRegistry, base::OnTaskRunnerDeleter> + synchronous_compositor_registry_; +#endif + DISALLOW_COPY_AND_ASSIGN(WidgetInputHandlerManager); };
diff --git a/content/renderer/media/media_factory.cc b/content/renderer/media/media_factory.cc index d938838..47a8f8c 100644 --- a/content/renderer/media/media_factory.cc +++ b/content/renderer/media/media_factory.cc
@@ -325,7 +325,10 @@ std::move(metrics_provider), base::Bind(&blink::WebSurfaceLayerBridge::Create, layer_tree_view), RenderThreadImpl::current()->SharedMainThreadContextProvider(), - use_surface_layer_for_video)); + use_surface_layer_for_video, + base::BindRepeating( + &RenderFrameImpl::OnPictureInPictureSurfaceIdUpdated, + base::Unretained(render_frame_)))); std::unique_ptr<media::VideoFrameCompositor> vfc = std::make_unique<media::VideoFrameCompositor>(
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.cc b/content/renderer/media/renderer_webmediaplayer_delegate.cc index 8137066c..f773ac55 100644 --- a/content/renderer/media/renderer_webmediaplayer_delegate.cc +++ b/content/renderer/media/renderer_webmediaplayer_delegate.cc
@@ -15,7 +15,7 @@ #include "content/public/renderer/content_renderer_client.h" #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_thread.h" -#include "third_party/WebKit/public/platform/WebMediaPlayer.h" +#include "third_party/WebKit/public/platform/WebFullscreenVideoStatus.h" #include "third_party/WebKit/public/web/WebScopedUserGesture.h" #include "ui/gfx/geometry/size.h" @@ -186,9 +186,9 @@ void RendererWebMediaPlayerDelegate::SetIsEffectivelyFullscreen( int player_id, - bool is_fullscreen) { + blink::WebFullscreenVideoStatus fullscreen_video_status) { Send(new MediaPlayerDelegateHostMsg_OnMediaEffectivelyFullscreenChanged( - routing_id(), player_id, is_fullscreen)); + routing_id(), player_id, fullscreen_video_status)); } void RendererWebMediaPlayerDelegate::DidPlayerSizeChange(
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.h b/content/renderer/media/renderer_webmediaplayer_delegate.h index 65dea01..8f1fcbe 100644 --- a/content/renderer/media/renderer_webmediaplayer_delegate.h +++ b/content/renderer/media/renderer_webmediaplayer_delegate.h
@@ -24,6 +24,10 @@ #include "base/time/time.h" #endif // OS_ANDROID +namespace blink { +enum class WebFullscreenVideoStatus; +} + namespace media { enum class MediaContentType; @@ -56,7 +60,9 @@ bool IsIdle(int player_id) override; void ClearStaleFlag(int player_id) override; bool IsStale(int player_id) override; - void SetIsEffectivelyFullscreen(int player_id, bool is_fullscreen) override; + void SetIsEffectivelyFullscreen( + int player_id, + blink::WebFullscreenVideoStatus fullscreen_video_status) override; void DidPlayerSizeChange(int delegate_id, const gfx::Size& size) override; void DidPlayerMutedStatusChange(int delegate_id, bool muted) override;
diff --git a/content/renderer/media/stream/user_media_processor.cc b/content/renderer/media/stream/user_media_processor.cc index 951e363..2aa73e4 100644 --- a/content/renderer/media/stream/user_media_processor.cc +++ b/content/renderer/media/stream/user_media_processor.cc
@@ -686,16 +686,24 @@ GetMediaDevicesDispatcher()->GetAllVideoInputDeviceFormats( video_device.id, base::BindOnce(&UserMediaProcessor::GotAllVideoInputFormatsForDevice, - weak_factory_.GetWeakPtr(), label, video_device.id)); + weak_factory_.GetWeakPtr(), + current_request_info_->web_request(), label, + video_device.id)); } } void UserMediaProcessor::GotAllVideoInputFormatsForDevice( + const blink::WebUserMediaRequest& web_request, const std::string& label, const std::string& device_id, const media::VideoCaptureFormats& formats) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(current_request_info_); + // The frame might reload or |web_request| might be cancelled while video + // formats are queried. Do nothing if a different request is being processed + // at this point. + if (!IsCurrentRequestInfo(web_request)) + return; + current_request_info_->AddVideoFormats(device_id, formats); if (current_request_info_->CanStartTracks()) StartTracks(label);
diff --git a/content/renderer/media/stream/user_media_processor.h b/content/renderer/media/stream/user_media_processor.h index baded653..de3eff05 100644 --- a/content/renderer/media/stream/user_media_processor.h +++ b/content/renderer/media/stream/user_media_processor.h
@@ -148,6 +148,7 @@ const MediaStreamDevices& video_devices); void GotAllVideoInputFormatsForDevice( + const blink::WebUserMediaRequest& web_request, const std::string& label, const std::string& device_id, const media::VideoCaptureFormats& formats);
diff --git a/content/renderer/media/stream/webmediaplayer_ms.cc b/content/renderer/media/stream/webmediaplayer_ms.cc index 384e7b5..54d586b 100644 --- a/content/renderer/media/stream/webmediaplayer_ms.cc +++ b/content/renderer/media/stream/webmediaplayer_ms.cc
@@ -547,7 +547,11 @@ delegate_->DidPlayerMutedStatusChange(delegate_id_, volume == 0.0); } -void WebMediaPlayerMS::PictureInPicture() {} +void WebMediaPlayerMS::EnterPictureInPicture() { + NOTIMPLEMENTED(); + // TODO(apacible): Implement after video in surfaces is supported for + // WebMediaPlayerMS. See http://crbug/746182. +} void WebMediaPlayerMS::SetSinkId( const blink::WebString& sink_id,
diff --git a/content/renderer/media/stream/webmediaplayer_ms.h b/content/renderer/media/stream/webmediaplayer_ms.h index ab98e189..b2770e2 100644 --- a/content/renderer/media/stream/webmediaplayer_ms.h +++ b/content/renderer/media/stream/webmediaplayer_ms.h
@@ -98,7 +98,7 @@ void Seek(double seconds) override; void SetRate(double rate) override; void SetVolume(double volume) override; - void PictureInPicture() override; + void EnterPictureInPicture() override; void SetSinkId(const blink::WebString& sink_id, const blink::WebSecurityOrigin& security_origin, blink::WebSetSinkIdCallbacks* web_callback) override;
diff --git a/content/renderer/media/stream/webmediaplayer_ms_unittest.cc b/content/renderer/media/stream/webmediaplayer_ms_unittest.cc index 646456a..e5f00a6 100644 --- a/content/renderer/media/stream/webmediaplayer_ms_unittest.cc +++ b/content/renderer/media/stream/webmediaplayer_ms_unittest.cc
@@ -16,6 +16,7 @@ #include "media/base/video_frame.h" #include "media/video/mock_gpu_memory_buffer_video_frame_pool.h" #include "media/video/mock_gpu_video_accelerator_factories.h" +#include "third_party/WebKit/public/platform/WebFullscreenVideoStatus.h" #include "third_party/WebKit/public/platform/WebLayer.h" #include "third_party/WebKit/public/platform/WebMediaPlayer.h" #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h" @@ -106,8 +107,9 @@ return false; } - void SetIsEffectivelyFullscreen(int delegate_id, - bool is_fullscreen) override { + void SetIsEffectivelyFullscreen( + int delegate_id, + blink::WebFullscreenVideoStatus fullscreen_video_status) override { EXPECT_EQ(delegate_id_, delegate_id); } @@ -527,6 +529,7 @@ blink::WebLocalizedString::Name error_msg) override {} void PictureInPictureStarted() override {} void PictureInPictureStopped() override {} + bool IsInPictureInPictureMode() override { return false; } // Implementation of cc::VideoFrameProvider::Client void StopUsingProvider() override;
diff --git a/content/renderer/media/webrtc/peer_connection_tracker_unittest.cc b/content/renderer/media/webrtc/peer_connection_tracker_unittest.cc index d0b242b6..cb0d1de 100644 --- a/content/renderer/media/webrtc/peer_connection_tracker_unittest.cc +++ b/content/renderer/media/webrtc/peer_connection_tracker_unittest.cc
@@ -40,7 +40,8 @@ mojom::PeerConnectionTrackerHostAssociatedPtr peer_connection_tracker_host_ptr_; binding_.Bind(mojo::MakeRequestAssociatedWithDedicatedPipe( - &peer_connection_tracker_host_ptr_)); + &peer_connection_tracker_host_ptr_), + blink::scheduler::GetSingleThreadTaskRunnerForTesting()); return peer_connection_tracker_host_ptr_; } mojo::AssociatedBinding<mojom::PeerConnectionTrackerHost> binding_;
diff --git a/content/renderer/media_capture_from_element/html_video_element_capturer_source_unittest.cc b/content/renderer/media_capture_from_element/html_video_element_capturer_source_unittest.cc index 21761d4f..53955351 100644 --- a/content/renderer/media_capture_from_element/html_video_element_capturer_source_unittest.cc +++ b/content/renderer/media_capture_from_element/html_video_element_capturer_source_unittest.cc
@@ -39,7 +39,7 @@ void Seek(double seconds) override {} void SetRate(double) override {} void SetVolume(double) override {} - void PictureInPicture() override {} + void EnterPictureInPicture() override {} blink::WebTimeRanges Buffered() const override { return blink::WebTimeRanges(); }
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 0565b98..4130b30 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -5976,7 +5976,10 @@ info.url_request.CheckForBrowserSideNavigation() && // No need to dispatch beforeunload if the frame has not committed a // navigation and contains an empty initial document. - (has_accessed_initial_document_ || !current_history_item_.IsNull()); + (has_accessed_initial_document_ || !current_history_item_.IsNull()) && + // Don't dispatch beforeunload if the navigation might end up as a + // download. + !info.url_request.GetSuggestedFilename().has_value(); if (should_dispatch_before_unload) { // Execute the BeforeUnload event. If asked not to proceed or the frame is @@ -7130,6 +7133,11 @@ Send(new FrameHostMsg_FrameDidCallFocus(routing_id_)); } +void RenderFrameImpl::OnPictureInPictureSurfaceIdUpdated( + const viz::SurfaceId& surface_id) { + GetFrameHost()->OnUpdatePictureInPictureSurfaceId(surface_id); +} + void RenderFrameImpl::SetAccessibilityModeForTest(ui::AXMode new_mode) { OnSetAccessibilityMode(new_mode); }
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 405640c..6cd879b0 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -877,6 +877,9 @@ // frame. void FrameDidCallFocus(); + // Send SurfaceId information to FrameHost to use for Picture-in-Picture. + void OnPictureInPictureSurfaceIdUpdated(const viz::SurfaceId& surface_id); + protected: explicit RenderFrameImpl(CreateParams params);
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 5cd395f..e709734a 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -98,6 +98,7 @@ #include "content/renderer/input/input_event_filter.h" #include "content/renderer/input/input_handler_manager.h" #include "content/renderer/input/main_thread_input_event_filter.h" +#include "content/renderer/input/widget_input_handler_manager.h" #include "content/renderer/loader/resource_dispatcher.h" #include "content/renderer/media/audio_input_message_filter.h" #include "content/renderer/media/audio_message_filter.h" @@ -183,6 +184,7 @@ #if defined(OS_ANDROID) #include <cpu-features.h> #include "content/renderer/android/synchronous_compositor_filter.h" +#include "content/renderer/android/synchronous_compositor_proxy.h" #include "content/renderer/android/synchronous_layer_tree_frame_sink.h" #include "content/renderer/media/android/stream_texture_factory.h" #include "media/base/android/media_codec_util.h" @@ -1322,12 +1324,6 @@ input_handler_manager_.reset(new InputHandlerManager( compositor_task_runner_, input_handler_manager_client, synchronous_input_handler_proxy_client, renderer_scheduler_.get())); - } else { -#if defined(OS_ANDROID) - // TODO(dtapuska): Implement a mojo channel for the synchronous - // compositor android webview uses. - DCHECK(!GetContentClient()->UsingSynchronousCompositing()); -#endif } } @@ -1666,7 +1662,7 @@ } bool RenderThreadImpl::EnableStreamTextureCopy() { - return sync_compositor_message_filter_.get(); + return GetContentClient()->UsingSynchronousCompositing(); } #endif @@ -2209,15 +2205,34 @@ } #if defined(OS_ANDROID) - if (sync_compositor_message_filter_) { - callback.Run(std::make_unique<SynchronousLayerTreeFrameSink>( - std::move(context_provider), std::move(worker_context_provider), - compositor_task_runner_, GetGpuMemoryBufferManager(), routing_id, - g_next_layer_tree_frame_sink_id++, - std::move(params.synthetic_begin_frame_source), - sync_compositor_message_filter_.get(), - std::move(frame_swap_message_queue))); - return; + if (GetContentClient()->UsingSynchronousCompositing()) { + if (base::FeatureList::IsEnabled(features::kMojoInputMessages)) { + RenderViewImpl* view = RenderViewImpl::FromRoutingID(routing_id); + if (view) { + callback.Run(std::make_unique<SynchronousLayerTreeFrameSink>( + std::move(context_provider), std::move(worker_context_provider), + compositor_task_runner_, GetGpuMemoryBufferManager(), + sync_message_filter(), routing_id, + g_next_layer_tree_frame_sink_id++, + std::move(params.synthetic_begin_frame_source), + view->widget_input_handler_manager() + ->GetSynchronousCompositorRegistry(), + std::move(frame_swap_message_queue))); + return; + } else { + NOTREACHED(); + } + } else { + callback.Run(std::make_unique<SynchronousLayerTreeFrameSink>( + std::move(context_provider), std::move(worker_context_provider), + compositor_task_runner_, GetGpuMemoryBufferManager(), + sync_compositor_message_filter_.get(), routing_id, + g_next_layer_tree_frame_sink_id++, + std::move(params.synthetic_begin_frame_source), + sync_compositor_message_filter_.get(), + std::move(frame_swap_message_queue))); + return; + } } #endif frame_sink_provider_->CreateForWidget(
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 69b9e743..7769daf 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc
@@ -865,6 +865,7 @@ web_view->SetIgnoreViewportTagScaleLimits(prefs.force_enable_zoom); settings->SetAutoZoomFocusedNodeToLegibleScale(true); settings->SetDoubleTapToZoomEnabled(prefs.double_tap_to_zoom_enabled); + settings->SetPictureInPictureEnabled(prefs.picture_in_picture_enabled); settings->SetMediaPlaybackGestureWhitelistScope( blink::WebString::FromUTF8(prefs.media_playback_gesture_whitelist_scope)); settings->SetDefaultVideoPosterURL(
diff --git a/content/test/mock_widget_input_handler.cc b/content/test/mock_widget_input_handler.cc index 3772bce..96804b0 100644 --- a/content/test/mock_widget_input_handler.cc +++ b/content/test/mock_widget_input_handler.cc
@@ -104,6 +104,11 @@ return dispatched_events; } +void MockWidgetInputHandler::AttachSynchronousCompositor( + mojom::SynchronousCompositorControlHostPtr control_host, + mojom::SynchronousCompositorHostAssociatedPtrInfo host, + mojom::SynchronousCompositorAssociatedRequest compositor_request) {} + MockWidgetInputHandler::DispatchedMessage::DispatchedMessage( const std::string& name) : name_(name) {}
diff --git a/content/test/mock_widget_input_handler.h b/content/test/mock_widget_input_handler.h index 0001dee..030bc28 100644 --- a/content/test/mock_widget_input_handler.h +++ b/content/test/mock_widget_input_handler.h
@@ -215,6 +215,11 @@ DispatchEventCallback callback) override; void DispatchNonBlockingEvent( std::unique_ptr<content::InputEvent> event) override; + void AttachSynchronousCompositor( + mojom::SynchronousCompositorControlHostPtr control_host, + mojom::SynchronousCompositorHostAssociatedPtrInfo host, + mojom::SynchronousCompositorAssociatedRequest compositor_request) + override; using MessageVector = std::vector<std::unique_ptr<DispatchedMessage>>; MessageVector GetAndResetDispatchedMessages();
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc index 9fe472a..71caf76 100644 --- a/content/test/test_render_frame.cc +++ b/content/test/test_render_frame.cc
@@ -109,6 +109,9 @@ void FrameRectsChanged(const gfx::Rect& frame_rect) override {} + void OnUpdatePictureInPictureSurfaceId( + const viz::SurfaceId& surface_id) override {} + private: std::unique_ptr<FrameHostMsg_DidCommitProvisionalLoad_Params> last_commit_params_;
diff --git a/docs/testing/web_platform_tests.md b/docs/testing/web_platform_tests.md index c8bb0e47..44d8477e 100644 --- a/docs/testing/web_platform_tests.md +++ b/docs/testing/web_platform_tests.md
@@ -110,6 +110,20 @@ for [wpt-importer builder](https://build.chromium.org/p/chromium.infra.cron/builders/wpt-importer). +### GitHub credentials + +When manually running the `wpt-import` and `wpt-export` scripts, several +requests are made to GitHub to query the status of pull requests, look for +existing exported commits etc. GitHub has a [fairly +low](https://developer.github.com/v3/#rate-limiting) request limit for +unauthenticated requests, so it is recommended that you let `wpt-export` and +`wpt-import` use your GitHub credentials when sending requests: + + 1. Generate a new [personal access token](https://github.com/settings/tokens) + 1. Create a JSON file with two keys: `GH_USER`, your GitHub user name, and + `GH_TOKEN`, the access token you have just generated. + 1. Pass `--credentials-json <path-to-json>` to `wpt-export` and `wpt-import`. + ### Manual import To pull the latest versions of the tests that are currently being imported, you @@ -120,6 +134,10 @@ upstream repositories. If any new versions of tests are found, they will be committed locally to your local repository. You may then upload the changes. +Remember your import might fail due to GitHub's limit for unauthenticated +requests, so consider [passing your GitHub credentials](#GitHub-credentials) to +the script. + ### Enabling import for a new directory If you wish to add more tests (by un-skipping some of the directories currently @@ -127,7 +145,11 @@ it, and on the next auto-import, the new tests should be imported. If you want to import immediately (in order to try the tests out locally, etc) -you can also run `wpt-import --allow-local-commits`, but this is not required. +you can also run `wpt-import`, but this is not required. + +Remember your import might fail due to GitHub's limit for unauthenticated +requests, so consider [passing your GitHub credentials](#GitHub-credentials) to +the script. ## Writing tests
diff --git a/extensions/shell/browser/shell_special_storage_policy.cc b/extensions/shell/browser/shell_special_storage_policy.cc index dc951c8..65cc2db 100644 --- a/extensions/shell/browser/shell_special_storage_policy.cc +++ b/extensions/shell/browser/shell_special_storage_policy.cc
@@ -30,8 +30,7 @@ return false; } -bool ShellSpecialStoragePolicy::IsStorageSessionOnlyOrBlocked( - const GURL& origin) { +bool ShellSpecialStoragePolicy::ShouldDeleteCookieOnExit(const GURL& origin) { return false; }
diff --git a/extensions/shell/browser/shell_special_storage_policy.h b/extensions/shell/browser/shell_special_storage_policy.h index 33f9850b..221344b 100644 --- a/extensions/shell/browser/shell_special_storage_policy.h +++ b/extensions/shell/browser/shell_special_storage_policy.h
@@ -20,7 +20,7 @@ bool IsStorageUnlimited(const GURL& origin) override; bool IsStorageDurable(const GURL& origin) override; bool IsStorageSessionOnly(const GURL& origin) override; - bool IsStorageSessionOnlyOrBlocked(const GURL& origin) override; + bool ShouldDeleteCookieOnExit(const GURL& origin) override; bool HasIsolatedStorage(const GURL& origin) override; bool HasSessionOnlyOrigins() override;
diff --git a/gpu/command_buffer/service/context_state.cc b/gpu/command_buffer/service/context_state.cc index 3f9a3484..324f461 100644 --- a/gpu/command_buffer/service/context_state.cc +++ b/gpu/command_buffer/service/context_state.cc
@@ -29,6 +29,16 @@ ? unit.bound_texture_2d->service_id() : 0; } +GLuint Get2dArrayServiceId(const TextureUnit& unit) { + return unit.bound_texture_2d_array.get() + ? unit.bound_texture_2d_array->service_id() + : 0; +} + +GLuint Get3dServiceId(const TextureUnit& unit) { + return unit.bound_texture_3d.get() ? unit.bound_texture_3d->service_id() : 0; +} + GLuint GetCubeServiceId(const TextureUnit& unit) { return unit.bound_texture_cube_map.get() ? unit.bound_texture_cube_map->service_id() : 0; @@ -237,6 +247,8 @@ DCHECK_LT(unit, texture_units.size()); const TextureUnit& texture_unit = texture_units[unit]; GLuint service_id_2d = Get2dServiceId(texture_unit); + GLuint service_id_2d_array = Get2dArrayServiceId(texture_unit); + GLuint service_id_3d = Get3dServiceId(texture_unit); GLuint service_id_cube = GetCubeServiceId(texture_unit); GLuint service_id_oes = GetOesServiceId(texture_unit); GLuint service_id_arb = GetArbServiceId(texture_unit); @@ -247,10 +259,22 @@ feature_info_->feature_flags().oes_egl_image_external || feature_info_->feature_flags().nv_egl_stream_consumer_external; bool bind_texture_arb = feature_info_->feature_flags().arb_texture_rectangle; + // TEXTURE_2D_ARRAY and TEXTURE_3D are only applicable from ES3 version. + // So set it to FALSE by default. + bool bind_texture_2d_array = false; + bool bind_texture_3d = false; + // set the variables to true only if the application is ES3 or newer + if (feature_info_->IsES3Capable()) { + bind_texture_2d_array = true; + bind_texture_3d = true; + } if (prev_state) { const TextureUnit& prev_unit = prev_state->texture_units[unit]; bind_texture_2d = service_id_2d != Get2dServiceId(prev_unit); + bind_texture_2d_array = + service_id_2d_array != Get2dArrayServiceId(prev_unit); + bind_texture_3d = service_id_3d != Get3dServiceId(prev_unit); bind_texture_cube = service_id_cube != GetCubeServiceId(prev_unit); bind_texture_oes = bind_texture_oes && service_id_oes != GetOesServiceId(prev_unit); @@ -259,8 +283,8 @@ } // Early-out if nothing has changed from the previous state. - if (!bind_texture_2d && !bind_texture_cube - && !bind_texture_oes && !bind_texture_arb) { + if (!bind_texture_2d && !bind_texture_2d_array && !bind_texture_3d && + !bind_texture_cube && !bind_texture_oes && !bind_texture_arb) { return; } @@ -277,6 +301,12 @@ if (bind_texture_arb) { api()->glBindTextureFn(GL_TEXTURE_RECTANGLE_ARB, service_id_arb); } + if (bind_texture_2d_array) { + api()->glBindTextureFn(GL_TEXTURE_2D_ARRAY, service_id_2d_array); + } + if (bind_texture_3d) { + api()->glBindTextureFn(GL_TEXTURE_3D, service_id_3d); + } } void ContextState::RestoreSamplerBinding(GLuint unit,
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc index 3765e69..78c1832 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc
@@ -418,6 +418,8 @@ AddExpectationsForActiveTexture(GL_TEXTURE0); AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP, 0); + AddExpectationsForBindTexture(GL_TEXTURE_2D_ARRAY, 0); + AddExpectationsForBindTexture(GL_TEXTURE_3D, 0); // Expect to restore sampler binding for unit GL_TEXTURE0. AddExpectationsForBindSampler(0, kServiceSamplerId); @@ -426,6 +428,8 @@ AddExpectationsForActiveTexture(GL_TEXTURE0 + i); AddExpectationsForBindTexture(GL_TEXTURE_2D, 0); AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP, 0); + AddExpectationsForBindTexture(GL_TEXTURE_2D_ARRAY, 0); + AddExpectationsForBindTexture(GL_TEXTURE_3D, 0); AddExpectationsForBindSampler(i, 0); }
diff --git a/gpu/command_buffer/tests/gl_manager.cc b/gpu/command_buffer/tests/gl_manager.cc index 336c7cc..e068885 100644 --- a/gpu/command_buffer/tests/gl_manager.cc +++ b/gpu/command_buffer/tests/gl_manager.cc
@@ -269,6 +269,7 @@ InitializeGpuPreferencesForTestingFromCommandLine(command_line, &gpu_preferences_); + context_type_ = options.context_type; if (options.share_mailbox_manager) { mailbox_manager_ = options.share_mailbox_manager->mailbox_manager(); } else if (options.share_group_manager) { @@ -574,4 +575,7 @@ void GLManager::SetSnapshotRequested() {} +ContextType GLManager::GetContextType() const { + return context_type_; +} } // namespace gpu
diff --git a/gpu/command_buffer/tests/gl_manager.h b/gpu/command_buffer/tests/gl_manager.h index bfe6d15e..56b9bf0 100644 --- a/gpu/command_buffer/tests/gl_manager.h +++ b/gpu/command_buffer/tests/gl_manager.h
@@ -155,6 +155,7 @@ void SetSnapshotRequested() override; size_t GetSharedMemoryBytesAllocated() const; + ContextType GetContextType() const; private: void SetupBaseContext(); @@ -192,6 +193,7 @@ static scoped_refptr<gl::GLShareGroup>* base_share_group_; static scoped_refptr<gl::GLSurface>* base_surface_; static scoped_refptr<gl::GLContext>* base_context_; + ContextType context_type_ = CONTEXT_TYPE_OPENGLES2; }; } // namespace gpu
diff --git a/gpu/command_buffer/tests/gl_virtual_contexts_unittest.cc b/gpu/command_buffer/tests/gl_virtual_contexts_unittest.cc index b4de3d4..82bd266f 100644 --- a/gpu/command_buffer/tests/gl_virtual_contexts_unittest.cc +++ b/gpu/command_buffer/tests/gl_virtual_contexts_unittest.cc
@@ -27,8 +27,15 @@ void SetUp() override { GpuDriverBugWorkarounds workarounds = GetParam(); GLManager::Options options; + options.context_type = CONTEXT_TYPE_OPENGLES3; options.size = gfx::Size(kSize0, kSize0); gl_real_.InitializeWithWorkarounds(options, workarounds); + // If the gl_real context is not initialised, switch to ES2 context type + // and re-initialise + if (!gl_real_.IsInitialized()) { + options.context_type = CONTEXT_TYPE_OPENGLES2; + gl_real_.InitializeWithWorkarounds(options, workarounds); + } gl_real_shared_.InitializeWithWorkarounds(options, workarounds); options.virtual_manager = &gl_real_shared_; options.size = gfx::Size(kSize1, kSize1); @@ -363,6 +370,57 @@ } } +// http://crbug.com/930327 +TEST_P(GLVirtualContextsTest, Texture2DArrayAnd3DRestore) { + // This test should only be run for ES3 or higher context + // So if the current version is ES2, do not run this test + if (gl1_.GetContextType() == CONTEXT_TYPE_OPENGLES2) + return; + + // Context 1 + gl1_.MakeCurrent(); + GLuint tex1_2d_array = 0, tex1_3d = 0; + glActiveTexture(GL_TEXTURE0); + // 2d array texture + glGenTextures(1, &tex1_2d_array); + glBindTexture(GL_TEXTURE_2D_ARRAY, tex1_2d_array); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + // 3d texture + glGenTextures(1, &tex1_3d); + glBindTexture(GL_TEXTURE_3D, tex1_3d); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, + GL_NEAREST_MIPMAP_NEAREST); + glFinish(); + + // switch to context 2 + gl2_.MakeCurrent(); + GLuint tex2_2d_array = 0, tex2_3d = 0; + glActiveTexture(GL_TEXTURE0); + // 2d array texture + glGenTextures(1, &tex2_2d_array); + glBindTexture(GL_TEXTURE_2D_ARRAY, tex2_2d_array); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + // 3d texture + glGenTextures(1, &tex2_3d); + glBindTexture(GL_TEXTURE_3D, tex2_3d); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, + GL_LINEAR_MIPMAP_LINEAR); + glFinish(); + + // switch back to context1 + gl1_.MakeCurrent(); + + // get the texture parameters which were programmed earlier for context1 + GLint tex_2d_array_params = 0, tex_3d_params = 0; + glGetTexParameteriv(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, + &tex_2d_array_params); + glGetTexParameteriv(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, &tex_3d_params); + // Do checks to make sure texture params are restored correctly after context + // switching + EXPECT_EQ(GL_NEAREST, tex_2d_array_params); + EXPECT_EQ(GL_NEAREST_MIPMAP_NEAREST, tex_3d_params); + GLTestHelper::CheckGLError("no errors", __LINE__); +} static const GpuDriverBugWorkarounds workarounds_cases[] = { // No extra workarounds. GpuDriverBugWorkarounds(),
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm index be05f6b9..dcae4f2 100644 --- a/ios/chrome/app/main_controller.mm +++ b/ios/chrome/app/main_controller.mm
@@ -65,7 +65,6 @@ #include "ios/chrome/browser/browser_state/chrome_browser_state_removal_controller.h" #import "ios/chrome/browser/browsing_data/browsing_data_removal_controller.h" #include "ios/chrome/browser/browsing_data/browsing_data_remove_mask.h" -#include "ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h" #include "ios/chrome/browser/chrome_paths.h" #include "ios/chrome/browser/chrome_url_constants.h" #import "ios/chrome/browser/chrome_url_util.h" @@ -864,8 +863,7 @@ if (IsIPadIdiom() || _tabSwitcherIsActive) [_tabSwitcher setOtrTabModel:nil]; - [_browserViewWrangler - deleteIncognitoTabModelState:self.browsingDataRemovalController]; + [_browserViewWrangler deleteIncognitoTabModelState]; if (otrBVCIsCurrent) { [self activateBVCAndMakeCurrentBVCPrimary];
diff --git a/ios/chrome/browser/browser_state/BUILD.gn b/ios/chrome/browser/browser_state/BUILD.gn index f8468d28..73fa0a2 100644 --- a/ios/chrome/browser/browser_state/BUILD.gn +++ b/ios/chrome/browser/browser_state/BUILD.gn
@@ -80,6 +80,7 @@ "//ios/chrome/browser/autofill", "//ios/chrome/browser/bookmarks", "//ios/chrome/browser/browser_state_metrics", + "//ios/chrome/browser/browsing_data", "//ios/chrome/browser/content_settings", "//ios/chrome/browser/desktop_promotion", "//ios/chrome/browser/dom_distiller",
diff --git a/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm b/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm index 83e5442..62631bf 100644 --- a/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm +++ b/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm
@@ -11,6 +11,7 @@ #include "ios/chrome/browser/autofill/personal_data_manager_factory.h" #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h" #include "ios/chrome/browser/bookmarks/startup_task_runner_service_factory.h" +#include "ios/chrome/browser/browsing_data/browsing_data_remover_factory.h" #include "ios/chrome/browser/content_settings/cookie_settings_factory.h" #include "ios/chrome/browser/desktop_promotion/desktop_promotion_sync_service_factory.h" #include "ios/chrome/browser/dom_distiller/dom_distiller_service_factory.h" @@ -101,6 +102,7 @@ AuthenticationServiceFactory::GetInstance(); BrowserListFactory::GetInstance(); BrowserListSessionServiceFactory::GetInstance(); + BrowsingDataRemoverFactory::GetInstance(); DesktopPromotionSyncServiceFactory::GetInstance(); feature_engagement::TrackerFactory::GetInstance(); IOSChromeGCMProfileServiceFactory::GetInstance();
diff --git a/ios/chrome/browser/browsing_data/BUILD.gn b/ios/chrome/browser/browsing_data/BUILD.gn index 66f21d1..b60c79a 100644 --- a/ios/chrome/browser/browsing_data/BUILD.gn +++ b/ios/chrome/browser/browsing_data/BUILD.gn
@@ -11,8 +11,11 @@ source_set("browsing_data") { sources = [ - "ios_chrome_browsing_data_remover.h", - "ios_chrome_browsing_data_remover.mm", + "browsing_data_remover.h", + "browsing_data_remover_factory.cc", + "browsing_data_remover_factory.h", + "browsing_data_remover_impl.h", + "browsing_data_remover_impl.mm", ] deps = [ "//base", @@ -21,6 +24,7 @@ "//components/browsing_data/core", "//components/history/core/browser", "//components/keyed_service/core", + "//components/keyed_service/ios", "//components/language/core/browser", "//components/omnibox/browser", "//components/open_from_clipboard",
diff --git a/ios/chrome/browser/browsing_data/DEPS b/ios/chrome/browser/browsing_data/DEPS index 9341476..d1676ea7 100644 --- a/ios/chrome/browser/browsing_data/DEPS +++ b/ios/chrome/browser/browsing_data/DEPS
@@ -1,6 +1,6 @@ specific_include_rules = { # TODO(crbug.com/619783): Remove this exception. - "^ios_chrome_browsing_data_remover\.mm$": [ + "^browsing_data_remover_impl\.mm$": [ "+ios/web/web_state/ui/wk_web_view_configuration_provider.h", ], }
diff --git a/ios/chrome/browser/browsing_data/browsing_data_removal_controller.h b/ios/chrome/browser/browsing_data/browsing_data_removal_controller.h index d0c0c4d5..54f84ca 100644 --- a/ios/chrome/browser/browsing_data/browsing_data_removal_controller.h +++ b/ios/chrome/browser/browsing_data/browsing_data_removal_controller.h
@@ -28,9 +28,6 @@ timePeriod:(browsing_data::TimePeriod)timePeriod completionHandler:(ProceduralBlock)completionHandler; -// Called when |browserState| is destroyed. -- (void)browserStateDestroyed:(ios::ChromeBrowserState*)browserState; - // Returns YES if browsing data for |browserState| is still being cleared. - (BOOL)hasPendingRemovalOperations:(ios::ChromeBrowserState*)browserState;
diff --git a/ios/chrome/browser/browsing_data/browsing_data_removal_controller.mm b/ios/chrome/browser/browsing_data/browsing_data_removal_controller.mm index 44dae83..9ea9658 100644 --- a/ios/chrome/browser/browsing_data/browsing_data_removal_controller.mm +++ b/ios/chrome/browser/browsing_data/browsing_data_removal_controller.mm
@@ -12,19 +12,14 @@ #include "base/logging.h" #import "base/mac/bind_objc_block.h" #include "ios/chrome/browser/browsing_data/browsing_data_remove_mask.h" -#include "ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h" +#include "ios/chrome/browser/browsing_data/browsing_data_remover.h" +#include "ios/chrome/browser/browsing_data/browsing_data_remover_factory.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif -@implementation BrowsingDataRemovalController { - // Mapping from ChromeBrowserState to the IOSChromeBrowsingDataRemover used - // for removal of the data on that instance. - base::flat_map<ios::ChromeBrowserState*, - std::unique_ptr<IOSChromeBrowsingDataRemover>> - _browingDataRemovers; -} +@implementation BrowsingDataRemovalController - (void)removeBrowsingDataFromBrowserState: (ios::ChromeBrowserState*)browserState @@ -32,39 +27,18 @@ timePeriod:(browsing_data::TimePeriod)timePeriod completionHandler:(ProceduralBlock)completionHandler { DCHECK(browserState); - - // The block capture |self| (via accessing the ivar _browingDataRemovers). - // This is a workaround to ensure the callback is invoked even if the object - // is destroyed when getting out of scope. - __block BrowsingDataRemovalController* strongSelf = self; - ProceduralBlock browsingDataCleared = ^{ - if (completionHandler) - completionHandler(); - strongSelf = nil; - }; - - auto iterator = _browingDataRemovers.find(browserState); - if (iterator == _browingDataRemovers.end()) { - iterator = - _browingDataRemovers - .emplace( - browserState, - std::make_unique<IOSChromeBrowsingDataRemover>(browserState)) - .first; - DCHECK(iterator != _browingDataRemovers.end()); - } - iterator->second->Remove(timePeriod, mask, - base::BindBlockArc(browsingDataCleared)); + BrowsingDataRemoverFactory::GetForBrowserState(browserState) + ->Remove(timePeriod, mask, base::BindBlockArc(^{ + if (completionHandler) + completionHandler(); + })); } - (BOOL)hasPendingRemovalOperations:(ios::ChromeBrowserState*)browserState { - auto iterator = _browingDataRemovers.find(browserState); - return iterator != _browingDataRemovers.end() && - iterator->second->is_removing(); -} - -- (void)browserStateDestroyed:(ios::ChromeBrowserState*)browserState { - _browingDataRemovers.erase(browserState); + DCHECK(browserState); + BrowsingDataRemover* browsingDataRemover = + BrowsingDataRemoverFactory::GetForBrowserStateIfExists(browserState); + return browsingDataRemover && browsingDataRemover->IsRemoving(); } @end
diff --git a/ios/chrome/browser/browsing_data/browsing_data_removal_controller_unittest.mm b/ios/chrome/browser/browsing_data/browsing_data_removal_controller_unittest.mm index af2455e5..fe2226c 100644 --- a/ios/chrome/browser/browsing_data/browsing_data_removal_controller_unittest.mm +++ b/ios/chrome/browser/browsing_data/browsing_data_removal_controller_unittest.mm
@@ -71,7 +71,6 @@ }]; // Destroy the BrowserState immediately. - [removal_controller browserStateDestroyed:browser_state_.get()]; browser_state_.reset(); run_loop.RunUntilIdle();
diff --git a/ios/chrome/browser/browsing_data/browsing_data_remover.h b/ios/chrome/browser/browsing_data/browsing_data_remover.h new file mode 100644 index 0000000..e876b6c --- /dev/null +++ b/ios/chrome/browser/browsing_data/browsing_data_remover.h
@@ -0,0 +1,35 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_ +#define IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_ + +#include "base/callback.h" +#include "base/macros.h" +#include "components/browsing_data/core/browsing_data_utils.h" +#include "components/keyed_service/core/keyed_service.h" +#include "ios/chrome/browser/browsing_data/browsing_data_remove_mask.h" + +// BrowsingDataRemover is responsible for removing data related to +// browsing: history, downloads, cookies, ... +class BrowsingDataRemover : public KeyedService { + public: + BrowsingDataRemover() = default; + ~BrowsingDataRemover() override = default; + + // Is the service currently in the process of removing data? + virtual bool IsRemoving() const = 0; + + // Removes browsing data for the given |time_period| with data types specified + // by |remove_mask|. The |callback| is invoked asynchronously when the data + // has been removed. + virtual void Remove(browsing_data::TimePeriod time_period, + BrowsingDataRemoveMask remove_mask, + base::OnceClosure callback) = 0; + + private: + DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemover); +}; + +#endif // IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_
diff --git a/ios/chrome/browser/browsing_data/browsing_data_remover_factory.cc b/ios/chrome/browser/browsing_data/browsing_data_remover_factory.cc new file mode 100644 index 0000000..ff129d1 --- /dev/null +++ b/ios/chrome/browser/browsing_data/browsing_data_remover_factory.cc
@@ -0,0 +1,52 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ios/chrome/browser/browsing_data/browsing_data_remover_factory.h" + +#include <utility> + +#include "base/memory/singleton.h" +#include "components/keyed_service/ios/browser_state_dependency_manager.h" +#include "ios/chrome/browser/browser_state/browser_state_otr_helper.h" +#include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#include "ios/chrome/browser/browsing_data/browsing_data_remover_impl.h" + +// static +BrowsingDataRemover* BrowsingDataRemoverFactory::GetForBrowserState( + ios::ChromeBrowserState* browser_state) { + return static_cast<BrowsingDataRemover*>( + GetInstance()->GetServiceForBrowserState(browser_state, true)); +} + +// static +BrowsingDataRemover* BrowsingDataRemoverFactory::GetForBrowserStateIfExists( + ios::ChromeBrowserState* browser_state) { + return static_cast<BrowsingDataRemover*>( + GetInstance()->GetServiceForBrowserState(browser_state, false)); +} + +// static +BrowsingDataRemoverFactory* BrowsingDataRemoverFactory::GetInstance() { + return base::Singleton<BrowsingDataRemoverFactory>::get(); +} + +BrowsingDataRemoverFactory::BrowsingDataRemoverFactory() + : BrowserStateKeyedServiceFactory( + "BrowsingDataRemover", + BrowserStateDependencyManager::GetInstance()) {} + +BrowsingDataRemoverFactory::~BrowsingDataRemoverFactory() = default; + +std::unique_ptr<KeyedService> +BrowsingDataRemoverFactory::BuildServiceInstanceFor( + web::BrowserState* context) const { + ios::ChromeBrowserState* browser_state = + ios::ChromeBrowserState::FromBrowserState(context); + return std::make_unique<BrowsingDataRemoverImpl>(browser_state); +} + +web::BrowserState* BrowsingDataRemoverFactory::GetBrowserStateToUse( + web::BrowserState* context) const { + return GetBrowserStateOwnInstanceInIncognito(context); +}
diff --git a/ios/chrome/browser/browsing_data/browsing_data_remover_factory.h b/ios/chrome/browser/browsing_data/browsing_data_remover_factory.h new file mode 100644 index 0000000..10e5e03 --- /dev/null +++ b/ios/chrome/browser/browsing_data/browsing_data_remover_factory.h
@@ -0,0 +1,49 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_FACTORY_H_ +#define IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_FACTORY_H_ + +#include <memory> + +#include "base/macros.h" +#include "components/keyed_service/ios/browser_state_keyed_service_factory.h" + +namespace base { +template <typename T> +struct DefaultSingletonTraits; +} // namespace base + +namespace ios { +class ChromeBrowserState; +} + +class BrowsingDataRemover; + +// Singleton that owns all BrowsingDataRemovers and associates them with +// ios::ChromeBrowserState. +class BrowsingDataRemoverFactory : public BrowserStateKeyedServiceFactory { + public: + static BrowsingDataRemover* GetForBrowserState( + ios::ChromeBrowserState* browser_state); + static BrowsingDataRemover* GetForBrowserStateIfExists( + ios::ChromeBrowserState* browser_state); + static BrowsingDataRemoverFactory* GetInstance(); + + private: + friend struct base::DefaultSingletonTraits<BrowsingDataRemoverFactory>; + + BrowsingDataRemoverFactory(); + ~BrowsingDataRemoverFactory() override; + + // BrowserStateKeyedServiceFactory implementation. + std::unique_ptr<KeyedService> BuildServiceInstanceFor( + web::BrowserState* context) const override; + web::BrowserState* GetBrowserStateToUse( + web::BrowserState* context) const override; + + DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemoverFactory); +}; + +#endif // IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_FACTORY_H_
diff --git a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h b/ios/chrome/browser/browsing_data/browsing_data_remover_impl.h similarity index 75% rename from ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h rename to ios/chrome/browser/browsing_data/browsing_data_remover_impl.h index 67204f0..968d741 100644 --- a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h +++ b/ios/chrome/browser/browsing_data/browsing_data_remover_impl.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 IOS_CHROME_BROWSER_BROWSING_DATA_IOS_CHROME_BROWSING_DATA_REMOVER_H_ -#define IOS_CHROME_BROWSER_BROWSING_DATA_IOS_CHROME_BROWSING_DATA_REMOVER_H_ +#ifndef IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_IMPL_H_ +#define IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_IMPL_H_ #include <memory> @@ -18,6 +18,7 @@ #include "components/prefs/pref_member.h" #include "components/search_engines/template_url_service.h" #include "ios/chrome/browser/browsing_data/browsing_data_remove_mask.h" +#include "ios/chrome/browser/browsing_data/browsing_data_remover.h" namespace ios { class ChromeBrowserState; @@ -27,24 +28,23 @@ class URLRequestContextGetter; } -// IOSChromeBrowsingDataRemover is responsible for removing data related to -// browsing: visits in url database, downloads, cookies ... -class IOSChromeBrowsingDataRemover { +// BrowsingDataRemoverImpl is the concrete implementation of the +// BrowsingDataRemover abstract interface. +class BrowsingDataRemoverImpl : public BrowsingDataRemover { public: - // Creates a IOSChromeBrowsingDataRemover to remove browser data from the + // Creates a BrowsingDataRemoverImpl to remove browser data from the // specified ChromeBrowserstate. Use Remove to initiate the removal. - explicit IOSChromeBrowsingDataRemover(ios::ChromeBrowserState* browser_state); - ~IOSChromeBrowsingDataRemover(); + explicit BrowsingDataRemoverImpl(ios::ChromeBrowserState* browser_state); + ~BrowsingDataRemoverImpl() override; - // Is the object currently in the process of removing data? - bool is_removing() { return is_removing_; } + // KeyedService implementation. + void Shutdown() override; - // Removes browsing data for the given |time_range| with data types specified - // by |remove_mask|. The |callback| is invoked asynchronously when the data - // has been removed. + // BrowsingDataRemover implementation. + bool IsRemoving() const override; void Remove(browsing_data::TimePeriod time_period, BrowsingDataRemoveMask remove_mask, - base::OnceClosure callback); + base::OnceClosure callback) override; private: // Represents a single removal task. Contains all parameters to execute it. @@ -98,9 +98,9 @@ // created by this method have been invoked. base::OnceClosure CreatePendingTaskCompletionClosure(); - // Returns a weak pointer to IOSChromeBrowsingDataRemover for internal + // Returns a weak pointer to BrowsingDataRemoverImpl for internal // purposes. - base::WeakPtr<IOSChromeBrowsingDataRemover> GetWeakPtr(); + base::WeakPtr<BrowsingDataRemoverImpl> GetWeakPtr(); // This object is sequence affine. SEQUENCE_CHECKER(sequence_checker_); @@ -125,9 +125,9 @@ std::unique_ptr<TemplateURLService::Subscription> template_url_subscription_; - base::WeakPtrFactory<IOSChromeBrowsingDataRemover> weak_ptr_factory_; + base::WeakPtrFactory<BrowsingDataRemoverImpl> weak_ptr_factory_; - DISALLOW_COPY_AND_ASSIGN(IOSChromeBrowsingDataRemover); + DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemoverImpl); }; -#endif // IOS_CHROME_BROWSER_BROWSING_DATA_IOS_CHROME_BROWSING_DATA_REMOVER_H_ +#endif // IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_IMPL_H_
diff --git a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm b/ios/chrome/browser/browsing_data/browsing_data_remover_impl.mm similarity index 91% rename from ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm rename to ios/chrome/browser/browsing_data/browsing_data_remover_impl.mm index 1a8c9d9..8a92a3f 100644 --- a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm +++ b/ios/chrome/browser/browsing_data/browsing_data_remover_impl.mm
@@ -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 "ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h" +#include "ios/chrome/browser/browsing_data/browsing_data_remover_impl.h" #import <WebKit/WebKit.h> @@ -153,22 +153,21 @@ } // namespace -IOSChromeBrowsingDataRemover::RemovalTask::RemovalTask( - base::Time delete_begin, - base::Time delete_end, - BrowsingDataRemoveMask mask, - base::OnceClosure callback) +BrowsingDataRemoverImpl::RemovalTask::RemovalTask(base::Time delete_begin, + base::Time delete_end, + BrowsingDataRemoveMask mask, + base::OnceClosure callback) : delete_begin(delete_begin), delete_end(delete_end), mask(mask), callback(std::move(callback)) {} -IOSChromeBrowsingDataRemover::RemovalTask::RemovalTask( +BrowsingDataRemoverImpl::RemovalTask::RemovalTask( RemovalTask&& other) noexcept = default; -IOSChromeBrowsingDataRemover::RemovalTask::~RemovalTask() = default; +BrowsingDataRemoverImpl::RemovalTask::~RemovalTask() = default; -IOSChromeBrowsingDataRemover::IOSChromeBrowsingDataRemover( +BrowsingDataRemoverImpl::BrowsingDataRemoverImpl( ios::ChromeBrowserState* browser_state) : browser_state_(browser_state), context_getter_(browser_state->GetRequestContext()), @@ -177,10 +176,10 @@ DCHECK(browser_state); } -IOSChromeBrowsingDataRemover::~IOSChromeBrowsingDataRemover() { +BrowsingDataRemoverImpl::~BrowsingDataRemoverImpl() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (is_removing()) { - VLOG(1) << "IOSChromeBrowsingDataRemover shuts down with " + if (is_removing_) { + VLOG(1) << "BrowsingDataRemoverImpl shuts down with " << removal_queue_.size() << " pending tasks" << (pending_tasks_count_ ? " (including one in progress)" : ""); } @@ -204,15 +203,26 @@ } } -void IOSChromeBrowsingDataRemover::SetRemoving(bool is_removing) { +void BrowsingDataRemoverImpl::Shutdown() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + weak_ptr_factory_.InvalidateWeakPtrs(); + browser_state_ = nullptr; +} + +bool BrowsingDataRemoverImpl::IsRemoving() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + return is_removing_; +} + +void BrowsingDataRemoverImpl::SetRemoving(bool is_removing) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(is_removing_ != is_removing); is_removing_ = is_removing; } -void IOSChromeBrowsingDataRemover::Remove(browsing_data::TimePeriod time_period, - BrowsingDataRemoveMask mask, - base::OnceClosure callback) { +void BrowsingDataRemoverImpl::Remove(browsing_data::TimePeriod time_period, + BrowsingDataRemoveMask mask, + base::OnceClosure callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // Should always remove something. @@ -254,7 +264,7 @@ } } -void IOSChromeBrowsingDataRemover::RunNextTask() { +void BrowsingDataRemoverImpl::RunNextTask() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!removal_queue_.empty()); const RemovalTask& removal_task = removal_queue_.front(); @@ -262,9 +272,9 @@ removal_task.mask); } -void IOSChromeBrowsingDataRemover::RemoveImpl(base::Time delete_begin, - base::Time delete_end, - BrowsingDataRemoveMask mask) { +void BrowsingDataRemoverImpl::RemoveImpl(base::Time delete_begin, + base::Time delete_end, + BrowsingDataRemoveMask mask) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); base::ScopedClosureRunner synchronous_clear_operations( CreatePendingTaskCompletionClosure()); @@ -357,7 +367,7 @@ if (keywords_model && !keywords_model->loaded()) { template_url_subscription_ = keywords_model->RegisterOnLoadedCallback(AdaptCallbackForRepeating( - base::BindOnce(&IOSChromeBrowsingDataRemover::OnKeywordsLoaded, + base::BindOnce(&BrowsingDataRemoverImpl::OnKeywordsLoaded, GetWeakPtr(), delete_begin, delete_end, CreatePendingTaskCompletionClosure()))); keywords_model->Load(); @@ -542,7 +552,7 @@ // TODO(crbug.com/619783): removing data from WkWebsiteDataStore should be // implemented by //ios/web. Once this is available remove this and use the // new API. -void IOSChromeBrowsingDataRemover::RemoveDataFromWKWebsiteDataStore( +void BrowsingDataRemoverImpl::RemoveDataFromWKWebsiteDataStore( base::Time delete_begin, base::Time delete_end, BrowsingDataRemoveMask mask) { @@ -587,7 +597,7 @@ if (IsRemoveDataMaskSet(mask, BrowsingDataRemoveMask::REMOVE_VISITED_LINKS)) { ProceduralBlock previous_completion_block = completion_block; - base::WeakPtr<IOSChromeBrowsingDataRemover> weak_ptr = GetWeakPtr(); + base::WeakPtr<BrowsingDataRemoverImpl> weak_ptr = GetWeakPtr(); // TODO(crbug.com/557963): Purging the WKProcessPool is a workaround for // the fact that there is no public API to clear visited links in @@ -597,7 +607,7 @@ // it is not a problem in practice since there is no UI to only have // visited links be removed but not cookies. completion_block = ^{ - if (IOSChromeBrowsingDataRemover* strong_ptr = weak_ptr.get()) { + if (BrowsingDataRemoverImpl* strong_ptr = weak_ptr.get()) { web::WKWebViewConfigurationProvider::FromBrowserState( strong_ptr->browser_state_) .Purge(); @@ -633,13 +643,12 @@ } } -void IOSChromeBrowsingDataRemover::OnKeywordsLoaded( - base::Time delete_begin, - base::Time delete_end, - base::OnceClosure callback) { +void BrowsingDataRemoverImpl::OnKeywordsLoaded(base::Time delete_begin, + base::Time delete_end, + base::OnceClosure callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // Deletes the entries from the model, and if we're not waiting on anything - // else notifies observers and deletes this IOSChromeBrowsingDataRemover. + // else notifies observers and deletes this BrowsingDataRemoverImpl. TemplateURLService* model = ios::TemplateURLServiceFactory::GetForBrowserState(browser_state_); model->RemoveAutoGeneratedBetween(delete_begin, delete_end); @@ -647,7 +656,7 @@ std::move(callback).Run(); } -void IOSChromeBrowsingDataRemover::NotifyRemovalComplete() { +void BrowsingDataRemoverImpl::NotifyRemovalComplete() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!removal_queue_.empty()); @@ -679,10 +688,10 @@ // RunNextTask() is not called before the callback has been invoked. current_task_runner->PostTask( FROM_HERE, - base::BindOnce(&IOSChromeBrowsingDataRemover::RunNextTask, GetWeakPtr())); + base::BindOnce(&BrowsingDataRemoverImpl::RunNextTask, GetWeakPtr())); } -void IOSChromeBrowsingDataRemover::OnTaskComplete() { +void BrowsingDataRemoverImpl::OnTaskComplete() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // TODO(crbug.com/305259): This should also observe session clearing (what @@ -697,17 +706,15 @@ } base::OnceClosure -IOSChromeBrowsingDataRemover::CreatePendingTaskCompletionClosure() { +BrowsingDataRemoverImpl::CreatePendingTaskCompletionClosure() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); ++pending_tasks_count_; - return base::BindOnce(&IOSChromeBrowsingDataRemover::OnTaskComplete, - GetWeakPtr()); + return base::BindOnce(&BrowsingDataRemoverImpl::OnTaskComplete, GetWeakPtr()); } -base::WeakPtr<IOSChromeBrowsingDataRemover> -IOSChromeBrowsingDataRemover::GetWeakPtr() { +base::WeakPtr<BrowsingDataRemoverImpl> BrowsingDataRemoverImpl::GetWeakPtr() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - base::WeakPtr<IOSChromeBrowsingDataRemover> weak_ptr = + base::WeakPtr<BrowsingDataRemoverImpl> weak_ptr = weak_ptr_factory_.GetWeakPtr(); // Immediately bind the weak pointer to the current sequence. This makes it
diff --git a/ios/chrome/browser/passwords/password_controller_unittest.mm b/ios/chrome/browser/passwords/password_controller_unittest.mm index 073fadc3..78c09eb9 100644 --- a/ios/chrome/browser/passwords/password_controller_unittest.mm +++ b/ios/chrome/browser/passwords/password_controller_unittest.mm
@@ -1276,7 +1276,11 @@ webState:web_state() completionHandler:^(NSArray* suggestions, id<FormSuggestionProvider> provider) { - EXPECT_EQ(2u, [suggestions count]); + NSMutableArray* suggestion_values = [NSMutableArray array]; + for (FormSuggestion* suggestion in suggestions) + [suggestion_values addObject:suggestion.value]; + EXPECT_NSEQ((@[ @"abc", @"Show All\u2026" ]), + suggestion_values); block_was_called = YES; }]; EXPECT_TRUE(block_was_called);
diff --git a/ios/chrome/browser/payments/BUILD.gn b/ios/chrome/browser/payments/BUILD.gn index 6babd476..0905a199 100644 --- a/ios/chrome/browser/payments/BUILD.gn +++ b/ios/chrome/browser/payments/BUILD.gn
@@ -32,6 +32,7 @@ ":constants", "//base", "//components/autofill/core/browser", + "//components/autofill/ios/browser", "//components/image_fetcher/ios", "//components/keyed_service/ios", "//components/payments/core",
diff --git a/ios/chrome/browser/payments/payment_request.h b/ios/chrome/browser/payments/payment_request.h index d4c312e8..7580954e 100644 --- a/ios/chrome/browser/payments/payment_request.h +++ b/ios/chrome/browser/payments/payment_request.h
@@ -184,6 +184,10 @@ virtual autofill::AutofillProfile* AddAutofillProfile( const autofill::AutofillProfile& profile); + // Updates the given |profile| in the PersonalDataManager if the user is + // not in incognito mode. + virtual void UpdateAutofillProfile(const autofill::AutofillProfile& profile); + // Returns the available autofill profiles for this user to be used as // shipping profiles. const std::vector<autofill::AutofillProfile*>& shipping_profiles() const { @@ -246,9 +250,14 @@ return supported_card_types_set_; } - // Creates and adds an AutofillPaymentInstrument, which makes a copy of - // |credit_card|. - virtual AutofillPaymentInstrument* AddAutofillPaymentInstrument( + // Creates and adds an AutofillPaymentInstrument to the list of payment + // instruments by making a copy of |credit_card|. + virtual AutofillPaymentInstrument* CreateAndAddAutofillPaymentInstrument( + const autofill::CreditCard& credit_card); + + // Updates the given |credit_card| in the PersonalDataManager if the user is + // not in incognito mode. + virtual void UpdateAutofillPaymentInstrument( const autofill::CreditCard& credit_card); // Returns the available payment methods for this user that match a supported @@ -344,6 +353,13 @@ // methods. void PopulateAvailablePaymentMethods(); + // Creates and adds an AutofillPaymentInstrument to the list of payment + // instruments by making a copy of |credit_card|. Updates PersonalDataManager + // if not in incognito mode and |may_update_personal_data_manager| is true. + AutofillPaymentInstrument* CreateAndAddAutofillPaymentInstrument( + const autofill::CreditCard& credit_card, + bool may_update_personal_data_manager); + // Sets the available shipping options as references to the shipping options // in |web_payment_request_|. void PopulateAvailableShippingOptions();
diff --git a/ios/chrome/browser/payments/payment_request.mm b/ios/chrome/browser/payments/payment_request.mm index d2dbfde..18aec913 100644 --- a/ios/chrome/browser/payments/payment_request.mm +++ b/ios/chrome/browser/payments/payment_request.mm
@@ -16,6 +16,7 @@ #include "components/autofill/core/browser/personal_data_manager.h" #include "components/autofill/core/browser/region_data_loader_impl.h" #include "components/autofill/core/browser/validation.h" +#import "components/autofill/ios/browser/credit_card_util.h" #include "components/payments/core/autofill_payment_instrument.h" #include "components/payments/core/currency_formatter.h" #include "components/payments/core/features.h" @@ -289,9 +290,21 @@ contact_profiles_.push_back(profile_cache_.back().get()); shipping_profiles_.push_back(profile_cache_.back().get()); + if (!IsIncognito()) + personal_data_manager_->AddProfile(profile); + return profile_cache_.back().get(); } +void PaymentRequest::UpdateAutofillProfile( + const autofill::AutofillProfile& profile) { + // Cached profile must be invalidated once the profile is modified. + profile_comparator()->Invalidate(profile); + + if (!IsIncognito()) + personal_data_manager_->UpdateProfile(profile); +} + const PaymentDetailsModifier* PaymentRequest::GetApplicableModifier( PaymentInstrument* selected_instrument) const { if (!selected_instrument || @@ -361,8 +374,17 @@ profile_comparator_.FilterProfilesForShipping(raw_profiles_for_filtering); } -AutofillPaymentInstrument* PaymentRequest::AddAutofillPaymentInstrument( +AutofillPaymentInstrument* +PaymentRequest::CreateAndAddAutofillPaymentInstrument( const autofill::CreditCard& credit_card) { + return CreateAndAddAutofillPaymentInstrument( + credit_card, /*may_update_personal_data_manager=*/true); +} + +AutofillPaymentInstrument* +PaymentRequest::CreateAndAddAutofillPaymentInstrument( + const autofill::CreditCard& credit_card, + bool may_update_personal_data_manager) { std::string basic_card_issuer_network = autofill::data_util::GetPaymentRequestData(credit_card.network()) .basic_card_issuer_network; @@ -398,10 +420,24 @@ payment_methods_.push_back(payment_method_cache_.back().get()); + if (may_update_personal_data_manager && !IsIncognito()) + personal_data_manager_->AddCreditCard(credit_card); + return static_cast<AutofillPaymentInstrument*>( payment_method_cache_.back().get()); } +void PaymentRequest::UpdateAutofillPaymentInstrument( + const autofill::CreditCard& credit_card) { + if (IsIncognito()) + return; + + if (autofill::IsCreditCardLocal(credit_card)) + personal_data_manager_->UpdateCreditCard(credit_card); + else + personal_data_manager_->UpdateServerCardMetadata(credit_card); +} + PaymentsProfileComparator* PaymentRequest::profile_comparator() { return &profile_comparator_; } @@ -513,8 +549,12 @@ for (auto& instrument : native_app_instruments) payment_method_cache_.push_back(std::move(instrument)); - for (const auto* credit_card : credit_cards_to_suggest) - AddAutofillPaymentInstrument(*credit_card); + for (const auto* credit_card : credit_cards_to_suggest) { + // We only want to add the credit cards read from the PersonalDataManager to + // the list of payment instrument. Don't re-add them to PersonalDataManager. + CreateAndAddAutofillPaymentInstrument( + *credit_card, /*may_update_personal_data_manager=*/false); + } PopulateAvailablePaymentMethods();
diff --git a/ios/chrome/browser/payments/payment_request_unittest.mm b/ios/chrome/browser/payments/payment_request_unittest.mm index bc18a3f..2177a9f 100644 --- a/ios/chrome/browser/payments/payment_request_unittest.mm +++ b/ios/chrome/browser/payments/payment_request_unittest.mm
@@ -20,6 +20,7 @@ #include "components/payments/core/payment_method_data.h" #include "components/payments/core/payment_options.h" #include "components/payments/core/payment_shipping_option.h" +#include "components/payments/core/payments_profile_comparator.h" #include "components/payments/core/web_payment_request.h" #include "ios/chrome/browser/application_context.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" @@ -36,17 +37,29 @@ #endif namespace { +using ::testing::_; class MockTestPersonalDataManager : public autofill::TestPersonalDataManager { public: MockTestPersonalDataManager() : TestPersonalDataManager() {} MOCK_METHOD1(RecordUseOf, void(const autofill::AutofillDataModel&)); + MOCK_METHOD1(UpdateCreditCard, void(const autofill::CreditCard&)); + MOCK_METHOD1(UpdateServerCardMetadata, void(const autofill::CreditCard&)); + MOCK_METHOD1(UpdateProfile, void(const autofill::AutofillProfile&)); +}; + +class MockPaymentsProfileComparator + : public payments::PaymentsProfileComparator { + public: + MockPaymentsProfileComparator(const std::string& app_locale, + const payments::PaymentOptionsProvider& options) + : PaymentsProfileComparator(app_locale, options) {} + MOCK_METHOD1(Invalidate, void(const autofill::AutofillProfile&)); }; MATCHER_P(GuidMatches, guid, "") { return arg.guid() == guid; } - } // namespace namespace payments { @@ -318,7 +331,58 @@ // Tests that an autofill payment instrumnt e.g., credit cards can be added // to the list of available payment methods. -TEST_F(PaymentRequestTest, AddAutofillPaymentInstrument) { +TEST_F(PaymentRequestTest, CreateAndAddAutofillPaymentInstrument) { + WebPaymentRequest web_payment_request; + PaymentMethodData method_datum; + method_datum.supported_methods.push_back("basic-card"); + method_datum.supported_networks.push_back("visa"); + web_payment_request.method_data.push_back(method_datum); + + autofill::TestPersonalDataManager personal_data_manager; + TestPaymentRequest payment_request(web_payment_request, + chrome_browser_state_.get(), &web_state_, + &personal_data_manager); + EXPECT_EQ(0U, payment_request.payment_methods().size()); + + autofill::CreditCard credit_card_1 = autofill::test::GetCreditCard(); + AutofillPaymentInstrument* added_credit_card_1 = + payment_request.CreateAndAddAutofillPaymentInstrument(credit_card_1); + EXPECT_EQ(credit_card_1, *added_credit_card_1->credit_card()); + + EXPECT_EQ(1U, payment_request.payment_methods().size()); + // The card is expected to have been added to the PersonalDataManager. + EXPECT_EQ(1U, personal_data_manager.GetCreditCards().size()); +} + +// Tests that an autofill payment instrumnt e.g., credit cards can be added +// to the list of available payment methods in incognito mode. +TEST_F(PaymentRequestTest, CreateAndAddAutofillPaymentInstrumentIncognito) { + WebPaymentRequest web_payment_request; + PaymentMethodData method_datum; + method_datum.supported_methods.push_back("basic-card"); + method_datum.supported_networks.push_back("visa"); + web_payment_request.method_data.push_back(method_datum); + + autofill::TestPersonalDataManager personal_data_manager; + TestPaymentRequest payment_request(web_payment_request, + chrome_browser_state_.get(), &web_state_, + &personal_data_manager); + EXPECT_EQ(0U, payment_request.payment_methods().size()); + + payment_request.set_is_incognito(true); + + autofill::CreditCard credit_card_1 = autofill::test::GetCreditCard(); + AutofillPaymentInstrument* added_credit_card_1 = + payment_request.CreateAndAddAutofillPaymentInstrument(credit_card_1); + EXPECT_EQ(credit_card_1, *added_credit_card_1->credit_card()); + + EXPECT_EQ(1U, payment_request.payment_methods().size()); + // The card should not get added to the PersonalDataManager. + EXPECT_EQ(0U, personal_data_manager.GetCreditCards().size()); +} + +// Tests updating local and server autofill payment instruments. +TEST_F(PaymentRequestTest, UpdateAutofillPaymentInstrument) { WebPaymentRequest web_payment_request; PaymentMethodData method_datum; method_datum.supported_methods.push_back("basic-card"); @@ -326,22 +390,54 @@ method_datum.supported_networks.push_back("amex"); web_payment_request.method_data.push_back(method_datum); - autofill::TestPersonalDataManager personal_data_manager; - - autofill::CreditCard credit_card_1 = autofill::test::GetCreditCard(); - personal_data_manager.AddCreditCard(credit_card_1); - + MockTestPersonalDataManager personal_data_manager; TestPaymentRequest payment_request(web_payment_request, chrome_browser_state_.get(), &web_state_, &personal_data_manager); - EXPECT_EQ(1U, payment_request.payment_methods().size()); - autofill::CreditCard credit_card_2 = autofill::test::GetCreditCard2(); - AutofillPaymentInstrument* added_credit_card = - payment_request.AddAutofillPaymentInstrument(credit_card_2); + // Credit card should get updated in Personal Data Manager. + EXPECT_CALL(personal_data_manager, UpdateCreditCard(_)).Times(1); - EXPECT_EQ(2U, payment_request.payment_methods().size()); - EXPECT_EQ(credit_card_2, *added_credit_card->credit_card()); + autofill::CreditCard credit_card_1 = autofill::test::GetCreditCard(); + payment_request.UpdateAutofillPaymentInstrument(credit_card_1); + + // Only credit card's meta data should get updated in PersonalDataManager. + EXPECT_CALL(personal_data_manager, UpdateServerCardMetadata(_)).Times(1); + + autofill::CreditCard credit_card_2 = + autofill::test::GetMaskedServerCardAmex(); + payment_request.UpdateAutofillPaymentInstrument(credit_card_2); +} + +// Tests updating local and server autofill payment instruments in incognito +// mode. +TEST_F(PaymentRequestTest, UpdateAutofillPaymentInstrumentIncognito) { + WebPaymentRequest web_payment_request; + PaymentMethodData method_datum; + method_datum.supported_methods.push_back("basic-card"); + method_datum.supported_networks.push_back("visa"); + method_datum.supported_networks.push_back("amex"); + web_payment_request.method_data.push_back(method_datum); + + MockTestPersonalDataManager personal_data_manager; + TestPaymentRequest payment_request(web_payment_request, + chrome_browser_state_.get(), &web_state_, + &personal_data_manager); + + payment_request.set_is_incognito(true); + + // Credit card should not get updated in Personal Data Manager. + EXPECT_CALL(personal_data_manager, UpdateCreditCard(_)).Times(0); + + autofill::CreditCard credit_card_1 = autofill::test::GetCreditCard(); + payment_request.UpdateAutofillPaymentInstrument(credit_card_1); + + // Only credit card's meta data should not get updated in PersonalDataManager. + EXPECT_CALL(personal_data_manager, UpdateServerCardMetadata(_)).Times(0); + + autofill::CreditCard credit_card_2 = + autofill::test::GetMaskedServerCardAmex(); + payment_request.UpdateAutofillPaymentInstrument(credit_card_2); } // Tests that a profile can be added to the list of available profiles. @@ -352,23 +448,101 @@ /*request_payer_email=*/true, /*request_shipping=*/true); autofill::TestPersonalDataManager personal_data_manager; - - autofill::AutofillProfile profile_1 = autofill::test::GetFullProfile(); - personal_data_manager.AddProfile(profile_1); - TestPaymentRequest payment_request(web_payment_request, chrome_browser_state_.get(), &web_state_, &personal_data_manager); + EXPECT_EQ(0U, payment_request.shipping_profiles().size()); + EXPECT_EQ(0U, payment_request.contact_profiles().size()); + + autofill::AutofillProfile profile_1 = autofill::test::GetFullProfile(); + autofill::AutofillProfile* added_profile_1 = + payment_request.AddAutofillProfile(profile_1); + EXPECT_EQ(profile_1, *added_profile_1); + EXPECT_EQ(1U, payment_request.shipping_profiles().size()); EXPECT_EQ(1U, payment_request.contact_profiles().size()); + // The autofill profile should have been added to the PersonalDataManager. + EXPECT_EQ(1U, personal_data_manager.GetProfiles().size()); +} - autofill::AutofillProfile profile_2 = autofill::test::GetFullProfile2(); - autofill::AutofillProfile* added_profile = - payment_request.AddAutofillProfile(profile_2); +// Tests that a profile can be added to the list of available profiles in +// incognito mode. +TEST_F(PaymentRequestTest, AddAutofillProfileIncognito) { + WebPaymentRequest web_payment_request; + web_payment_request.options = CreatePaymentOptions( + /*request_payer_name=*/true, /*request_payer_phone=*/true, + /*request_payer_email=*/true, /*request_shipping=*/true); - EXPECT_EQ(2U, payment_request.shipping_profiles().size()); - EXPECT_EQ(2U, payment_request.contact_profiles().size()); - EXPECT_EQ(profile_2, *added_profile); + autofill::TestPersonalDataManager personal_data_manager; + TestPaymentRequest payment_request(web_payment_request, + chrome_browser_state_.get(), &web_state_, + &personal_data_manager); + EXPECT_EQ(0U, payment_request.shipping_profiles().size()); + EXPECT_EQ(0U, payment_request.contact_profiles().size()); + + payment_request.set_is_incognito(true); + + autofill::AutofillProfile profile_1 = autofill::test::GetFullProfile(); + autofill::AutofillProfile* added_profile_1 = + payment_request.AddAutofillProfile(profile_1); + EXPECT_EQ(profile_1, *added_profile_1); + + EXPECT_EQ(1U, payment_request.shipping_profiles().size()); + EXPECT_EQ(1U, payment_request.contact_profiles().size()); + // The autofill profile should not get added to the PersonalDataManager. + EXPECT_EQ(0U, personal_data_manager.GetProfiles().size()); +} + +// Tests updating an autofill profile. +TEST_F(PaymentRequestTest, UpdateAutofillProfile) { + WebPaymentRequest web_payment_request; + web_payment_request.options = CreatePaymentOptions( + /*request_payer_name=*/true, /*request_payer_phone=*/true, + /*request_payer_email=*/true, /*request_shipping=*/true); + + MockTestPersonalDataManager personal_data_manager; + TestPaymentRequest payment_request(web_payment_request, + chrome_browser_state_.get(), &web_state_, + &personal_data_manager); + + MockPaymentsProfileComparator profile_comparator( + payment_request.GetApplicationLocale(), payment_request); + payment_request.SetProfileComparator(&profile_comparator); + + // Profile should get updated in PersonalDataManager. + EXPECT_CALL(personal_data_manager, UpdateProfile(_)).Times(1); + + EXPECT_CALL(profile_comparator, Invalidate(_)).Times(1); + + autofill::AutofillProfile profile = autofill::test::GetFullProfile(); + payment_request.UpdateAutofillProfile(profile); +} + +// Tests updating an autofill profile in incognito mode. +TEST_F(PaymentRequestTest, UpdateAutofillProfileIncognito) { + WebPaymentRequest web_payment_request; + web_payment_request.options = CreatePaymentOptions( + /*request_payer_name=*/true, /*request_payer_phone=*/true, + /*request_payer_email=*/true, /*request_shipping=*/true); + + MockTestPersonalDataManager personal_data_manager; + TestPaymentRequest payment_request(web_payment_request, + chrome_browser_state_.get(), &web_state_, + &personal_data_manager); + + payment_request.set_is_incognito(true); + + MockPaymentsProfileComparator profile_comparator( + payment_request.GetApplicationLocale(), payment_request); + payment_request.SetProfileComparator(&profile_comparator); + + // Profile should not get updated in PersonalDataManager. + EXPECT_CALL(personal_data_manager, UpdateProfile(_)).Times(0); + + EXPECT_CALL(profile_comparator, Invalidate(_)).Times(1); + + autofill::AutofillProfile profile = autofill::test::GetFullProfile(); + payment_request.UpdateAutofillProfile(profile); } // Test that parsing shipping options works as expected.
diff --git a/ios/chrome/browser/payments/test_payment_request.h b/ios/chrome/browser/payments/test_payment_request.h index 17f60d6..542dda5 100644 --- a/ios/chrome/browser/payments/test_payment_request.h +++ b/ios/chrome/browser/payments/test_payment_request.h
@@ -41,26 +41,12 @@ ios::ChromeBrowserState* browser_state, web::WebState* web_state, autofill::PersonalDataManager* personal_data_manager, - id<PaymentRequestUIDelegate> payment_request_ui_delegate) - : PaymentRequest(web_payment_request, - browser_state, - web_state, - personal_data_manager, - payment_request_ui_delegate), - address_normalization_manager_(&address_normalizer_, "en-US"), - region_data_loader_(nullptr), - pref_service_(nullptr), - profile_comparator_(nullptr) {} + id<PaymentRequestUIDelegate> payment_request_ui_delegate); TestPaymentRequest(const payments::WebPaymentRequest& web_payment_request, ios::ChromeBrowserState* browser_state, web::WebState* web_state, - autofill::PersonalDataManager* personal_data_manager) - : TestPaymentRequest(web_payment_request, - browser_state, - web_state, - personal_data_manager, - nil) {} + autofill::PersonalDataManager* personal_data_manager); ~TestPaymentRequest() override {} @@ -101,6 +87,8 @@ selected_shipping_option_ = option; } + void set_is_incognito(bool is_incognito) { is_incognito_ = is_incognito; } + // PaymentRequest autofill::AddressNormalizer* GetAddressNormalizer() override; autofill::AddressNormalizationManager* GetAddressNormalizationManager() @@ -108,6 +96,7 @@ autofill::RegionDataLoader* GetRegionDataLoader() override; PrefService* GetPrefService() override; PaymentsProfileComparator* profile_comparator() override; + bool IsIncognito() const override; private: autofill::TestAddressNormalizer address_normalizer_; @@ -122,6 +111,9 @@ // Not owned and must outlive this object. PaymentsProfileComparator* profile_comparator_; + // Whether the user is in incognito mode. + bool is_incognito_; + DISALLOW_COPY_AND_ASSIGN(TestPaymentRequest); };
diff --git a/ios/chrome/browser/payments/test_payment_request.mm b/ios/chrome/browser/payments/test_payment_request.mm index f337bdbc..4baa203 100644 --- a/ios/chrome/browser/payments/test_payment_request.mm +++ b/ios/chrome/browser/payments/test_payment_request.mm
@@ -17,6 +17,34 @@ namespace payments { +TestPaymentRequest::TestPaymentRequest( + const payments::WebPaymentRequest& web_payment_request, + ios::ChromeBrowserState* browser_state, + web::WebState* web_state, + autofill::PersonalDataManager* personal_data_manager, + id<PaymentRequestUIDelegate> payment_request_ui_delegate) + : PaymentRequest(web_payment_request, + browser_state, + web_state, + personal_data_manager, + payment_request_ui_delegate), + address_normalization_manager_(&address_normalizer_, "en-US"), + region_data_loader_(nullptr), + pref_service_(nullptr), + profile_comparator_(nullptr), + is_incognito_(false) {} + +TestPaymentRequest::TestPaymentRequest( + const payments::WebPaymentRequest& web_payment_request, + ios::ChromeBrowserState* browser_state, + web::WebState* web_state, + autofill::PersonalDataManager* personal_data_manager) + : TestPaymentRequest(web_payment_request, + browser_state, + web_state, + personal_data_manager, + /*payment_request_ui_delegate=*/nil) {} + void TestPaymentRequest::ClearShippingProfiles() { shipping_profiles_.clear(); } @@ -64,4 +92,8 @@ return PaymentRequest::profile_comparator(); } +bool TestPaymentRequest::IsIncognito() const { + return is_incognito_; +} + } // namespace payments
diff --git a/ios/chrome/browser/ui/main/browser_view_wrangler.h b/ios/chrome/browser/ui/main/browser_view_wrangler.h index 7a49264..c77f95a5 100644 --- a/ios/chrome/browser/ui/main/browser_view_wrangler.h +++ b/ios/chrome/browser/ui/main/browser_view_wrangler.h
@@ -10,7 +10,6 @@ #import "ios/chrome/browser/ui/main/browser_view_information.h" @protocol ApplicationCommands; -@class BrowsingDataRemovalController; @class DeviceSharingManager; @protocol TabModelObserver; @@ -58,10 +57,8 @@ // tab model. This class creates and manages the state of the sharing manager. - (void)updateDeviceSharingManager; -// Delete any incognito tab model state, using |removalController| to handle -// the storage removal. -- (void)deleteIncognitoTabModelState: - (BrowsingDataRemovalController*)removalController; +// Delete the incognito tab model state. +- (void)deleteIncognitoTabModelState; // Called before the instance is deallocated. - (void)shutdown;
diff --git a/ios/chrome/browser/ui/main/browser_view_wrangler.mm b/ios/chrome/browser/ui/main/browser_view_wrangler.mm index f5c10df..1c1a3c7a 100644 --- a/ios/chrome/browser/ui/main/browser_view_wrangler.mm +++ b/ios/chrome/browser/ui/main/browser_view_wrangler.mm
@@ -4,11 +4,10 @@ #import "ios/chrome/browser/ui/main/browser_view_wrangler.h" +#include "base/files/file_path.h" #include "base/strings/sys_string_conversions.h" #include "ios/chrome/browser/application_context.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" -#import "ios/chrome/browser/browsing_data/browsing_data_removal_controller.h" -#include "ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h" #include "ios/chrome/browser/crash_report/crash_report_helper.h" #import "ios/chrome/browser/device_sharing/device_sharing_manager.h" #import "ios/chrome/browser/sessions/session_ios.h" @@ -253,8 +252,7 @@ [self.deviceSharingManager updateActiveURL:activeURL]; } -- (void)deleteIncognitoTabModelState: - (BrowsingDataRemovalController*)removalController { +- (void)deleteIncognitoTabModelState { // It is theoretically possible that a Tab has been added to |_otrTabModel| // since the deletion has been scheduled. It is unlikely to happen for real // because it would require superhuman speed. @@ -269,9 +267,6 @@ // following code. BOOL otrBVCIsCurrent = self.currentBVC == _otrBVC; @autoreleasepool { - ios::ChromeBrowserState* otrBrowserState = - _browserState->GetOffTheRecordChromeBrowserState(); - [removalController browserStateDestroyed:otrBrowserState]; self.otrBVC = nil; // There's no guarantee the tab model was ever added to the BVC (or even // that the BVC was created), so ensure the tab model gets notified.
diff --git a/ios/chrome/browser/ui/payments/address_edit_coordinator.mm b/ios/chrome/browser/ui/payments/address_edit_coordinator.mm index c35db56..fd174ec4 100644 --- a/ios/chrome/browser/ui/payments/address_edit_coordinator.mm +++ b/ios/chrome/browser/ui/payments/address_edit_coordinator.mm
@@ -12,7 +12,6 @@ #include "components/autofill/core/browser/autofill_type.h" #include "components/autofill/core/browser/personal_data_manager.h" #include "components/autofill/core/common/autofill_constants.h" -#include "components/payments/core/payments_profile_comparator.h" #include "ios/chrome/browser/payments/payment_request.h" #import "ios/chrome/browser/ui/autofill/autofill_ui_type_util.h" #import "ios/chrome/browser/ui/payments/address_edit_mediator.h" @@ -108,9 +107,10 @@ // Create an empty autofill profile. If an address is being edited, copy over // the information. autofill::AutofillProfile address = - self.address ? *self.address - : autofill::AutofillProfile(base::GenerateGUID(), - autofill::kSettingsOrigin); + self.address ? *self.address : autofill::AutofillProfile(); + + // Set the origin, or override it if the autofill profile is being edited. + address.set_origin(autofill::kSettingsOrigin); for (EditorField* field in fields) { address.SetInfo(autofill::AutofillType( @@ -120,20 +120,12 @@ } if (!self.address) { - self.paymentRequest->GetPersonalDataManager()->AddProfile(address); - // Add the profile to the list of profiles in |self.paymentRequest|. self.address = self.paymentRequest->AddAutofillProfile(address); } else { - // Override the origin. - address.set_origin(autofill::kSettingsOrigin); - self.paymentRequest->GetPersonalDataManager()->UpdateProfile(address); - - // Cached profile must be invalidated once the profile is modified. - _paymentRequest->profile_comparator()->Invalidate(address); - // Update the original profile instance that is being edited. *self.address = address; + self.paymentRequest->UpdateAutofillProfile(address); } [self.delegate addressEditCoordinator:self
diff --git a/ios/chrome/browser/ui/payments/address_edit_coordinator_unittest.mm b/ios/chrome/browser/ui/payments/address_edit_coordinator_unittest.mm index 2c64fd6f1..95ece46 100644 --- a/ios/chrome/browser/ui/payments/address_edit_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/payments/address_edit_coordinator_unittest.mm
@@ -15,7 +15,6 @@ #include "components/autofill/core/browser/country_names.h" #include "components/autofill/core/browser/test_personal_data_manager.h" #include "components/autofill/core/browser/test_region_data_loader.h" -#include "components/payments/core/payments_profile_comparator.h" #include "ios/chrome/browser/payments/payment_request_test_util.h" #include "ios/chrome/browser/payments/payment_request_unittest_base.h" #include "ios/chrome/browser/payments/test_payment_request.h" @@ -34,21 +33,8 @@ #endif namespace { -class MockTestPersonalDataManager : public autofill::TestPersonalDataManager { - public: - MockTestPersonalDataManager() : TestPersonalDataManager() {} - MOCK_METHOD1(AddProfile, void(const autofill::AutofillProfile&)); - MOCK_METHOD1(UpdateProfile, void(const autofill::AutofillProfile&)); -}; -class MockPaymentsProfileComparator - : public payments::PaymentsProfileComparator { - public: - MockPaymentsProfileComparator(const std::string& app_locale, - const payments::PaymentOptionsProvider& options) - : PaymentsProfileComparator(app_locale, options) {} - MOCK_METHOD1(Invalidate, void(const autofill::AutofillProfile&)); -}; +using ::testing::_; class MockTestPaymentRequest : public payments::TestPaymentRequest { public: @@ -62,6 +48,7 @@ personal_data_manager) {} MOCK_METHOD1(AddAutofillProfile, autofill::AutofillProfile*(const autofill::AutofillProfile&)); + MOCK_METHOD1(UpdateAutofillProfile, void(const autofill::AutofillProfile&)); }; MATCHER_P4(ProfileMatches, name, country, state, phone_number, "") { @@ -101,8 +88,6 @@ required:YES], ]; } - -using ::testing::_; } // namespace class PaymentRequestAddressEditCoordinatorTest @@ -121,10 +106,6 @@ payment_request_test_util::CreateTestWebPaymentRequest(), browser_state(), web_state(), &personal_data_manager_); - profile_comparator_ = std::make_unique<MockPaymentsProfileComparator>( - payment_request_->GetApplicationLocale(), *payment_request_.get()); - payment_request_->SetProfileComparator(profile_comparator_.get()); - test_region_data_loader_.set_synchronous_callback(true); payment_request_->SetRegionDataLoader(&test_region_data_loader_); } @@ -135,9 +116,8 @@ PaymentRequestUnitTestBase::TearDown(); } - MockTestPersonalDataManager personal_data_manager_; + autofill::TestPersonalDataManager personal_data_manager_; autofill::TestRegionDataLoader test_region_data_loader_; - std::unique_ptr<MockPaymentsProfileComparator> profile_comparator_; std::unique_ptr<MockTestPaymentRequest> payment_request_; }; @@ -209,15 +189,8 @@ AddAutofillProfile(ProfileMatches("John Doe", "CA" /* Canada */, "Quebec", "1 650-211-1111"))) .Times(1); - // Expect an autofill profile to be added to the PersonalDataManager. - EXPECT_CALL(personal_data_manager_, - AddProfile(ProfileMatches("John Doe", "CA" /* Canada */, "Quebec", - "1 650-211-1111"))) - .Times(1); - // No autofill profile should get updated in the PersonalDataManager. - EXPECT_CALL(personal_data_manager_, UpdateProfile(_)).Times(0); - // No autofill profile should get invalidated in PaymentsProfileComparator. - EXPECT_CALL(*profile_comparator_, Invalidate(_)).Times(0); + // No autofill profile should get updated in the PaymentRequest. + EXPECT_CALL(*payment_request_, UpdateAutofillProfile(_)).Times(0); // Call the controller delegate method. EXPECT_TRUE([base_view_controller.presentedViewController @@ -270,17 +243,10 @@ // No autofill profile should get added to the PaymentRequest. EXPECT_CALL(*payment_request_, AddAutofillProfile(_)).Times(0); - // No autofill profile should get added to the PersonalDataManager. - EXPECT_CALL(personal_data_manager_, AddProfile(_)).Times(0); - // Expect an autofill profile to be updated in the PersonalDataManager. - EXPECT_CALL(personal_data_manager_, - UpdateProfile(ProfileMatches("John Doe", "CA" /* Canada */, - "Quebec", "1 650-211-1111"))) - .Times(1); - // Expect an autofill profile to be invalidated in PaymentsProfileComparator. - EXPECT_CALL(*profile_comparator_, - Invalidate(ProfileMatches("John Doe", "CA" /* Canada */, "Quebec", - "1 650-211-1111"))) + // Expect an autofill profile to be updated in the PaymentRequest. + EXPECT_CALL(*payment_request_, + UpdateAutofillProfile(ProfileMatches( + "John Doe", "CA" /* Canada */, "Quebec", "1 650-211-1111"))) .Times(1); // Call the controller delegate method.
diff --git a/ios/chrome/browser/ui/payments/contact_info_edit_coordinator.mm b/ios/chrome/browser/ui/payments/contact_info_edit_coordinator.mm index 3b86f9bc..e72c087 100644 --- a/ios/chrome/browser/ui/payments/contact_info_edit_coordinator.mm +++ b/ios/chrome/browser/ui/payments/contact_info_edit_coordinator.mm
@@ -13,7 +13,6 @@ #include "components/autofill/core/browser/personal_data_manager.h" #include "components/autofill/core/browser/validation.h" #include "components/autofill/core/common/autofill_constants.h" -#include "components/payments/core/payments_profile_comparator.h" #include "ios/chrome/browser/payments/payment_request.h" #import "ios/chrome/browser/ui/autofill/autofill_ui_type_util.h" #import "ios/chrome/browser/ui/payments/contact_info_edit_mediator.h" @@ -88,9 +87,9 @@ // Create an empty autofill profile. If a profile is being edited, copy over // the information. autofill::AutofillProfile profile = - self.profile ? *self.profile - : autofill::AutofillProfile(base::GenerateGUID(), - autofill::kSettingsOrigin); + self.profile ? *self.profile : autofill::AutofillProfile(); + // Set the origin, or override it if the autofill profile is being edited. + profile.set_origin(autofill::kSettingsOrigin); for (EditorField* field in fields) { profile.SetInfo(autofill::AutofillType( @@ -100,20 +99,12 @@ } if (!self.profile) { - self.paymentRequest->GetPersonalDataManager()->AddProfile(profile); - // Add the profile to the list of profiles in |self.paymentRequest|. self.profile = self.paymentRequest->AddAutofillProfile(profile); } else { - // Override the origin. - profile.set_origin(autofill::kSettingsOrigin); - self.paymentRequest->GetPersonalDataManager()->UpdateProfile(profile); - - // Cached profile must be invalidated once the profile is modified. - _paymentRequest->profile_comparator()->Invalidate(profile); - // Update the original profile instance that is being edited. *self.profile = profile; + self.paymentRequest->UpdateAutofillProfile(profile); } [self.delegate contactInfoEditCoordinator:self
diff --git a/ios/chrome/browser/ui/payments/contact_info_edit_coordinator_unittest.mm b/ios/chrome/browser/ui/payments/contact_info_edit_coordinator_unittest.mm index 31825e2..6cbc0c6 100644 --- a/ios/chrome/browser/ui/payments/contact_info_edit_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/payments/contact_info_edit_coordinator_unittest.mm
@@ -14,7 +14,6 @@ #include "components/autofill/core/browser/autofill_test_utils.h" #include "components/autofill/core/browser/test_personal_data_manager.h" #include "components/autofill/core/browser/test_region_data_loader.h" -#include "components/payments/core/payments_profile_comparator.h" #include "ios/chrome/browser/payments/payment_request_test_util.h" #include "ios/chrome/browser/payments/payment_request_unittest_base.h" #include "ios/chrome/browser/payments/test_payment_request.h" @@ -33,21 +32,8 @@ #endif namespace { -class MockTestPersonalDataManager : public autofill::TestPersonalDataManager { - public: - MockTestPersonalDataManager() : TestPersonalDataManager() {} - MOCK_METHOD1(AddProfile, void(const autofill::AutofillProfile&)); - MOCK_METHOD1(UpdateProfile, void(const autofill::AutofillProfile&)); -}; -class MockPaymentsProfileComparator - : public payments::PaymentsProfileComparator { - public: - MockPaymentsProfileComparator(const std::string& app_locale, - const payments::PaymentOptionsProvider& options) - : PaymentsProfileComparator(app_locale, options) {} - MOCK_METHOD1(Invalidate, void(const autofill::AutofillProfile&)); -}; +using ::testing::_; class MockTestPaymentRequest : public payments::TestPaymentRequest { public: @@ -61,6 +47,7 @@ personal_data_manager) {} MOCK_METHOD1(AddAutofillProfile, autofill::AutofillProfile*(const autofill::AutofillProfile&)); + MOCK_METHOD1(UpdateAutofillProfile, void(const autofill::AutofillProfile&)); }; MATCHER_P3(ProfileMatches, name, email, phone_number, "") { @@ -91,8 +78,6 @@ required:YES], ]; } - -using ::testing::_; } // namespace class PaymentRequestContactInfoEditCoordinatorTest @@ -110,10 +95,6 @@ payment_request_test_util::CreateTestWebPaymentRequest(), browser_state(), web_state(), &personal_data_manager_); - profile_comparator_ = std::make_unique<MockPaymentsProfileComparator>( - payment_request_->GetApplicationLocale(), *payment_request_.get()); - payment_request_->SetProfileComparator(profile_comparator_.get()); - test_region_data_loader_.set_synchronous_callback(true); payment_request_->SetRegionDataLoader(&test_region_data_loader_); } @@ -124,9 +105,8 @@ PaymentRequestUnitTestBase::TearDown(); } - MockTestPersonalDataManager personal_data_manager_; + autofill::TestPersonalDataManager personal_data_manager_; autofill::TestRegionDataLoader test_region_data_loader_; - std::unique_ptr<MockPaymentsProfileComparator> profile_comparator_; std::unique_ptr<MockTestPaymentRequest> payment_request_; }; @@ -198,15 +178,8 @@ AddAutofillProfile( ProfileMatches("John Doe", "john@doe.com", "1 650-211-1111"))) .Times(1); - // Expect an autofill profile to be added to the PersonalDataManager. - EXPECT_CALL( - personal_data_manager_, - AddProfile(ProfileMatches("John Doe", "john@doe.com", "1 650-211-1111"))) - .Times(1); - // No autofill profile should get updated in the PersonalDataManager. - EXPECT_CALL(personal_data_manager_, UpdateProfile(_)).Times(0); - // No autofill profile should get invalidated in PaymentsProfileComparator. - EXPECT_CALL(*profile_comparator_, Invalidate(_)).Times(0); + // No autofill profile should get updated in the PaymentRequest. + EXPECT_CALL(*payment_request_, UpdateAutofillProfile(_)).Times(0); // Call the controller delegate method. EXPECT_TRUE([base_view_controller.presentedViewController @@ -259,18 +232,11 @@ // No autofill profile should get added to the PaymentRequest. EXPECT_CALL(*payment_request_, AddAutofillProfile(_)).Times(0); - // No autofill profile should get added to the PersonalDataManager. - EXPECT_CALL(personal_data_manager_, AddProfile(_)).Times(0); - // Expect an autofill profile to be updated in the PersonalDataManager. - EXPECT_CALL(personal_data_manager_, - UpdateProfile( + // Expect an autofill profile to be updated in the PaymentRequest. + EXPECT_CALL(*payment_request_, + UpdateAutofillProfile( ProfileMatches("John Doe", "john@doe.com", "1 650-211-1111"))) .Times(1); - // Expect an autofill profile to be invalidated in PaymentsProfileComparator. - EXPECT_CALL( - *profile_comparator_, - Invalidate(ProfileMatches("John Doe", "john@doe.com", "1 650-211-1111"))) - .Times(1); // Call the controller delegate method. EXPECT_TRUE([base_view_controller.presentedViewController
diff --git a/ios/chrome/browser/ui/payments/credit_card_edit_coordinator.mm b/ios/chrome/browser/ui/payments/credit_card_edit_coordinator.mm index a3faf53..ee61c85 100644 --- a/ios/chrome/browser/ui/payments/credit_card_edit_coordinator.mm +++ b/ios/chrome/browser/ui/payments/credit_card_edit_coordinator.mm
@@ -128,9 +128,10 @@ // Create an empty credit card. If a credit card is being edited, copy over // the information. autofill::CreditCard creditCard = - _creditCard ? *_creditCard - : autofill::CreditCard(base::GenerateGUID(), - autofill::kSettingsOrigin); + _creditCard ? *_creditCard : autofill::CreditCard(); + + // Set the origin, or override it if the card is being edited. + creditCard.set_origin(autofill::kSettingsOrigin); for (EditorField* field in fields) { if (field.autofillUIType == AutofillUITypeCreditCardExpDate) { @@ -159,25 +160,15 @@ } if (!_creditCard) { - if (saveCreditCard) - _paymentRequest->GetPersonalDataManager()->AddCreditCard(creditCard); - // Add the credit card to the list of payment methods in |_paymentRequest|. - _paymentMethod = _paymentRequest->AddAutofillPaymentInstrument(creditCard); + if (saveCreditCard) { + _paymentMethod = + _paymentRequest->CreateAndAddAutofillPaymentInstrument(creditCard); + } } else { - // Override the origin. - creditCard.set_origin(autofill::kSettingsOrigin); - // Update the original credit card instance that is being edited. *_creditCard = creditCard; - - if (autofill::IsCreditCardLocal(creditCard)) { - _paymentRequest->GetPersonalDataManager()->UpdateCreditCard(creditCard); - } else { - // Update server credit card's billing address. - _paymentRequest->GetPersonalDataManager()->UpdateServerCardMetadata( - creditCard); - } + _paymentRequest->UpdateAutofillPaymentInstrument(creditCard); } [_delegate creditCardEditCoordinator:self
diff --git a/ios/chrome/browser/ui/payments/credit_card_edit_coordinator_unittest.mm b/ios/chrome/browser/ui/payments/credit_card_edit_coordinator_unittest.mm index 4336165..6421d5d 100644 --- a/ios/chrome/browser/ui/payments/credit_card_edit_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/payments/credit_card_edit_coordinator_unittest.mm
@@ -32,12 +32,8 @@ #endif namespace { -class MockTestPersonalDataManager : public autofill::TestPersonalDataManager { - public: - MockTestPersonalDataManager() : TestPersonalDataManager() {} - MOCK_METHOD1(AddCreditCard, void(const autofill::CreditCard&)); - MOCK_METHOD1(UpdateCreditCard, void(const autofill::CreditCard&)); -}; + +using ::testing::_; class MockPaymentRequest : public payments::TestPaymentRequest { public: @@ -50,8 +46,10 @@ web_state, personal_data_manager) {} MOCK_METHOD1( - AddAutofillPaymentInstrument, + CreateAndAddAutofillPaymentInstrument, payments::AutofillPaymentInstrument*(const autofill::CreditCard&)); + MOCK_METHOD1(UpdateAutofillPaymentInstrument, + void(const autofill::CreditCard&)); }; MATCHER_P5(CreditCardMatches, @@ -109,8 +107,6 @@ required:YES], ]; } - -using ::testing::_; } // namespace class PaymentRequestCreditCardEditCoordinatorTest @@ -129,7 +125,7 @@ void TearDown() override { PaymentRequestUnitTestBase::TearDown(); } - MockTestPersonalDataManager personal_data_manager_; + autofill::TestPersonalDataManager personal_data_manager_; std::unique_ptr<MockPaymentRequest> payment_request_; }; @@ -199,16 +195,12 @@ // Expect a payment method to be added to the PaymentRequest. EXPECT_CALL(*payment_request_, - AddAutofillPaymentInstrument(CreditCardMatches( + CreateAndAddAutofillPaymentInstrument(CreditCardMatches( "4111111111111111", "John Doe", "12", "2090", "12345"))) .Times(1); - // Expect a payment method to be added to the PersonalDataManager. - EXPECT_CALL(personal_data_manager_, - AddCreditCard(CreditCardMatches("4111111111111111", "John Doe", - "12", "2090", "12345"))) - .Times(1); - // No payment method should get updated in the PersonalDataManager. - EXPECT_CALL(personal_data_manager_, UpdateCreditCard(_)).Times(0); + + // No payment method should get updated in the PaymentRequest. + EXPECT_CALL(*payment_request_, UpdateAutofillPaymentInstrument(_)).Times(0); // Call the controller delegate method. EXPECT_TRUE([base_view_controller.presentedViewController @@ -256,15 +248,11 @@ base::test::ios::SpinRunLoopWithMaxDelay(base::TimeDelta::FromSecondsD(1.0)); EXPECT_NE(nil, base_view_controller.presentedViewController); - // Expect a payment method to be added to the PaymentRequest. - EXPECT_CALL(*payment_request_, - AddAutofillPaymentInstrument(CreditCardMatches( - "4111111111111111", "John Doe", "12", "2090", "12345"))) - .Times(1); - // No payment method should get added to the PersonalDataManager. - EXPECT_CALL(personal_data_manager_, AddCreditCard(_)).Times(0); - // No payment method should get updated in the PersonalDataManager. - EXPECT_CALL(personal_data_manager_, UpdateCreditCard(_)).Times(0); + // No payment method should get added to the PaymentRequest. + EXPECT_CALL(*payment_request_, CreateAndAddAutofillPaymentInstrument(_)) + .Times(0); + // No payment method should get updated in the PaymentRequest. + EXPECT_CALL(*payment_request_, UpdateAutofillPaymentInstrument(_)).Times(0); // Call the controller delegate method. EXPECT_TRUE([base_view_controller.presentedViewController @@ -318,13 +306,12 @@ EXPECT_NE(nil, base_view_controller.presentedViewController); // No payment method should get added to the PaymentRequest. - EXPECT_CALL(*payment_request_, AddAutofillPaymentInstrument(_)).Times(0); - // No payment method should get added to the PersonalDataManager. - EXPECT_CALL(personal_data_manager_, AddCreditCard(_)).Times(0); - // Expect a payment method to be updated in the PersonalDataManager. - EXPECT_CALL(personal_data_manager_, - UpdateCreditCard(CreditCardMatches("4111111111111111", "John Doe", - "12", "2090", "12345"))) + EXPECT_CALL(*payment_request_, CreateAndAddAutofillPaymentInstrument(_)) + .Times(0); + // No payment method should get updated in the PaymentRequest. + EXPECT_CALL(*payment_request_, + UpdateAutofillPaymentInstrument(CreditCardMatches( + "4111111111111111", "John Doe", "12", "2090", "12345"))) .Times(1); // Call the controller delegate method.
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn index 2a5bf898..84f4af5c 100644 --- a/ios/chrome/browser/ui/settings/BUILD.gn +++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -374,6 +374,7 @@ "//ios/testing/earl_grey:earl_grey_support", "//ios/third_party/earl_grey:earl_grey+link", "//ios/web", + "//ios/web:earl_grey_test_support", "//ios/web/public/test", "//ios/web/public/test/http_server", "//net",
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.mm index 6162327..550a405 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.mm
@@ -31,7 +31,6 @@ #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/browsing_data/browsing_data_removal_controller.h" #include "ios/chrome/browser/browsing_data/browsing_data_remove_mask.h" -#include "ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h" #include "ios/chrome/browser/chrome_url_constants.h" #include "ios/chrome/browser/experimental_flags.h" #include "ios/chrome/browser/feature_engagement/tracker_factory.h"
diff --git a/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm b/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm index 5f42d8d..dac9efd 100644 --- a/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm +++ b/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm
@@ -35,6 +35,10 @@ #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/testing/wait_util.h" #import "ios/third_party/material_components_ios/src/components/Snackbar/src/MaterialSnackbar.h" +#include "ios/web/public/test/earl_grey/web_view_actions.h" +#include "ios/web/public/test/earl_grey/web_view_matchers.h" +#include "ios/web/public/test/http_server/http_server.h" +#include "ios/web/public/test/http_server/http_server_util.h" #include "ui/base/l10n/l10n_util.h" #include "url/gurl.h" #include "url/origin.h" @@ -1535,4 +1539,45 @@ performAction:grey_tap()]; } +// Opens a page with password input, focuses it, clocks "Show All" in the +// keyboard accessory and verifies that the password list is presented. +- (void)testOpenSettingsFromManualFallback { + // Saving a form is needed for using the "password details" view. + SaveExamplePasswordForm(); + + const GURL kPasswordURL(web::test::HttpServer::MakeUrl("http://form/")); + std::map<GURL, std::string> responses; + responses[kPasswordURL] = "<input id='password' type='password'>"; + web::test::SetUpSimpleHttpServer(responses); + [ChromeEarlGrey loadURL:kPasswordURL]; + + // Focus the password field. + // Brings up the keyboard by tapping on one of the form's field. + [[EarlGrey + selectElementWithMatcher:web::WebViewInWebState( + chrome_test_util::GetCurrentWebState())] + performAction:web::WebViewTapElement( + chrome_test_util::GetCurrentWebState(), "password")]; + + // Wait until the keyboard shows up before tapping. + id<GREYMatcher> showAll = grey_allOf( + grey_accessibilityLabel(@"Show All\u2026"), grey_interactable(), nil); + GREYCondition* condition = + [GREYCondition conditionWithName:@"Wait for the keyboard to show up." + block:^BOOL { + NSError* error = nil; + [[EarlGrey selectElementWithMatcher:showAll] + assertWithMatcher:grey_notNil() + error:&error]; + return (error == nil); + }]; + GREYAssert([condition waitWithTimeout:testing::kWaitForUIElementTimeout], + @"No keyboard with 'Show All' button showed up."); + [[EarlGrey selectElementWithMatcher:showAll] performAction:grey_tap()]; + + [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabel( + @"example.com, concrete username")] + assertWithMatcher:grey_notNil()]; +} + @end
diff --git a/ios/chrome/browser/ui/settings/reauthentication_module_unittest.mm b/ios/chrome/browser/ui/settings/reauthentication_module_unittest.mm index 85d13ae..e287561 100644 --- a/ios/chrome/browser/ui/settings/reauthentication_module_unittest.mm +++ b/ios/chrome/browser/ui/settings/reauthentication_module_unittest.mm
@@ -8,6 +8,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "testing/platform_test.h" #import "third_party/ocmock/OCMock/OCMock.h" #import "third_party/ocmock/gtest_support.h" @@ -42,7 +43,7 @@ namespace { -class ReauthenticationModuleTest : public ::testing::Test { +class ReauthenticationModuleTest : public PlatformTest { protected: ReauthenticationModuleTest() {}
diff --git a/ios/chrome/test/app/history_test_util.mm b/ios/chrome/test/app/history_test_util.mm index 50c6073..fb0277f 100644 --- a/ios/chrome/test/app/history_test_util.mm +++ b/ios/chrome/test/app/history_test_util.mm
@@ -8,7 +8,7 @@ #import "ios/chrome/app/main_controller.h" #import "ios/chrome/app/main_controller_private.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" -#include "ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h" +#include "ios/chrome/browser/browsing_data/browsing_data_remove_mask.h" #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/testing/wait_util.h"
diff --git a/media/audio/BUILD.gn b/media/audio/BUILD.gn index af0dcc21..10d786f 100644 --- a/media/audio/BUILD.gn +++ b/media/audio/BUILD.gn
@@ -73,7 +73,6 @@ "audio_debug_recording_helper.h", "audio_debug_recording_manager.cc", "audio_debug_recording_manager.h", - "audio_debug_recording_session.cc", "audio_debug_recording_session.h", "audio_debug_recording_session_impl.cc", "audio_debug_recording_session_impl.h", @@ -338,6 +337,8 @@ visibility = [ "//media:test_support" ] testonly = true sources = [ + "audio_debug_recording_test.cc", + "audio_debug_recording_test.h", "audio_device_info_accessor_for_tests.cc", "audio_device_info_accessor_for_tests.h", "audio_system_test_util.cc", @@ -361,6 +362,7 @@ ] deps = [ "//base", + "//base/test:test_support", # Do not add any other //media deps except this; it will automatically pull # a dep on //media which is required to ensure test_support targets all use
diff --git a/media/audio/audio_debug_file_writer.cc b/media/audio/audio_debug_file_writer.cc index 9143a88..d38fd88 100644 --- a/media/audio/audio_debug_file_writer.cc +++ b/media/audio/audio_debug_file_writer.cc
@@ -304,8 +304,4 @@ return !!file_writer_; } -const base::FilePath::CharType* AudioDebugFileWriter::GetFileExtension() { - return FILE_PATH_LITERAL("wav"); -} - } // namespace media
diff --git a/media/audio/audio_debug_file_writer.h b/media/audio/audio_debug_file_writer.h index a11cd5b..18bc9f2 100644 --- a/media/audio/audio_debug_file_writer.h +++ b/media/audio/audio_debug_file_writer.h
@@ -52,11 +52,6 @@ // called from any sequence. virtual bool WillWrite(); - // Gets the extension for the file type the as a string, for example "wav". - // Can be called before calling Start() to add the appropriate extension to - // the filename. - virtual const base::FilePath::CharType* GetFileExtension(); - protected: const AudioParameters params_;
diff --git a/media/audio/audio_debug_file_writer_unittest.cc b/media/audio/audio_debug_file_writer_unittest.cc index 805b1d88..436b0dea 100644 --- a/media/audio/audio_debug_file_writer_unittest.cc +++ b/media/audio/audio_debug_file_writer_unittest.cc
@@ -242,12 +242,6 @@ RecordAndVerifyOnce(); } -TEST_P(AudioDebugFileWriterTest, GetFileExtension) { - debug_writer_.reset(new AudioDebugFileWriter(params_)); - EXPECT_EQ(FILE_PATH_LITERAL("wav"), - base::FilePath::StringType(debug_writer_->GetFileExtension())); -} - TEST_P(AudioDebugFileWriterSingleThreadTest, DeletedBeforeRecordingFinishedOnFileThread) { debug_writer_.reset(new AudioDebugFileWriter(params_));
diff --git a/media/audio/audio_debug_recording_helper.cc b/media/audio/audio_debug_recording_helper.cc index 68e975e..52fc81a3 100644 --- a/media/audio/audio_debug_recording_helper.cc +++ b/media/audio/audio_debug_recording_helper.cc
@@ -32,13 +32,13 @@ void AudioDebugRecordingHelper::EnableDebugRecording( const base::FilePath& file_name_suffix, - CreateFileCallback create_file_callback) { + CreateWavFileCallback create_file_callback) { DCHECK(task_runner_->BelongsToCurrentThread()); DCHECK(!debug_writer_); debug_writer_ = CreateAudioDebugFileWriter(params_); std::move(create_file_callback) - .Run(file_name_suffix.AddExtension(debug_writer_->GetFileExtension()), + .Run(file_name_suffix, base::BindOnce(&AudioDebugRecordingHelper::StartDebugRecordingToFile, weak_factory_.GetWeakPtr())); }
diff --git a/media/audio/audio_debug_recording_helper.h b/media/audio/audio_debug_recording_helper.h index 889d9cd..3947fd7 100644 --- a/media/audio/audio_debug_recording_helper.h +++ b/media/audio/audio_debug_recording_helper.h
@@ -50,7 +50,7 @@ // soundcard thread -> file thread. class MEDIA_EXPORT AudioDebugRecordingHelper : public AudioDebugRecorder { public: - using CreateFileCallback = base::OnceCallback<void( + using CreateWavFileCallback = base::OnceCallback<void( const base::FilePath&, base::OnceCallback<void(base::File)> reply_callback)>; @@ -63,7 +63,7 @@ // Enable debug recording. Creates |debug_writer_| and runs // |create_file_callback| to create debug recording file. virtual void EnableDebugRecording(const base::FilePath& file_name_suffix, - CreateFileCallback create_file_callback); + CreateWavFileCallback create_file_callback); // Disable debug recording. Destroys |debug_writer_|. virtual void DisableDebugRecording();
diff --git a/media/audio/audio_debug_recording_helper_unittest.cc b/media/audio/audio_debug_recording_helper_unittest.cc index 7626b34..eeee9d4 100644 --- a/media/audio/audio_debug_recording_helper_unittest.cc +++ b/media/audio/audio_debug_recording_helper_unittest.cc
@@ -43,8 +43,7 @@ const base::FilePath::CharType kFileNameSuffix[] = FILE_PATH_LITERAL("output.1"); -// The file extension the mock should return in GetFileExtension(). -const base::FilePath::CharType kFileExtension[] = FILE_PATH_LITERAL("wav"); +const base::FilePath::CharType kWavExtension[] = FILE_PATH_LITERAL("wav"); } // namespace @@ -76,7 +75,6 @@ } MOCK_METHOD0(WillWrite, bool()); - MOCK_METHOD0(GetFileExtension, const base::FilePath::CharType*()); // Set reference data to compare against. Must be called before Write() is // called. @@ -107,11 +105,10 @@ private: // Creates the mock writer. After the mock writer is returned, we always - // expect GetFileExtension() and Start() to be called on it by the helper. + // expect Start() to be called on it by the helper. std::unique_ptr<AudioDebugFileWriter> CreateAudioDebugFileWriter( const AudioParameters& params) override { MockAudioDebugFileWriter* writer = new MockAudioDebugFileWriter(params); - EXPECT_CALL(*writer, GetFileExtension()).WillOnce(Return(kFileExtension)); EXPECT_CALL(*writer, DoStart(true)); return base::WrapUnique<AudioDebugFileWriter>(writer); } @@ -139,20 +136,21 @@ MOCK_METHOD0(OnAudioDebugRecordingHelperDestruction, void()); // Bound and passed to AudioDebugRecordingHelper::EnableDebugRecording as - // AudioDebugRecordingHelper::CreateFileCallback. - void CreateFile(const base::FilePath& file_name_suffix, - base::OnceCallback<void(base::File)> reply_callback) { + // AudioDebugRecordingHelper::CreateWavFileCallback. + void CreateWavFile(const base::FilePath& file_name_suffix, + base::OnceCallback<void(base::File)> reply_callback) { // Check that AudioDebugRecordingHelper::EnableDebugRecording adds file // extension to file name suffix. - EXPECT_EQ(file_name_suffix_.AddExtension(kFileExtension), file_name_suffix); + EXPECT_EQ(file_name_suffix_, file_name_suffix); base::ScopedTempDir temp_dir; ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); base::FilePath base_file_path( temp_dir.GetPath().Append(base::FilePath(kBaseFileName))); base::FilePath file_path = - base_file_path.AddExtension(file_name_suffix.value()); - base::File debug_file(base::File( - file_path, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE)); + base_file_path.AddExtension(file_name_suffix.value()) + .AddExtension(kWavExtension); + base::File debug_file( + file_path, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); // Run |reply_callback| with a valid file for expected // MockAudioDebugFileWriter::Start mocked call to happen. std::move(reply_callback).Run(std::move(debug_file)); @@ -199,7 +197,7 @@ recording_helper->EnableDebugRecording( file_name_suffix_, - base::BindOnce(&AudioDebugRecordingHelperTest::CreateFile, + base::BindOnce(&AudioDebugRecordingHelperTest::CreateWavFile, base::Unretained(this))); EXPECT_CALL(*static_cast<MockAudioDebugFileWriter*>( recording_helper->debug_writer_.get()), @@ -208,7 +206,7 @@ recording_helper->EnableDebugRecording( file_name_suffix_, - base::BindOnce(&AudioDebugRecordingHelperTest::CreateFile, + base::BindOnce(&AudioDebugRecordingHelperTest::CreateWavFile, base::Unretained(this))); EXPECT_CALL(*static_cast<MockAudioDebugFileWriter*>( recording_helper->debug_writer_.get()), @@ -242,7 +240,7 @@ recording_helper->EnableDebugRecording( file_name_suffix_, - base::BindOnce(&AudioDebugRecordingHelperTest::CreateFile, + base::BindOnce(&AudioDebugRecordingHelperTest::CreateWavFile, base::Unretained(this))); MockAudioDebugFileWriter* mock_audio_file_writer = static_cast<MockAudioDebugFileWriter*>( @@ -264,7 +262,7 @@ // disabling. recording_helper->EnableDebugRecording( file_name_suffix_, - base::BindOnce(&AudioDebugRecordingHelperTest::CreateFile, + base::BindOnce(&AudioDebugRecordingHelperTest::CreateWavFile, base::Unretained(this))); mock_audio_file_writer = static_cast<MockAudioDebugFileWriter*>( recording_helper->debug_writer_.get());
diff --git a/media/audio/audio_debug_recording_manager.cc b/media/audio/audio_debug_recording_manager.cc index 7d1c337..7d8ebc5 100644 --- a/media/audio/audio_debug_recording_manager.cc +++ b/media/audio/audio_debug_recording_manager.cc
@@ -42,7 +42,7 @@ AudioDebugRecordingManager::~AudioDebugRecordingManager() = default; void AudioDebugRecordingManager::EnableDebugRecording( - CreateFileCallback create_file_callback) { + CreateWavFileCallback create_file_callback) { DCHECK(task_runner_->BelongsToCurrentThread()); DCHECK(!create_file_callback.is_null()); create_file_callback_ = std::move(create_file_callback);
diff --git a/media/audio/audio_debug_recording_manager.h b/media/audio/audio_debug_recording_manager.h index 23ac55891..e05f68c 100644 --- a/media/audio/audio_debug_recording_manager.h +++ b/media/audio/audio_debug_recording_manager.h
@@ -57,7 +57,7 @@ class MEDIA_EXPORT AudioDebugRecordingManager { public: - using CreateFileCallback = base::RepeatingCallback<void( + using CreateWavFileCallback = base::RepeatingCallback<void( const base::FilePath&, base::OnceCallback<void(base::File)> reply_callback)>; @@ -66,7 +66,7 @@ virtual ~AudioDebugRecordingManager(); // Enables and disables debug recording. - virtual void EnableDebugRecording(CreateFileCallback create_file_callback); + virtual void EnableDebugRecording(CreateWavFileCallback create_file_callback); virtual void DisableDebugRecording(); // Registers a source and returns a wrapped recorder. |stream_type| is added @@ -110,7 +110,7 @@ // Callback for creating debug recording files. When this is not null, debug // recording is enabled. - CreateFileCallback create_file_callback_; + CreateWavFileCallback create_file_callback_; base::WeakPtrFactory<AudioDebugRecordingManager> weak_factory_; DISALLOW_COPY_AND_ASSIGN(AudioDebugRecordingManager);
diff --git a/media/audio/audio_debug_recording_manager_unittest.cc b/media/audio/audio_debug_recording_manager_unittest.cc index 3e7b8883..dad3e14 100644 --- a/media/audio/audio_debug_recording_manager_unittest.cc +++ b/media/audio/audio_debug_recording_manager_unittest.cc
@@ -50,9 +50,9 @@ }; // Function bound and passed to AudioDebugRecordingManager::EnableDebugRecording -// as AudioDebugRecordingManager::CreateFileCallback. -void CreateFile(const base::FilePath& file_path, - base::OnceCallback<void(base::File)>) {} +// as AudioDebugRecordingManager::CreateWavFileCallback. +void CreateWavFile(const base::FilePath& file_path, + base::OnceCallback<void(base::File)>) {} } // namespace @@ -78,7 +78,7 @@ MOCK_METHOD1(DoEnableDebugRecording, void(const base::FilePath&)); void EnableDebugRecording(const base::FilePath& file_name_suffix, - AudioDebugRecordingHelper::CreateFileCallback + AudioDebugRecordingHelper::CreateWavFileCallback create_file_callback) override { DoEnableDebugRecording(file_name_suffix); } @@ -147,10 +147,10 @@ int AudioDebugRecordingManagerTest::expected_next_source_id_ = 1; -// Shouldn't do anything but store the CreateFileCallback, i.e. no calls to +// Shouldn't do anything but store the CreateWavFileCallback, i.e. no calls to // recorders. TEST_F(AudioDebugRecordingManagerTest, EnableDisable) { - manager_.EnableDebugRecording(base::BindRepeating(&CreateFile)); + manager_.EnableDebugRecording(base::BindRepeating(&CreateWavFile)); manager_.DisableDebugRecording(); } @@ -197,7 +197,7 @@ EXPECT_CALL(*mock_recording_helper, DisableDebugRecording()); } - manager_.EnableDebugRecording(base::BindRepeating(&CreateFile)); + manager_.EnableDebugRecording(base::BindRepeating(&CreateWavFile)); manager_.DisableDebugRecording(); } @@ -210,7 +210,7 @@ TEST_F(AudioDebugRecordingManagerTest, EnableRegisterDisable) { ScopedExpectEnableAfterCreateHelper scoped_enable_after_create_helper; - manager_.EnableDebugRecording(base::BindRepeating(&CreateFile)); + manager_.EnableDebugRecording(base::BindRepeating(&CreateWavFile)); const AudioParameters params; std::vector<std::unique_ptr<AudioDebugRecorder>> recorders;
diff --git a/media/audio/audio_debug_recording_session.cc b/media/audio/audio_debug_recording_session.cc deleted file mode 100644 index ed08ca3..0000000 --- a/media/audio/audio_debug_recording_session.cc +++ /dev/null
@@ -1,20 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "media/audio/audio_debug_recording_session.h" - -#include "base/files/file_path.h" -#include "media/audio/audio_debug_recording_session_impl.h" - -namespace media { - -AudioDebugRecordingSession::~AudioDebugRecordingSession() {} - -std::unique_ptr<AudioDebugRecordingSession> AudioDebugRecordingSession::Create( - const base::FilePath& debug_recording_file_path) { - return std::make_unique<AudioDebugRecordingSessionImpl>( - debug_recording_file_path); -} - -} // namespace media
diff --git a/media/audio/audio_debug_recording_session.h b/media/audio/audio_debug_recording_session.h index 9689481..e70a824 100644 --- a/media/audio/audio_debug_recording_session.h +++ b/media/audio/audio_debug_recording_session.h
@@ -5,24 +5,16 @@ #ifndef MEDIA_AUDIO_AUDIO_DEBUG_RECORDING_SESSION_H_ #define MEDIA_AUDIO_AUDIO_DEBUG_RECORDING_SESSION_H_ -#include <memory> - #include "base/macros.h" #include "media/base/media_export.h" -namespace base { -class FilePath; -} - namespace media { -// Creating/Destroying an AudioDebugRecordingSession object enables/disables -// audio debug recording. +// Enables/disables audio debug recording on construction/destruction. Objects +// are created using audio::CreateAudioDebugRecordingSession. class MEDIA_EXPORT AudioDebugRecordingSession { public: - virtual ~AudioDebugRecordingSession(); - static std::unique_ptr<AudioDebugRecordingSession> Create( - const base::FilePath& debug_recording_file_path); + virtual ~AudioDebugRecordingSession() = default; protected: AudioDebugRecordingSession() = default;
diff --git a/media/audio/audio_debug_recording_session_impl.cc b/media/audio/audio_debug_recording_session_impl.cc index c9bc2082..cf20ada 100644 --- a/media/audio/audio_debug_recording_session_impl.cc +++ b/media/audio/audio_debug_recording_session_impl.cc
@@ -23,9 +23,11 @@ namespace { -void CreateFile(const base::FilePath& debug_recording_file_path, - const base::FilePath& file_name_suffix, - base::OnceCallback<void(base::File)> reply_callback) { +const base::FilePath::CharType kWavExtension[] = FILE_PATH_LITERAL("wav"); + +void CreateWavFile(const base::FilePath& debug_recording_file_path, + const base::FilePath& file_name_suffix, + base::OnceCallback<void(base::File)> reply_callback) { base::PostTaskWithTraitsAndReplyWithResult( FROM_HERE, {base::MayBlock(), base::TaskPriority::BACKGROUND, @@ -35,7 +37,8 @@ return base::File(file_name, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); }, - debug_recording_file_path.AddExtension(file_name_suffix.value())), + debug_recording_file_path.AddExtension(file_name_suffix.value()) + .AddExtension(kWavExtension)), std::move(reply_callback)); } @@ -51,7 +54,7 @@ FROM_HERE, base::BindOnce( [](AudioManager* manager, - AudioDebugRecordingManager::CreateFileCallback + AudioDebugRecordingManager::CreateWavFileCallback create_file_callback) { AudioDebugRecordingManager* debug_recording_manager = manager->GetAudioDebugRecordingManager(); @@ -61,7 +64,7 @@ std::move(create_file_callback)); }, base::Unretained(audio_manager), - base::BindRepeating(&CreateFile, debug_recording_file_path))); + base::BindRepeating(&CreateWavFile, debug_recording_file_path))); } AudioDebugRecordingSessionImpl::~AudioDebugRecordingSessionImpl() {
diff --git a/media/audio/audio_debug_recording_session_impl_unittest.cc b/media/audio/audio_debug_recording_session_impl_unittest.cc index eacfdc0..70eac86 100644 --- a/media/audio/audio_debug_recording_session_impl_unittest.cc +++ b/media/audio/audio_debug_recording_session_impl_unittest.cc
@@ -10,11 +10,10 @@ #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" #include "base/test/scoped_task_environment.h" +#include "media/audio/audio_debug_recording_test.h" #include "media/audio/mock_audio_debug_recording_manager.h" #include "media/audio/mock_audio_manager.h" -#include "media/audio/test_audio_thread.h" #include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" namespace media { @@ -22,10 +21,11 @@ const base::FilePath::CharType kBaseFileName[] = FILE_PATH_LITERAL("debug_recording"); +const base::FilePath::CharType kWavExtension[] = FILE_PATH_LITERAL("wav"); const base::FilePath::CharType kInputFileNameSuffix[] = - FILE_PATH_LITERAL("input.1.wav"); + FILE_PATH_LITERAL("input.1"); const base::FilePath::CharType kOutputFileNameSuffix[] = - FILE_PATH_LITERAL("output.1.wav"); + FILE_PATH_LITERAL("output.1"); void OnFileCreated(base::File debug_file) {} @@ -33,8 +33,7 @@ // MockAudioDebugRecordingManager::EnableDebugRecording mocked method to test // |create_file_callback| behavior. void CreateInputOutputDebugRecordingFiles( - const base::RepeatingCallback<void(const base::FilePath&, - base::OnceCallback<void(base::File)>)>& + const AudioDebugRecordingManager::CreateWavFileCallback& create_file_callback) { create_file_callback.Run(base::FilePath(kInputFileNameSuffix), base::BindOnce(&OnFileCreated)); @@ -44,29 +43,11 @@ } // namespace -class AudioDebugRecordingSessionImplTest : public testing::Test { +class AudioDebugRecordingSessionImplTest : public AudioDebugRecordingTest { public: AudioDebugRecordingSessionImplTest() { SetBaseFilePath(); } protected: - void CreateAudioManager() { - mock_audio_manager_ = - std::make_unique<MockAudioManager>(std::make_unique<TestAudioThread>()); - ASSERT_NE(nullptr, AudioManager::Get()); - ASSERT_EQ(static_cast<AudioManager*>(mock_audio_manager_.get()), - AudioManager::Get()); - } - - void ShutdownAudioManager() { ASSERT_TRUE(mock_audio_manager_->Shutdown()); } - - void InitializeAudioDebugRecordingManager() { - mock_audio_manager_->InitializeDebugRecording(); - mock_debug_recording_manager_ = - static_cast<MockAudioDebugRecordingManager*>( - mock_audio_manager_->GetAudioDebugRecordingManager()); - ASSERT_NE(nullptr, mock_debug_recording_manager_); - } - void CreateDebugRecordingSession() { audio_debug_recording_session_impl_ = std::make_unique<media::AudioDebugRecordingSessionImpl>( @@ -77,11 +58,6 @@ audio_debug_recording_session_impl_.reset(); } - base::test::ScopedTaskEnvironment scoped_task_environment_; - std::unique_ptr<MockAudioManager> mock_audio_manager_; - MockAudioDebugRecordingManager* mock_debug_recording_manager_; - std::unique_ptr<AudioDebugRecordingSessionImpl> - audio_debug_recording_session_impl_; base::FilePath base_file_path_; private: @@ -91,6 +67,8 @@ } base::ScopedTempDir temp_dir_; + std::unique_ptr<AudioDebugRecordingSessionImpl> + audio_debug_recording_session_impl_; DISALLOW_COPY_AND_ASSIGN(AudioDebugRecordingSessionImplTest); }; @@ -125,9 +103,9 @@ ShutdownAudioManager(); } -// Tests the CreateFile method from AudioDebugRecordingSessionImpl unnamed +// Tests the CreateWavFile method from AudioDebugRecordingSessionImpl unnamed // namespace. -TEST_F(AudioDebugRecordingSessionImplTest, CreateFileCreatesExpectedFiles) { +TEST_F(AudioDebugRecordingSessionImplTest, CreateWavFileCreatesExpectedFiles) { CreateAudioManager(); InitializeAudioDebugRecordingManager(); EXPECT_CALL(*mock_debug_recording_manager_, EnableDebugRecording(testing::_)) @@ -139,9 +117,11 @@ // Check that expected files were created. base::FilePath input_recording_filename( - base_file_path_.AddExtension(kInputFileNameSuffix)); + base_file_path_.AddExtension(kInputFileNameSuffix) + .AddExtension(kWavExtension)); base::FilePath output_recording_filename( - base_file_path_.AddExtension(kOutputFileNameSuffix)); + base_file_path_.AddExtension(kOutputFileNameSuffix) + .AddExtension(kWavExtension)); EXPECT_TRUE(base::PathExists(output_recording_filename)); EXPECT_TRUE(base::PathExists(input_recording_filename));
diff --git a/media/audio/audio_debug_recording_test.cc b/media/audio/audio_debug_recording_test.cc new file mode 100644 index 0000000..bc19e832 --- /dev/null +++ b/media/audio/audio_debug_recording_test.cc
@@ -0,0 +1,39 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/audio/audio_debug_recording_test.h" + +#include "media/audio/mock_audio_debug_recording_manager.h" +#include "media/audio/mock_audio_manager.h" +#include "media/audio/test_audio_thread.h" + +namespace media { + +AudioDebugRecordingTest::AudioDebugRecordingTest() = default; + +AudioDebugRecordingTest::~AudioDebugRecordingTest() = default; + +void AudioDebugRecordingTest::CreateAudioManager() { + DCHECK(AudioManager::Get() == nullptr); + mock_audio_manager_ = + std::make_unique<MockAudioManager>(std::make_unique<TestAudioThread>()); + ASSERT_NE(nullptr, AudioManager::Get()); + ASSERT_EQ(static_cast<AudioManager*>(mock_audio_manager_.get()), + AudioManager::Get()); +} + +void AudioDebugRecordingTest::ShutdownAudioManager() { + DCHECK(mock_audio_manager_); + ASSERT_TRUE(mock_audio_manager_->Shutdown()); +} + +void AudioDebugRecordingTest::InitializeAudioDebugRecordingManager() { + DCHECK(mock_audio_manager_); + mock_audio_manager_->InitializeDebugRecording(); + mock_debug_recording_manager_ = static_cast<MockAudioDebugRecordingManager*>( + mock_audio_manager_->GetAudioDebugRecordingManager()); + ASSERT_NE(nullptr, mock_debug_recording_manager_); +} + +} // namespace media
diff --git a/media/audio/audio_debug_recording_test.h b/media/audio/audio_debug_recording_test.h new file mode 100644 index 0000000..4191b937 --- /dev/null +++ b/media/audio/audio_debug_recording_test.h
@@ -0,0 +1,41 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_AUDIO_AUDIO_DEBUG_RECORDING_TEST_H_ +#define MEDIA_AUDIO_AUDIO_DEBUG_RECORDING_TEST_H_ + +#include <memory> + +#include "base/test/scoped_task_environment.h" +#include "media/base/media_export.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace media { + +class MockAudioDebugRecordingManager; +class MockAudioManager; + +// Base test class for media/audio/ and services/audio/ debug recording test +// classes. +class AudioDebugRecordingTest : public testing::Test { + public: + AudioDebugRecordingTest(); + ~AudioDebugRecordingTest() override; + + protected: + void CreateAudioManager(); + void ShutdownAudioManager(); + void InitializeAudioDebugRecordingManager(); + + base::test::ScopedTaskEnvironment scoped_task_environment_; + std::unique_ptr<MockAudioManager> mock_audio_manager_; + MockAudioDebugRecordingManager* mock_debug_recording_manager_; + + private: + DISALLOW_COPY_AND_ASSIGN(AudioDebugRecordingTest); +}; + +} // namespace media + +#endif // MEDIA_AUDIO_AUDIO_DEBUG_RECORDING_TEST_H_
diff --git a/media/blink/webmediaplayer_delegate.h b/media/blink/webmediaplayer_delegate.h index b5a502e..5dc008a 100644 --- a/media/blink/webmediaplayer_delegate.h +++ b/media/blink/webmediaplayer_delegate.h
@@ -7,6 +7,7 @@ namespace blink { class WebMediaPlayer; +enum class WebFullscreenVideoStatus; } namespace gfx { class Size; @@ -129,8 +130,11 @@ // Notifies the delegate that the player has entered fullscreen. This does not // differentiate native controls fullscreen and custom controls fullscreen. - virtual void SetIsEffectivelyFullscreen(int player_id, - bool is_fullscreen) = 0; + // |fullscreen_video_status| is used by MediaWebContentsObserver to + // trigger automatically Picture-in-Picture for fullscreen videos. + virtual void SetIsEffectivelyFullscreen( + int player_id, + blink::WebFullscreenVideoStatus fullscreen_video_status) = 0; protected: WebMediaPlayerDelegate() = default;
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc index 3bedc49..f427333 100644 --- a/media/blink/webmediaplayer_impl.cc +++ b/media/blink/webmediaplayer_impl.cc
@@ -263,7 +263,8 @@ surface_layer_for_video_enabled_(params->use_surface_layer_for_video()), request_routing_token_cb_(params->request_routing_token_cb()), overlay_routing_token_(OverlayInfo::RoutingToken()), - media_metrics_provider_(params->take_metrics_provider()) { + media_metrics_provider_(params->take_metrics_provider()), + pip_surface_info_cb_(params->pip_surface_info_cb()) { DVLOG(1) << __func__; DCHECK(!adjust_allocated_memory_cb_.is_null()); DCHECK(renderer_factory_selector_); @@ -420,6 +421,15 @@ client_->SetWebLayer(nullptr); } +void WebMediaPlayerImpl::OnSurfaceIdUpdated(viz::SurfaceId surface_id) { + pip_surface_id_ = surface_id; + + // TODO(726619): Handle the behavior when Picture-in-Picture mode is + // disabled. + if (client_ && client_->IsInPictureInPictureMode()) + pip_surface_info_cb_.Run(pip_surface_id_); +} + bool WebMediaPlayerImpl::SupportsOverlayFullscreenVideo() { #if defined(OS_ANDROID) return !using_media_player_renderer_ && @@ -511,8 +521,8 @@ } void WebMediaPlayerImpl::SetIsEffectivelyFullscreen( - bool isEffectivelyFullscreen) { - delegate_->SetIsEffectivelyFullscreen(delegate_id_, isEffectivelyFullscreen); + blink::WebFullscreenVideoStatus fullscreen_video_status) { + delegate_->SetIsEffectivelyFullscreen(delegate_id_, fullscreen_video_status); } void WebMediaPlayerImpl::OnHasNativeControlsChanged(bool has_native_controls) { @@ -789,7 +799,12 @@ UpdatePlayState(); } -void WebMediaPlayerImpl::PictureInPicture() { +void WebMediaPlayerImpl::EnterPictureInPicture() { + if (!pip_surface_id_.is_valid()) + return; + + pip_surface_info_cb_.Run(pip_surface_id_); + if (client_) client_->PictureInPictureStarted(); }
diff --git a/media/blink/webmediaplayer_impl.h b/media/blink/webmediaplayer_impl.h index 66910bf..969dd6f 100644 --- a/media/blink/webmediaplayer_impl.h +++ b/media/blink/webmediaplayer_impl.h
@@ -121,6 +121,7 @@ void OnWebLayerUpdated() override; void RegisterContentsLayer(blink::WebLayer* web_layer) override; void UnregisterContentsLayer(blink::WebLayer* web_layer) override; + void OnSurfaceIdUpdated(viz::SurfaceId surface_id) override; void Load(LoadType load_type, const blink::WebMediaPlayerSource& source, @@ -132,7 +133,7 @@ void Seek(double seconds) override; void SetRate(double rate) override; void SetVolume(double volume) override; - void PictureInPicture() override; + void EnterPictureInPicture() override; void SetSinkId(const blink::WebString& sink_id, const blink::WebSecurityOrigin& security_origin, blink::WebSetSinkIdCallbacks* web_callback) override; @@ -220,7 +221,8 @@ void EnteredFullscreen() override; void ExitedFullscreen() override; void BecameDominantVisibleContent(bool isDominant) override; - void SetIsEffectivelyFullscreen(bool isEffectivelyFullscreen) override; + void SetIsEffectivelyFullscreen( + blink::WebFullscreenVideoStatus fullscreen_video_status) override; void OnHasNativeControlsChanged(bool) override; void OnDisplayTypeChanged(WebMediaPlayer::DisplayType) override; @@ -872,6 +874,13 @@ base::Optional<bool> stale_state_override_for_testing_; + // Keeps track of the SurfaceId for Picture-in-Picture. This is used to + // route the video to be shown in the Picture-in-Picture window. + viz::SurfaceId pip_surface_id_; + + // Callback to pass updated information about the current surface info. + WebMediaPlayerParams::PipSurfaceInfoCB pip_surface_info_cb_; + DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerImpl); };
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc index 0201018e..845b135 100644 --- a/media/blink/webmediaplayer_impl_unittest.cc +++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -16,6 +16,7 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/task_runner_util.h" +#include "base/test/mock_callback.h" #include "base/test/scoped_feature_list.h" #include "base/test/simple_test_tick_clock.h" #include "base/threading/thread.h" @@ -35,6 +36,7 @@ #include "mojo/public/cpp/bindings/strong_binding.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/WebKit/public/platform/WebFullscreenVideoStatus.h" #include "third_party/WebKit/public/platform/WebMediaPlayer.h" #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h" #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" @@ -130,6 +132,7 @@ MOCK_METHOD1(MediaRemotingStopped, void(blink::WebLocalizedString::Name)); MOCK_METHOD0(PictureInPictureStarted, void()); MOCK_METHOD0(PictureInPictureStopped, void()); + MOCK_METHOD0(IsInPictureInPictureMode, bool()); void set_is_autoplaying_muted(bool value) { is_autoplaying_muted_ = value; } @@ -185,7 +188,9 @@ return is_stale_; } - void SetIsEffectivelyFullscreen(int player_id, bool value) override { + void SetIsEffectivelyFullscreen( + int player_id, + blink::WebFullscreenVideoStatus fullscreen_video_status) override { DCHECK_EQ(player_id_, player_id); } @@ -307,7 +312,8 @@ base::Bind(&WebMediaPlayerImplTest::CreateMockSurfaceLayerBridge, base::Unretained(this)), cc::TestContextProvider::Create(), - base::FeatureList::IsEnabled(media::kUseSurfaceLayerForVideo)); + base::FeatureList::IsEnabled(media::kUseSurfaceLayerForVideo), + base::BindRepeating(pip_surface_info_cb_.Get())); auto compositor = std::make_unique<StrictMock<MockVideoFrameCompositor>>( params->video_frame_compositor_task_runner()); @@ -536,6 +542,10 @@ // The WebMediaPlayerImpl instance under test. std::unique_ptr<WebMediaPlayerImpl> wmpi_; + // Callback used for updating Picture-in-Picture about new Surface info. + base::MockCallback<WebMediaPlayerParams::PipSurfaceInfoCB> + pip_surface_info_cb_; + private: DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerImplTest); }; @@ -1066,6 +1076,29 @@ } } +// Tests when the PipSurfaceInfoCB for |wmpi_| is triggered for +// Picture-in-Picture. +TEST_F(WebMediaPlayerImplTest, PictureInPictureTriggerCallback) { + InitializeWebMediaPlayerImpl(); + + // Set up valid viz::SurfaceId. Values are arbitrary for test purposes. + viz::FrameSinkId frame_sink_id = viz::FrameSinkId(1, 1); + viz::LocalSurfaceId local_surface_id = + viz::LocalSurfaceId(11, base::UnguessableToken::Deserialize(0x111111, 0)); + const viz::SurfaceId& surface_id = + viz::SurfaceId(frame_sink_id, local_surface_id); + + // This call should do nothing because there is no SurfaceId set. + wmpi_->EnterPictureInPicture(); + EXPECT_CALL(client_, IsInPictureInPictureMode()); + wmpi_->OnSurfaceIdUpdated(surface_id); + testing::Mock::VerifyAndClearExpectations(&client_); + + EXPECT_CALL(pip_surface_info_cb_, Run(surface_id)); + // This call should trigger the callback since the SurfaceId is set. + wmpi_->EnterPictureInPicture(); +} + class WebMediaPlayerImplBackgroundBehaviorTest : public WebMediaPlayerImplTest, public ::testing::WithParamInterface<
diff --git a/media/blink/webmediaplayer_params.cc b/media/blink/webmediaplayer_params.cc index 5b378e6..b1c7a46 100644 --- a/media/blink/webmediaplayer_params.cc +++ b/media/blink/webmediaplayer_params.cc
@@ -22,7 +22,7 @@ const AdjustAllocatedMemoryCB& adjust_allocated_memory_cb, blink::WebContentDecryptionModule* initial_cdm, SurfaceManager* surface_manager, - const RequestRoutingTokenCallback request_routing_token_cb, + RequestRoutingTokenCallback request_routing_token_cb, base::WeakPtr<MediaObserver> media_observer, base::TimeDelta max_keyframe_distance_to_disable_background_video, base::TimeDelta max_keyframe_distance_to_disable_background_video_mse, @@ -32,7 +32,8 @@ base::Callback<std::unique_ptr<blink::WebSurfaceLayerBridge>( blink::WebSurfaceLayerBridgeObserver*)> create_bridge_callback, scoped_refptr<viz::ContextProvider> context_provider, - bool use_surface_layer_for_video) + bool use_surface_layer_for_video, + const PipSurfaceInfoCB& pip_surface_info_cb) : defer_load_cb_(defer_load_cb), audio_renderer_sink_(audio_renderer_sink), media_log_(std::move(media_log)), @@ -54,7 +55,8 @@ metrics_provider_(std::move(metrics_provider)), create_bridge_callback_(create_bridge_callback), context_provider_(std::move(context_provider)), - use_surface_layer_for_video_(use_surface_layer_for_video) {} + use_surface_layer_for_video_(use_surface_layer_for_video), + pip_surface_info_cb_(pip_surface_info_cb) {} WebMediaPlayerParams::~WebMediaPlayerParams() = default;
diff --git a/media/blink/webmediaplayer_params.h b/media/blink/webmediaplayer_params.h index 0fb1ba37..b8dee91 100644 --- a/media/blink/webmediaplayer_params.h +++ b/media/blink/webmediaplayer_params.h
@@ -34,6 +34,10 @@ class WebSurfaceLayerBridgeObserver; } // namespace blink +namespace viz { +class SurfaceId; +} + namespace media { class SwitchableAudioRendererSink; @@ -46,6 +50,11 @@ typedef base::Callback<void(const base::Closure&)> DeferLoadCB; typedef base::Callback<Context3D()> Context3DCB; + // Callback to obtain the video SurfaceInfo to trigger Picture-in-Picture + // mode. + using PipSurfaceInfoCB = + base::RepeatingCallback<void(const viz::SurfaceId& surface_id)>; + // Callback to obtain the media ContextProvider. // Requires being called on the media thread. // The argument callback is also called on the media thread as a reply. @@ -83,7 +92,8 @@ base::Callback<std::unique_ptr<blink::WebSurfaceLayerBridge>( blink::WebSurfaceLayerBridgeObserver*)> bridge_callback, scoped_refptr<viz::ContextProvider> context_provider, - bool use_surface_layer_for_video); + bool use_surface_layer_for_video, + const PipSurfaceInfoCB& surface_info_cb); ~WebMediaPlayerParams(); @@ -166,6 +176,10 @@ return use_surface_layer_for_video_; } + const PipSurfaceInfoCB pip_surface_info_cb() const { + return pip_surface_info_cb_; + } + private: DeferLoadCB defer_load_cb_; scoped_refptr<SwitchableAudioRendererSink> audio_renderer_sink_; @@ -191,6 +205,7 @@ create_bridge_callback_; scoped_refptr<viz::ContextProvider> context_provider_; bool use_surface_layer_for_video_; + PipSurfaceInfoCB pip_surface_info_cb_; DISALLOW_IMPLICIT_CONSTRUCTORS(WebMediaPlayerParams); };
diff --git a/media/capture/video/chromeos/camera_device_delegate.cc b/media/capture/video/chromeos/camera_device_delegate.cc index 0383a05..1d489a12 100644 --- a/media/capture/video/chromeos/camera_device_delegate.cc +++ b/media/capture/video/chromeos/camera_device_delegate.cc
@@ -86,14 +86,13 @@ } void CameraDeviceDelegate::StopAndDeAllocate( - base::Closure device_close_callback) { + base::OnceClosure device_close_callback) { DCHECK(ipc_task_runner_->BelongsToCurrentThread()); - // StopAndDeAllocate may be called at any state except - // CameraDeviceContext::State::kStopping. - DCHECK_NE(device_context_->GetState(), CameraDeviceContext::State::kStopping); - if (device_context_->GetState() == CameraDeviceContext::State::kStopped || - !stream_buffer_manager_) { + if (!device_context_ || + device_context_->GetState() == CameraDeviceContext::State::kStopped || + (device_context_->GetState() == CameraDeviceContext::State::kError && + !stream_buffer_manager_)) { // In case of Mojo connection error the device may be stopped before // StopAndDeAllocate is called; in case of device open failure, the state // is set to kError and |stream_buffer_manager_| is uninitialized. @@ -101,6 +100,10 @@ return; } + // StopAndDeAllocate may be called at any state except + // CameraDeviceContext::State::kStopping. + DCHECK_NE(device_context_->GetState(), CameraDeviceContext::State::kStopping); + device_close_callback_ = std::move(device_close_callback); device_context_->SetState(CameraDeviceContext::State::kStopping); if (!device_ops_.is_bound()) {
diff --git a/media/capture/video/chromeos/camera_device_delegate.h b/media/capture/video/chromeos/camera_device_delegate.h index 9c062e042..9cff56a 100644 --- a/media/capture/video/chromeos/camera_device_delegate.h +++ b/media/capture/video/chromeos/camera_device_delegate.h
@@ -66,7 +66,7 @@ // Delegation methods for the VideoCaptureDevice interface. void AllocateAndStart(const VideoCaptureParams& params, CameraDeviceContext* device_context); - void StopAndDeAllocate(base::Closure device_close_callback); + void StopAndDeAllocate(base::OnceClosure device_close_callback); void TakePhoto(VideoCaptureDevice::TakePhotoCallback callback); void GetPhotoState(VideoCaptureDevice::GetPhotoStateCallback callback); void SetPhotoOptions(mojom::PhotoSettingsPtr settings, @@ -162,7 +162,7 @@ // Where all the Mojo IPC calls takes place. const scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner_; - base::Closure device_close_callback_; + base::OnceClosure device_close_callback_; base::WeakPtrFactory<CameraDeviceDelegate> weak_ptr_factory_;
diff --git a/media/capture/video/chromeos/camera_device_delegate_unittest.cc b/media/capture/video/chromeos/camera_device_delegate_unittest.cc index 8103886f..8a0316b 100644 --- a/media/capture/video/chromeos/camera_device_delegate_unittest.cc +++ b/media/capture/video/chromeos/camera_device_delegate_unittest.cc
@@ -576,4 +576,46 @@ ResetDevice(); } +// Test that the class handles it correctly when StopAndDeAllocate is called +// multiple times. +TEST_F(CameraDeviceDelegateTest, DoubleStopAndDeAllocate) { + AllocateDeviceWithDescriptor(kDefaultDescriptor); + + VideoCaptureParams params; + params.requested_format = kDefaultCaptureFormat; + + auto* mock_client = ResetDeviceContext(); + mock_client->SetFrameCb(BindToCurrentLoop(base::BindOnce( + &CameraDeviceDelegateTest::QuitRunLoop, base::Unretained(this)))); + mock_client->SetQuitCb(BindToCurrentLoop(base::BindOnce( + &CameraDeviceDelegateTest::QuitRunLoop, base::Unretained(this)))); + SetUpExpectationUntilCapturing(mock_client); + SetUpExpectationForCaptureLoop(); + + device_delegate_thread_.task_runner()->PostTask( + FROM_HERE, base::BindOnce(&CameraDeviceDelegate::AllocateAndStart, + camera_device_delegate_->GetWeakPtr(), params, + base::Unretained(device_context_.get()))); + + // Wait until a frame is received. MockVideoCaptureClient calls QuitRunLoop() + // to stop the run loop. + DoLoop(); + + EXPECT_EQ(CameraDeviceContext::State::kCapturing, GetState()); + + SetUpExpectationForClose(); + + WaitForDeviceToClose(); + + device_delegate_thread_.task_runner()->PostTask( + FROM_HERE, base::BindOnce(&CameraDeviceDelegate::StopAndDeAllocate, + camera_device_delegate_->GetWeakPtr(), + BindToCurrentLoop(base::BindOnce( + &CameraDeviceDelegateTest::QuitRunLoop, + base::Unretained(this))))); + DoLoop(); + + ResetDevice(); +} + } // namespace media
diff --git a/media/capture/video/chromeos/video_capture_device_arc_chromeos.cc b/media/capture/video/chromeos/video_capture_device_arc_chromeos.cc index ccd9e65..b37a9348 100644 --- a/media/capture/video/chromeos/video_capture_device_arc_chromeos.cc +++ b/media/capture/video/chromeos/video_capture_device_arc_chromeos.cc
@@ -138,6 +138,9 @@ void VideoCaptureDeviceArcChromeOS::OpenDevice() { DCHECK(capture_task_runner_->BelongsToCurrentThread()); + if (!camera_device_delegate_) { + return; + } // It's safe to pass unretained |device_context_| here since // VideoCaptureDeviceArcChromeOS owns |camera_device_delegate_| and makes // sure |device_context_| outlives |camera_device_delegate_|.
diff --git a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc index 9f0596bb..4dc3b033 100644 --- a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc +++ b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc
@@ -64,6 +64,15 @@ } while (0) namespace media { +namespace { +void DropGLImage(scoped_refptr<gl::GLImage> gl_image, + BindGLImageCallback bind_image_cb, + GLuint client_texture_id, + GLuint texture_target) { + bind_image_cb.Run(client_texture_id, texture_target, nullptr, false); +} + +} // namespace // static const uint32_t V4L2SliceVideoDecodeAccelerator::supported_input_fourccs_[] = { @@ -1513,11 +1522,12 @@ VLOGF(1) << "eglDestroySyncKHR failed."; } - child_task_runner_->PostTask( - FROM_HERE, base::BindOnce(IgnoreResult(bind_image_cb_), - output_record.client_texture_id, - device_->GetTextureTarget(), - scoped_refptr<gl::GLImage>(), false)); + if (output_record.gl_image) { + child_task_runner_->PostTask( + FROM_HERE, base::Bind(&DropGLImage, std::move(output_record.gl_image), + bind_image_cb_, output_record.client_texture_id, + device_->GetTextureTarget())); + } picture_buffers_to_dismiss.push_back(output_record.picture_id); } @@ -1630,6 +1640,7 @@ OutputRecord& output_record = output_buffer_map_[i]; DCHECK(!output_record.at_device); DCHECK(!output_record.at_client); + DCHECK(!output_record.gl_image); DCHECK_EQ(output_record.egl_sync, EGL_NO_SYNC_KHR); DCHECK_EQ(output_record.picture_id, -1); DCHECK(output_record.dmabuf_fds.empty()); @@ -1713,14 +1724,15 @@ true); decoder_thread_task_runner_->PostTask( FROM_HERE, - base::BindOnce(&V4L2SliceVideoDecodeAccelerator::AssignDmaBufs, - base::Unretained(this), buffer_index, picture_buffer_id, - base::Passed(&passed_dmabuf_fds))); + base::Bind(&V4L2SliceVideoDecodeAccelerator::AssignGLImage, + base::Unretained(this), buffer_index, picture_buffer_id, + gl_image, base::Passed(&passed_dmabuf_fds))); } -void V4L2SliceVideoDecodeAccelerator::AssignDmaBufs( +void V4L2SliceVideoDecodeAccelerator::AssignGLImage( size_t buffer_index, int32_t picture_buffer_id, + scoped_refptr<gl::GLImage> gl_image, std::unique_ptr<std::vector<base::ScopedFD>> passed_dmabuf_fds) { DVLOGF(3) << "index=" << buffer_index; DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread()); @@ -1739,10 +1751,12 @@ } OutputRecord& output_record = output_buffer_map_[buffer_index]; + DCHECK(!output_record.gl_image); DCHECK_EQ(output_record.egl_sync, EGL_NO_SYNC_KHR); DCHECK(!output_record.at_client); DCHECK(!output_record.at_device); + output_record.gl_image = gl_image; if (output_mode_ == Config::OutputMode::IMPORT) { DCHECK(output_record.dmabuf_fds.empty()); output_record.dmabuf_fds = std::move(*passed_dmabuf_fds); @@ -1826,6 +1840,7 @@ DCHECK(!iter->at_device); iter->at_client = false; if (iter->texture_id != 0) { + iter->gl_image = nullptr; child_task_runner_->PostTask( FROM_HERE, base::Bind(&V4L2SliceVideoDecodeAccelerator::CreateGLImageFor,
diff --git a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h index 7ca2e35..5df9d33 100644 --- a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h +++ b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h
@@ -90,6 +90,7 @@ int32_t picture_id; GLuint client_texture_id; GLuint texture_id; + scoped_refptr<gl::GLImage> gl_image; EGLSyncKHR egl_sync; std::vector<base::ScopedFD> dmabuf_fds; bool cleared; @@ -267,12 +268,13 @@ const gfx::Size& size, uint32_t fourcc); - // Take the dmabuf |passed_dmabuf_fds|, for |picture_buffer_id|, and use it + // Take the GLImage |gl_image|, created for |picture_buffer_id|, and use it // for OutputRecord at |buffer_index|. The buffer is backed by // |passed_dmabuf_fds|, and the OutputRecord takes ownership of them. - void AssignDmaBufs( + void AssignGLImage( size_t buffer_index, int32_t picture_buffer_id, + scoped_refptr<gl::GLImage> gl_image, // TODO(posciak): (https://crbug.com/561749) we should normally be able to // pass the vector by itself via std::move, but it's not possible to do // this if this method is used as a callback.
diff --git a/mojo/edk/system/broker_win.cc b/mojo/edk/system/broker_win.cc index 769be95..0d48964 100644 --- a/mojo/edk/system/broker_win.cc +++ b/mojo/edk/system/broker_win.cc
@@ -131,7 +131,7 @@ &bytes_written, nullptr); if (!result || static_cast<size_t>(bytes_written) != out_message->data_num_bytes()) { - LOG(ERROR) << "Error sending sync broker message"; + PLOG(ERROR) << "Error sending sync broker message"; return nullptr; }
diff --git a/mojo/public/cpp/bindings/sync_call_restrictions.h b/mojo/public/cpp/bindings/sync_call_restrictions.h index 81a8791..9c6bcbec 100644 --- a/mojo/public/cpp/bindings/sync_call_restrictions.h +++ b/mojo/public/cpp/bindings/sync_call_restrictions.h
@@ -75,6 +75,8 @@ // DO NOT ADD ANY OTHER FRIEND STATEMENTS, talk to mojo/OWNERS first. // BEGIN ALLOWED USAGE. friend class content::BrowserTestBase; // Test-only. + // SynchronousCompositorHost is used for Android webview. + friend class content::SynchronousCompositorHost; // LevelDBMojoProxy makes same-process sync calls from the DB thread. friend class leveldb::LevelDBMojoProxy; // Pref service connection is sync at startup.
diff --git a/net/quic/chromium/quic_chromium_client_session.cc b/net/quic/chromium/quic_chromium_client_session.cc index 6b95b323..55748d41 100644 --- a/net/quic/chromium/quic_chromium_client_session.cc +++ b/net/quic/chromium/quic_chromium_client_session.cc
@@ -42,6 +42,7 @@ #include "net/ssl/ssl_connection_status_flags.h" #include "net/ssl/ssl_info.h" #include "net/ssl/token_binding.h" +#include "net/traffic_annotation/network_traffic_annotation.h" #include "third_party/boringssl/src/include/openssl/ssl.h" namespace net { @@ -1047,14 +1048,8 @@ QuicChromiumClientStream* QuicChromiumClientSession::CreateOutgoingDynamicStream() { - if (!ShouldCreateOutgoingDynamicStream()) { - return nullptr; - } - - // TODO(https://crbug.com/656607): Add proper annotation. - QuicChromiumClientStream* stream = - CreateOutgoingReliableStreamImpl(NO_TRAFFIC_ANNOTATION_BUG_656607); - return stream; + NOTREACHED() << "CreateOutgoingReliableStreamImpl should be called directly"; + return nullptr; } QuicChromiumClientStream*
diff --git a/net/quic/chromium/quic_chromium_client_session_peer.cc b/net/quic/chromium/quic_chromium_client_session_peer.cc index cc27fb0..6d9e001 100644 --- a/net/quic/chromium/quic_chromium_client_session_peer.cc +++ b/net/quic/chromium/quic_chromium_client_session_peer.cc
@@ -5,6 +5,7 @@ #include "net/quic/chromium/quic_chromium_client_session_peer.h" #include "net/quic/chromium/quic_chromium_client_session.h" +#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" namespace net { namespace test { @@ -37,5 +38,16 @@ QuicChromiumClientSession* session) { return session->bytes_pushed_and_unclaimed_count_; } + +// static +QuicChromiumClientStream* +QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream( + QuicChromiumClientSession* session) { + return session->ShouldCreateOutgoingDynamicStream() + ? session->CreateOutgoingReliableStreamImpl( + TRAFFIC_ANNOTATION_FOR_TESTS) + : nullptr; +} + } // namespace test } // namespace net
diff --git a/net/quic/chromium/quic_chromium_client_session_peer.h b/net/quic/chromium/quic_chromium_client_session_peer.h index 70f9bd7..3afe3c6 100644 --- a/net/quic/chromium/quic_chromium_client_session_peer.h +++ b/net/quic/chromium/quic_chromium_client_session_peer.h
@@ -15,6 +15,7 @@ namespace net { class QuicChromiumClientSession; +class QuicChromiumClientStream; namespace test { @@ -32,6 +33,9 @@ static uint64_t GetPushedAndUnclaimedBytesCount( QuicChromiumClientSession* session); + static QuicChromiumClientStream* CreateOutgoingDynamicStream( + QuicChromiumClientSession* session); + private: DISALLOW_COPY_AND_ASSIGN(QuicChromiumClientSessionPeer); };
diff --git a/net/quic/chromium/quic_chromium_client_session_test.cc b/net/quic/chromium/quic_chromium_client_session_test.cc index ba1fe35..88e20fb 100644 --- a/net/quic/chromium/quic_chromium_client_session_test.cc +++ b/net/quic/chromium/quic_chromium_client_session_test.cc
@@ -490,7 +490,7 @@ // can not proceed immediately. const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); for (size_t i = 0; i < kMaxOpenStreams; i++) { - session_->CreateOutgoingDynamicStream(); + QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream(session_.get()); } EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); @@ -531,7 +531,7 @@ // can not proceed immediately. const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); for (size_t i = 0; i < kMaxOpenStreams; i++) { - session_->CreateOutgoingDynamicStream(); + QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream(session_.get()); } EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); @@ -582,7 +582,7 @@ // can not proceed immediately. const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); for (size_t i = 0; i < kMaxOpenStreams; i++) { - session_->CreateOutgoingDynamicStream(); + QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream(session_.get()); } EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); @@ -680,7 +680,7 @@ // can not proceed immediately. const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); for (size_t i = 0; i < kMaxOpenStreams; i++) { - session_->CreateOutgoingDynamicStream(); + QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream(session_.get()); } EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); @@ -722,11 +722,14 @@ std::vector<QuicChromiumClientStream*> streams; for (size_t i = 0; i < kMaxOpenStreams; i++) { - QuicChromiumClientStream* stream = session_->CreateOutgoingDynamicStream(); + QuicChromiumClientStream* stream = + QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream( + session_.get()); EXPECT_TRUE(stream); streams.push_back(stream); } - EXPECT_FALSE(session_->CreateOutgoingDynamicStream()); + EXPECT_FALSE(QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream( + session_.get())); EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); @@ -734,12 +737,14 @@ QuicStreamId stream_id = streams[0]->id(); session_->CloseStream(stream_id); - EXPECT_FALSE(session_->CreateOutgoingDynamicStream()); + EXPECT_FALSE(QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream( + session_.get())); QuicRstStreamFrame rst1(kInvalidControlFrameId, stream_id, QUIC_STREAM_NO_ERROR, 0); session_->OnRstStream(rst1); EXPECT_EQ(kMaxOpenStreams - 1, session_->GetNumOpenOutgoingStreams()); - EXPECT_TRUE(session_->CreateOutgoingDynamicStream()); + EXPECT_TRUE(QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream( + session_.get())); } TEST_P(QuicChromiumClientSessionTest, PushStreamTimedOutNoResponse) { @@ -764,7 +769,9 @@ CompleteCryptoHandshake(); session_->OnProofVerifyDetailsAvailable(details); - QuicChromiumClientStream* stream = session_->CreateOutgoingDynamicStream(); + QuicChromiumClientStream* stream = + QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream( + session_.get()); EXPECT_TRUE(stream); SpdyHeaderBlock promise_headers; @@ -812,7 +819,9 @@ CompleteCryptoHandshake(); session_->OnProofVerifyDetailsAvailable(details); - QuicChromiumClientStream* stream = session_->CreateOutgoingDynamicStream(); + QuicChromiumClientStream* stream = + QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream( + session_.get()); EXPECT_TRUE(stream); SpdyHeaderBlock promise_headers; @@ -865,7 +874,9 @@ CompleteCryptoHandshake(); session_->OnProofVerifyDetailsAvailable(details); - QuicChromiumClientStream* stream = session_->CreateOutgoingDynamicStream(); + QuicChromiumClientStream* stream = + QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream( + session_.get()); EXPECT_TRUE(stream); SpdyHeaderBlock promise_headers; @@ -918,7 +929,9 @@ CompleteCryptoHandshake(); session_->OnProofVerifyDetailsAvailable(details); - QuicChromiumClientStream* stream = session_->CreateOutgoingDynamicStream(); + QuicChromiumClientStream* stream = + QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream( + session_.get()); EXPECT_TRUE(stream); SpdyHeaderBlock promise_headers; @@ -967,7 +980,9 @@ CompleteCryptoHandshake(); session_->OnProofVerifyDetailsAvailable(details); - QuicChromiumClientStream* stream = session_->CreateOutgoingDynamicStream(); + QuicChromiumClientStream* stream = + QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream( + session_.get()); EXPECT_TRUE(stream); SpdyHeaderBlock promise_headers; @@ -1019,7 +1034,9 @@ std::vector<QuicChromiumClientStream*> streams; for (size_t i = 0; i < kMaxOpenStreams; i++) { - QuicChromiumClientStream* stream = session_->CreateOutgoingDynamicStream(); + QuicChromiumClientStream* stream = + QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream( + session_.get()); EXPECT_TRUE(stream); streams.push_back(stream); } @@ -1058,7 +1075,8 @@ // streams. session_->connection()->OnGoAwayFrame(QuicGoAwayFrame( kInvalidControlFrameId, QUIC_PEER_GOING_AWAY, 1u, "Going away.")); - EXPECT_EQ(nullptr, session_->CreateOutgoingDynamicStream()); + EXPECT_EQ(nullptr, QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream( + session_.get())); } TEST_P(QuicChromiumClientSessionTest, CanPool) { @@ -1263,7 +1281,9 @@ base::RunLoop().RunUntilIdle(); // Write data to session. - QuicChromiumClientStream* stream = session_->CreateOutgoingDynamicStream(); + QuicChromiumClientStream* stream = + QuicChromiumClientSessionPeer::CreateOutgoingDynamicStream( + session_.get()); struct iovec iov[1]; iov[0].iov_base = data; iov[0].iov_len = 4;
diff --git a/services/audio/BUILD.gn b/services/audio/BUILD.gn index 1ba5c87..f29ae802 100644 --- a/services/audio/BUILD.gn +++ b/services/audio/BUILD.gn
@@ -15,6 +15,8 @@ source_set("lib") { sources = [ + "debug_recording.cc", + "debug_recording.h", "in_process_audio_manager_accessor.cc", "in_process_audio_manager_accessor.h", "service.cc", @@ -37,7 +39,9 @@ testonly = true sources = [ + "debug_recording_unittest.cc", "test/audio_system_to_service_adapter_test.cc", + "test/debug_recording_session_unittest.cc", "test/in_process_service_test.cc", ] @@ -50,6 +54,7 @@ "//services/audio/public/mojom", "//services/service_manager/public/cpp", "//services/service_manager/public/cpp:service_test_support", + "//services/service_manager/public/cpp/test:test_support", "//testing/gmock", "//testing/gtest", ]
diff --git a/services/audio/debug_recording.cc b/services/audio/debug_recording.cc new file mode 100644 index 0000000..81d92bf --- /dev/null +++ b/services/audio/debug_recording.cc
@@ -0,0 +1,73 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "services/audio/debug_recording.h" + +#include <memory> +#include <utility> + +#include "media/audio/audio_debug_recording_manager.h" +#include "media/audio/audio_manager.h" + +namespace audio { + +DebugRecording::DebugRecording(mojom::DebugRecordingRequest request, + media::AudioManager* audio_manager) + : binding_(this, std::move(request)), + audio_manager_(audio_manager), + weak_factory_(this) { + DCHECK(audio_manager_ != nullptr); + DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); + + // On connection error debug recording is disabled, but object is not + // destroyed, it will be cleaned-up by service either on next bind request on + // or when service is shut down. + binding_.set_connection_error_handler( + base::BindOnce(&DebugRecording::Disable, base::Unretained(this))); +} + +DebugRecording::~DebugRecording() { + Disable(); +} + +void DebugRecording::Enable( + mojom::DebugRecordingFileProviderPtr recording_file_provider) { + DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); + DCHECK(!IsEnabled()); + file_provider_ = std::move(recording_file_provider); + media::AudioDebugRecordingManager* debug_recording_manager = + audio_manager_->GetAudioDebugRecordingManager(); + if (debug_recording_manager == nullptr) + return; + debug_recording_manager->EnableDebugRecording(base::BindRepeating( + &DebugRecording::CreateWavFile, weak_factory_.GetWeakPtr())); +} + +void DebugRecording::Disable() { + DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); + if (!IsEnabled()) + return; + file_provider_.reset(); + binding_.Close(); + + media::AudioDebugRecordingManager* debug_recording_manager = + audio_manager_->GetAudioDebugRecordingManager(); + if (debug_recording_manager == nullptr) + return; + debug_recording_manager->DisableDebugRecording(); +} + +void DebugRecording::CreateWavFile( + const base::FilePath& file_suffix, + mojom::DebugRecordingFileProvider::CreateWavFileCallback reply_callback) { + DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); + file_provider_->CreateWavFile(file_suffix, std::move(reply_callback)); +} + +bool DebugRecording::IsEnabled() { + DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); + return file_provider_.is_bound(); +} + +} // namespace audio
diff --git a/services/audio/debug_recording.h b/services/audio/debug_recording.h new file mode 100644 index 0000000..4c9f66a --- /dev/null +++ b/services/audio/debug_recording.h
@@ -0,0 +1,51 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SERVICES_AUDIO_DEBUG_RECORDING_H_ +#define SERVICES_AUDIO_DEBUG_RECORDING_H_ + +#include <utility> + +#include "base/memory/weak_ptr.h" +#include "mojo/public/cpp/bindings/binding.h" +#include "services/audio/public/mojom/debug_recording.mojom.h" + +namespace media { +class AudioManager; +} + +namespace audio { + +// Implementation for controlling audio debug recording. +class DebugRecording : public mojom::DebugRecording { + public: + DebugRecording(mojom::DebugRecordingRequest request, + media::AudioManager* audio_manager); + + // Disables audio debug recording if Enable() was called before. + ~DebugRecording() override; + + // Enables audio debug recording. + void Enable(mojom::DebugRecordingFileProviderPtr file_provider) override; + + private: + // Called on binding connection error. + void Disable(); + + void CreateWavFile( + const base::FilePath& file_suffix, + mojom::DebugRecordingFileProvider::CreateWavFileCallback reply_callback); + bool IsEnabled(); + + mojo::Binding<mojom::DebugRecording> binding_; + mojom::DebugRecordingFileProviderPtr file_provider_; + media::AudioManager* const audio_manager_; + + base::WeakPtrFactory<DebugRecording> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(DebugRecording); +}; + +} // namespace audio + +#endif // SERVICES_AUDIO_DEBUG_RECORDING_H_
diff --git a/services/audio/debug_recording_unittest.cc b/services/audio/debug_recording_unittest.cc new file mode 100644 index 0000000..73c92bf --- /dev/null +++ b/services/audio/debug_recording_unittest.cc
@@ -0,0 +1,81 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "services/audio/debug_recording.h" + +#include <memory> + +#include "base/files/file_path.h" +#include "base/test/scoped_task_environment.h" +#include "media/audio/audio_debug_recording_test.h" +#include "media/audio/mock_audio_debug_recording_manager.h" +#include "media/audio/mock_audio_manager.h" +#include "services/audio/public/cpp/debug_recording_session.h" +#include "services/audio/public/mojom/debug_recording.mojom.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace audio { + +namespace { +const base::FilePath::CharType kBaseFileName[] = + FILE_PATH_LITERAL("base_file_name"); +} + +class DebugRecordingTest : public media::AudioDebugRecordingTest { + public: + DebugRecordingTest() = default; + ~DebugRecordingTest() override = default; + + void SetUp() override { + CreateAudioManager(); + InitializeAudioDebugRecordingManager(); + } + + void TearDown() override { ShutdownAudioManager(); } + + protected: + void CreateDebugRecording() { + debug_recording_ = std::make_unique<DebugRecording>( + mojo::MakeRequest(&debug_recording_ptr_), + static_cast<media::AudioManager*>(mock_audio_manager_.get())); + EXPECT_TRUE(debug_recording_ptr_.is_bound()); + } + + void EnableDebugRecording() { + mojom::DebugRecordingFileProviderPtr file_provider_ptr; + DebugRecordingSession::DebugRecordingFileProvider file_provider( + mojo::MakeRequest(&file_provider_ptr), base::FilePath(kBaseFileName)); + ASSERT_TRUE(file_provider_ptr.is_bound()); + debug_recording_ptr_->Enable(std::move(file_provider_ptr)); + } + + void DestroyDebugRecording() { debug_recording_ptr_.reset(); } + + MOCK_METHOD0(OnConnectionError, void()); + + private: + std::unique_ptr<DebugRecording> debug_recording_; + mojom::DebugRecordingPtr debug_recording_ptr_; + + DISALLOW_COPY_AND_ASSIGN(DebugRecordingTest); +}; + +TEST_F(DebugRecordingTest, EnableResetEnablesDisablesDebugRecording) { + CreateDebugRecording(); + + EXPECT_CALL(*mock_debug_recording_manager_, EnableDebugRecording(testing::_)); + EnableDebugRecording(); + + EXPECT_CALL(*mock_debug_recording_manager_, DisableDebugRecording()); + DestroyDebugRecording(); +} + +TEST_F(DebugRecordingTest, ResetWithoutEnableDoesNotDisableDebugRecording) { + CreateDebugRecording(); + + EXPECT_CALL(*mock_debug_recording_manager_, DisableDebugRecording()).Times(0); + DestroyDebugRecording(); +} + +} // namespace audio
diff --git a/services/audio/manifest.json b/services/audio/manifest.json index 66c5191..d7157b15 100644 --- a/services/audio/manifest.json +++ b/services/audio/manifest.json
@@ -5,7 +5,8 @@ "interface_provider_specs": { "service_manager:connector": { "provides": { - "info": [ "audio::mojom::SystemInfo" ] + "info": [ "audio::mojom::SystemInfo" ], + "debug_recording": [ "audio::mojom::DebugRecording" ] }, "requires": { "service_manager": [ "service_manager:all_users" ]
diff --git a/services/audio/public/cpp/BUILD.gn b/services/audio/public/cpp/BUILD.gn index 60d6b35..c86efc1e 100644 --- a/services/audio/public/cpp/BUILD.gn +++ b/services/audio/public/cpp/BUILD.gn
@@ -8,6 +8,10 @@ "audio_system_factory.h", "audio_system_to_service_adapter.cc", "audio_system_to_service_adapter.h", + "debug_recording_session.cc", + "debug_recording_session.h", + "debug_recording_session_factory.cc", + "debug_recording_session_factory.h", ] public_deps = [
diff --git a/services/audio/public/cpp/debug_recording_session.cc b/services/audio/public/cpp/debug_recording_session.cc new file mode 100644 index 0000000..12091ab --- /dev/null +++ b/services/audio/public/cpp/debug_recording_session.cc
@@ -0,0 +1,63 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "services/audio/public/cpp/debug_recording_session.h" + +#include <utility> + +#include "base/files/file_path.h" +#include "media/audio/audio_debug_recording_manager.h" +#include "media/audio/audio_manager.h" +#include "services/audio/public/mojom/constants.mojom.h" +#include "services/service_manager/public/cpp/connector.h" + +namespace audio { + +namespace { +const base::FilePath::CharType kWavExtension[] = FILE_PATH_LITERAL("wav"); +} + +DebugRecordingSession::DebugRecordingFileProvider::DebugRecordingFileProvider( + mojom::DebugRecordingFileProviderRequest request, + const base::FilePath& file_name_base) + : binding_(this, std::move(request)), file_name_base_(file_name_base) {} + +DebugRecordingSession::DebugRecordingFileProvider:: + ~DebugRecordingFileProvider() = default; + +void DebugRecordingSession::DebugRecordingFileProvider::CreateWavFile( + const base::FilePath& file_name_suffix, + CreateWavFileCallback reply_callback) { + base::PostTaskWithTraitsAndReplyWithResult( + FROM_HERE, + {base::MayBlock(), base::TaskPriority::BACKGROUND, + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, + base::BindOnce( + [](const base::FilePath& file_name) { + return base::File(file_name, base::File::FLAG_CREATE_ALWAYS | + base::File::FLAG_WRITE); + }, + file_name_base_.AddExtension(file_name_suffix.value()) + .AddExtension(kWavExtension)), + std::move(reply_callback)); +} + +DebugRecordingSession::DebugRecordingSession( + const base::FilePath& file_name_base, + std::unique_ptr<service_manager::Connector> connector) { + DCHECK(connector); + + mojom::DebugRecordingFileProviderPtr file_provider; + file_provider_ = std::make_unique<DebugRecordingFileProvider>( + mojo::MakeRequest(&file_provider), file_name_base); + + connector->BindInterface(audio::mojom::kServiceName, + mojo::MakeRequest(&debug_recording_)); + if (debug_recording_.is_bound()) + debug_recording_->Enable(std::move(file_provider)); +} + +DebugRecordingSession::~DebugRecordingSession() {} + +} // namespace audio
diff --git a/services/audio/public/cpp/debug_recording_session.h b/services/audio/public/cpp/debug_recording_session.h new file mode 100644 index 0000000..addb231 --- /dev/null +++ b/services/audio/public/cpp/debug_recording_session.h
@@ -0,0 +1,63 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SERVICES_AUDIO_PUBLIC_CPP_DEBUG_RECORDING_SESSION_H_ +#define SERVICES_AUDIO_PUBLIC_CPP_DEBUG_RECORDING_SESSION_H_ + +#include <memory> + +#include "media/audio/audio_debug_recording_session.h" +#include "mojo/public/cpp/bindings/binding.h" +#include "services/audio/public/mojom/debug_recording.mojom.h" + +namespace service_manager { +class Connector; +} + +namespace base { +class FilePath; +} + +namespace audio { + +class DebugRecordingFileProvider; + +// Client class for using mojom::DebugRecording interface. This class owns +// mojom::DebugRecordingFileProvider implementation, therefore owners of this +// class' instances need permission to create files in |file_name_base| path +// passed in constructor in order to start debug recording. If file creation +// fails, debug recording will silently not start. +class DebugRecordingSession : public media::AudioDebugRecordingSession { + public: + class DebugRecordingFileProvider : public mojom::DebugRecordingFileProvider { + public: + DebugRecordingFileProvider(mojom::DebugRecordingFileProviderRequest request, + const base::FilePath& file_name_base); + ~DebugRecordingFileProvider() override; + + // Creates file with name "|file_name_base_|.|file_suffix|.wav". + void CreateWavFile(const base::FilePath& file_suffix, + CreateWavFileCallback reply_callback) override; + + private: + mojo::Binding<mojom::DebugRecordingFileProvider> binding_; + base::FilePath file_name_base_; + + DISALLOW_COPY_AND_ASSIGN(DebugRecordingFileProvider); + }; + + DebugRecordingSession(const base::FilePath& file_name_base, + std::unique_ptr<service_manager::Connector> connector); + ~DebugRecordingSession() override; + + private: + std::unique_ptr<DebugRecordingFileProvider> file_provider_; + mojom::DebugRecordingPtr debug_recording_; + + DISALLOW_COPY_AND_ASSIGN(DebugRecordingSession); +}; + +} // namespace audio + +#endif // SERVICES_AUDIO_PUBLIC_CPP_DEBUG_RECORDING_SESSION_H_
diff --git a/services/audio/public/cpp/debug_recording_session_factory.cc b/services/audio/public/cpp/debug_recording_session_factory.cc new file mode 100644 index 0000000..eab484b --- /dev/null +++ b/services/audio/public/cpp/debug_recording_session_factory.cc
@@ -0,0 +1,25 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "services/audio/public/cpp/debug_recording_session_factory.h" + +#include <utility> + +#include "base/files/file_path.h" +#include "media/audio/audio_debug_recording_session_impl.h" +#include "services/service_manager/public/cpp/connector.h" + +namespace audio { + +std::unique_ptr<media::AudioDebugRecordingSession> +CreateAudioDebugRecordingSession( + const base::FilePath& debug_recording_file_path, + std::unique_ptr<service_manager::Connector> connector) { + DCHECK(connector); + + return std::make_unique<media::AudioDebugRecordingSessionImpl>( + debug_recording_file_path); +} + +} // namespace audio
diff --git a/services/audio/public/cpp/debug_recording_session_factory.h b/services/audio/public/cpp/debug_recording_session_factory.h new file mode 100644 index 0000000..fae9da8 --- /dev/null +++ b/services/audio/public/cpp/debug_recording_session_factory.h
@@ -0,0 +1,31 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SERVICES_AUDIO_PUBLIC_CPP_DEBUG_RECORDING_SESSION_FACTORY_H_ +#define SERVICES_AUDIO_PUBLIC_CPP_DEBUG_RECORDING_SESSION_FACTORY_H_ + +#include <memory> + +namespace base { +class FilePath; +} + +namespace media { +class AudioDebugRecordingSession; +} + +namespace service_manager { +class Connector; +} + +namespace audio { + +std::unique_ptr<media::AudioDebugRecordingSession> +CreateAudioDebugRecordingSession( + const base::FilePath& debug_recording_file_path, + std::unique_ptr<service_manager::Connector> connector); + +} // namespace audio + +#endif // SERVICES_AUDIO_PUBLIC_CPP_DEBUG_RECORDING_SESSION_FACTORY_H_
diff --git a/services/audio/public/mojom/BUILD.gn b/services/audio/public/mojom/BUILD.gn index 35d6cb4..079f324 100644 --- a/services/audio/public/mojom/BUILD.gn +++ b/services/audio/public/mojom/BUILD.gn
@@ -7,6 +7,7 @@ mojom("mojom") { sources = [ "audio_device_description.mojom", + "debug_recording.mojom", "system_info.mojom", ]
diff --git a/services/audio/public/mojom/debug_recording.mojom b/services/audio/public/mojom/debug_recording.mojom new file mode 100644 index 0000000..9bb73ea --- /dev/null +++ b/services/audio/public/mojom/debug_recording.mojom
@@ -0,0 +1,29 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module audio.mojom; + +import "mojo/common/file.mojom"; +import "mojo/common/file_path.mojom"; + +// Creates audio debug recording files. Requires a base file path at binding. +// All files are created in the path defined in implementation, to which +// ".|suffix|" and ".wav" extension are appended. E.g.: from base file path +// "/path/base_name" and suffix "output.1", "/path/base_name.output.1.wav" will +// be created. This interface is called by audio service from implementation of +// DebugRecording interface defined below. +interface DebugRecordingFileProvider { + // Returns invalid file in case of failure. + CreateWavFile(mojo.common.mojom.FilePath suffix) + => (mojo.common.mojom.File? file); +}; + +// Controls audio debug recording. To enable, bind interface and call Enable +// with a bound DebugRecordingFileProvider interface pointer. To disable, close +// debug recording message pipe. Note: only the instance that enabled debug +// recording can disable it, i.e. closing debug recording message pipe without +// priorly enabling debug recording will not change debug recording state. +interface DebugRecording { + Enable(DebugRecordingFileProvider file_provider); +};
diff --git a/services/audio/service.cc b/services/audio/service.cc index 843ed81..99fccde 100644 --- a/services/audio/service.cc +++ b/services/audio/service.cc
@@ -4,11 +4,14 @@ #include "services/audio/service.h" +#include <utility> + #include "base/logging.h" #include "base/macros.h" #include "base/single_thread_task_runner.h" #include "build/build_config.h" #include "media/audio/audio_manager.h" +#include "services/audio/debug_recording.h" #include "services/audio/system_info.h" #include "services/service_manager/public/cpp/service_context.h" @@ -28,6 +31,8 @@ DVLOG(4) << "audio::Service::OnStart"; registry_.AddInterface<mojom::SystemInfo>(base::BindRepeating( &Service::BindSystemInfoRequest, base::Unretained(this))); + registry_.AddInterface<mojom::DebugRecording>(base::BindRepeating( + &Service::BindDebugRecordingRequest, base::Unretained(this))); } void Service::OnBindInterface( @@ -35,12 +40,15 @@ const std::string& interface_name, mojo::ScopedMessagePipeHandle interface_pipe) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DVLOG(4) << "audio::Service::OnBinfInterface"; + DVLOG(4) << "audio::Service::OnBindInterface"; registry_.BindInterface(interface_name, std::move(interface_pipe)); } bool Service::OnServiceManagerConnectionLost() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + // Reset |debug_recording_| to disable debug recording before AudioManager + // shutdown. + debug_recording_.reset(); audio_manager_accessor_->Shutdown(); return true; } @@ -56,4 +64,14 @@ system_info_->Bind(std::move(request)); } +void Service::BindDebugRecordingRequest(mojom::DebugRecordingRequest request) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + // Accept only one bind request at a time. Old request is overwritten. + // |debug_recording_| must be reset first to disable debug recording, and then + // create a new DebugRecording instance to enable debug recording. + debug_recording_.reset(); + debug_recording_ = std::make_unique<DebugRecording>( + std::move(request), audio_manager_accessor_->GetAudioManager()); +} + } // namespace audio
diff --git a/services/audio/service.h b/services/audio/service.h index 2cc69cd..c6741c0f 100644 --- a/services/audio/service.h +++ b/services/audio/service.h
@@ -6,10 +6,12 @@ #define SERVICES_AUDIO_SERVICE_H_ #include <memory> +#include <string> #include "base/callback.h" #include "base/macros.h" #include "base/threading/thread_checker.h" +#include "services/audio/public/mojom/debug_recording.mojom.h" #include "services/audio/public/mojom/system_info.mojom.h" #include "services/service_manager/public/cpp/binder_registry.h" #include "services/service_manager/public/cpp/service.h" @@ -19,6 +21,7 @@ } // namespace media namespace audio { +class DebugRecording; class SystemInfo; class Service : public service_manager::Service { @@ -27,7 +30,7 @@ // its created on, and that thread must be AudioManager main thread. class AudioManagerAccessor { public: - virtual ~AudioManagerAccessor(){}; + virtual ~AudioManagerAccessor() {} // Must be called before destruction. virtual void Shutdown() = 0; @@ -49,9 +52,11 @@ private: void BindSystemInfoRequest(mojom::SystemInfoRequest request); + void BindDebugRecordingRequest(mojom::DebugRecordingRequest request); std::unique_ptr<AudioManagerAccessor> audio_manager_accessor_; std::unique_ptr<SystemInfo> system_info_; + std::unique_ptr<DebugRecording> debug_recording_; service_manager::BinderRegistry registry_;
diff --git a/services/audio/test/debug_recording_session_unittest.cc b/services/audio/test/debug_recording_session_unittest.cc new file mode 100644 index 0000000..b1140db --- /dev/null +++ b/services/audio/test/debug_recording_session_unittest.cc
@@ -0,0 +1,179 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "services/audio/public/cpp/debug_recording_session.h" + +#include <memory> + +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" +#include "base/test/scoped_task_environment.h" +#include "media/audio/audio_debug_recording_test.h" +#include "media/audio/mock_audio_debug_recording_manager.h" +#include "media/audio/mock_audio_manager.h" +#include "services/audio/service_factory.h" +#include "services/service_manager/public/cpp/service_test.h" +#include "services/service_manager/public/cpp/test/test_connector_factory.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace audio { + +namespace { + +const base::FilePath::CharType kBaseFileName[] = + FILE_PATH_LITERAL("debug_recording"); +const base::FilePath::CharType kWavExtension[] = FILE_PATH_LITERAL("wav"); +const base::FilePath::CharType kValidSuffix[] = FILE_PATH_LITERAL("output.1"); +const base::FilePath::CharType kEmptySuffix[] = FILE_PATH_LITERAL(""); +const base::FilePath::CharType kInvalidSuffix[] = + FILE_PATH_LITERAL("/../invalid"); + +} // namespace + +class DebugRecordingFileProviderTest : public testing::Test { + public: + DebugRecordingFileProviderTest() = default; + ~DebugRecordingFileProviderTest() override = default; + + void SetUp() override { + ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); + file_path_ = temp_dir_.GetPath().Append(kBaseFileName); + file_provider_ = + std::make_unique<DebugRecordingSession::DebugRecordingFileProvider>( + mojo::MakeRequest(&file_provider_ptr_), file_path_); + ASSERT_TRUE(file_provider_ptr_.is_bound()); + } + + void TearDown() override { file_provider_.reset(); } + + base::FilePath GetFileName(base::FilePath suffix) { + return file_path_.AddExtension(suffix.value()).AddExtension(kWavExtension); + } + + MOCK_METHOD1(OnFileCreated, void(bool)); + void FileCreated(base::File file) { OnFileCreated(file.IsValid()); } + + protected: + mojom::DebugRecordingFileProviderPtr file_provider_ptr_; + base::test::ScopedTaskEnvironment scoped_task_environment_; + + private: + std::unique_ptr<DebugRecordingSession::DebugRecordingFileProvider> + file_provider_; + base::ScopedTempDir temp_dir_; + base::FilePath file_path_; + + DISALLOW_COPY_AND_ASSIGN(DebugRecordingFileProviderTest); +}; + +class DebugRecordingSessionTest : public media::AudioDebugRecordingTest { + public: + DebugRecordingSessionTest() = default; + ~DebugRecordingSessionTest() override = default; + + void SetUp() override { + CreateAudioManager(); + InitializeAudioDebugRecordingManager(); + + connector_factory_ = + service_manager::TestConnectorFactory::CreateForUniqueService( + CreateEmbeddedService( + static_cast<media::AudioManager*>(mock_audio_manager_.get()))); + scoped_task_environment_.RunUntilIdle(); + } + + void TearDown() override { ShutdownAudioManager(); } + + protected: + std::unique_ptr<DebugRecordingSession> CreateDebugRecordingSession() { + std::unique_ptr<DebugRecordingSession> session( + std::make_unique<DebugRecordingSession>( + base::FilePath(kBaseFileName), + connector_factory_->CreateConnector())); + scoped_task_environment_.RunUntilIdle(); + return session; + } + + void DestroyDebugRecordingSession( + std::unique_ptr<DebugRecordingSession> debug_recording_session) { + debug_recording_session.reset(); + scoped_task_environment_.RunUntilIdle(); + } + + private: + std::unique_ptr<service_manager::TestConnectorFactory> connector_factory_; + + DISALLOW_COPY_AND_ASSIGN(DebugRecordingSessionTest); +}; + +TEST_F(DebugRecordingFileProviderTest, CreateWithValidSuffixReturnsValidFile) { + base::FilePath suffix(kValidSuffix); + EXPECT_CALL(*this, OnFileCreated(true)); + file_provider_ptr_->CreateWavFile( + suffix, base::BindOnce(&DebugRecordingFileProviderTest::FileCreated, + base::Unretained(this))); + scoped_task_environment_.RunUntilIdle(); + + base::FilePath file_name(GetFileName(suffix)); + EXPECT_TRUE(base::PathExists(file_name)); + ASSERT_TRUE(base::DeleteFile(file_name, false)); +} + +TEST_F(DebugRecordingFileProviderTest, CreateWithEmptySuffixReturnsValidFile) { + base::FilePath suffix(kEmptySuffix); + EXPECT_CALL(*this, OnFileCreated(true)); + file_provider_ptr_->CreateWavFile( + suffix, base::BindOnce(&DebugRecordingFileProviderTest::FileCreated, + base::Unretained(this))); + scoped_task_environment_.RunUntilIdle(); + + base::FilePath file_name(GetFileName(suffix)); + EXPECT_TRUE(base::PathExists(file_name)); + ASSERT_TRUE(base::DeleteFile(file_name, false)); +} + +TEST_F(DebugRecordingFileProviderTest, + CreateWithInvalidSuffixReturnsInvalidFile) { + base::FilePath suffix(kInvalidSuffix); + EXPECT_CALL(*this, OnFileCreated(false)); + file_provider_ptr_->CreateWavFile( + suffix, base::BindOnce(&DebugRecordingFileProviderTest::FileCreated, + base::Unretained(this))); + scoped_task_environment_.RunUntilIdle(); + + EXPECT_FALSE(base::PathExists(GetFileName(suffix))); +} + +TEST_F(DebugRecordingSessionTest, + CreateDestroySessionEnablesDisablesDebugRecording) { + EXPECT_CALL(*mock_debug_recording_manager_, EnableDebugRecording(testing::_)); + std::unique_ptr<DebugRecordingSession> session = + CreateDebugRecordingSession(); + + EXPECT_CALL(*mock_debug_recording_manager_, DisableDebugRecording()); + DestroyDebugRecordingSession(std::move(session)); +} + +TEST_F(DebugRecordingSessionTest, + CreateTwoSessionsFirstSessionDestroyedOnSecondSessionCreation) { + testing::InSequence seq; + + EXPECT_CALL(*mock_debug_recording_manager_, EnableDebugRecording(testing::_)); + std::unique_ptr<DebugRecordingSession> first_session = + CreateDebugRecordingSession(); + + EXPECT_CALL(*mock_debug_recording_manager_, DisableDebugRecording()); + EXPECT_CALL(*mock_debug_recording_manager_, EnableDebugRecording(testing::_)); + std::unique_ptr<DebugRecordingSession> second_session = + CreateDebugRecordingSession(); + + EXPECT_CALL(*mock_debug_recording_manager_, DisableDebugRecording()).Times(0); + DestroyDebugRecordingSession(std::move(first_session)); + EXPECT_CALL(*mock_debug_recording_manager_, DisableDebugRecording()); + DestroyDebugRecordingSession(std::move(second_session)); +} + +} // namespace audio
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn index edff41e..1f99d8c 100644 --- a/services/network/BUILD.gn +++ b/services/network/BUILD.gn
@@ -12,6 +12,8 @@ sources = [ "cookie_manager.cc", "cookie_manager.h", + "cors/preflight_controller.cc", + "cors/preflight_controller.h", "data_pipe_element_reader.cc", "data_pipe_element_reader.h", "http_server_properties_pref_delegate.cc", @@ -114,7 +116,8 @@ sources = [ "cookie_manager_unittest.cc", - "cors_url_loader_unittest.cc", + "cors/cors_url_loader_unittest.cc", + "cors/preflight_controller_unittest.cc", "data_pipe_element_reader_unittest.cc", "ignore_errors_cert_verifier_unittest.cc", "keepalive_statistics_recorder_unittest.cc",
diff --git a/services/network/cors_url_loader_unittest.cc b/services/network/cors/cors_url_loader_unittest.cc similarity index 100% rename from services/network/cors_url_loader_unittest.cc rename to services/network/cors/cors_url_loader_unittest.cc
diff --git a/services/network/cors/preflight_controller.cc b/services/network/cors/preflight_controller.cc new file mode 100644 index 0000000..ca47fd1a --- /dev/null +++ b/services/network/cors/preflight_controller.cc
@@ -0,0 +1,96 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "services/network/cors/preflight_controller.h" + +#include <algorithm> + +#include "base/strings/string_util.h" +#include "net/http/http_request_headers.h" +#include "services/network/public/cpp/cors/cors.h" +#include "url/gurl.h" + +namespace network { + +namespace cors { + +namespace { + +// Algorithm step 3 of the CORS-preflight fetch, +// https://fetch.spec.whatwg.org/#cors-preflight-fetch-0, that requires +// - CORS-safelisted request-headers excluded +// - duplicates excluded +// - sorted lexicographically +// - byte-lowercased +std::string CreateAccessControlRequestHeadersHeader( + const net::HttpRequestHeaders& headers) { + std::vector<std::string> filtered_headers; + for (const auto& header : headers.GetHeaderVector()) { + // Exclude CORS-safelisted headers. + if (cors::IsCORSSafelistedHeader(header.key, header.value)) + continue; + // Exclude the forbidden headers because they may be added by the user + // agent. They must be checked separately and rejected for + // JavaScript-initiated requests. + if (cors::IsForbiddenHeader(header.key)) + continue; + filtered_headers.push_back(base::ToLowerASCII(header.key)); + } + if (filtered_headers.empty()) + return std::string(); + + // Sort header names lexicographically. + std::sort(filtered_headers.begin(), filtered_headers.end()); + + return base::JoinString(filtered_headers, ","); +} + +} // namespace + +// static +std::unique_ptr<ResourceRequest> PreflightController::CreatePreflightRequest( + const ResourceRequest& request) { + DCHECK(!request.url.has_username()); + DCHECK(!request.url.has_password()); + + std::unique_ptr<ResourceRequest> preflight_request = + std::make_unique<ResourceRequest>(); + + // Algorithm step 1 through 4 of the CORS-preflight fetch, + // https://fetch.spec.whatwg.org/#cors-preflight-fetch-0. + preflight_request->url = request.url; + preflight_request->method = "OPTIONS"; + preflight_request->priority = request.priority; + preflight_request->request_context = request.request_context; + preflight_request->referrer = request.referrer; + preflight_request->referrer_policy = request.referrer_policy; + + preflight_request->fetch_credentials_mode = + mojom::FetchCredentialsMode::kOmit; + + preflight_request->headers.SetHeader( + cors::header_names::kAccessControlRequestMethod, request.method); + + std::string request_headers = + CreateAccessControlRequestHeadersHeader(request.headers); + if (!request_headers.empty()) { + preflight_request->headers.SetHeader( + cors::header_names::kAccessControlRequestHeaders, request_headers); + } + + if (request.is_external_request) { + preflight_request->headers.SetHeader( + cors::header_names::kAccessControlRequestExternal, "true"); + } + + // TODO(toyoshim): Remove the following line once the network service is + // enabled by default. + preflight_request->skip_service_worker = true; + + return preflight_request; +} + +} // namespace cors + +} // namespace network
diff --git a/services/network/cors/preflight_controller.h b/services/network/cors/preflight_controller.h new file mode 100644 index 0000000..40f4809 --- /dev/null +++ b/services/network/cors/preflight_controller.h
@@ -0,0 +1,39 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SERVICES_NETWORK_CORS_PREFLIGHT_CONTROLLER_H_ +#define SERVICES_NETWORK_CORS_PREFLIGHT_CONTROLLER_H_ + +#include <memory> + +#include "base/component_export.h" +#include "services/network/public/cpp/resource_request.h" + +namespace network { + +namespace cors { + +// A class to manage CORS-preflight, making a CORS-preflight request, checking +// its result, and owning a CORS-preflight cache. +// TODO(toyoshim): Features explained above not fully implemented yet. +// See also https://crbug.com/803766 to check a design doc. +class COMPONENT_EXPORT(NETWORK_SERVICE) PreflightController { + public: + // Creates a CORS-preflight ResourceRequest for a specified |request| for a + // URL that is originally requested. + // Note: This function is exposed for testing only purpose, and production + // code outside this class should not call this function directly. + static std::unique_ptr<ResourceRequest> CreatePreflightRequest( + const ResourceRequest& request); + + // TODO(toyoshim): Implements an asynchronous interface to consult about + // CORS-preflight check, that manages a preflight cache, and may make a + // preflight request internally. +}; + +} // namespace cors + +} // namespace network + +#endif // SERVICES_NETWORK_CORS_PREFLIGHT_CONTROLLER_H_
diff --git a/services/network/cors/preflight_controller_unittest.cc b/services/network/cors/preflight_controller_unittest.cc new file mode 100644 index 0000000..75c1a38 --- /dev/null +++ b/services/network/cors/preflight_controller_unittest.cc
@@ -0,0 +1,108 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "services/network/cors/preflight_controller.h" + +#include "services/network/public/cpp/cors/cors.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace network { + +namespace cors { + +namespace { + +TEST(PreflightControllerCreatePreflightRequestTest, LexicographicalOrder) { + ResourceRequest request; + request.headers.SetHeader("Orange", "Orange"); + request.headers.SetHeader("Apple", "Red"); + request.headers.SetHeader("Kiwifruit", "Green"); + request.headers.SetHeader("Content-Type", "application/octet-stream"); + request.headers.SetHeader("Strawberry", "Red"); + + std::unique_ptr<ResourceRequest> preflight = + PreflightController::CreatePreflightRequest(request); + + std::string header; + EXPECT_TRUE(preflight->headers.GetHeader( + cors::header_names::kAccessControlRequestHeaders, &header)); + EXPECT_EQ("apple,content-type,kiwifruit,orange,strawberry", header); +} + +TEST(PreflightControllerCreatePreflightRequestTest, ExcludeSimpleHeaders) { + ResourceRequest request; + request.headers.SetHeader("Accept", "everything"); + request.headers.SetHeader("Accept-Language", "everything"); + request.headers.SetHeader("Content-Language", "everything"); + request.headers.SetHeader("Save-Data", "on"); + + std::unique_ptr<ResourceRequest> preflight = + PreflightController::CreatePreflightRequest(request); + + // Do not emit empty-valued headers; an empty list of non-"CORS safelisted" + // request headers should cause "Access-Control-Request-Headers:" to be + // left out in the preflight request. + std::string header; + EXPECT_FALSE(preflight->headers.GetHeader( + cors::header_names::kAccessControlRequestHeaders, &header)); +} + +TEST(PreflightControllerCreatePreflightRequestTest, + ExcludeSimpleContentTypeHeader) { + ResourceRequest request; + request.headers.SetHeader("Content-Type", "text/plain"); + + std::unique_ptr<ResourceRequest> preflight = + PreflightController::CreatePreflightRequest(request); + + // Empty list also; see comment in test above. + std::string header; + EXPECT_FALSE(preflight->headers.GetHeader( + cors::header_names::kAccessControlRequestHeaders, &header)); +} + +TEST(PreflightControllerCreatePreflightRequestTest, IncludeNonSimpleHeader) { + ResourceRequest request; + request.headers.SetHeader("X-Custom-Header", "foobar"); + + std::unique_ptr<ResourceRequest> preflight = + PreflightController::CreatePreflightRequest(request); + + std::string header; + EXPECT_TRUE(preflight->headers.GetHeader( + cors::header_names::kAccessControlRequestHeaders, &header)); + EXPECT_EQ("x-custom-header", header); +} + +TEST(PreflightControllerCreatePreflightRequestTest, + IncludeNonSimpleContentTypeHeader) { + ResourceRequest request; + request.headers.SetHeader("Content-Type", "application/octet-stream"); + + std::unique_ptr<ResourceRequest> preflight = + PreflightController::CreatePreflightRequest(request); + + std::string header; + EXPECT_TRUE(preflight->headers.GetHeader( + cors::header_names::kAccessControlRequestHeaders, &header)); + EXPECT_EQ("content-type", header); +} + +TEST(PreflightControllerCreatePreflightRequestTest, ExcludeForbiddenHeaders) { + ResourceRequest request; + request.headers.SetHeader("referer", "https://www.google.com/"); + + std::unique_ptr<ResourceRequest> preflight = + PreflightController::CreatePreflightRequest(request); + + std::string header; + EXPECT_FALSE(preflight->headers.GetHeader( + cors::header_names::kAccessControlRequestHeaders, &header)); +} + +} // namespace + +} // namespace cors + +} // namespace network
diff --git a/services/network/public/cpp/cors/cors.cc b/services/network/public/cpp/cors/cors.cc index f76bb3a1..81c480a 100644 --- a/services/network/public/cpp/cors/cors.cc +++ b/services/network/public/cpp/cors/cors.cc
@@ -51,6 +51,9 @@ const char kAccessControlAllowCredentials[] = "Access-Control-Allow-Credentials"; const char kAccessControlAllowOrigin[] = "Access-Control-Allow-Origin"; +const char kAccessControlRequestExternal[] = "Access-Control-Request-External"; +const char kAccessControlRequestHeaders[] = "Access-Control-Request-Headers"; +const char kAccessControlRequestMethod[] = "Access-Control-Request-Method"; } // namespace header_names
diff --git a/services/network/public/cpp/cors/cors.h b/services/network/public/cpp/cors/cors.h index 6c62f682..7520257 100644 --- a/services/network/public/cpp/cors/cors.h +++ b/services/network/public/cpp/cors/cors.h
@@ -27,6 +27,12 @@ extern const char kAccessControlAllowCredentials[]; COMPONENT_EXPORT(NETWORK_CPP) extern const char kAccessControlAllowOrigin[]; +COMPONENT_EXPORT(NETWORK_CPP) +extern const char kAccessControlRequestExternal[]; +COMPONENT_EXPORT(NETWORK_CPP) +extern const char kAccessControlRequestHeaders[]; +COMPONENT_EXPORT(NETWORK_CPP) +extern const char kAccessControlRequestMethod[]; } // namespace header_names
diff --git a/storage/browser/database/database_tracker_unittest.cc b/storage/browser/database/database_tracker_unittest.cc index 79af43dc..9003fd7 100644 --- a/storage/browser/database/database_tracker_unittest.cc +++ b/storage/browser/database/database_tracker_unittest.cc
@@ -133,7 +133,7 @@ void GetUsageAndQuota(base::SequencedTaskRunner* original_task_runner, const url::Origin& origin, blink::mojom::StorageType type, - const UsageAndQuotaCallback& callback) override {} + UsageAndQuotaCallback callback) override {} void SimulateQuotaManagerDestroyed() { if (registered_client_) {
diff --git a/storage/browser/fileapi/async_file_util.h b/storage/browser/fileapi/async_file_util.h index c8e6fad1..8ae710f 100644 --- a/storage/browser/fileapi/async_file_util.h +++ b/storage/browser/fileapi/async_file_util.h
@@ -54,9 +54,9 @@ // |on_close_callback| will be called after the |file| is closed in the // child process. |on_close_callback|.is_null() can be true, if no operation // is needed on closing the file. - typedef base::Callback< - void(base::File file, - const base::Closure& on_close_callback)> CreateOrOpenCallback; + typedef base::Callback<void(base::File file, + base::OnceClosure on_close_callback)> + CreateOrOpenCallback; typedef base::Callback< void(base::File::Error result,
diff --git a/storage/browser/fileapi/file_system_operation.h b/storage/browser/fileapi/file_system_operation.h index f2d77f33..a5409d0 100644 --- a/storage/browser/fileapi/file_system_operation.h +++ b/storage/browser/fileapi/file_system_operation.h
@@ -78,9 +78,9 @@ // Used for OpenFile(). |on_close_callback| will be called after the file is // closed in the child process. It can be null, if no operation is needed on // closing a file. - typedef base::Callback< - void(base::File file, - const base::Closure& on_close_callback)> OpenFileCallback; + typedef base::Callback<void(base::File file, + base::OnceClosure on_close_callback)> + OpenFileCallback; // Used for ReadDirectoryCallback. typedef std::vector<DirectoryEntry> FileEntryList;
diff --git a/storage/browser/fileapi/file_system_operation_impl.cc b/storage/browser/fileapi/file_system_operation_impl.cc index eb560953..93a975f1 100644 --- a/storage/browser/fileapi/file_system_operation_impl.cc +++ b/storage/browser/fileapi/file_system_operation_impl.cc
@@ -40,18 +40,17 @@ // Takes ownership and destruct on the target thread. void Destruct(base::File file) {} -void DidOpenFile( - scoped_refptr<FileSystemContext> context, - base::WeakPtr<FileSystemOperationImpl> operation, - const FileSystemOperationImpl::OpenFileCallback& callback, - base::File file, - const base::Closure& on_close_callback) { +void DidOpenFile(scoped_refptr<FileSystemContext> context, + base::WeakPtr<FileSystemOperationImpl> operation, + const FileSystemOperationImpl::OpenFileCallback& callback, + base::File file, + base::OnceClosure on_close_callback) { if (!operation) { context->default_file_task_runner()->PostTask( FROM_HERE, base::BindOnce(&Destruct, base::Passed(&file))); return; } - callback.Run(std::move(file), on_close_callback); + callback.Run(std::move(file), std::move(on_close_callback)); } } // namespace
diff --git a/storage/browser/fileapi/file_system_operation_runner.cc b/storage/browser/fileapi/file_system_operation_runner.cc index b88d8ea..276b7c4 100644 --- a/storage/browser/fileapi/file_system_operation_runner.cc +++ b/storage/browser/fileapi/file_system_operation_runner.cc
@@ -625,16 +625,16 @@ const OperationHandle& handle, const OpenFileCallback& callback, base::File file, - const base::Closure& on_close_callback) { + base::OnceClosure on_close_callback) { if (handle.scope) { finished_operations_.insert(handle.id); base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(&FileSystemOperationRunner::DidOpenFile, AsWeakPtr(), - handle, callback, Passed(&file), on_close_callback)); + FROM_HERE, base::BindOnce(&FileSystemOperationRunner::DidOpenFile, + AsWeakPtr(), handle, callback, Passed(&file), + std::move(on_close_callback))); return; } - callback.Run(std::move(file), on_close_callback); + callback.Run(std::move(file), std::move(on_close_callback)); FinishOperation(handle.id); }
diff --git a/storage/browser/fileapi/file_system_operation_runner.h b/storage/browser/fileapi/file_system_operation_runner.h index 3d08dc5..9eb2a53 100644 --- a/storage/browser/fileapi/file_system_operation_runner.h +++ b/storage/browser/fileapi/file_system_operation_runner.h
@@ -276,11 +276,10 @@ base::File::Error rv, int64_t bytes, bool complete); - void DidOpenFile( - const OperationHandle& handle, - const OpenFileCallback& callback, - base::File file, - const base::Closure& on_close_callback); + void DidOpenFile(const OperationHandle& handle, + const OpenFileCallback& callback, + base::File file, + base::OnceClosure on_close_callback); void DidCreateSnapshot( const OperationHandle& handle, const SnapshotFileCallback& callback,
diff --git a/storage/browser/fileapi/quota/quota_backend_impl_unittest.cc b/storage/browser/fileapi/quota/quota_backend_impl_unittest.cc index f609318..9a35aca 100644 --- a/storage/browser/fileapi/quota/quota_backend_impl_unittest.cc +++ b/storage/browser/fileapi/quota/quota_backend_impl_unittest.cc
@@ -71,8 +71,8 @@ void GetUsageAndQuota(base::SequencedTaskRunner* original_task_runner, const url::Origin& origin, blink::mojom::StorageType type, - const UsageAndQuotaCallback& callback) override { - callback.Run(blink::mojom::QuotaStatusCode::kOk, usage_, quota_); + UsageAndQuotaCallback callback) override { + std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk, usage_, quota_); } int storage_modified_count() { return storage_modified_count_; }
diff --git a/storage/browser/quota/client_usage_tracker.cc b/storage/browser/quota/client_usage_tracker.cc index ea88b6c..6d2e48cfc 100644 --- a/storage/browser/quota/client_usage_tracker.cc +++ b/storage/browser/quota/client_usage_tracker.cc
@@ -16,15 +16,15 @@ namespace { -typedef ClientUsageTracker::OriginUsageAccumulator OriginUsageAccumulator; -typedef ClientUsageTracker::OriginSetByHost OriginSetByHost; +using OriginUsageAccumulator = ClientUsageTracker::OriginUsageAccumulator; +using OriginSetByHost = ClientUsageTracker::OriginSetByHost; -void DidGetHostUsage(const UsageCallback& callback, +void DidGetHostUsage(UsageCallback callback, int64_t limited_usage, int64_t unlimited_usage) { DCHECK_GE(limited_usage, 0); DCHECK_GE(unlimited_usage, 0); - callback.Run(limited_usage + unlimited_usage); + std::move(callback).Run(limited_usage + unlimited_usage); } bool EraseOriginFromOriginSet(OriginSetByHost* origins_by_host, @@ -49,10 +49,10 @@ return itr != origins.end() && base::ContainsKey(itr->second, origin); } -void DidGetGlobalUsageForLimitedGlobalUsage(const UsageCallback& callback, +void DidGetGlobalUsageForLimitedGlobalUsage(UsageCallback callback, int64_t total_global_usage, int64_t global_unlimited_usage) { - callback.Run(total_global_usage - global_unlimited_usage); + std::move(callback).Run(total_global_usage - global_unlimited_usage); } } // namespace @@ -83,23 +83,23 @@ special_storage_policy_->RemoveObserver(this); } -void ClientUsageTracker::GetGlobalLimitedUsage(const UsageCallback& callback) { +void ClientUsageTracker::GetGlobalLimitedUsage(UsageCallback callback) { if (!global_usage_retrieved_) { - GetGlobalUsage(base::Bind(&DidGetGlobalUsageForLimitedGlobalUsage, - callback)); + GetGlobalUsage(base::BindOnce(&DidGetGlobalUsageForLimitedGlobalUsage, + std::move(callback))); return; } if (non_cached_limited_origins_by_host_.empty()) { - callback.Run(global_limited_usage_); + std::move(callback).Run(global_limited_usage_); return; } AccumulateInfo* info = new AccumulateInfo; info->pending_jobs = non_cached_limited_origins_by_host_.size() + 1; - UsageCallback accumulator = base::Bind( + UsageAccumulator accumulator = base::BindRepeating( &ClientUsageTracker::AccumulateLimitedOriginUsage, AsWeakPtr(), - base::Owned(info), callback); + base::Owned(info), AdaptCallbackForRepeating(std::move(callback))); for (const auto& host_and_origins : non_cached_limited_origins_by_host_) { for (const auto& origin : host_and_origins.second) @@ -109,35 +109,37 @@ accumulator.Run(global_limited_usage_); } -void ClientUsageTracker::GetGlobalUsage(const GlobalUsageCallback& callback) { +void ClientUsageTracker::GetGlobalUsage(GlobalUsageCallback callback) { if (global_usage_retrieved_ && non_cached_limited_origins_by_host_.empty() && non_cached_unlimited_origins_by_host_.empty()) { - callback.Run(global_limited_usage_ + global_unlimited_usage_, - global_unlimited_usage_); + std::move(callback).Run(global_limited_usage_ + global_unlimited_usage_, + global_unlimited_usage_); return; } - client_->GetOriginsForType(type_, base::Bind( - &ClientUsageTracker::DidGetOriginsForGlobalUsage, AsWeakPtr(), - callback)); + client_->GetOriginsForType( + type_, base::BindOnce(&ClientUsageTracker::DidGetOriginsForGlobalUsage, + AsWeakPtr(), std::move(callback))); } -void ClientUsageTracker::GetHostUsage( - const std::string& host, const UsageCallback& callback) { +void ClientUsageTracker::GetHostUsage(const std::string& host, + UsageCallback callback) { if (base::ContainsKey(cached_hosts_, host) && !base::ContainsKey(non_cached_limited_origins_by_host_, host) && !base::ContainsKey(non_cached_unlimited_origins_by_host_, host)) { // TODO(kinuko): Drop host_usage_map_ cache periodically. - callback.Run(GetCachedHostUsage(host)); + std::move(callback).Run(GetCachedHostUsage(host)); return; } if (!host_usage_accumulators_.Add( - host, base::Bind(&DidGetHostUsage, callback))) + host, base::BindOnce(&DidGetHostUsage, std::move(callback)))) return; - client_->GetOriginsForHost(type_, host, base::Bind( - &ClientUsageTracker::DidGetOriginsForHostUsage, AsWeakPtr(), host)); + client_->GetOriginsForHost( + type_, host, + base::BindOnce(&ClientUsageTracker::DidGetOriginsForHostUsage, + AsWeakPtr(), host)); } void ClientUsageTracker::UpdateUsageCache(const GURL& origin, int64_t delta) { @@ -164,8 +166,9 @@ } // We don't know about this host yet, so populate our cache for it. - GetHostUsage(host, base::Bind(&ClientUsageTracker::DidGetHostUsageAfterUpdate, - AsWeakPtr(), origin)); + GetHostUsage(host, + base::BindOnce(&ClientUsageTracker::DidGetHostUsageAfterUpdate, + AsWeakPtr(), origin)); } int64_t ClientUsageTracker::GetCachedUsage() const { @@ -241,19 +244,18 @@ } } -void ClientUsageTracker::AccumulateLimitedOriginUsage( - AccumulateInfo* info, - const UsageCallback& callback, - int64_t usage) { +void ClientUsageTracker::AccumulateLimitedOriginUsage(AccumulateInfo* info, + UsageCallback callback, + int64_t usage) { info->limited_usage += usage; if (--info->pending_jobs) return; - callback.Run(info->limited_usage); + std::move(callback).Run(info->limited_usage); } void ClientUsageTracker::DidGetOriginsForGlobalUsage( - const GlobalUsageCallback& callback, + GlobalUsageCallback callback, const std::set<url::Origin>& origins) { OriginSetByHost origins_by_host; for (const auto& origin : origins) { @@ -268,9 +270,9 @@ // loop). To avoid this, we add one more pending host as a sentinel and // fire the sentinel callback at the end. info->pending_jobs = origins_by_host.size() + 1; - HostUsageAccumulator accumulator = - base::Bind(&ClientUsageTracker::AccumulateHostUsage, AsWeakPtr(), - base::Owned(info), callback); + HostUsageAccumulator accumulator = base::BindRepeating( + &ClientUsageTracker::AccumulateHostUsage, AsWeakPtr(), base::Owned(info), + base::AdaptCallbackForRepeating(std::move(callback))); for (const auto& host_and_origins : origins_by_host) { const std::string& host = host_and_origins.first; @@ -286,11 +288,10 @@ accumulator.Run(0, 0); } -void ClientUsageTracker::AccumulateHostUsage( - AccumulateInfo* info, - const GlobalUsageCallback& callback, - int64_t limited_usage, - int64_t unlimited_usage) { +void ClientUsageTracker::AccumulateHostUsage(AccumulateInfo* info, + GlobalUsageCallback callback, + int64_t limited_usage, + int64_t unlimited_usage) { info->limited_usage += limited_usage; info->unlimited_usage += unlimited_usage; if (--info->pending_jobs) @@ -300,8 +301,8 @@ DCHECK_GE(info->unlimited_usage, 0); global_usage_retrieved_ = true; - callback.Run(info->limited_usage + info->unlimited_usage, - info->unlimited_usage); + std::move(callback).Run(info->limited_usage + info->unlimited_usage, + info->unlimited_usage); } void ClientUsageTracker::DidGetOriginsForHostUsage( @@ -321,8 +322,8 @@ // fire the sentinel callback at the end. info->pending_jobs = origins.size() + 1; OriginUsageAccumulator accumulator = - base::Bind(&ClientUsageTracker::AccumulateOriginUsage, AsWeakPtr(), - base::Owned(info), host); + base::BindRepeating(&ClientUsageTracker::AccumulateOriginUsage, + AsWeakPtr(), base::Owned(info), host); for (const auto& origin : origins) { GURL origin_url = origin.GetURL(); @@ -333,7 +334,7 @@ accumulator.Run(origin_url, origin_usage); } else { client_->GetOriginUsage(origin, type_, - base::Bind(accumulator, origin_url)); + base::BindOnce(accumulator, origin_url)); } }
diff --git a/storage/browser/quota/client_usage_tracker.h b/storage/browser/quota/client_usage_tracker.h index efecebca..d897579 100644 --- a/storage/browser/quota/client_usage_tracker.h +++ b/storage/browser/quota/client_usage_tracker.h
@@ -35,11 +35,16 @@ class ClientUsageTracker : public SpecialStoragePolicy::Observer, public base::SupportsWeakPtr<ClientUsageTracker> { public: - typedef base::Callback<void(int64_t limited_usage, int64_t unlimited_usage)> - HostUsageAccumulator; - typedef base::Callback<void(const GURL& origin, int64_t usage)> - OriginUsageAccumulator; - typedef std::map<std::string, std::set<GURL> > OriginSetByHost; + using HostUsageAccumulator = + base::RepeatingCallback<void(int64_t limited_usage, + int64_t unlimited_usage)>; + using OriginUsageAccumulator = + base::RepeatingCallback<void(const GURL& origin, int64_t usage)>; + using UsageAccumulator = base::RepeatingCallback<void(int64_t usage)>; + using OriginSetByHost = std::map<std::string, std::set<GURL>>; + + using HostUsageCallback = + base::OnceCallback<void(int64_t limited_usage, int64_t unlimited_usage)>; ClientUsageTracker(UsageTracker* tracker, QuotaClient* client, @@ -48,9 +53,9 @@ StorageMonitor* storage_monitor); ~ClientUsageTracker() override; - void GetGlobalLimitedUsage(const UsageCallback& callback); - void GetGlobalUsage(const GlobalUsageCallback& callback); - void GetHostUsage(const std::string& host, const UsageCallback& callback); + void GetGlobalLimitedUsage(UsageCallback callback); + void GetGlobalUsage(GlobalUsageCallback callback); + void GetHostUsage(const std::string& host, UsageCallback callback); void UpdateUsageCache(const GURL& origin, int64_t delta); int64_t GetCachedUsage() const; void GetCachedHostsUsage(std::map<std::string, int64_t>* host_usage) const; @@ -60,12 +65,12 @@ void SetUsageCacheEnabled(const GURL& origin, bool enabled); private: - typedef CallbackQueueMap<HostUsageAccumulator, std::string, int64_t, int64_t> - HostUsageAccumulatorMap; + using HostUsageAccumulatorMap = + CallbackQueueMap<HostUsageCallback, std::string, int64_t, int64_t>; - typedef std::set<std::string> HostSet; - typedef std::map<GURL, int64_t> UsageMap; - typedef std::map<std::string, UsageMap> HostUsageMap; + using HostSet = std::set<std::string>; + using UsageMap = std::map<GURL, int64_t>; + using HostUsageMap = std::map<std::string, UsageMap>; struct AccumulateInfo { int pending_jobs; @@ -77,12 +82,12 @@ }; void AccumulateLimitedOriginUsage(AccumulateInfo* info, - const UsageCallback& callback, + UsageCallback callback, int64_t usage); - void DidGetOriginsForGlobalUsage(const GlobalUsageCallback& callback, + void DidGetOriginsForGlobalUsage(GlobalUsageCallback callback, const std::set<url::Origin>& origins); void AccumulateHostUsage(AccumulateInfo* info, - const GlobalUsageCallback& callback, + GlobalUsageCallback callback, int64_t limited_usage, int64_t unlimited_usage);
diff --git a/storage/browser/quota/quota_callbacks.h b/storage/browser/quota/quota_callbacks.h index 749ec0d..e534691 100644 --- a/storage/browser/quota/quota_callbacks.h +++ b/storage/browser/quota/quota_callbacks.h
@@ -26,31 +26,31 @@ typedef std::vector<UsageInfo> UsageInfoEntries; // Common callback types that are used throughout in the quota module. -typedef base::Callback<void(int64_t usage, int64_t unlimited_usage)> - GlobalUsageCallback; -typedef base::Callback<void(blink::mojom::QuotaStatusCode status, - int64_t quota)> - QuotaCallback; -typedef base::Callback<void(int64_t usage)> UsageCallback; -typedef base::Callback<void(int64_t usage, - base::flat_map<QuotaClient::ID, int64_t>)> - UsageWithBreakdownCallback; -typedef base::Callback<void(blink::mojom::QuotaStatusCode, int64_t)> - AvailableSpaceCallback; -typedef base::Callback<void(blink::mojom::QuotaStatusCode)> StatusCallback; -typedef base::Callback<void(const std::set<GURL>& origins, - blink::mojom::StorageType type)> - GetOriginsCallback; -typedef base::Callback<void(const UsageInfoEntries&)> GetUsageInfoCallback; -typedef base::Callback<void(const GURL&)> GetOriginCallback; +using GlobalUsageCallback = + base::OnceCallback<void(int64_t usage, int64_t unlimited_usage)>; +using QuotaCallback = + base::OnceCallback<void(blink::mojom::QuotaStatusCode status, + int64_t quota)>; +using UsageCallback = base::OnceCallback<void(int64_t usage)>; +using UsageWithBreakdownCallback = + base::OnceCallback<void(int64_t usage, + base::flat_map<QuotaClient::ID, int64_t>)>; +using AvailableSpaceCallback = + base::OnceCallback<void(blink::mojom::QuotaStatusCode, int64_t)>; +using StatusCallback = base::OnceCallback<void(blink::mojom::QuotaStatusCode)>; +using GetOriginsCallback = + base::OnceCallback<void(const std::set<GURL>& origins, + blink::mojom::StorageType type)>; +using GetUsageInfoCallback = base::OnceCallback<void(const UsageInfoEntries&)>; +using GetOriginCallback = base::OnceCallback<void(const GURL&)>; // Simple template wrapper for a callback queue. template <typename CallbackType, typename... Args> class CallbackQueue { public: // Returns true if the given |callback| is the first one added to the queue. - bool Add(const CallbackType& callback) { - callbacks_.push_back(callback); + bool Add(CallbackType callback) { + callbacks_.push_back(std::move(callback)); return (callbacks_.size() == 1); } @@ -62,8 +62,8 @@ void Run(Args... args) { std::vector<CallbackType> callbacks; callbacks.swap(callbacks_); - for (const auto& callback : callbacks) - callback.Run(args...); + for (auto& callback : callbacks) + std::move(callback).Run(args...); } void Swap(CallbackQueue<CallbackType, Args...>* other) { @@ -81,12 +81,12 @@ template <typename CallbackType, typename Key, typename... Args> class CallbackQueueMap { public: - typedef CallbackQueue<CallbackType, Args...> CallbackQueueType; - typedef std::map<Key, CallbackQueueType> CallbackMap; - typedef typename CallbackMap::iterator iterator; + using CallbackQueueType = CallbackQueue<CallbackType, Args...>; + using CallbackMap = std::map<Key, CallbackQueueType>; + using iterator = typename CallbackMap::iterator; - bool Add(const Key& key, const CallbackType& callback) { - return callback_map_[key].Add(callback); + bool Add(const Key& key, CallbackType callback) { + return callback_map_[key].Add(std::move(callback)); } bool HasCallbacks(const Key& key) const {
diff --git a/storage/browser/quota/quota_database.cc b/storage/browser/quota/quota_database.cc index 02ee1493..caea73c 100644 --- a/storage/browser/quota/quota_database.cc +++ b/storage/browser/quota/quota_database.cc
@@ -688,8 +688,8 @@ if (current_version == 2) { QuotaTableImporter importer; typedef std::vector<QuotaTableEntry> QuotaTableEntries; - if (!DumpQuotaTable(base::Bind(&QuotaTableImporter::Append, - base::Unretained(&importer)))) { + if (!DumpQuotaTable(base::BindRepeating(&QuotaTableImporter::Append, + base::Unretained(&importer)))) { return false; } ResetSchema();
diff --git a/storage/browser/quota/quota_database.h b/storage/browser/quota/quota_database.h index 5d215c7..c2a0faeb 100644 --- a/storage/browser/quota/quota_database.h +++ b/storage/browser/quota/quota_database.h
@@ -161,9 +161,10 @@ bool unique; }; - typedef base::Callback<bool (const QuotaTableEntry&)> QuotaTableCallback; - typedef base::Callback<bool (const OriginInfoTableEntry&)> - OriginInfoTableCallback; + using QuotaTableCallback = + base::RepeatingCallback<bool(const QuotaTableEntry&)>; + using OriginInfoTableCallback = + base::RepeatingCallback<bool(const OriginInfoTableEntry&)>; struct QuotaTableImporter;
diff --git a/storage/browser/quota/quota_database_unittest.cc b/storage/browser/quota/quota_database_unittest.cc index 7bf8155..baec00ed 100644 --- a/storage/browser/quota/quota_database_unittest.cc +++ b/storage/browser/quota/quota_database_unittest.cc
@@ -42,10 +42,9 @@ class QuotaDatabaseTest : public testing::Test { protected: - typedef QuotaDatabase::QuotaTableEntry QuotaTableEntry; - typedef QuotaDatabase::QuotaTableCallback QuotaTableCallback; - typedef QuotaDatabase::OriginInfoTableCallback - OriginInfoTableCallback; + using QuotaTableEntry = QuotaDatabase::QuotaTableEntry; + using QuotaTableCallback = QuotaDatabase::QuotaTableCallback; + using OriginInfoTableCallback = QuotaDatabase::OriginInfoTableCallback; void LazyOpen(const base::FilePath& kDbFile) { QuotaDatabase db(kDbFile); @@ -78,7 +77,7 @@ typedef EntryVerifier<QuotaTableEntry> Verifier; Verifier verifier(entries, entries + arraysize(entries)); EXPECT_TRUE(db.DumpQuotaTable( - base::Bind(&Verifier::Run, base::Unretained(&verifier)))); + base::BindRepeating(&Verifier::Run, base::Unretained(&verifier)))); EXPECT_TRUE(verifier.table.empty()); EXPECT_TRUE(db.db_->DoesTableExist("EvictionInfoTable")); @@ -403,7 +402,7 @@ typedef EntryVerifier<QuotaTableEntry> Verifier; Verifier verifier(begin, end); EXPECT_TRUE(db.DumpQuotaTable( - base::Bind(&Verifier::Run, base::Unretained(&verifier)))); + base::BindRepeating(&Verifier::Run, base::Unretained(&verifier)))); EXPECT_TRUE(verifier.table.empty()); } @@ -426,7 +425,7 @@ typedef EntryVerifier<Entry> Verifier; Verifier verifier(begin, end); EXPECT_TRUE(db.DumpOriginInfoTable( - base::Bind(&Verifier::Run, base::Unretained(&verifier)))); + base::BindRepeating(&Verifier::Run, base::Unretained(&verifier)))); EXPECT_TRUE(verifier.table.empty()); }
diff --git a/storage/browser/quota/quota_manager.cc b/storage/browser/quota/quota_manager.cc index 0c76f294..c217f1e 100644 --- a/storage/browser/quota/quota_manager.cc +++ b/storage/browser/quota/quota_manager.cc
@@ -209,12 +209,12 @@ } void DidGetUsageAndQuotaForWebApps( - const QuotaManager::UsageAndQuotaCallback& callback, + QuotaManager::UsageAndQuotaCallback callback, blink::mojom::QuotaStatusCode status, int64_t usage, int64_t quota, base::flat_map<QuotaClient::ID, int64_t> usage_breakdown) { - callback.Run(status, usage, quota); + std::move(callback).Run(status, usage, quota); } } // namespace @@ -227,10 +227,10 @@ bool is_unlimited, bool is_session_only, bool is_incognito, - const UsageAndQuotaWithBreakdownCallback& callback) + UsageAndQuotaWithBreakdownCallback callback) : QuotaTask(manager), origin_(origin), - callback_(callback), + callback_(std::move(callback)), type_(type), is_unlimited_(is_unlimited), is_session_only_(is_session_only), @@ -248,16 +248,16 @@ std::string host = net::GetHostOrSpecFromURL(origin_); - manager()->GetQuotaSettings(base::Bind(&UsageAndQuotaHelper::OnGotSettings, - weak_factory_.GetWeakPtr(), - barrier)); + manager()->GetQuotaSettings( + base::BindOnce(&UsageAndQuotaHelper::OnGotSettings, + weak_factory_.GetWeakPtr(), barrier)); manager()->GetStorageCapacity( - base::Bind(&UsageAndQuotaHelper::OnGotCapacity, - weak_factory_.GetWeakPtr(), barrier)); + base::BindOnce(&UsageAndQuotaHelper::OnGotCapacity, + weak_factory_.GetWeakPtr(), barrier)); manager()->GetHostUsageWithBreakdown( host, type_, - base::Bind(&UsageAndQuotaHelper::OnGotHostUsage, - weak_factory_.GetWeakPtr(), barrier)); + base::BindOnce(&UsageAndQuotaHelper::OnGotHostUsage, + weak_factory_.GetWeakPtr(), barrier)); // Determine host_quota differently depending on type. if (is_unlimited_) { @@ -268,8 +268,8 @@ kSyncableStorageDefaultHostQuota); } else if (type_ == StorageType::kPersistent) { manager()->GetPersistentHostQuota( - host, base::Bind(&UsageAndQuotaHelper::SetDesiredHostQuota, - weak_factory_.GetWeakPtr(), barrier)); + host, base::BindOnce(&UsageAndQuotaHelper::SetDesiredHostQuota, + weak_factory_.GetWeakPtr(), barrier)); } else { DCHECK_EQ(StorageType::kTemporary, type_); // For temporary storage, OnGotSettings will set the host quota. @@ -278,8 +278,8 @@ void Aborted() override { weak_factory_.InvalidateWeakPtrs(); - callback_.Run(blink::mojom::QuotaStatusCode::kErrorAbort, 0, 0, - base::flat_map<QuotaClient::ID, int64_t>()); + std::move(callback_).Run(blink::mojom::QuotaStatusCode::kErrorAbort, 0, 0, + base::flat_map<QuotaClient::ID, int64_t>()); DeleteSoon(); } @@ -294,8 +294,8 @@ host_usage_ + std::max(INT64_C(0), available_space_ - settings_.must_remain_available)); - callback_.Run(blink::mojom::QuotaStatusCode::kOk, host_usage_, host_quota, - std::move(host_usage_breakdown_)); + std::move(callback_).Run(blink::mojom::QuotaStatusCode::kOk, host_usage_, + host_quota, std::move(host_usage_breakdown_)); if (type_ == StorageType::kTemporary && !is_incognito_ && !is_unlimited_) { UMA_HISTOGRAM_MBYTES("Quota.QuotaForOrigin", host_quota); if (host_quota > 0) { @@ -371,37 +371,39 @@ class QuotaManager::EvictionRoundInfoHelper : public QuotaTask { public: EvictionRoundInfoHelper(QuotaManager* manager, - const EvictionRoundInfoCallback& callback) - : QuotaTask(manager), callback_(callback), weak_factory_(this) {} + EvictionRoundInfoCallback callback) + : QuotaTask(manager), + callback_(std::move(callback)), + weak_factory_(this) {} protected: void Run() override { // Gather 2 pieces of info before deciding if we need to get GlobalUsage: // settings and device_storage_capacity. - base::Closure barrier = base::BarrierClosure( + base::RepeatingClosure barrier = base::BarrierClosure( 2, base::BindOnce(&EvictionRoundInfoHelper::OnBarrierComplete, weak_factory_.GetWeakPtr())); manager()->GetQuotaSettings( - base::Bind(&EvictionRoundInfoHelper::OnGotSettings, - weak_factory_.GetWeakPtr(), barrier)); + base::BindOnce(&EvictionRoundInfoHelper::OnGotSettings, + weak_factory_.GetWeakPtr(), barrier)); manager()->GetStorageCapacity( - base::Bind(&EvictionRoundInfoHelper::OnGotCapacity, - weak_factory_.GetWeakPtr(), barrier)); + base::BindOnce(&EvictionRoundInfoHelper::OnGotCapacity, + weak_factory_.GetWeakPtr(), barrier)); } void Aborted() override { weak_factory_.InvalidateWeakPtrs(); - callback_.Run(blink::mojom::QuotaStatusCode::kErrorAbort, QuotaSettings(), - 0, 0, 0, false); + std::move(callback_).Run(blink::mojom::QuotaStatusCode::kErrorAbort, + QuotaSettings(), 0, 0, 0, false); DeleteSoon(); } void Completed() override { weak_factory_.InvalidateWeakPtrs(); - callback_.Run(blink::mojom::QuotaStatusCode::kOk, settings_, - available_space_, total_space_, global_usage_, - global_usage_is_complete_); + std::move(callback_).Run(blink::mojom::QuotaStatusCode::kOk, settings_, + available_space_, total_space_, global_usage_, + global_usage_is_complete_); DeleteSoon(); } @@ -437,8 +439,8 @@ } manager()->GetGlobalUsage( StorageType::kTemporary, - base::Bind(&EvictionRoundInfoHelper::OnGotGlobalUsage, - weak_factory_.GetWeakPtr())); + base::BindOnce(&EvictionRoundInfoHelper::OnGotGlobalUsage, + weak_factory_.GetWeakPtr())); } void OnGotGlobalUsage(int64_t usage, int64_t unlimited_usage) { @@ -464,13 +466,10 @@ class QuotaManager::GetUsageInfoTask : public QuotaTask { public: - GetUsageInfoTask( - QuotaManager* manager, - const GetUsageInfoCallback& callback) + GetUsageInfoTask(QuotaManager* manager, GetUsageInfoCallback callback) : QuotaTask(manager), - callback_(callback), - weak_factory_(this) { - } + callback_(std::move(callback)), + weak_factory_(this) {} protected: void Run() override { @@ -481,31 +480,31 @@ // This will populate cached hosts and usage info. manager() ->GetUsageTracker(StorageType::kTemporary) - ->GetGlobalUsage(base::Bind(&GetUsageInfoTask::DidGetGlobalUsage, - weak_factory_.GetWeakPtr(), - StorageType::kTemporary)); + ->GetGlobalUsage(base::BindOnce(&GetUsageInfoTask::DidGetGlobalUsage, + weak_factory_.GetWeakPtr(), + StorageType::kTemporary)); manager() ->GetUsageTracker(StorageType::kPersistent) - ->GetGlobalUsage(base::Bind(&GetUsageInfoTask::DidGetGlobalUsage, - weak_factory_.GetWeakPtr(), - StorageType::kPersistent)); + ->GetGlobalUsage(base::BindOnce(&GetUsageInfoTask::DidGetGlobalUsage, + weak_factory_.GetWeakPtr(), + StorageType::kPersistent)); manager() ->GetUsageTracker(StorageType::kSyncable) - ->GetGlobalUsage(base::Bind(&GetUsageInfoTask::DidGetGlobalUsage, - weak_factory_.GetWeakPtr(), - StorageType::kSyncable)); + ->GetGlobalUsage(base::BindOnce(&GetUsageInfoTask::DidGetGlobalUsage, + weak_factory_.GetWeakPtr(), + StorageType::kSyncable)); } void Completed() override { // crbug.com/349708 TRACE_EVENT0("io", "QuotaManager::GetUsageInfoTask::Completed"); - callback_.Run(entries_); + std::move(callback_).Run(entries_); DeleteSoon(); } void Aborted() override { - callback_.Run(UsageInfoEntries()); + std::move(callback_).Run(UsageInfoEntries()); DeleteSoon(); } @@ -546,7 +545,7 @@ StorageType type, int quota_client_mask, bool is_eviction, - const StatusCallback& callback) + StatusCallback callback) : QuotaTask(manager), origin_(origin), type_(type), @@ -555,7 +554,7 @@ remaining_clients_(-1), skipped_clients_(0), is_eviction_(is_eviction), - callback_(callback), + callback_(std::move(callback)), weak_factory_(this) {} protected: @@ -567,8 +566,8 @@ if (quota_client_mask_ & (*iter)->id()) { (*iter)->DeleteOriginData( url::Origin::Create(origin_), type_, - base::Bind(&OriginDataDeleter::DidDeleteOriginData, - weak_factory_.GetWeakPtr())); + base::BindOnce(&OriginDataDeleter::DidDeleteOriginData, + weak_factory_.GetWeakPtr())); } else { ++skipped_clients_; if (--remaining_clients_ == 0) @@ -585,18 +584,19 @@ // Only remove the entire origin if we didn't skip any client types. if (skipped_clients_ == 0) manager()->DeleteOriginFromDatabase(origin_, type_, is_eviction_); - callback_.Run(blink::mojom::QuotaStatusCode::kOk); + std::move(callback_).Run(blink::mojom::QuotaStatusCode::kOk); } else { // crbug.com/349708 TRACE_EVENT0("io", "QuotaManager::OriginDataDeleter::Completed Error"); - callback_.Run(blink::mojom::QuotaStatusCode::kErrorInvalidModification); + std::move(callback_).Run( + blink::mojom::QuotaStatusCode::kErrorInvalidModification); } DeleteSoon(); } void Aborted() override { - callback_.Run(blink::mojom::QuotaStatusCode::kErrorAbort); + std::move(callback_).Run(blink::mojom::QuotaStatusCode::kErrorAbort); DeleteSoon(); } @@ -634,7 +634,7 @@ const std::string& host, StorageType type, int quota_client_mask, - const StatusCallback& callback) + StatusCallback callback) : QuotaTask(manager), host_(host), type_(type), @@ -642,7 +642,7 @@ error_count_(0), remaining_clients_(-1), remaining_deleters_(-1), - callback_(callback), + callback_(std::move(callback)), weak_factory_(this) {} protected: @@ -653,8 +653,8 @@ iter != manager()->clients_.end(); ++iter) { (*iter)->GetOriginsForHost( type_, host_, - base::Bind(&HostDataDeleter::DidGetOriginsForHost, - weak_factory_.GetWeakPtr())); + base::BindOnce(&HostDataDeleter::DidGetOriginsForHost, + weak_factory_.GetWeakPtr())); } } @@ -663,18 +663,19 @@ // crbug.com/349708 TRACE_EVENT0("io", "QuotaManager::HostDataDeleter::Completed Ok"); - callback_.Run(blink::mojom::QuotaStatusCode::kOk); + std::move(callback_).Run(blink::mojom::QuotaStatusCode::kOk); } else { // crbug.com/349708 TRACE_EVENT0("io", "QuotaManager::HostDataDeleter::Completed Error"); - callback_.Run(blink::mojom::QuotaStatusCode::kErrorInvalidModification); + std::move(callback_).Run( + blink::mojom::QuotaStatusCode::kErrorInvalidModification); } DeleteSoon(); } void Aborted() override { - callback_.Run(blink::mojom::QuotaStatusCode::kErrorAbort); + std::move(callback_).Run(blink::mojom::QuotaStatusCode::kErrorAbort); DeleteSoon(); } @@ -700,8 +701,8 @@ ++p) { OriginDataDeleter* deleter = new OriginDataDeleter( manager(), *p, type_, quota_client_mask_, false, - base::Bind(&HostDataDeleter::DidDeleteOriginData, - weak_factory_.GetWeakPtr())); + base::BindOnce(&HostDataDeleter::DidDeleteOriginData, + weak_factory_.GetWeakPtr())); deleter->Start(); } } @@ -743,16 +744,16 @@ } void DidGetModifiedSince(const base::WeakPtr<QuotaManager>& manager, - const GetOriginsCallback& callback, + GetOriginsCallback callback, StorageType type, bool success) { if (!manager) { // The operation was aborted. - callback.Run(std::set<GURL>(), type); + std::move(callback).Run(std::set<GURL>(), type); return; } manager->DidDatabaseWork(success); - callback.Run(origins_, type); + std::move(callback).Run(origins_, type); } private: @@ -763,20 +764,20 @@ public: bool DumpQuotaTableOnDBThread(QuotaDatabase* database) { DCHECK(database); - return database->DumpQuotaTable( - base::Bind(&DumpQuotaTableHelper::AppendEntry, base::Unretained(this))); + return database->DumpQuotaTable(base::BindRepeating( + &DumpQuotaTableHelper::AppendEntry, base::Unretained(this))); } void DidDumpQuotaTable(const base::WeakPtr<QuotaManager>& manager, - const DumpQuotaTableCallback& callback, + DumpQuotaTableCallback callback, bool success) { if (!manager) { // The operation was aborted. - callback.Run(QuotaTableEntries()); + std::move(callback).Run(QuotaTableEntries()); return; } manager->DidDatabaseWork(success); - callback.Run(entries_); + std::move(callback).Run(entries_); } private: @@ -792,21 +793,20 @@ public: bool DumpOriginInfoTableOnDBThread(QuotaDatabase* database) { DCHECK(database); - return database->DumpOriginInfoTable( - base::Bind(&DumpOriginInfoTableHelper::AppendEntry, - base::Unretained(this))); + return database->DumpOriginInfoTable(base::BindRepeating( + &DumpOriginInfoTableHelper::AppendEntry, base::Unretained(this))); } void DidDumpOriginInfoTable(const base::WeakPtr<QuotaManager>& manager, - const DumpOriginInfoTableCallback& callback, + DumpOriginInfoTableCallback callback, bool success) { if (!manager) { // The operation was aborted. - callback.Run(OriginInfoTableEntries()); + std::move(callback).Run(OriginInfoTableEntries()); return; } manager->DidDatabaseWork(success); - callback.Run(entries_); + std::move(callback).Run(entries_); } private: @@ -855,29 +855,30 @@ settings_timestamp_ = base::TimeTicks::Now(); } -void QuotaManager::GetUsageInfo(const GetUsageInfoCallback& callback) { +void QuotaManager::GetUsageInfo(GetUsageInfoCallback callback) { LazyInitialize(); - GetUsageInfoTask* get_usage_info = new GetUsageInfoTask(this, callback); + GetUsageInfoTask* get_usage_info = + new GetUsageInfoTask(this, std::move(callback)); get_usage_info->Start(); } -void QuotaManager::GetUsageAndQuotaForWebApps( - const GURL& origin, - StorageType type, - const UsageAndQuotaCallback& callback) { +void QuotaManager::GetUsageAndQuotaForWebApps(const GURL& origin, + StorageType type, + UsageAndQuotaCallback callback) { GetUsageAndQuotaWithBreakdown( - origin, type, base::Bind(&DidGetUsageAndQuotaForWebApps, callback)); + origin, type, + base::BindOnce(&DidGetUsageAndQuotaForWebApps, std::move(callback))); } void QuotaManager::GetUsageAndQuotaWithBreakdown( const GURL& origin, StorageType type, - const UsageAndQuotaWithBreakdownCallback& callback) { + UsageAndQuotaWithBreakdownCallback callback) { DCHECK(origin == origin.GetOrigin()); if (!IsSupportedType(type) || (is_incognito_ && !IsSupportedIncognitoType(type))) { - callback.Run(blink::mojom::QuotaStatusCode::kErrorNotSupported, 0, 0, - base::flat_map<QuotaClient::ID, int64_t>()); + std::move(callback).Run(blink::mojom::QuotaStatusCode::kErrorNotSupported, + 0, 0, base::flat_map<QuotaClient::ID, int64_t>()); return; } LazyInitialize(); @@ -887,23 +888,23 @@ special_storage_policy_->IsStorageSessionOnly(origin); UsageAndQuotaHelper* helper = new UsageAndQuotaHelper( this, origin, type, IsStorageUnlimited(origin, type), is_session_only, - is_incognito_, callback); + is_incognito_, std::move(callback)); helper->Start(); } void QuotaManager::GetUsageAndQuota(const GURL& origin, StorageType type, - const UsageAndQuotaCallback& callback) { + UsageAndQuotaCallback callback) { DCHECK(origin == origin.GetOrigin()); if (IsStorageUnlimited(origin, type)) { // TODO(michaeln): This seems like a non-obvious odd behavior, probably for // apps/extensions, but it would be good to eliminate this special case. - callback.Run(blink::mojom::QuotaStatusCode::kOk, 0, kNoLimit); + std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk, 0, kNoLimit); return; } - GetUsageAndQuotaForWebApps(origin, type, callback); + GetUsageAndQuotaForWebApps(origin, type, std::move(callback)); } void QuotaManager::NotifyStorageAccessed( @@ -947,63 +948,63 @@ void QuotaManager::DeleteOriginData(const GURL& origin, StorageType type, int quota_client_mask, - const StatusCallback& callback) { - DeleteOriginDataInternal(origin, type, quota_client_mask, false, callback); + StatusCallback callback) { + DeleteOriginDataInternal(origin, type, quota_client_mask, false, + std::move(callback)); } void QuotaManager::DeleteHostData(const std::string& host, StorageType type, int quota_client_mask, - const StatusCallback& callback) { + StatusCallback callback) { LazyInitialize(); if (host.empty() || clients_.empty()) { - callback.Run(blink::mojom::QuotaStatusCode::kOk); + std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk); return; } - HostDataDeleter* deleter = - new HostDataDeleter(this, host, type, quota_client_mask, callback); + HostDataDeleter* deleter = new HostDataDeleter( + this, host, type, quota_client_mask, std::move(callback)); deleter->Start(); } void QuotaManager::GetPersistentHostQuota(const std::string& host, - const QuotaCallback& callback) { + QuotaCallback callback) { LazyInitialize(); if (host.empty()) { // This could happen if we are called on file:///. // TODO(kinuko) We may want to respect --allow-file-access-from-files // command line switch. - callback.Run(blink::mojom::QuotaStatusCode::kOk, 0); + std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk, 0); return; } - if (!persistent_host_quota_callbacks_.Add(host, callback)) + if (!persistent_host_quota_callbacks_.Add(host, std::move(callback))) return; int64_t* quota_ptr = new int64_t(0); PostTaskAndReplyWithResultForDBThread( FROM_HERE, - base::Bind(&GetPersistentHostQuotaOnDBThread, - host, - base::Unretained(quota_ptr)), - base::Bind(&QuotaManager::DidGetPersistentHostQuota, - weak_factory_.GetWeakPtr(), - host, - base::Owned(quota_ptr))); + base::BindOnce(&GetPersistentHostQuotaOnDBThread, host, + base::Unretained(quota_ptr)), + base::BindOnce(&QuotaManager::DidGetPersistentHostQuota, + weak_factory_.GetWeakPtr(), host, base::Owned(quota_ptr))); } void QuotaManager::SetPersistentHostQuota(const std::string& host, int64_t new_quota, - const QuotaCallback& callback) { + QuotaCallback callback) { LazyInitialize(); if (host.empty()) { // This could happen if we are called on file:///. - callback.Run(blink::mojom::QuotaStatusCode::kErrorNotSupported, 0); + std::move(callback).Run(blink::mojom::QuotaStatusCode::kErrorNotSupported, + 0); return; } if (new_quota < 0) { - callback.Run(blink::mojom::QuotaStatusCode::kErrorInvalidModification, -1); + std::move(callback).Run( + blink::mojom::QuotaStatusCode::kErrorInvalidModification, -1); return; } @@ -1011,60 +1012,58 @@ new_quota = std::min(new_quota, kPerHostPersistentQuotaLimit); if (db_disabled_) { - callback.Run(blink::mojom::QuotaStatusCode::kErrorInvalidAccess, -1); + std::move(callback).Run(blink::mojom::QuotaStatusCode::kErrorInvalidAccess, + -1); return; } int64_t* new_quota_ptr = new int64_t(new_quota); PostTaskAndReplyWithResultForDBThread( FROM_HERE, - base::Bind(&SetPersistentHostQuotaOnDBThread, - host, - base::Unretained(new_quota_ptr)), - base::Bind(&QuotaManager::DidSetPersistentHostQuota, - weak_factory_.GetWeakPtr(), - host, - callback, - base::Owned(new_quota_ptr))); + base::BindOnce(&SetPersistentHostQuotaOnDBThread, host, + base::Unretained(new_quota_ptr)), + base::BindOnce(&QuotaManager::DidSetPersistentHostQuota, + weak_factory_.GetWeakPtr(), host, std::move(callback), + base::Owned(new_quota_ptr))); } void QuotaManager::GetGlobalUsage(StorageType type, - const GlobalUsageCallback& callback) { + GlobalUsageCallback callback) { LazyInitialize(); DCHECK(GetUsageTracker(type)); - GetUsageTracker(type)->GetGlobalUsage(callback); + GetUsageTracker(type)->GetGlobalUsage(std::move(callback)); } void QuotaManager::GetHostUsage(const std::string& host, StorageType type, - const UsageCallback& callback) { + UsageCallback callback) { LazyInitialize(); DCHECK(GetUsageTracker(type)); - GetUsageTracker(type)->GetHostUsage(host, callback); + GetUsageTracker(type)->GetHostUsage(host, std::move(callback)); } void QuotaManager::GetHostUsage(const std::string& host, StorageType type, QuotaClient::ID client_id, - const UsageCallback& callback) { + UsageCallback callback) { LazyInitialize(); DCHECK(GetUsageTracker(type)); ClientUsageTracker* tracker = GetUsageTracker(type)->GetClientTracker(client_id); if (!tracker) { - callback.Run(0); + std::move(callback).Run(0); return; } - tracker->GetHostUsage(host, callback); + tracker->GetHostUsage(host, std::move(callback)); } void QuotaManager::GetHostUsageWithBreakdown( const std::string& host, StorageType type, - const UsageWithBreakdownCallback& callback) { + UsageWithBreakdownCallback callback) { LazyInitialize(); DCHECK(GetUsageTracker(type)); - GetUsageTracker(type)->GetHostUsageWithBreakdown(host, callback); + GetUsageTracker(type)->GetHostUsageWithBreakdown(host, std::move(callback)); } bool QuotaManager::IsTrackingHostUsage(StorageType type, @@ -1100,20 +1099,16 @@ void QuotaManager::GetOriginsModifiedSince(StorageType type, base::Time modified_since, - const GetOriginsCallback& callback) { + GetOriginsCallback callback) { LazyInitialize(); GetModifiedSinceHelper* helper = new GetModifiedSinceHelper; PostTaskAndReplyWithResultForDBThread( FROM_HERE, - base::Bind(&GetModifiedSinceHelper::GetModifiedSinceOnDBThread, - base::Unretained(helper), - type, - modified_since), - base::Bind(&GetModifiedSinceHelper::DidGetModifiedSince, - base::Owned(helper), - weak_factory_.GetWeakPtr(), - callback, - type)); + base::BindOnce(&GetModifiedSinceHelper::GetModifiedSinceOnDBThread, + base::Unretained(helper), type, modified_since), + base::BindOnce(&GetModifiedSinceHelper::DidGetModifiedSince, + base::Owned(helper), weak_factory_.GetWeakPtr(), + std::move(callback), type)); } bool QuotaManager::ResetUsageTracker(StorageType type) { @@ -1195,10 +1190,10 @@ base::PostTaskAndReplyWithResult( db_runner_.get(), FROM_HERE, - base::Bind(&QuotaDatabase::IsOriginDatabaseBootstrapped, - base::Unretained(database_.get())), - base::Bind(&QuotaManager::FinishLazyInitialize, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaDatabase::IsOriginDatabaseBootstrapped, + base::Unretained(database_.get())), + base::BindOnce(&QuotaManager::FinishLazyInitialize, + weak_factory_.GetWeakPtr())); } void QuotaManager::FinishLazyInitialize(bool is_database_bootstrapped) { @@ -1207,7 +1202,7 @@ } void QuotaManager::BootstrapDatabaseForEviction( - const GetOriginCallback& did_get_origin_callback, + GetOriginCallback did_get_origin_callback, int64_t usage, int64_t unlimited_usage) { // The usage cache should be fully populated now so we can @@ -1215,17 +1210,19 @@ std::set<GURL>* origins = new std::set<GURL>; temporary_usage_tracker_->GetCachedOrigins(origins); PostTaskAndReplyWithResultForDBThread( - FROM_HERE, base::Bind(&BootstrapDatabaseOnDBThread, base::Owned(origins)), - base::Bind(&QuotaManager::DidBootstrapDatabase, - weak_factory_.GetWeakPtr(), did_get_origin_callback)); + FROM_HERE, + base::BindOnce(&BootstrapDatabaseOnDBThread, base::Owned(origins)), + base::BindOnce(&QuotaManager::DidBootstrapDatabase, + weak_factory_.GetWeakPtr(), + std::move(did_get_origin_callback))); } void QuotaManager::DidBootstrapDatabase( - const GetOriginCallback& did_get_origin_callback, + GetOriginCallback did_get_origin_callback, bool success) { is_database_bootstrapped_ = success; DidDatabaseWork(success); - GetLRUOrigin(StorageType::kTemporary, did_get_origin_callback); + GetLRUOrigin(StorageType::kTemporary, std::move(did_get_origin_callback)); } void QuotaManager::RegisterClient(QuotaClient* client) { @@ -1272,9 +1269,9 @@ return; PostTaskAndReplyWithResultForDBThread( FROM_HERE, - base::Bind(&UpdateAccessTimeOnDBThread, origin, type, accessed_time), - base::Bind(&QuotaManager::DidDatabaseWork, - weak_factory_.GetWeakPtr())); + base::BindOnce(&UpdateAccessTimeOnDBThread, origin, type, accessed_time), + base::BindOnce(&QuotaManager::DidDatabaseWork, + weak_factory_.GetWeakPtr())); } void QuotaManager::NotifyStorageModifiedInternal(QuotaClient::ID client_id, @@ -1288,34 +1285,32 @@ PostTaskAndReplyWithResultForDBThread( FROM_HERE, - base::Bind(&UpdateModifiedTimeOnDBThread, origin, type, modified_time), - base::Bind(&QuotaManager::DidDatabaseWork, - weak_factory_.GetWeakPtr())); + base::BindOnce(&UpdateModifiedTimeOnDBThread, origin, type, + modified_time), + base::BindOnce(&QuotaManager::DidDatabaseWork, + weak_factory_.GetWeakPtr())); } -void QuotaManager::DumpQuotaTable(const DumpQuotaTableCallback& callback) { +void QuotaManager::DumpQuotaTable(DumpQuotaTableCallback callback) { DumpQuotaTableHelper* helper = new DumpQuotaTableHelper; PostTaskAndReplyWithResultForDBThread( FROM_HERE, - base::Bind(&DumpQuotaTableHelper::DumpQuotaTableOnDBThread, - base::Unretained(helper)), - base::Bind(&DumpQuotaTableHelper::DidDumpQuotaTable, - base::Owned(helper), - weak_factory_.GetWeakPtr(), - callback)); + base::BindOnce(&DumpQuotaTableHelper::DumpQuotaTableOnDBThread, + base::Unretained(helper)), + base::BindOnce(&DumpQuotaTableHelper::DidDumpQuotaTable, + base::Owned(helper), weak_factory_.GetWeakPtr(), + std::move(callback))); } -void QuotaManager::DumpOriginInfoTable( - const DumpOriginInfoTableCallback& callback) { +void QuotaManager::DumpOriginInfoTable(DumpOriginInfoTableCallback callback) { DumpOriginInfoTableHelper* helper = new DumpOriginInfoTableHelper; PostTaskAndReplyWithResultForDBThread( FROM_HERE, - base::Bind(&DumpOriginInfoTableHelper::DumpOriginInfoTableOnDBThread, - base::Unretained(helper)), - base::Bind(&DumpOriginInfoTableHelper::DidDumpOriginInfoTable, - base::Owned(helper), - weak_factory_.GetWeakPtr(), - callback)); + base::BindOnce(&DumpOriginInfoTableHelper::DumpOriginInfoTableOnDBThread, + base::Unretained(helper)), + base::BindOnce(&DumpOriginInfoTableHelper::DidDumpOriginInfoTable, + base::Owned(helper), weak_factory_.GetWeakPtr(), + std::move(callback))); } void QuotaManager::StartEviction() { @@ -1336,8 +1331,9 @@ PostTaskAndReplyWithResultForDBThread( FROM_HERE, - base::Bind(&DeleteOriginInfoOnDBThread, origin, type, is_eviction), - base::Bind(&QuotaManager::DidDatabaseWork, weak_factory_.GetWeakPtr())); + base::BindOnce(&DeleteOriginInfoOnDBThread, origin, type, is_eviction), + base::BindOnce(&QuotaManager::DidDatabaseWork, + weak_factory_.GetWeakPtr())); } void QuotaManager::DidOriginDataEvicted(blink::mojom::QuotaStatusCode status) { @@ -1350,25 +1346,24 @@ if (status != blink::mojom::QuotaStatusCode::kOk) origins_in_error_[eviction_context_.evicted_origin]++; - eviction_context_.evict_origin_data_callback.Run(status); - eviction_context_.evict_origin_data_callback.Reset(); + std::move(eviction_context_.evict_origin_data_callback).Run(status); } void QuotaManager::DeleteOriginDataInternal(const GURL& origin, StorageType type, int quota_client_mask, bool is_eviction, - const StatusCallback& callback) { + StatusCallback callback) { LazyInitialize(); if (origin.is_empty() || clients_.empty()) { - callback.Run(blink::mojom::QuotaStatusCode::kOk); + std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk); return; } DCHECK(origin == origin.GetOrigin()); OriginDataDeleter* deleter = new OriginDataDeleter( - this, origin, type, quota_client_mask, is_eviction, callback); + this, origin, type, quota_client_mask, is_eviction, std::move(callback)); deleter->Start(); } @@ -1376,8 +1371,8 @@ DCHECK(!is_incognito_); GetGlobalUsage( StorageType::kTemporary, - base::Bind(&QuotaManager::DidGetTemporaryGlobalUsageForHistogram, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManager::DidGetTemporaryGlobalUsageForHistogram, + weak_factory_.GetWeakPtr())); } void QuotaManager::DidGetTemporaryGlobalUsageForHistogram( @@ -1403,8 +1398,8 @@ GetGlobalUsage( StorageType::kPersistent, - base::Bind(&QuotaManager::DidGetPersistentGlobalUsageForHistogram, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManager::DidGetPersistentGlobalUsageForHistogram, + weak_factory_.GetWeakPtr())); } void QuotaManager::DidGetPersistentGlobalUsageForHistogram( @@ -1431,8 +1426,8 @@ // We DumpOriginInfoTable last to ensure the trackers caches are loaded. DumpOriginInfoTable( - base::Bind(&QuotaManager::DidDumpOriginInfoTableForHistogram, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManager::DidDumpOriginInfoTableForHistogram, + weak_factory_.GetWeakPtr())); } void QuotaManager::DidDumpOriginInfoTableForHistogram( @@ -1480,15 +1475,15 @@ return exceptions; } -void QuotaManager::DidGetEvictionOrigin(const GetOriginCallback& callback, +void QuotaManager::DidGetEvictionOrigin(GetOriginCallback callback, const GURL& origin) { // Make sure the returned origin is (still) not in the origin_in_use_ set // and has not been accessed since we posted the task. if (base::ContainsKey(origins_in_use_, origin) || base::ContainsKey(access_notified_origins_, origin)) { - callback.Run(GURL()); + std::move(callback).Run(GURL()); } else { - callback.Run(origin); + std::move(callback).Run(origin); } access_notified_origins_.clear(); @@ -1498,71 +1493,70 @@ void QuotaManager::GetEvictionOrigin(StorageType type, const std::set<GURL>& extra_exceptions, int64_t global_quota, - const GetOriginCallback& callback) { + GetOriginCallback callback) { LazyInitialize(); // This must not be called while there's an in-flight task. DCHECK(!is_getting_eviction_origin_); is_getting_eviction_origin_ = true; GetOriginCallback did_get_origin_callback = - base::Bind(&QuotaManager::DidGetEvictionOrigin, - weak_factory_.GetWeakPtr(), callback); + base::BindOnce(&QuotaManager::DidGetEvictionOrigin, + weak_factory_.GetWeakPtr(), std::move(callback)); if (!is_database_bootstrapped_ && !eviction_disabled_) { // Once bootstrapped, GetLRUOrigin will be called. - GetGlobalUsage( - StorageType::kTemporary, - base::Bind(&QuotaManager::BootstrapDatabaseForEviction, - weak_factory_.GetWeakPtr(), did_get_origin_callback)); + GetGlobalUsage(StorageType::kTemporary, + base::BindOnce(&QuotaManager::BootstrapDatabaseForEviction, + weak_factory_.GetWeakPtr(), + std::move(did_get_origin_callback))); return; } - GetLRUOrigin(type, did_get_origin_callback); + GetLRUOrigin(type, std::move(did_get_origin_callback)); } void QuotaManager::EvictOriginData(const GURL& origin, StorageType type, - const StatusCallback& callback) { + StatusCallback callback) { DCHECK(io_thread_->BelongsToCurrentThread()); DCHECK_EQ(type, StorageType::kTemporary); eviction_context_.evicted_origin = origin; eviction_context_.evicted_type = type; - eviction_context_.evict_origin_data_callback = callback; + eviction_context_.evict_origin_data_callback = std::move(callback); DeleteOriginDataInternal(origin, type, QuotaClient::kAllClientsMask, true, - base::Bind(&QuotaManager::DidOriginDataEvicted, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManager::DidOriginDataEvicted, + weak_factory_.GetWeakPtr())); } -void QuotaManager::GetEvictionRoundInfo( - const EvictionRoundInfoCallback& callback) { +void QuotaManager::GetEvictionRoundInfo(EvictionRoundInfoCallback callback) { DCHECK(io_thread_->BelongsToCurrentThread()); LazyInitialize(); - EvictionRoundInfoHelper* helper = new EvictionRoundInfoHelper(this, callback); + EvictionRoundInfoHelper* helper = + new EvictionRoundInfoHelper(this, std::move(callback)); helper->Start(); } -void QuotaManager::GetLRUOrigin(StorageType type, - const GetOriginCallback& callback) { +void QuotaManager::GetLRUOrigin(StorageType type, GetOriginCallback callback) { LazyInitialize(); // This must not be called while there's an in-flight task. DCHECK(lru_origin_callback_.is_null()); - lru_origin_callback_ = callback; + lru_origin_callback_ = std::move(callback); if (db_disabled_) { - lru_origin_callback_.Run(GURL()); - lru_origin_callback_.Reset(); + std::move(lru_origin_callback_).Run(GURL()); return; } GURL* url = new GURL; PostTaskAndReplyWithResultForDBThread( - FROM_HERE, base::Bind(&GetLRUOriginOnDBThread, type, - GetEvictionOriginExceptions(std::set<GURL>()), - base::RetainedRef(special_storage_policy_), - base::Unretained(url)), - base::Bind(&QuotaManager::DidGetLRUOrigin, weak_factory_.GetWeakPtr(), - base::Owned(url))); + FROM_HERE, + base::BindOnce(&GetLRUOriginOnDBThread, type, + GetEvictionOriginExceptions(std::set<GURL>()), + base::RetainedRef(special_storage_policy_), + base::Unretained(url)), + base::BindOnce(&QuotaManager::DidGetLRUOrigin, weak_factory_.GetWeakPtr(), + base::Owned(url))); } void QuotaManager::DidGetPersistentHostQuota(const std::string& host, @@ -1575,21 +1569,21 @@ } void QuotaManager::DidSetPersistentHostQuota(const std::string& host, - const QuotaCallback& callback, + QuotaCallback callback, const int64_t* new_quota, bool success) { DidDatabaseWork(success); - callback.Run(success ? blink::mojom::QuotaStatusCode::kOk - : blink::mojom::QuotaStatusCode::kErrorInvalidAccess, - *new_quota); + std::move(callback).Run( + success ? blink::mojom::QuotaStatusCode::kOk + : blink::mojom::QuotaStatusCode::kErrorInvalidAccess, + *new_quota); } void QuotaManager::DidGetLRUOrigin(const GURL* origin, bool success) { DidDatabaseWork(success); - lru_origin_callback_.Run(*origin); - lru_origin_callback_.Reset(); + std::move(lru_origin_callback_).Run(*origin); } namespace { @@ -1601,14 +1595,14 @@ } } // namespace -void QuotaManager::GetQuotaSettings(const QuotaSettingsCallback& callback) { +void QuotaManager::GetQuotaSettings(QuotaSettingsCallback callback) { if (base::TimeTicks::Now() - settings_timestamp_ < settings_.refresh_interval) { - callback.Run(settings_); + std::move(callback).Run(settings_); return; } - if (!settings_callbacks_.Add(callback)) + if (!settings_callbacks_.Add(std::move(callback))) return; // We invoke our clients GetQuotaSettingsFunc on the @@ -1639,21 +1633,21 @@ << "No storage quota provided in QuotaSettings."; } -void QuotaManager::GetStorageCapacity(const StorageCapacityCallback& callback) { - if (!storage_capacity_callbacks_.Add(callback)) +void QuotaManager::GetStorageCapacity(StorageCapacityCallback callback) { + if (!storage_capacity_callbacks_.Add(std::move(callback))) return; if (is_incognito_) { GetQuotaSettings( - base::Bind(&QuotaManager::ContinueIncognitoGetStorageCapacity, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManager::ContinueIncognitoGetStorageCapacity, + weak_factory_.GetWeakPtr())); return; } base::PostTaskAndReplyWithResult( db_runner_.get(), FROM_HERE, - base::Bind(&QuotaManager::CallGetVolumeInfo, get_volume_info_fn_, - profile_path_), - base::Bind(&QuotaManager::DidGetStorageCapacity, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManager::CallGetVolumeInfo, get_volume_info_fn_, + profile_path_), + base::BindOnce(&QuotaManager::DidGetStorageCapacity, + weak_factory_.GetWeakPtr())); } void QuotaManager::ContinueIncognitoGetStorageCapacity( @@ -1686,14 +1680,14 @@ void QuotaManager::PostTaskAndReplyWithResultForDBThread( const base::Location& from_here, - base::Callback<bool(QuotaDatabase*)> task, - base::Callback<void(bool)> reply) { + base::OnceCallback<bool(QuotaDatabase*)> task, + base::OnceCallback<void(bool)> reply) { // Deleting manager will post another task to DB sequence to delete // |database_|, therefore we can be sure that database_ is alive when this // task runs. base::PostTaskAndReplyWithResult( db_runner_.get(), from_here, - base::Bind(std::move(task), base::Unretained(database_.get())), + base::BindOnce(std::move(task), base::Unretained(database_.get())), std::move(reply)); }
diff --git a/storage/browser/quota/quota_manager.h b/storage/browser/quota/quota_manager.h index 04fd7c5..9735d89 100644 --- a/storage/browser/quota/quota_manager.h +++ b/storage/browser/quota/quota_manager.h
@@ -67,29 +67,28 @@ class STORAGE_EXPORT QuotaEvictionHandler { public: using EvictionRoundInfoCallback = - base::Callback<void(blink::mojom::QuotaStatusCode status, - const QuotaSettings& settings, - int64_t available_space, - int64_t total_space, - int64_t global_usage, - bool global_usage_is_complete)>; + base::OnceCallback<void(blink::mojom::QuotaStatusCode status, + const QuotaSettings& settings, + int64_t available_space, + int64_t total_space, + int64_t global_usage, + bool global_usage_is_complete)>; // Called at the beginning of an eviction round to gather the info about // the current settings, capacity, and usage. - virtual void GetEvictionRoundInfo( - const EvictionRoundInfoCallback& callback) = 0; + virtual void GetEvictionRoundInfo(EvictionRoundInfoCallback callback) = 0; // Returns next origin to evict. It might return an empty GURL when there are // no evictable origins. virtual void GetEvictionOrigin(blink::mojom::StorageType type, const std::set<GURL>& extra_exceptions, int64_t global_quota, - const GetOriginCallback& callback) = 0; + GetOriginCallback callback) = 0; // Called to evict an origin. virtual void EvictOriginData(const GURL& origin, blink::mojom::StorageType type, - const StatusCallback& callback) = 0; + StatusCallback callback) = 0; protected: virtual ~QuotaEvictionHandler() {} @@ -114,16 +113,15 @@ public QuotaEvictionHandler, public base::RefCountedThreadSafe<QuotaManager, QuotaManagerDeleter> { public: - typedef base::Callback<void(blink::mojom::QuotaStatusCode, + using UsageAndQuotaCallback = + base::OnceCallback<void(blink::mojom::QuotaStatusCode, int64_t /* usage */, - int64_t /* quota */)> - UsageAndQuotaCallback; - typedef base::Callback<void( + int64_t /* quota */)>; + using UsageAndQuotaWithBreakdownCallback = base::OnceCallback<void( blink::mojom::QuotaStatusCode, int64_t /* usage */, int64_t /* quota */, - base::flat_map<QuotaClient::ID, int64_t> /* usage breakdown */)> - UsageAndQuotaWithBreakdownCallback; + base::flat_map<QuotaClient::ID, int64_t> /* usage breakdown */)>; static const int64_t kNoLimit; @@ -141,21 +139,20 @@ QuotaManagerProxy* proxy() { return proxy_.get(); } // Called by clients or webapps. Returns usage per host. - void GetUsageInfo(const GetUsageInfoCallback& callback); + void GetUsageInfo(GetUsageInfoCallback callback); // Called by Web Apps. // This method is declared as virtual to allow test code to override it. - virtual void GetUsageAndQuotaForWebApps( - const GURL& origin, - blink::mojom::StorageType type, - const UsageAndQuotaCallback& callback); + virtual void GetUsageAndQuotaForWebApps(const GURL& origin, + blink::mojom::StorageType type, + UsageAndQuotaCallback callback); // Called by DevTools. // This method is declared as virtual to allow test code to override it. virtual void GetUsageAndQuotaWithBreakdown( const GURL& origin, blink::mojom::StorageType type, - const UsageAndQuotaWithBreakdownCallback& callback); + UsageAndQuotaWithBreakdownCallback callback); // Called by StorageClients. // This method is declared as virtual to allow test code to override it. @@ -165,7 +162,7 @@ // Do not call this method for apps/user-facing code. virtual void GetUsageAndQuota(const GURL& origin, blink::mojom::StorageType type, - const UsageAndQuotaCallback& callback); + UsageAndQuotaCallback callback); // Called by clients via proxy. // Client storage should call this method when storage is accessed. @@ -206,30 +203,29 @@ virtual void DeleteOriginData(const GURL& origin, blink::mojom::StorageType type, int quota_client_mask, - const StatusCallback& callback); + StatusCallback callback); void DeleteHostData(const std::string& host, blink::mojom::StorageType type, int quota_client_mask, - const StatusCallback& callback); + StatusCallback callback); // Called by UI and internal modules. - void GetPersistentHostQuota(const std::string& host, - const QuotaCallback& callback); + void GetPersistentHostQuota(const std::string& host, QuotaCallback callback); void SetPersistentHostQuota(const std::string& host, int64_t new_quota, - const QuotaCallback& callback); + QuotaCallback callback); void GetGlobalUsage(blink::mojom::StorageType type, - const GlobalUsageCallback& callback); + GlobalUsageCallback callback); void GetHostUsage(const std::string& host, blink::mojom::StorageType type, - const UsageCallback& callback); + UsageCallback callback); void GetHostUsage(const std::string& host, blink::mojom::StorageType type, QuotaClient::ID client_id, - const UsageCallback& callback); + UsageCallback callback); void GetHostUsageWithBreakdown(const std::string& host, blink::mojom::StorageType type, - const UsageWithBreakdownCallback& callback); + UsageWithBreakdownCallback callback); bool IsTrackingHostUsage(blink::mojom::StorageType type, QuotaClient::ID client_id) const; @@ -241,7 +237,7 @@ virtual void GetOriginsModifiedSince(blink::mojom::StorageType type, base::Time modified_since, - const GetOriginsCallback& callback); + GetOriginsCallback callback); bool ResetUsageTracker(blink::mojom::StorageType type); @@ -287,12 +283,12 @@ class DumpQuotaTableHelper; class DumpOriginInfoTableHelper; - typedef QuotaDatabase::QuotaTableEntry QuotaTableEntry; - typedef QuotaDatabase::OriginInfoTableEntry OriginInfoTableEntry; - typedef std::vector<QuotaTableEntry> QuotaTableEntries; - typedef std::vector<OriginInfoTableEntry> OriginInfoTableEntries; + using QuotaTableEntry = QuotaDatabase::QuotaTableEntry; + using OriginInfoTableEntry = QuotaDatabase::OriginInfoTableEntry; + using QuotaTableEntries = std::vector<QuotaTableEntry>; + using OriginInfoTableEntries = std::vector<OriginInfoTableEntry>; - using QuotaSettingsCallback = base::Callback<void(const QuotaSettings&)>; + using QuotaSettingsCallback = base::OnceCallback<void(const QuotaSettings&)>; // Function pointer type used to store the function which returns // information about the volume containing the given FilePath. @@ -300,22 +296,21 @@ using GetVolumeInfoFn = std::tuple<int64_t, int64_t> (*)(const base::FilePath&); - typedef base::Callback<void(const QuotaTableEntries&)> - DumpQuotaTableCallback; - typedef base::Callback<void(const OriginInfoTableEntries&)> - DumpOriginInfoTableCallback; + using DumpQuotaTableCallback = + base::OnceCallback<void(const QuotaTableEntries&)>; + using DumpOriginInfoTableCallback = + base::OnceCallback<void(const OriginInfoTableEntries&)>; - typedef CallbackQueue<base::Closure> ClosureQueue; - typedef CallbackQueueMap<QuotaCallback, - std::string, - blink::mojom::QuotaStatusCode, - int64_t> - HostQuotaCallbackMap; + using ClosureQueue = CallbackQueue<base::OnceClosure>; + using HostQuotaCallbackMap = CallbackQueueMap<QuotaCallback, + std::string, + blink::mojom::QuotaStatusCode, + int64_t>; using QuotaSettingsCallbackQueue = CallbackQueue<QuotaSettingsCallback, const QuotaSettings&>; // The values returned total_space, available_space. - using StorageCapacityCallback = base::Callback<void(int64_t, int64_t)>; + using StorageCapacityCallback = base::OnceCallback<void(int64_t, int64_t)>; using StorageCapacityCallbackQueue = CallbackQueue<StorageCapacityCallback, int64_t, int64_t>; @@ -333,11 +328,10 @@ // manager by RegisterStorage. void LazyInitialize(); void FinishLazyInitialize(bool is_database_bootstraped); - void BootstrapDatabaseForEviction( - const GetOriginCallback& did_get_origin_callback, - int64_t unused_usage, - int64_t unused_unlimited_usage); - void DidBootstrapDatabase(const GetOriginCallback& did_get_origin_callback, + void BootstrapDatabaseForEviction(GetOriginCallback did_get_origin_callback, + int64_t unused_usage, + int64_t unused_unlimited_usage); + void DidBootstrapDatabase(GetOriginCallback did_get_origin_callback, bool success); // Called by clients via proxy. @@ -363,14 +357,14 @@ int64_t delta, base::Time modified_time); - void DumpQuotaTable(const DumpQuotaTableCallback& callback); - void DumpOriginInfoTable(const DumpOriginInfoTableCallback& callback); + void DumpQuotaTable(DumpQuotaTableCallback callback); + void DumpOriginInfoTable(DumpOriginInfoTableCallback callback); void DeleteOriginDataInternal(const GURL& origin, blink::mojom::StorageType type, int quota_client_mask, bool is_eviction, - const StatusCallback& callback); + StatusCallback callback); // Methods for eviction logic. void StartEviction(); @@ -390,35 +384,33 @@ std::set<GURL> GetEvictionOriginExceptions( const std::set<GURL>& extra_exceptions); - void DidGetEvictionOrigin(const GetOriginCallback& callback, - const GURL& origin); + void DidGetEvictionOrigin(GetOriginCallback callback, const GURL& origin); // QuotaEvictionHandler. void GetEvictionOrigin(blink::mojom::StorageType type, const std::set<GURL>& extra_exceptions, int64_t global_quota, - const GetOriginCallback& callback) override; + GetOriginCallback callback) override; void EvictOriginData(const GURL& origin, blink::mojom::StorageType type, - const StatusCallback& callback) override; - void GetEvictionRoundInfo(const EvictionRoundInfoCallback& callback) override; + StatusCallback callback) override; + void GetEvictionRoundInfo(EvictionRoundInfoCallback callback) override; - void GetLRUOrigin(blink::mojom::StorageType type, - const GetOriginCallback& callback); + void GetLRUOrigin(blink::mojom::StorageType type, GetOriginCallback callback); void DidGetPersistentHostQuota(const std::string& host, const int64_t* quota, bool success); void DidSetPersistentHostQuota(const std::string& host, - const QuotaCallback& callback, + QuotaCallback callback, const int64_t* new_quota, bool success); void DidGetLRUOrigin(const GURL* origin, bool success); - void GetQuotaSettings(const QuotaSettingsCallback& callback); + void GetQuotaSettings(QuotaSettingsCallback callback); void DidGetSettings(base::TimeTicks start_ticks, base::Optional<QuotaSettings> settings); - void GetStorageCapacity(const StorageCapacityCallback& callback); + void GetStorageCapacity(StorageCapacityCallback callback); void ContinueIncognitoGetStorageCapacity(const QuotaSettings& settings); void DidGetStorageCapacity( const std::tuple<int64_t, int64_t>& total_and_available); @@ -429,8 +421,8 @@ void PostTaskAndReplyWithResultForDBThread( const base::Location& from_here, - base::Callback<bool(QuotaDatabase*)> task, - base::Callback<void(bool)> reply); + base::OnceCallback<bool(QuotaDatabase*)> task, + base::OnceCallback<void(bool)> reply); static std::tuple<int64_t, int64_t> CallGetVolumeInfo( GetVolumeInfoFn get_volume_info_fn,
diff --git a/storage/browser/quota/quota_manager_proxy.cc b/storage/browser/quota/quota_manager_proxy.cc index 1644ef4..82d2d62 100644 --- a/storage/browser/quota/quota_manager_proxy.cc +++ b/storage/browser/quota/quota_manager_proxy.cc
@@ -19,23 +19,22 @@ namespace { -void DidGetUsageAndQuota( - base::SequencedTaskRunner* original_task_runner, - const QuotaManagerProxy::UsageAndQuotaCallback& callback, - blink::mojom::QuotaStatusCode status, - int64_t usage, - int64_t quota) { +void DidGetUsageAndQuota(base::SequencedTaskRunner* original_task_runner, + QuotaManagerProxy::UsageAndQuotaCallback callback, + blink::mojom::QuotaStatusCode status, + int64_t usage, + int64_t quota) { if (!original_task_runner->RunsTasksInCurrentSequence()) { original_task_runner->PostTask( FROM_HERE, base::BindOnce(&DidGetUsageAndQuota, base::RetainedRef(original_task_runner), - callback, status, usage, quota)); + std::move(callback), status, usage, quota)); return; } // crbug.com/349708 TRACE_EVENT0("io", "QuotaManagerProxy DidGetUsageAndQuota"); - callback.Run(status, usage, quota); + std::move(callback).Run(status, usage, quota); } } // namespace @@ -124,16 +123,16 @@ base::SequencedTaskRunner* original_task_runner, const url::Origin& origin, blink::mojom::StorageType type, - const UsageAndQuotaCallback& callback) { + UsageAndQuotaCallback callback) { if (!io_thread_->BelongsToCurrentThread()) { io_thread_->PostTask( FROM_HERE, base::BindOnce(&QuotaManagerProxy::GetUsageAndQuota, this, base::RetainedRef(original_task_runner), - origin, type, callback)); + origin, type, std::move(callback))); return; } if (!manager_) { - DidGetUsageAndQuota(original_task_runner, callback, + DidGetUsageAndQuota(original_task_runner, std::move(callback), blink::mojom::QuotaStatusCode::kErrorAbort, 0, 0); return; } @@ -143,8 +142,9 @@ manager_->GetUsageAndQuota( origin.GetURL(), type, - base::Bind(&DidGetUsageAndQuota, base::RetainedRef(original_task_runner), - callback)); + base::BindOnce(&DidGetUsageAndQuota, + base::RetainedRef(original_task_runner), + std::move(callback))); } QuotaManager* QuotaManagerProxy::quota_manager() const {
diff --git a/storage/browser/quota/quota_manager_proxy.h b/storage/browser/quota/quota_manager_proxy.h index cdc6f4f2..b122271 100644 --- a/storage/browser/quota/quota_manager_proxy.h +++ b/storage/browser/quota/quota_manager_proxy.h
@@ -36,7 +36,7 @@ class STORAGE_EXPORT QuotaManagerProxy : public base::RefCountedThreadSafe<QuotaManagerProxy> { public: - typedef QuotaManager::UsageAndQuotaCallback UsageAndQuotaCallback; + using UsageAndQuotaCallback = QuotaManager::UsageAndQuotaCallback; virtual void RegisterClient(QuotaClient* client); virtual void NotifyStorageAccessed(QuotaClient::ID client_id, @@ -56,7 +56,7 @@ virtual void GetUsageAndQuota(base::SequencedTaskRunner* original_task_runner, const url::Origin& origin, blink::mojom::StorageType type, - const UsageAndQuotaCallback& callback); + UsageAndQuotaCallback callback); // This method may only be called on the IO thread. // It may return NULL if the manager has already been deleted.
diff --git a/storage/browser/quota/quota_manager_unittest.cc b/storage/browser/quota/quota_manager_unittest.cc index 1dbee400..b1b60d7 100644 --- a/storage/browser/quota/quota_manager_unittest.cc +++ b/storage/browser/quota/quota_manager_unittest.cc
@@ -132,9 +132,8 @@ void GetUsageInfo() { usage_info_.clear(); - quota_manager_->GetUsageInfo( - base::Bind(&QuotaManagerTest::DidGetUsageInfo, - weak_factory_.GetWeakPtr())); + quota_manager_->GetUsageInfo(base::BindOnce( + &QuotaManagerTest::DidGetUsageInfo, weak_factory_.GetWeakPtr())); } void GetUsageAndQuotaForWebApps(const GURL& origin, @@ -143,8 +142,9 @@ usage_ = -1; quota_ = -1; quota_manager_->GetUsageAndQuotaForWebApps( - origin, type, base::Bind(&QuotaManagerTest::DidGetUsageAndQuota, - weak_factory_.GetWeakPtr())); + origin, type, + base::BindOnce(&QuotaManagerTest::DidGetUsageAndQuota, + weak_factory_.GetWeakPtr())); } void GetUsageAndQuotaWithBreakdown(const GURL& origin, StorageType type) { @@ -154,8 +154,8 @@ usage_breakdown_.clear(); quota_manager_->GetUsageAndQuotaWithBreakdown( origin, type, - base::Bind(&QuotaManagerTest::DidGetUsageAndQuotaWithBreakdown, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManagerTest::DidGetUsageAndQuotaWithBreakdown, + weak_factory_.GetWeakPtr())); } void GetUsageAndQuotaForStorageClient(const GURL& origin, @@ -164,8 +164,9 @@ usage_ = -1; quota_ = -1; quota_manager_->GetUsageAndQuota( - origin, type, base::Bind(&QuotaManagerTest::DidGetUsageAndQuota, - weak_factory_.GetWeakPtr())); + origin, type, + base::BindOnce(&QuotaManagerTest::DidGetUsageAndQuota, + weak_factory_.GetWeakPtr())); } void SetQuotaSettings(int64_t pool_size, @@ -185,9 +186,8 @@ quota_status_ = QuotaStatusCode::kUnknown; quota_ = -1; quota_manager_->GetPersistentHostQuota( - host, - base::Bind(&QuotaManagerTest::DidGetHostQuota, - weak_factory_.GetWeakPtr())); + host, base::BindOnce(&QuotaManagerTest::DidGetHostQuota, + weak_factory_.GetWeakPtr())); } void SetPersistentHostQuota(const std::string& host, int64_t new_quota) { @@ -195,40 +195,39 @@ quota_ = -1; quota_manager_->SetPersistentHostQuota( host, new_quota, - base::Bind(&QuotaManagerTest::DidGetHostQuota, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManagerTest::DidGetHostQuota, + weak_factory_.GetWeakPtr())); } void GetGlobalUsage(StorageType type) { usage_ = -1; unlimited_usage_ = -1; quota_manager_->GetGlobalUsage( - type, - base::Bind(&QuotaManagerTest::DidGetGlobalUsage, - weak_factory_.GetWeakPtr())); + type, base::BindOnce(&QuotaManagerTest::DidGetGlobalUsage, + weak_factory_.GetWeakPtr())); } void GetHostUsage(const std::string& host, StorageType type) { usage_ = -1; quota_manager_->GetHostUsage( host, type, - base::Bind(&QuotaManagerTest::DidGetHostUsage, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManagerTest::DidGetHostUsage, + weak_factory_.GetWeakPtr())); } void GetHostUsageBreakdown(const std::string& host, StorageType type) { usage_ = -1; quota_manager_->GetHostUsageWithBreakdown( host, type, - base::Bind(&QuotaManagerTest::DidGetHostUsageBreakdown, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManagerTest::DidGetHostUsageBreakdown, + weak_factory_.GetWeakPtr())); } void RunAdditionalUsageAndQuotaTask(const GURL& origin, StorageType type) { quota_manager_->GetUsageAndQuota( origin, type, - base::Bind(&QuotaManagerTest::DidGetUsageAndQuotaAdditional, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManagerTest::DidGetUsageAndQuotaAdditional, + weak_factory_.GetWeakPtr())); } void DeleteClientOriginData(QuotaClient* client, @@ -237,8 +236,8 @@ DCHECK(client); quota_status_ = QuotaStatusCode::kUnknown; client->DeleteOriginData(url::Origin::Create(origin), type, - base::Bind(&QuotaManagerTest::StatusCallback, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManagerTest::StatusCallback, + weak_factory_.GetWeakPtr())); } void EvictOriginData(const GURL& origin, @@ -246,8 +245,8 @@ quota_status_ = QuotaStatusCode::kUnknown; quota_manager_->EvictOriginData( origin, type, - base::Bind(&QuotaManagerTest::StatusCallback, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManagerTest::StatusCallback, + weak_factory_.GetWeakPtr())); } void DeleteOriginData(const GURL& origin, @@ -256,8 +255,8 @@ quota_status_ = QuotaStatusCode::kUnknown; quota_manager_->DeleteOriginData( origin, type, quota_client_mask, - base::Bind(&QuotaManagerTest::StatusCallback, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManagerTest::StatusCallback, + weak_factory_.GetWeakPtr())); } void DeleteHostData(const std::string& host, @@ -266,14 +265,14 @@ quota_status_ = QuotaStatusCode::kUnknown; quota_manager_->DeleteHostData( host, type, quota_client_mask, - base::Bind(&QuotaManagerTest::StatusCallback, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManagerTest::StatusCallback, + weak_factory_.GetWeakPtr())); } void GetStorageCapacity() { available_space_ = -1; total_space_ = -1; - quota_manager_->GetStorageCapacity(base::Bind( + quota_manager_->GetStorageCapacity(base::BindOnce( &QuotaManagerTest::DidGetStorageCapacity, weak_factory_.GetWeakPtr())); } @@ -284,8 +283,8 @@ total_space_ = -1; usage_ = -1; quota_manager_->GetEvictionRoundInfo( - base::Bind(&QuotaManagerTest::DidGetEvictionRoundInfo, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManagerTest::DidGetEvictionRoundInfo, + weak_factory_.GetWeakPtr())); } void GetCachedOrigins(StorageType type, std::set<GURL>* origins) { @@ -312,8 +311,8 @@ // policy. quota_manager_->GetEvictionOrigin( type, std::set<GURL>(), 0, - base::Bind(&QuotaManagerTest::DidGetEvictionOrigin, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManagerTest::DidGetEvictionOrigin, + weak_factory_.GetWeakPtr())); } void NotifyOriginInUse(const GURL& origin) { @@ -329,22 +328,20 @@ modified_origins_type_ = StorageType::kUnknown; quota_manager_->GetOriginsModifiedSince( type, modified_since, - base::Bind(&QuotaManagerTest::DidGetModifiedOrigins, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaManagerTest::DidGetModifiedOrigins, + weak_factory_.GetWeakPtr())); } void DumpQuotaTable() { quota_entries_.clear(); - quota_manager_->DumpQuotaTable( - base::Bind(&QuotaManagerTest::DidDumpQuotaTable, - weak_factory_.GetWeakPtr())); + quota_manager_->DumpQuotaTable(base::BindOnce( + &QuotaManagerTest::DidDumpQuotaTable, weak_factory_.GetWeakPtr())); } void DumpOriginInfoTable() { origin_info_entries_.clear(); - quota_manager_->DumpOriginInfoTable( - base::Bind(&QuotaManagerTest::DidDumpOriginInfoTable, - weak_factory_.GetWeakPtr())); + quota_manager_->DumpOriginInfoTable(base::BindOnce( + &QuotaManagerTest::DidDumpOriginInfoTable, weak_factory_.GetWeakPtr())); } void DidGetUsageInfo(const UsageInfoEntries& entries) {
diff --git a/storage/browser/quota/quota_temporary_storage_evictor.cc b/storage/browser/quota/quota_temporary_storage_evictor.cc index 6b0c9f3..a0d3017c 100644 --- a/storage/browser/quota/quota_temporary_storage_evictor.cc +++ b/storage/browser/quota/quota_temporary_storage_evictor.cc
@@ -160,8 +160,8 @@ void QuotaTemporaryStorageEvictor::ConsiderEviction() { OnEvictionRoundStarted(); quota_eviction_handler_->GetEvictionRoundInfo( - base::Bind(&QuotaTemporaryStorageEvictor::OnGotEvictionRoundInfo, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaTemporaryStorageEvictor::OnGotEvictionRoundInfo, + weak_factory_.GetWeakPtr())); } void QuotaTemporaryStorageEvictor::OnGotEvictionRoundInfo( @@ -211,8 +211,8 @@ quota_eviction_handler_->GetEvictionOrigin( blink::mojom::StorageType::kTemporary, in_progress_eviction_origins_, settings.pool_size, - base::Bind(&QuotaTemporaryStorageEvictor::OnGotEvictionOrigin, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaTemporaryStorageEvictor::OnGotEvictionOrigin, + weak_factory_.GetWeakPtr())); return; } @@ -242,8 +242,8 @@ quota_eviction_handler_->EvictOriginData( origin, blink::mojom::StorageType::kTemporary, - base::Bind(&QuotaTemporaryStorageEvictor::OnEvictionComplete, - weak_factory_.GetWeakPtr())); + base::BindOnce(&QuotaTemporaryStorageEvictor::OnEvictionComplete, + weak_factory_.GetWeakPtr())); } void QuotaTemporaryStorageEvictor::OnEvictionComplete(
diff --git a/storage/browser/quota/quota_temporary_storage_evictor_unittest.cc b/storage/browser/quota/quota_temporary_storage_evictor_unittest.cc index 7ba8782..75353de 100644 --- a/storage/browser/quota/quota_temporary_storage_evictor_unittest.cc +++ b/storage/browser/quota/quota_temporary_storage_evictor_unittest.cc
@@ -38,38 +38,39 @@ void EvictOriginData(const GURL& origin, StorageType type, - const storage::StatusCallback& callback) override { + storage::StatusCallback callback) override { if (error_on_evict_origin_data_) { - callback.Run(blink::mojom::QuotaStatusCode::kErrorInvalidModification); + std::move(callback).Run( + blink::mojom::QuotaStatusCode::kErrorInvalidModification); return; } int64_t origin_usage = EnsureOriginRemoved(origin); if (origin_usage >= 0) available_space_ += origin_usage; - callback.Run(blink::mojom::QuotaStatusCode::kOk); + std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk); } - void GetEvictionRoundInfo( - const EvictionRoundInfoCallback& callback) override { + void GetEvictionRoundInfo(EvictionRoundInfoCallback callback) override { if (error_on_get_usage_and_quota_) { - callback.Run(blink::mojom::QuotaStatusCode::kErrorAbort, - storage::QuotaSettings(), 0, 0, 0, false); + std::move(callback).Run(blink::mojom::QuotaStatusCode::kErrorAbort, + storage::QuotaSettings(), 0, 0, 0, false); return; } if (!task_for_get_usage_and_quota_.is_null()) task_for_get_usage_and_quota_.Run(); - callback.Run(blink::mojom::QuotaStatusCode::kOk, settings_, - available_space_, available_space_ * 2, GetUsage(), true); + std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk, settings_, + available_space_, available_space_ * 2, GetUsage(), + true); } void GetEvictionOrigin(StorageType type, const std::set<GURL>& exceptions, int64_t global_quota, - const storage::GetOriginCallback& callback) override { + storage::GetOriginCallback callback) override { if (origin_order_.empty()) - callback.Run(GURL()); + std::move(callback).Run(GURL()); else - callback.Run(GURL(origin_order_.front())); + std::move(callback).Run(GURL(origin_order_.front())); } int64_t GetUsage() const { @@ -91,8 +92,8 @@ void set_available_space(int64_t available_space) { available_space_ = available_space; } - void set_task_for_get_usage_and_quota(const base::Closure& task) { - task_for_get_usage_and_quota_= task; + void set_task_for_get_usage_and_quota(base::RepeatingClosure task) { + task_for_get_usage_and_quota_ = std::move(task); } void set_error_on_evict_origin_data(bool error_on_evict_origin_data) { error_on_evict_origin_data_ = error_on_evict_origin_data; @@ -272,11 +273,12 @@ quota_eviction_handler()->SetPoolSize(1000); quota_eviction_handler()->set_available_space(1000000000); quota_eviction_handler()->set_task_for_get_usage_and_quota( - base::Bind(&QuotaTemporaryStorageEvictorTest::TaskForRepeatedEvictionTest, - weak_factory_.GetWeakPtr(), - std::make_pair(GURL("http://www.e.com"), e_size), GURL(), - initial_total_size - d_size, - initial_total_size - d_size + e_size - c_size)); + base::BindRepeating( + &QuotaTemporaryStorageEvictorTest::TaskForRepeatedEvictionTest, + weak_factory_.GetWeakPtr(), + std::make_pair(GURL("http://www.e.com"), e_size), GURL(), + initial_total_size - d_size, + initial_total_size - d_size + e_size - c_size)); EXPECT_EQ(initial_total_size, quota_eviction_handler()->GetUsage()); temporary_storage_evictor()->Start(); base::RunLoop().RunUntilIdle(); @@ -305,9 +307,10 @@ quota_eviction_handler()->SetPoolSize(1000); quota_eviction_handler()->set_available_space(1000000000); quota_eviction_handler()->set_task_for_get_usage_and_quota( - base::Bind(&QuotaTemporaryStorageEvictorTest::TaskForRepeatedEvictionTest, - weak_factory_.GetWeakPtr(), std::make_pair(GURL(), 0), GURL(), - initial_total_size - d_size, initial_total_size - d_size)); + base::BindRepeating( + &QuotaTemporaryStorageEvictorTest::TaskForRepeatedEvictionTest, + weak_factory_.GetWeakPtr(), std::make_pair(GURL(), 0), GURL(), + initial_total_size - d_size, initial_total_size - d_size)); EXPECT_EQ(initial_total_size, quota_eviction_handler()->GetUsage()); // disable_timer_for_testing(); temporary_storage_evictor()->Start(); @@ -337,12 +340,12 @@ quota_eviction_handler()->SetPoolSize(1000); quota_eviction_handler()->set_available_space(1000000000); quota_eviction_handler()->set_task_for_get_usage_and_quota( - base::Bind(&QuotaTemporaryStorageEvictorTest::TaskForRepeatedEvictionTest, - weak_factory_.GetWeakPtr(), - std::make_pair(GURL("http://www.e.com"), e_size), - GURL("http://www.c.com"), - initial_total_size - d_size, - initial_total_size - d_size + e_size - b_size)); + base::BindRepeating( + &QuotaTemporaryStorageEvictorTest::TaskForRepeatedEvictionTest, + weak_factory_.GetWeakPtr(), + std::make_pair(GURL("http://www.e.com"), e_size), + GURL("http://www.c.com"), initial_total_size - d_size, + initial_total_size - d_size + e_size - b_size)); EXPECT_EQ(initial_total_size, quota_eviction_handler()->GetUsage()); temporary_storage_evictor()->Start(); base::RunLoop().RunUntilIdle();
diff --git a/storage/browser/quota/special_storage_policy.h b/storage/browser/quota/special_storage_policy.h index 4b0763c9..a76d983d 100644 --- a/storage/browser/quota/special_storage_policy.h +++ b/storage/browser/quota/special_storage_policy.h
@@ -58,11 +58,12 @@ // when the session ends. virtual bool IsStorageSessionOnly(const GURL& origin) = 0; - // Cookies should also be deleted if the origin is blocked because it is - // possible to e.g. create an .example.com cookie from www.example.com. If - // www.example.com is SESSION_ONLY and example.com is BLOCKED, this cookie - // could be created but not deleted. - virtual bool IsStorageSessionOnlyOrBlocked(const GURL& origin) = 0; + // Cookies should be deleted if the origin is session only or blocked because + // it is possible to e.g. create an .example.com cookie from www.example.com. + // If www.example.com is SESSION_ONLY and example.com is BLOCKED, this cookie + // could be created but not deleted. If http://example.com is BLOCKED, but + // https://example.com is ALLOWED, the cookie will be kept. + virtual bool ShouldDeleteCookieOnExit(const GURL& origin) = 0; // Returns true if some origins are only allowed session-only storage. virtual bool HasSessionOnlyOrigins() = 0;
diff --git a/storage/browser/quota/storage_monitor.cc b/storage/browser/quota/storage_monitor.cc index 6abf396..aa0d8977 100644 --- a/storage/browser/quota/storage_monitor.cc +++ b/storage/browser/quota/storage_monitor.cc
@@ -207,11 +207,9 @@ initializing_ = true; quota_manager_->GetUsageAndQuotaForWebApps( - filter.origin, - filter.storage_type, - base::Bind(&HostStorageObservers::GotHostUsageAndQuota, - weak_factory_.GetWeakPtr(), - filter)); + filter.origin, filter.storage_type, + base::BindOnce(&HostStorageObservers::GotHostUsageAndQuota, + weak_factory_.GetWeakPtr(), filter)); } void HostStorageObservers::GotHostUsageAndQuota(
diff --git a/storage/browser/quota/storage_monitor_unittest.cc b/storage/browser/quota/storage_monitor_unittest.cc index 0669d5c..5ba01b7 100644 --- a/storage/browser/quota/storage_monitor_unittest.cc +++ b/storage/browser/quota/storage_monitor_unittest.cc
@@ -82,17 +82,18 @@ } void InvokeCallback() { - delayed_callback_.Run(callback_status_, callback_usage_, callback_quota_); + std::move(delayed_callback_) + .Run(callback_status_, callback_usage_, callback_quota_); } - void GetUsageAndQuotaForWebApps( - const GURL& origin, - StorageType type, - const UsageAndQuotaCallback& callback) override { + void GetUsageAndQuotaForWebApps(const GURL& origin, + StorageType type, + UsageAndQuotaCallback callback) override { if (initialized_) - callback.Run(callback_status_, callback_usage_, callback_quota_); + std::move(callback).Run(callback_status_, callback_usage_, + callback_quota_); else - delayed_callback_ = callback; + delayed_callback_ = std::move(callback); } protected:
diff --git a/storage/browser/quota/usage_tracker.cc b/storage/browser/quota/usage_tracker.cc index 08ad368..bac0940 100644 --- a/storage/browser/quota/usage_tracker.cc +++ b/storage/browser/quota/usage_tracker.cc
@@ -18,17 +18,21 @@ namespace { -void DidGetGlobalUsageForLimitedGlobalUsage(const UsageCallback& callback, +using UsageAccumulator = base::RepeatingCallback<void(int64_t usage)>; +using GlobalUsageAccumulator = + base::RepeatingCallback<void(int64_t usage, int64_t unlimited_usage)>; + +void DidGetGlobalUsageForLimitedGlobalUsage(UsageCallback callback, int64_t total_global_usage, int64_t global_unlimited_usage) { - callback.Run(total_global_usage - global_unlimited_usage); + std::move(callback).Run(total_global_usage - global_unlimited_usage); } void StripUsageWithBreakdownCallback( - const UsageCallback& callback, + UsageCallback callback, int64_t usage, base::flat_map<QuotaClient::ID, int64_t> usage_breakdown) { - callback.Run(usage); + std::move(callback).Run(usage); } } // namespace @@ -55,14 +59,14 @@ return nullptr; } -void UsageTracker::GetGlobalLimitedUsage(const UsageCallback& callback) { +void UsageTracker::GetGlobalLimitedUsage(UsageCallback callback) { if (global_usage_callbacks_.HasCallbacks()) { - global_usage_callbacks_.Add(base::Bind( - &DidGetGlobalUsageForLimitedGlobalUsage, callback)); + global_usage_callbacks_.Add(base::BindOnce( + &DidGetGlobalUsageForLimitedGlobalUsage, std::move(callback))); return; } - if (!global_limited_usage_callbacks_.Add(callback)) + if (!global_limited_usage_callbacks_.Add(std::move(callback))) return; AccumulateInfo* info = new AccumulateInfo; @@ -74,9 +78,9 @@ // To avoid this, we add one more pending client as a sentinel // and fire the sentinel callback at the end. info->pending_clients = client_tracker_map_.size() + 1; - UsageCallback accumulator = base::Bind( - &UsageTracker::AccumulateClientGlobalLimitedUsage, - weak_factory_.GetWeakPtr(), base::Owned(info)); + UsageAccumulator accumulator = + base::BindRepeating(&UsageTracker::AccumulateClientGlobalLimitedUsage, + weak_factory_.GetWeakPtr(), base::Owned(info)); for (const auto& client_id_and_tracker : client_tracker_map_) client_id_and_tracker.second->GetGlobalLimitedUsage(accumulator); @@ -85,8 +89,8 @@ accumulator.Run(0); } -void UsageTracker::GetGlobalUsage(const GlobalUsageCallback& callback) { - if (!global_usage_callbacks_.Add(callback)) +void UsageTracker::GetGlobalUsage(GlobalUsageCallback callback) { + if (!global_usage_callbacks_.Add(std::move(callback))) return; AccumulateInfo* info = new AccumulateInfo; @@ -98,9 +102,9 @@ // To avoid this, we add one more pending client as a sentinel // and fire the sentinel callback at the end. info->pending_clients = client_tracker_map_.size() + 1; - GlobalUsageCallback accumulator = base::Bind( - &UsageTracker::AccumulateClientGlobalUsage, weak_factory_.GetWeakPtr(), - base::Owned(info)); + GlobalUsageAccumulator accumulator = + base::BindRepeating(&UsageTracker::AccumulateClientGlobalUsage, + weak_factory_.GetWeakPtr(), base::Owned(info)); for (const auto& client_id_and_tracker : client_tracker_map_) client_id_and_tracker.second->GetGlobalUsage(accumulator); @@ -110,15 +114,16 @@ } void UsageTracker::GetHostUsage(const std::string& host, - const UsageCallback& callback) { + UsageCallback callback) { UsageTracker::GetHostUsageWithBreakdown( - host, base::Bind(&StripUsageWithBreakdownCallback, callback)); + host, + base::BindOnce(&StripUsageWithBreakdownCallback, std::move(callback))); } void UsageTracker::GetHostUsageWithBreakdown( const std::string& host, - const UsageWithBreakdownCallback& callback) { - if (!host_usage_callbacks_.Add(host, callback)) + UsageWithBreakdownCallback callback) { + if (!host_usage_callbacks_.Add(host, std::move(callback))) return; AccumulateInfo* info = new AccumulateInfo; @@ -130,9 +135,9 @@ for (const auto& client_id_and_tracker : client_tracker_map_) { client_id_and_tracker.second->GetHostUsage( - host, base::Bind(&UsageTracker::AccumulateClientHostUsage, - weak_factory_.GetWeakPtr(), barrier, info, host, - client_id_and_tracker.first)); + host, base::BindOnce(&UsageTracker::AccumulateClientHostUsage, + weak_factory_.GetWeakPtr(), barrier, info, host, + client_id_and_tracker.first)); } }
diff --git a/storage/browser/quota/usage_tracker.h b/storage/browser/quota/usage_tracker.h index b6325f6..e42d010 100644 --- a/storage/browser/quota/usage_tracker.h +++ b/storage/browser/quota/usage_tracker.h
@@ -42,11 +42,11 @@ blink::mojom::StorageType type() const { return type_; } ClientUsageTracker* GetClientTracker(QuotaClient::ID client_id); - void GetGlobalLimitedUsage(const UsageCallback& callback); - void GetGlobalUsage(const GlobalUsageCallback& callback); - void GetHostUsage(const std::string& host, const UsageCallback& callback); + void GetGlobalLimitedUsage(UsageCallback callback); + void GetGlobalUsage(GlobalUsageCallback callback); + void GetHostUsage(const std::string& host, UsageCallback callback); void GetHostUsageWithBreakdown(const std::string& host, - const UsageWithBreakdownCallback& callback); + UsageWithBreakdownCallback callback); void UpdateUsageCache(QuotaClient::ID client_id, const GURL& origin, int64_t delta); @@ -73,14 +73,14 @@ base::flat_map<QuotaClient::ID, int64_t> usage_breakdown; }; - typedef CallbackQueue<UsageCallback, int64_t> UsageCallbackQueue; - typedef CallbackQueue<GlobalUsageCallback, int64_t, int64_t> - GlobalUsageCallbackQueue; - typedef CallbackQueueMap<UsageWithBreakdownCallback, - std::string, - int64_t, - base::flat_map<QuotaClient::ID, int64_t>> - HostUsageCallbackMap; + using UsageCallbackQueue = CallbackQueue<UsageCallback, int64_t>; + using GlobalUsageCallbackQueue = + CallbackQueue<GlobalUsageCallback, int64_t, int64_t>; + using HostUsageCallbackMap = + CallbackQueueMap<UsageWithBreakdownCallback, + std::string, + int64_t, + base::flat_map<QuotaClient::ID, int64_t>>; friend class ClientUsageTracker; void AccumulateClientGlobalLimitedUsage(AccumulateInfo* info,
diff --git a/storage/browser/quota/usage_tracker_unittest.cc b/storage/browser/quota/usage_tracker_unittest.cc index 3bf3c019..bdaa02f 100644 --- a/storage/browser/quota/usage_tracker_unittest.cc +++ b/storage/browser/quota/usage_tracker_unittest.cc
@@ -165,8 +165,8 @@ void GetGlobalLimitedUsage(int64_t* limited_usage) { bool done = false; - usage_tracker_.GetGlobalLimitedUsage(base::Bind( - &DidGetUsage, &done, limited_usage)); + usage_tracker_.GetGlobalLimitedUsage( + base::BindOnce(&DidGetUsage, &done, limited_usage)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(done); @@ -174,9 +174,8 @@ void GetGlobalUsage(int64_t* usage, int64_t* unlimited_usage) { bool done = false; - usage_tracker_.GetGlobalUsage(base::Bind( - &DidGetGlobalUsage, - &done, usage, unlimited_usage)); + usage_tracker_.GetGlobalUsage( + base::BindOnce(&DidGetGlobalUsage, &done, usage, unlimited_usage)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(done); @@ -184,7 +183,8 @@ void GetHostUsage(const std::string& host, int64_t* usage) { bool done = false; - usage_tracker_.GetHostUsage(host, base::Bind(&DidGetUsage, &done, usage)); + usage_tracker_.GetHostUsage(host, + base::BindOnce(&DidGetUsage, &done, usage)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(done); @@ -196,7 +196,8 @@ base::flat_map<QuotaClient::ID, int64_t>* usage_breakdown) { bool done = false; usage_tracker_.GetHostUsageWithBreakdown( - host, base::Bind(&DidGetUsageBreakdown, &done, usage, usage_breakdown)); + host, + base::BindOnce(&DidGetUsageBreakdown, &done, usage, usage_breakdown)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(done);
diff --git a/storage/browser/test/mock_quota_manager.cc b/storage/browser/test/mock_quota_manager.cc index d571a86a..419cd85 100644 --- a/storage/browser/test/mock_quota_manager.cc +++ b/storage/browser/test/mock_quota_manager.cc
@@ -46,9 +46,10 @@ void MockQuotaManager::GetUsageAndQuota(const GURL& origin, StorageType type, - const UsageAndQuotaCallback& callback) { + UsageAndQuotaCallback callback) { StorageInfo& info = usage_and_quota_map_[std::make_pair(origin, type)]; - callback.Run(blink::mojom::QuotaStatusCode::kOk, info.usage, info.quota); + std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk, info.usage, + info.quota); } void MockQuotaManager::SetQuota(const GURL& origin, @@ -81,10 +82,9 @@ return false; } -void MockQuotaManager::GetOriginsModifiedSince( - StorageType type, - base::Time modified_since, - const GetOriginsCallback& callback) { +void MockQuotaManager::GetOriginsModifiedSince(StorageType type, + base::Time modified_since, + GetOriginsCallback callback) { std::set<GURL>* origins_to_return = new std::set<GURL>(); for (std::vector<OriginInfo>::const_iterator current = origins_.begin(); current != origins_.end(); @@ -95,15 +95,14 @@ base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(&MockQuotaManager::DidGetModifiedSince, - weak_factory_.GetWeakPtr(), callback, + weak_factory_.GetWeakPtr(), std::move(callback), base::Owned(origins_to_return), type)); } -void MockQuotaManager::DeleteOriginData( - const GURL& origin, - StorageType type, - int quota_client_mask, - const StatusCallback& callback) { +void MockQuotaManager::DeleteOriginData(const GURL& origin, + StorageType type, + int quota_client_mask, + StatusCallback callback) { for (std::vector<OriginInfo>::iterator current = origins_.begin(); current != origins_.end(); ++current) { @@ -118,7 +117,7 @@ base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(&MockQuotaManager::DidDeleteOriginData, - weak_factory_.GetWeakPtr(), callback, + weak_factory_.GetWeakPtr(), std::move(callback), blink::mojom::QuotaStatusCode::kOk)); } @@ -130,17 +129,16 @@ usage_and_quota_map_[std::make_pair(origin, type)].usage += delta; } -void MockQuotaManager::DidGetModifiedSince( - const GetOriginsCallback& callback, - std::set<GURL>* origins, - StorageType storage_type) { - callback.Run(*origins, storage_type); +void MockQuotaManager::DidGetModifiedSince(GetOriginsCallback callback, + std::set<GURL>* origins, + StorageType storage_type) { + std::move(callback).Run(*origins, storage_type); } void MockQuotaManager::DidDeleteOriginData( - const StatusCallback& callback, + StatusCallback callback, blink::mojom::QuotaStatusCode status) { - callback.Run(status); + std::move(callback).Run(status); } } // namespace content
diff --git a/storage/browser/test/mock_quota_manager.h b/storage/browser/test/mock_quota_manager.h index d5de7aee..154f42c5 100644 --- a/storage/browser/test/mock_quota_manager.h +++ b/storage/browser/test/mock_quota_manager.h
@@ -54,14 +54,14 @@ // a helper method MockQuotaManagerProxy::SetQuota(). void GetUsageAndQuota(const GURL& origin, StorageType type, - const UsageAndQuotaCallback& callback) override; + UsageAndQuotaCallback callback) override; // Overrides QuotaManager's implementation with a canned implementation that // allows clients to set up the origin database that should be queried. This // method will only search through the origins added explicitly via AddOrigin. void GetOriginsModifiedSince(StorageType type, base::Time modified_since, - const GetOriginsCallback& callback) override; + GetOriginsCallback callback) override; // Removes an origin from the canned list of origins, but doesn't touch // anything on disk. The caller must provide |quota_client_mask| which @@ -72,7 +72,7 @@ void DeleteOriginData(const GURL& origin, StorageType type, int quota_client_mask, - const StatusCallback& callback) override; + StatusCallback callback) override; // Helper method for updating internal quota info. void SetQuota(const GURL& origin, StorageType type, int64_t quota); @@ -133,10 +133,10 @@ // This must be called via MockQuotaManagerProxy. void UpdateUsage(const GURL& origin, StorageType type, int64_t delta); - void DidGetModifiedSince(const GetOriginsCallback& callback, + void DidGetModifiedSince(GetOriginsCallback callback, std::set<GURL>* origins, StorageType storage_type); - void DidDeleteOriginData(const StatusCallback& callback, + void DidDeleteOriginData(StatusCallback callback, blink::mojom::QuotaStatusCode status); // The list of stored origins that have been added via AddOrigin.
diff --git a/storage/browser/test/mock_quota_manager_proxy.cc b/storage/browser/test/mock_quota_manager_proxy.cc index c73086b..18c8e008 100644 --- a/storage/browser/test/mock_quota_manager_proxy.cc +++ b/storage/browser/test/mock_quota_manager_proxy.cc
@@ -37,9 +37,10 @@ base::SequencedTaskRunner* original_task_runner, const url::Origin& origin, blink::mojom::StorageType type, - const QuotaManager::UsageAndQuotaCallback& callback) { + QuotaManager::UsageAndQuotaCallback callback) { if (mock_manager()) { - mock_manager()->GetUsageAndQuota(origin.GetURL(), type, callback); + mock_manager()->GetUsageAndQuota(origin.GetURL(), type, + std::move(callback)); } }
diff --git a/storage/browser/test/mock_quota_manager_proxy.h b/storage/browser/test/mock_quota_manager_proxy.h index d05803fc..450e30ae 100644 --- a/storage/browser/test/mock_quota_manager_proxy.h +++ b/storage/browser/test/mock_quota_manager_proxy.h
@@ -37,11 +37,10 @@ const url::Origin& origin, blink::mojom::StorageType type, bool enabled) override {} - void GetUsageAndQuota( - base::SequencedTaskRunner* original_task_runner, - const url::Origin& origin, - blink::mojom::StorageType type, - const QuotaManager::UsageAndQuotaCallback& callback) override; + void GetUsageAndQuota(base::SequencedTaskRunner* original_task_runner, + const url::Origin& origin, + blink::mojom::StorageType type, + QuotaManager::UsageAndQuotaCallback callback) override; // Validates the |client_id| and updates the internal access count // which can be accessed via notify_storage_accessed_count().
diff --git a/storage/browser/test/mock_special_storage_policy.cc b/storage/browser/test/mock_special_storage_policy.cc index faad3bbd..5a711dd 100644 --- a/storage/browser/test/mock_special_storage_policy.cc +++ b/storage/browser/test/mock_special_storage_policy.cc
@@ -24,8 +24,7 @@ return base::ContainsKey(session_only_, origin); } -bool MockSpecialStoragePolicy::IsStorageSessionOnlyOrBlocked( - const GURL& origin) { +bool MockSpecialStoragePolicy::ShouldDeleteCookieOnExit(const GURL& origin) { return base::ContainsKey(session_only_, origin); }
diff --git a/storage/browser/test/mock_special_storage_policy.h b/storage/browser/test/mock_special_storage_policy.h index 0fd80734..f210e15e 100644 --- a/storage/browser/test/mock_special_storage_policy.h +++ b/storage/browser/test/mock_special_storage_policy.h
@@ -22,7 +22,7 @@ bool IsStorageProtected(const GURL& origin) override; bool IsStorageUnlimited(const GURL& origin) override; bool IsStorageSessionOnly(const GURL& origin) override; - bool IsStorageSessionOnlyOrBlocked(const GURL& origin) override; + bool ShouldDeleteCookieOnExit(const GURL& origin) override; bool HasIsolatedStorage(const GURL& origin) override; bool HasSessionOnlyOrigins() override; bool IsStorageDurable(const GURL& origin) override;
diff --git a/testing/buildbot/filters/mojo.fyi.viz.content_browsertests.filter b/testing/buildbot/filters/mojo.fyi.viz.content_browsertests.filter index a2e398c..b7e4417 100644 --- a/testing/buildbot/filters/mojo.fyi.viz.content_browsertests.filter +++ b/testing/buildbot/filters/mojo.fyi.viz.content_browsertests.filter
@@ -34,27 +34,27 @@ -SitePerProcessBrowserTest.ScrollBubblingFromOOPIFTest -SitePerProcessBrowserTest.TwoSubframesCreatePopupMenuWidgetsSimultaneously -SitePerProcessBrowserTest.ViewBoundsInNestedFrameTest --SitePerProcessHitTestBrowserTest.AsynchronousHitTestChildTimeout --SitePerProcessHitTestBrowserTest.CancelWheelScrollBubblingOnWheelTargetDeletion --SitePerProcessHitTestBrowserTest.CreateContextMenuTest --SitePerProcessHitTestBrowserTest.CrossProcessMouseCapture --SitePerProcessHitTestBrowserTest.CrossProcessMouseEnterAndLeaveTest --SitePerProcessHitTestBrowserTest.CursorUpdateReceivedFromCrossSiteIframe --SitePerProcessHitTestBrowserTest.InputEventRouterGesturePreventDefaultTargetMapTest --SitePerProcessHitTestBrowserTest.InputEventRouterGestureTargetMapTest --SitePerProcessHitTestBrowserTest.InputEventRouterTouchpadGestureTargetTest --SitePerProcessHitTestBrowserTest.InputEventRouterWheelCoalesceTest --SitePerProcessHitTestBrowserTest.HitTestLayerSquashing --SitePerProcessHitTestBrowserTest.HitTestNestedFrames --SitePerProcessHitTestBrowserTest.HitTestWatermark --SitePerProcessHitTestBrowserTest.NestedSurfaceHitTestTest --SitePerProcessHitTestBrowserTest.OverlapSurfaceHitTestTest --SitePerProcessHitTestBrowserTest.PopupMenuTest --SitePerProcessHitTestBrowserTest.RootConsumesScrollDuringOverscrollGesture --SitePerProcessHitTestBrowserTest.ScrollEventToOOPIF --SitePerProcessHitTestBrowserTest.SubframeTouchEventRouting --SitePerProcessHitTestBrowserTest.SurfaceHitTestPointerEventsNone --SitePerProcessHitTestBrowserTest.SurfaceHitTestTest +-SitePerProcessHitTestBrowserTest.AsynchronousHitTestChildTimeout* +-SitePerProcessHitTestBrowserTest.CancelWheelScrollBubblingOnWheelTargetDeletion* +-SitePerProcessHitTestBrowserTest.CreateContextMenuTest* +-SitePerProcessHitTestBrowserTest.CrossProcessMouseCapture* +-SitePerProcessHitTestBrowserTest.CrossProcessMouseEnterAndLeaveTest* +-SitePerProcessHitTestBrowserTest.CursorUpdateReceivedFromCrossSiteIframe* +-SitePerProcessHitTestBrowserTest.InputEventRouterGesturePreventDefaultTargetMapTest* +-SitePerProcessHitTestBrowserTest.InputEventRouterGestureTargetMapTest* +-SitePerProcessHitTestBrowserTest.InputEventRouterTouchpadGestureTargetTest* +-SitePerProcessHitTestBrowserTest.InputEventRouterWheelCoalesceTest* +-SitePerProcessHitTestBrowserTest.HitTestLayerSquashing* +-SitePerProcessHitTestBrowserTest.HitTestNestedFrames* +-SitePerProcessHitTestBrowserTest.HitTestWatermark* +-SitePerProcessHitTestBrowserTest.NestedSurfaceHitTestTest* +-SitePerProcessHitTestBrowserTest.OverlapSurfaceHitTestTest* +-SitePerProcessHitTestBrowserTest.PopupMenuTest* +-SitePerProcessHitTestBrowserTest.RootConsumesScrollDuringOverscrollGesture* +-SitePerProcessHitTestBrowserTest.ScrollEventToOOPIF* +-SitePerProcessHitTestBrowserTest.SubframeTouchEventRouting* +-SitePerProcessHitTestBrowserTest.SurfaceHitTestPointerEventsNone* +-SitePerProcessHitTestBrowserTest.SurfaceHitTestTest* # Copy Surface timing out http://crbug.com/785257 -GLAndSoftwareCompositing/CompositingRenderWidgetHostViewBrowserTest.*
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG index b717dda0..51e0d8e0 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -5,13 +5,13 @@ crbug.com/755750 accessibility/selection-affinity.html [ Failure ] ## Reverse hosting of editable block -crbug.com/707656 editing/execCommand/format-block-crash.html [ Crash ] +crbug.com/707656 editing/execCommand/format-block-crash.html [ Crash Pass ] crbug.com/707656 editing/input/scroll-viewport-page-up-down.html [ Failure ] -crbug.com/707656 editing/undo/undo-indent.html [ Crash ] -crbug.com/707656 external/wpt/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-001.html [ Crash ] -crbug.com/707656 external/wpt/html/editing/focus/processing-model/focus-fixup-rule-one-no-dialogs.html [ Crash ] +crbug.com/707656 editing/undo/undo-indent.html [ Crash Pass ] +crbug.com/707656 external/wpt/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-001.html [ Crash Pass ] +crbug.com/707656 external/wpt/html/editing/focus/processing-model/focus-fixup-rule-one-no-dialogs.html [ Crash Pass ] crbug.com/789878 fast/css/first-letter-capitalized-edit-select-crash.html [ Failure ] -crbug.com/707656 fast/css/readwrite-contenteditable-recalc.html [ Crash ] +crbug.com/707656 fast/css/readwrite-contenteditable-recalc.html [ Crash Pass ] crbug.com/789878 fast/css/readwrite-contenteditable.html [ Failure ] crbug.com/789878 fast/inline/inline-focus-ring.html [ Failure ] @@ -113,7 +113,7 @@ crbug.com/591099 accessibility/scroll-div-horiz-sends-notification.html [ Failure ] crbug.com/714962 accessibility/selection-events.html [ Failure ] crbug.com/714962 accessibility/set-selection-link.html [ Failure ] -crbug.com/591099 accessibility/spelling-markers.html [ Failure ] +crbug.com/591099 accessibility/spelling-markers.html [ Failure Pass ] crbug.com/591099 accessibility/table-cells.html [ Failure ] crbug.com/591099 accessibility/table-header-column-row.html [ Failure ] crbug.com/591099 accessibility/table-one-cell.html [ Failure ] @@ -280,35 +280,35 @@ crbug.com/591099 css2.1/t051202-c24-first-lttr-00-b.html [ Failure ] crbug.com/591099 css2.1/t051202-c26-psudo-nest-00-c.html [ Crash ] crbug.com/591099 css2.1/t0602-c13-inh-underlin-00-e.html [ Failure ] -crbug.com/591099 css2.1/t0602-c13-inheritance-00-e.html [ Failure ] +crbug.com/591099 css2.1/t0602-c13-inheritance-00-e.html [ Failure Pass ] crbug.com/591099 css2.1/t0602-inherit-bdr-pad-b-00.html [ Failure ] -crbug.com/591099 css2.1/t0803-c5502-imrgn-r-01-b-ag.html [ Failure ] -crbug.com/591099 css2.1/t0803-c5502-imrgn-r-03-b-a.html [ Failure ] -crbug.com/591099 css2.1/t0803-c5502-imrgn-r-04-b-ag.html [ Failure ] -crbug.com/591099 css2.1/t0803-c5502-imrgn-r-05-b-ag.html [ Failure ] -crbug.com/591099 css2.1/t0803-c5504-imrgn-l-00-b-ag.html [ Failure ] -crbug.com/591099 css2.1/t0803-c5504-imrgn-l-01-b-ag.html [ Failure ] -crbug.com/591099 css2.1/t0803-c5504-imrgn-l-02-b-ag.html [ Failure ] -crbug.com/591099 css2.1/t0803-c5504-imrgn-l-03-b-a.html [ Failure ] -crbug.com/591099 css2.1/t0803-c5504-imrgn-l-04-b-ag.html [ Failure ] -crbug.com/591099 css2.1/t0803-c5504-imrgn-l-05-b-ag.html [ Failure ] -crbug.com/591099 css2.1/t0803-c5504-imrgn-l-06-b-ag.html [ Failure ] -crbug.com/591099 css2.1/t0803-c5505-imrgn-00-a-ag.html [ Failure ] +crbug.com/591099 css2.1/t0803-c5502-imrgn-r-01-b-ag.html [ Failure Pass ] +crbug.com/591099 css2.1/t0803-c5502-imrgn-r-03-b-a.html [ Failure Pass ] +crbug.com/591099 css2.1/t0803-c5502-imrgn-r-04-b-ag.html [ Failure Pass ] +crbug.com/591099 css2.1/t0803-c5502-imrgn-r-05-b-ag.html [ Failure Pass ] +crbug.com/591099 css2.1/t0803-c5504-imrgn-l-00-b-ag.html [ Failure Pass ] +crbug.com/591099 css2.1/t0803-c5504-imrgn-l-01-b-ag.html [ Failure Pass ] +crbug.com/591099 css2.1/t0803-c5504-imrgn-l-02-b-ag.html [ Failure Pass ] +crbug.com/591099 css2.1/t0803-c5504-imrgn-l-03-b-a.html [ Failure Pass ] +crbug.com/591099 css2.1/t0803-c5504-imrgn-l-04-b-ag.html [ Failure Pass ] +crbug.com/591099 css2.1/t0803-c5504-imrgn-l-05-b-ag.html [ Failure Pass ] +crbug.com/591099 css2.1/t0803-c5504-imrgn-l-06-b-ag.html [ Failure Pass ] +crbug.com/591099 css2.1/t0803-c5505-imrgn-00-a-ag.html [ Failure Pass ] crbug.com/591099 css2.1/t0803-c5505-mrgn-02-c.html [ Failure ] -crbug.com/591099 css2.1/t0804-c5506-ipadn-t-00-b-a.html [ Failure ] -crbug.com/591099 css2.1/t0804-c5506-ipadn-t-02-b-a.html [ Failure ] -crbug.com/591099 css2.1/t0804-c5507-ipadn-r-03-b-a.html [ Failure ] -crbug.com/591099 css2.1/t0804-c5507-ipadn-r-04-b-ag.html [ Failure ] -crbug.com/591099 css2.1/t0804-c5509-ipadn-l-00-b-ag.html [ Failure ] -crbug.com/591099 css2.1/t0804-c5509-ipadn-l-01-b-ag.html [ Failure ] -crbug.com/591099 css2.1/t0804-c5509-ipadn-l-02-b-ag.html [ Failure ] -crbug.com/591099 css2.1/t0804-c5509-ipadn-l-03-b-a.html [ Failure ] -crbug.com/591099 css2.1/t0804-c5509-ipadn-l-04-f-ag.html [ Failure ] -crbug.com/591099 css2.1/t0804-c5510-ipadn-00-b-ag.html [ Failure ] -crbug.com/591099 css2.1/t0805-c5512-ibrdr-rw-00-a.html [ Failure ] -crbug.com/591099 css2.1/t0805-c5513-ibrdr-bw-00-a.html [ Failure ] -crbug.com/591099 css2.1/t0805-c5514-ibrdr-lw-00-a.html [ Failure ] -crbug.com/591099 css2.1/t0805-c5515-ibrdr-00-b.html [ Failure ] +crbug.com/591099 css2.1/t0804-c5506-ipadn-t-00-b-a.html [ Failure Pass ] +crbug.com/591099 css2.1/t0804-c5506-ipadn-t-02-b-a.html [ Failure Pass ] +crbug.com/591099 css2.1/t0804-c5507-ipadn-r-03-b-a.html [ Failure Pass ] +crbug.com/591099 css2.1/t0804-c5507-ipadn-r-04-b-ag.html [ Failure Pass ] +crbug.com/591099 css2.1/t0804-c5509-ipadn-l-00-b-ag.html [ Failure Pass ] +crbug.com/591099 css2.1/t0804-c5509-ipadn-l-01-b-ag.html [ Failure Pass ] +crbug.com/591099 css2.1/t0804-c5509-ipadn-l-02-b-ag.html [ Failure Pass ] +crbug.com/591099 css2.1/t0804-c5509-ipadn-l-03-b-a.html [ Failure Pass ] +crbug.com/591099 css2.1/t0804-c5509-ipadn-l-04-f-ag.html [ Failure Pass ] +crbug.com/591099 css2.1/t0804-c5510-ipadn-00-b-ag.html [ Failure Pass ] +crbug.com/591099 css2.1/t0805-c5512-ibrdr-rw-00-a.html [ Failure Pass ] +crbug.com/591099 css2.1/t0805-c5513-ibrdr-bw-00-a.html [ Failure Pass ] +crbug.com/591099 css2.1/t0805-c5514-ibrdr-lw-00-a.html [ Failure Pass ] +crbug.com/591099 css2.1/t0805-c5515-ibrdr-00-b.html [ Failure Pass ] crbug.com/591099 css2.1/t0805-c5518-brdr-t-01-e.html [ Failure ] crbug.com/591099 css2.1/t0805-c5518-ibrdr-t-00-a.html [ Failure ] crbug.com/591099 css2.1/t0805-c5519-brdr-r-00-a.html [ Failure ] @@ -325,7 +325,7 @@ crbug.com/591099 css2.1/t0805-c5522-brdr-02-e.html [ Failure ] crbug.com/591099 css2.1/t0805-c5522-ibrdr-00-a.html [ Failure ] crbug.com/591099 css2.1/t09-c5526c-display-00-e.html [ Failure ] -crbug.com/591099 css2.1/t090402-c42-ibx-pad-00-d-ag.html [ Failure ] +crbug.com/591099 css2.1/t090402-c42-ibx-pad-00-d-ag.html [ Failure Pass ] crbug.com/591099 css2.1/t0905-c414-flt-fit-00-d.html [ Failure ] crbug.com/591099 css2.1/t0905-c414-flt-fit-01-d-g.html [ Failure ] crbug.com/591099 css2.1/t0905-c414-flt-wrap-00-e.html [ Failure ] @@ -349,7 +349,7 @@ crbug.com/591099 css2.1/t1002-c5523-width-02-b-g.html [ Failure ] crbug.com/591099 css2.1/t100304-c43-rpl-bbx-00-d-g.html [ Failure ] crbug.com/591099 css2.1/t100304-c43-rpl-bbx-01-d-g.html [ Failure ] -crbug.com/591099 css2.1/t1004-c43-rpl-ibx-00-d-ag.html [ Failure ] +crbug.com/591099 css2.1/t1004-c43-rpl-ibx-00-d-ag.html [ Failure Pass ] crbug.com/591099 css2.1/t1004-c5524-width-00-b-g.html [ Failure ] crbug.com/591099 css2.1/t1005-c5524-width-00-b-g.html [ Failure Pass ] crbug.com/591099 css2.1/t1005-c5524-width-01-b-g.html [ Failure Pass ] @@ -359,11 +359,11 @@ crbug.com/591099 css2.1/t1008-c44-ln-box-03-d-ag.html [ Failure ] crbug.com/591099 css2.1/t100801-c42-ibx-ht-00-d-a.html [ Failure ] crbug.com/591099 css2.1/t100801-c544-valgn-00-a-ag.html [ Failure ] -crbug.com/591099 css2.1/t100801-c544-valgn-01-d-ag.html [ Failure ] +crbug.com/591099 css2.1/t100801-c544-valgn-01-d-ag.html [ Failure Pass ] crbug.com/591099 css2.1/t100801-c544-valgn-02-d-agi.html [ Failure ] crbug.com/591099 css2.1/t100801-c544-valgn-03-d-agi.html [ Failure ] crbug.com/591099 css2.1/t100801-c544-valgn-04-d-agi.html [ Failure ] -crbug.com/591099 css2.1/t100801-c548-leadin-00-d-a.html [ Failure ] +crbug.com/591099 css2.1/t100801-c548-leadin-00-d-a.html [ Failure Pass ] crbug.com/591099 css2.1/t1202-counter-00-b.html [ Failure ] crbug.com/591099 css2.1/t1202-counter-01-b.html [ Failure ] crbug.com/591099 css2.1/t1202-counter-02-b.html [ Failure ] @@ -389,14 +389,14 @@ crbug.com/591099 css2.1/t1202-counters-12-b.html [ Failure ] crbug.com/591099 css2.1/t1202-counters-15-b.html [ Failure ] crbug.com/591099 css2.1/t1202-counters-16-c.html [ Failure ] -crbug.com/591099 css2.1/t1202-counters-17-d.html [ Failure ] +crbug.com/591099 css2.1/t1202-counters-17-d.html [ Failure Pass ] crbug.com/591099 css2.1/t1202-counters-18-f.html [ Failure ] -crbug.com/591099 css2.1/t1204-implied-01-c.html [ Failure ] -crbug.com/591099 css2.1/t1204-implied-02-d.html [ Failure ] +crbug.com/591099 css2.1/t1204-implied-01-c.html [ Failure Pass ] +crbug.com/591099 css2.1/t1204-implied-02-d.html [ Failure Pass ] crbug.com/591099 css2.1/t1204-order-00-c.html [ Failure ] -crbug.com/591099 css2.1/t120401-scope-01-c.html [ Failure ] -crbug.com/591099 css2.1/t120401-scope-02-c.html [ Failure ] -crbug.com/591099 css2.1/t120401-scope-03-c.html [ Failure ] +crbug.com/591099 css2.1/t120401-scope-01-c.html [ Failure Pass ] +crbug.com/591099 css2.1/t120401-scope-02-c.html [ Failure Pass ] +crbug.com/591099 css2.1/t120401-scope-03-c.html [ Failure Pass ] crbug.com/591099 css2.1/t120401-scope-04-d.html [ Failure ] crbug.com/591099 css2.1/t1205-c561-list-displ-00-b.html [ Failure ] crbug.com/591099 css2.1/t1205-c563-list-type-01-b.html [ Failure ] @@ -574,21 +574,21 @@ crbug.com/714962 css3/masking/clip-path-reference-box-inline.html [ Failure ] crbug.com/591099 css3/selectors3/html/css3-modsel-167.html [ Failure ] crbug.com/591099 css3/selectors3/html/css3-modsel-167a.html [ Failure ] -crbug.com/591099 css3/selectors3/html/css3-modsel-168.html [ Failure ] -crbug.com/591099 css3/selectors3/html/css3-modsel-168a.html [ Failure ] -crbug.com/591099 css3/selectors3/html/css3-modsel-169.html [ Failure ] -crbug.com/591099 css3/selectors3/html/css3-modsel-169a.html [ Failure ] +crbug.com/591099 css3/selectors3/html/css3-modsel-168.html [ Failure Pass ] +crbug.com/591099 css3/selectors3/html/css3-modsel-168a.html [ Failure Pass ] +crbug.com/591099 css3/selectors3/html/css3-modsel-169.html [ Failure Pass ] +crbug.com/591099 css3/selectors3/html/css3-modsel-169a.html [ Failure Pass ] crbug.com/591099 css3/selectors3/html/css3-modsel-179a.html [ Failure ] crbug.com/591099 css3/selectors3/html/css3-modsel-18.html [ Failure ] crbug.com/591099 css3/selectors3/html/css3-modsel-180a.html [ Failure ] crbug.com/591099 css3/selectors3/html/css3-modsel-18b.html [ Failure ] -crbug.com/591099 css3/selectors3/html/css3-modsel-18c.html [ Failure ] +crbug.com/591099 css3/selectors3/html/css3-modsel-18c.html [ Failure Pass ] crbug.com/591099 css3/selectors3/html/css3-modsel-19.html [ Failure ] crbug.com/591099 css3/selectors3/html/css3-modsel-20.html [ Failure ] crbug.com/591099 css3/selectors3/html/css3-modsel-23.html [ Failure ] crbug.com/591099 css3/selectors3/html/css3-modsel-24.html [ Failure ] -crbug.com/591099 css3/selectors3/html/css3-modsel-25.html [ Failure ] -crbug.com/591099 css3/selectors3/html/css3-modsel-32.html [ Failure ] +crbug.com/591099 css3/selectors3/html/css3-modsel-25.html [ Failure Pass ] +crbug.com/591099 css3/selectors3/html/css3-modsel-32.html [ Failure Pass ] crbug.com/591099 css3/selectors3/html/css3-modsel-33.html [ Failure ] crbug.com/591099 css3/selectors3/html/css3-modsel-34.html [ Failure ] crbug.com/591099 css3/selectors3/html/css3-modsel-38.html [ Failure ] @@ -600,28 +600,28 @@ crbug.com/591099 css3/selectors3/html/css3-modsel-68.html [ Failure ] crbug.com/591099 css3/selectors3/html/css3-modsel-69.html [ Failure ] crbug.com/591099 css3/selectors3/html/css3-modsel-7.html [ Failure ] -crbug.com/591099 css3/selectors3/html/css3-modsel-70.html [ Failure ] +crbug.com/591099 css3/selectors3/html/css3-modsel-70.html [ Failure Pass ] crbug.com/591099 css3/selectors3/html/css3-modsel-8.html [ Failure ] crbug.com/591099 css3/selectors3/html/css3-modsel-80.html [ Failure ] crbug.com/591099 css3/selectors3/html/css3-modsel-9.html [ Failure ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-120.xml [ Failure ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-167.xml [ Failure ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-167a.xml [ Failure ] -crbug.com/591099 css3/selectors3/xhtml/css3-modsel-168.xml [ Failure ] -crbug.com/591099 css3/selectors3/xhtml/css3-modsel-168a.xml [ Failure ] -crbug.com/591099 css3/selectors3/xhtml/css3-modsel-169.xml [ Failure ] -crbug.com/591099 css3/selectors3/xhtml/css3-modsel-169a.xml [ Failure ] +crbug.com/591099 css3/selectors3/xhtml/css3-modsel-168.xml [ Failure Pass ] +crbug.com/591099 css3/selectors3/xhtml/css3-modsel-168a.xml [ Failure Pass ] +crbug.com/591099 css3/selectors3/xhtml/css3-modsel-169.xml [ Failure Pass ] +crbug.com/591099 css3/selectors3/xhtml/css3-modsel-169a.xml [ Failure Pass ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-179a.xml [ Failure ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-18.xml [ Failure ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-180a.xml [ Failure ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-18b.xml [ Failure ] -crbug.com/591099 css3/selectors3/xhtml/css3-modsel-18c.xml [ Failure ] +crbug.com/591099 css3/selectors3/xhtml/css3-modsel-18c.xml [ Failure Pass ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-19.xml [ Failure ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-20.xml [ Failure ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-23.xml [ Failure ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-24.xml [ Failure ] -crbug.com/591099 css3/selectors3/xhtml/css3-modsel-25.xml [ Failure ] -crbug.com/591099 css3/selectors3/xhtml/css3-modsel-32.xml [ Failure ] +crbug.com/591099 css3/selectors3/xhtml/css3-modsel-25.xml [ Failure Pass ] +crbug.com/591099 css3/selectors3/xhtml/css3-modsel-32.xml [ Failure Pass ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-33.xml [ Failure ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-34.xml [ Failure ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-38.xml [ Failure ] @@ -633,7 +633,7 @@ crbug.com/591099 css3/selectors3/xhtml/css3-modsel-68.xml [ Failure ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-69.xml [ Failure ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-7.xml [ Failure ] -crbug.com/591099 css3/selectors3/xhtml/css3-modsel-70.xml [ Failure ] +crbug.com/591099 css3/selectors3/xhtml/css3-modsel-70.xml [ Failure Pass ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-8.xml [ Failure ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-80.xml [ Failure ] crbug.com/591099 css3/selectors3/xhtml/css3-modsel-9.xml [ Failure ] @@ -641,21 +641,21 @@ crbug.com/591099 css3/selectors3/xml/css3-modsel-120.xml [ Failure ] crbug.com/591099 css3/selectors3/xml/css3-modsel-167.xml [ Failure ] crbug.com/591099 css3/selectors3/xml/css3-modsel-167a.xml [ Failure ] -crbug.com/591099 css3/selectors3/xml/css3-modsel-168.xml [ Failure ] -crbug.com/591099 css3/selectors3/xml/css3-modsel-168a.xml [ Failure ] -crbug.com/591099 css3/selectors3/xml/css3-modsel-169.xml [ Failure ] -crbug.com/591099 css3/selectors3/xml/css3-modsel-169a.xml [ Failure ] +crbug.com/591099 css3/selectors3/xml/css3-modsel-168.xml [ Failure Pass ] +crbug.com/591099 css3/selectors3/xml/css3-modsel-168a.xml [ Failure Pass ] +crbug.com/591099 css3/selectors3/xml/css3-modsel-169.xml [ Failure Pass ] +crbug.com/591099 css3/selectors3/xml/css3-modsel-169a.xml [ Failure Pass ] crbug.com/591099 css3/selectors3/xml/css3-modsel-179a.xml [ Failure ] crbug.com/591099 css3/selectors3/xml/css3-modsel-18.xml [ Failure ] crbug.com/591099 css3/selectors3/xml/css3-modsel-180a.xml [ Failure ] crbug.com/591099 css3/selectors3/xml/css3-modsel-18b.xml [ Failure ] -crbug.com/591099 css3/selectors3/xml/css3-modsel-18c.xml [ Failure ] +crbug.com/591099 css3/selectors3/xml/css3-modsel-18c.xml [ Failure Pass ] crbug.com/591099 css3/selectors3/xml/css3-modsel-19.xml [ Failure ] crbug.com/591099 css3/selectors3/xml/css3-modsel-20.xml [ Failure ] crbug.com/591099 css3/selectors3/xml/css3-modsel-23.xml [ Failure ] crbug.com/591099 css3/selectors3/xml/css3-modsel-24.xml [ Failure ] -crbug.com/591099 css3/selectors3/xml/css3-modsel-25.xml [ Failure ] -crbug.com/591099 css3/selectors3/xml/css3-modsel-32.xml [ Failure ] +crbug.com/591099 css3/selectors3/xml/css3-modsel-25.xml [ Failure Pass ] +crbug.com/591099 css3/selectors3/xml/css3-modsel-32.xml [ Failure Pass ] crbug.com/591099 css3/selectors3/xml/css3-modsel-33.xml [ Failure ] crbug.com/591099 css3/selectors3/xml/css3-modsel-34.xml [ Failure ] crbug.com/591099 css3/selectors3/xml/css3-modsel-38.xml [ Failure ] @@ -667,7 +667,7 @@ crbug.com/591099 css3/selectors3/xml/css3-modsel-68.xml [ Failure ] crbug.com/591099 css3/selectors3/xml/css3-modsel-69.xml [ Failure ] crbug.com/591099 css3/selectors3/xml/css3-modsel-7.xml [ Failure ] -crbug.com/591099 css3/selectors3/xml/css3-modsel-70.xml [ Failure ] +crbug.com/591099 css3/selectors3/xml/css3-modsel-70.xml [ Failure Pass ] crbug.com/591099 css3/selectors3/xml/css3-modsel-8.xml [ Failure ] crbug.com/591099 css3/selectors3/xml/css3-modsel-80.xml [ Failure ] crbug.com/591099 css3/selectors3/xml/css3-modsel-9.xml [ Failure ] @@ -705,18 +705,18 @@ crbug.com/591099 editing/execCommand/5190926.html [ Failure ] crbug.com/591099 editing/execCommand/5569741.html [ Failure ] crbug.com/591099 editing/execCommand/align-in-span.html [ Failure ] -crbug.com/805784 editing/execCommand/dispatch-text-event-crash.html [ Crash ] +crbug.com/805784 editing/execCommand/dispatch-text-event-crash.html [ Crash Pass ] crbug.com/591099 editing/execCommand/findString.html [ Failure ] crbug.com/591099 editing/execCommand/format-block-multiple-paragraphs-in-pre.html [ Failure ] crbug.com/591099 editing/execCommand/format-block-multiple-paragraphs.html [ Failure ] crbug.com/591099 editing/execCommand/insertImage.html [ Failure ] -crbug.com/591099 editing/execCommand/insertNewLineInQuotedContent-outside-quote.html [ Failure ] +crbug.com/591099 editing/execCommand/insertNewLineInQuotedContent-outside-quote.html [ Failure Pass ] crbug.com/591099 editing/execCommand/outdent-multiparagraph-list.html [ Failure ] crbug.com/591099 editing/execCommand/query-command-state.html [ Timeout ] crbug.com/591099 editing/execCommand/query-format-block.html [ Timeout ] crbug.com/591099 editing/execCommand/queryCommandState-02.html [ Failure ] crbug.com/591099 editing/execCommand/remove-list-from-range-selection.html [ Failure ] -crbug.com/591099 editing/execCommand/replaceSelectorCommand-crash.html [ Crash ] +crbug.com/591099 editing/execCommand/replaceSelectorCommand-crash.html [ Crash Pass ] crbug.com/591099 editing/input/linux_rtl_composition_underline.html [ Failure ] crbug.com/591099 editing/inserting/4840662.html [ Failure ] crbug.com/591099 editing/inserting/4875189-1.html [ Failure ] @@ -795,7 +795,7 @@ crbug.com/591099 editing/selection/caret-at-bidi-boundary.html [ Failure ] crbug.com/591099 editing/selection/caret-ltr-right.html [ Failure ] crbug.com/591099 editing/selection/caret-ltr.html [ Failure ] -crbug.com/591099 editing/selection/clear-selection-crash.html [ Crash ] +crbug.com/591099 editing/selection/clear-selection-crash.html [ Crash Pass ] crbug.com/591099 editing/selection/continuations-with-move-caret-to-boundary.html [ Failure ] crbug.com/591099 editing/selection/continuations-without-move-caret-to-boundary.html [ Failure ] crbug.com/805301 editing/selection/designmode-no-caret.html [ Failure ] @@ -822,7 +822,7 @@ crbug.com/591099 editing/selection/home-end.html [ Timeout ] crbug.com/591099 editing/selection/inactive-selection.html [ Failure ] crbug.com/591099 editing/selection/inline-closest-leaf-child.html [ Failure ] -crbug.com/591099 editing/selection/keydown-without-selection-crash.html [ Crash ] +crbug.com/591099 editing/selection/keydown-without-selection-crash.html [ Crash Pass ] crbug.com/591099 editing/selection/line-wrap-2.html [ Failure ] crbug.com/591099 editing/selection/linux_selection_color.html [ Failure ] crbug.com/591099 editing/selection/mixed-editability-1.html [ Failure ] @@ -865,9 +865,9 @@ crbug.com/591099 editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-2.html [ Failure ] crbug.com/591099 editing/selection/select-text-overflow-ellipsis-mixed-in-rtl.html [ Failure ] crbug.com/591099 editing/selection/select-text-overflow-ellipsis.html [ Failure ] -crbug.com/591099 editing/selection/select_all/select_all_details_crash.html [ Failure ] +crbug.com/591099 editing/selection/select_all/select_all_details_crash.html [ Failure Pass ] crbug.com/591099 editing/selection/selection-button-text.html [ Failure ] -crbug.com/591099 editing/selection/selection-in-iframe-removed-crash.html [ Crash ] +crbug.com/591099 editing/selection/selection-in-iframe-removed-crash.html [ Crash Pass ] crbug.com/591099 editing/selection/selection-invalid-offset.html [ Failure ] crbug.com/591099 editing/selection/shift-click.html [ Failure ] crbug.com/714962 editing/selection/skip-over-contenteditable.html [ Failure ] @@ -876,9 +876,9 @@ crbug.com/591099 editing/selection/user-select/user-select-all.html [ Failure ] crbug.com/591099 editing/selection/word-granularity.html [ Failure ] crbug.com/714962 editing/shadow/compare-positions-in-nested-shadow.html [ Failure ] -crbug.com/591099 editing/spelling/design-mode-spellcheck-off.html [ Failure ] +crbug.com/591099 editing/spelling/design-mode-spellcheck-off.html [ Failure Pass ] crbug.com/591099 editing/style/5228141.html [ Failure ] -crbug.com/805784 editing/style/apply-style-crash2.html [ Crash ] +crbug.com/805784 editing/style/apply-style-crash2.html [ Crash Pass ] crbug.com/591099 editing/style/block-styles-007.html [ Failure ] crbug.com/591099 editing/text-iterator/findString-start-search-after-selection.html [ Failure ] crbug.com/591099 editing/text-iterator/findString.html [ Timeout ] @@ -909,7 +909,7 @@ crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures_RSA-PSS.worker.html [ Timeout ] crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures_RSASSA-PKCS1-v1_5.worker.html [ Timeout ] crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/successes.worker.html [ Timeout ] -crbug.com/591099 external/wpt/WebCryptoAPI/import_export/rsa_importKey.https.worker.html [ Pass Timeout ] +crbug.com/591099 external/wpt/WebCryptoAPI/import_export/rsa_importKey.https.worker.html [ Timeout ] crbug.com/591099 external/wpt/WebCryptoAPI/import_export/rsa_importKey.worker.html [ Timeout ] crbug.com/709227 external/wpt/WebCryptoAPI/import_export/symmetric_importKey.worker.html [ Failure ] crbug.com/714962 external/wpt/WebCryptoAPI/import_export/test_rsa_importKey.https.html [ Pass Timeout ] @@ -936,8 +936,8 @@ crbug.com/714962 external/wpt/css/css-backgrounds/background-attachment-local/attachment-local-clipping-image-5.html [ Failure ] crbug.com/714962 external/wpt/css/css-backgrounds/background-image-003.html [ Failure ] crbug.com/714962 external/wpt/css/css-backgrounds/background-image-004.html [ Failure Pass ] -crbug.com/714962 external/wpt/css/css-backgrounds/background-image-005.html [ Failure ] -crbug.com/714962 external/wpt/css/css-backgrounds/background-image-006.html [ Failure ] +crbug.com/714962 external/wpt/css/css-backgrounds/background-image-005.html [ Failure Pass ] +crbug.com/714962 external/wpt/css/css-backgrounds/background-image-006.html [ Failure Pass ] crbug.com/591099 external/wpt/css/css-backgrounds/box-shadow-syntax-001.xht [ Failure ] crbug.com/591099 external/wpt/css/css-display/display-contents-details.html [ Crash ] crbug.com/714962 external/wpt/css/css-display/display-contents-dynamic-before-after-001.html [ Failure ] @@ -1342,9 +1342,9 @@ crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-033.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-035.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-037.xht [ Failure ] -crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-039.xht [ Failure ] +crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-039.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-041.xht [ Failure ] -crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-043.xht [ Failure Pass ] +crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-043.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-045.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-047.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-049.xht [ Failure Pass ] @@ -1354,8 +1354,8 @@ crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-057.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-059.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-061.xht [ Failure ] -crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-063.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-065.xht [ Failure Pass ] +crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-063.xht [ Failure Pass ] +crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-065.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-067.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-069.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-071.xht [ Failure ] @@ -1365,11 +1365,11 @@ crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-079.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-081.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-083.xht [ Failure ] -crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-085.xht [ Failure Pass ] +crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-085.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-087.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-089.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-091.xht [ Failure ] -crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-093.xht [ Failure Pass ] +crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-093.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-095.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-097.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-103.xht [ Failure ] @@ -1401,7 +1401,7 @@ crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-155.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-157.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-159.xht [ Failure ] -crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-161.xht [ Failure ] +crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-161.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-163.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-165.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-167.xht [ Failure ] @@ -1409,7 +1409,7 @@ crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-171.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-173.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-175.xht [ Failure ] -crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-177.xht [ Failure ] +crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-177.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-179.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-181.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-183.xht [ Failure Pass ] @@ -1426,7 +1426,7 @@ crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-205.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-207.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-209.xht [ Failure Pass ] -crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-211.xht [ Failure Pass ] +crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-211.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-213.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-215.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-217.xht [ Failure ] @@ -1434,7 +1434,7 @@ crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-221.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-223.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-225.xht [ Failure ] -crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-227.xht [ Failure ] +crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-227.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-229.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-002.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-004.xht [ Failure ] @@ -1473,7 +1473,7 @@ crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-070.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-072.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-074.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-076.xht [ Failure ] +crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-076.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-078.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-080.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-082.xht [ Failure ] @@ -1516,18 +1516,18 @@ crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-160.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-162.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-164.xht [ Failure ] -crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-166.xht [ Failure Pass ] +crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-166.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-168.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-170.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-172.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-174.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-176.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-178.xht [ Failure ] -crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-180.xht [ Failure Pass ] +crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-180.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-182.xht [ Failure Pass ] -crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-184.xht [ Failure Pass ] +crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-184.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-186.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-188.xht [ Failure Pass ] +crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-188.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-190.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-192.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-194.xht [ Failure ] @@ -1574,7 +1574,7 @@ crbug.com/714962 external/wpt/css/css-writing-modes/direction-vlr-003.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/direction-vlr-005.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/direction-vrl-002.xht [ Failure Pass ] -crbug.com/714962 external/wpt/css/css-writing-modes/direction-vrl-004.xht [ Failure ] +crbug.com/714962 external/wpt/css/css-writing-modes/direction-vrl-004.xht [ Failure Pass ] crbug.com/591099 external/wpt/css/css-writing-modes/float-contiguous-vrl-002.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/float-contiguous-vrl-004.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/float-contiguous-vrl-006.xht [ Failure ] @@ -1661,16 +1661,16 @@ crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-003.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-005.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-007.xht [ Failure ] -crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-009.xht [ Failure Pass ] +crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-009.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/text-align-vlr-011.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-013.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-015.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-017.xht [ Failure Pass ] -crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-019.xht [ Failure Pass ] +crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-019.xht [ Failure ] crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-002.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-004.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-006.xht [ Failure Pass ] -crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-008.xht [ Failure ] +crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-008.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-010.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-012.xht [ Failure Pass ] crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-014.xht [ Failure ] @@ -1938,6 +1938,7 @@ crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-003.html [ Failure ] crbug.com/591099 external/wpt/html/semantics/interactive-elements/the-dialog-element/abspos-dialog-layout.html [ Failure ] crbug.com/591099 external/wpt/html/semantics/interactive-elements/the-dialog-element/centering.html [ Crash ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/078.html [ Timeout ] crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html [ Pass ] crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports.html [ Pass ] crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html [ Pass ] @@ -2020,8 +2021,7 @@ crbug.com/591099 external/wpt/svg/interfaces.html [ Timeout ] crbug.com/591099 external/wpt/svg/linking/reftests/href-filter-element.html [ Failure ] crbug.com/591099 external/wpt/svg/path/bearing/absolute.svg [ Pass ] -crbug.com/591099 external/wpt/uievents/order-of-events/focus-events/focus-manual.html [ Timeout ] -crbug.com/591099 external/wpt/url/url-setters.html [ Pass Timeout ] +crbug.com/591099 external/wpt/url/url-setters.html [ Timeout ] crbug.com/591099 external/wpt/wasm/wasm_local_iframe_test.html [ Failure ] crbug.com/591099 external/wpt/webmessaging/broadcastchannel/sandbox.html [ Failure ] crbug.com/591099 external/wpt/webrtc/interfaces.html [ Pass Timeout ] @@ -2162,8 +2162,6 @@ crbug.com/591099 fast/block/float/float-avoidance.html [ Failure ] crbug.com/591099 fast/block/float/float-in-float-hit-testing.html [ Failure ] crbug.com/591099 fast/block/float/float-in-float-painting.html [ Failure ] -crbug.com/591099 fast/block/float/float-should-dirty-line-when-adjacent-to-line-breaks-2.html [ Failure Pass ] -crbug.com/591099 fast/block/float/float-should-dirty-line-when-adjacent-to-line-breaks.html [ Failure Pass ] crbug.com/591099 fast/block/float/floats-offset-image-strict-line-height.html [ Failure ] crbug.com/591099 fast/block/float/floats-offset-inline-block-strict-line-height.html [ Failure ] crbug.com/591099 fast/block/float/negative-margin-on-element-avoiding-floats-with-margin-on-parent.html [ Failure ] @@ -2278,25 +2276,25 @@ crbug.com/591099 fast/clip/overflow-border-radius-composited.html [ Failure ] crbug.com/591099 fast/clip/overflow-border-radius-fixed-position.html [ Failure ] crbug.com/591099 fast/clip/overflow-border-radius-transformed.html [ Failure ] -crbug.com/591099 fast/compact/002.html [ Failure ] +crbug.com/591099 fast/compact/002.html [ Failure Pass ] crbug.com/591099 fast/compact/003.html [ Failure ] crbug.com/591099 fast/constructors/blob-sparse-array-assertion-failure.html [ Failure ] crbug.com/591099 fast/css-generated-content/001.html [ Failure ] crbug.com/591099 fast/css-generated-content/002.html [ Failure ] -crbug.com/591099 fast/css-generated-content/005.html [ Failure ] +crbug.com/591099 fast/css-generated-content/005.html [ Failure Pass ] crbug.com/591099 fast/css-generated-content/007.html [ Failure ] crbug.com/591099 fast/css-generated-content/008.html [ Failure ] crbug.com/591099 fast/css-generated-content/009.html [ Failure ] crbug.com/591099 fast/css-generated-content/010.html [ Failure ] crbug.com/591099 fast/css-generated-content/012.html [ Failure ] crbug.com/591099 fast/css-generated-content/013.html [ Failure ] -crbug.com/591099 fast/css-generated-content/014.html [ Failure ] +crbug.com/591099 fast/css-generated-content/014.html [ Failure Pass ] crbug.com/591099 fast/css-generated-content/015.html [ Failure ] -crbug.com/591099 fast/css-generated-content/016.html [ Failure ] +crbug.com/591099 fast/css-generated-content/016.html [ Failure Pass ] crbug.com/591099 fast/css-generated-content/after-duplicated-after-split.html [ Failure ] crbug.com/591099 fast/css-generated-content/after-order.html [ Failure ] crbug.com/591099 fast/css-generated-content/before-with-first-letter.html [ Failure ] -crbug.com/591099 fast/css-generated-content/beforeAfter-interdocument.html [ Failure ] +crbug.com/591099 fast/css-generated-content/beforeAfter-interdocument.html [ Failure Pass ] crbug.com/805301 fast/css-generated-content/crash-selection-editing-removes-pseudo.html [ Failure ] crbug.com/591099 fast/css-generated-content/empty-first-letter-with-columns-crash.html [ Crash ] crbug.com/591099 fast/css-generated-content/first-letter-in-nested-before-table.html [ Failure ] @@ -2316,7 +2314,7 @@ crbug.com/591099 fast/css-generated-content/table-row-with-before.html [ Failure ] crbug.com/591099 fast/css-generated-content/table-table-before-after-child-add.html [ Failure ] crbug.com/591099 fast/css-generated-content/table-with-before.html [ Failure ] -crbug.com/591099 fast/css-generated-content/visibleContentHiddenParent.html [ Failure ] +crbug.com/591099 fast/css-generated-content/visibleContentHiddenParent.html [ Failure Pass ] crbug.com/591099 fast/css-generated-content/wbr-with-before-content.html [ Failure ] crbug.com/591099 fast/css-grid-layout/auto-content-resolution-columns.html [ Failure ] crbug.com/591099 fast/css-grid-layout/breadth-size-resolution-grid.html [ Failure ] @@ -2497,8 +2495,8 @@ crbug.com/714962 fast/css/first-letter-hover-hit-test.html [ Failure ] crbug.com/591099 fast/css/first-letter-hover.html [ Failure ] crbug.com/714962 fast/css/first-letter-range-insert.html [ Failure ] -crbug.com/591099 fast/css/first-letter-recalculation.html [ Failure ] -crbug.com/591099 fast/css/first-letter-text-fragment-crash.html [ Failure ] +crbug.com/591099 fast/css/first-letter-recalculation.html [ Failure Pass ] +crbug.com/591099 fast/css/first-letter-text-fragment-crash.html [ Failure Pass ] crbug.com/591099 fast/css/first-letter-visibility.html [ Failure ] crbug.com/714962 fast/css/first-line-change-color-direct.html [ Failure ] crbug.com/714962 fast/css/first-line-change-color.html [ Failure ] @@ -2563,7 +2561,7 @@ crbug.com/591099 fast/css/list-outline.html [ Failure ] crbug.com/591099 fast/css/margin-top-bottom-dynamic.html [ Failure ] crbug.com/591099 fast/css/marquee-in-template.html [ Failure ] -crbug.com/591099 fast/css/namespaces/006.xml [ Failure ] +crbug.com/591099 fast/css/namespaces/006.xml [ Failure Pass ] crbug.com/591099 fast/css/negative-leading.html [ Failure ] crbug.com/591099 fast/css/negative-nth-child.html [ Failure ] crbug.com/591099 fast/css/negative-text-indent-in-inline-block.html [ Failure ] @@ -2582,7 +2580,7 @@ crbug.com/591099 fast/css/percent-width-img-src-change.html [ Failure ] crbug.com/591099 fast/css/percentage-non-integer.html [ Failure ] crbug.com/591099 fast/css/positioned-overflow-scroll.html [ Failure ] -crbug.com/591099 fast/css/pseudo-element-line-break.html [ Failure ] +crbug.com/591099 fast/css/pseudo-element-line-break.html [ Failure Pass ] crbug.com/591099 fast/css/pseudo-first-line-border-width.html [ Failure ] crbug.com/591099 fast/css/pseudo-in-range-invalid-value.html [ Failure ] crbug.com/591099 fast/css/pseudo-in-range.html [ Failure ] @@ -2605,7 +2603,7 @@ crbug.com/591099 fast/css/rtl-to-viewport.html [ Failure ] crbug.com/591099 fast/css/selector-set-attribute.html [ Failure ] crbug.com/591099 fast/css/shadow-multiple.html [ Failure ] -crbug.com/591099 fast/css/sticky/inline-sticky-abspos-child.html [ Failure ] +crbug.com/591099 fast/css/sticky/inline-sticky-abspos-child.html [ Failure Pass ] crbug.com/591099 fast/css/sticky/replaced-sticky.html [ Pass ] crbug.com/591099 fast/css/sticky/sticky-style-change.html [ Pass ] crbug.com/591099 fast/css/sticky/sticky-top-overflow-scroll-by-fragment.html [ Failure ] @@ -2710,7 +2708,6 @@ crbug.com/591099 fast/dom/Window/window-lookup-precedence.html [ Timeout ] crbug.com/591099 fast/dom/Window/window-open-pending-url.html [ Failure ] crbug.com/591099 fast/dom/Window/window-postmessage-clone-deep-array.html [ Failure ] -crbug.com/714962 fast/dom/Window/window-postmessage-clone.html [ Failure Pass ] crbug.com/591099 fast/dom/Window/window-resize-contents.html [ Failure ] crbug.com/591099 fast/dom/anchor-toString.html [ Failure ] crbug.com/714962 fast/dom/anchor-without-content.html [ Failure ] @@ -2775,7 +2772,7 @@ crbug.com/591099 fast/dynamic/insertAdjacentHTML.html [ Failure ] crbug.com/591099 fast/dynamic/insertAdjacentText.html [ Failure ] crbug.com/591099 fast/dynamic/layer-hit-test-crash.html [ Failure ] -crbug.com/591099 fast/dynamic/link-href-change.html [ Failure ] +crbug.com/591099 fast/dynamic/link-href-change.html [ Failure Pass ] crbug.com/591099 fast/dynamic/noninlinebadness.html [ Failure ] crbug.com/591099 fast/dynamic/outerHTML-doc.html [ Failure ] crbug.com/591099 fast/dynamic/outerHTML-img.html [ Failure ] @@ -2804,7 +2801,7 @@ crbug.com/591099 fast/events/check-defocus-event-order-when-triggered-by-mouse-click.html [ Failure ] crbug.com/591099 fast/events/check-defocus-event-order-when-triggered-by-tab.html [ Failure ] crbug.com/714962 fast/events/document-elementFromPoint.html [ Failure ] -crbug.com/591099 fast/events/dom-character-data-modified-textarea-crash.html [ Crash ] +crbug.com/591099 fast/events/dom-character-data-modified-textarea-crash.html [ Crash Pass ] crbug.com/714962 fast/events/drag-in-frames.html [ Failure ] crbug.com/591099 fast/events/drag-selects-image.html [ Failure ] crbug.com/714962 fast/events/event-on-culled_inline.html [ Failure ] @@ -2818,7 +2815,7 @@ crbug.com/591099 fast/events/keypress-focus-change.html [ Failure ] crbug.com/591099 fast/events/media-element-focus-tab.html [ Failure ] crbug.com/591099 fast/events/menu-key-context-menu-document-pinch-zoom.html [ Failure ] -crbug.com/714962 fast/events/middleClickAutoscroll-latching.html [ Timeout ] +crbug.com/714962 fast/events/middleClickAutoscroll-latching.html [ Pass Timeout ] crbug.com/714962 fast/events/mouse-down-on-pseudo-element-remove-crash.html [ Failure ] crbug.com/591099 fast/events/mouse-drag-from-frame-to-other-frame.html [ Failure ] crbug.com/591099 fast/events/mouse-event-buttons-attribute.html [ Timeout ] @@ -2849,7 +2846,7 @@ crbug.com/591099 fast/events/selectstart-by-double-triple-clicks.html [ Failure ] crbug.com/591099 fast/events/selectstart-by-single-click-with-shift.html [ Failure ] crbug.com/591099 fast/events/sequential-focus-navigation-starting-point.html [ Failure ] -crbug.com/591099 fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Failure ] +crbug.com/591099 fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Failure Pass ] crbug.com/591099 fast/events/submit-reset-nested-bubble.html [ Failure ] crbug.com/591099 fast/events/tab-imagemap.html [ Failure ] crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-scroll.html [ Failure ] @@ -2885,7 +2882,7 @@ crbug.com/591099 fast/forms/button/button-in-forms-collection.html [ Failure ] crbug.com/591099 fast/forms/button/button-inner-block-reuse.html [ Failure ] crbug.com/591099 fast/forms/button/button-type-change.html [ Failure ] -crbug.com/591099 fast/forms/calendar-picker/calendar-picker-key-operations.html [ Pass Timeout ] +crbug.com/591099 fast/forms/calendar-picker/calendar-picker-key-operations.html [ Timeout ] crbug.com/714962 fast/forms/calendar-picker/calendar-picker-mouse-operations.html [ Failure ] crbug.com/591099 fast/forms/calendar-picker/month-picker-key-operations.html [ Timeout ] crbug.com/714962 fast/forms/calendar-picker/month-picker-mouse-operations.html [ Failure ] @@ -3699,8 +3696,8 @@ crbug.com/591099 fast/parser/broken-comments-vs-parsing-mode.html [ Failure ] crbug.com/591099 fast/parser/entities-in-html.html [ Failure ] crbug.com/591099 fast/parser/entities-in-xhtml.xhtml [ Failure ] -crbug.com/591099 fast/parser/fonts.html [ Failure ] -crbug.com/591099 fast/parser/nested-fragment-parser-crash.html [ Crash ] +crbug.com/591099 fast/parser/fonts.html [ Failure Pass ] +crbug.com/591099 fast/parser/nested-fragment-parser-crash.html [ Crash Pass ] crbug.com/591099 fast/parser/nofoo-tags-inside-paragraph.html [ Failure ] crbug.com/591099 fast/parser/noscript-with-javascript-disabled.html [ Failure ] crbug.com/591099 fast/parser/stray-end-tags-with-attributes-002-alt-quirks.html [ Failure ] @@ -3791,7 +3788,7 @@ crbug.com/591099 fast/selectors/019.html [ Failure ] crbug.com/591099 fast/selectors/020.html [ Failure ] crbug.com/591099 fast/selectors/021.html [ Failure ] -crbug.com/591099 fast/selectors/032.html [ Failure ] +crbug.com/591099 fast/selectors/032.html [ Failure Pass ] crbug.com/591099 fast/selectors/034.html [ Failure ] crbug.com/591099 fast/selectors/038.html [ Failure ] crbug.com/591099 fast/selectors/039.html [ Failure ] @@ -3804,10 +3801,10 @@ crbug.com/591099 fast/selectors/166.html [ Failure ] crbug.com/591099 fast/selectors/167.html [ Failure ] crbug.com/591099 fast/selectors/167a.html [ Failure ] -crbug.com/591099 fast/selectors/168.html [ Failure ] -crbug.com/591099 fast/selectors/168a.html [ Failure ] -crbug.com/591099 fast/selectors/169.html [ Failure ] -crbug.com/591099 fast/selectors/169a.html [ Failure ] +crbug.com/591099 fast/selectors/168.html [ Failure Pass ] +crbug.com/591099 fast/selectors/168a.html [ Failure Pass ] +crbug.com/591099 fast/selectors/169.html [ Failure Pass ] +crbug.com/591099 fast/selectors/169a.html [ Failure Pass ] crbug.com/591099 fast/selectors/placeholder-shown-sibling-style-update.html [ Failure ] crbug.com/591099 fast/selectors/placeholder-shown-style-update.html [ Failure ] crbug.com/591099 fast/selectors/unqualified-hover-quirks.html [ Failure ] @@ -4013,7 +4010,7 @@ crbug.com/714962 fast/table/table-cell-before-child-in-block.html [ Failure ] crbug.com/714962 fast/table/table-cell-before-child-in-table.html [ Failure ] crbug.com/591099 fast/table/table-display-types-vertical.html [ Failure ] -crbug.com/591099 fast/table/table-overflow-crash.html [ Failure ] +crbug.com/591099 fast/table/table-overflow-crash.html [ Failure Pass ] crbug.com/591099 fast/table/table-parts-not-ortho-writing-mode-root.html [ Failure ] crbug.com/714962 fast/table/table-row-after-child-in-block.html [ Failure ] crbug.com/714962 fast/table/table-row-before-after-content-around-block.html [ Failure ] @@ -4093,7 +4090,7 @@ crbug.com/591099 fast/text/chromium-linux-fontconfig-renderstyle.html [ Failure ] crbug.com/591099 fast/text/complex-text-opacity.html [ Failure ] crbug.com/591099 fast/text/container-align-with-inlines.html [ Failure ] -crbug.com/714962 fast/text/content-following-inline-isolate-with-collapsed-whitespace.html [ Failure ] +crbug.com/714962 fast/text/content-following-inline-isolate-with-collapsed-whitespace.html [ Failure Pass ] crbug.com/591099 fast/text/decorations-transformed.html [ Failure ] crbug.com/591099 fast/text/decorations-with-text-combine.html [ Failure ] crbug.com/591099 fast/text/ellipsis-in-absolute-block.html [ Failure ] @@ -4111,7 +4108,7 @@ crbug.com/591099 fast/text/emphasis-ellipsis-complextext.html [ Failure ] crbug.com/591099 fast/text/emphasis-overlap.html [ Failure ] crbug.com/591099 fast/text/find-kana.html [ Timeout ] -crbug.com/714962 fast/text/fractional-word-and-letter-spacing-with-kerning.html [ Failure ] +crbug.com/714962 fast/text/fractional-word-and-letter-spacing-with-kerning.html [ Failure Pass ] crbug.com/714962 fast/text/get-client-rects-grapheme.html [ Failure ] crbug.com/714962 fast/text/glyph-reordering.html [ Failure ] crbug.com/591099 fast/text/hide-atomic-inlines-after-ellipsis.html [ Failure ] @@ -4158,7 +4155,7 @@ crbug.com/591099 fast/text/place-rtl-ellipsis-in-inline-blocks-align-left.html [ Failure ] crbug.com/591099 fast/text/place-rtl-ellipsis-in-inline-blocks-align-right.html [ Failure ] crbug.com/591099 fast/text/place-rtl-ellipsis-in-inline-blocks.html [ Failure ] -crbug.com/591099 fast/text/regional-indicator-symobls.html [ Failure ] +crbug.com/591099 fast/text/regional-indicator-symobls.html [ Failure Pass ] crbug.com/714962 fast/text/remove-zero-length-run.html [ Failure ] crbug.com/714962 fast/text/selection/atsui-rtl-override-selection.html [ Failure ] crbug.com/714962 fast/text/selection/flexbox-selection-nested.html [ Failure ] @@ -4525,7 +4522,7 @@ crbug.com/591099 http/tests/security/local-JavaScript-from-remote.html [ Failure ] crbug.com/591099 http/tests/security/local-iFrame-from-remote.html [ Failure ] crbug.com/591099 http/tests/security/local-image-from-remote.html [ Failure ] -crbug.com/591099 http/tests/security/setDomainRelaxationForbiddenForURLScheme.html [ Crash Pass ] +crbug.com/591099 http/tests/security/setDomainRelaxationForbiddenForURLScheme.html [ Crash ] crbug.com/591099 http/tests/security/shape-image-cors-allow-origin.html [ Failure ] crbug.com/591099 http/tests/security/shape-image-cors-data-url.html [ Failure ] crbug.com/591099 http/tests/security/shape-image-cors-same-origin.html [ Failure ] @@ -4675,7 +4672,7 @@ crbug.com/591099 paint/high-contrast-mode/image-filter-all/text-on-backgrounds.html [ Failure ] crbug.com/714962 paint/inline/floating-inline.html [ Crash ] crbug.com/591099 paint/inline/focus-ring-under-absolute-with-relative-continuation.html [ Failure ] -crbug.com/591099 paint/inline/outline-offset.html [ Failure ] +crbug.com/591099 paint/inline/outline-offset.html [ Failure Pass ] crbug.com/591099 paint/invalidation/4776765.html [ Failure ] crbug.com/591099 paint/invalidation/background/background-image-paint-invalidation-large-abspos-div.html [ Failure ] crbug.com/591099 paint/invalidation/background/backgroundSizeRepaint.html [ Failure ] @@ -4801,8 +4798,8 @@ crbug.com/591099 paint/invalidation/outline/inline-focus.html [ Failure ] crbug.com/591099 paint/invalidation/outline/inline-outline-repaint-2.html [ Failure ] crbug.com/591099 paint/invalidation/outline/inline-outline-repaint.html [ Failure ] -crbug.com/591099 paint/invalidation/outline/layer-outline-horizontal.html [ Failure ] -crbug.com/591099 paint/invalidation/outline/layer-outline.html [ Failure ] +crbug.com/591099 paint/invalidation/outline/layer-outline-horizontal.html [ Failure Pass ] +crbug.com/591099 paint/invalidation/outline/layer-outline.html [ Failure Pass ] crbug.com/591099 paint/invalidation/outline/outline-change-continuations.html [ Failure ] crbug.com/591099 paint/invalidation/outline/outline-change-invalidation.html [ Failure ] crbug.com/591099 paint/invalidation/outline/outline-change-vertical-rl.html [ Failure ] @@ -5036,7 +5033,7 @@ crbug.com/591099 paint/overflow/fixed-background-scroll-window.html [ Pass ] crbug.com/591099 paint/pagination/composited-paginated-inline.html [ Failure ] crbug.com/591099 paint/pagination/pagination-change-clip-crash.html [ Failure ] -crbug.com/591099 paint/selection/drag-caret.html [ Crash ] +crbug.com/591099 paint/selection/drag-caret.html [ Crash Pass ] crbug.com/714962 paint/selection/text-selection-drag.html [ Failure ] crbug.com/591099 paint/selection/text-selection-inline-block-rtl.html [ Failure ] crbug.com/591099 paint/selection/text-selection-inline-block.html [ Failure ] @@ -5124,7 +5121,7 @@ crbug.com/591099 storage/indexeddb/cursor-advance.html [ Pass Timeout ] crbug.com/591099 storage/indexeddb/cursor-continue-validity.html [ Timeout ] crbug.com/591099 storage/indexeddb/cursor-key-order.html [ Timeout ] -crbug.com/591099 storage/indexeddb/cursor-update.html [ Timeout ] +crbug.com/591099 storage/indexeddb/cursor-update.html [ Pass Timeout ] crbug.com/591099 storage/indexeddb/deleted-objects.html [ Timeout ] crbug.com/591099 storage/indexeddb/exceptions.html [ Timeout ] crbug.com/591099 storage/indexeddb/index-cursor.html [ Timeout ] @@ -5195,7 +5192,7 @@ crbug.com/591099 svg/custom/use-font-face-crash.svg [ Failure ] crbug.com/714962 svg/dom/SVGStringList-basics.xhtml [ Failure ] crbug.com/591099 svg/dom/svg-root-lengths.html [ Failure ] -crbug.com/591099 svg/dom/svgangle-units.html [ Pass Timeout ] +crbug.com/591099 svg/dom/svgangle-units.html [ Timeout ] crbug.com/591099 svg/filters/feTurbulence-bad-seeds.html [ Failure ] crbug.com/591099 svg/foreign-object-under-shadow-root-under-hidden.html [ Failure ] crbug.com/591099 svg/foreignObject/svg-document-in-html-document.svg [ Failure ] @@ -5221,7 +5218,7 @@ crbug.com/591099 svg/text/foreignObject-text-clipping-bug.xml [ Failure ] crbug.com/714962 svg/text/layout-inline-children-assert.html [ Failure ] crbug.com/714962 svg/text/select-text-svgfont.html [ Failure ] -crbug.com/591099 svg/text/text-layout-crash.html [ Failure ] +crbug.com/591099 svg/text/text-layout-crash.html [ Failure Pass ] crbug.com/591099 svg/text/text-repaint-rects.xhtml [ Failure ] crbug.com/714962 svg/text/tspan-multiple-outline.svg [ Failure ] crbug.com/591099 svg/transforms/svg-css-transforms-clip-path.xhtml [ Failure ] @@ -5457,7 +5454,7 @@ crbug.com/714962 transforms/selection-bounds-in-transformed-view.html [ Failure ] crbug.com/591099 transforms/shadows.html [ Failure ] crbug.com/591099 transforms/svg-vs-css.xhtml [ Failure ] -crbug.com/591099 transforms/transform-on-inline.html [ Failure ] +crbug.com/591099 transforms/transform-on-inline.html [ Failure Pass ] crbug.com/591099 transforms/transform-positioned-ancestor.html [ Failure ] crbug.com/591099 transforms/transformed-caret.html [ Failure ] crbug.com/591099 transforms/transforms-with-zoom.html [ Failure ] @@ -5579,7 +5576,7 @@ crbug.com/591099 virtual/mouseevent_fractional/fast/events/check-defocus-event-order-when-triggered-by-mouse-click.html [ Failure ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/check-defocus-event-order-when-triggered-by-tab.html [ Failure ] crbug.com/714962 virtual/mouseevent_fractional/fast/events/document-elementFromPoint.html [ Failure ] -crbug.com/591099 virtual/mouseevent_fractional/fast/events/dom-character-data-modified-textarea-crash.html [ Crash ] +crbug.com/591099 virtual/mouseevent_fractional/fast/events/dom-character-data-modified-textarea-crash.html [ Crash Pass ] crbug.com/714962 virtual/mouseevent_fractional/fast/events/drag-in-frames.html [ Failure ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/drag-on-removed-slider-does-not-crash.html [ Pass ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/drag-selects-image.html [ Failure ] @@ -5611,7 +5608,7 @@ crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-capture-transition-events.html [ Timeout ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-capture.html [ Timeout ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-preventdefault.html [ Timeout ] -crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/multi-pointer-preventdefault.html [ Pass Timeout ] +crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/multi-pointer-preventdefault.html [ Timeout ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/touch-capture-in-iframe.html [ Timeout ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/touch-capture.html [ Timeout ] crbug.com/714962 virtual/mouseevent_fractional/fast/events/pointerevents/touch-pointer-events.html [ Pass Timeout ] @@ -5624,13 +5621,12 @@ crbug.com/591099 virtual/mouseevent_fractional/fast/events/selectstart-by-double-triple-clicks.html [ Failure ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/selectstart-by-single-click-with-shift.html [ Failure ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/sequential-focus-navigation-starting-point.html [ Failure ] -crbug.com/591099 virtual/mouseevent_fractional/fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Failure ] +crbug.com/591099 virtual/mouseevent_fractional/fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Failure Pass ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/submit-reset-nested-bubble.html [ Failure ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/tab-imagemap.html [ Failure ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/compositor-touch-hit-rects-scroll.html [ Failure ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/compositor-touch-hit-rects.html [ Failure ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-click-on-inline-continations.html [ Failure ] -crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/scroll-without-mouse-lacks-mousemove-events.html [ Failure Pass ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/touch-fractional-coordinates.html [ Failure ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/wheel/latched-scroll-node-removed.html [ Pass ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/wheel/mainthread-touchpad-fling-latching.html [ Pass ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index 76b26cd..ed70a08 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -105,6 +105,8 @@ crbug.com/664852 virtual/gpu/fast/canvas/canvas-createImageBitmap-webgl.html [ Pass Failure ] crbug.com/664852 virtual/gpu/fast/canvas/OffscreenCanvas-2d-drawImage.html [ Pass Failure ] +crbug.com/816045 [ Linux ] virtual/gpu/fast/canvas/canvas-imageSmoothingQuality-pixel.html [ Pass Timeout ] + ########## Bugs to fix ########## # This is a missing event and increasing the timeout or using run-after-layout-and-paint doesn't # seem to fix it. @@ -309,7 +311,6 @@ crbug.com/635619 [ Mac ] virtual/layout_ng/fast/block/float/028.html [ Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/assert-when-moving-float.html [ Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/assert-when-moving-float-2.html [ Failure ] -crbug.com/635619 virtual/layout_ng/fast/block/float/br-with-clear-2.html [ Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/clear-intruding-floats-when-moving-to-inline-parent-3.html [ Failure Crash Pass ] crbug.com/635619 virtual/layout_ng/fast/block/float/element-clears-float-without-clearance.html [ Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/float-at-start-of-clean-lines-that-are-subsequently-dirtied-vertical-rl.html [ Failure ] @@ -376,8 +377,6 @@ crbug.com/714962 virtual/layout_ng/fast/inline/002.html [ Failure ] crbug.com/714962 virtual/layout_ng/fast/inline/long-wrapped-line.html [ Failure ] crbug.com/714962 virtual/layout_ng/fast/inline/percentage-margins.html [ Failure ] -crbug.com/714962 virtual/layout_ng/fast/inline/vertical-align-text-bottom.html [ Failure ] -crbug.com/714962 virtual/layout_ng/fast/inline/vertical-align-with-fallback-fonts.html [ Failure ] ### Image/text failures #crbug.com/714962 virtual/layout_ng/fast/inline/001.html [ Failure ] @@ -392,7 +391,6 @@ crbug.com/714962 virtual/layout_ng/fast/inline/inline-continuation-borders.html [ Failure ] crbug.com/714962 virtual/layout_ng/fast/inline/inline-focus-ring.html [ Failure ] crbug.com/714962 virtual/layout_ng/fast/inline/inline-offsetLeft-continuation.html [ Failure ] -crbug.com/714962 virtual/layout_ng/fast/inline/inline-wrap-with-parent-padding.html [ Failure ] crbug.com/714962 virtual/layout_ng/fast/inline/justify-emphasis-inline-box.html [ Failure ] crbug.com/714962 virtual/layout_ng/fast/inline/outline-offset.html [ Failure ] crbug.com/714962 virtual/layout_ng/fast/inline/positionedLifetime.html [ Failure ] @@ -484,8 +482,6 @@ ### 1px diff with ref files. crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/linebox/vertical-align-sub-001.xht [ Failure ] crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/linebox/vertical-align-super-001.xht [ Failure ] -crbug.com/635619 virtual/layout_ng/fast/block/float/float-should-dirty-line-when-adjacent-to-line-breaks-2.html [ Failure ] -crbug.com/635619 virtual/layout_ng/fast/block/float/float-should-dirty-line-when-adjacent-to-line-breaks.html [ Failure ] ### Missing refs, these are also skipped for existing layout. crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floating-replaced-height-008.xht [ Skip ] @@ -3329,6 +3325,9 @@ crbug.com/814953 fast/replaced/no-focus-ring-iframe.html [ Failure Pass ] crbug.com/814964 virtual/gpu-rasterization/images/color-profile-border-radius.html [ Failure Pass ] +# Sheriff failures 2018-02-26 +crbug.com/816026 external/wpt/css/css-fonts/font-display/font-display.html [ Failure Pass ] + # MSAN crbug.com/813547 [ Linux ] webaudio/BiquadFilter/tail-time-lowpass.html [ Pass Failure ] @@ -3437,3 +3436,10 @@ crbug.com/811565 [ Fuchsia ] tables/mozilla/bugs/bug1188.html [ Failure Pass ] crbug.com/811565 [ Fuchsia ] tables/mozilla/bugs/bug2479-3.html [ Failure Pass ] crbug.com/811565 [ Fuchsia ] tables/mozilla/core/bloomberg.html [ Failure Pass ] + +# TODO(apacible): Remove these once SurfaceLayerForVideo works on LayoutTests. +crbug.com/811977 media/controls/picture-in-picture-interstitial.html [ Skip ] +crbug.com/811977 virtual/new-remote-playback-pipeline/media/controls/picture-in-picture-interstitial.html [ Skip ] + +# Sheriff 2018-02-26 +crbug.com/816475 [ Win7 ] external/wpt/webrtc/RTCDTMFSender-ontonechange.https.html [ Failure Pass ]
diff --git a/third_party/WebKit/LayoutTests/editing/assert_selection.html b/third_party/WebKit/LayoutTests/editing/assert_selection.html index 51e6f8ad..7d55c03 100644 --- a/third_party/WebKit/LayoutTests/editing/assert_selection.html +++ b/third_party/WebKit/LayoutTests/editing/assert_selection.html
@@ -208,6 +208,56 @@ {dumpAs: 'flattree'}, 'dump flat tree for shadow DOM V1'); selection_test( + [ + '<style>* { font-family: monospace; }</style>', + '<div>', + '<span id="start">ABC</span>', + '<p><a slot="a">111</a><b slot="b">222</b></p>', + 'DEF', + '</div>', + ], + selection => { + if (!window.eventSender) + throw 'This test requires eventSender.'; + const document = selection.document; + const host = document.querySelector('p'); + const shadowRoot = host.attachShadow({mode: 'open'}); + shadowRoot.innerHTML = [ + 'ghi', + '<slot name="b"></slot>', + '<span id="end">jkl</span>', + '<slot name="a"></slot>', + 'mno', + ].join(''); + const start = document.getElementById('start'); + const end = shadowRoot.getElementById('end'); + eventSender.mouseMoveTo( + selection.computeLeft(start), + selection.computeTop(start) + start.offsetHeight / 2); + eventSender.mouseDown(); + eventSender.leapForward(300); + eventSender.mouseMoveTo( + selection.computeLeft(end) + end.offsetWidth - 1, + selection.computeTop(end) + end.offsetHeight / 2); + eventSender.mouseUp(); + }, + [ + '<style>* { font-family: monospace; }</style>', + '<div>', + '<span id="start">^ABC</span>', + '<p>', + 'ghi', + '<slot name="b"><b slot="b">222</b></slot>', + '<span id="end">jkl|</span>', + '<slot name="a"><a slot="a">111</a></slot>', + 'mno', + '</p>', + 'DEF', + '</div>', + ], + {dumpAs: 'flattree'}, 'selection crossing shadow boundary'); + +selection_test( '<br>', selection => { selection.document.documentElement.prepend('Pre-HEAD');
diff --git a/third_party/WebKit/LayoutTests/editing/assert_selection.js b/third_party/WebKit/LayoutTests/editing/assert_selection.js index 2fbfd96..b981bee 100644 --- a/third_party/WebKit/LayoutTests/editing/assert_selection.js +++ b/third_party/WebKit/LayoutTests/editing/assert_selection.js
@@ -86,10 +86,10 @@ } /** - * @param {!Selection} selection + * @param {!Window} window * @return !SampleSelection */ - fromDOMSelection(selection) { + fromDOMSelection(window) { throw new Error('You should implement fromDOMSelection'); } @@ -109,11 +109,11 @@ firstChildOf(node) { return node.firstChild; } /** - * @param {!Selection} selection + * @param {!Window} window * @return !SampleSelection */ - fromDOMSelection(selection) { - return SampleSelection.fromDOMSelection(selection); + fromDOMSelection(window) { + return SampleSelection.fromDOMSelection(window.getSelection()); } /** @@ -132,13 +132,12 @@ firstChildOf(node) { return window.internals.firstChildInFlatTree(node); } /** - * @param {!Selection} selection + * @param {!Window} window * @return !SampleSelection */ - fromDOMSelection(selection) { - // TODO(yosin): We should return non-scoped selection rather than selection - // scoped in main tree. - return SampleSelection.fromDOMSelection(selection); + fromDOMSelection(window) { + return SampleSelection.fromDOMSelection( + internals.getSelectionInFlatTree(window)); } /** @@ -823,7 +822,7 @@ */ serialize(traversal, dumpFromRoot) { /** @type {!SampleSelection} */ - const selection = traversal.fromDOMSelection(this.selection_); + const selection = traversal.fromDOMSelection(this.document_.defaultView); /** @type {!Serializer} */ const serializer = new Serializer(selection, traversal); return serializer.serialize(this.document_, dumpFromRoot);
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json index 5031715..d045288f 100644 --- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json +++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -145735,51 +145735,6 @@ {} ] ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-1-expected.txt": [ - [ - {} - ] - ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-2-expected.txt": [ - [ - {} - ] - ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-3-expected.txt": [ - [ - {} - ] - ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-4-expected.txt": [ - [ - {} - ] - ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-5-expected.txt": [ - [ - {} - ] - ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-6-expected.txt": [ - [ - {} - ] - ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-7-expected.txt": [ - [ - {} - ] - ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-8-expected.txt": [ - [ - {} - ] - ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-9-expected.txt": [ - [ - {} - ] - ], "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-support.htm": [ [ {} @@ -311145,11 +311100,11 @@ "testharness" ], "custom-elements/Document-createElement.html": [ - "07de690760040f025455b1588ea00e57c669795f", + "46e64c9f412fb04582f8ec287e08783ac83cb933", "testharness" ], "custom-elements/Document-createElementNS.html": [ - "57791273d1721711dcb456fe7409a734d37278a3", + "da90b2a1c13cf18fd5cade85dcae2dadef6243c9", "testharness" ], "custom-elements/HTMLElement-constructor.html": [ @@ -336688,10 +336643,6 @@ "da39a3ee5e6b4b0d3255bfef95601890afd80709", "support" ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-1-expected.txt": [ - "43bd16b3795d98913a4cc3fef5a161ba51316bc5", - "support" - ], "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-1.htm": [ "3c58f1659b1e7a06fbc9068a243b8777fb00b730", "testharness" @@ -336700,66 +336651,34 @@ "a57ac305ef379f0ddd61c0bb401278855b87146c", "testharness" ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-2-expected.txt": [ - "24367e345740cb29effd2afc4e4482c3cbc81c2b", - "support" - ], "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-2.htm": [ "a599308e7803ede1851741a813f4eb4838554a32", "testharness" ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-3-expected.txt": [ - "40991dac2190b407525433d8e94a5114ea6cb8a4", - "support" - ], "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-3.htm": [ "2313b85385e2cad99257ca985c005126eb2fc009", "testharness" ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-4-expected.txt": [ - "767c76940775c765724c0f987b1dfd2d05496230", - "support" - ], "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-4.htm": [ "af4c7c1bb4b26dcc8c6e8dc53201499f0086de4e", "testharness" ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-5-expected.txt": [ - "06d4b99b6cb5264951260358024e25ab7c0b82e1", - "support" - ], "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-5.htm": [ "5e4189278e14a78fc78edb7960ff33c69f9fa4bf", "testharness" ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-6-expected.txt": [ - "154ee02b4f45e93c45143d2b71e9c179c6b39ecb", - "support" - ], "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-6.htm": [ "0fd5c5703309abab66cf553da9685d8e766f5278", "testharness" ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-7-expected.txt": [ - "fa9f5f30d2ac97b2655ffb89334cb5db3ee5e47c", - "support" - ], "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-7.htm": [ "b7a95380287b3c8299f2028d055cb68e1f11fc6e", "testharness" ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-8-expected.txt": [ - "6063aacdf8bb7e1e03eaf299f3b46e76df1a284b", - "support" - ], "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-8.htm": [ "61c32e514cdc7b3d40f6a7bdb0d4babf19ec562c", "testharness" ], - "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-9-expected.txt": [ - "814a399628104e5f418d2c4f95c679d77664569b", - "support" - ], "html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-9.htm": [ "c35672e53b9ebe1d778de8ec8ea654390389bea5", "testharness" @@ -337885,7 +337804,7 @@ "support" ], "interfaces/dom.idl": [ - "773c449a2f9a6bd9e35d0dd8a4c2e1eaa0266150", + "605bb139c7695e46f8657097cf2d9bc6240a2d38", "support" ], "interfaces/fullscreen.idl": [ @@ -339085,7 +339004,7 @@ "manual" ], "mediacapture-streams/MediaStreamTrack-getCapabilities.https.html": [ - "06662744434126b87eb1934504b53953419825cb", + "46cb0bc6251db37a40179d7938b0e1667c9fece4", "testharness" ], "mediacapture-streams/MediaStreamTrack-getSettings.https.html": [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/border-image-source.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/border-image-source.html new file mode 100644 index 0000000..b9ddf19 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/border-image-source.html
@@ -0,0 +1,21 @@ +<!doctype html> +<meta charset="utf-8"> +<title>'border-image-source' property</title> +<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get"> +<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set"> +<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../../resources/testhelper.js"></script> +<script src="resources/testsuite.js"></script> +<body> +<div id="log"></div> +<script> +'use strict'; + +runPropertyTests('border-image-source', [ + { syntax: 'none' }, + { syntax: '<image>' }, +]); + +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-weight-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-weight-expected.txt new file mode 100644 index 0000000..a888f58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-weight-expected.txt
@@ -0,0 +1,14 @@ +This is a testharness.js-based test. +PASS Can set 'font-weight' to CSS-wide keywords +PASS Can set 'font-weight' to the 'normal' keyword +PASS Can set 'font-weight' to the 'bold' keyword +PASS Can set 'font-weight' to the 'bolder' keyword +PASS Can set 'font-weight' to the 'lighter' keyword +FAIL Can set 'font-weight' to a number assert_approx_equals: expected -3.14 +/- 0.000001 but got -3 +PASS Setting 'font-weight' to a length throws TypeError +PASS Setting 'font-weight' to a percent throws TypeError +PASS Setting 'font-weight' to a time throws TypeError +PASS Setting 'font-weight' to a position throws TypeError +PASS Setting 'font-weight' to a transform throws TypeError +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-weight.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-weight.html new file mode 100644 index 0000000..cd6bec30 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-weight.html
@@ -0,0 +1,50 @@ +<!doctype html> +<meta charset="utf-8"> +<title>'font-weight' property</title> +<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get"> +<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set"> +<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../../resources/testhelper.js"></script> +<script src="resources/testsuite.js"></script> +<body> +<div id="log"></div> +<script> +'use strict'; + +function assert_is_font_weight(weight, result) { + assert_style_value_equals(result, new CSSUnitValue(weight, 'number')); +} + +runPropertyTests('font-weight', [ + { + syntax: 'normal', + computed: (_, result) => assert_is_font_weight(400, result) + }, + { + syntax: 'bold', + computed: (_, result) => assert_is_font_weight(700, result) + }, + { + syntax: 'bolder', + computed: (_, result) => assert_is_unit('number', result) + }, + { + syntax: 'lighter', + computed: (_, result) => assert_is_unit('number', result) + }, + { + syntax: '<number>', + specified: (input, result) => { + if (input instanceof CSSUnitValue && + (input.value < 0 || input.value > 1000)) + assert_style_value_equals(result, new CSSMathSum(input)); + else + assert_style_value_equals(result, input); + } + }, +]); + +</script> +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/mask-image-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/mask-image-expected.txt new file mode 100644 index 0000000..d8e1b7a --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/mask-image-expected.txt
@@ -0,0 +1,12 @@ +This is a testharness.js-based test. +FAIL Can set 'mask-image' to CSS-wide keywords Failed to execute 'set' on 'StylePropertyMap': Invalid propertyName: mask-image +FAIL Can set 'mask-image' to the 'none' keyword Failed to execute 'set' on 'StylePropertyMap': Invalid propertyName: mask-image +FAIL Can set 'mask-image' to an image Failed to execute 'get' on 'StylePropertyMapReadOnly': Invalid propertyName: mask-image +PASS Setting 'mask-image' to a length throws TypeError +PASS Setting 'mask-image' to a percent throws TypeError +PASS Setting 'mask-image' to a time throws TypeError +PASS Setting 'mask-image' to a number throws TypeError +PASS Setting 'mask-image' to a position throws TypeError +PASS Setting 'mask-image' to a transform throws TypeError +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/mask-image.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/mask-image.html new file mode 100644 index 0000000..f306fdd --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/mask-image.html
@@ -0,0 +1,22 @@ +<!doctype html> +<meta charset="utf-8"> +<title>'mask-image' property</title> +<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get"> +<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set"> +<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../../resources/testhelper.js"></script> +<script src="resources/testsuite.js"></script> +<body> +<div id="log"></div> +<script> +'use strict'; + +// FIXME: mask-image is list-valued. Run list-valued tests here too. +runPropertyTests('mask-image', [ + { syntax: 'none' }, + { syntax: '<image>' }, +]); + +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/shape-outside-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/shape-outside-expected.txt new file mode 100644 index 0000000..d21bb09 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/shape-outside-expected.txt
@@ -0,0 +1,20 @@ +This is a testharness.js-based test. +PASS Can set 'shape-outside' to CSS-wide keywords +PASS Can set 'shape-outside' to the 'none' keyword +FAIL Can set 'shape-outside' to the 'margin-box' keyword Failed to execute 'set' on 'StylePropertyMap': Invalid type for property +FAIL Can set 'shape-outside' to the 'border-box' keyword Failed to execute 'set' on 'StylePropertyMap': Invalid type for property +FAIL Can set 'shape-outside' to the 'padding-box' keyword Failed to execute 'set' on 'StylePropertyMap': Invalid type for property +FAIL Can set 'shape-outside' to the 'content-box' keyword Failed to execute 'set' on 'StylePropertyMap': Invalid type for property +PASS Can set 'shape-outside' to an image +PASS Setting 'shape-outside' to a length throws TypeError +PASS Setting 'shape-outside' to a percent throws TypeError +PASS Setting 'shape-outside' to a time throws TypeError +PASS Setting 'shape-outside' to a number throws TypeError +PASS Setting 'shape-outside' to a position throws TypeError +PASS Setting 'shape-outside' to a transform throws TypeError +PASS 'shape-outside' does not supported 'inset(22% 12% 15px 35px)' +PASS 'shape-outside' does not supported 'circle(6rem at 12rem 6rem)' +PASS 'shape-outside' does not supported 'ellipse(115px 55px at 50% 40%)' +PASS 'shape-outside' does not supported 'polygon(50% 20%, 90% 80%, 10% 80%)' +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/shape-outside.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/shape-outside.html new file mode 100644 index 0000000..d514c83 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/shape-outside.html
@@ -0,0 +1,33 @@ +<!doctype html> +<meta charset="utf-8"> +<title>'shape-outside' property</title> +<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get"> +<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set"> +<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../../resources/testhelper.js"></script> +<script src="resources/testsuite.js"></script> +<body> +<div id="log"></div> +<script> +'use strict'; + +runPropertyTests('shape-outside', [ + { syntax: 'none' }, + { syntax: 'margin-box' }, + { syntax: 'border-box' }, + { syntax: 'padding-box' }, + { syntax: 'content-box' }, + { syntax: '<image>' }, +]); + +// <basic-shape>s are not supported in level 1 +runUnsupportedPropertyTests('shape-outside', [ + 'inset(22% 12% 15px 35px)', + 'circle(6rem at 12rem 6rem)', + 'ellipse(115px 55px at 50% 40%)', + 'polygon(50% 20%, 90% 80%, 10% 80%)', +]); + +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/cssom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/cssom/interfaces-expected.txt index bfcfb14..251fb4c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/cssom/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/cssom/interfaces-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 399 tests; 316 PASS, 83 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 399 tests; 315 PASS, 84 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Test driver PASS HTMLElement interface: attribute style PASS HTMLElement interface: style_element must inherit property "style" with the proper type @@ -79,7 +79,7 @@ PASS StyleSheet interface: style_element.sheet must inherit property "media" with the proper type PASS StyleSheet interface: style_element.sheet must inherit property "disabled" with the proper type PASS StyleSheetList interface: existence and properties of interface object -PASS StyleSheetList interface object length +FAIL StyleSheetList interface object length assert_equals: wrong value for StyleSheetList.length expected 0 but got 1 PASS StyleSheetList interface object name FAIL StyleSheetList interface: existence and properties of interface prototype object assert_equals: prototype of StyleSheetList.prototype is not Array.prototype expected [] but got object "[object Object]" PASS StyleSheetList interface: existence and properties of interface prototype object's "constructor" property
diff --git a/third_party/WebKit/LayoutTests/external/wpt/custom-elements/Document-createElement.html b/third_party/WebKit/LayoutTests/external/wpt/custom-elements/Document-createElement.html index 21f024c..ad29b91 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/custom-elements/Document-createElement.html +++ b/third_party/WebKit/LayoutTests/external/wpt/custom-elements/Document-createElement.html
@@ -50,6 +50,21 @@ assert_true(instance2 instanceof DefinedLater); }, 'document.createElement must create an instance of autonomous custom elements when it has is attribute'); +test(() => { + class SuperP extends HTMLParagraphElement {} + customElements.define("super-p", SuperP, { extends: "p" }); + + const superP = document.createElement("p", { is: "super-p" }); + assert_true(superP instanceof HTMLParagraphElement); + assert_true(superP instanceof SuperP); + assert_equals(superP.localName, "p"); + + const notSuperP = document.createElement("p", "super-p"); + assert_true(notSuperP instanceof HTMLParagraphElement); + assert_false(notSuperP instanceof SuperP); + assert_equals(notSuperP.localName, "p"); +}, "document.createElement()'s second argument is to be ignored when it's a string"); + function assert_reports(expected, testFunction, message) { var uncaughtError = null; window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
diff --git a/third_party/WebKit/LayoutTests/external/wpt/custom-elements/Document-createElementNS.html b/third_party/WebKit/LayoutTests/external/wpt/custom-elements/Document-createElementNS.html index 4cc4561f..6377ba6 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/custom-elements/Document-createElementNS.html +++ b/third_party/WebKit/LayoutTests/external/wpt/custom-elements/Document-createElementNS.html
@@ -49,5 +49,20 @@ assert_false(element instanceof MyBuiltinElement2); assert_false(element.hasAttribute('is')); }, 'builtin: document.createElementNS should check namespaces.'); + +test(() => { + class SuperP extends HTMLParagraphElement {} + customElements.define("super-p", SuperP, { extends: "p" }); + + const superP = document.createElementNS("http://www.w3.org/1999/xhtml", "p", { is: "super-p" }); + assert_true(superP instanceof HTMLParagraphElement); + assert_true(superP instanceof SuperP); + assert_equals(superP.localName, "p"); + + const notSuperP = document.createElementNS("http://www.w3.org/1999/xhtml", "p", "super-p"); + assert_true(notSuperP instanceof HTMLParagraphElement); + assert_false(notSuperP instanceof SuperP); + assert_equals(notSuperP.localName, "p"); +}, "document.createElementNS()'s third argument is to be ignored when it's a string"); </script> </body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/dom/usvstring-reflection.html b/third_party/WebKit/LayoutTests/external/wpt/html/dom/usvstring-reflection.html index edbf4e2..b9c06d82 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/dom/usvstring-reflection.html +++ b/third_party/WebKit/LayoutTests/external/wpt/html/dom/usvstring-reflection.html
@@ -105,9 +105,17 @@ }, "sendBeacon URL: unpaired surrogate codepoint should not make any exceptions.") test(() => { + // This shouldn't throw an exception. + window.navigator.registerProtocolHandler('web+myprotocol', "custom-scheme\uD800/url=%s", "title"); +}, "RegisterPtotocolHandler URL: unpaired surrogate codepoint should not make any exceptions.") + +test(() => { var w = window.open("about:blank#\uD800"); assert_equals(w.document.URL, 'about:blank#%EF%BF%BD'); assert_equals(w.document.documentURI, 'about:blank#%EF%BF%BD'); + // TODO(gyuyoung): How to test document.origin? When opening a URL with an + // unpaired surrogate codepoint, invalid URL exception happens. + // e.g) var w = window.open("http://test.com\uDB89"); }, "Document URLs: unpaired surrogate codepoint should be replaced with U+FFFD") promise_test(t => {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-area-element/area-download-click-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-area-element/area-download-click-expected.txt deleted file mode 100644 index 03a0063..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-area-element/area-download-click-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Clicking on an <area> element with a download attribute must not throw an exception assert_unreached: Navigated instead of downloading Reached unreachable code -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/text-level-semantics/the-a-element/a-download-click-404-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/text-level-semantics/the-a-element/a-download-click-404-expected.txt index fd1a48ae..d3c5fc6 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/text-level-semantics/the-a-element/a-download-click-404-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/text-level-semantics/the-a-element/a-download-click-404-expected.txt
@@ -1,4 +1,4 @@ This is a testharness.js-based test. -FAIL Do not navigate to 404 for anchor with download assert_unreached: Navigated instead of downloading Reached unreachable code +FAIL Do not navigate to 404 for anchor with download Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame. Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/text-level-semantics/the-a-element/a-download-click-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/text-level-semantics/the-a-element/a-download-click-expected.txt deleted file mode 100644 index f372e80..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/text-level-semantics/the-a-element/a-download-click-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Clicking on an <a> element with a download attribute must not throw an exception assert_unreached: Navigated instead of downloading Reached unreachable code -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-1-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-1-expected.txt deleted file mode 100644 index 2104de9..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-1-expected.txt +++ /dev/null
@@ -1,2129 +0,0 @@ -This is a testharness.js-based test. -Found 2125 tests; 2122 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS XHTML1.0 Transitional parsing Á -PASS XHTML1.0 Transitional parsing á -PASS XHTML1.0 Transitional parsing Ă -PASS XHTML1.0 Transitional parsing ă -PASS XHTML1.0 Transitional parsing ∾ -PASS XHTML1.0 Transitional parsing ∿ -PASS XHTML1.0 Transitional parsing ∾̳ -PASS XHTML1.0 Transitional parsing  -PASS XHTML1.0 Transitional parsing â -PASS XHTML1.0 Transitional parsing ´ -PASS XHTML1.0 Transitional parsing А -PASS XHTML1.0 Transitional parsing а -PASS XHTML1.0 Transitional parsing Æ -PASS XHTML1.0 Transitional parsing æ -PASS XHTML1.0 Transitional parsing ⁡ -PASS XHTML1.0 Transitional parsing 𝔄 -PASS XHTML1.0 Transitional parsing 𝔞 -PASS XHTML1.0 Transitional parsing À -PASS XHTML1.0 Transitional parsing à -PASS XHTML1.0 Transitional parsing ℵ -PASS XHTML1.0 Transitional parsing ℵ -PASS XHTML1.0 Transitional parsing Α -PASS XHTML1.0 Transitional parsing α -PASS XHTML1.0 Transitional parsing Ā -PASS XHTML1.0 Transitional parsing ā -PASS XHTML1.0 Transitional parsing ⨿ -PASS XHTML1.0 Transitional parsing & -FAIL XHTML1.0 Transitional parsing & assert_true: expected true got false -PASS XHTML1.0 Transitional parsing ⩕ -PASS XHTML1.0 Transitional parsing ⩓ -PASS XHTML1.0 Transitional parsing ∧ -PASS XHTML1.0 Transitional parsing ⩜ -PASS XHTML1.0 Transitional parsing ⩘ -PASS XHTML1.0 Transitional parsing ⩚ -PASS XHTML1.0 Transitional parsing ∠ -PASS XHTML1.0 Transitional parsing ⦤ -PASS XHTML1.0 Transitional parsing ∠ -PASS XHTML1.0 Transitional parsing ⦨ -PASS XHTML1.0 Transitional parsing ⦩ -PASS XHTML1.0 Transitional parsing ⦪ -PASS XHTML1.0 Transitional parsing ⦫ -PASS XHTML1.0 Transitional parsing ⦬ -PASS XHTML1.0 Transitional parsing ⦭ -PASS XHTML1.0 Transitional parsing ⦮ -PASS XHTML1.0 Transitional parsing ⦯ -PASS XHTML1.0 Transitional parsing ∡ -PASS XHTML1.0 Transitional parsing ∟ -PASS XHTML1.0 Transitional parsing ⊾ -PASS XHTML1.0 Transitional parsing ⦝ -PASS XHTML1.0 Transitional parsing ∢ -PASS XHTML1.0 Transitional parsing Å -PASS XHTML1.0 Transitional parsing ⍼ -PASS XHTML1.0 Transitional parsing Ą -PASS XHTML1.0 Transitional parsing ą -PASS XHTML1.0 Transitional parsing 𝔸 -PASS XHTML1.0 Transitional parsing 𝕒 -PASS XHTML1.0 Transitional parsing ⩯ -PASS XHTML1.0 Transitional parsing ≈ -PASS XHTML1.0 Transitional parsing ⩰ -PASS XHTML1.0 Transitional parsing ≊ -PASS XHTML1.0 Transitional parsing ≋ -PASS XHTML1.0 Transitional parsing ' -PASS XHTML1.0 Transitional parsing ⁡ -PASS XHTML1.0 Transitional parsing ≈ -PASS XHTML1.0 Transitional parsing ≊ -PASS XHTML1.0 Transitional parsing Å -PASS XHTML1.0 Transitional parsing å -PASS XHTML1.0 Transitional parsing 𝒜 -PASS XHTML1.0 Transitional parsing 𝒶 -PASS XHTML1.0 Transitional parsing ≔ -PASS XHTML1.0 Transitional parsing * -PASS XHTML1.0 Transitional parsing ≈ -PASS XHTML1.0 Transitional parsing ≍ -PASS XHTML1.0 Transitional parsing à -PASS XHTML1.0 Transitional parsing ã -PASS XHTML1.0 Transitional parsing Ä -PASS XHTML1.0 Transitional parsing ä -PASS XHTML1.0 Transitional parsing ∳ -PASS XHTML1.0 Transitional parsing ⨑ -PASS XHTML1.0 Transitional parsing ≌ -PASS XHTML1.0 Transitional parsing ϶ -PASS XHTML1.0 Transitional parsing ‵ -PASS XHTML1.0 Transitional parsing ∽ -PASS XHTML1.0 Transitional parsing ⋍ -PASS XHTML1.0 Transitional parsing ∖ -PASS XHTML1.0 Transitional parsing ⫧ -PASS XHTML1.0 Transitional parsing ⊽ -PASS XHTML1.0 Transitional parsing ⌅ -PASS XHTML1.0 Transitional parsing ⌆ -PASS XHTML1.0 Transitional parsing ⌅ -PASS XHTML1.0 Transitional parsing ⎵ -PASS XHTML1.0 Transitional parsing ⎶ -PASS XHTML1.0 Transitional parsing ≌ -PASS XHTML1.0 Transitional parsing Б -PASS XHTML1.0 Transitional parsing б -PASS XHTML1.0 Transitional parsing „ -PASS XHTML1.0 Transitional parsing ∵ -PASS XHTML1.0 Transitional parsing ∵ -PASS XHTML1.0 Transitional parsing ∵ -PASS XHTML1.0 Transitional parsing ⦰ -PASS XHTML1.0 Transitional parsing ϶ -PASS XHTML1.0 Transitional parsing ℬ -PASS XHTML1.0 Transitional parsing ℬ -PASS XHTML1.0 Transitional parsing Β -PASS XHTML1.0 Transitional parsing β -PASS XHTML1.0 Transitional parsing ℶ -PASS XHTML1.0 Transitional parsing ≬ -PASS XHTML1.0 Transitional parsing 𝔅 -PASS XHTML1.0 Transitional parsing 𝔟 -PASS XHTML1.0 Transitional parsing ⋂ -PASS XHTML1.0 Transitional parsing ◯ -PASS XHTML1.0 Transitional parsing ⋃ -PASS XHTML1.0 Transitional parsing ⨀ -PASS XHTML1.0 Transitional parsing ⨁ -PASS XHTML1.0 Transitional parsing ⨂ -PASS XHTML1.0 Transitional parsing ⨆ -PASS XHTML1.0 Transitional parsing ★ -PASS XHTML1.0 Transitional parsing ▽ -PASS XHTML1.0 Transitional parsing △ -PASS XHTML1.0 Transitional parsing ⨄ -PASS XHTML1.0 Transitional parsing ⋁ -PASS XHTML1.0 Transitional parsing ⋀ -PASS XHTML1.0 Transitional parsing ⤍ -PASS XHTML1.0 Transitional parsing ⧫ -PASS XHTML1.0 Transitional parsing ▪ -PASS XHTML1.0 Transitional parsing ▴ -PASS XHTML1.0 Transitional parsing ▾ -PASS XHTML1.0 Transitional parsing ◂ -PASS XHTML1.0 Transitional parsing ▸ -PASS XHTML1.0 Transitional parsing ␣ -PASS XHTML1.0 Transitional parsing ▒ -PASS XHTML1.0 Transitional parsing ░ -PASS XHTML1.0 Transitional parsing ▓ -PASS XHTML1.0 Transitional parsing █ -PASS XHTML1.0 Transitional parsing =⃥ -PASS XHTML1.0 Transitional parsing ≡⃥ -PASS XHTML1.0 Transitional parsing ⫭ -PASS XHTML1.0 Transitional parsing ⌐ -PASS XHTML1.0 Transitional parsing 𝔹 -PASS XHTML1.0 Transitional parsing 𝕓 -PASS XHTML1.0 Transitional parsing ⊥ -PASS XHTML1.0 Transitional parsing ⊥ -PASS XHTML1.0 Transitional parsing ⋈ -PASS XHTML1.0 Transitional parsing ⧉ -PASS XHTML1.0 Transitional parsing ┐ -PASS XHTML1.0 Transitional parsing ╕ -PASS XHTML1.0 Transitional parsing ╖ -PASS XHTML1.0 Transitional parsing ╗ -PASS XHTML1.0 Transitional parsing ┌ -PASS XHTML1.0 Transitional parsing ╒ -PASS XHTML1.0 Transitional parsing ╓ -PASS XHTML1.0 Transitional parsing ╔ -PASS XHTML1.0 Transitional parsing ─ -PASS XHTML1.0 Transitional parsing ═ -PASS XHTML1.0 Transitional parsing ┬ -PASS XHTML1.0 Transitional parsing ╤ -PASS XHTML1.0 Transitional parsing ╥ -PASS XHTML1.0 Transitional parsing ╦ -PASS XHTML1.0 Transitional parsing ┴ -PASS XHTML1.0 Transitional parsing ╧ -PASS XHTML1.0 Transitional parsing ╨ -PASS XHTML1.0 Transitional parsing ╩ -PASS XHTML1.0 Transitional parsing ⊟ -PASS XHTML1.0 Transitional parsing ⊞ -PASS XHTML1.0 Transitional parsing ⊠ -PASS XHTML1.0 Transitional parsing ┘ -PASS XHTML1.0 Transitional parsing ╛ -PASS XHTML1.0 Transitional parsing ╜ -PASS XHTML1.0 Transitional parsing ╝ -PASS XHTML1.0 Transitional parsing └ -PASS XHTML1.0 Transitional parsing ╘ -PASS XHTML1.0 Transitional parsing ╙ -PASS XHTML1.0 Transitional parsing ╚ -PASS XHTML1.0 Transitional parsing │ -PASS XHTML1.0 Transitional parsing ║ -PASS XHTML1.0 Transitional parsing ┼ -PASS XHTML1.0 Transitional parsing ╪ -PASS XHTML1.0 Transitional parsing ╫ -PASS XHTML1.0 Transitional parsing ╬ -PASS XHTML1.0 Transitional parsing ┤ -PASS XHTML1.0 Transitional parsing ╡ -PASS XHTML1.0 Transitional parsing ╢ -PASS XHTML1.0 Transitional parsing ╣ -PASS XHTML1.0 Transitional parsing ├ -PASS XHTML1.0 Transitional parsing ╞ -PASS XHTML1.0 Transitional parsing ╟ -PASS XHTML1.0 Transitional parsing ╠ -PASS XHTML1.0 Transitional parsing ‵ -PASS XHTML1.0 Transitional parsing ˘ -PASS XHTML1.0 Transitional parsing ˘ -PASS XHTML1.0 Transitional parsing ¦ -PASS XHTML1.0 Transitional parsing 𝒷 -PASS XHTML1.0 Transitional parsing ℬ -PASS XHTML1.0 Transitional parsing ⁏ -PASS XHTML1.0 Transitional parsing ∽ -PASS XHTML1.0 Transitional parsing ⋍ -PASS XHTML1.0 Transitional parsing ⧅ -PASS XHTML1.0 Transitional parsing \ -PASS XHTML1.0 Transitional parsing ⟈ -PASS XHTML1.0 Transitional parsing • -PASS XHTML1.0 Transitional parsing • -PASS XHTML1.0 Transitional parsing ≎ -PASS XHTML1.0 Transitional parsing ⪮ -PASS XHTML1.0 Transitional parsing ≏ -PASS XHTML1.0 Transitional parsing ≎ -PASS XHTML1.0 Transitional parsing ≏ -PASS XHTML1.0 Transitional parsing Ć -PASS XHTML1.0 Transitional parsing ć -PASS XHTML1.0 Transitional parsing ⩄ -PASS XHTML1.0 Transitional parsing ⩉ -PASS XHTML1.0 Transitional parsing ⩋ -PASS XHTML1.0 Transitional parsing ∩ -PASS XHTML1.0 Transitional parsing ⋒ -PASS XHTML1.0 Transitional parsing ⩇ -PASS XHTML1.0 Transitional parsing ⩀ -PASS XHTML1.0 Transitional parsing ⅅ -PASS XHTML1.0 Transitional parsing ∩︀ -PASS XHTML1.0 Transitional parsing ⁁ -PASS XHTML1.0 Transitional parsing ˇ -PASS XHTML1.0 Transitional parsing ℭ -PASS XHTML1.0 Transitional parsing ⩍ -PASS XHTML1.0 Transitional parsing Č -PASS XHTML1.0 Transitional parsing č -PASS XHTML1.0 Transitional parsing Ç -PASS XHTML1.0 Transitional parsing ç -PASS XHTML1.0 Transitional parsing Ĉ -PASS XHTML1.0 Transitional parsing ĉ -PASS XHTML1.0 Transitional parsing ∰ -PASS XHTML1.0 Transitional parsing ⩌ -PASS XHTML1.0 Transitional parsing ⩐ -PASS XHTML1.0 Transitional parsing Ċ -PASS XHTML1.0 Transitional parsing ċ -PASS XHTML1.0 Transitional parsing ¸ -PASS XHTML1.0 Transitional parsing ¸ -PASS XHTML1.0 Transitional parsing ⦲ -PASS XHTML1.0 Transitional parsing ¢ -PASS XHTML1.0 Transitional parsing · -PASS XHTML1.0 Transitional parsing · -PASS XHTML1.0 Transitional parsing 𝔠 -PASS XHTML1.0 Transitional parsing ℭ -PASS XHTML1.0 Transitional parsing Ч -PASS XHTML1.0 Transitional parsing ч -PASS XHTML1.0 Transitional parsing ✓ -PASS XHTML1.0 Transitional parsing ✓ -PASS XHTML1.0 Transitional parsing Χ -PASS XHTML1.0 Transitional parsing χ -PASS XHTML1.0 Transitional parsing ˆ -PASS XHTML1.0 Transitional parsing ≗ -PASS XHTML1.0 Transitional parsing ↺ -PASS XHTML1.0 Transitional parsing ↻ -PASS XHTML1.0 Transitional parsing ⊛ -PASS XHTML1.0 Transitional parsing ⊚ -PASS XHTML1.0 Transitional parsing ⊝ -PASS XHTML1.0 Transitional parsing ⊙ -PASS XHTML1.0 Transitional parsing ® -PASS XHTML1.0 Transitional parsing Ⓢ -PASS XHTML1.0 Transitional parsing ⊖ -PASS XHTML1.0 Transitional parsing ⊕ -PASS XHTML1.0 Transitional parsing ⊗ -PASS XHTML1.0 Transitional parsing ○ -PASS XHTML1.0 Transitional parsing ⧃ -PASS XHTML1.0 Transitional parsing ≗ -PASS XHTML1.0 Transitional parsing ⨐ -PASS XHTML1.0 Transitional parsing ⫯ -PASS XHTML1.0 Transitional parsing ⧂ -PASS XHTML1.0 Transitional parsing ∲ -PASS XHTML1.0 Transitional parsing ” -PASS XHTML1.0 Transitional parsing ’ -PASS XHTML1.0 Transitional parsing ♣ -PASS XHTML1.0 Transitional parsing ♣ -PASS XHTML1.0 Transitional parsing : -PASS XHTML1.0 Transitional parsing ∷ -PASS XHTML1.0 Transitional parsing ⩴ -PASS XHTML1.0 Transitional parsing ≔ -PASS XHTML1.0 Transitional parsing ≔ -PASS XHTML1.0 Transitional parsing , -PASS XHTML1.0 Transitional parsing @ -PASS XHTML1.0 Transitional parsing ∁ -PASS XHTML1.0 Transitional parsing ∘ -PASS XHTML1.0 Transitional parsing ∁ -PASS XHTML1.0 Transitional parsing ℂ -PASS XHTML1.0 Transitional parsing ≅ -PASS XHTML1.0 Transitional parsing ⩭ -PASS XHTML1.0 Transitional parsing ≡ -PASS XHTML1.0 Transitional parsing ∮ -PASS XHTML1.0 Transitional parsing ∯ -PASS XHTML1.0 Transitional parsing ∮ -PASS XHTML1.0 Transitional parsing 𝕔 -PASS XHTML1.0 Transitional parsing ℂ -PASS XHTML1.0 Transitional parsing ∐ -PASS XHTML1.0 Transitional parsing ∐ -PASS XHTML1.0 Transitional parsing © -PASS XHTML1.0 Transitional parsing © -PASS XHTML1.0 Transitional parsing ℗ -PASS XHTML1.0 Transitional parsing ∳ -PASS XHTML1.0 Transitional parsing ↵ -PASS XHTML1.0 Transitional parsing ✗ -PASS XHTML1.0 Transitional parsing ⨯ -PASS XHTML1.0 Transitional parsing 𝒞 -PASS XHTML1.0 Transitional parsing 𝒸 -PASS XHTML1.0 Transitional parsing ⫏ -PASS XHTML1.0 Transitional parsing ⫑ -PASS XHTML1.0 Transitional parsing ⫐ -PASS XHTML1.0 Transitional parsing ⫒ -PASS XHTML1.0 Transitional parsing ⋯ -PASS XHTML1.0 Transitional parsing ⤸ -PASS XHTML1.0 Transitional parsing ⤵ -PASS XHTML1.0 Transitional parsing ⋞ -PASS XHTML1.0 Transitional parsing ⋟ -PASS XHTML1.0 Transitional parsing ↶ -PASS XHTML1.0 Transitional parsing ⤽ -PASS XHTML1.0 Transitional parsing ⩈ -PASS XHTML1.0 Transitional parsing ⩆ -PASS XHTML1.0 Transitional parsing ≍ -PASS XHTML1.0 Transitional parsing ∪ -PASS XHTML1.0 Transitional parsing ⋓ -PASS XHTML1.0 Transitional parsing ⩊ -PASS XHTML1.0 Transitional parsing ⊍ -PASS XHTML1.0 Transitional parsing ⩅ -PASS XHTML1.0 Transitional parsing ∪︀ -PASS XHTML1.0 Transitional parsing ↷ -PASS XHTML1.0 Transitional parsing ⤼ -PASS XHTML1.0 Transitional parsing ⋞ -PASS XHTML1.0 Transitional parsing ⋟ -PASS XHTML1.0 Transitional parsing ⋎ -PASS XHTML1.0 Transitional parsing ⋏ -PASS XHTML1.0 Transitional parsing ¤ -PASS XHTML1.0 Transitional parsing ↶ -PASS XHTML1.0 Transitional parsing ↷ -PASS XHTML1.0 Transitional parsing ⋎ -PASS XHTML1.0 Transitional parsing ⋏ -PASS XHTML1.0 Transitional parsing ∲ -PASS XHTML1.0 Transitional parsing ∱ -PASS XHTML1.0 Transitional parsing ⌭ -PASS XHTML1.0 Transitional parsing † -PASS XHTML1.0 Transitional parsing ‡ -PASS XHTML1.0 Transitional parsing ℸ -PASS XHTML1.0 Transitional parsing ↓ -PASS XHTML1.0 Transitional parsing ↡ -PASS XHTML1.0 Transitional parsing ⇓ -PASS XHTML1.0 Transitional parsing ‐ -PASS XHTML1.0 Transitional parsing ⫤ -PASS XHTML1.0 Transitional parsing ⊣ -PASS XHTML1.0 Transitional parsing ⤏ -PASS XHTML1.0 Transitional parsing ˝ -PASS XHTML1.0 Transitional parsing Ď -PASS XHTML1.0 Transitional parsing ď -PASS XHTML1.0 Transitional parsing Д -PASS XHTML1.0 Transitional parsing д -PASS XHTML1.0 Transitional parsing ‡ -PASS XHTML1.0 Transitional parsing ⇊ -PASS XHTML1.0 Transitional parsing ⅅ -PASS XHTML1.0 Transitional parsing ⅆ -PASS XHTML1.0 Transitional parsing ⤑ -PASS XHTML1.0 Transitional parsing ⩷ -PASS XHTML1.0 Transitional parsing ° -PASS XHTML1.0 Transitional parsing ∇ -PASS XHTML1.0 Transitional parsing Δ -PASS XHTML1.0 Transitional parsing δ -PASS XHTML1.0 Transitional parsing ⦱ -PASS XHTML1.0 Transitional parsing ⥿ -PASS XHTML1.0 Transitional parsing 𝔇 -PASS XHTML1.0 Transitional parsing 𝔡 -PASS XHTML1.0 Transitional parsing ⥥ -PASS XHTML1.0 Transitional parsing ⇃ -PASS XHTML1.0 Transitional parsing ⇂ -PASS XHTML1.0 Transitional parsing ´ -PASS XHTML1.0 Transitional parsing ˙ -PASS XHTML1.0 Transitional parsing ˝ -PASS XHTML1.0 Transitional parsing ` -PASS XHTML1.0 Transitional parsing ˜ -PASS XHTML1.0 Transitional parsing ⋄ -PASS XHTML1.0 Transitional parsing ⋄ -PASS XHTML1.0 Transitional parsing ⋄ -PASS XHTML1.0 Transitional parsing ♦ -PASS XHTML1.0 Transitional parsing ♦ -PASS XHTML1.0 Transitional parsing ¨ -PASS XHTML1.0 Transitional parsing ⅆ -PASS XHTML1.0 Transitional parsing ϝ -PASS XHTML1.0 Transitional parsing ⋲ -PASS XHTML1.0 Transitional parsing ÷ -PASS XHTML1.0 Transitional parsing ÷ -PASS XHTML1.0 Transitional parsing ⋇ -PASS XHTML1.0 Transitional parsing ⋇ -PASS XHTML1.0 Transitional parsing Ђ -PASS XHTML1.0 Transitional parsing ђ -PASS XHTML1.0 Transitional parsing ⌞ -PASS XHTML1.0 Transitional parsing ⌍ -PASS XHTML1.0 Transitional parsing $ -PASS XHTML1.0 Transitional parsing 𝔻 -PASS XHTML1.0 Transitional parsing 𝕕 -PASS XHTML1.0 Transitional parsing ¨ -PASS XHTML1.0 Transitional parsing ˙ -PASS XHTML1.0 Transitional parsing ⃜ -PASS XHTML1.0 Transitional parsing ≐ -PASS XHTML1.0 Transitional parsing ≑ -PASS XHTML1.0 Transitional parsing ≐ -PASS XHTML1.0 Transitional parsing ∸ -PASS XHTML1.0 Transitional parsing ∔ -PASS XHTML1.0 Transitional parsing ⊡ -PASS XHTML1.0 Transitional parsing ⌆ -PASS XHTML1.0 Transitional parsing ∯ -PASS XHTML1.0 Transitional parsing ¨ -PASS XHTML1.0 Transitional parsing ⇓ -PASS XHTML1.0 Transitional parsing ⇐ -PASS XHTML1.0 Transitional parsing ⇔ -PASS XHTML1.0 Transitional parsing ⫤ -PASS XHTML1.0 Transitional parsing ⟸ -PASS XHTML1.0 Transitional parsing ⟺ -PASS XHTML1.0 Transitional parsing ⟹ -PASS XHTML1.0 Transitional parsing ⇒ -PASS XHTML1.0 Transitional parsing ⊨ -PASS XHTML1.0 Transitional parsing ⇑ -PASS XHTML1.0 Transitional parsing ⇕ -PASS XHTML1.0 Transitional parsing ∥ -PASS XHTML1.0 Transitional parsing ⤓ -PASS XHTML1.0 Transitional parsing ↓ -PASS XHTML1.0 Transitional parsing ↓ -PASS XHTML1.0 Transitional parsing ⇓ -PASS XHTML1.0 Transitional parsing ⇵ -PASS XHTML1.0 Transitional parsing ̑ -PASS XHTML1.0 Transitional parsing ⇊ -PASS XHTML1.0 Transitional parsing ⇃ -PASS XHTML1.0 Transitional parsing ⇂ -PASS XHTML1.0 Transitional parsing ⥐ -PASS XHTML1.0 Transitional parsing ⥞ -PASS XHTML1.0 Transitional parsing ⥖ -PASS XHTML1.0 Transitional parsing ↽ -PASS XHTML1.0 Transitional parsing ⥟ -PASS XHTML1.0 Transitional parsing ⥗ -PASS XHTML1.0 Transitional parsing ⇁ -PASS XHTML1.0 Transitional parsing ↧ -PASS XHTML1.0 Transitional parsing ⊤ -PASS XHTML1.0 Transitional parsing ⤐ -PASS XHTML1.0 Transitional parsing ⌟ -PASS XHTML1.0 Transitional parsing ⌌ -PASS XHTML1.0 Transitional parsing 𝒟 -PASS XHTML1.0 Transitional parsing 𝒹 -PASS XHTML1.0 Transitional parsing Ѕ -PASS XHTML1.0 Transitional parsing ѕ -PASS XHTML1.0 Transitional parsing ⧶ -PASS XHTML1.0 Transitional parsing Đ -PASS XHTML1.0 Transitional parsing đ -PASS XHTML1.0 Transitional parsing ⋱ -PASS XHTML1.0 Transitional parsing ▿ -PASS XHTML1.0 Transitional parsing ▾ -PASS XHTML1.0 Transitional parsing ⇵ -PASS XHTML1.0 Transitional parsing ⥯ -PASS XHTML1.0 Transitional parsing ⦦ -PASS XHTML1.0 Transitional parsing Џ -PASS XHTML1.0 Transitional parsing џ -PASS XHTML1.0 Transitional parsing ⟿ -PASS XHTML1.0 Transitional parsing É -PASS XHTML1.0 Transitional parsing é -PASS XHTML1.0 Transitional parsing ⩮ -PASS XHTML1.0 Transitional parsing Ě -PASS XHTML1.0 Transitional parsing ě -PASS XHTML1.0 Transitional parsing Ê -PASS XHTML1.0 Transitional parsing ê -PASS XHTML1.0 Transitional parsing ≖ -PASS XHTML1.0 Transitional parsing ≕ -PASS XHTML1.0 Transitional parsing Э -PASS XHTML1.0 Transitional parsing э -PASS XHTML1.0 Transitional parsing ⩷ -PASS XHTML1.0 Transitional parsing Ė -PASS XHTML1.0 Transitional parsing ė -PASS XHTML1.0 Transitional parsing ≑ -PASS XHTML1.0 Transitional parsing ⅇ -PASS XHTML1.0 Transitional parsing ≒ -PASS XHTML1.0 Transitional parsing 𝔈 -PASS XHTML1.0 Transitional parsing 𝔢 -PASS XHTML1.0 Transitional parsing ⪚ -PASS XHTML1.0 Transitional parsing È -PASS XHTML1.0 Transitional parsing è -PASS XHTML1.0 Transitional parsing ⪖ -PASS XHTML1.0 Transitional parsing ⪘ -PASS XHTML1.0 Transitional parsing ⪙ -PASS XHTML1.0 Transitional parsing ∈ -PASS XHTML1.0 Transitional parsing ⏧ -PASS XHTML1.0 Transitional parsing ℓ -PASS XHTML1.0 Transitional parsing ⪕ -PASS XHTML1.0 Transitional parsing ⪗ -PASS XHTML1.0 Transitional parsing Ē -PASS XHTML1.0 Transitional parsing ē -PASS XHTML1.0 Transitional parsing ∅ -PASS XHTML1.0 Transitional parsing ∅ -PASS XHTML1.0 Transitional parsing ◻ -PASS XHTML1.0 Transitional parsing ∅ -PASS XHTML1.0 Transitional parsing ▫ -PASS XHTML1.0 Transitional parsing   -PASS XHTML1.0 Transitional parsing   -PASS XHTML1.0 Transitional parsing   -PASS XHTML1.0 Transitional parsing Ŋ -PASS XHTML1.0 Transitional parsing ŋ -PASS XHTML1.0 Transitional parsing   -PASS XHTML1.0 Transitional parsing Ę -PASS XHTML1.0 Transitional parsing ę -PASS XHTML1.0 Transitional parsing 𝔼 -PASS XHTML1.0 Transitional parsing 𝕖 -PASS XHTML1.0 Transitional parsing ⋕ -PASS XHTML1.0 Transitional parsing ⧣ -PASS XHTML1.0 Transitional parsing ⩱ -PASS XHTML1.0 Transitional parsing ε -PASS XHTML1.0 Transitional parsing Ε -PASS XHTML1.0 Transitional parsing ε -PASS XHTML1.0 Transitional parsing ϵ -PASS XHTML1.0 Transitional parsing ≖ -PASS XHTML1.0 Transitional parsing ≕ -PASS XHTML1.0 Transitional parsing ≂ -PASS XHTML1.0 Transitional parsing ⪖ -PASS XHTML1.0 Transitional parsing ⪕ -PASS XHTML1.0 Transitional parsing ⩵ -PASS XHTML1.0 Transitional parsing = -PASS XHTML1.0 Transitional parsing ≂ -PASS XHTML1.0 Transitional parsing ≟ -PASS XHTML1.0 Transitional parsing ⇌ -PASS XHTML1.0 Transitional parsing ≡ -PASS XHTML1.0 Transitional parsing ⩸ -PASS XHTML1.0 Transitional parsing ⧥ -PASS XHTML1.0 Transitional parsing ⥱ -PASS XHTML1.0 Transitional parsing ≓ -PASS XHTML1.0 Transitional parsing ℯ -PASS XHTML1.0 Transitional parsing ℰ -PASS XHTML1.0 Transitional parsing ≐ -PASS XHTML1.0 Transitional parsing ⩳ -PASS XHTML1.0 Transitional parsing ≂ -PASS XHTML1.0 Transitional parsing Η -PASS XHTML1.0 Transitional parsing η -PASS XHTML1.0 Transitional parsing Ð -PASS XHTML1.0 Transitional parsing ð -PASS XHTML1.0 Transitional parsing Ë -PASS XHTML1.0 Transitional parsing ë -PASS XHTML1.0 Transitional parsing € -PASS XHTML1.0 Transitional parsing ! -PASS XHTML1.0 Transitional parsing ∃ -PASS XHTML1.0 Transitional parsing ∃ -PASS XHTML1.0 Transitional parsing ℰ -PASS XHTML1.0 Transitional parsing ⅇ -PASS XHTML1.0 Transitional parsing ⅇ -PASS XHTML1.0 Transitional parsing ≒ -PASS XHTML1.0 Transitional parsing Ф -PASS XHTML1.0 Transitional parsing ф -PASS XHTML1.0 Transitional parsing ♀ -PASS XHTML1.0 Transitional parsing ffi -PASS XHTML1.0 Transitional parsing ff -PASS XHTML1.0 Transitional parsing ffl -PASS XHTML1.0 Transitional parsing 𝔉 -PASS XHTML1.0 Transitional parsing 𝔣 -PASS XHTML1.0 Transitional parsing fi -PASS XHTML1.0 Transitional parsing ◼ -PASS XHTML1.0 Transitional parsing ▪ -PASS XHTML1.0 Transitional parsing fj -PASS XHTML1.0 Transitional parsing ♭ -PASS XHTML1.0 Transitional parsing fl -PASS XHTML1.0 Transitional parsing ▱ -PASS XHTML1.0 Transitional parsing ƒ -PASS XHTML1.0 Transitional parsing 𝔽 -PASS XHTML1.0 Transitional parsing 𝕗 -PASS XHTML1.0 Transitional parsing ∀ -PASS XHTML1.0 Transitional parsing ∀ -PASS XHTML1.0 Transitional parsing ⋔ -PASS XHTML1.0 Transitional parsing ⫙ -PASS XHTML1.0 Transitional parsing ℱ -PASS XHTML1.0 Transitional parsing ⨍ -PASS XHTML1.0 Transitional parsing ½ -PASS XHTML1.0 Transitional parsing ⅓ -PASS XHTML1.0 Transitional parsing ¼ -PASS XHTML1.0 Transitional parsing ⅕ -PASS XHTML1.0 Transitional parsing ⅙ -PASS XHTML1.0 Transitional parsing ⅛ -PASS XHTML1.0 Transitional parsing ⅔ -PASS XHTML1.0 Transitional parsing ⅖ -PASS XHTML1.0 Transitional parsing ¾ -PASS XHTML1.0 Transitional parsing ⅗ -PASS XHTML1.0 Transitional parsing ⅜ -PASS XHTML1.0 Transitional parsing ⅘ -PASS XHTML1.0 Transitional parsing ⅚ -PASS XHTML1.0 Transitional parsing ⅝ -PASS XHTML1.0 Transitional parsing ⅞ -PASS XHTML1.0 Transitional parsing ⁄ -PASS XHTML1.0 Transitional parsing ⌢ -PASS XHTML1.0 Transitional parsing 𝒻 -PASS XHTML1.0 Transitional parsing ℱ -PASS XHTML1.0 Transitional parsing ǵ -PASS XHTML1.0 Transitional parsing Γ -PASS XHTML1.0 Transitional parsing γ -PASS XHTML1.0 Transitional parsing Ϝ -PASS XHTML1.0 Transitional parsing ϝ -PASS XHTML1.0 Transitional parsing ⪆ -PASS XHTML1.0 Transitional parsing Ğ -PASS XHTML1.0 Transitional parsing ğ -PASS XHTML1.0 Transitional parsing Ģ -PASS XHTML1.0 Transitional parsing Ĝ -PASS XHTML1.0 Transitional parsing ĝ -PASS XHTML1.0 Transitional parsing Г -PASS XHTML1.0 Transitional parsing г -PASS XHTML1.0 Transitional parsing Ġ -PASS XHTML1.0 Transitional parsing ġ -PASS XHTML1.0 Transitional parsing ≥ -PASS XHTML1.0 Transitional parsing ≧ -PASS XHTML1.0 Transitional parsing ⪌ -PASS XHTML1.0 Transitional parsing ⋛ -PASS XHTML1.0 Transitional parsing ≥ -PASS XHTML1.0 Transitional parsing ≧ -PASS XHTML1.0 Transitional parsing ⩾ -PASS XHTML1.0 Transitional parsing ⪩ -PASS XHTML1.0 Transitional parsing ⩾ -PASS XHTML1.0 Transitional parsing ⪀ -PASS XHTML1.0 Transitional parsing ⪂ -PASS XHTML1.0 Transitional parsing ⪄ -PASS XHTML1.0 Transitional parsing ⋛︀ -PASS XHTML1.0 Transitional parsing ⪔ -PASS XHTML1.0 Transitional parsing 𝔊 -PASS XHTML1.0 Transitional parsing 𝔤 -PASS XHTML1.0 Transitional parsing ≫ -PASS XHTML1.0 Transitional parsing ⋙ -PASS XHTML1.0 Transitional parsing ⋙ -PASS XHTML1.0 Transitional parsing ℷ -PASS XHTML1.0 Transitional parsing Ѓ -PASS XHTML1.0 Transitional parsing ѓ -PASS XHTML1.0 Transitional parsing ⪥ -PASS XHTML1.0 Transitional parsing ≷ -PASS XHTML1.0 Transitional parsing ⪒ -PASS XHTML1.0 Transitional parsing ⪤ -PASS XHTML1.0 Transitional parsing ⪊ -PASS XHTML1.0 Transitional parsing ⪊ -PASS XHTML1.0 Transitional parsing ⪈ -PASS XHTML1.0 Transitional parsing ≩ -PASS XHTML1.0 Transitional parsing ⪈ -PASS XHTML1.0 Transitional parsing ≩ -PASS XHTML1.0 Transitional parsing ⋧ -PASS XHTML1.0 Transitional parsing 𝔾 -PASS XHTML1.0 Transitional parsing 𝕘 -PASS XHTML1.0 Transitional parsing ` -PASS XHTML1.0 Transitional parsing ≥ -PASS XHTML1.0 Transitional parsing ⋛ -PASS XHTML1.0 Transitional parsing ≧ -PASS XHTML1.0 Transitional parsing ⪢ -PASS XHTML1.0 Transitional parsing ≷ -PASS XHTML1.0 Transitional parsing ⩾ -PASS XHTML1.0 Transitional parsing ≳ -PASS XHTML1.0 Transitional parsing 𝒢 -PASS XHTML1.0 Transitional parsing ℊ -PASS XHTML1.0 Transitional parsing ≳ -PASS XHTML1.0 Transitional parsing ⪎ -PASS XHTML1.0 Transitional parsing ⪐ -PASS XHTML1.0 Transitional parsing ⪧ -PASS XHTML1.0 Transitional parsing ⩺ -PASS XHTML1.0 Transitional parsing > -PASS XHTML1.0 Transitional parsing > -PASS XHTML1.0 Transitional parsing ≫ -PASS XHTML1.0 Transitional parsing ⋗ -PASS XHTML1.0 Transitional parsing ⦕ -PASS XHTML1.0 Transitional parsing ⩼ -PASS XHTML1.0 Transitional parsing ⪆ -PASS XHTML1.0 Transitional parsing ⥸ -PASS XHTML1.0 Transitional parsing ⋗ -PASS XHTML1.0 Transitional parsing ⋛ -PASS XHTML1.0 Transitional parsing ⪌ -PASS XHTML1.0 Transitional parsing ≷ -PASS XHTML1.0 Transitional parsing ≳ -PASS XHTML1.0 Transitional parsing ≩︀ -PASS XHTML1.0 Transitional parsing ≩︀ -PASS XHTML1.0 Transitional parsing ˇ -PASS XHTML1.0 Transitional parsing   -PASS XHTML1.0 Transitional parsing ½ -PASS XHTML1.0 Transitional parsing ℋ -PASS XHTML1.0 Transitional parsing Ъ -PASS XHTML1.0 Transitional parsing ъ -PASS XHTML1.0 Transitional parsing ⥈ -PASS XHTML1.0 Transitional parsing ↔ -PASS XHTML1.0 Transitional parsing ⇔ -PASS XHTML1.0 Transitional parsing ↭ -PASS XHTML1.0 Transitional parsing ^ -PASS XHTML1.0 Transitional parsing ℏ -PASS XHTML1.0 Transitional parsing Ĥ -PASS XHTML1.0 Transitional parsing ĥ -PASS XHTML1.0 Transitional parsing ♥ -PASS XHTML1.0 Transitional parsing ♥ -PASS XHTML1.0 Transitional parsing … -PASS XHTML1.0 Transitional parsing ⊹ -PASS XHTML1.0 Transitional parsing 𝔥 -PASS XHTML1.0 Transitional parsing ℌ -PASS XHTML1.0 Transitional parsing ℋ -PASS XHTML1.0 Transitional parsing ⤥ -PASS XHTML1.0 Transitional parsing ⤦ -PASS XHTML1.0 Transitional parsing ⇿ -PASS XHTML1.0 Transitional parsing ∻ -PASS XHTML1.0 Transitional parsing ↩ -PASS XHTML1.0 Transitional parsing ↪ -PASS XHTML1.0 Transitional parsing 𝕙 -PASS XHTML1.0 Transitional parsing ℍ -PASS XHTML1.0 Transitional parsing ― -PASS XHTML1.0 Transitional parsing ─ -PASS XHTML1.0 Transitional parsing 𝒽 -PASS XHTML1.0 Transitional parsing ℋ -PASS XHTML1.0 Transitional parsing ℏ -PASS XHTML1.0 Transitional parsing Ħ -PASS XHTML1.0 Transitional parsing ħ -PASS XHTML1.0 Transitional parsing ≎ -PASS XHTML1.0 Transitional parsing ≏ -PASS XHTML1.0 Transitional parsing ⁃ -PASS XHTML1.0 Transitional parsing ‐ -PASS XHTML1.0 Transitional parsing Í -PASS XHTML1.0 Transitional parsing í -PASS XHTML1.0 Transitional parsing ⁣ -PASS XHTML1.0 Transitional parsing Î -PASS XHTML1.0 Transitional parsing î -PASS XHTML1.0 Transitional parsing И -PASS XHTML1.0 Transitional parsing и -PASS XHTML1.0 Transitional parsing İ -PASS XHTML1.0 Transitional parsing Е -PASS XHTML1.0 Transitional parsing е -PASS XHTML1.0 Transitional parsing ¡ -PASS XHTML1.0 Transitional parsing ⇔ -PASS XHTML1.0 Transitional parsing 𝔦 -PASS XHTML1.0 Transitional parsing ℑ -PASS XHTML1.0 Transitional parsing Ì -PASS XHTML1.0 Transitional parsing ì -PASS XHTML1.0 Transitional parsing ⅈ -PASS XHTML1.0 Transitional parsing ⨌ -PASS XHTML1.0 Transitional parsing ∭ -PASS XHTML1.0 Transitional parsing ⧜ -PASS XHTML1.0 Transitional parsing ℩ -PASS XHTML1.0 Transitional parsing IJ -PASS XHTML1.0 Transitional parsing ij -PASS XHTML1.0 Transitional parsing Ī -PASS XHTML1.0 Transitional parsing ī -PASS XHTML1.0 Transitional parsing ℑ -PASS XHTML1.0 Transitional parsing ⅈ -PASS XHTML1.0 Transitional parsing ℐ -PASS XHTML1.0 Transitional parsing ℑ -PASS XHTML1.0 Transitional parsing ı -PASS XHTML1.0 Transitional parsing ℑ -PASS XHTML1.0 Transitional parsing ⊷ -PASS XHTML1.0 Transitional parsing Ƶ -PASS XHTML1.0 Transitional parsing ⇒ -PASS XHTML1.0 Transitional parsing ℅ -PASS XHTML1.0 Transitional parsing ∈ -PASS XHTML1.0 Transitional parsing ∞ -PASS XHTML1.0 Transitional parsing ⧝ -PASS XHTML1.0 Transitional parsing ı -PASS XHTML1.0 Transitional parsing ⊺ -PASS XHTML1.0 Transitional parsing ∫ -PASS XHTML1.0 Transitional parsing ∬ -PASS XHTML1.0 Transitional parsing ℤ -PASS XHTML1.0 Transitional parsing ∫ -PASS XHTML1.0 Transitional parsing ⊺ -PASS XHTML1.0 Transitional parsing ⋂ -PASS XHTML1.0 Transitional parsing ⨗ -PASS XHTML1.0 Transitional parsing ⨼ -PASS XHTML1.0 Transitional parsing ⁣ -PASS XHTML1.0 Transitional parsing ⁢ -PASS XHTML1.0 Transitional parsing Ё -PASS XHTML1.0 Transitional parsing ё -PASS XHTML1.0 Transitional parsing Į -PASS XHTML1.0 Transitional parsing į -PASS XHTML1.0 Transitional parsing 𝕀 -PASS XHTML1.0 Transitional parsing 𝕚 -PASS XHTML1.0 Transitional parsing Ι -PASS XHTML1.0 Transitional parsing ι -PASS XHTML1.0 Transitional parsing ⨼ -PASS XHTML1.0 Transitional parsing ¿ -PASS XHTML1.0 Transitional parsing 𝒾 -PASS XHTML1.0 Transitional parsing ℐ -PASS XHTML1.0 Transitional parsing ∈ -PASS XHTML1.0 Transitional parsing ⋵ -PASS XHTML1.0 Transitional parsing ⋹ -PASS XHTML1.0 Transitional parsing ⋴ -PASS XHTML1.0 Transitional parsing ⋳ -PASS XHTML1.0 Transitional parsing ∈ -PASS XHTML1.0 Transitional parsing ⁢ -PASS XHTML1.0 Transitional parsing Ĩ -PASS XHTML1.0 Transitional parsing ĩ -PASS XHTML1.0 Transitional parsing І -PASS XHTML1.0 Transitional parsing і -PASS XHTML1.0 Transitional parsing Ï -PASS XHTML1.0 Transitional parsing ï -PASS XHTML1.0 Transitional parsing Ĵ -PASS XHTML1.0 Transitional parsing ĵ -PASS XHTML1.0 Transitional parsing Й -PASS XHTML1.0 Transitional parsing й -PASS XHTML1.0 Transitional parsing 𝔍 -PASS XHTML1.0 Transitional parsing 𝔧 -PASS XHTML1.0 Transitional parsing ȷ -PASS XHTML1.0 Transitional parsing 𝕁 -PASS XHTML1.0 Transitional parsing 𝕛 -PASS XHTML1.0 Transitional parsing 𝒥 -PASS XHTML1.0 Transitional parsing 𝒿 -PASS XHTML1.0 Transitional parsing Ј -PASS XHTML1.0 Transitional parsing ј -PASS XHTML1.0 Transitional parsing Є -PASS XHTML1.0 Transitional parsing є -PASS XHTML1.0 Transitional parsing Κ -PASS XHTML1.0 Transitional parsing κ -PASS XHTML1.0 Transitional parsing ϰ -PASS XHTML1.0 Transitional parsing Ķ -PASS XHTML1.0 Transitional parsing ķ -PASS XHTML1.0 Transitional parsing К -PASS XHTML1.0 Transitional parsing к -PASS XHTML1.0 Transitional parsing 𝔎 -PASS XHTML1.0 Transitional parsing 𝔨 -PASS XHTML1.0 Transitional parsing ĸ -PASS XHTML1.0 Transitional parsing Х -PASS XHTML1.0 Transitional parsing х -PASS XHTML1.0 Transitional parsing Ќ -PASS XHTML1.0 Transitional parsing ќ -PASS XHTML1.0 Transitional parsing 𝕂 -PASS XHTML1.0 Transitional parsing 𝕜 -PASS XHTML1.0 Transitional parsing 𝒦 -PASS XHTML1.0 Transitional parsing 𝓀 -PASS XHTML1.0 Transitional parsing ⇚ -PASS XHTML1.0 Transitional parsing Ĺ -PASS XHTML1.0 Transitional parsing ĺ -PASS XHTML1.0 Transitional parsing ⦴ -PASS XHTML1.0 Transitional parsing ℒ -PASS XHTML1.0 Transitional parsing Λ -PASS XHTML1.0 Transitional parsing λ -PASS XHTML1.0 Transitional parsing ⟨ -PASS XHTML1.0 Transitional parsing ⟪ -PASS XHTML1.0 Transitional parsing ⦑ -PASS XHTML1.0 Transitional parsing ⟨ -PASS XHTML1.0 Transitional parsing ⪅ -PASS XHTML1.0 Transitional parsing ℒ -PASS XHTML1.0 Transitional parsing « -PASS XHTML1.0 Transitional parsing ⇤ -PASS XHTML1.0 Transitional parsing ⤟ -PASS XHTML1.0 Transitional parsing ← -PASS XHTML1.0 Transitional parsing ↞ -PASS XHTML1.0 Transitional parsing ⇐ -PASS XHTML1.0 Transitional parsing ⤝ -PASS XHTML1.0 Transitional parsing ↩ -PASS XHTML1.0 Transitional parsing ↫ -PASS XHTML1.0 Transitional parsing ⤹ -PASS XHTML1.0 Transitional parsing ⥳ -PASS XHTML1.0 Transitional parsing ↢ -PASS XHTML1.0 Transitional parsing ⤙ -PASS XHTML1.0 Transitional parsing ⤛ -PASS XHTML1.0 Transitional parsing ⪫ -PASS XHTML1.0 Transitional parsing ⪭ -PASS XHTML1.0 Transitional parsing ⪭︀ -PASS XHTML1.0 Transitional parsing ⤌ -PASS XHTML1.0 Transitional parsing ⤎ -PASS XHTML1.0 Transitional parsing ❲ -PASS XHTML1.0 Transitional parsing { -PASS XHTML1.0 Transitional parsing [ -PASS XHTML1.0 Transitional parsing ⦋ -PASS XHTML1.0 Transitional parsing ⦏ -PASS XHTML1.0 Transitional parsing ⦍ -PASS XHTML1.0 Transitional parsing Ľ -PASS XHTML1.0 Transitional parsing ľ -PASS XHTML1.0 Transitional parsing Ļ -PASS XHTML1.0 Transitional parsing ļ -PASS XHTML1.0 Transitional parsing ⌈ -PASS XHTML1.0 Transitional parsing { -PASS XHTML1.0 Transitional parsing Л -PASS XHTML1.0 Transitional parsing л -PASS XHTML1.0 Transitional parsing ⤶ -PASS XHTML1.0 Transitional parsing “ -PASS XHTML1.0 Transitional parsing „ -PASS XHTML1.0 Transitional parsing ⥧ -PASS XHTML1.0 Transitional parsing ⥋ -PASS XHTML1.0 Transitional parsing ↲ -PASS XHTML1.0 Transitional parsing ≤ -PASS XHTML1.0 Transitional parsing ≦ -PASS XHTML1.0 Transitional parsing ⟨ -PASS XHTML1.0 Transitional parsing ⇤ -PASS XHTML1.0 Transitional parsing ← -PASS XHTML1.0 Transitional parsing ← -PASS XHTML1.0 Transitional parsing ⇐ -PASS XHTML1.0 Transitional parsing ⇆ -PASS XHTML1.0 Transitional parsing ↢ -PASS XHTML1.0 Transitional parsing ⌈ -PASS XHTML1.0 Transitional parsing ⟦ -PASS XHTML1.0 Transitional parsing ⥡ -PASS XHTML1.0 Transitional parsing ⥙ -PASS XHTML1.0 Transitional parsing ⇃ -PASS XHTML1.0 Transitional parsing ⌊ -PASS XHTML1.0 Transitional parsing ↽ -PASS XHTML1.0 Transitional parsing ↼ -PASS XHTML1.0 Transitional parsing ⇇ -PASS XHTML1.0 Transitional parsing ↔ -PASS XHTML1.0 Transitional parsing ↔ -PASS XHTML1.0 Transitional parsing ⇔ -PASS XHTML1.0 Transitional parsing ⇆ -PASS XHTML1.0 Transitional parsing ⇋ -PASS XHTML1.0 Transitional parsing ↭ -PASS XHTML1.0 Transitional parsing ⥎ -PASS XHTML1.0 Transitional parsing ↤ -PASS XHTML1.0 Transitional parsing ⊣ -PASS XHTML1.0 Transitional parsing ⥚ -PASS XHTML1.0 Transitional parsing ⋋ -PASS XHTML1.0 Transitional parsing ⧏ -PASS XHTML1.0 Transitional parsing ⊲ -PASS XHTML1.0 Transitional parsing ⊴ -PASS XHTML1.0 Transitional parsing ⥑ -PASS XHTML1.0 Transitional parsing ⥠ -PASS XHTML1.0 Transitional parsing ⥘ -PASS XHTML1.0 Transitional parsing ↿ -PASS XHTML1.0 Transitional parsing ⥒ -PASS XHTML1.0 Transitional parsing ↼ -PASS XHTML1.0 Transitional parsing ⪋ -PASS XHTML1.0 Transitional parsing ⋚ -PASS XHTML1.0 Transitional parsing ≤ -PASS XHTML1.0 Transitional parsing ≦ -PASS XHTML1.0 Transitional parsing ⩽ -PASS XHTML1.0 Transitional parsing ⪨ -PASS XHTML1.0 Transitional parsing ⩽ -PASS XHTML1.0 Transitional parsing ⩿ -PASS XHTML1.0 Transitional parsing ⪁ -PASS XHTML1.0 Transitional parsing ⪃ -PASS XHTML1.0 Transitional parsing ⋚︀ -PASS XHTML1.0 Transitional parsing ⪓ -PASS XHTML1.0 Transitional parsing ⪅ -PASS XHTML1.0 Transitional parsing ⋖ -PASS XHTML1.0 Transitional parsing ⋚ -PASS XHTML1.0 Transitional parsing ⪋ -PASS XHTML1.0 Transitional parsing ⋚ -PASS XHTML1.0 Transitional parsing ≦ -PASS XHTML1.0 Transitional parsing ≶ -PASS XHTML1.0 Transitional parsing ≶ -PASS XHTML1.0 Transitional parsing ⪡ -PASS XHTML1.0 Transitional parsing ≲ -PASS XHTML1.0 Transitional parsing ⩽ -PASS XHTML1.0 Transitional parsing ≲ -PASS XHTML1.0 Transitional parsing ⥼ -PASS XHTML1.0 Transitional parsing ⌊ -PASS XHTML1.0 Transitional parsing 𝔏 -PASS XHTML1.0 Transitional parsing 𝔩 -PASS XHTML1.0 Transitional parsing ≶ -PASS XHTML1.0 Transitional parsing ⪑ -PASS XHTML1.0 Transitional parsing ⥢ -PASS XHTML1.0 Transitional parsing ↽ -PASS XHTML1.0 Transitional parsing ↼ -PASS XHTML1.0 Transitional parsing ⥪ -PASS XHTML1.0 Transitional parsing ▄ -PASS XHTML1.0 Transitional parsing Љ -PASS XHTML1.0 Transitional parsing љ -PASS XHTML1.0 Transitional parsing ⇇ -PASS XHTML1.0 Transitional parsing ≪ -PASS XHTML1.0 Transitional parsing ⋘ -PASS XHTML1.0 Transitional parsing ⌞ -PASS XHTML1.0 Transitional parsing ⇚ -PASS XHTML1.0 Transitional parsing ⥫ -PASS XHTML1.0 Transitional parsing ◺ -PASS XHTML1.0 Transitional parsing Ŀ -PASS XHTML1.0 Transitional parsing ŀ -PASS XHTML1.0 Transitional parsing ⎰ -PASS XHTML1.0 Transitional parsing ⎰ -PASS XHTML1.0 Transitional parsing ⪉ -PASS XHTML1.0 Transitional parsing ⪉ -PASS XHTML1.0 Transitional parsing ⪇ -PASS XHTML1.0 Transitional parsing ≨ -PASS XHTML1.0 Transitional parsing ⪇ -PASS XHTML1.0 Transitional parsing ≨ -PASS XHTML1.0 Transitional parsing ⋦ -PASS XHTML1.0 Transitional parsing ⟬ -PASS XHTML1.0 Transitional parsing ⇽ -PASS XHTML1.0 Transitional parsing ⟦ -PASS XHTML1.0 Transitional parsing ⟵ -PASS XHTML1.0 Transitional parsing ⟵ -PASS XHTML1.0 Transitional parsing ⟸ -PASS XHTML1.0 Transitional parsing ⟷ -PASS XHTML1.0 Transitional parsing ⟷ -PASS XHTML1.0 Transitional parsing ⟺ -PASS XHTML1.0 Transitional parsing ⟼ -PASS XHTML1.0 Transitional parsing ⟶ -PASS XHTML1.0 Transitional parsing ⟶ -PASS XHTML1.0 Transitional parsing ⟹ -PASS XHTML1.0 Transitional parsing ↫ -PASS XHTML1.0 Transitional parsing ↬ -PASS XHTML1.0 Transitional parsing ⦅ -PASS XHTML1.0 Transitional parsing 𝕃 -PASS XHTML1.0 Transitional parsing 𝕝 -PASS XHTML1.0 Transitional parsing ⨭ -PASS XHTML1.0 Transitional parsing ⨴ -PASS XHTML1.0 Transitional parsing ∗ -PASS XHTML1.0 Transitional parsing _ -PASS XHTML1.0 Transitional parsing ↙ -PASS XHTML1.0 Transitional parsing ↘ -PASS XHTML1.0 Transitional parsing ◊ -PASS XHTML1.0 Transitional parsing ◊ -PASS XHTML1.0 Transitional parsing ⧫ -PASS XHTML1.0 Transitional parsing ( -PASS XHTML1.0 Transitional parsing ⦓ -PASS XHTML1.0 Transitional parsing ⇆ -PASS XHTML1.0 Transitional parsing ⌟ -PASS XHTML1.0 Transitional parsing ⇋ -PASS XHTML1.0 Transitional parsing ⥭ -PASS XHTML1.0 Transitional parsing ‎ -PASS XHTML1.0 Transitional parsing ⊿ -PASS XHTML1.0 Transitional parsing ‹ -PASS XHTML1.0 Transitional parsing 𝓁 -PASS XHTML1.0 Transitional parsing ℒ -PASS XHTML1.0 Transitional parsing ↰ -PASS XHTML1.0 Transitional parsing ↰ -PASS XHTML1.0 Transitional parsing ≲ -PASS XHTML1.0 Transitional parsing ⪍ -PASS XHTML1.0 Transitional parsing ⪏ -PASS XHTML1.0 Transitional parsing [ -PASS XHTML1.0 Transitional parsing ‘ -PASS XHTML1.0 Transitional parsing ‚ -PASS XHTML1.0 Transitional parsing Ł -PASS XHTML1.0 Transitional parsing ł -PASS XHTML1.0 Transitional parsing ⪦ -PASS XHTML1.0 Transitional parsing ⩹ -PASS XHTML1.0 Transitional parsing < -FAIL XHTML1.0 Transitional parsing < assert_true: expected true got false -PASS XHTML1.0 Transitional parsing ≪ -PASS XHTML1.0 Transitional parsing ⋖ -PASS XHTML1.0 Transitional parsing ⋋ -PASS XHTML1.0 Transitional parsing ⋉ -PASS XHTML1.0 Transitional parsing ⥶ -PASS XHTML1.0 Transitional parsing ⩻ -PASS XHTML1.0 Transitional parsing ◃ -PASS XHTML1.0 Transitional parsing ⊴ -PASS XHTML1.0 Transitional parsing ◂ -PASS XHTML1.0 Transitional parsing ⦖ -PASS XHTML1.0 Transitional parsing ⥊ -PASS XHTML1.0 Transitional parsing ⥦ -PASS XHTML1.0 Transitional parsing ≨︀ -PASS XHTML1.0 Transitional parsing ≨︀ -PASS XHTML1.0 Transitional parsing ¯ -PASS XHTML1.0 Transitional parsing ♂ -PASS XHTML1.0 Transitional parsing ✠ -PASS XHTML1.0 Transitional parsing ✠ -PASS XHTML1.0 Transitional parsing ⤅ -PASS XHTML1.0 Transitional parsing ↦ -PASS XHTML1.0 Transitional parsing ↦ -PASS XHTML1.0 Transitional parsing ↧ -PASS XHTML1.0 Transitional parsing ↤ -PASS XHTML1.0 Transitional parsing ↥ -PASS XHTML1.0 Transitional parsing ▮ -PASS XHTML1.0 Transitional parsing ⨩ -PASS XHTML1.0 Transitional parsing М -PASS XHTML1.0 Transitional parsing м -PASS XHTML1.0 Transitional parsing — -PASS XHTML1.0 Transitional parsing ∺ -PASS XHTML1.0 Transitional parsing ∡ -PASS XHTML1.0 Transitional parsing   -PASS XHTML1.0 Transitional parsing ℳ -PASS XHTML1.0 Transitional parsing 𝔐 -PASS XHTML1.0 Transitional parsing 𝔪 -PASS XHTML1.0 Transitional parsing ℧ -PASS XHTML1.0 Transitional parsing µ -PASS XHTML1.0 Transitional parsing * -PASS XHTML1.0 Transitional parsing ⫰ -PASS XHTML1.0 Transitional parsing ∣ -PASS XHTML1.0 Transitional parsing · -PASS XHTML1.0 Transitional parsing ⊟ -PASS XHTML1.0 Transitional parsing − -PASS XHTML1.0 Transitional parsing ∸ -PASS XHTML1.0 Transitional parsing ⨪ -PASS XHTML1.0 Transitional parsing ∓ -PASS XHTML1.0 Transitional parsing ⫛ -PASS XHTML1.0 Transitional parsing … -PASS XHTML1.0 Transitional parsing ∓ -PASS XHTML1.0 Transitional parsing ⊧ -PASS XHTML1.0 Transitional parsing 𝕄 -PASS XHTML1.0 Transitional parsing 𝕞 -PASS XHTML1.0 Transitional parsing ∓ -PASS XHTML1.0 Transitional parsing 𝓂 -PASS XHTML1.0 Transitional parsing ℳ -PASS XHTML1.0 Transitional parsing ∾ -PASS XHTML1.0 Transitional parsing Μ -PASS XHTML1.0 Transitional parsing μ -PASS XHTML1.0 Transitional parsing ⊸ -PASS XHTML1.0 Transitional parsing ⊸ -PASS XHTML1.0 Transitional parsing ∇ -PASS XHTML1.0 Transitional parsing Ń -PASS XHTML1.0 Transitional parsing ń -PASS XHTML1.0 Transitional parsing ∠⃒ -PASS XHTML1.0 Transitional parsing ≉ -PASS XHTML1.0 Transitional parsing ⩰̸ -PASS XHTML1.0 Transitional parsing ≋̸ -PASS XHTML1.0 Transitional parsing ʼn -PASS XHTML1.0 Transitional parsing ≉ -PASS XHTML1.0 Transitional parsing ♮ -PASS XHTML1.0 Transitional parsing ℕ -PASS XHTML1.0 Transitional parsing ♮ -PASS XHTML1.0 Transitional parsing -PASS XHTML1.0 Transitional parsing ≎̸ -PASS XHTML1.0 Transitional parsing ≏̸ -PASS XHTML1.0 Transitional parsing ⩃ -PASS XHTML1.0 Transitional parsing Ň -PASS XHTML1.0 Transitional parsing ň -PASS XHTML1.0 Transitional parsing Ņ -PASS XHTML1.0 Transitional parsing ņ -PASS XHTML1.0 Transitional parsing ≇ -PASS XHTML1.0 Transitional parsing ⩭̸ -PASS XHTML1.0 Transitional parsing ⩂ -PASS XHTML1.0 Transitional parsing Н -PASS XHTML1.0 Transitional parsing н -PASS XHTML1.0 Transitional parsing – -PASS XHTML1.0 Transitional parsing ⤤ -PASS XHTML1.0 Transitional parsing ↗ -PASS XHTML1.0 Transitional parsing ⇗ -PASS XHTML1.0 Transitional parsing ↗ -PASS XHTML1.0 Transitional parsing ≠ -PASS XHTML1.0 Transitional parsing ≐̸ -PASS XHTML1.0 Transitional parsing ​ -PASS XHTML1.0 Transitional parsing ​ -PASS XHTML1.0 Transitional parsing ​ -PASS XHTML1.0 Transitional parsing ​ -PASS XHTML1.0 Transitional parsing ≢ -PASS XHTML1.0 Transitional parsing ⤨ -PASS XHTML1.0 Transitional parsing ≂̸ -PASS XHTML1.0 Transitional parsing ≫ -PASS XHTML1.0 Transitional parsing ≪ -PASS XHTML1.0 Transitional parsing 
 -PASS XHTML1.0 Transitional parsing ∄ -PASS XHTML1.0 Transitional parsing ∄ -PASS XHTML1.0 Transitional parsing 𝔑 -PASS XHTML1.0 Transitional parsing 𝔫 -PASS XHTML1.0 Transitional parsing ≧̸ -PASS XHTML1.0 Transitional parsing ≱ -PASS XHTML1.0 Transitional parsing ≱ -PASS XHTML1.0 Transitional parsing ≧̸ -PASS XHTML1.0 Transitional parsing ⩾̸ -PASS XHTML1.0 Transitional parsing ⩾̸ -PASS XHTML1.0 Transitional parsing ⋙̸ -PASS XHTML1.0 Transitional parsing ≵ -PASS XHTML1.0 Transitional parsing ≫⃒ -PASS XHTML1.0 Transitional parsing ≯ -PASS XHTML1.0 Transitional parsing ≯ -PASS XHTML1.0 Transitional parsing ≫̸ -PASS XHTML1.0 Transitional parsing ↮ -PASS XHTML1.0 Transitional parsing ⇎ -PASS XHTML1.0 Transitional parsing ⫲ -PASS XHTML1.0 Transitional parsing ∋ -PASS XHTML1.0 Transitional parsing ⋼ -PASS XHTML1.0 Transitional parsing ⋺ -PASS XHTML1.0 Transitional parsing ∋ -PASS XHTML1.0 Transitional parsing Њ -PASS XHTML1.0 Transitional parsing њ -PASS XHTML1.0 Transitional parsing ↚ -PASS XHTML1.0 Transitional parsing ⇍ -PASS XHTML1.0 Transitional parsing ‥ -PASS XHTML1.0 Transitional parsing ≦̸ -PASS XHTML1.0 Transitional parsing ≰ -PASS XHTML1.0 Transitional parsing ↚ -PASS XHTML1.0 Transitional parsing ⇍ -PASS XHTML1.0 Transitional parsing ↮ -PASS XHTML1.0 Transitional parsing ⇎ -PASS XHTML1.0 Transitional parsing ≰ -PASS XHTML1.0 Transitional parsing ≦̸ -PASS XHTML1.0 Transitional parsing ⩽̸ -PASS XHTML1.0 Transitional parsing ⩽̸ -PASS XHTML1.0 Transitional parsing ≮ -PASS XHTML1.0 Transitional parsing ⋘̸ -PASS XHTML1.0 Transitional parsing ≴ -PASS XHTML1.0 Transitional parsing ≪⃒ -PASS XHTML1.0 Transitional parsing ≮ -PASS XHTML1.0 Transitional parsing ⋪ -PASS XHTML1.0 Transitional parsing ⋬ -PASS XHTML1.0 Transitional parsing ≪̸ -PASS XHTML1.0 Transitional parsing ∤ -PASS XHTML1.0 Transitional parsing ⁠ -PASS XHTML1.0 Transitional parsing   -PASS XHTML1.0 Transitional parsing 𝕟 -PASS XHTML1.0 Transitional parsing ℕ -PASS XHTML1.0 Transitional parsing ⫬ -PASS XHTML1.0 Transitional parsing ¬ -PASS XHTML1.0 Transitional parsing ≢ -PASS XHTML1.0 Transitional parsing ≭ -PASS XHTML1.0 Transitional parsing ∦ -PASS XHTML1.0 Transitional parsing ∉ -PASS XHTML1.0 Transitional parsing ≠ -PASS XHTML1.0 Transitional parsing ≂̸ -PASS XHTML1.0 Transitional parsing ∄ -PASS XHTML1.0 Transitional parsing ≯ -PASS XHTML1.0 Transitional parsing ≱ -PASS XHTML1.0 Transitional parsing ≧̸ -PASS XHTML1.0 Transitional parsing ≫̸ -PASS XHTML1.0 Transitional parsing ≹ -PASS XHTML1.0 Transitional parsing ⩾̸ -PASS XHTML1.0 Transitional parsing ≵ -PASS XHTML1.0 Transitional parsing ≎̸ -PASS XHTML1.0 Transitional parsing ≏̸ -PASS XHTML1.0 Transitional parsing ∉ -PASS XHTML1.0 Transitional parsing ⋵̸ -PASS XHTML1.0 Transitional parsing ⋹̸ -PASS XHTML1.0 Transitional parsing ∉ -PASS XHTML1.0 Transitional parsing ⋷ -PASS XHTML1.0 Transitional parsing ⋶ -PASS XHTML1.0 Transitional parsing ⧏̸ -PASS XHTML1.0 Transitional parsing ⋪ -PASS XHTML1.0 Transitional parsing ⋬ -PASS XHTML1.0 Transitional parsing ≮ -PASS XHTML1.0 Transitional parsing ≰ -PASS XHTML1.0 Transitional parsing ≸ -PASS XHTML1.0 Transitional parsing ≪̸ -PASS XHTML1.0 Transitional parsing ⩽̸ -PASS XHTML1.0 Transitional parsing ≴ -PASS XHTML1.0 Transitional parsing ⪢̸ -PASS XHTML1.0 Transitional parsing ⪡̸ -PASS XHTML1.0 Transitional parsing ∌ -PASS XHTML1.0 Transitional parsing ∌ -PASS XHTML1.0 Transitional parsing ⋾ -PASS XHTML1.0 Transitional parsing ⋽ -PASS XHTML1.0 Transitional parsing ⊀ -PASS XHTML1.0 Transitional parsing ⪯̸ -PASS XHTML1.0 Transitional parsing ⋠ -PASS XHTML1.0 Transitional parsing ∌ -PASS XHTML1.0 Transitional parsing ⧐̸ -PASS XHTML1.0 Transitional parsing ⋫ -PASS XHTML1.0 Transitional parsing ⋭ -PASS XHTML1.0 Transitional parsing ⊏̸ -PASS XHTML1.0 Transitional parsing ⋢ -PASS XHTML1.0 Transitional parsing ⊐̸ -PASS XHTML1.0 Transitional parsing ⋣ -PASS XHTML1.0 Transitional parsing ⊂⃒ -PASS XHTML1.0 Transitional parsing ⊈ -PASS XHTML1.0 Transitional parsing ⊁ -PASS XHTML1.0 Transitional parsing ⪰̸ -PASS XHTML1.0 Transitional parsing ⋡ -PASS XHTML1.0 Transitional parsing ≿̸ -PASS XHTML1.0 Transitional parsing ⊃⃒ -PASS XHTML1.0 Transitional parsing ⊉ -PASS XHTML1.0 Transitional parsing ≁ -PASS XHTML1.0 Transitional parsing ≄ -PASS XHTML1.0 Transitional parsing ≇ -PASS XHTML1.0 Transitional parsing ≉ -PASS XHTML1.0 Transitional parsing ∤ -PASS XHTML1.0 Transitional parsing ∦ -PASS XHTML1.0 Transitional parsing ∦ -PASS XHTML1.0 Transitional parsing ⫽⃥ -PASS XHTML1.0 Transitional parsing ∂̸ -PASS XHTML1.0 Transitional parsing ⨔ -PASS XHTML1.0 Transitional parsing ⊀ -PASS XHTML1.0 Transitional parsing ⋠ -PASS XHTML1.0 Transitional parsing ⊀ -PASS XHTML1.0 Transitional parsing ⪯̸ -PASS XHTML1.0 Transitional parsing ⪯̸ -PASS XHTML1.0 Transitional parsing ⤳̸ -PASS XHTML1.0 Transitional parsing ↛ -PASS XHTML1.0 Transitional parsing ⇏ -PASS XHTML1.0 Transitional parsing ↝̸ -PASS XHTML1.0 Transitional parsing ↛ -PASS XHTML1.0 Transitional parsing ⇏ -PASS XHTML1.0 Transitional parsing ⋫ -PASS XHTML1.0 Transitional parsing ⋭ -PASS XHTML1.0 Transitional parsing ⊁ -PASS XHTML1.0 Transitional parsing ⋡ -PASS XHTML1.0 Transitional parsing ⪰̸ -PASS XHTML1.0 Transitional parsing 𝒩 -PASS XHTML1.0 Transitional parsing 𝓃 -PASS XHTML1.0 Transitional parsing ∤ -PASS XHTML1.0 Transitional parsing ∦ -PASS XHTML1.0 Transitional parsing ≁ -PASS XHTML1.0 Transitional parsing ≄ -PASS XHTML1.0 Transitional parsing ≄ -PASS XHTML1.0 Transitional parsing ∤ -PASS XHTML1.0 Transitional parsing ∦ -PASS XHTML1.0 Transitional parsing ⋢ -PASS XHTML1.0 Transitional parsing ⋣ -PASS XHTML1.0 Transitional parsing ⊄ -PASS XHTML1.0 Transitional parsing ⫅̸ -PASS XHTML1.0 Transitional parsing ⊈ -PASS XHTML1.0 Transitional parsing ⊂⃒ -PASS XHTML1.0 Transitional parsing ⊈ -PASS XHTML1.0 Transitional parsing ⫅̸ -PASS XHTML1.0 Transitional parsing ⊁ -PASS XHTML1.0 Transitional parsing ⪰̸ -PASS XHTML1.0 Transitional parsing ⊅ -PASS XHTML1.0 Transitional parsing ⫆̸ -PASS XHTML1.0 Transitional parsing ⊉ -PASS XHTML1.0 Transitional parsing ⊃⃒ -PASS XHTML1.0 Transitional parsing ⊉ -PASS XHTML1.0 Transitional parsing ⫆̸ -PASS XHTML1.0 Transitional parsing ≹ -PASS XHTML1.0 Transitional parsing Ñ -PASS XHTML1.0 Transitional parsing ñ -PASS XHTML1.0 Transitional parsing ≸ -PASS XHTML1.0 Transitional parsing ⋪ -PASS XHTML1.0 Transitional parsing ⋬ -PASS XHTML1.0 Transitional parsing ⋫ -PASS XHTML1.0 Transitional parsing ⋭ -PASS XHTML1.0 Transitional parsing Ν -PASS XHTML1.0 Transitional parsing ν -PASS XHTML1.0 Transitional parsing # -PASS XHTML1.0 Transitional parsing № -PASS XHTML1.0 Transitional parsing   -PASS XHTML1.0 Transitional parsing ≍⃒ -PASS XHTML1.0 Transitional parsing ⊬ -PASS XHTML1.0 Transitional parsing ⊭ -PASS XHTML1.0 Transitional parsing ⊮ -PASS XHTML1.0 Transitional parsing ⊯ -PASS XHTML1.0 Transitional parsing ≥⃒ -PASS XHTML1.0 Transitional parsing >⃒ -PASS XHTML1.0 Transitional parsing ⤄ -PASS XHTML1.0 Transitional parsing ⧞ -PASS XHTML1.0 Transitional parsing ⤂ -PASS XHTML1.0 Transitional parsing ≤⃒ -FAIL XHTML1.0 Transitional parsing <⃒ assert_equals: XHTML1.0 Transitional parsing the entity reference caused a parse error; expected 3 but got 1 -PASS XHTML1.0 Transitional parsing ⊴⃒ -PASS XHTML1.0 Transitional parsing ⤃ -PASS XHTML1.0 Transitional parsing ⊵⃒ -PASS XHTML1.0 Transitional parsing ∼⃒ -PASS XHTML1.0 Transitional parsing ⤣ -PASS XHTML1.0 Transitional parsing ↖ -PASS XHTML1.0 Transitional parsing ⇖ -PASS XHTML1.0 Transitional parsing ↖ -PASS XHTML1.0 Transitional parsing ⤧ -PASS XHTML1.0 Transitional parsing Ó -PASS XHTML1.0 Transitional parsing ó -PASS XHTML1.0 Transitional parsing ⊛ -PASS XHTML1.0 Transitional parsing Ô -PASS XHTML1.0 Transitional parsing ô -PASS XHTML1.0 Transitional parsing ⊚ -PASS XHTML1.0 Transitional parsing О -PASS XHTML1.0 Transitional parsing о -PASS XHTML1.0 Transitional parsing ⊝ -PASS XHTML1.0 Transitional parsing Ő -PASS XHTML1.0 Transitional parsing ő -PASS XHTML1.0 Transitional parsing ⨸ -PASS XHTML1.0 Transitional parsing ⊙ -PASS XHTML1.0 Transitional parsing ⦼ -PASS XHTML1.0 Transitional parsing Œ -PASS XHTML1.0 Transitional parsing œ -PASS XHTML1.0 Transitional parsing ⦿ -PASS XHTML1.0 Transitional parsing 𝔒 -PASS XHTML1.0 Transitional parsing 𝔬 -PASS XHTML1.0 Transitional parsing ˛ -PASS XHTML1.0 Transitional parsing Ò -PASS XHTML1.0 Transitional parsing ò -PASS XHTML1.0 Transitional parsing ⧁ -PASS XHTML1.0 Transitional parsing ⦵ -PASS XHTML1.0 Transitional parsing Ω -PASS XHTML1.0 Transitional parsing ∮ -PASS XHTML1.0 Transitional parsing ↺ -PASS XHTML1.0 Transitional parsing ⦾ -PASS XHTML1.0 Transitional parsing ⦻ -PASS XHTML1.0 Transitional parsing ‾ -PASS XHTML1.0 Transitional parsing ⧀ -PASS XHTML1.0 Transitional parsing Ō -PASS XHTML1.0 Transitional parsing ō -PASS XHTML1.0 Transitional parsing Ω -PASS XHTML1.0 Transitional parsing ω -PASS XHTML1.0 Transitional parsing Ο -PASS XHTML1.0 Transitional parsing ο -PASS XHTML1.0 Transitional parsing ⦶ -PASS XHTML1.0 Transitional parsing ⊖ -PASS XHTML1.0 Transitional parsing 𝕆 -PASS XHTML1.0 Transitional parsing 𝕠 -PASS XHTML1.0 Transitional parsing ⦷ -PASS XHTML1.0 Transitional parsing “ -PASS XHTML1.0 Transitional parsing ‘ -PASS XHTML1.0 Transitional parsing ⦹ -PASS XHTML1.0 Transitional parsing ⊕ -PASS XHTML1.0 Transitional parsing ↻ -PASS XHTML1.0 Transitional parsing ⩔ -PASS XHTML1.0 Transitional parsing ∨ -PASS XHTML1.0 Transitional parsing ⩝ -PASS XHTML1.0 Transitional parsing ℴ -PASS XHTML1.0 Transitional parsing ℴ -PASS XHTML1.0 Transitional parsing ª -PASS XHTML1.0 Transitional parsing º -PASS XHTML1.0 Transitional parsing ⊶ -PASS XHTML1.0 Transitional parsing ⩖ -PASS XHTML1.0 Transitional parsing ⩗ -PASS XHTML1.0 Transitional parsing ⩛ -PASS XHTML1.0 Transitional parsing Ⓢ -PASS XHTML1.0 Transitional parsing 𝒪 -PASS XHTML1.0 Transitional parsing ℴ -PASS XHTML1.0 Transitional parsing Ø -PASS XHTML1.0 Transitional parsing ø -PASS XHTML1.0 Transitional parsing ⊘ -PASS XHTML1.0 Transitional parsing Õ -PASS XHTML1.0 Transitional parsing õ -PASS XHTML1.0 Transitional parsing ⨶ -PASS XHTML1.0 Transitional parsing ⨷ -PASS XHTML1.0 Transitional parsing ⊗ -PASS XHTML1.0 Transitional parsing Ö -PASS XHTML1.0 Transitional parsing ö -PASS XHTML1.0 Transitional parsing ⌽ -PASS XHTML1.0 Transitional parsing ‾ -PASS XHTML1.0 Transitional parsing ⏞ -PASS XHTML1.0 Transitional parsing ⎴ -PASS XHTML1.0 Transitional parsing ⏜ -PASS XHTML1.0 Transitional parsing ¶ -PASS XHTML1.0 Transitional parsing ∥ -PASS XHTML1.0 Transitional parsing ∥ -PASS XHTML1.0 Transitional parsing ⫳ -PASS XHTML1.0 Transitional parsing ⫽ -PASS XHTML1.0 Transitional parsing ∂ -PASS XHTML1.0 Transitional parsing ∂ -PASS XHTML1.0 Transitional parsing П -PASS XHTML1.0 Transitional parsing п -PASS XHTML1.0 Transitional parsing % -PASS XHTML1.0 Transitional parsing . -PASS XHTML1.0 Transitional parsing ‰ -PASS XHTML1.0 Transitional parsing ⊥ -PASS XHTML1.0 Transitional parsing ‱ -PASS XHTML1.0 Transitional parsing 𝔓 -PASS XHTML1.0 Transitional parsing 𝔭 -PASS XHTML1.0 Transitional parsing Φ -PASS XHTML1.0 Transitional parsing φ -PASS XHTML1.0 Transitional parsing ϕ -PASS XHTML1.0 Transitional parsing ℳ -PASS XHTML1.0 Transitional parsing ☎ -PASS XHTML1.0 Transitional parsing Π -PASS XHTML1.0 Transitional parsing π -PASS XHTML1.0 Transitional parsing ⋔ -PASS XHTML1.0 Transitional parsing ϖ -PASS XHTML1.0 Transitional parsing ℏ -PASS XHTML1.0 Transitional parsing ℎ -PASS XHTML1.0 Transitional parsing ℏ -PASS XHTML1.0 Transitional parsing ⨣ -PASS XHTML1.0 Transitional parsing ⊞ -PASS XHTML1.0 Transitional parsing ⨢ -PASS XHTML1.0 Transitional parsing + -PASS XHTML1.0 Transitional parsing ∔ -PASS XHTML1.0 Transitional parsing ⨥ -PASS XHTML1.0 Transitional parsing ⩲ -PASS XHTML1.0 Transitional parsing ± -PASS XHTML1.0 Transitional parsing ± -PASS XHTML1.0 Transitional parsing ⨦ -PASS XHTML1.0 Transitional parsing ⨧ -PASS XHTML1.0 Transitional parsing ± -PASS XHTML1.0 Transitional parsing ℌ -PASS XHTML1.0 Transitional parsing ⨕ -PASS XHTML1.0 Transitional parsing 𝕡 -PASS XHTML1.0 Transitional parsing ℙ -PASS XHTML1.0 Transitional parsing £ -PASS XHTML1.0 Transitional parsing ⪷ -PASS XHTML1.0 Transitional parsing ⪻ -PASS XHTML1.0 Transitional parsing ≺ -PASS XHTML1.0 Transitional parsing ≼ -PASS XHTML1.0 Transitional parsing ⪷ -PASS XHTML1.0 Transitional parsing ≺ -PASS XHTML1.0 Transitional parsing ≼ -PASS XHTML1.0 Transitional parsing ≺ -PASS XHTML1.0 Transitional parsing ⪯ -PASS XHTML1.0 Transitional parsing ≼ -PASS XHTML1.0 Transitional parsing ≾ -PASS XHTML1.0 Transitional parsing ⪯ -PASS XHTML1.0 Transitional parsing ⪹ -PASS XHTML1.0 Transitional parsing ⪵ -PASS XHTML1.0 Transitional parsing ⋨ -PASS XHTML1.0 Transitional parsing ⪯ -PASS XHTML1.0 Transitional parsing ⪳ -PASS XHTML1.0 Transitional parsing ≾ -PASS XHTML1.0 Transitional parsing ′ -PASS XHTML1.0 Transitional parsing ″ -PASS XHTML1.0 Transitional parsing ℙ -PASS XHTML1.0 Transitional parsing ⪹ -PASS XHTML1.0 Transitional parsing ⪵ -PASS XHTML1.0 Transitional parsing ⋨ -PASS XHTML1.0 Transitional parsing ∏ -PASS XHTML1.0 Transitional parsing ∏ -PASS XHTML1.0 Transitional parsing ⌮ -PASS XHTML1.0 Transitional parsing ⌒ -PASS XHTML1.0 Transitional parsing ⌓ -PASS XHTML1.0 Transitional parsing ∝ -PASS XHTML1.0 Transitional parsing ∝ -PASS XHTML1.0 Transitional parsing ∷ -PASS XHTML1.0 Transitional parsing ∝ -PASS XHTML1.0 Transitional parsing ≾ -PASS XHTML1.0 Transitional parsing ⊰ -PASS XHTML1.0 Transitional parsing 𝒫 -PASS XHTML1.0 Transitional parsing 𝓅 -PASS XHTML1.0 Transitional parsing Ψ -PASS XHTML1.0 Transitional parsing ψ -PASS XHTML1.0 Transitional parsing   -PASS XHTML1.0 Transitional parsing 𝔔 -PASS XHTML1.0 Transitional parsing 𝔮 -PASS XHTML1.0 Transitional parsing ⨌ -PASS XHTML1.0 Transitional parsing 𝕢 -PASS XHTML1.0 Transitional parsing ℚ -PASS XHTML1.0 Transitional parsing ⁗ -PASS XHTML1.0 Transitional parsing 𝒬 -PASS XHTML1.0 Transitional parsing 𝓆 -PASS XHTML1.0 Transitional parsing ℍ -PASS XHTML1.0 Transitional parsing ⨖ -PASS XHTML1.0 Transitional parsing ? -PASS XHTML1.0 Transitional parsing ≟ -PASS XHTML1.0 Transitional parsing " -PASS XHTML1.0 Transitional parsing " -PASS XHTML1.0 Transitional parsing ⇛ -PASS XHTML1.0 Transitional parsing ∽̱ -PASS XHTML1.0 Transitional parsing Ŕ -PASS XHTML1.0 Transitional parsing ŕ -PASS XHTML1.0 Transitional parsing √ -PASS XHTML1.0 Transitional parsing ⦳ -PASS XHTML1.0 Transitional parsing ⟩ -PASS XHTML1.0 Transitional parsing ⟫ -PASS XHTML1.0 Transitional parsing ⦒ -PASS XHTML1.0 Transitional parsing ⦥ -PASS XHTML1.0 Transitional parsing ⟩ -PASS XHTML1.0 Transitional parsing » -PASS XHTML1.0 Transitional parsing ⥵ -PASS XHTML1.0 Transitional parsing ⇥ -PASS XHTML1.0 Transitional parsing ⤠ -PASS XHTML1.0 Transitional parsing ⤳ -PASS XHTML1.0 Transitional parsing → -PASS XHTML1.0 Transitional parsing ↠ -PASS XHTML1.0 Transitional parsing ⇒ -PASS XHTML1.0 Transitional parsing ⤞ -PASS XHTML1.0 Transitional parsing ↪ -PASS XHTML1.0 Transitional parsing ↬ -PASS XHTML1.0 Transitional parsing ⥅ -PASS XHTML1.0 Transitional parsing ⥴ -PASS XHTML1.0 Transitional parsing ⤖ -PASS XHTML1.0 Transitional parsing ↣ -PASS XHTML1.0 Transitional parsing ↝ -PASS XHTML1.0 Transitional parsing ⤚ -PASS XHTML1.0 Transitional parsing ⤜ -PASS XHTML1.0 Transitional parsing ∶ -PASS XHTML1.0 Transitional parsing ℚ -PASS XHTML1.0 Transitional parsing ⤍ -PASS XHTML1.0 Transitional parsing ⤏ -PASS XHTML1.0 Transitional parsing ⤐ -PASS XHTML1.0 Transitional parsing ❳ -PASS XHTML1.0 Transitional parsing } -PASS XHTML1.0 Transitional parsing ] -PASS XHTML1.0 Transitional parsing ⦌ -PASS XHTML1.0 Transitional parsing ⦎ -PASS XHTML1.0 Transitional parsing ⦐ -PASS XHTML1.0 Transitional parsing Ř -PASS XHTML1.0 Transitional parsing ř -PASS XHTML1.0 Transitional parsing Ŗ -PASS XHTML1.0 Transitional parsing ŗ -PASS XHTML1.0 Transitional parsing ⌉ -PASS XHTML1.0 Transitional parsing } -PASS XHTML1.0 Transitional parsing Р -PASS XHTML1.0 Transitional parsing р -PASS XHTML1.0 Transitional parsing ⤷ -PASS XHTML1.0 Transitional parsing ⥩ -PASS XHTML1.0 Transitional parsing ” -PASS XHTML1.0 Transitional parsing ” -PASS XHTML1.0 Transitional parsing ↳ -PASS XHTML1.0 Transitional parsing ℜ -PASS XHTML1.0 Transitional parsing ℛ -PASS XHTML1.0 Transitional parsing ℜ -PASS XHTML1.0 Transitional parsing ℝ -PASS XHTML1.0 Transitional parsing ℜ -PASS XHTML1.0 Transitional parsing ▭ -PASS XHTML1.0 Transitional parsing ® -PASS XHTML1.0 Transitional parsing ® -PASS XHTML1.0 Transitional parsing ∋ -PASS XHTML1.0 Transitional parsing ⇋ -PASS XHTML1.0 Transitional parsing ⥯ -PASS XHTML1.0 Transitional parsing ⥽ -PASS XHTML1.0 Transitional parsing ⌋ -PASS XHTML1.0 Transitional parsing 𝔯 -PASS XHTML1.0 Transitional parsing ℜ -PASS XHTML1.0 Transitional parsing ⥤ -PASS XHTML1.0 Transitional parsing ⇁ -PASS XHTML1.0 Transitional parsing ⇀ -PASS XHTML1.0 Transitional parsing ⥬ -PASS XHTML1.0 Transitional parsing Ρ -PASS XHTML1.0 Transitional parsing ρ -PASS XHTML1.0 Transitional parsing ϱ -PASS XHTML1.0 Transitional parsing ⟩ -PASS XHTML1.0 Transitional parsing ⇥ -PASS XHTML1.0 Transitional parsing → -PASS XHTML1.0 Transitional parsing → -PASS XHTML1.0 Transitional parsing ⇒ -PASS XHTML1.0 Transitional parsing ⇄ -PASS XHTML1.0 Transitional parsing ↣ -PASS XHTML1.0 Transitional parsing ⌉ -PASS XHTML1.0 Transitional parsing ⟧ -PASS XHTML1.0 Transitional parsing ⥝ -PASS XHTML1.0 Transitional parsing ⥕ -PASS XHTML1.0 Transitional parsing ⇂ -PASS XHTML1.0 Transitional parsing ⌋ -PASS XHTML1.0 Transitional parsing ⇁ -PASS XHTML1.0 Transitional parsing ⇀ -PASS XHTML1.0 Transitional parsing ⇄ -PASS XHTML1.0 Transitional parsing ⇌ -PASS XHTML1.0 Transitional parsing ⇉ -PASS XHTML1.0 Transitional parsing ↝ -PASS XHTML1.0 Transitional parsing ↦ -PASS XHTML1.0 Transitional parsing ⊢ -PASS XHTML1.0 Transitional parsing ⥛ -PASS XHTML1.0 Transitional parsing ⋌ -PASS XHTML1.0 Transitional parsing ⧐ -PASS XHTML1.0 Transitional parsing ⊳ -PASS XHTML1.0 Transitional parsing ⊵ -PASS XHTML1.0 Transitional parsing ⥏ -PASS XHTML1.0 Transitional parsing ⥜ -PASS XHTML1.0 Transitional parsing ⥔ -PASS XHTML1.0 Transitional parsing ↾ -PASS XHTML1.0 Transitional parsing ⥓ -PASS XHTML1.0 Transitional parsing ⇀ -PASS XHTML1.0 Transitional parsing ˚ -PASS XHTML1.0 Transitional parsing ≓ -PASS XHTML1.0 Transitional parsing ⇄ -PASS XHTML1.0 Transitional parsing ⇌ -PASS XHTML1.0 Transitional parsing ‏ -PASS XHTML1.0 Transitional parsing ⎱ -PASS XHTML1.0 Transitional parsing ⎱ -PASS XHTML1.0 Transitional parsing ⫮ -PASS XHTML1.0 Transitional parsing ⟭ -PASS XHTML1.0 Transitional parsing ⇾ -PASS XHTML1.0 Transitional parsing ⟧ -PASS XHTML1.0 Transitional parsing ⦆ -PASS XHTML1.0 Transitional parsing 𝕣 -PASS XHTML1.0 Transitional parsing ℝ -PASS XHTML1.0 Transitional parsing ⨮ -PASS XHTML1.0 Transitional parsing ⨵ -PASS XHTML1.0 Transitional parsing ⥰ -PASS XHTML1.0 Transitional parsing ) -PASS XHTML1.0 Transitional parsing ⦔ -PASS XHTML1.0 Transitional parsing ⨒ -PASS XHTML1.0 Transitional parsing ⇉ -PASS XHTML1.0 Transitional parsing ⇛ -PASS XHTML1.0 Transitional parsing › -PASS XHTML1.0 Transitional parsing 𝓇 -PASS XHTML1.0 Transitional parsing ℛ -PASS XHTML1.0 Transitional parsing ↱ -PASS XHTML1.0 Transitional parsing ↱ -PASS XHTML1.0 Transitional parsing ] -PASS XHTML1.0 Transitional parsing ’ -PASS XHTML1.0 Transitional parsing ’ -PASS XHTML1.0 Transitional parsing ⋌ -PASS XHTML1.0 Transitional parsing ⋊ -PASS XHTML1.0 Transitional parsing ▹ -PASS XHTML1.0 Transitional parsing ⊵ -PASS XHTML1.0 Transitional parsing ▸ -PASS XHTML1.0 Transitional parsing ⧎ -PASS XHTML1.0 Transitional parsing ⧴ -PASS XHTML1.0 Transitional parsing ⥨ -PASS XHTML1.0 Transitional parsing ℞ -PASS XHTML1.0 Transitional parsing Ś -PASS XHTML1.0 Transitional parsing ś -PASS XHTML1.0 Transitional parsing ‚ -PASS XHTML1.0 Transitional parsing ⪸ -PASS XHTML1.0 Transitional parsing Š -PASS XHTML1.0 Transitional parsing š -PASS XHTML1.0 Transitional parsing ⪼ -PASS XHTML1.0 Transitional parsing ≻ -PASS XHTML1.0 Transitional parsing ≽ -PASS XHTML1.0 Transitional parsing ⪰ -PASS XHTML1.0 Transitional parsing ⪴ -PASS XHTML1.0 Transitional parsing Ş -PASS XHTML1.0 Transitional parsing ş -PASS XHTML1.0 Transitional parsing Ŝ -PASS XHTML1.0 Transitional parsing ŝ -PASS XHTML1.0 Transitional parsing ⪺ -PASS XHTML1.0 Transitional parsing ⪶ -PASS XHTML1.0 Transitional parsing ⋩ -PASS XHTML1.0 Transitional parsing ⨓ -PASS XHTML1.0 Transitional parsing ≿ -PASS XHTML1.0 Transitional parsing С -PASS XHTML1.0 Transitional parsing с -PASS XHTML1.0 Transitional parsing ⊡ -PASS XHTML1.0 Transitional parsing ⋅ -PASS XHTML1.0 Transitional parsing ⩦ -PASS XHTML1.0 Transitional parsing ⤥ -PASS XHTML1.0 Transitional parsing ↘ -PASS XHTML1.0 Transitional parsing ⇘ -PASS XHTML1.0 Transitional parsing ↘ -PASS XHTML1.0 Transitional parsing § -PASS XHTML1.0 Transitional parsing ; -PASS XHTML1.0 Transitional parsing ⤩ -PASS XHTML1.0 Transitional parsing ∖ -PASS XHTML1.0 Transitional parsing ∖ -PASS XHTML1.0 Transitional parsing ✶ -PASS XHTML1.0 Transitional parsing 𝔖 -PASS XHTML1.0 Transitional parsing 𝔰 -PASS XHTML1.0 Transitional parsing ⌢ -PASS XHTML1.0 Transitional parsing ♯ -PASS XHTML1.0 Transitional parsing Щ -PASS XHTML1.0 Transitional parsing щ -PASS XHTML1.0 Transitional parsing Ш -PASS XHTML1.0 Transitional parsing ш -PASS XHTML1.0 Transitional parsing ↓ -PASS XHTML1.0 Transitional parsing ← -PASS XHTML1.0 Transitional parsing ∣ -PASS XHTML1.0 Transitional parsing ∥ -PASS XHTML1.0 Transitional parsing → -PASS XHTML1.0 Transitional parsing ↑ -PASS XHTML1.0 Transitional parsing ­ -PASS XHTML1.0 Transitional parsing Σ -PASS XHTML1.0 Transitional parsing σ -PASS XHTML1.0 Transitional parsing ς -PASS XHTML1.0 Transitional parsing ς -PASS XHTML1.0 Transitional parsing ∼ -PASS XHTML1.0 Transitional parsing ⩪ -PASS XHTML1.0 Transitional parsing ≃ -PASS XHTML1.0 Transitional parsing ≃ -PASS XHTML1.0 Transitional parsing ⪞ -PASS XHTML1.0 Transitional parsing ⪠ -PASS XHTML1.0 Transitional parsing ⪝ -PASS XHTML1.0 Transitional parsing ⪟ -PASS XHTML1.0 Transitional parsing ≆ -PASS XHTML1.0 Transitional parsing ⨤ -PASS XHTML1.0 Transitional parsing ⥲ -PASS XHTML1.0 Transitional parsing ← -PASS XHTML1.0 Transitional parsing ∘ -PASS XHTML1.0 Transitional parsing ∖ -PASS XHTML1.0 Transitional parsing ⨳ -PASS XHTML1.0 Transitional parsing ⧤ -PASS XHTML1.0 Transitional parsing ∣ -PASS XHTML1.0 Transitional parsing ⌣ -PASS XHTML1.0 Transitional parsing ⪪ -PASS XHTML1.0 Transitional parsing ⪬ -PASS XHTML1.0 Transitional parsing ⪬︀ -PASS XHTML1.0 Transitional parsing Ь -PASS XHTML1.0 Transitional parsing ь -PASS XHTML1.0 Transitional parsing ⌿ -PASS XHTML1.0 Transitional parsing ⧄ -PASS XHTML1.0 Transitional parsing / -PASS XHTML1.0 Transitional parsing 𝕊 -PASS XHTML1.0 Transitional parsing 𝕤 -PASS XHTML1.0 Transitional parsing ♠ -PASS XHTML1.0 Transitional parsing ♠ -PASS XHTML1.0 Transitional parsing ∥ -PASS XHTML1.0 Transitional parsing ⊓ -PASS XHTML1.0 Transitional parsing ⊓︀ -PASS XHTML1.0 Transitional parsing ⊔ -PASS XHTML1.0 Transitional parsing ⊔︀ -PASS XHTML1.0 Transitional parsing √ -PASS XHTML1.0 Transitional parsing ⊏ -PASS XHTML1.0 Transitional parsing ⊑ -PASS XHTML1.0 Transitional parsing ⊏ -PASS XHTML1.0 Transitional parsing ⊑ -PASS XHTML1.0 Transitional parsing ⊐ -PASS XHTML1.0 Transitional parsing ⊒ -PASS XHTML1.0 Transitional parsing ⊐ -PASS XHTML1.0 Transitional parsing ⊒ -PASS XHTML1.0 Transitional parsing □ -PASS XHTML1.0 Transitional parsing □ -PASS XHTML1.0 Transitional parsing ⊓ -PASS XHTML1.0 Transitional parsing ⊏ -PASS XHTML1.0 Transitional parsing ⊑ -PASS XHTML1.0 Transitional parsing ⊐ -PASS XHTML1.0 Transitional parsing ⊒ -PASS XHTML1.0 Transitional parsing ⊔ -PASS XHTML1.0 Transitional parsing ▪ -PASS XHTML1.0 Transitional parsing □ -PASS XHTML1.0 Transitional parsing ▪ -PASS XHTML1.0 Transitional parsing → -PASS XHTML1.0 Transitional parsing 𝒮 -PASS XHTML1.0 Transitional parsing 𝓈 -PASS XHTML1.0 Transitional parsing ∖ -PASS XHTML1.0 Transitional parsing ⌣ -PASS XHTML1.0 Transitional parsing ⋆ -PASS XHTML1.0 Transitional parsing ⋆ -PASS XHTML1.0 Transitional parsing ☆ -PASS XHTML1.0 Transitional parsing ★ -PASS XHTML1.0 Transitional parsing ϵ -PASS XHTML1.0 Transitional parsing ϕ -PASS XHTML1.0 Transitional parsing ¯ -PASS XHTML1.0 Transitional parsing ⊂ -PASS XHTML1.0 Transitional parsing ⋐ -PASS XHTML1.0 Transitional parsing ⪽ -PASS XHTML1.0 Transitional parsing ⫅ -PASS XHTML1.0 Transitional parsing ⊆ -PASS XHTML1.0 Transitional parsing ⫃ -PASS XHTML1.0 Transitional parsing ⫁ -PASS XHTML1.0 Transitional parsing ⫋ -PASS XHTML1.0 Transitional parsing ⊊ -PASS XHTML1.0 Transitional parsing ⪿ -PASS XHTML1.0 Transitional parsing ⥹ -PASS XHTML1.0 Transitional parsing ⊂ -PASS XHTML1.0 Transitional parsing ⋐ -PASS XHTML1.0 Transitional parsing ⊆ -PASS XHTML1.0 Transitional parsing ⫅ -PASS XHTML1.0 Transitional parsing ⊆ -PASS XHTML1.0 Transitional parsing ⊊ -PASS XHTML1.0 Transitional parsing ⫋ -PASS XHTML1.0 Transitional parsing ⫇ -PASS XHTML1.0 Transitional parsing ⫕ -PASS XHTML1.0 Transitional parsing ⫓ -PASS XHTML1.0 Transitional parsing ⪸ -PASS XHTML1.0 Transitional parsing ≻ -PASS XHTML1.0 Transitional parsing ≽ -PASS XHTML1.0 Transitional parsing ≻ -PASS XHTML1.0 Transitional parsing ⪰ -PASS XHTML1.0 Transitional parsing ≽ -PASS XHTML1.0 Transitional parsing ≿ -PASS XHTML1.0 Transitional parsing ⪰ -PASS XHTML1.0 Transitional parsing ⪺ -PASS XHTML1.0 Transitional parsing ⪶ -PASS XHTML1.0 Transitional parsing ⋩ -PASS XHTML1.0 Transitional parsing ≿ -PASS XHTML1.0 Transitional parsing ∋ -PASS XHTML1.0 Transitional parsing ∑ -PASS XHTML1.0 Transitional parsing ∑ -PASS XHTML1.0 Transitional parsing ♪ -PASS XHTML1.0 Transitional parsing ¹ -PASS XHTML1.0 Transitional parsing ² -PASS XHTML1.0 Transitional parsing ³ -PASS XHTML1.0 Transitional parsing ⊃ -PASS XHTML1.0 Transitional parsing ⋑ -PASS XHTML1.0 Transitional parsing ⪾ -PASS XHTML1.0 Transitional parsing ⫘ -PASS XHTML1.0 Transitional parsing ⫆ -PASS XHTML1.0 Transitional parsing ⊇ -PASS XHTML1.0 Transitional parsing ⫄ -PASS XHTML1.0 Transitional parsing ⊃ -PASS XHTML1.0 Transitional parsing ⊇ -PASS XHTML1.0 Transitional parsing ⟉ -PASS XHTML1.0 Transitional parsing ⫗ -PASS XHTML1.0 Transitional parsing ⥻ -PASS XHTML1.0 Transitional parsing ⫂ -PASS XHTML1.0 Transitional parsing ⫌ -PASS XHTML1.0 Transitional parsing ⊋ -PASS XHTML1.0 Transitional parsing ⫀ -PASS XHTML1.0 Transitional parsing ⊃ -PASS XHTML1.0 Transitional parsing ⋑ -PASS XHTML1.0 Transitional parsing ⊇ -PASS XHTML1.0 Transitional parsing ⫆ -PASS XHTML1.0 Transitional parsing ⊋ -PASS XHTML1.0 Transitional parsing ⫌ -PASS XHTML1.0 Transitional parsing ⫈ -PASS XHTML1.0 Transitional parsing ⫔ -PASS XHTML1.0 Transitional parsing ⫖ -PASS XHTML1.0 Transitional parsing ⤦ -PASS XHTML1.0 Transitional parsing ↙ -PASS XHTML1.0 Transitional parsing ⇙ -PASS XHTML1.0 Transitional parsing ↙ -PASS XHTML1.0 Transitional parsing ⤪ -PASS XHTML1.0 Transitional parsing ß -PASS XHTML1.0 Transitional parsing 	 -PASS XHTML1.0 Transitional parsing ⌖ -PASS XHTML1.0 Transitional parsing Τ -PASS XHTML1.0 Transitional parsing τ -PASS XHTML1.0 Transitional parsing ⎴ -PASS XHTML1.0 Transitional parsing Ť -PASS XHTML1.0 Transitional parsing ť -PASS XHTML1.0 Transitional parsing Ţ -PASS XHTML1.0 Transitional parsing ţ -PASS XHTML1.0 Transitional parsing Т -PASS XHTML1.0 Transitional parsing т -PASS XHTML1.0 Transitional parsing ⃛ -PASS XHTML1.0 Transitional parsing ⌕ -PASS XHTML1.0 Transitional parsing 𝔗 -PASS XHTML1.0 Transitional parsing 𝔱 -PASS XHTML1.0 Transitional parsing ∴ -PASS XHTML1.0 Transitional parsing ∴ -PASS XHTML1.0 Transitional parsing ∴ -PASS XHTML1.0 Transitional parsing Θ -PASS XHTML1.0 Transitional parsing θ -PASS XHTML1.0 Transitional parsing ϑ -PASS XHTML1.0 Transitional parsing ϑ -PASS XHTML1.0 Transitional parsing ≈ -PASS XHTML1.0 Transitional parsing ∼ -PASS XHTML1.0 Transitional parsing    -PASS XHTML1.0 Transitional parsing   -PASS XHTML1.0 Transitional parsing   -PASS XHTML1.0 Transitional parsing ≈ -PASS XHTML1.0 Transitional parsing ∼ -PASS XHTML1.0 Transitional parsing Þ -PASS XHTML1.0 Transitional parsing þ -PASS XHTML1.0 Transitional parsing ˜ -PASS XHTML1.0 Transitional parsing ∼ -PASS XHTML1.0 Transitional parsing ≃ -PASS XHTML1.0 Transitional parsing ≅ -PASS XHTML1.0 Transitional parsing ≈ -PASS XHTML1.0 Transitional parsing ⨱ -PASS XHTML1.0 Transitional parsing ⊠ -PASS XHTML1.0 Transitional parsing × -PASS XHTML1.0 Transitional parsing ⨰ -PASS XHTML1.0 Transitional parsing ∭ -PASS XHTML1.0 Transitional parsing ⤨ -PASS XHTML1.0 Transitional parsing ⌶ -PASS XHTML1.0 Transitional parsing ⫱ -PASS XHTML1.0 Transitional parsing ⊤ -PASS XHTML1.0 Transitional parsing 𝕋 -PASS XHTML1.0 Transitional parsing 𝕥 -PASS XHTML1.0 Transitional parsing ⫚ -PASS XHTML1.0 Transitional parsing ⤩ -PASS XHTML1.0 Transitional parsing ‴ -PASS XHTML1.0 Transitional parsing ™ -PASS XHTML1.0 Transitional parsing ™ -PASS XHTML1.0 Transitional parsing ▵ -PASS XHTML1.0 Transitional parsing ▿ -PASS XHTML1.0 Transitional parsing ◃ -PASS XHTML1.0 Transitional parsing ⊴ -PASS XHTML1.0 Transitional parsing ≜ -PASS XHTML1.0 Transitional parsing ▹ -PASS XHTML1.0 Transitional parsing ⊵ -PASS XHTML1.0 Transitional parsing ◬ -PASS XHTML1.0 Transitional parsing ≜ -PASS XHTML1.0 Transitional parsing ⨺ -PASS XHTML1.0 Transitional parsing ⃛ -PASS XHTML1.0 Transitional parsing ⨹ -PASS XHTML1.0 Transitional parsing ⧍ -PASS XHTML1.0 Transitional parsing ⨻ -PASS XHTML1.0 Transitional parsing ⏢ -PASS XHTML1.0 Transitional parsing 𝒯 -PASS XHTML1.0 Transitional parsing 𝓉 -PASS XHTML1.0 Transitional parsing Ц -PASS XHTML1.0 Transitional parsing ц -PASS XHTML1.0 Transitional parsing Ћ -PASS XHTML1.0 Transitional parsing ћ -PASS XHTML1.0 Transitional parsing Ŧ -PASS XHTML1.0 Transitional parsing ŧ -PASS XHTML1.0 Transitional parsing ≬ -PASS XHTML1.0 Transitional parsing ↞ -PASS XHTML1.0 Transitional parsing ↠ -PASS XHTML1.0 Transitional parsing Ú -PASS XHTML1.0 Transitional parsing ú -PASS XHTML1.0 Transitional parsing ↑ -PASS XHTML1.0 Transitional parsing ↟ -PASS XHTML1.0 Transitional parsing ⇑ -PASS XHTML1.0 Transitional parsing ⥉ -PASS XHTML1.0 Transitional parsing Ў -PASS XHTML1.0 Transitional parsing ў -PASS XHTML1.0 Transitional parsing Ŭ -PASS XHTML1.0 Transitional parsing ŭ -PASS XHTML1.0 Transitional parsing Û -PASS XHTML1.0 Transitional parsing û -PASS XHTML1.0 Transitional parsing У -PASS XHTML1.0 Transitional parsing у -PASS XHTML1.0 Transitional parsing ⇅ -PASS XHTML1.0 Transitional parsing Ű -PASS XHTML1.0 Transitional parsing ű -PASS XHTML1.0 Transitional parsing ⥮ -PASS XHTML1.0 Transitional parsing ⥾ -PASS XHTML1.0 Transitional parsing 𝔘 -PASS XHTML1.0 Transitional parsing 𝔲 -PASS XHTML1.0 Transitional parsing Ù -PASS XHTML1.0 Transitional parsing ù -PASS XHTML1.0 Transitional parsing ⥣ -PASS XHTML1.0 Transitional parsing ↿ -PASS XHTML1.0 Transitional parsing ↾ -PASS XHTML1.0 Transitional parsing ▀ -PASS XHTML1.0 Transitional parsing ⌜ -PASS XHTML1.0 Transitional parsing ⌜ -PASS XHTML1.0 Transitional parsing ⌏ -PASS XHTML1.0 Transitional parsing ◸ -PASS XHTML1.0 Transitional parsing Ū -PASS XHTML1.0 Transitional parsing ū -PASS XHTML1.0 Transitional parsing ¨ -PASS XHTML1.0 Transitional parsing _ -PASS XHTML1.0 Transitional parsing ⏟ -PASS XHTML1.0 Transitional parsing ⎵ -PASS XHTML1.0 Transitional parsing ⏝ -PASS XHTML1.0 Transitional parsing ⋃ -PASS XHTML1.0 Transitional parsing ⊎ -PASS XHTML1.0 Transitional parsing Ų -PASS XHTML1.0 Transitional parsing ų -PASS XHTML1.0 Transitional parsing 𝕌 -PASS XHTML1.0 Transitional parsing 𝕦 -PASS XHTML1.0 Transitional parsing ⤒ -PASS XHTML1.0 Transitional parsing ↑ -PASS XHTML1.0 Transitional parsing ↑ -PASS XHTML1.0 Transitional parsing ⇑ -PASS XHTML1.0 Transitional parsing ⇅ -PASS XHTML1.0 Transitional parsing ↕ -PASS XHTML1.0 Transitional parsing ↕ -PASS XHTML1.0 Transitional parsing ⇕ -PASS XHTML1.0 Transitional parsing ⥮ -PASS XHTML1.0 Transitional parsing ↿ -PASS XHTML1.0 Transitional parsing ↾ -PASS XHTML1.0 Transitional parsing ⊎ -PASS XHTML1.0 Transitional parsing ↖ -PASS XHTML1.0 Transitional parsing ↗ -PASS XHTML1.0 Transitional parsing υ -PASS XHTML1.0 Transitional parsing ϒ -PASS XHTML1.0 Transitional parsing ϒ -PASS XHTML1.0 Transitional parsing Υ -PASS XHTML1.0 Transitional parsing υ -PASS XHTML1.0 Transitional parsing ↥ -PASS XHTML1.0 Transitional parsing ⊥ -PASS XHTML1.0 Transitional parsing ⇈ -PASS XHTML1.0 Transitional parsing ⌝ -PASS XHTML1.0 Transitional parsing ⌝ -PASS XHTML1.0 Transitional parsing ⌎ -PASS XHTML1.0 Transitional parsing Ů -PASS XHTML1.0 Transitional parsing ů -PASS XHTML1.0 Transitional parsing ◹ -PASS XHTML1.0 Transitional parsing 𝒰 -PASS XHTML1.0 Transitional parsing 𝓊 -PASS XHTML1.0 Transitional parsing ⋰ -PASS XHTML1.0 Transitional parsing Ũ -PASS XHTML1.0 Transitional parsing ũ -PASS XHTML1.0 Transitional parsing ▵ -PASS XHTML1.0 Transitional parsing ▴ -PASS XHTML1.0 Transitional parsing ⇈ -PASS XHTML1.0 Transitional parsing Ü -PASS XHTML1.0 Transitional parsing ü -PASS XHTML1.0 Transitional parsing ⦧ -PASS XHTML1.0 Transitional parsing ⦜ -PASS XHTML1.0 Transitional parsing ϵ -PASS XHTML1.0 Transitional parsing ϰ -PASS XHTML1.0 Transitional parsing ∅ -PASS XHTML1.0 Transitional parsing ϕ -PASS XHTML1.0 Transitional parsing ϖ -PASS XHTML1.0 Transitional parsing ∝ -PASS XHTML1.0 Transitional parsing ↕ -PASS XHTML1.0 Transitional parsing ⇕ -PASS XHTML1.0 Transitional parsing ϱ -PASS XHTML1.0 Transitional parsing ς -PASS XHTML1.0 Transitional parsing ⊊︀ -PASS XHTML1.0 Transitional parsing ⫋︀ -PASS XHTML1.0 Transitional parsing ⊋︀ -PASS XHTML1.0 Transitional parsing ⫌︀ -PASS XHTML1.0 Transitional parsing ϑ -PASS XHTML1.0 Transitional parsing ⊲ -PASS XHTML1.0 Transitional parsing ⊳ -PASS XHTML1.0 Transitional parsing ⫨ -PASS XHTML1.0 Transitional parsing ⫫ -PASS XHTML1.0 Transitional parsing ⫩ -PASS XHTML1.0 Transitional parsing В -PASS XHTML1.0 Transitional parsing в -PASS XHTML1.0 Transitional parsing ⊢ -PASS XHTML1.0 Transitional parsing ⊨ -PASS XHTML1.0 Transitional parsing ⊩ -PASS XHTML1.0 Transitional parsing ⊫ -PASS XHTML1.0 Transitional parsing ⫦ -PASS XHTML1.0 Transitional parsing ⊻ -PASS XHTML1.0 Transitional parsing ∨ -PASS XHTML1.0 Transitional parsing ⋁ -PASS XHTML1.0 Transitional parsing ≚ -PASS XHTML1.0 Transitional parsing ⋮ -PASS XHTML1.0 Transitional parsing | -PASS XHTML1.0 Transitional parsing ‖ -PASS XHTML1.0 Transitional parsing | -PASS XHTML1.0 Transitional parsing ‖ -PASS XHTML1.0 Transitional parsing ∣ -PASS XHTML1.0 Transitional parsing | -PASS XHTML1.0 Transitional parsing ❘ -PASS XHTML1.0 Transitional parsing ≀ -PASS XHTML1.0 Transitional parsing   -PASS XHTML1.0 Transitional parsing 𝔙 -PASS XHTML1.0 Transitional parsing 𝔳 -PASS XHTML1.0 Transitional parsing ⊲ -PASS XHTML1.0 Transitional parsing ⊂⃒ -PASS XHTML1.0 Transitional parsing ⊃⃒ -PASS XHTML1.0 Transitional parsing 𝕍 -PASS XHTML1.0 Transitional parsing 𝕧 -PASS XHTML1.0 Transitional parsing ∝ -PASS XHTML1.0 Transitional parsing ⊳ -PASS XHTML1.0 Transitional parsing 𝒱 -PASS XHTML1.0 Transitional parsing 𝓋 -PASS XHTML1.0 Transitional parsing ⫋︀ -PASS XHTML1.0 Transitional parsing ⊊︀ -PASS XHTML1.0 Transitional parsing ⫌︀ -PASS XHTML1.0 Transitional parsing ⊋︀ -PASS XHTML1.0 Transitional parsing ⊪ -PASS XHTML1.0 Transitional parsing ⦚ -PASS XHTML1.0 Transitional parsing Ŵ -PASS XHTML1.0 Transitional parsing ŵ -PASS XHTML1.0 Transitional parsing ⩟ -PASS XHTML1.0 Transitional parsing ∧ -PASS XHTML1.0 Transitional parsing ⋀ -PASS XHTML1.0 Transitional parsing ≙ -PASS XHTML1.0 Transitional parsing ℘ -PASS XHTML1.0 Transitional parsing 𝔚 -PASS XHTML1.0 Transitional parsing 𝔴 -PASS XHTML1.0 Transitional parsing 𝕎 -PASS XHTML1.0 Transitional parsing 𝕨 -PASS XHTML1.0 Transitional parsing ℘ -PASS XHTML1.0 Transitional parsing ≀ -PASS XHTML1.0 Transitional parsing ≀ -PASS XHTML1.0 Transitional parsing 𝒲 -PASS XHTML1.0 Transitional parsing 𝓌 -PASS XHTML1.0 Transitional parsing ⋂ -PASS XHTML1.0 Transitional parsing ◯ -PASS XHTML1.0 Transitional parsing ⋃ -PASS XHTML1.0 Transitional parsing ▽ -PASS XHTML1.0 Transitional parsing 𝔛 -PASS XHTML1.0 Transitional parsing 𝔵 -PASS XHTML1.0 Transitional parsing ⟷ -PASS XHTML1.0 Transitional parsing ⟺ -PASS XHTML1.0 Transitional parsing Ξ -PASS XHTML1.0 Transitional parsing ξ -PASS XHTML1.0 Transitional parsing ⟵ -PASS XHTML1.0 Transitional parsing ⟸ -PASS XHTML1.0 Transitional parsing ⟼ -PASS XHTML1.0 Transitional parsing ⋻ -PASS XHTML1.0 Transitional parsing ⨀ -PASS XHTML1.0 Transitional parsing 𝕏 -PASS XHTML1.0 Transitional parsing 𝕩 -PASS XHTML1.0 Transitional parsing ⨁ -PASS XHTML1.0 Transitional parsing ⨂ -PASS XHTML1.0 Transitional parsing ⟶ -PASS XHTML1.0 Transitional parsing ⟹ -PASS XHTML1.0 Transitional parsing 𝒳 -PASS XHTML1.0 Transitional parsing 𝓍 -PASS XHTML1.0 Transitional parsing ⨆ -PASS XHTML1.0 Transitional parsing ⨄ -PASS XHTML1.0 Transitional parsing △ -PASS XHTML1.0 Transitional parsing ⋁ -PASS XHTML1.0 Transitional parsing ⋀ -PASS XHTML1.0 Transitional parsing Ý -PASS XHTML1.0 Transitional parsing ý -PASS XHTML1.0 Transitional parsing Я -PASS XHTML1.0 Transitional parsing я -PASS XHTML1.0 Transitional parsing Ŷ -PASS XHTML1.0 Transitional parsing ŷ -PASS XHTML1.0 Transitional parsing Ы -PASS XHTML1.0 Transitional parsing ы -PASS XHTML1.0 Transitional parsing ¥ -PASS XHTML1.0 Transitional parsing 𝔜 -PASS XHTML1.0 Transitional parsing 𝔶 -PASS XHTML1.0 Transitional parsing Ї -PASS XHTML1.0 Transitional parsing ї -PASS XHTML1.0 Transitional parsing 𝕐 -PASS XHTML1.0 Transitional parsing 𝕪 -PASS XHTML1.0 Transitional parsing 𝒴 -PASS XHTML1.0 Transitional parsing 𝓎 -PASS XHTML1.0 Transitional parsing Ю -PASS XHTML1.0 Transitional parsing ю -PASS XHTML1.0 Transitional parsing ÿ -PASS XHTML1.0 Transitional parsing Ÿ -PASS XHTML1.0 Transitional parsing Ź -PASS XHTML1.0 Transitional parsing ź -PASS XHTML1.0 Transitional parsing Ž -PASS XHTML1.0 Transitional parsing ž -PASS XHTML1.0 Transitional parsing З -PASS XHTML1.0 Transitional parsing з -PASS XHTML1.0 Transitional parsing Ż -PASS XHTML1.0 Transitional parsing ż -PASS XHTML1.0 Transitional parsing ℨ -PASS XHTML1.0 Transitional parsing ​ -PASS XHTML1.0 Transitional parsing Ζ -PASS XHTML1.0 Transitional parsing ζ -PASS XHTML1.0 Transitional parsing 𝔷 -PASS XHTML1.0 Transitional parsing ℨ -PASS XHTML1.0 Transitional parsing Ж -PASS XHTML1.0 Transitional parsing ж -PASS XHTML1.0 Transitional parsing ⇝ -PASS XHTML1.0 Transitional parsing 𝕫 -PASS XHTML1.0 Transitional parsing ℤ -PASS XHTML1.0 Transitional parsing 𝒵 -PASS XHTML1.0 Transitional parsing 𝓏 -PASS XHTML1.0 Transitional parsing ‍ -PASS XHTML1.0 Transitional parsing ‌ -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-2-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-2-expected.txt deleted file mode 100644 index f3537ce0..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-2-expected.txt +++ /dev/null
@@ -1,2129 +0,0 @@ -This is a testharness.js-based test. -Found 2125 tests; 2122 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS XHTML1.1 parsing Á -PASS XHTML1.1 parsing á -PASS XHTML1.1 parsing Ă -PASS XHTML1.1 parsing ă -PASS XHTML1.1 parsing ∾ -PASS XHTML1.1 parsing ∿ -PASS XHTML1.1 parsing ∾̳ -PASS XHTML1.1 parsing  -PASS XHTML1.1 parsing â -PASS XHTML1.1 parsing ´ -PASS XHTML1.1 parsing А -PASS XHTML1.1 parsing а -PASS XHTML1.1 parsing Æ -PASS XHTML1.1 parsing æ -PASS XHTML1.1 parsing ⁡ -PASS XHTML1.1 parsing 𝔄 -PASS XHTML1.1 parsing 𝔞 -PASS XHTML1.1 parsing À -PASS XHTML1.1 parsing à -PASS XHTML1.1 parsing ℵ -PASS XHTML1.1 parsing ℵ -PASS XHTML1.1 parsing Α -PASS XHTML1.1 parsing α -PASS XHTML1.1 parsing Ā -PASS XHTML1.1 parsing ā -PASS XHTML1.1 parsing ⨿ -PASS XHTML1.1 parsing & -FAIL XHTML1.1 parsing & assert_true: expected true got false -PASS XHTML1.1 parsing ⩕ -PASS XHTML1.1 parsing ⩓ -PASS XHTML1.1 parsing ∧ -PASS XHTML1.1 parsing ⩜ -PASS XHTML1.1 parsing ⩘ -PASS XHTML1.1 parsing ⩚ -PASS XHTML1.1 parsing ∠ -PASS XHTML1.1 parsing ⦤ -PASS XHTML1.1 parsing ∠ -PASS XHTML1.1 parsing ⦨ -PASS XHTML1.1 parsing ⦩ -PASS XHTML1.1 parsing ⦪ -PASS XHTML1.1 parsing ⦫ -PASS XHTML1.1 parsing ⦬ -PASS XHTML1.1 parsing ⦭ -PASS XHTML1.1 parsing ⦮ -PASS XHTML1.1 parsing ⦯ -PASS XHTML1.1 parsing ∡ -PASS XHTML1.1 parsing ∟ -PASS XHTML1.1 parsing ⊾ -PASS XHTML1.1 parsing ⦝ -PASS XHTML1.1 parsing ∢ -PASS XHTML1.1 parsing Å -PASS XHTML1.1 parsing ⍼ -PASS XHTML1.1 parsing Ą -PASS XHTML1.1 parsing ą -PASS XHTML1.1 parsing 𝔸 -PASS XHTML1.1 parsing 𝕒 -PASS XHTML1.1 parsing ⩯ -PASS XHTML1.1 parsing ≈ -PASS XHTML1.1 parsing ⩰ -PASS XHTML1.1 parsing ≊ -PASS XHTML1.1 parsing ≋ -PASS XHTML1.1 parsing ' -PASS XHTML1.1 parsing ⁡ -PASS XHTML1.1 parsing ≈ -PASS XHTML1.1 parsing ≊ -PASS XHTML1.1 parsing Å -PASS XHTML1.1 parsing å -PASS XHTML1.1 parsing 𝒜 -PASS XHTML1.1 parsing 𝒶 -PASS XHTML1.1 parsing ≔ -PASS XHTML1.1 parsing * -PASS XHTML1.1 parsing ≈ -PASS XHTML1.1 parsing ≍ -PASS XHTML1.1 parsing à -PASS XHTML1.1 parsing ã -PASS XHTML1.1 parsing Ä -PASS XHTML1.1 parsing ä -PASS XHTML1.1 parsing ∳ -PASS XHTML1.1 parsing ⨑ -PASS XHTML1.1 parsing ≌ -PASS XHTML1.1 parsing ϶ -PASS XHTML1.1 parsing ‵ -PASS XHTML1.1 parsing ∽ -PASS XHTML1.1 parsing ⋍ -PASS XHTML1.1 parsing ∖ -PASS XHTML1.1 parsing ⫧ -PASS XHTML1.1 parsing ⊽ -PASS XHTML1.1 parsing ⌅ -PASS XHTML1.1 parsing ⌆ -PASS XHTML1.1 parsing ⌅ -PASS XHTML1.1 parsing ⎵ -PASS XHTML1.1 parsing ⎶ -PASS XHTML1.1 parsing ≌ -PASS XHTML1.1 parsing Б -PASS XHTML1.1 parsing б -PASS XHTML1.1 parsing „ -PASS XHTML1.1 parsing ∵ -PASS XHTML1.1 parsing ∵ -PASS XHTML1.1 parsing ∵ -PASS XHTML1.1 parsing ⦰ -PASS XHTML1.1 parsing ϶ -PASS XHTML1.1 parsing ℬ -PASS XHTML1.1 parsing ℬ -PASS XHTML1.1 parsing Β -PASS XHTML1.1 parsing β -PASS XHTML1.1 parsing ℶ -PASS XHTML1.1 parsing ≬ -PASS XHTML1.1 parsing 𝔅 -PASS XHTML1.1 parsing 𝔟 -PASS XHTML1.1 parsing ⋂ -PASS XHTML1.1 parsing ◯ -PASS XHTML1.1 parsing ⋃ -PASS XHTML1.1 parsing ⨀ -PASS XHTML1.1 parsing ⨁ -PASS XHTML1.1 parsing ⨂ -PASS XHTML1.1 parsing ⨆ -PASS XHTML1.1 parsing ★ -PASS XHTML1.1 parsing ▽ -PASS XHTML1.1 parsing △ -PASS XHTML1.1 parsing ⨄ -PASS XHTML1.1 parsing ⋁ -PASS XHTML1.1 parsing ⋀ -PASS XHTML1.1 parsing ⤍ -PASS XHTML1.1 parsing ⧫ -PASS XHTML1.1 parsing ▪ -PASS XHTML1.1 parsing ▴ -PASS XHTML1.1 parsing ▾ -PASS XHTML1.1 parsing ◂ -PASS XHTML1.1 parsing ▸ -PASS XHTML1.1 parsing ␣ -PASS XHTML1.1 parsing ▒ -PASS XHTML1.1 parsing ░ -PASS XHTML1.1 parsing ▓ -PASS XHTML1.1 parsing █ -PASS XHTML1.1 parsing =⃥ -PASS XHTML1.1 parsing ≡⃥ -PASS XHTML1.1 parsing ⫭ -PASS XHTML1.1 parsing ⌐ -PASS XHTML1.1 parsing 𝔹 -PASS XHTML1.1 parsing 𝕓 -PASS XHTML1.1 parsing ⊥ -PASS XHTML1.1 parsing ⊥ -PASS XHTML1.1 parsing ⋈ -PASS XHTML1.1 parsing ⧉ -PASS XHTML1.1 parsing ┐ -PASS XHTML1.1 parsing ╕ -PASS XHTML1.1 parsing ╖ -PASS XHTML1.1 parsing ╗ -PASS XHTML1.1 parsing ┌ -PASS XHTML1.1 parsing ╒ -PASS XHTML1.1 parsing ╓ -PASS XHTML1.1 parsing ╔ -PASS XHTML1.1 parsing ─ -PASS XHTML1.1 parsing ═ -PASS XHTML1.1 parsing ┬ -PASS XHTML1.1 parsing ╤ -PASS XHTML1.1 parsing ╥ -PASS XHTML1.1 parsing ╦ -PASS XHTML1.1 parsing ┴ -PASS XHTML1.1 parsing ╧ -PASS XHTML1.1 parsing ╨ -PASS XHTML1.1 parsing ╩ -PASS XHTML1.1 parsing ⊟ -PASS XHTML1.1 parsing ⊞ -PASS XHTML1.1 parsing ⊠ -PASS XHTML1.1 parsing ┘ -PASS XHTML1.1 parsing ╛ -PASS XHTML1.1 parsing ╜ -PASS XHTML1.1 parsing ╝ -PASS XHTML1.1 parsing └ -PASS XHTML1.1 parsing ╘ -PASS XHTML1.1 parsing ╙ -PASS XHTML1.1 parsing ╚ -PASS XHTML1.1 parsing │ -PASS XHTML1.1 parsing ║ -PASS XHTML1.1 parsing ┼ -PASS XHTML1.1 parsing ╪ -PASS XHTML1.1 parsing ╫ -PASS XHTML1.1 parsing ╬ -PASS XHTML1.1 parsing ┤ -PASS XHTML1.1 parsing ╡ -PASS XHTML1.1 parsing ╢ -PASS XHTML1.1 parsing ╣ -PASS XHTML1.1 parsing ├ -PASS XHTML1.1 parsing ╞ -PASS XHTML1.1 parsing ╟ -PASS XHTML1.1 parsing ╠ -PASS XHTML1.1 parsing ‵ -PASS XHTML1.1 parsing ˘ -PASS XHTML1.1 parsing ˘ -PASS XHTML1.1 parsing ¦ -PASS XHTML1.1 parsing 𝒷 -PASS XHTML1.1 parsing ℬ -PASS XHTML1.1 parsing ⁏ -PASS XHTML1.1 parsing ∽ -PASS XHTML1.1 parsing ⋍ -PASS XHTML1.1 parsing ⧅ -PASS XHTML1.1 parsing \ -PASS XHTML1.1 parsing ⟈ -PASS XHTML1.1 parsing • -PASS XHTML1.1 parsing • -PASS XHTML1.1 parsing ≎ -PASS XHTML1.1 parsing ⪮ -PASS XHTML1.1 parsing ≏ -PASS XHTML1.1 parsing ≎ -PASS XHTML1.1 parsing ≏ -PASS XHTML1.1 parsing Ć -PASS XHTML1.1 parsing ć -PASS XHTML1.1 parsing ⩄ -PASS XHTML1.1 parsing ⩉ -PASS XHTML1.1 parsing ⩋ -PASS XHTML1.1 parsing ∩ -PASS XHTML1.1 parsing ⋒ -PASS XHTML1.1 parsing ⩇ -PASS XHTML1.1 parsing ⩀ -PASS XHTML1.1 parsing ⅅ -PASS XHTML1.1 parsing ∩︀ -PASS XHTML1.1 parsing ⁁ -PASS XHTML1.1 parsing ˇ -PASS XHTML1.1 parsing ℭ -PASS XHTML1.1 parsing ⩍ -PASS XHTML1.1 parsing Č -PASS XHTML1.1 parsing č -PASS XHTML1.1 parsing Ç -PASS XHTML1.1 parsing ç -PASS XHTML1.1 parsing Ĉ -PASS XHTML1.1 parsing ĉ -PASS XHTML1.1 parsing ∰ -PASS XHTML1.1 parsing ⩌ -PASS XHTML1.1 parsing ⩐ -PASS XHTML1.1 parsing Ċ -PASS XHTML1.1 parsing ċ -PASS XHTML1.1 parsing ¸ -PASS XHTML1.1 parsing ¸ -PASS XHTML1.1 parsing ⦲ -PASS XHTML1.1 parsing ¢ -PASS XHTML1.1 parsing · -PASS XHTML1.1 parsing · -PASS XHTML1.1 parsing 𝔠 -PASS XHTML1.1 parsing ℭ -PASS XHTML1.1 parsing Ч -PASS XHTML1.1 parsing ч -PASS XHTML1.1 parsing ✓ -PASS XHTML1.1 parsing ✓ -PASS XHTML1.1 parsing Χ -PASS XHTML1.1 parsing χ -PASS XHTML1.1 parsing ˆ -PASS XHTML1.1 parsing ≗ -PASS XHTML1.1 parsing ↺ -PASS XHTML1.1 parsing ↻ -PASS XHTML1.1 parsing ⊛ -PASS XHTML1.1 parsing ⊚ -PASS XHTML1.1 parsing ⊝ -PASS XHTML1.1 parsing ⊙ -PASS XHTML1.1 parsing ® -PASS XHTML1.1 parsing Ⓢ -PASS XHTML1.1 parsing ⊖ -PASS XHTML1.1 parsing ⊕ -PASS XHTML1.1 parsing ⊗ -PASS XHTML1.1 parsing ○ -PASS XHTML1.1 parsing ⧃ -PASS XHTML1.1 parsing ≗ -PASS XHTML1.1 parsing ⨐ -PASS XHTML1.1 parsing ⫯ -PASS XHTML1.1 parsing ⧂ -PASS XHTML1.1 parsing ∲ -PASS XHTML1.1 parsing ” -PASS XHTML1.1 parsing ’ -PASS XHTML1.1 parsing ♣ -PASS XHTML1.1 parsing ♣ -PASS XHTML1.1 parsing : -PASS XHTML1.1 parsing ∷ -PASS XHTML1.1 parsing ⩴ -PASS XHTML1.1 parsing ≔ -PASS XHTML1.1 parsing ≔ -PASS XHTML1.1 parsing , -PASS XHTML1.1 parsing @ -PASS XHTML1.1 parsing ∁ -PASS XHTML1.1 parsing ∘ -PASS XHTML1.1 parsing ∁ -PASS XHTML1.1 parsing ℂ -PASS XHTML1.1 parsing ≅ -PASS XHTML1.1 parsing ⩭ -PASS XHTML1.1 parsing ≡ -PASS XHTML1.1 parsing ∮ -PASS XHTML1.1 parsing ∯ -PASS XHTML1.1 parsing ∮ -PASS XHTML1.1 parsing 𝕔 -PASS XHTML1.1 parsing ℂ -PASS XHTML1.1 parsing ∐ -PASS XHTML1.1 parsing ∐ -PASS XHTML1.1 parsing © -PASS XHTML1.1 parsing © -PASS XHTML1.1 parsing ℗ -PASS XHTML1.1 parsing ∳ -PASS XHTML1.1 parsing ↵ -PASS XHTML1.1 parsing ✗ -PASS XHTML1.1 parsing ⨯ -PASS XHTML1.1 parsing 𝒞 -PASS XHTML1.1 parsing 𝒸 -PASS XHTML1.1 parsing ⫏ -PASS XHTML1.1 parsing ⫑ -PASS XHTML1.1 parsing ⫐ -PASS XHTML1.1 parsing ⫒ -PASS XHTML1.1 parsing ⋯ -PASS XHTML1.1 parsing ⤸ -PASS XHTML1.1 parsing ⤵ -PASS XHTML1.1 parsing ⋞ -PASS XHTML1.1 parsing ⋟ -PASS XHTML1.1 parsing ↶ -PASS XHTML1.1 parsing ⤽ -PASS XHTML1.1 parsing ⩈ -PASS XHTML1.1 parsing ⩆ -PASS XHTML1.1 parsing ≍ -PASS XHTML1.1 parsing ∪ -PASS XHTML1.1 parsing ⋓ -PASS XHTML1.1 parsing ⩊ -PASS XHTML1.1 parsing ⊍ -PASS XHTML1.1 parsing ⩅ -PASS XHTML1.1 parsing ∪︀ -PASS XHTML1.1 parsing ↷ -PASS XHTML1.1 parsing ⤼ -PASS XHTML1.1 parsing ⋞ -PASS XHTML1.1 parsing ⋟ -PASS XHTML1.1 parsing ⋎ -PASS XHTML1.1 parsing ⋏ -PASS XHTML1.1 parsing ¤ -PASS XHTML1.1 parsing ↶ -PASS XHTML1.1 parsing ↷ -PASS XHTML1.1 parsing ⋎ -PASS XHTML1.1 parsing ⋏ -PASS XHTML1.1 parsing ∲ -PASS XHTML1.1 parsing ∱ -PASS XHTML1.1 parsing ⌭ -PASS XHTML1.1 parsing † -PASS XHTML1.1 parsing ‡ -PASS XHTML1.1 parsing ℸ -PASS XHTML1.1 parsing ↓ -PASS XHTML1.1 parsing ↡ -PASS XHTML1.1 parsing ⇓ -PASS XHTML1.1 parsing ‐ -PASS XHTML1.1 parsing ⫤ -PASS XHTML1.1 parsing ⊣ -PASS XHTML1.1 parsing ⤏ -PASS XHTML1.1 parsing ˝ -PASS XHTML1.1 parsing Ď -PASS XHTML1.1 parsing ď -PASS XHTML1.1 parsing Д -PASS XHTML1.1 parsing д -PASS XHTML1.1 parsing ‡ -PASS XHTML1.1 parsing ⇊ -PASS XHTML1.1 parsing ⅅ -PASS XHTML1.1 parsing ⅆ -PASS XHTML1.1 parsing ⤑ -PASS XHTML1.1 parsing ⩷ -PASS XHTML1.1 parsing ° -PASS XHTML1.1 parsing ∇ -PASS XHTML1.1 parsing Δ -PASS XHTML1.1 parsing δ -PASS XHTML1.1 parsing ⦱ -PASS XHTML1.1 parsing ⥿ -PASS XHTML1.1 parsing 𝔇 -PASS XHTML1.1 parsing 𝔡 -PASS XHTML1.1 parsing ⥥ -PASS XHTML1.1 parsing ⇃ -PASS XHTML1.1 parsing ⇂ -PASS XHTML1.1 parsing ´ -PASS XHTML1.1 parsing ˙ -PASS XHTML1.1 parsing ˝ -PASS XHTML1.1 parsing ` -PASS XHTML1.1 parsing ˜ -PASS XHTML1.1 parsing ⋄ -PASS XHTML1.1 parsing ⋄ -PASS XHTML1.1 parsing ⋄ -PASS XHTML1.1 parsing ♦ -PASS XHTML1.1 parsing ♦ -PASS XHTML1.1 parsing ¨ -PASS XHTML1.1 parsing ⅆ -PASS XHTML1.1 parsing ϝ -PASS XHTML1.1 parsing ⋲ -PASS XHTML1.1 parsing ÷ -PASS XHTML1.1 parsing ÷ -PASS XHTML1.1 parsing ⋇ -PASS XHTML1.1 parsing ⋇ -PASS XHTML1.1 parsing Ђ -PASS XHTML1.1 parsing ђ -PASS XHTML1.1 parsing ⌞ -PASS XHTML1.1 parsing ⌍ -PASS XHTML1.1 parsing $ -PASS XHTML1.1 parsing 𝔻 -PASS XHTML1.1 parsing 𝕕 -PASS XHTML1.1 parsing ¨ -PASS XHTML1.1 parsing ˙ -PASS XHTML1.1 parsing ⃜ -PASS XHTML1.1 parsing ≐ -PASS XHTML1.1 parsing ≑ -PASS XHTML1.1 parsing ≐ -PASS XHTML1.1 parsing ∸ -PASS XHTML1.1 parsing ∔ -PASS XHTML1.1 parsing ⊡ -PASS XHTML1.1 parsing ⌆ -PASS XHTML1.1 parsing ∯ -PASS XHTML1.1 parsing ¨ -PASS XHTML1.1 parsing ⇓ -PASS XHTML1.1 parsing ⇐ -PASS XHTML1.1 parsing ⇔ -PASS XHTML1.1 parsing ⫤ -PASS XHTML1.1 parsing ⟸ -PASS XHTML1.1 parsing ⟺ -PASS XHTML1.1 parsing ⟹ -PASS XHTML1.1 parsing ⇒ -PASS XHTML1.1 parsing ⊨ -PASS XHTML1.1 parsing ⇑ -PASS XHTML1.1 parsing ⇕ -PASS XHTML1.1 parsing ∥ -PASS XHTML1.1 parsing ⤓ -PASS XHTML1.1 parsing ↓ -PASS XHTML1.1 parsing ↓ -PASS XHTML1.1 parsing ⇓ -PASS XHTML1.1 parsing ⇵ -PASS XHTML1.1 parsing ̑ -PASS XHTML1.1 parsing ⇊ -PASS XHTML1.1 parsing ⇃ -PASS XHTML1.1 parsing ⇂ -PASS XHTML1.1 parsing ⥐ -PASS XHTML1.1 parsing ⥞ -PASS XHTML1.1 parsing ⥖ -PASS XHTML1.1 parsing ↽ -PASS XHTML1.1 parsing ⥟ -PASS XHTML1.1 parsing ⥗ -PASS XHTML1.1 parsing ⇁ -PASS XHTML1.1 parsing ↧ -PASS XHTML1.1 parsing ⊤ -PASS XHTML1.1 parsing ⤐ -PASS XHTML1.1 parsing ⌟ -PASS XHTML1.1 parsing ⌌ -PASS XHTML1.1 parsing 𝒟 -PASS XHTML1.1 parsing 𝒹 -PASS XHTML1.1 parsing Ѕ -PASS XHTML1.1 parsing ѕ -PASS XHTML1.1 parsing ⧶ -PASS XHTML1.1 parsing Đ -PASS XHTML1.1 parsing đ -PASS XHTML1.1 parsing ⋱ -PASS XHTML1.1 parsing ▿ -PASS XHTML1.1 parsing ▾ -PASS XHTML1.1 parsing ⇵ -PASS XHTML1.1 parsing ⥯ -PASS XHTML1.1 parsing ⦦ -PASS XHTML1.1 parsing Џ -PASS XHTML1.1 parsing џ -PASS XHTML1.1 parsing ⟿ -PASS XHTML1.1 parsing É -PASS XHTML1.1 parsing é -PASS XHTML1.1 parsing ⩮ -PASS XHTML1.1 parsing Ě -PASS XHTML1.1 parsing ě -PASS XHTML1.1 parsing Ê -PASS XHTML1.1 parsing ê -PASS XHTML1.1 parsing ≖ -PASS XHTML1.1 parsing ≕ -PASS XHTML1.1 parsing Э -PASS XHTML1.1 parsing э -PASS XHTML1.1 parsing ⩷ -PASS XHTML1.1 parsing Ė -PASS XHTML1.1 parsing ė -PASS XHTML1.1 parsing ≑ -PASS XHTML1.1 parsing ⅇ -PASS XHTML1.1 parsing ≒ -PASS XHTML1.1 parsing 𝔈 -PASS XHTML1.1 parsing 𝔢 -PASS XHTML1.1 parsing ⪚ -PASS XHTML1.1 parsing È -PASS XHTML1.1 parsing è -PASS XHTML1.1 parsing ⪖ -PASS XHTML1.1 parsing ⪘ -PASS XHTML1.1 parsing ⪙ -PASS XHTML1.1 parsing ∈ -PASS XHTML1.1 parsing ⏧ -PASS XHTML1.1 parsing ℓ -PASS XHTML1.1 parsing ⪕ -PASS XHTML1.1 parsing ⪗ -PASS XHTML1.1 parsing Ē -PASS XHTML1.1 parsing ē -PASS XHTML1.1 parsing ∅ -PASS XHTML1.1 parsing ∅ -PASS XHTML1.1 parsing ◻ -PASS XHTML1.1 parsing ∅ -PASS XHTML1.1 parsing ▫ -PASS XHTML1.1 parsing   -PASS XHTML1.1 parsing   -PASS XHTML1.1 parsing   -PASS XHTML1.1 parsing Ŋ -PASS XHTML1.1 parsing ŋ -PASS XHTML1.1 parsing   -PASS XHTML1.1 parsing Ę -PASS XHTML1.1 parsing ę -PASS XHTML1.1 parsing 𝔼 -PASS XHTML1.1 parsing 𝕖 -PASS XHTML1.1 parsing ⋕ -PASS XHTML1.1 parsing ⧣ -PASS XHTML1.1 parsing ⩱ -PASS XHTML1.1 parsing ε -PASS XHTML1.1 parsing Ε -PASS XHTML1.1 parsing ε -PASS XHTML1.1 parsing ϵ -PASS XHTML1.1 parsing ≖ -PASS XHTML1.1 parsing ≕ -PASS XHTML1.1 parsing ≂ -PASS XHTML1.1 parsing ⪖ -PASS XHTML1.1 parsing ⪕ -PASS XHTML1.1 parsing ⩵ -PASS XHTML1.1 parsing = -PASS XHTML1.1 parsing ≂ -PASS XHTML1.1 parsing ≟ -PASS XHTML1.1 parsing ⇌ -PASS XHTML1.1 parsing ≡ -PASS XHTML1.1 parsing ⩸ -PASS XHTML1.1 parsing ⧥ -PASS XHTML1.1 parsing ⥱ -PASS XHTML1.1 parsing ≓ -PASS XHTML1.1 parsing ℯ -PASS XHTML1.1 parsing ℰ -PASS XHTML1.1 parsing ≐ -PASS XHTML1.1 parsing ⩳ -PASS XHTML1.1 parsing ≂ -PASS XHTML1.1 parsing Η -PASS XHTML1.1 parsing η -PASS XHTML1.1 parsing Ð -PASS XHTML1.1 parsing ð -PASS XHTML1.1 parsing Ë -PASS XHTML1.1 parsing ë -PASS XHTML1.1 parsing € -PASS XHTML1.1 parsing ! -PASS XHTML1.1 parsing ∃ -PASS XHTML1.1 parsing ∃ -PASS XHTML1.1 parsing ℰ -PASS XHTML1.1 parsing ⅇ -PASS XHTML1.1 parsing ⅇ -PASS XHTML1.1 parsing ≒ -PASS XHTML1.1 parsing Ф -PASS XHTML1.1 parsing ф -PASS XHTML1.1 parsing ♀ -PASS XHTML1.1 parsing ffi -PASS XHTML1.1 parsing ff -PASS XHTML1.1 parsing ffl -PASS XHTML1.1 parsing 𝔉 -PASS XHTML1.1 parsing 𝔣 -PASS XHTML1.1 parsing fi -PASS XHTML1.1 parsing ◼ -PASS XHTML1.1 parsing ▪ -PASS XHTML1.1 parsing fj -PASS XHTML1.1 parsing ♭ -PASS XHTML1.1 parsing fl -PASS XHTML1.1 parsing ▱ -PASS XHTML1.1 parsing ƒ -PASS XHTML1.1 parsing 𝔽 -PASS XHTML1.1 parsing 𝕗 -PASS XHTML1.1 parsing ∀ -PASS XHTML1.1 parsing ∀ -PASS XHTML1.1 parsing ⋔ -PASS XHTML1.1 parsing ⫙ -PASS XHTML1.1 parsing ℱ -PASS XHTML1.1 parsing ⨍ -PASS XHTML1.1 parsing ½ -PASS XHTML1.1 parsing ⅓ -PASS XHTML1.1 parsing ¼ -PASS XHTML1.1 parsing ⅕ -PASS XHTML1.1 parsing ⅙ -PASS XHTML1.1 parsing ⅛ -PASS XHTML1.1 parsing ⅔ -PASS XHTML1.1 parsing ⅖ -PASS XHTML1.1 parsing ¾ -PASS XHTML1.1 parsing ⅗ -PASS XHTML1.1 parsing ⅜ -PASS XHTML1.1 parsing ⅘ -PASS XHTML1.1 parsing ⅚ -PASS XHTML1.1 parsing ⅝ -PASS XHTML1.1 parsing ⅞ -PASS XHTML1.1 parsing ⁄ -PASS XHTML1.1 parsing ⌢ -PASS XHTML1.1 parsing 𝒻 -PASS XHTML1.1 parsing ℱ -PASS XHTML1.1 parsing ǵ -PASS XHTML1.1 parsing Γ -PASS XHTML1.1 parsing γ -PASS XHTML1.1 parsing Ϝ -PASS XHTML1.1 parsing ϝ -PASS XHTML1.1 parsing ⪆ -PASS XHTML1.1 parsing Ğ -PASS XHTML1.1 parsing ğ -PASS XHTML1.1 parsing Ģ -PASS XHTML1.1 parsing Ĝ -PASS XHTML1.1 parsing ĝ -PASS XHTML1.1 parsing Г -PASS XHTML1.1 parsing г -PASS XHTML1.1 parsing Ġ -PASS XHTML1.1 parsing ġ -PASS XHTML1.1 parsing ≥ -PASS XHTML1.1 parsing ≧ -PASS XHTML1.1 parsing ⪌ -PASS XHTML1.1 parsing ⋛ -PASS XHTML1.1 parsing ≥ -PASS XHTML1.1 parsing ≧ -PASS XHTML1.1 parsing ⩾ -PASS XHTML1.1 parsing ⪩ -PASS XHTML1.1 parsing ⩾ -PASS XHTML1.1 parsing ⪀ -PASS XHTML1.1 parsing ⪂ -PASS XHTML1.1 parsing ⪄ -PASS XHTML1.1 parsing ⋛︀ -PASS XHTML1.1 parsing ⪔ -PASS XHTML1.1 parsing 𝔊 -PASS XHTML1.1 parsing 𝔤 -PASS XHTML1.1 parsing ≫ -PASS XHTML1.1 parsing ⋙ -PASS XHTML1.1 parsing ⋙ -PASS XHTML1.1 parsing ℷ -PASS XHTML1.1 parsing Ѓ -PASS XHTML1.1 parsing ѓ -PASS XHTML1.1 parsing ⪥ -PASS XHTML1.1 parsing ≷ -PASS XHTML1.1 parsing ⪒ -PASS XHTML1.1 parsing ⪤ -PASS XHTML1.1 parsing ⪊ -PASS XHTML1.1 parsing ⪊ -PASS XHTML1.1 parsing ⪈ -PASS XHTML1.1 parsing ≩ -PASS XHTML1.1 parsing ⪈ -PASS XHTML1.1 parsing ≩ -PASS XHTML1.1 parsing ⋧ -PASS XHTML1.1 parsing 𝔾 -PASS XHTML1.1 parsing 𝕘 -PASS XHTML1.1 parsing ` -PASS XHTML1.1 parsing ≥ -PASS XHTML1.1 parsing ⋛ -PASS XHTML1.1 parsing ≧ -PASS XHTML1.1 parsing ⪢ -PASS XHTML1.1 parsing ≷ -PASS XHTML1.1 parsing ⩾ -PASS XHTML1.1 parsing ≳ -PASS XHTML1.1 parsing 𝒢 -PASS XHTML1.1 parsing ℊ -PASS XHTML1.1 parsing ≳ -PASS XHTML1.1 parsing ⪎ -PASS XHTML1.1 parsing ⪐ -PASS XHTML1.1 parsing ⪧ -PASS XHTML1.1 parsing ⩺ -PASS XHTML1.1 parsing > -PASS XHTML1.1 parsing > -PASS XHTML1.1 parsing ≫ -PASS XHTML1.1 parsing ⋗ -PASS XHTML1.1 parsing ⦕ -PASS XHTML1.1 parsing ⩼ -PASS XHTML1.1 parsing ⪆ -PASS XHTML1.1 parsing ⥸ -PASS XHTML1.1 parsing ⋗ -PASS XHTML1.1 parsing ⋛ -PASS XHTML1.1 parsing ⪌ -PASS XHTML1.1 parsing ≷ -PASS XHTML1.1 parsing ≳ -PASS XHTML1.1 parsing ≩︀ -PASS XHTML1.1 parsing ≩︀ -PASS XHTML1.1 parsing ˇ -PASS XHTML1.1 parsing   -PASS XHTML1.1 parsing ½ -PASS XHTML1.1 parsing ℋ -PASS XHTML1.1 parsing Ъ -PASS XHTML1.1 parsing ъ -PASS XHTML1.1 parsing ⥈ -PASS XHTML1.1 parsing ↔ -PASS XHTML1.1 parsing ⇔ -PASS XHTML1.1 parsing ↭ -PASS XHTML1.1 parsing ^ -PASS XHTML1.1 parsing ℏ -PASS XHTML1.1 parsing Ĥ -PASS XHTML1.1 parsing ĥ -PASS XHTML1.1 parsing ♥ -PASS XHTML1.1 parsing ♥ -PASS XHTML1.1 parsing … -PASS XHTML1.1 parsing ⊹ -PASS XHTML1.1 parsing 𝔥 -PASS XHTML1.1 parsing ℌ -PASS XHTML1.1 parsing ℋ -PASS XHTML1.1 parsing ⤥ -PASS XHTML1.1 parsing ⤦ -PASS XHTML1.1 parsing ⇿ -PASS XHTML1.1 parsing ∻ -PASS XHTML1.1 parsing ↩ -PASS XHTML1.1 parsing ↪ -PASS XHTML1.1 parsing 𝕙 -PASS XHTML1.1 parsing ℍ -PASS XHTML1.1 parsing ― -PASS XHTML1.1 parsing ─ -PASS XHTML1.1 parsing 𝒽 -PASS XHTML1.1 parsing ℋ -PASS XHTML1.1 parsing ℏ -PASS XHTML1.1 parsing Ħ -PASS XHTML1.1 parsing ħ -PASS XHTML1.1 parsing ≎ -PASS XHTML1.1 parsing ≏ -PASS XHTML1.1 parsing ⁃ -PASS XHTML1.1 parsing ‐ -PASS XHTML1.1 parsing Í -PASS XHTML1.1 parsing í -PASS XHTML1.1 parsing ⁣ -PASS XHTML1.1 parsing Î -PASS XHTML1.1 parsing î -PASS XHTML1.1 parsing И -PASS XHTML1.1 parsing и -PASS XHTML1.1 parsing İ -PASS XHTML1.1 parsing Е -PASS XHTML1.1 parsing е -PASS XHTML1.1 parsing ¡ -PASS XHTML1.1 parsing ⇔ -PASS XHTML1.1 parsing 𝔦 -PASS XHTML1.1 parsing ℑ -PASS XHTML1.1 parsing Ì -PASS XHTML1.1 parsing ì -PASS XHTML1.1 parsing ⅈ -PASS XHTML1.1 parsing ⨌ -PASS XHTML1.1 parsing ∭ -PASS XHTML1.1 parsing ⧜ -PASS XHTML1.1 parsing ℩ -PASS XHTML1.1 parsing IJ -PASS XHTML1.1 parsing ij -PASS XHTML1.1 parsing Ī -PASS XHTML1.1 parsing ī -PASS XHTML1.1 parsing ℑ -PASS XHTML1.1 parsing ⅈ -PASS XHTML1.1 parsing ℐ -PASS XHTML1.1 parsing ℑ -PASS XHTML1.1 parsing ı -PASS XHTML1.1 parsing ℑ -PASS XHTML1.1 parsing ⊷ -PASS XHTML1.1 parsing Ƶ -PASS XHTML1.1 parsing ⇒ -PASS XHTML1.1 parsing ℅ -PASS XHTML1.1 parsing ∈ -PASS XHTML1.1 parsing ∞ -PASS XHTML1.1 parsing ⧝ -PASS XHTML1.1 parsing ı -PASS XHTML1.1 parsing ⊺ -PASS XHTML1.1 parsing ∫ -PASS XHTML1.1 parsing ∬ -PASS XHTML1.1 parsing ℤ -PASS XHTML1.1 parsing ∫ -PASS XHTML1.1 parsing ⊺ -PASS XHTML1.1 parsing ⋂ -PASS XHTML1.1 parsing ⨗ -PASS XHTML1.1 parsing ⨼ -PASS XHTML1.1 parsing ⁣ -PASS XHTML1.1 parsing ⁢ -PASS XHTML1.1 parsing Ё -PASS XHTML1.1 parsing ё -PASS XHTML1.1 parsing Į -PASS XHTML1.1 parsing į -PASS XHTML1.1 parsing 𝕀 -PASS XHTML1.1 parsing 𝕚 -PASS XHTML1.1 parsing Ι -PASS XHTML1.1 parsing ι -PASS XHTML1.1 parsing ⨼ -PASS XHTML1.1 parsing ¿ -PASS XHTML1.1 parsing 𝒾 -PASS XHTML1.1 parsing ℐ -PASS XHTML1.1 parsing ∈ -PASS XHTML1.1 parsing ⋵ -PASS XHTML1.1 parsing ⋹ -PASS XHTML1.1 parsing ⋴ -PASS XHTML1.1 parsing ⋳ -PASS XHTML1.1 parsing ∈ -PASS XHTML1.1 parsing ⁢ -PASS XHTML1.1 parsing Ĩ -PASS XHTML1.1 parsing ĩ -PASS XHTML1.1 parsing І -PASS XHTML1.1 parsing і -PASS XHTML1.1 parsing Ï -PASS XHTML1.1 parsing ï -PASS XHTML1.1 parsing Ĵ -PASS XHTML1.1 parsing ĵ -PASS XHTML1.1 parsing Й -PASS XHTML1.1 parsing й -PASS XHTML1.1 parsing 𝔍 -PASS XHTML1.1 parsing 𝔧 -PASS XHTML1.1 parsing ȷ -PASS XHTML1.1 parsing 𝕁 -PASS XHTML1.1 parsing 𝕛 -PASS XHTML1.1 parsing 𝒥 -PASS XHTML1.1 parsing 𝒿 -PASS XHTML1.1 parsing Ј -PASS XHTML1.1 parsing ј -PASS XHTML1.1 parsing Є -PASS XHTML1.1 parsing є -PASS XHTML1.1 parsing Κ -PASS XHTML1.1 parsing κ -PASS XHTML1.1 parsing ϰ -PASS XHTML1.1 parsing Ķ -PASS XHTML1.1 parsing ķ -PASS XHTML1.1 parsing К -PASS XHTML1.1 parsing к -PASS XHTML1.1 parsing 𝔎 -PASS XHTML1.1 parsing 𝔨 -PASS XHTML1.1 parsing ĸ -PASS XHTML1.1 parsing Х -PASS XHTML1.1 parsing х -PASS XHTML1.1 parsing Ќ -PASS XHTML1.1 parsing ќ -PASS XHTML1.1 parsing 𝕂 -PASS XHTML1.1 parsing 𝕜 -PASS XHTML1.1 parsing 𝒦 -PASS XHTML1.1 parsing 𝓀 -PASS XHTML1.1 parsing ⇚ -PASS XHTML1.1 parsing Ĺ -PASS XHTML1.1 parsing ĺ -PASS XHTML1.1 parsing ⦴ -PASS XHTML1.1 parsing ℒ -PASS XHTML1.1 parsing Λ -PASS XHTML1.1 parsing λ -PASS XHTML1.1 parsing ⟨ -PASS XHTML1.1 parsing ⟪ -PASS XHTML1.1 parsing ⦑ -PASS XHTML1.1 parsing ⟨ -PASS XHTML1.1 parsing ⪅ -PASS XHTML1.1 parsing ℒ -PASS XHTML1.1 parsing « -PASS XHTML1.1 parsing ⇤ -PASS XHTML1.1 parsing ⤟ -PASS XHTML1.1 parsing ← -PASS XHTML1.1 parsing ↞ -PASS XHTML1.1 parsing ⇐ -PASS XHTML1.1 parsing ⤝ -PASS XHTML1.1 parsing ↩ -PASS XHTML1.1 parsing ↫ -PASS XHTML1.1 parsing ⤹ -PASS XHTML1.1 parsing ⥳ -PASS XHTML1.1 parsing ↢ -PASS XHTML1.1 parsing ⤙ -PASS XHTML1.1 parsing ⤛ -PASS XHTML1.1 parsing ⪫ -PASS XHTML1.1 parsing ⪭ -PASS XHTML1.1 parsing ⪭︀ -PASS XHTML1.1 parsing ⤌ -PASS XHTML1.1 parsing ⤎ -PASS XHTML1.1 parsing ❲ -PASS XHTML1.1 parsing { -PASS XHTML1.1 parsing [ -PASS XHTML1.1 parsing ⦋ -PASS XHTML1.1 parsing ⦏ -PASS XHTML1.1 parsing ⦍ -PASS XHTML1.1 parsing Ľ -PASS XHTML1.1 parsing ľ -PASS XHTML1.1 parsing Ļ -PASS XHTML1.1 parsing ļ -PASS XHTML1.1 parsing ⌈ -PASS XHTML1.1 parsing { -PASS XHTML1.1 parsing Л -PASS XHTML1.1 parsing л -PASS XHTML1.1 parsing ⤶ -PASS XHTML1.1 parsing “ -PASS XHTML1.1 parsing „ -PASS XHTML1.1 parsing ⥧ -PASS XHTML1.1 parsing ⥋ -PASS XHTML1.1 parsing ↲ -PASS XHTML1.1 parsing ≤ -PASS XHTML1.1 parsing ≦ -PASS XHTML1.1 parsing ⟨ -PASS XHTML1.1 parsing ⇤ -PASS XHTML1.1 parsing ← -PASS XHTML1.1 parsing ← -PASS XHTML1.1 parsing ⇐ -PASS XHTML1.1 parsing ⇆ -PASS XHTML1.1 parsing ↢ -PASS XHTML1.1 parsing ⌈ -PASS XHTML1.1 parsing ⟦ -PASS XHTML1.1 parsing ⥡ -PASS XHTML1.1 parsing ⥙ -PASS XHTML1.1 parsing ⇃ -PASS XHTML1.1 parsing ⌊ -PASS XHTML1.1 parsing ↽ -PASS XHTML1.1 parsing ↼ -PASS XHTML1.1 parsing ⇇ -PASS XHTML1.1 parsing ↔ -PASS XHTML1.1 parsing ↔ -PASS XHTML1.1 parsing ⇔ -PASS XHTML1.1 parsing ⇆ -PASS XHTML1.1 parsing ⇋ -PASS XHTML1.1 parsing ↭ -PASS XHTML1.1 parsing ⥎ -PASS XHTML1.1 parsing ↤ -PASS XHTML1.1 parsing ⊣ -PASS XHTML1.1 parsing ⥚ -PASS XHTML1.1 parsing ⋋ -PASS XHTML1.1 parsing ⧏ -PASS XHTML1.1 parsing ⊲ -PASS XHTML1.1 parsing ⊴ -PASS XHTML1.1 parsing ⥑ -PASS XHTML1.1 parsing ⥠ -PASS XHTML1.1 parsing ⥘ -PASS XHTML1.1 parsing ↿ -PASS XHTML1.1 parsing ⥒ -PASS XHTML1.1 parsing ↼ -PASS XHTML1.1 parsing ⪋ -PASS XHTML1.1 parsing ⋚ -PASS XHTML1.1 parsing ≤ -PASS XHTML1.1 parsing ≦ -PASS XHTML1.1 parsing ⩽ -PASS XHTML1.1 parsing ⪨ -PASS XHTML1.1 parsing ⩽ -PASS XHTML1.1 parsing ⩿ -PASS XHTML1.1 parsing ⪁ -PASS XHTML1.1 parsing ⪃ -PASS XHTML1.1 parsing ⋚︀ -PASS XHTML1.1 parsing ⪓ -PASS XHTML1.1 parsing ⪅ -PASS XHTML1.1 parsing ⋖ -PASS XHTML1.1 parsing ⋚ -PASS XHTML1.1 parsing ⪋ -PASS XHTML1.1 parsing ⋚ -PASS XHTML1.1 parsing ≦ -PASS XHTML1.1 parsing ≶ -PASS XHTML1.1 parsing ≶ -PASS XHTML1.1 parsing ⪡ -PASS XHTML1.1 parsing ≲ -PASS XHTML1.1 parsing ⩽ -PASS XHTML1.1 parsing ≲ -PASS XHTML1.1 parsing ⥼ -PASS XHTML1.1 parsing ⌊ -PASS XHTML1.1 parsing 𝔏 -PASS XHTML1.1 parsing 𝔩 -PASS XHTML1.1 parsing ≶ -PASS XHTML1.1 parsing ⪑ -PASS XHTML1.1 parsing ⥢ -PASS XHTML1.1 parsing ↽ -PASS XHTML1.1 parsing ↼ -PASS XHTML1.1 parsing ⥪ -PASS XHTML1.1 parsing ▄ -PASS XHTML1.1 parsing Љ -PASS XHTML1.1 parsing љ -PASS XHTML1.1 parsing ⇇ -PASS XHTML1.1 parsing ≪ -PASS XHTML1.1 parsing ⋘ -PASS XHTML1.1 parsing ⌞ -PASS XHTML1.1 parsing ⇚ -PASS XHTML1.1 parsing ⥫ -PASS XHTML1.1 parsing ◺ -PASS XHTML1.1 parsing Ŀ -PASS XHTML1.1 parsing ŀ -PASS XHTML1.1 parsing ⎰ -PASS XHTML1.1 parsing ⎰ -PASS XHTML1.1 parsing ⪉ -PASS XHTML1.1 parsing ⪉ -PASS XHTML1.1 parsing ⪇ -PASS XHTML1.1 parsing ≨ -PASS XHTML1.1 parsing ⪇ -PASS XHTML1.1 parsing ≨ -PASS XHTML1.1 parsing ⋦ -PASS XHTML1.1 parsing ⟬ -PASS XHTML1.1 parsing ⇽ -PASS XHTML1.1 parsing ⟦ -PASS XHTML1.1 parsing ⟵ -PASS XHTML1.1 parsing ⟵ -PASS XHTML1.1 parsing ⟸ -PASS XHTML1.1 parsing ⟷ -PASS XHTML1.1 parsing ⟷ -PASS XHTML1.1 parsing ⟺ -PASS XHTML1.1 parsing ⟼ -PASS XHTML1.1 parsing ⟶ -PASS XHTML1.1 parsing ⟶ -PASS XHTML1.1 parsing ⟹ -PASS XHTML1.1 parsing ↫ -PASS XHTML1.1 parsing ↬ -PASS XHTML1.1 parsing ⦅ -PASS XHTML1.1 parsing 𝕃 -PASS XHTML1.1 parsing 𝕝 -PASS XHTML1.1 parsing ⨭ -PASS XHTML1.1 parsing ⨴ -PASS XHTML1.1 parsing ∗ -PASS XHTML1.1 parsing _ -PASS XHTML1.1 parsing ↙ -PASS XHTML1.1 parsing ↘ -PASS XHTML1.1 parsing ◊ -PASS XHTML1.1 parsing ◊ -PASS XHTML1.1 parsing ⧫ -PASS XHTML1.1 parsing ( -PASS XHTML1.1 parsing ⦓ -PASS XHTML1.1 parsing ⇆ -PASS XHTML1.1 parsing ⌟ -PASS XHTML1.1 parsing ⇋ -PASS XHTML1.1 parsing ⥭ -PASS XHTML1.1 parsing ‎ -PASS XHTML1.1 parsing ⊿ -PASS XHTML1.1 parsing ‹ -PASS XHTML1.1 parsing 𝓁 -PASS XHTML1.1 parsing ℒ -PASS XHTML1.1 parsing ↰ -PASS XHTML1.1 parsing ↰ -PASS XHTML1.1 parsing ≲ -PASS XHTML1.1 parsing ⪍ -PASS XHTML1.1 parsing ⪏ -PASS XHTML1.1 parsing [ -PASS XHTML1.1 parsing ‘ -PASS XHTML1.1 parsing ‚ -PASS XHTML1.1 parsing Ł -PASS XHTML1.1 parsing ł -PASS XHTML1.1 parsing ⪦ -PASS XHTML1.1 parsing ⩹ -PASS XHTML1.1 parsing < -FAIL XHTML1.1 parsing < assert_true: expected true got false -PASS XHTML1.1 parsing ≪ -PASS XHTML1.1 parsing ⋖ -PASS XHTML1.1 parsing ⋋ -PASS XHTML1.1 parsing ⋉ -PASS XHTML1.1 parsing ⥶ -PASS XHTML1.1 parsing ⩻ -PASS XHTML1.1 parsing ◃ -PASS XHTML1.1 parsing ⊴ -PASS XHTML1.1 parsing ◂ -PASS XHTML1.1 parsing ⦖ -PASS XHTML1.1 parsing ⥊ -PASS XHTML1.1 parsing ⥦ -PASS XHTML1.1 parsing ≨︀ -PASS XHTML1.1 parsing ≨︀ -PASS XHTML1.1 parsing ¯ -PASS XHTML1.1 parsing ♂ -PASS XHTML1.1 parsing ✠ -PASS XHTML1.1 parsing ✠ -PASS XHTML1.1 parsing ⤅ -PASS XHTML1.1 parsing ↦ -PASS XHTML1.1 parsing ↦ -PASS XHTML1.1 parsing ↧ -PASS XHTML1.1 parsing ↤ -PASS XHTML1.1 parsing ↥ -PASS XHTML1.1 parsing ▮ -PASS XHTML1.1 parsing ⨩ -PASS XHTML1.1 parsing М -PASS XHTML1.1 parsing м -PASS XHTML1.1 parsing — -PASS XHTML1.1 parsing ∺ -PASS XHTML1.1 parsing ∡ -PASS XHTML1.1 parsing   -PASS XHTML1.1 parsing ℳ -PASS XHTML1.1 parsing 𝔐 -PASS XHTML1.1 parsing 𝔪 -PASS XHTML1.1 parsing ℧ -PASS XHTML1.1 parsing µ -PASS XHTML1.1 parsing * -PASS XHTML1.1 parsing ⫰ -PASS XHTML1.1 parsing ∣ -PASS XHTML1.1 parsing · -PASS XHTML1.1 parsing ⊟ -PASS XHTML1.1 parsing − -PASS XHTML1.1 parsing ∸ -PASS XHTML1.1 parsing ⨪ -PASS XHTML1.1 parsing ∓ -PASS XHTML1.1 parsing ⫛ -PASS XHTML1.1 parsing … -PASS XHTML1.1 parsing ∓ -PASS XHTML1.1 parsing ⊧ -PASS XHTML1.1 parsing 𝕄 -PASS XHTML1.1 parsing 𝕞 -PASS XHTML1.1 parsing ∓ -PASS XHTML1.1 parsing 𝓂 -PASS XHTML1.1 parsing ℳ -PASS XHTML1.1 parsing ∾ -PASS XHTML1.1 parsing Μ -PASS XHTML1.1 parsing μ -PASS XHTML1.1 parsing ⊸ -PASS XHTML1.1 parsing ⊸ -PASS XHTML1.1 parsing ∇ -PASS XHTML1.1 parsing Ń -PASS XHTML1.1 parsing ń -PASS XHTML1.1 parsing ∠⃒ -PASS XHTML1.1 parsing ≉ -PASS XHTML1.1 parsing ⩰̸ -PASS XHTML1.1 parsing ≋̸ -PASS XHTML1.1 parsing ʼn -PASS XHTML1.1 parsing ≉ -PASS XHTML1.1 parsing ♮ -PASS XHTML1.1 parsing ℕ -PASS XHTML1.1 parsing ♮ -PASS XHTML1.1 parsing -PASS XHTML1.1 parsing ≎̸ -PASS XHTML1.1 parsing ≏̸ -PASS XHTML1.1 parsing ⩃ -PASS XHTML1.1 parsing Ň -PASS XHTML1.1 parsing ň -PASS XHTML1.1 parsing Ņ -PASS XHTML1.1 parsing ņ -PASS XHTML1.1 parsing ≇ -PASS XHTML1.1 parsing ⩭̸ -PASS XHTML1.1 parsing ⩂ -PASS XHTML1.1 parsing Н -PASS XHTML1.1 parsing н -PASS XHTML1.1 parsing – -PASS XHTML1.1 parsing ⤤ -PASS XHTML1.1 parsing ↗ -PASS XHTML1.1 parsing ⇗ -PASS XHTML1.1 parsing ↗ -PASS XHTML1.1 parsing ≠ -PASS XHTML1.1 parsing ≐̸ -PASS XHTML1.1 parsing ​ -PASS XHTML1.1 parsing ​ -PASS XHTML1.1 parsing ​ -PASS XHTML1.1 parsing ​ -PASS XHTML1.1 parsing ≢ -PASS XHTML1.1 parsing ⤨ -PASS XHTML1.1 parsing ≂̸ -PASS XHTML1.1 parsing ≫ -PASS XHTML1.1 parsing ≪ -PASS XHTML1.1 parsing 
 -PASS XHTML1.1 parsing ∄ -PASS XHTML1.1 parsing ∄ -PASS XHTML1.1 parsing 𝔑 -PASS XHTML1.1 parsing 𝔫 -PASS XHTML1.1 parsing ≧̸ -PASS XHTML1.1 parsing ≱ -PASS XHTML1.1 parsing ≱ -PASS XHTML1.1 parsing ≧̸ -PASS XHTML1.1 parsing ⩾̸ -PASS XHTML1.1 parsing ⩾̸ -PASS XHTML1.1 parsing ⋙̸ -PASS XHTML1.1 parsing ≵ -PASS XHTML1.1 parsing ≫⃒ -PASS XHTML1.1 parsing ≯ -PASS XHTML1.1 parsing ≯ -PASS XHTML1.1 parsing ≫̸ -PASS XHTML1.1 parsing ↮ -PASS XHTML1.1 parsing ⇎ -PASS XHTML1.1 parsing ⫲ -PASS XHTML1.1 parsing ∋ -PASS XHTML1.1 parsing ⋼ -PASS XHTML1.1 parsing ⋺ -PASS XHTML1.1 parsing ∋ -PASS XHTML1.1 parsing Њ -PASS XHTML1.1 parsing њ -PASS XHTML1.1 parsing ↚ -PASS XHTML1.1 parsing ⇍ -PASS XHTML1.1 parsing ‥ -PASS XHTML1.1 parsing ≦̸ -PASS XHTML1.1 parsing ≰ -PASS XHTML1.1 parsing ↚ -PASS XHTML1.1 parsing ⇍ -PASS XHTML1.1 parsing ↮ -PASS XHTML1.1 parsing ⇎ -PASS XHTML1.1 parsing ≰ -PASS XHTML1.1 parsing ≦̸ -PASS XHTML1.1 parsing ⩽̸ -PASS XHTML1.1 parsing ⩽̸ -PASS XHTML1.1 parsing ≮ -PASS XHTML1.1 parsing ⋘̸ -PASS XHTML1.1 parsing ≴ -PASS XHTML1.1 parsing ≪⃒ -PASS XHTML1.1 parsing ≮ -PASS XHTML1.1 parsing ⋪ -PASS XHTML1.1 parsing ⋬ -PASS XHTML1.1 parsing ≪̸ -PASS XHTML1.1 parsing ∤ -PASS XHTML1.1 parsing ⁠ -PASS XHTML1.1 parsing   -PASS XHTML1.1 parsing 𝕟 -PASS XHTML1.1 parsing ℕ -PASS XHTML1.1 parsing ⫬ -PASS XHTML1.1 parsing ¬ -PASS XHTML1.1 parsing ≢ -PASS XHTML1.1 parsing ≭ -PASS XHTML1.1 parsing ∦ -PASS XHTML1.1 parsing ∉ -PASS XHTML1.1 parsing ≠ -PASS XHTML1.1 parsing ≂̸ -PASS XHTML1.1 parsing ∄ -PASS XHTML1.1 parsing ≯ -PASS XHTML1.1 parsing ≱ -PASS XHTML1.1 parsing ≧̸ -PASS XHTML1.1 parsing ≫̸ -PASS XHTML1.1 parsing ≹ -PASS XHTML1.1 parsing ⩾̸ -PASS XHTML1.1 parsing ≵ -PASS XHTML1.1 parsing ≎̸ -PASS XHTML1.1 parsing ≏̸ -PASS XHTML1.1 parsing ∉ -PASS XHTML1.1 parsing ⋵̸ -PASS XHTML1.1 parsing ⋹̸ -PASS XHTML1.1 parsing ∉ -PASS XHTML1.1 parsing ⋷ -PASS XHTML1.1 parsing ⋶ -PASS XHTML1.1 parsing ⧏̸ -PASS XHTML1.1 parsing ⋪ -PASS XHTML1.1 parsing ⋬ -PASS XHTML1.1 parsing ≮ -PASS XHTML1.1 parsing ≰ -PASS XHTML1.1 parsing ≸ -PASS XHTML1.1 parsing ≪̸ -PASS XHTML1.1 parsing ⩽̸ -PASS XHTML1.1 parsing ≴ -PASS XHTML1.1 parsing ⪢̸ -PASS XHTML1.1 parsing ⪡̸ -PASS XHTML1.1 parsing ∌ -PASS XHTML1.1 parsing ∌ -PASS XHTML1.1 parsing ⋾ -PASS XHTML1.1 parsing ⋽ -PASS XHTML1.1 parsing ⊀ -PASS XHTML1.1 parsing ⪯̸ -PASS XHTML1.1 parsing ⋠ -PASS XHTML1.1 parsing ∌ -PASS XHTML1.1 parsing ⧐̸ -PASS XHTML1.1 parsing ⋫ -PASS XHTML1.1 parsing ⋭ -PASS XHTML1.1 parsing ⊏̸ -PASS XHTML1.1 parsing ⋢ -PASS XHTML1.1 parsing ⊐̸ -PASS XHTML1.1 parsing ⋣ -PASS XHTML1.1 parsing ⊂⃒ -PASS XHTML1.1 parsing ⊈ -PASS XHTML1.1 parsing ⊁ -PASS XHTML1.1 parsing ⪰̸ -PASS XHTML1.1 parsing ⋡ -PASS XHTML1.1 parsing ≿̸ -PASS XHTML1.1 parsing ⊃⃒ -PASS XHTML1.1 parsing ⊉ -PASS XHTML1.1 parsing ≁ -PASS XHTML1.1 parsing ≄ -PASS XHTML1.1 parsing ≇ -PASS XHTML1.1 parsing ≉ -PASS XHTML1.1 parsing ∤ -PASS XHTML1.1 parsing ∦ -PASS XHTML1.1 parsing ∦ -PASS XHTML1.1 parsing ⫽⃥ -PASS XHTML1.1 parsing ∂̸ -PASS XHTML1.1 parsing ⨔ -PASS XHTML1.1 parsing ⊀ -PASS XHTML1.1 parsing ⋠ -PASS XHTML1.1 parsing ⊀ -PASS XHTML1.1 parsing ⪯̸ -PASS XHTML1.1 parsing ⪯̸ -PASS XHTML1.1 parsing ⤳̸ -PASS XHTML1.1 parsing ↛ -PASS XHTML1.1 parsing ⇏ -PASS XHTML1.1 parsing ↝̸ -PASS XHTML1.1 parsing ↛ -PASS XHTML1.1 parsing ⇏ -PASS XHTML1.1 parsing ⋫ -PASS XHTML1.1 parsing ⋭ -PASS XHTML1.1 parsing ⊁ -PASS XHTML1.1 parsing ⋡ -PASS XHTML1.1 parsing ⪰̸ -PASS XHTML1.1 parsing 𝒩 -PASS XHTML1.1 parsing 𝓃 -PASS XHTML1.1 parsing ∤ -PASS XHTML1.1 parsing ∦ -PASS XHTML1.1 parsing ≁ -PASS XHTML1.1 parsing ≄ -PASS XHTML1.1 parsing ≄ -PASS XHTML1.1 parsing ∤ -PASS XHTML1.1 parsing ∦ -PASS XHTML1.1 parsing ⋢ -PASS XHTML1.1 parsing ⋣ -PASS XHTML1.1 parsing ⊄ -PASS XHTML1.1 parsing ⫅̸ -PASS XHTML1.1 parsing ⊈ -PASS XHTML1.1 parsing ⊂⃒ -PASS XHTML1.1 parsing ⊈ -PASS XHTML1.1 parsing ⫅̸ -PASS XHTML1.1 parsing ⊁ -PASS XHTML1.1 parsing ⪰̸ -PASS XHTML1.1 parsing ⊅ -PASS XHTML1.1 parsing ⫆̸ -PASS XHTML1.1 parsing ⊉ -PASS XHTML1.1 parsing ⊃⃒ -PASS XHTML1.1 parsing ⊉ -PASS XHTML1.1 parsing ⫆̸ -PASS XHTML1.1 parsing ≹ -PASS XHTML1.1 parsing Ñ -PASS XHTML1.1 parsing ñ -PASS XHTML1.1 parsing ≸ -PASS XHTML1.1 parsing ⋪ -PASS XHTML1.1 parsing ⋬ -PASS XHTML1.1 parsing ⋫ -PASS XHTML1.1 parsing ⋭ -PASS XHTML1.1 parsing Ν -PASS XHTML1.1 parsing ν -PASS XHTML1.1 parsing # -PASS XHTML1.1 parsing № -PASS XHTML1.1 parsing   -PASS XHTML1.1 parsing ≍⃒ -PASS XHTML1.1 parsing ⊬ -PASS XHTML1.1 parsing ⊭ -PASS XHTML1.1 parsing ⊮ -PASS XHTML1.1 parsing ⊯ -PASS XHTML1.1 parsing ≥⃒ -PASS XHTML1.1 parsing >⃒ -PASS XHTML1.1 parsing ⤄ -PASS XHTML1.1 parsing ⧞ -PASS XHTML1.1 parsing ⤂ -PASS XHTML1.1 parsing ≤⃒ -FAIL XHTML1.1 parsing <⃒ assert_equals: XHTML1.1 parsing the entity reference caused a parse error; expected 3 but got 1 -PASS XHTML1.1 parsing ⊴⃒ -PASS XHTML1.1 parsing ⤃ -PASS XHTML1.1 parsing ⊵⃒ -PASS XHTML1.1 parsing ∼⃒ -PASS XHTML1.1 parsing ⤣ -PASS XHTML1.1 parsing ↖ -PASS XHTML1.1 parsing ⇖ -PASS XHTML1.1 parsing ↖ -PASS XHTML1.1 parsing ⤧ -PASS XHTML1.1 parsing Ó -PASS XHTML1.1 parsing ó -PASS XHTML1.1 parsing ⊛ -PASS XHTML1.1 parsing Ô -PASS XHTML1.1 parsing ô -PASS XHTML1.1 parsing ⊚ -PASS XHTML1.1 parsing О -PASS XHTML1.1 parsing о -PASS XHTML1.1 parsing ⊝ -PASS XHTML1.1 parsing Ő -PASS XHTML1.1 parsing ő -PASS XHTML1.1 parsing ⨸ -PASS XHTML1.1 parsing ⊙ -PASS XHTML1.1 parsing ⦼ -PASS XHTML1.1 parsing Œ -PASS XHTML1.1 parsing œ -PASS XHTML1.1 parsing ⦿ -PASS XHTML1.1 parsing 𝔒 -PASS XHTML1.1 parsing 𝔬 -PASS XHTML1.1 parsing ˛ -PASS XHTML1.1 parsing Ò -PASS XHTML1.1 parsing ò -PASS XHTML1.1 parsing ⧁ -PASS XHTML1.1 parsing ⦵ -PASS XHTML1.1 parsing Ω -PASS XHTML1.1 parsing ∮ -PASS XHTML1.1 parsing ↺ -PASS XHTML1.1 parsing ⦾ -PASS XHTML1.1 parsing ⦻ -PASS XHTML1.1 parsing ‾ -PASS XHTML1.1 parsing ⧀ -PASS XHTML1.1 parsing Ō -PASS XHTML1.1 parsing ō -PASS XHTML1.1 parsing Ω -PASS XHTML1.1 parsing ω -PASS XHTML1.1 parsing Ο -PASS XHTML1.1 parsing ο -PASS XHTML1.1 parsing ⦶ -PASS XHTML1.1 parsing ⊖ -PASS XHTML1.1 parsing 𝕆 -PASS XHTML1.1 parsing 𝕠 -PASS XHTML1.1 parsing ⦷ -PASS XHTML1.1 parsing “ -PASS XHTML1.1 parsing ‘ -PASS XHTML1.1 parsing ⦹ -PASS XHTML1.1 parsing ⊕ -PASS XHTML1.1 parsing ↻ -PASS XHTML1.1 parsing ⩔ -PASS XHTML1.1 parsing ∨ -PASS XHTML1.1 parsing ⩝ -PASS XHTML1.1 parsing ℴ -PASS XHTML1.1 parsing ℴ -PASS XHTML1.1 parsing ª -PASS XHTML1.1 parsing º -PASS XHTML1.1 parsing ⊶ -PASS XHTML1.1 parsing ⩖ -PASS XHTML1.1 parsing ⩗ -PASS XHTML1.1 parsing ⩛ -PASS XHTML1.1 parsing Ⓢ -PASS XHTML1.1 parsing 𝒪 -PASS XHTML1.1 parsing ℴ -PASS XHTML1.1 parsing Ø -PASS XHTML1.1 parsing ø -PASS XHTML1.1 parsing ⊘ -PASS XHTML1.1 parsing Õ -PASS XHTML1.1 parsing õ -PASS XHTML1.1 parsing ⨶ -PASS XHTML1.1 parsing ⨷ -PASS XHTML1.1 parsing ⊗ -PASS XHTML1.1 parsing Ö -PASS XHTML1.1 parsing ö -PASS XHTML1.1 parsing ⌽ -PASS XHTML1.1 parsing ‾ -PASS XHTML1.1 parsing ⏞ -PASS XHTML1.1 parsing ⎴ -PASS XHTML1.1 parsing ⏜ -PASS XHTML1.1 parsing ¶ -PASS XHTML1.1 parsing ∥ -PASS XHTML1.1 parsing ∥ -PASS XHTML1.1 parsing ⫳ -PASS XHTML1.1 parsing ⫽ -PASS XHTML1.1 parsing ∂ -PASS XHTML1.1 parsing ∂ -PASS XHTML1.1 parsing П -PASS XHTML1.1 parsing п -PASS XHTML1.1 parsing % -PASS XHTML1.1 parsing . -PASS XHTML1.1 parsing ‰ -PASS XHTML1.1 parsing ⊥ -PASS XHTML1.1 parsing ‱ -PASS XHTML1.1 parsing 𝔓 -PASS XHTML1.1 parsing 𝔭 -PASS XHTML1.1 parsing Φ -PASS XHTML1.1 parsing φ -PASS XHTML1.1 parsing ϕ -PASS XHTML1.1 parsing ℳ -PASS XHTML1.1 parsing ☎ -PASS XHTML1.1 parsing Π -PASS XHTML1.1 parsing π -PASS XHTML1.1 parsing ⋔ -PASS XHTML1.1 parsing ϖ -PASS XHTML1.1 parsing ℏ -PASS XHTML1.1 parsing ℎ -PASS XHTML1.1 parsing ℏ -PASS XHTML1.1 parsing ⨣ -PASS XHTML1.1 parsing ⊞ -PASS XHTML1.1 parsing ⨢ -PASS XHTML1.1 parsing + -PASS XHTML1.1 parsing ∔ -PASS XHTML1.1 parsing ⨥ -PASS XHTML1.1 parsing ⩲ -PASS XHTML1.1 parsing ± -PASS XHTML1.1 parsing ± -PASS XHTML1.1 parsing ⨦ -PASS XHTML1.1 parsing ⨧ -PASS XHTML1.1 parsing ± -PASS XHTML1.1 parsing ℌ -PASS XHTML1.1 parsing ⨕ -PASS XHTML1.1 parsing 𝕡 -PASS XHTML1.1 parsing ℙ -PASS XHTML1.1 parsing £ -PASS XHTML1.1 parsing ⪷ -PASS XHTML1.1 parsing ⪻ -PASS XHTML1.1 parsing ≺ -PASS XHTML1.1 parsing ≼ -PASS XHTML1.1 parsing ⪷ -PASS XHTML1.1 parsing ≺ -PASS XHTML1.1 parsing ≼ -PASS XHTML1.1 parsing ≺ -PASS XHTML1.1 parsing ⪯ -PASS XHTML1.1 parsing ≼ -PASS XHTML1.1 parsing ≾ -PASS XHTML1.1 parsing ⪯ -PASS XHTML1.1 parsing ⪹ -PASS XHTML1.1 parsing ⪵ -PASS XHTML1.1 parsing ⋨ -PASS XHTML1.1 parsing ⪯ -PASS XHTML1.1 parsing ⪳ -PASS XHTML1.1 parsing ≾ -PASS XHTML1.1 parsing ′ -PASS XHTML1.1 parsing ″ -PASS XHTML1.1 parsing ℙ -PASS XHTML1.1 parsing ⪹ -PASS XHTML1.1 parsing ⪵ -PASS XHTML1.1 parsing ⋨ -PASS XHTML1.1 parsing ∏ -PASS XHTML1.1 parsing ∏ -PASS XHTML1.1 parsing ⌮ -PASS XHTML1.1 parsing ⌒ -PASS XHTML1.1 parsing ⌓ -PASS XHTML1.1 parsing ∝ -PASS XHTML1.1 parsing ∝ -PASS XHTML1.1 parsing ∷ -PASS XHTML1.1 parsing ∝ -PASS XHTML1.1 parsing ≾ -PASS XHTML1.1 parsing ⊰ -PASS XHTML1.1 parsing 𝒫 -PASS XHTML1.1 parsing 𝓅 -PASS XHTML1.1 parsing Ψ -PASS XHTML1.1 parsing ψ -PASS XHTML1.1 parsing   -PASS XHTML1.1 parsing 𝔔 -PASS XHTML1.1 parsing 𝔮 -PASS XHTML1.1 parsing ⨌ -PASS XHTML1.1 parsing 𝕢 -PASS XHTML1.1 parsing ℚ -PASS XHTML1.1 parsing ⁗ -PASS XHTML1.1 parsing 𝒬 -PASS XHTML1.1 parsing 𝓆 -PASS XHTML1.1 parsing ℍ -PASS XHTML1.1 parsing ⨖ -PASS XHTML1.1 parsing ? -PASS XHTML1.1 parsing ≟ -PASS XHTML1.1 parsing " -PASS XHTML1.1 parsing " -PASS XHTML1.1 parsing ⇛ -PASS XHTML1.1 parsing ∽̱ -PASS XHTML1.1 parsing Ŕ -PASS XHTML1.1 parsing ŕ -PASS XHTML1.1 parsing √ -PASS XHTML1.1 parsing ⦳ -PASS XHTML1.1 parsing ⟩ -PASS XHTML1.1 parsing ⟫ -PASS XHTML1.1 parsing ⦒ -PASS XHTML1.1 parsing ⦥ -PASS XHTML1.1 parsing ⟩ -PASS XHTML1.1 parsing » -PASS XHTML1.1 parsing ⥵ -PASS XHTML1.1 parsing ⇥ -PASS XHTML1.1 parsing ⤠ -PASS XHTML1.1 parsing ⤳ -PASS XHTML1.1 parsing → -PASS XHTML1.1 parsing ↠ -PASS XHTML1.1 parsing ⇒ -PASS XHTML1.1 parsing ⤞ -PASS XHTML1.1 parsing ↪ -PASS XHTML1.1 parsing ↬ -PASS XHTML1.1 parsing ⥅ -PASS XHTML1.1 parsing ⥴ -PASS XHTML1.1 parsing ⤖ -PASS XHTML1.1 parsing ↣ -PASS XHTML1.1 parsing ↝ -PASS XHTML1.1 parsing ⤚ -PASS XHTML1.1 parsing ⤜ -PASS XHTML1.1 parsing ∶ -PASS XHTML1.1 parsing ℚ -PASS XHTML1.1 parsing ⤍ -PASS XHTML1.1 parsing ⤏ -PASS XHTML1.1 parsing ⤐ -PASS XHTML1.1 parsing ❳ -PASS XHTML1.1 parsing } -PASS XHTML1.1 parsing ] -PASS XHTML1.1 parsing ⦌ -PASS XHTML1.1 parsing ⦎ -PASS XHTML1.1 parsing ⦐ -PASS XHTML1.1 parsing Ř -PASS XHTML1.1 parsing ř -PASS XHTML1.1 parsing Ŗ -PASS XHTML1.1 parsing ŗ -PASS XHTML1.1 parsing ⌉ -PASS XHTML1.1 parsing } -PASS XHTML1.1 parsing Р -PASS XHTML1.1 parsing р -PASS XHTML1.1 parsing ⤷ -PASS XHTML1.1 parsing ⥩ -PASS XHTML1.1 parsing ” -PASS XHTML1.1 parsing ” -PASS XHTML1.1 parsing ↳ -PASS XHTML1.1 parsing ℜ -PASS XHTML1.1 parsing ℛ -PASS XHTML1.1 parsing ℜ -PASS XHTML1.1 parsing ℝ -PASS XHTML1.1 parsing ℜ -PASS XHTML1.1 parsing ▭ -PASS XHTML1.1 parsing ® -PASS XHTML1.1 parsing ® -PASS XHTML1.1 parsing ∋ -PASS XHTML1.1 parsing ⇋ -PASS XHTML1.1 parsing ⥯ -PASS XHTML1.1 parsing ⥽ -PASS XHTML1.1 parsing ⌋ -PASS XHTML1.1 parsing 𝔯 -PASS XHTML1.1 parsing ℜ -PASS XHTML1.1 parsing ⥤ -PASS XHTML1.1 parsing ⇁ -PASS XHTML1.1 parsing ⇀ -PASS XHTML1.1 parsing ⥬ -PASS XHTML1.1 parsing Ρ -PASS XHTML1.1 parsing ρ -PASS XHTML1.1 parsing ϱ -PASS XHTML1.1 parsing ⟩ -PASS XHTML1.1 parsing ⇥ -PASS XHTML1.1 parsing → -PASS XHTML1.1 parsing → -PASS XHTML1.1 parsing ⇒ -PASS XHTML1.1 parsing ⇄ -PASS XHTML1.1 parsing ↣ -PASS XHTML1.1 parsing ⌉ -PASS XHTML1.1 parsing ⟧ -PASS XHTML1.1 parsing ⥝ -PASS XHTML1.1 parsing ⥕ -PASS XHTML1.1 parsing ⇂ -PASS XHTML1.1 parsing ⌋ -PASS XHTML1.1 parsing ⇁ -PASS XHTML1.1 parsing ⇀ -PASS XHTML1.1 parsing ⇄ -PASS XHTML1.1 parsing ⇌ -PASS XHTML1.1 parsing ⇉ -PASS XHTML1.1 parsing ↝ -PASS XHTML1.1 parsing ↦ -PASS XHTML1.1 parsing ⊢ -PASS XHTML1.1 parsing ⥛ -PASS XHTML1.1 parsing ⋌ -PASS XHTML1.1 parsing ⧐ -PASS XHTML1.1 parsing ⊳ -PASS XHTML1.1 parsing ⊵ -PASS XHTML1.1 parsing ⥏ -PASS XHTML1.1 parsing ⥜ -PASS XHTML1.1 parsing ⥔ -PASS XHTML1.1 parsing ↾ -PASS XHTML1.1 parsing ⥓ -PASS XHTML1.1 parsing ⇀ -PASS XHTML1.1 parsing ˚ -PASS XHTML1.1 parsing ≓ -PASS XHTML1.1 parsing ⇄ -PASS XHTML1.1 parsing ⇌ -PASS XHTML1.1 parsing ‏ -PASS XHTML1.1 parsing ⎱ -PASS XHTML1.1 parsing ⎱ -PASS XHTML1.1 parsing ⫮ -PASS XHTML1.1 parsing ⟭ -PASS XHTML1.1 parsing ⇾ -PASS XHTML1.1 parsing ⟧ -PASS XHTML1.1 parsing ⦆ -PASS XHTML1.1 parsing 𝕣 -PASS XHTML1.1 parsing ℝ -PASS XHTML1.1 parsing ⨮ -PASS XHTML1.1 parsing ⨵ -PASS XHTML1.1 parsing ⥰ -PASS XHTML1.1 parsing ) -PASS XHTML1.1 parsing ⦔ -PASS XHTML1.1 parsing ⨒ -PASS XHTML1.1 parsing ⇉ -PASS XHTML1.1 parsing ⇛ -PASS XHTML1.1 parsing › -PASS XHTML1.1 parsing 𝓇 -PASS XHTML1.1 parsing ℛ -PASS XHTML1.1 parsing ↱ -PASS XHTML1.1 parsing ↱ -PASS XHTML1.1 parsing ] -PASS XHTML1.1 parsing ’ -PASS XHTML1.1 parsing ’ -PASS XHTML1.1 parsing ⋌ -PASS XHTML1.1 parsing ⋊ -PASS XHTML1.1 parsing ▹ -PASS XHTML1.1 parsing ⊵ -PASS XHTML1.1 parsing ▸ -PASS XHTML1.1 parsing ⧎ -PASS XHTML1.1 parsing ⧴ -PASS XHTML1.1 parsing ⥨ -PASS XHTML1.1 parsing ℞ -PASS XHTML1.1 parsing Ś -PASS XHTML1.1 parsing ś -PASS XHTML1.1 parsing ‚ -PASS XHTML1.1 parsing ⪸ -PASS XHTML1.1 parsing Š -PASS XHTML1.1 parsing š -PASS XHTML1.1 parsing ⪼ -PASS XHTML1.1 parsing ≻ -PASS XHTML1.1 parsing ≽ -PASS XHTML1.1 parsing ⪰ -PASS XHTML1.1 parsing ⪴ -PASS XHTML1.1 parsing Ş -PASS XHTML1.1 parsing ş -PASS XHTML1.1 parsing Ŝ -PASS XHTML1.1 parsing ŝ -PASS XHTML1.1 parsing ⪺ -PASS XHTML1.1 parsing ⪶ -PASS XHTML1.1 parsing ⋩ -PASS XHTML1.1 parsing ⨓ -PASS XHTML1.1 parsing ≿ -PASS XHTML1.1 parsing С -PASS XHTML1.1 parsing с -PASS XHTML1.1 parsing ⊡ -PASS XHTML1.1 parsing ⋅ -PASS XHTML1.1 parsing ⩦ -PASS XHTML1.1 parsing ⤥ -PASS XHTML1.1 parsing ↘ -PASS XHTML1.1 parsing ⇘ -PASS XHTML1.1 parsing ↘ -PASS XHTML1.1 parsing § -PASS XHTML1.1 parsing ; -PASS XHTML1.1 parsing ⤩ -PASS XHTML1.1 parsing ∖ -PASS XHTML1.1 parsing ∖ -PASS XHTML1.1 parsing ✶ -PASS XHTML1.1 parsing 𝔖 -PASS XHTML1.1 parsing 𝔰 -PASS XHTML1.1 parsing ⌢ -PASS XHTML1.1 parsing ♯ -PASS XHTML1.1 parsing Щ -PASS XHTML1.1 parsing щ -PASS XHTML1.1 parsing Ш -PASS XHTML1.1 parsing ш -PASS XHTML1.1 parsing ↓ -PASS XHTML1.1 parsing ← -PASS XHTML1.1 parsing ∣ -PASS XHTML1.1 parsing ∥ -PASS XHTML1.1 parsing → -PASS XHTML1.1 parsing ↑ -PASS XHTML1.1 parsing ­ -PASS XHTML1.1 parsing Σ -PASS XHTML1.1 parsing σ -PASS XHTML1.1 parsing ς -PASS XHTML1.1 parsing ς -PASS XHTML1.1 parsing ∼ -PASS XHTML1.1 parsing ⩪ -PASS XHTML1.1 parsing ≃ -PASS XHTML1.1 parsing ≃ -PASS XHTML1.1 parsing ⪞ -PASS XHTML1.1 parsing ⪠ -PASS XHTML1.1 parsing ⪝ -PASS XHTML1.1 parsing ⪟ -PASS XHTML1.1 parsing ≆ -PASS XHTML1.1 parsing ⨤ -PASS XHTML1.1 parsing ⥲ -PASS XHTML1.1 parsing ← -PASS XHTML1.1 parsing ∘ -PASS XHTML1.1 parsing ∖ -PASS XHTML1.1 parsing ⨳ -PASS XHTML1.1 parsing ⧤ -PASS XHTML1.1 parsing ∣ -PASS XHTML1.1 parsing ⌣ -PASS XHTML1.1 parsing ⪪ -PASS XHTML1.1 parsing ⪬ -PASS XHTML1.1 parsing ⪬︀ -PASS XHTML1.1 parsing Ь -PASS XHTML1.1 parsing ь -PASS XHTML1.1 parsing ⌿ -PASS XHTML1.1 parsing ⧄ -PASS XHTML1.1 parsing / -PASS XHTML1.1 parsing 𝕊 -PASS XHTML1.1 parsing 𝕤 -PASS XHTML1.1 parsing ♠ -PASS XHTML1.1 parsing ♠ -PASS XHTML1.1 parsing ∥ -PASS XHTML1.1 parsing ⊓ -PASS XHTML1.1 parsing ⊓︀ -PASS XHTML1.1 parsing ⊔ -PASS XHTML1.1 parsing ⊔︀ -PASS XHTML1.1 parsing √ -PASS XHTML1.1 parsing ⊏ -PASS XHTML1.1 parsing ⊑ -PASS XHTML1.1 parsing ⊏ -PASS XHTML1.1 parsing ⊑ -PASS XHTML1.1 parsing ⊐ -PASS XHTML1.1 parsing ⊒ -PASS XHTML1.1 parsing ⊐ -PASS XHTML1.1 parsing ⊒ -PASS XHTML1.1 parsing □ -PASS XHTML1.1 parsing □ -PASS XHTML1.1 parsing ⊓ -PASS XHTML1.1 parsing ⊏ -PASS XHTML1.1 parsing ⊑ -PASS XHTML1.1 parsing ⊐ -PASS XHTML1.1 parsing ⊒ -PASS XHTML1.1 parsing ⊔ -PASS XHTML1.1 parsing ▪ -PASS XHTML1.1 parsing □ -PASS XHTML1.1 parsing ▪ -PASS XHTML1.1 parsing → -PASS XHTML1.1 parsing 𝒮 -PASS XHTML1.1 parsing 𝓈 -PASS XHTML1.1 parsing ∖ -PASS XHTML1.1 parsing ⌣ -PASS XHTML1.1 parsing ⋆ -PASS XHTML1.1 parsing ⋆ -PASS XHTML1.1 parsing ☆ -PASS XHTML1.1 parsing ★ -PASS XHTML1.1 parsing ϵ -PASS XHTML1.1 parsing ϕ -PASS XHTML1.1 parsing ¯ -PASS XHTML1.1 parsing ⊂ -PASS XHTML1.1 parsing ⋐ -PASS XHTML1.1 parsing ⪽ -PASS XHTML1.1 parsing ⫅ -PASS XHTML1.1 parsing ⊆ -PASS XHTML1.1 parsing ⫃ -PASS XHTML1.1 parsing ⫁ -PASS XHTML1.1 parsing ⫋ -PASS XHTML1.1 parsing ⊊ -PASS XHTML1.1 parsing ⪿ -PASS XHTML1.1 parsing ⥹ -PASS XHTML1.1 parsing ⊂ -PASS XHTML1.1 parsing ⋐ -PASS XHTML1.1 parsing ⊆ -PASS XHTML1.1 parsing ⫅ -PASS XHTML1.1 parsing ⊆ -PASS XHTML1.1 parsing ⊊ -PASS XHTML1.1 parsing ⫋ -PASS XHTML1.1 parsing ⫇ -PASS XHTML1.1 parsing ⫕ -PASS XHTML1.1 parsing ⫓ -PASS XHTML1.1 parsing ⪸ -PASS XHTML1.1 parsing ≻ -PASS XHTML1.1 parsing ≽ -PASS XHTML1.1 parsing ≻ -PASS XHTML1.1 parsing ⪰ -PASS XHTML1.1 parsing ≽ -PASS XHTML1.1 parsing ≿ -PASS XHTML1.1 parsing ⪰ -PASS XHTML1.1 parsing ⪺ -PASS XHTML1.1 parsing ⪶ -PASS XHTML1.1 parsing ⋩ -PASS XHTML1.1 parsing ≿ -PASS XHTML1.1 parsing ∋ -PASS XHTML1.1 parsing ∑ -PASS XHTML1.1 parsing ∑ -PASS XHTML1.1 parsing ♪ -PASS XHTML1.1 parsing ¹ -PASS XHTML1.1 parsing ² -PASS XHTML1.1 parsing ³ -PASS XHTML1.1 parsing ⊃ -PASS XHTML1.1 parsing ⋑ -PASS XHTML1.1 parsing ⪾ -PASS XHTML1.1 parsing ⫘ -PASS XHTML1.1 parsing ⫆ -PASS XHTML1.1 parsing ⊇ -PASS XHTML1.1 parsing ⫄ -PASS XHTML1.1 parsing ⊃ -PASS XHTML1.1 parsing ⊇ -PASS XHTML1.1 parsing ⟉ -PASS XHTML1.1 parsing ⫗ -PASS XHTML1.1 parsing ⥻ -PASS XHTML1.1 parsing ⫂ -PASS XHTML1.1 parsing ⫌ -PASS XHTML1.1 parsing ⊋ -PASS XHTML1.1 parsing ⫀ -PASS XHTML1.1 parsing ⊃ -PASS XHTML1.1 parsing ⋑ -PASS XHTML1.1 parsing ⊇ -PASS XHTML1.1 parsing ⫆ -PASS XHTML1.1 parsing ⊋ -PASS XHTML1.1 parsing ⫌ -PASS XHTML1.1 parsing ⫈ -PASS XHTML1.1 parsing ⫔ -PASS XHTML1.1 parsing ⫖ -PASS XHTML1.1 parsing ⤦ -PASS XHTML1.1 parsing ↙ -PASS XHTML1.1 parsing ⇙ -PASS XHTML1.1 parsing ↙ -PASS XHTML1.1 parsing ⤪ -PASS XHTML1.1 parsing ß -PASS XHTML1.1 parsing 	 -PASS XHTML1.1 parsing ⌖ -PASS XHTML1.1 parsing Τ -PASS XHTML1.1 parsing τ -PASS XHTML1.1 parsing ⎴ -PASS XHTML1.1 parsing Ť -PASS XHTML1.1 parsing ť -PASS XHTML1.1 parsing Ţ -PASS XHTML1.1 parsing ţ -PASS XHTML1.1 parsing Т -PASS XHTML1.1 parsing т -PASS XHTML1.1 parsing ⃛ -PASS XHTML1.1 parsing ⌕ -PASS XHTML1.1 parsing 𝔗 -PASS XHTML1.1 parsing 𝔱 -PASS XHTML1.1 parsing ∴ -PASS XHTML1.1 parsing ∴ -PASS XHTML1.1 parsing ∴ -PASS XHTML1.1 parsing Θ -PASS XHTML1.1 parsing θ -PASS XHTML1.1 parsing ϑ -PASS XHTML1.1 parsing ϑ -PASS XHTML1.1 parsing ≈ -PASS XHTML1.1 parsing ∼ -PASS XHTML1.1 parsing    -PASS XHTML1.1 parsing   -PASS XHTML1.1 parsing   -PASS XHTML1.1 parsing ≈ -PASS XHTML1.1 parsing ∼ -PASS XHTML1.1 parsing Þ -PASS XHTML1.1 parsing þ -PASS XHTML1.1 parsing ˜ -PASS XHTML1.1 parsing ∼ -PASS XHTML1.1 parsing ≃ -PASS XHTML1.1 parsing ≅ -PASS XHTML1.1 parsing ≈ -PASS XHTML1.1 parsing ⨱ -PASS XHTML1.1 parsing ⊠ -PASS XHTML1.1 parsing × -PASS XHTML1.1 parsing ⨰ -PASS XHTML1.1 parsing ∭ -PASS XHTML1.1 parsing ⤨ -PASS XHTML1.1 parsing ⌶ -PASS XHTML1.1 parsing ⫱ -PASS XHTML1.1 parsing ⊤ -PASS XHTML1.1 parsing 𝕋 -PASS XHTML1.1 parsing 𝕥 -PASS XHTML1.1 parsing ⫚ -PASS XHTML1.1 parsing ⤩ -PASS XHTML1.1 parsing ‴ -PASS XHTML1.1 parsing ™ -PASS XHTML1.1 parsing ™ -PASS XHTML1.1 parsing ▵ -PASS XHTML1.1 parsing ▿ -PASS XHTML1.1 parsing ◃ -PASS XHTML1.1 parsing ⊴ -PASS XHTML1.1 parsing ≜ -PASS XHTML1.1 parsing ▹ -PASS XHTML1.1 parsing ⊵ -PASS XHTML1.1 parsing ◬ -PASS XHTML1.1 parsing ≜ -PASS XHTML1.1 parsing ⨺ -PASS XHTML1.1 parsing ⃛ -PASS XHTML1.1 parsing ⨹ -PASS XHTML1.1 parsing ⧍ -PASS XHTML1.1 parsing ⨻ -PASS XHTML1.1 parsing ⏢ -PASS XHTML1.1 parsing 𝒯 -PASS XHTML1.1 parsing 𝓉 -PASS XHTML1.1 parsing Ц -PASS XHTML1.1 parsing ц -PASS XHTML1.1 parsing Ћ -PASS XHTML1.1 parsing ћ -PASS XHTML1.1 parsing Ŧ -PASS XHTML1.1 parsing ŧ -PASS XHTML1.1 parsing ≬ -PASS XHTML1.1 parsing ↞ -PASS XHTML1.1 parsing ↠ -PASS XHTML1.1 parsing Ú -PASS XHTML1.1 parsing ú -PASS XHTML1.1 parsing ↑ -PASS XHTML1.1 parsing ↟ -PASS XHTML1.1 parsing ⇑ -PASS XHTML1.1 parsing ⥉ -PASS XHTML1.1 parsing Ў -PASS XHTML1.1 parsing ў -PASS XHTML1.1 parsing Ŭ -PASS XHTML1.1 parsing ŭ -PASS XHTML1.1 parsing Û -PASS XHTML1.1 parsing û -PASS XHTML1.1 parsing У -PASS XHTML1.1 parsing у -PASS XHTML1.1 parsing ⇅ -PASS XHTML1.1 parsing Ű -PASS XHTML1.1 parsing ű -PASS XHTML1.1 parsing ⥮ -PASS XHTML1.1 parsing ⥾ -PASS XHTML1.1 parsing 𝔘 -PASS XHTML1.1 parsing 𝔲 -PASS XHTML1.1 parsing Ù -PASS XHTML1.1 parsing ù -PASS XHTML1.1 parsing ⥣ -PASS XHTML1.1 parsing ↿ -PASS XHTML1.1 parsing ↾ -PASS XHTML1.1 parsing ▀ -PASS XHTML1.1 parsing ⌜ -PASS XHTML1.1 parsing ⌜ -PASS XHTML1.1 parsing ⌏ -PASS XHTML1.1 parsing ◸ -PASS XHTML1.1 parsing Ū -PASS XHTML1.1 parsing ū -PASS XHTML1.1 parsing ¨ -PASS XHTML1.1 parsing _ -PASS XHTML1.1 parsing ⏟ -PASS XHTML1.1 parsing ⎵ -PASS XHTML1.1 parsing ⏝ -PASS XHTML1.1 parsing ⋃ -PASS XHTML1.1 parsing ⊎ -PASS XHTML1.1 parsing Ų -PASS XHTML1.1 parsing ų -PASS XHTML1.1 parsing 𝕌 -PASS XHTML1.1 parsing 𝕦 -PASS XHTML1.1 parsing ⤒ -PASS XHTML1.1 parsing ↑ -PASS XHTML1.1 parsing ↑ -PASS XHTML1.1 parsing ⇑ -PASS XHTML1.1 parsing ⇅ -PASS XHTML1.1 parsing ↕ -PASS XHTML1.1 parsing ↕ -PASS XHTML1.1 parsing ⇕ -PASS XHTML1.1 parsing ⥮ -PASS XHTML1.1 parsing ↿ -PASS XHTML1.1 parsing ↾ -PASS XHTML1.1 parsing ⊎ -PASS XHTML1.1 parsing ↖ -PASS XHTML1.1 parsing ↗ -PASS XHTML1.1 parsing υ -PASS XHTML1.1 parsing ϒ -PASS XHTML1.1 parsing ϒ -PASS XHTML1.1 parsing Υ -PASS XHTML1.1 parsing υ -PASS XHTML1.1 parsing ↥ -PASS XHTML1.1 parsing ⊥ -PASS XHTML1.1 parsing ⇈ -PASS XHTML1.1 parsing ⌝ -PASS XHTML1.1 parsing ⌝ -PASS XHTML1.1 parsing ⌎ -PASS XHTML1.1 parsing Ů -PASS XHTML1.1 parsing ů -PASS XHTML1.1 parsing ◹ -PASS XHTML1.1 parsing 𝒰 -PASS XHTML1.1 parsing 𝓊 -PASS XHTML1.1 parsing ⋰ -PASS XHTML1.1 parsing Ũ -PASS XHTML1.1 parsing ũ -PASS XHTML1.1 parsing ▵ -PASS XHTML1.1 parsing ▴ -PASS XHTML1.1 parsing ⇈ -PASS XHTML1.1 parsing Ü -PASS XHTML1.1 parsing ü -PASS XHTML1.1 parsing ⦧ -PASS XHTML1.1 parsing ⦜ -PASS XHTML1.1 parsing ϵ -PASS XHTML1.1 parsing ϰ -PASS XHTML1.1 parsing ∅ -PASS XHTML1.1 parsing ϕ -PASS XHTML1.1 parsing ϖ -PASS XHTML1.1 parsing ∝ -PASS XHTML1.1 parsing ↕ -PASS XHTML1.1 parsing ⇕ -PASS XHTML1.1 parsing ϱ -PASS XHTML1.1 parsing ς -PASS XHTML1.1 parsing ⊊︀ -PASS XHTML1.1 parsing ⫋︀ -PASS XHTML1.1 parsing ⊋︀ -PASS XHTML1.1 parsing ⫌︀ -PASS XHTML1.1 parsing ϑ -PASS XHTML1.1 parsing ⊲ -PASS XHTML1.1 parsing ⊳ -PASS XHTML1.1 parsing ⫨ -PASS XHTML1.1 parsing ⫫ -PASS XHTML1.1 parsing ⫩ -PASS XHTML1.1 parsing В -PASS XHTML1.1 parsing в -PASS XHTML1.1 parsing ⊢ -PASS XHTML1.1 parsing ⊨ -PASS XHTML1.1 parsing ⊩ -PASS XHTML1.1 parsing ⊫ -PASS XHTML1.1 parsing ⫦ -PASS XHTML1.1 parsing ⊻ -PASS XHTML1.1 parsing ∨ -PASS XHTML1.1 parsing ⋁ -PASS XHTML1.1 parsing ≚ -PASS XHTML1.1 parsing ⋮ -PASS XHTML1.1 parsing | -PASS XHTML1.1 parsing ‖ -PASS XHTML1.1 parsing | -PASS XHTML1.1 parsing ‖ -PASS XHTML1.1 parsing ∣ -PASS XHTML1.1 parsing | -PASS XHTML1.1 parsing ❘ -PASS XHTML1.1 parsing ≀ -PASS XHTML1.1 parsing   -PASS XHTML1.1 parsing 𝔙 -PASS XHTML1.1 parsing 𝔳 -PASS XHTML1.1 parsing ⊲ -PASS XHTML1.1 parsing ⊂⃒ -PASS XHTML1.1 parsing ⊃⃒ -PASS XHTML1.1 parsing 𝕍 -PASS XHTML1.1 parsing 𝕧 -PASS XHTML1.1 parsing ∝ -PASS XHTML1.1 parsing ⊳ -PASS XHTML1.1 parsing 𝒱 -PASS XHTML1.1 parsing 𝓋 -PASS XHTML1.1 parsing ⫋︀ -PASS XHTML1.1 parsing ⊊︀ -PASS XHTML1.1 parsing ⫌︀ -PASS XHTML1.1 parsing ⊋︀ -PASS XHTML1.1 parsing ⊪ -PASS XHTML1.1 parsing ⦚ -PASS XHTML1.1 parsing Ŵ -PASS XHTML1.1 parsing ŵ -PASS XHTML1.1 parsing ⩟ -PASS XHTML1.1 parsing ∧ -PASS XHTML1.1 parsing ⋀ -PASS XHTML1.1 parsing ≙ -PASS XHTML1.1 parsing ℘ -PASS XHTML1.1 parsing 𝔚 -PASS XHTML1.1 parsing 𝔴 -PASS XHTML1.1 parsing 𝕎 -PASS XHTML1.1 parsing 𝕨 -PASS XHTML1.1 parsing ℘ -PASS XHTML1.1 parsing ≀ -PASS XHTML1.1 parsing ≀ -PASS XHTML1.1 parsing 𝒲 -PASS XHTML1.1 parsing 𝓌 -PASS XHTML1.1 parsing ⋂ -PASS XHTML1.1 parsing ◯ -PASS XHTML1.1 parsing ⋃ -PASS XHTML1.1 parsing ▽ -PASS XHTML1.1 parsing 𝔛 -PASS XHTML1.1 parsing 𝔵 -PASS XHTML1.1 parsing ⟷ -PASS XHTML1.1 parsing ⟺ -PASS XHTML1.1 parsing Ξ -PASS XHTML1.1 parsing ξ -PASS XHTML1.1 parsing ⟵ -PASS XHTML1.1 parsing ⟸ -PASS XHTML1.1 parsing ⟼ -PASS XHTML1.1 parsing ⋻ -PASS XHTML1.1 parsing ⨀ -PASS XHTML1.1 parsing 𝕏 -PASS XHTML1.1 parsing 𝕩 -PASS XHTML1.1 parsing ⨁ -PASS XHTML1.1 parsing ⨂ -PASS XHTML1.1 parsing ⟶ -PASS XHTML1.1 parsing ⟹ -PASS XHTML1.1 parsing 𝒳 -PASS XHTML1.1 parsing 𝓍 -PASS XHTML1.1 parsing ⨆ -PASS XHTML1.1 parsing ⨄ -PASS XHTML1.1 parsing △ -PASS XHTML1.1 parsing ⋁ -PASS XHTML1.1 parsing ⋀ -PASS XHTML1.1 parsing Ý -PASS XHTML1.1 parsing ý -PASS XHTML1.1 parsing Я -PASS XHTML1.1 parsing я -PASS XHTML1.1 parsing Ŷ -PASS XHTML1.1 parsing ŷ -PASS XHTML1.1 parsing Ы -PASS XHTML1.1 parsing ы -PASS XHTML1.1 parsing ¥ -PASS XHTML1.1 parsing 𝔜 -PASS XHTML1.1 parsing 𝔶 -PASS XHTML1.1 parsing Ї -PASS XHTML1.1 parsing ї -PASS XHTML1.1 parsing 𝕐 -PASS XHTML1.1 parsing 𝕪 -PASS XHTML1.1 parsing 𝒴 -PASS XHTML1.1 parsing 𝓎 -PASS XHTML1.1 parsing Ю -PASS XHTML1.1 parsing ю -PASS XHTML1.1 parsing ÿ -PASS XHTML1.1 parsing Ÿ -PASS XHTML1.1 parsing Ź -PASS XHTML1.1 parsing ź -PASS XHTML1.1 parsing Ž -PASS XHTML1.1 parsing ž -PASS XHTML1.1 parsing З -PASS XHTML1.1 parsing з -PASS XHTML1.1 parsing Ż -PASS XHTML1.1 parsing ż -PASS XHTML1.1 parsing ℨ -PASS XHTML1.1 parsing ​ -PASS XHTML1.1 parsing Ζ -PASS XHTML1.1 parsing ζ -PASS XHTML1.1 parsing 𝔷 -PASS XHTML1.1 parsing ℨ -PASS XHTML1.1 parsing Ж -PASS XHTML1.1 parsing ж -PASS XHTML1.1 parsing ⇝ -PASS XHTML1.1 parsing 𝕫 -PASS XHTML1.1 parsing ℤ -PASS XHTML1.1 parsing 𝒵 -PASS XHTML1.1 parsing 𝓏 -PASS XHTML1.1 parsing ‍ -PASS XHTML1.1 parsing ‌ -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-3-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-3-expected.txt deleted file mode 100644 index e182132b..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-3-expected.txt +++ /dev/null
@@ -1,2129 +0,0 @@ -This is a testharness.js-based test. -Found 2125 tests; 2122 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS XHTML1.0 Strict parsing Á -PASS XHTML1.0 Strict parsing á -PASS XHTML1.0 Strict parsing Ă -PASS XHTML1.0 Strict parsing ă -PASS XHTML1.0 Strict parsing ∾ -PASS XHTML1.0 Strict parsing ∿ -PASS XHTML1.0 Strict parsing ∾̳ -PASS XHTML1.0 Strict parsing  -PASS XHTML1.0 Strict parsing â -PASS XHTML1.0 Strict parsing ´ -PASS XHTML1.0 Strict parsing А -PASS XHTML1.0 Strict parsing а -PASS XHTML1.0 Strict parsing Æ -PASS XHTML1.0 Strict parsing æ -PASS XHTML1.0 Strict parsing ⁡ -PASS XHTML1.0 Strict parsing 𝔄 -PASS XHTML1.0 Strict parsing 𝔞 -PASS XHTML1.0 Strict parsing À -PASS XHTML1.0 Strict parsing à -PASS XHTML1.0 Strict parsing ℵ -PASS XHTML1.0 Strict parsing ℵ -PASS XHTML1.0 Strict parsing Α -PASS XHTML1.0 Strict parsing α -PASS XHTML1.0 Strict parsing Ā -PASS XHTML1.0 Strict parsing ā -PASS XHTML1.0 Strict parsing ⨿ -PASS XHTML1.0 Strict parsing & -FAIL XHTML1.0 Strict parsing & assert_true: expected true got false -PASS XHTML1.0 Strict parsing ⩕ -PASS XHTML1.0 Strict parsing ⩓ -PASS XHTML1.0 Strict parsing ∧ -PASS XHTML1.0 Strict parsing ⩜ -PASS XHTML1.0 Strict parsing ⩘ -PASS XHTML1.0 Strict parsing ⩚ -PASS XHTML1.0 Strict parsing ∠ -PASS XHTML1.0 Strict parsing ⦤ -PASS XHTML1.0 Strict parsing ∠ -PASS XHTML1.0 Strict parsing ⦨ -PASS XHTML1.0 Strict parsing ⦩ -PASS XHTML1.0 Strict parsing ⦪ -PASS XHTML1.0 Strict parsing ⦫ -PASS XHTML1.0 Strict parsing ⦬ -PASS XHTML1.0 Strict parsing ⦭ -PASS XHTML1.0 Strict parsing ⦮ -PASS XHTML1.0 Strict parsing ⦯ -PASS XHTML1.0 Strict parsing ∡ -PASS XHTML1.0 Strict parsing ∟ -PASS XHTML1.0 Strict parsing ⊾ -PASS XHTML1.0 Strict parsing ⦝ -PASS XHTML1.0 Strict parsing ∢ -PASS XHTML1.0 Strict parsing Å -PASS XHTML1.0 Strict parsing ⍼ -PASS XHTML1.0 Strict parsing Ą -PASS XHTML1.0 Strict parsing ą -PASS XHTML1.0 Strict parsing 𝔸 -PASS XHTML1.0 Strict parsing 𝕒 -PASS XHTML1.0 Strict parsing ⩯ -PASS XHTML1.0 Strict parsing ≈ -PASS XHTML1.0 Strict parsing ⩰ -PASS XHTML1.0 Strict parsing ≊ -PASS XHTML1.0 Strict parsing ≋ -PASS XHTML1.0 Strict parsing ' -PASS XHTML1.0 Strict parsing ⁡ -PASS XHTML1.0 Strict parsing ≈ -PASS XHTML1.0 Strict parsing ≊ -PASS XHTML1.0 Strict parsing Å -PASS XHTML1.0 Strict parsing å -PASS XHTML1.0 Strict parsing 𝒜 -PASS XHTML1.0 Strict parsing 𝒶 -PASS XHTML1.0 Strict parsing ≔ -PASS XHTML1.0 Strict parsing * -PASS XHTML1.0 Strict parsing ≈ -PASS XHTML1.0 Strict parsing ≍ -PASS XHTML1.0 Strict parsing à -PASS XHTML1.0 Strict parsing ã -PASS XHTML1.0 Strict parsing Ä -PASS XHTML1.0 Strict parsing ä -PASS XHTML1.0 Strict parsing ∳ -PASS XHTML1.0 Strict parsing ⨑ -PASS XHTML1.0 Strict parsing ≌ -PASS XHTML1.0 Strict parsing ϶ -PASS XHTML1.0 Strict parsing ‵ -PASS XHTML1.0 Strict parsing ∽ -PASS XHTML1.0 Strict parsing ⋍ -PASS XHTML1.0 Strict parsing ∖ -PASS XHTML1.0 Strict parsing ⫧ -PASS XHTML1.0 Strict parsing ⊽ -PASS XHTML1.0 Strict parsing ⌅ -PASS XHTML1.0 Strict parsing ⌆ -PASS XHTML1.0 Strict parsing ⌅ -PASS XHTML1.0 Strict parsing ⎵ -PASS XHTML1.0 Strict parsing ⎶ -PASS XHTML1.0 Strict parsing ≌ -PASS XHTML1.0 Strict parsing Б -PASS XHTML1.0 Strict parsing б -PASS XHTML1.0 Strict parsing „ -PASS XHTML1.0 Strict parsing ∵ -PASS XHTML1.0 Strict parsing ∵ -PASS XHTML1.0 Strict parsing ∵ -PASS XHTML1.0 Strict parsing ⦰ -PASS XHTML1.0 Strict parsing ϶ -PASS XHTML1.0 Strict parsing ℬ -PASS XHTML1.0 Strict parsing ℬ -PASS XHTML1.0 Strict parsing Β -PASS XHTML1.0 Strict parsing β -PASS XHTML1.0 Strict parsing ℶ -PASS XHTML1.0 Strict parsing ≬ -PASS XHTML1.0 Strict parsing 𝔅 -PASS XHTML1.0 Strict parsing 𝔟 -PASS XHTML1.0 Strict parsing ⋂ -PASS XHTML1.0 Strict parsing ◯ -PASS XHTML1.0 Strict parsing ⋃ -PASS XHTML1.0 Strict parsing ⨀ -PASS XHTML1.0 Strict parsing ⨁ -PASS XHTML1.0 Strict parsing ⨂ -PASS XHTML1.0 Strict parsing ⨆ -PASS XHTML1.0 Strict parsing ★ -PASS XHTML1.0 Strict parsing ▽ -PASS XHTML1.0 Strict parsing △ -PASS XHTML1.0 Strict parsing ⨄ -PASS XHTML1.0 Strict parsing ⋁ -PASS XHTML1.0 Strict parsing ⋀ -PASS XHTML1.0 Strict parsing ⤍ -PASS XHTML1.0 Strict parsing ⧫ -PASS XHTML1.0 Strict parsing ▪ -PASS XHTML1.0 Strict parsing ▴ -PASS XHTML1.0 Strict parsing ▾ -PASS XHTML1.0 Strict parsing ◂ -PASS XHTML1.0 Strict parsing ▸ -PASS XHTML1.0 Strict parsing ␣ -PASS XHTML1.0 Strict parsing ▒ -PASS XHTML1.0 Strict parsing ░ -PASS XHTML1.0 Strict parsing ▓ -PASS XHTML1.0 Strict parsing █ -PASS XHTML1.0 Strict parsing =⃥ -PASS XHTML1.0 Strict parsing ≡⃥ -PASS XHTML1.0 Strict parsing ⫭ -PASS XHTML1.0 Strict parsing ⌐ -PASS XHTML1.0 Strict parsing 𝔹 -PASS XHTML1.0 Strict parsing 𝕓 -PASS XHTML1.0 Strict parsing ⊥ -PASS XHTML1.0 Strict parsing ⊥ -PASS XHTML1.0 Strict parsing ⋈ -PASS XHTML1.0 Strict parsing ⧉ -PASS XHTML1.0 Strict parsing ┐ -PASS XHTML1.0 Strict parsing ╕ -PASS XHTML1.0 Strict parsing ╖ -PASS XHTML1.0 Strict parsing ╗ -PASS XHTML1.0 Strict parsing ┌ -PASS XHTML1.0 Strict parsing ╒ -PASS XHTML1.0 Strict parsing ╓ -PASS XHTML1.0 Strict parsing ╔ -PASS XHTML1.0 Strict parsing ─ -PASS XHTML1.0 Strict parsing ═ -PASS XHTML1.0 Strict parsing ┬ -PASS XHTML1.0 Strict parsing ╤ -PASS XHTML1.0 Strict parsing ╥ -PASS XHTML1.0 Strict parsing ╦ -PASS XHTML1.0 Strict parsing ┴ -PASS XHTML1.0 Strict parsing ╧ -PASS XHTML1.0 Strict parsing ╨ -PASS XHTML1.0 Strict parsing ╩ -PASS XHTML1.0 Strict parsing ⊟ -PASS XHTML1.0 Strict parsing ⊞ -PASS XHTML1.0 Strict parsing ⊠ -PASS XHTML1.0 Strict parsing ┘ -PASS XHTML1.0 Strict parsing ╛ -PASS XHTML1.0 Strict parsing ╜ -PASS XHTML1.0 Strict parsing ╝ -PASS XHTML1.0 Strict parsing └ -PASS XHTML1.0 Strict parsing ╘ -PASS XHTML1.0 Strict parsing ╙ -PASS XHTML1.0 Strict parsing ╚ -PASS XHTML1.0 Strict parsing │ -PASS XHTML1.0 Strict parsing ║ -PASS XHTML1.0 Strict parsing ┼ -PASS XHTML1.0 Strict parsing ╪ -PASS XHTML1.0 Strict parsing ╫ -PASS XHTML1.0 Strict parsing ╬ -PASS XHTML1.0 Strict parsing ┤ -PASS XHTML1.0 Strict parsing ╡ -PASS XHTML1.0 Strict parsing ╢ -PASS XHTML1.0 Strict parsing ╣ -PASS XHTML1.0 Strict parsing ├ -PASS XHTML1.0 Strict parsing ╞ -PASS XHTML1.0 Strict parsing ╟ -PASS XHTML1.0 Strict parsing ╠ -PASS XHTML1.0 Strict parsing ‵ -PASS XHTML1.0 Strict parsing ˘ -PASS XHTML1.0 Strict parsing ˘ -PASS XHTML1.0 Strict parsing ¦ -PASS XHTML1.0 Strict parsing 𝒷 -PASS XHTML1.0 Strict parsing ℬ -PASS XHTML1.0 Strict parsing ⁏ -PASS XHTML1.0 Strict parsing ∽ -PASS XHTML1.0 Strict parsing ⋍ -PASS XHTML1.0 Strict parsing ⧅ -PASS XHTML1.0 Strict parsing \ -PASS XHTML1.0 Strict parsing ⟈ -PASS XHTML1.0 Strict parsing • -PASS XHTML1.0 Strict parsing • -PASS XHTML1.0 Strict parsing ≎ -PASS XHTML1.0 Strict parsing ⪮ -PASS XHTML1.0 Strict parsing ≏ -PASS XHTML1.0 Strict parsing ≎ -PASS XHTML1.0 Strict parsing ≏ -PASS XHTML1.0 Strict parsing Ć -PASS XHTML1.0 Strict parsing ć -PASS XHTML1.0 Strict parsing ⩄ -PASS XHTML1.0 Strict parsing ⩉ -PASS XHTML1.0 Strict parsing ⩋ -PASS XHTML1.0 Strict parsing ∩ -PASS XHTML1.0 Strict parsing ⋒ -PASS XHTML1.0 Strict parsing ⩇ -PASS XHTML1.0 Strict parsing ⩀ -PASS XHTML1.0 Strict parsing ⅅ -PASS XHTML1.0 Strict parsing ∩︀ -PASS XHTML1.0 Strict parsing ⁁ -PASS XHTML1.0 Strict parsing ˇ -PASS XHTML1.0 Strict parsing ℭ -PASS XHTML1.0 Strict parsing ⩍ -PASS XHTML1.0 Strict parsing Č -PASS XHTML1.0 Strict parsing č -PASS XHTML1.0 Strict parsing Ç -PASS XHTML1.0 Strict parsing ç -PASS XHTML1.0 Strict parsing Ĉ -PASS XHTML1.0 Strict parsing ĉ -PASS XHTML1.0 Strict parsing ∰ -PASS XHTML1.0 Strict parsing ⩌ -PASS XHTML1.0 Strict parsing ⩐ -PASS XHTML1.0 Strict parsing Ċ -PASS XHTML1.0 Strict parsing ċ -PASS XHTML1.0 Strict parsing ¸ -PASS XHTML1.0 Strict parsing ¸ -PASS XHTML1.0 Strict parsing ⦲ -PASS XHTML1.0 Strict parsing ¢ -PASS XHTML1.0 Strict parsing · -PASS XHTML1.0 Strict parsing · -PASS XHTML1.0 Strict parsing 𝔠 -PASS XHTML1.0 Strict parsing ℭ -PASS XHTML1.0 Strict parsing Ч -PASS XHTML1.0 Strict parsing ч -PASS XHTML1.0 Strict parsing ✓ -PASS XHTML1.0 Strict parsing ✓ -PASS XHTML1.0 Strict parsing Χ -PASS XHTML1.0 Strict parsing χ -PASS XHTML1.0 Strict parsing ˆ -PASS XHTML1.0 Strict parsing ≗ -PASS XHTML1.0 Strict parsing ↺ -PASS XHTML1.0 Strict parsing ↻ -PASS XHTML1.0 Strict parsing ⊛ -PASS XHTML1.0 Strict parsing ⊚ -PASS XHTML1.0 Strict parsing ⊝ -PASS XHTML1.0 Strict parsing ⊙ -PASS XHTML1.0 Strict parsing ® -PASS XHTML1.0 Strict parsing Ⓢ -PASS XHTML1.0 Strict parsing ⊖ -PASS XHTML1.0 Strict parsing ⊕ -PASS XHTML1.0 Strict parsing ⊗ -PASS XHTML1.0 Strict parsing ○ -PASS XHTML1.0 Strict parsing ⧃ -PASS XHTML1.0 Strict parsing ≗ -PASS XHTML1.0 Strict parsing ⨐ -PASS XHTML1.0 Strict parsing ⫯ -PASS XHTML1.0 Strict parsing ⧂ -PASS XHTML1.0 Strict parsing ∲ -PASS XHTML1.0 Strict parsing ” -PASS XHTML1.0 Strict parsing ’ -PASS XHTML1.0 Strict parsing ♣ -PASS XHTML1.0 Strict parsing ♣ -PASS XHTML1.0 Strict parsing : -PASS XHTML1.0 Strict parsing ∷ -PASS XHTML1.0 Strict parsing ⩴ -PASS XHTML1.0 Strict parsing ≔ -PASS XHTML1.0 Strict parsing ≔ -PASS XHTML1.0 Strict parsing , -PASS XHTML1.0 Strict parsing @ -PASS XHTML1.0 Strict parsing ∁ -PASS XHTML1.0 Strict parsing ∘ -PASS XHTML1.0 Strict parsing ∁ -PASS XHTML1.0 Strict parsing ℂ -PASS XHTML1.0 Strict parsing ≅ -PASS XHTML1.0 Strict parsing ⩭ -PASS XHTML1.0 Strict parsing ≡ -PASS XHTML1.0 Strict parsing ∮ -PASS XHTML1.0 Strict parsing ∯ -PASS XHTML1.0 Strict parsing ∮ -PASS XHTML1.0 Strict parsing 𝕔 -PASS XHTML1.0 Strict parsing ℂ -PASS XHTML1.0 Strict parsing ∐ -PASS XHTML1.0 Strict parsing ∐ -PASS XHTML1.0 Strict parsing © -PASS XHTML1.0 Strict parsing © -PASS XHTML1.0 Strict parsing ℗ -PASS XHTML1.0 Strict parsing ∳ -PASS XHTML1.0 Strict parsing ↵ -PASS XHTML1.0 Strict parsing ✗ -PASS XHTML1.0 Strict parsing ⨯ -PASS XHTML1.0 Strict parsing 𝒞 -PASS XHTML1.0 Strict parsing 𝒸 -PASS XHTML1.0 Strict parsing ⫏ -PASS XHTML1.0 Strict parsing ⫑ -PASS XHTML1.0 Strict parsing ⫐ -PASS XHTML1.0 Strict parsing ⫒ -PASS XHTML1.0 Strict parsing ⋯ -PASS XHTML1.0 Strict parsing ⤸ -PASS XHTML1.0 Strict parsing ⤵ -PASS XHTML1.0 Strict parsing ⋞ -PASS XHTML1.0 Strict parsing ⋟ -PASS XHTML1.0 Strict parsing ↶ -PASS XHTML1.0 Strict parsing ⤽ -PASS XHTML1.0 Strict parsing ⩈ -PASS XHTML1.0 Strict parsing ⩆ -PASS XHTML1.0 Strict parsing ≍ -PASS XHTML1.0 Strict parsing ∪ -PASS XHTML1.0 Strict parsing ⋓ -PASS XHTML1.0 Strict parsing ⩊ -PASS XHTML1.0 Strict parsing ⊍ -PASS XHTML1.0 Strict parsing ⩅ -PASS XHTML1.0 Strict parsing ∪︀ -PASS XHTML1.0 Strict parsing ↷ -PASS XHTML1.0 Strict parsing ⤼ -PASS XHTML1.0 Strict parsing ⋞ -PASS XHTML1.0 Strict parsing ⋟ -PASS XHTML1.0 Strict parsing ⋎ -PASS XHTML1.0 Strict parsing ⋏ -PASS XHTML1.0 Strict parsing ¤ -PASS XHTML1.0 Strict parsing ↶ -PASS XHTML1.0 Strict parsing ↷ -PASS XHTML1.0 Strict parsing ⋎ -PASS XHTML1.0 Strict parsing ⋏ -PASS XHTML1.0 Strict parsing ∲ -PASS XHTML1.0 Strict parsing ∱ -PASS XHTML1.0 Strict parsing ⌭ -PASS XHTML1.0 Strict parsing † -PASS XHTML1.0 Strict parsing ‡ -PASS XHTML1.0 Strict parsing ℸ -PASS XHTML1.0 Strict parsing ↓ -PASS XHTML1.0 Strict parsing ↡ -PASS XHTML1.0 Strict parsing ⇓ -PASS XHTML1.0 Strict parsing ‐ -PASS XHTML1.0 Strict parsing ⫤ -PASS XHTML1.0 Strict parsing ⊣ -PASS XHTML1.0 Strict parsing ⤏ -PASS XHTML1.0 Strict parsing ˝ -PASS XHTML1.0 Strict parsing Ď -PASS XHTML1.0 Strict parsing ď -PASS XHTML1.0 Strict parsing Д -PASS XHTML1.0 Strict parsing д -PASS XHTML1.0 Strict parsing ‡ -PASS XHTML1.0 Strict parsing ⇊ -PASS XHTML1.0 Strict parsing ⅅ -PASS XHTML1.0 Strict parsing ⅆ -PASS XHTML1.0 Strict parsing ⤑ -PASS XHTML1.0 Strict parsing ⩷ -PASS XHTML1.0 Strict parsing ° -PASS XHTML1.0 Strict parsing ∇ -PASS XHTML1.0 Strict parsing Δ -PASS XHTML1.0 Strict parsing δ -PASS XHTML1.0 Strict parsing ⦱ -PASS XHTML1.0 Strict parsing ⥿ -PASS XHTML1.0 Strict parsing 𝔇 -PASS XHTML1.0 Strict parsing 𝔡 -PASS XHTML1.0 Strict parsing ⥥ -PASS XHTML1.0 Strict parsing ⇃ -PASS XHTML1.0 Strict parsing ⇂ -PASS XHTML1.0 Strict parsing ´ -PASS XHTML1.0 Strict parsing ˙ -PASS XHTML1.0 Strict parsing ˝ -PASS XHTML1.0 Strict parsing ` -PASS XHTML1.0 Strict parsing ˜ -PASS XHTML1.0 Strict parsing ⋄ -PASS XHTML1.0 Strict parsing ⋄ -PASS XHTML1.0 Strict parsing ⋄ -PASS XHTML1.0 Strict parsing ♦ -PASS XHTML1.0 Strict parsing ♦ -PASS XHTML1.0 Strict parsing ¨ -PASS XHTML1.0 Strict parsing ⅆ -PASS XHTML1.0 Strict parsing ϝ -PASS XHTML1.0 Strict parsing ⋲ -PASS XHTML1.0 Strict parsing ÷ -PASS XHTML1.0 Strict parsing ÷ -PASS XHTML1.0 Strict parsing ⋇ -PASS XHTML1.0 Strict parsing ⋇ -PASS XHTML1.0 Strict parsing Ђ -PASS XHTML1.0 Strict parsing ђ -PASS XHTML1.0 Strict parsing ⌞ -PASS XHTML1.0 Strict parsing ⌍ -PASS XHTML1.0 Strict parsing $ -PASS XHTML1.0 Strict parsing 𝔻 -PASS XHTML1.0 Strict parsing 𝕕 -PASS XHTML1.0 Strict parsing ¨ -PASS XHTML1.0 Strict parsing ˙ -PASS XHTML1.0 Strict parsing ⃜ -PASS XHTML1.0 Strict parsing ≐ -PASS XHTML1.0 Strict parsing ≑ -PASS XHTML1.0 Strict parsing ≐ -PASS XHTML1.0 Strict parsing ∸ -PASS XHTML1.0 Strict parsing ∔ -PASS XHTML1.0 Strict parsing ⊡ -PASS XHTML1.0 Strict parsing ⌆ -PASS XHTML1.0 Strict parsing ∯ -PASS XHTML1.0 Strict parsing ¨ -PASS XHTML1.0 Strict parsing ⇓ -PASS XHTML1.0 Strict parsing ⇐ -PASS XHTML1.0 Strict parsing ⇔ -PASS XHTML1.0 Strict parsing ⫤ -PASS XHTML1.0 Strict parsing ⟸ -PASS XHTML1.0 Strict parsing ⟺ -PASS XHTML1.0 Strict parsing ⟹ -PASS XHTML1.0 Strict parsing ⇒ -PASS XHTML1.0 Strict parsing ⊨ -PASS XHTML1.0 Strict parsing ⇑ -PASS XHTML1.0 Strict parsing ⇕ -PASS XHTML1.0 Strict parsing ∥ -PASS XHTML1.0 Strict parsing ⤓ -PASS XHTML1.0 Strict parsing ↓ -PASS XHTML1.0 Strict parsing ↓ -PASS XHTML1.0 Strict parsing ⇓ -PASS XHTML1.0 Strict parsing ⇵ -PASS XHTML1.0 Strict parsing ̑ -PASS XHTML1.0 Strict parsing ⇊ -PASS XHTML1.0 Strict parsing ⇃ -PASS XHTML1.0 Strict parsing ⇂ -PASS XHTML1.0 Strict parsing ⥐ -PASS XHTML1.0 Strict parsing ⥞ -PASS XHTML1.0 Strict parsing ⥖ -PASS XHTML1.0 Strict parsing ↽ -PASS XHTML1.0 Strict parsing ⥟ -PASS XHTML1.0 Strict parsing ⥗ -PASS XHTML1.0 Strict parsing ⇁ -PASS XHTML1.0 Strict parsing ↧ -PASS XHTML1.0 Strict parsing ⊤ -PASS XHTML1.0 Strict parsing ⤐ -PASS XHTML1.0 Strict parsing ⌟ -PASS XHTML1.0 Strict parsing ⌌ -PASS XHTML1.0 Strict parsing 𝒟 -PASS XHTML1.0 Strict parsing 𝒹 -PASS XHTML1.0 Strict parsing Ѕ -PASS XHTML1.0 Strict parsing ѕ -PASS XHTML1.0 Strict parsing ⧶ -PASS XHTML1.0 Strict parsing Đ -PASS XHTML1.0 Strict parsing đ -PASS XHTML1.0 Strict parsing ⋱ -PASS XHTML1.0 Strict parsing ▿ -PASS XHTML1.0 Strict parsing ▾ -PASS XHTML1.0 Strict parsing ⇵ -PASS XHTML1.0 Strict parsing ⥯ -PASS XHTML1.0 Strict parsing ⦦ -PASS XHTML1.0 Strict parsing Џ -PASS XHTML1.0 Strict parsing џ -PASS XHTML1.0 Strict parsing ⟿ -PASS XHTML1.0 Strict parsing É -PASS XHTML1.0 Strict parsing é -PASS XHTML1.0 Strict parsing ⩮ -PASS XHTML1.0 Strict parsing Ě -PASS XHTML1.0 Strict parsing ě -PASS XHTML1.0 Strict parsing Ê -PASS XHTML1.0 Strict parsing ê -PASS XHTML1.0 Strict parsing ≖ -PASS XHTML1.0 Strict parsing ≕ -PASS XHTML1.0 Strict parsing Э -PASS XHTML1.0 Strict parsing э -PASS XHTML1.0 Strict parsing ⩷ -PASS XHTML1.0 Strict parsing Ė -PASS XHTML1.0 Strict parsing ė -PASS XHTML1.0 Strict parsing ≑ -PASS XHTML1.0 Strict parsing ⅇ -PASS XHTML1.0 Strict parsing ≒ -PASS XHTML1.0 Strict parsing 𝔈 -PASS XHTML1.0 Strict parsing 𝔢 -PASS XHTML1.0 Strict parsing ⪚ -PASS XHTML1.0 Strict parsing È -PASS XHTML1.0 Strict parsing è -PASS XHTML1.0 Strict parsing ⪖ -PASS XHTML1.0 Strict parsing ⪘ -PASS XHTML1.0 Strict parsing ⪙ -PASS XHTML1.0 Strict parsing ∈ -PASS XHTML1.0 Strict parsing ⏧ -PASS XHTML1.0 Strict parsing ℓ -PASS XHTML1.0 Strict parsing ⪕ -PASS XHTML1.0 Strict parsing ⪗ -PASS XHTML1.0 Strict parsing Ē -PASS XHTML1.0 Strict parsing ē -PASS XHTML1.0 Strict parsing ∅ -PASS XHTML1.0 Strict parsing ∅ -PASS XHTML1.0 Strict parsing ◻ -PASS XHTML1.0 Strict parsing ∅ -PASS XHTML1.0 Strict parsing ▫ -PASS XHTML1.0 Strict parsing   -PASS XHTML1.0 Strict parsing   -PASS XHTML1.0 Strict parsing   -PASS XHTML1.0 Strict parsing Ŋ -PASS XHTML1.0 Strict parsing ŋ -PASS XHTML1.0 Strict parsing   -PASS XHTML1.0 Strict parsing Ę -PASS XHTML1.0 Strict parsing ę -PASS XHTML1.0 Strict parsing 𝔼 -PASS XHTML1.0 Strict parsing 𝕖 -PASS XHTML1.0 Strict parsing ⋕ -PASS XHTML1.0 Strict parsing ⧣ -PASS XHTML1.0 Strict parsing ⩱ -PASS XHTML1.0 Strict parsing ε -PASS XHTML1.0 Strict parsing Ε -PASS XHTML1.0 Strict parsing ε -PASS XHTML1.0 Strict parsing ϵ -PASS XHTML1.0 Strict parsing ≖ -PASS XHTML1.0 Strict parsing ≕ -PASS XHTML1.0 Strict parsing ≂ -PASS XHTML1.0 Strict parsing ⪖ -PASS XHTML1.0 Strict parsing ⪕ -PASS XHTML1.0 Strict parsing ⩵ -PASS XHTML1.0 Strict parsing = -PASS XHTML1.0 Strict parsing ≂ -PASS XHTML1.0 Strict parsing ≟ -PASS XHTML1.0 Strict parsing ⇌ -PASS XHTML1.0 Strict parsing ≡ -PASS XHTML1.0 Strict parsing ⩸ -PASS XHTML1.0 Strict parsing ⧥ -PASS XHTML1.0 Strict parsing ⥱ -PASS XHTML1.0 Strict parsing ≓ -PASS XHTML1.0 Strict parsing ℯ -PASS XHTML1.0 Strict parsing ℰ -PASS XHTML1.0 Strict parsing ≐ -PASS XHTML1.0 Strict parsing ⩳ -PASS XHTML1.0 Strict parsing ≂ -PASS XHTML1.0 Strict parsing Η -PASS XHTML1.0 Strict parsing η -PASS XHTML1.0 Strict parsing Ð -PASS XHTML1.0 Strict parsing ð -PASS XHTML1.0 Strict parsing Ë -PASS XHTML1.0 Strict parsing ë -PASS XHTML1.0 Strict parsing € -PASS XHTML1.0 Strict parsing ! -PASS XHTML1.0 Strict parsing ∃ -PASS XHTML1.0 Strict parsing ∃ -PASS XHTML1.0 Strict parsing ℰ -PASS XHTML1.0 Strict parsing ⅇ -PASS XHTML1.0 Strict parsing ⅇ -PASS XHTML1.0 Strict parsing ≒ -PASS XHTML1.0 Strict parsing Ф -PASS XHTML1.0 Strict parsing ф -PASS XHTML1.0 Strict parsing ♀ -PASS XHTML1.0 Strict parsing ffi -PASS XHTML1.0 Strict parsing ff -PASS XHTML1.0 Strict parsing ffl -PASS XHTML1.0 Strict parsing 𝔉 -PASS XHTML1.0 Strict parsing 𝔣 -PASS XHTML1.0 Strict parsing fi -PASS XHTML1.0 Strict parsing ◼ -PASS XHTML1.0 Strict parsing ▪ -PASS XHTML1.0 Strict parsing fj -PASS XHTML1.0 Strict parsing ♭ -PASS XHTML1.0 Strict parsing fl -PASS XHTML1.0 Strict parsing ▱ -PASS XHTML1.0 Strict parsing ƒ -PASS XHTML1.0 Strict parsing 𝔽 -PASS XHTML1.0 Strict parsing 𝕗 -PASS XHTML1.0 Strict parsing ∀ -PASS XHTML1.0 Strict parsing ∀ -PASS XHTML1.0 Strict parsing ⋔ -PASS XHTML1.0 Strict parsing ⫙ -PASS XHTML1.0 Strict parsing ℱ -PASS XHTML1.0 Strict parsing ⨍ -PASS XHTML1.0 Strict parsing ½ -PASS XHTML1.0 Strict parsing ⅓ -PASS XHTML1.0 Strict parsing ¼ -PASS XHTML1.0 Strict parsing ⅕ -PASS XHTML1.0 Strict parsing ⅙ -PASS XHTML1.0 Strict parsing ⅛ -PASS XHTML1.0 Strict parsing ⅔ -PASS XHTML1.0 Strict parsing ⅖ -PASS XHTML1.0 Strict parsing ¾ -PASS XHTML1.0 Strict parsing ⅗ -PASS XHTML1.0 Strict parsing ⅜ -PASS XHTML1.0 Strict parsing ⅘ -PASS XHTML1.0 Strict parsing ⅚ -PASS XHTML1.0 Strict parsing ⅝ -PASS XHTML1.0 Strict parsing ⅞ -PASS XHTML1.0 Strict parsing ⁄ -PASS XHTML1.0 Strict parsing ⌢ -PASS XHTML1.0 Strict parsing 𝒻 -PASS XHTML1.0 Strict parsing ℱ -PASS XHTML1.0 Strict parsing ǵ -PASS XHTML1.0 Strict parsing Γ -PASS XHTML1.0 Strict parsing γ -PASS XHTML1.0 Strict parsing Ϝ -PASS XHTML1.0 Strict parsing ϝ -PASS XHTML1.0 Strict parsing ⪆ -PASS XHTML1.0 Strict parsing Ğ -PASS XHTML1.0 Strict parsing ğ -PASS XHTML1.0 Strict parsing Ģ -PASS XHTML1.0 Strict parsing Ĝ -PASS XHTML1.0 Strict parsing ĝ -PASS XHTML1.0 Strict parsing Г -PASS XHTML1.0 Strict parsing г -PASS XHTML1.0 Strict parsing Ġ -PASS XHTML1.0 Strict parsing ġ -PASS XHTML1.0 Strict parsing ≥ -PASS XHTML1.0 Strict parsing ≧ -PASS XHTML1.0 Strict parsing ⪌ -PASS XHTML1.0 Strict parsing ⋛ -PASS XHTML1.0 Strict parsing ≥ -PASS XHTML1.0 Strict parsing ≧ -PASS XHTML1.0 Strict parsing ⩾ -PASS XHTML1.0 Strict parsing ⪩ -PASS XHTML1.0 Strict parsing ⩾ -PASS XHTML1.0 Strict parsing ⪀ -PASS XHTML1.0 Strict parsing ⪂ -PASS XHTML1.0 Strict parsing ⪄ -PASS XHTML1.0 Strict parsing ⋛︀ -PASS XHTML1.0 Strict parsing ⪔ -PASS XHTML1.0 Strict parsing 𝔊 -PASS XHTML1.0 Strict parsing 𝔤 -PASS XHTML1.0 Strict parsing ≫ -PASS XHTML1.0 Strict parsing ⋙ -PASS XHTML1.0 Strict parsing ⋙ -PASS XHTML1.0 Strict parsing ℷ -PASS XHTML1.0 Strict parsing Ѓ -PASS XHTML1.0 Strict parsing ѓ -PASS XHTML1.0 Strict parsing ⪥ -PASS XHTML1.0 Strict parsing ≷ -PASS XHTML1.0 Strict parsing ⪒ -PASS XHTML1.0 Strict parsing ⪤ -PASS XHTML1.0 Strict parsing ⪊ -PASS XHTML1.0 Strict parsing ⪊ -PASS XHTML1.0 Strict parsing ⪈ -PASS XHTML1.0 Strict parsing ≩ -PASS XHTML1.0 Strict parsing ⪈ -PASS XHTML1.0 Strict parsing ≩ -PASS XHTML1.0 Strict parsing ⋧ -PASS XHTML1.0 Strict parsing 𝔾 -PASS XHTML1.0 Strict parsing 𝕘 -PASS XHTML1.0 Strict parsing ` -PASS XHTML1.0 Strict parsing ≥ -PASS XHTML1.0 Strict parsing ⋛ -PASS XHTML1.0 Strict parsing ≧ -PASS XHTML1.0 Strict parsing ⪢ -PASS XHTML1.0 Strict parsing ≷ -PASS XHTML1.0 Strict parsing ⩾ -PASS XHTML1.0 Strict parsing ≳ -PASS XHTML1.0 Strict parsing 𝒢 -PASS XHTML1.0 Strict parsing ℊ -PASS XHTML1.0 Strict parsing ≳ -PASS XHTML1.0 Strict parsing ⪎ -PASS XHTML1.0 Strict parsing ⪐ -PASS XHTML1.0 Strict parsing ⪧ -PASS XHTML1.0 Strict parsing ⩺ -PASS XHTML1.0 Strict parsing > -PASS XHTML1.0 Strict parsing > -PASS XHTML1.0 Strict parsing ≫ -PASS XHTML1.0 Strict parsing ⋗ -PASS XHTML1.0 Strict parsing ⦕ -PASS XHTML1.0 Strict parsing ⩼ -PASS XHTML1.0 Strict parsing ⪆ -PASS XHTML1.0 Strict parsing ⥸ -PASS XHTML1.0 Strict parsing ⋗ -PASS XHTML1.0 Strict parsing ⋛ -PASS XHTML1.0 Strict parsing ⪌ -PASS XHTML1.0 Strict parsing ≷ -PASS XHTML1.0 Strict parsing ≳ -PASS XHTML1.0 Strict parsing ≩︀ -PASS XHTML1.0 Strict parsing ≩︀ -PASS XHTML1.0 Strict parsing ˇ -PASS XHTML1.0 Strict parsing   -PASS XHTML1.0 Strict parsing ½ -PASS XHTML1.0 Strict parsing ℋ -PASS XHTML1.0 Strict parsing Ъ -PASS XHTML1.0 Strict parsing ъ -PASS XHTML1.0 Strict parsing ⥈ -PASS XHTML1.0 Strict parsing ↔ -PASS XHTML1.0 Strict parsing ⇔ -PASS XHTML1.0 Strict parsing ↭ -PASS XHTML1.0 Strict parsing ^ -PASS XHTML1.0 Strict parsing ℏ -PASS XHTML1.0 Strict parsing Ĥ -PASS XHTML1.0 Strict parsing ĥ -PASS XHTML1.0 Strict parsing ♥ -PASS XHTML1.0 Strict parsing ♥ -PASS XHTML1.0 Strict parsing … -PASS XHTML1.0 Strict parsing ⊹ -PASS XHTML1.0 Strict parsing 𝔥 -PASS XHTML1.0 Strict parsing ℌ -PASS XHTML1.0 Strict parsing ℋ -PASS XHTML1.0 Strict parsing ⤥ -PASS XHTML1.0 Strict parsing ⤦ -PASS XHTML1.0 Strict parsing ⇿ -PASS XHTML1.0 Strict parsing ∻ -PASS XHTML1.0 Strict parsing ↩ -PASS XHTML1.0 Strict parsing ↪ -PASS XHTML1.0 Strict parsing 𝕙 -PASS XHTML1.0 Strict parsing ℍ -PASS XHTML1.0 Strict parsing ― -PASS XHTML1.0 Strict parsing ─ -PASS XHTML1.0 Strict parsing 𝒽 -PASS XHTML1.0 Strict parsing ℋ -PASS XHTML1.0 Strict parsing ℏ -PASS XHTML1.0 Strict parsing Ħ -PASS XHTML1.0 Strict parsing ħ -PASS XHTML1.0 Strict parsing ≎ -PASS XHTML1.0 Strict parsing ≏ -PASS XHTML1.0 Strict parsing ⁃ -PASS XHTML1.0 Strict parsing ‐ -PASS XHTML1.0 Strict parsing Í -PASS XHTML1.0 Strict parsing í -PASS XHTML1.0 Strict parsing ⁣ -PASS XHTML1.0 Strict parsing Î -PASS XHTML1.0 Strict parsing î -PASS XHTML1.0 Strict parsing И -PASS XHTML1.0 Strict parsing и -PASS XHTML1.0 Strict parsing İ -PASS XHTML1.0 Strict parsing Е -PASS XHTML1.0 Strict parsing е -PASS XHTML1.0 Strict parsing ¡ -PASS XHTML1.0 Strict parsing ⇔ -PASS XHTML1.0 Strict parsing 𝔦 -PASS XHTML1.0 Strict parsing ℑ -PASS XHTML1.0 Strict parsing Ì -PASS XHTML1.0 Strict parsing ì -PASS XHTML1.0 Strict parsing ⅈ -PASS XHTML1.0 Strict parsing ⨌ -PASS XHTML1.0 Strict parsing ∭ -PASS XHTML1.0 Strict parsing ⧜ -PASS XHTML1.0 Strict parsing ℩ -PASS XHTML1.0 Strict parsing IJ -PASS XHTML1.0 Strict parsing ij -PASS XHTML1.0 Strict parsing Ī -PASS XHTML1.0 Strict parsing ī -PASS XHTML1.0 Strict parsing ℑ -PASS XHTML1.0 Strict parsing ⅈ -PASS XHTML1.0 Strict parsing ℐ -PASS XHTML1.0 Strict parsing ℑ -PASS XHTML1.0 Strict parsing ı -PASS XHTML1.0 Strict parsing ℑ -PASS XHTML1.0 Strict parsing ⊷ -PASS XHTML1.0 Strict parsing Ƶ -PASS XHTML1.0 Strict parsing ⇒ -PASS XHTML1.0 Strict parsing ℅ -PASS XHTML1.0 Strict parsing ∈ -PASS XHTML1.0 Strict parsing ∞ -PASS XHTML1.0 Strict parsing ⧝ -PASS XHTML1.0 Strict parsing ı -PASS XHTML1.0 Strict parsing ⊺ -PASS XHTML1.0 Strict parsing ∫ -PASS XHTML1.0 Strict parsing ∬ -PASS XHTML1.0 Strict parsing ℤ -PASS XHTML1.0 Strict parsing ∫ -PASS XHTML1.0 Strict parsing ⊺ -PASS XHTML1.0 Strict parsing ⋂ -PASS XHTML1.0 Strict parsing ⨗ -PASS XHTML1.0 Strict parsing ⨼ -PASS XHTML1.0 Strict parsing ⁣ -PASS XHTML1.0 Strict parsing ⁢ -PASS XHTML1.0 Strict parsing Ё -PASS XHTML1.0 Strict parsing ё -PASS XHTML1.0 Strict parsing Į -PASS XHTML1.0 Strict parsing į -PASS XHTML1.0 Strict parsing 𝕀 -PASS XHTML1.0 Strict parsing 𝕚 -PASS XHTML1.0 Strict parsing Ι -PASS XHTML1.0 Strict parsing ι -PASS XHTML1.0 Strict parsing ⨼ -PASS XHTML1.0 Strict parsing ¿ -PASS XHTML1.0 Strict parsing 𝒾 -PASS XHTML1.0 Strict parsing ℐ -PASS XHTML1.0 Strict parsing ∈ -PASS XHTML1.0 Strict parsing ⋵ -PASS XHTML1.0 Strict parsing ⋹ -PASS XHTML1.0 Strict parsing ⋴ -PASS XHTML1.0 Strict parsing ⋳ -PASS XHTML1.0 Strict parsing ∈ -PASS XHTML1.0 Strict parsing ⁢ -PASS XHTML1.0 Strict parsing Ĩ -PASS XHTML1.0 Strict parsing ĩ -PASS XHTML1.0 Strict parsing І -PASS XHTML1.0 Strict parsing і -PASS XHTML1.0 Strict parsing Ï -PASS XHTML1.0 Strict parsing ï -PASS XHTML1.0 Strict parsing Ĵ -PASS XHTML1.0 Strict parsing ĵ -PASS XHTML1.0 Strict parsing Й -PASS XHTML1.0 Strict parsing й -PASS XHTML1.0 Strict parsing 𝔍 -PASS XHTML1.0 Strict parsing 𝔧 -PASS XHTML1.0 Strict parsing ȷ -PASS XHTML1.0 Strict parsing 𝕁 -PASS XHTML1.0 Strict parsing 𝕛 -PASS XHTML1.0 Strict parsing 𝒥 -PASS XHTML1.0 Strict parsing 𝒿 -PASS XHTML1.0 Strict parsing Ј -PASS XHTML1.0 Strict parsing ј -PASS XHTML1.0 Strict parsing Є -PASS XHTML1.0 Strict parsing є -PASS XHTML1.0 Strict parsing Κ -PASS XHTML1.0 Strict parsing κ -PASS XHTML1.0 Strict parsing ϰ -PASS XHTML1.0 Strict parsing Ķ -PASS XHTML1.0 Strict parsing ķ -PASS XHTML1.0 Strict parsing К -PASS XHTML1.0 Strict parsing к -PASS XHTML1.0 Strict parsing 𝔎 -PASS XHTML1.0 Strict parsing 𝔨 -PASS XHTML1.0 Strict parsing ĸ -PASS XHTML1.0 Strict parsing Х -PASS XHTML1.0 Strict parsing х -PASS XHTML1.0 Strict parsing Ќ -PASS XHTML1.0 Strict parsing ќ -PASS XHTML1.0 Strict parsing 𝕂 -PASS XHTML1.0 Strict parsing 𝕜 -PASS XHTML1.0 Strict parsing 𝒦 -PASS XHTML1.0 Strict parsing 𝓀 -PASS XHTML1.0 Strict parsing ⇚ -PASS XHTML1.0 Strict parsing Ĺ -PASS XHTML1.0 Strict parsing ĺ -PASS XHTML1.0 Strict parsing ⦴ -PASS XHTML1.0 Strict parsing ℒ -PASS XHTML1.0 Strict parsing Λ -PASS XHTML1.0 Strict parsing λ -PASS XHTML1.0 Strict parsing ⟨ -PASS XHTML1.0 Strict parsing ⟪ -PASS XHTML1.0 Strict parsing ⦑ -PASS XHTML1.0 Strict parsing ⟨ -PASS XHTML1.0 Strict parsing ⪅ -PASS XHTML1.0 Strict parsing ℒ -PASS XHTML1.0 Strict parsing « -PASS XHTML1.0 Strict parsing ⇤ -PASS XHTML1.0 Strict parsing ⤟ -PASS XHTML1.0 Strict parsing ← -PASS XHTML1.0 Strict parsing ↞ -PASS XHTML1.0 Strict parsing ⇐ -PASS XHTML1.0 Strict parsing ⤝ -PASS XHTML1.0 Strict parsing ↩ -PASS XHTML1.0 Strict parsing ↫ -PASS XHTML1.0 Strict parsing ⤹ -PASS XHTML1.0 Strict parsing ⥳ -PASS XHTML1.0 Strict parsing ↢ -PASS XHTML1.0 Strict parsing ⤙ -PASS XHTML1.0 Strict parsing ⤛ -PASS XHTML1.0 Strict parsing ⪫ -PASS XHTML1.0 Strict parsing ⪭ -PASS XHTML1.0 Strict parsing ⪭︀ -PASS XHTML1.0 Strict parsing ⤌ -PASS XHTML1.0 Strict parsing ⤎ -PASS XHTML1.0 Strict parsing ❲ -PASS XHTML1.0 Strict parsing { -PASS XHTML1.0 Strict parsing [ -PASS XHTML1.0 Strict parsing ⦋ -PASS XHTML1.0 Strict parsing ⦏ -PASS XHTML1.0 Strict parsing ⦍ -PASS XHTML1.0 Strict parsing Ľ -PASS XHTML1.0 Strict parsing ľ -PASS XHTML1.0 Strict parsing Ļ -PASS XHTML1.0 Strict parsing ļ -PASS XHTML1.0 Strict parsing ⌈ -PASS XHTML1.0 Strict parsing { -PASS XHTML1.0 Strict parsing Л -PASS XHTML1.0 Strict parsing л -PASS XHTML1.0 Strict parsing ⤶ -PASS XHTML1.0 Strict parsing “ -PASS XHTML1.0 Strict parsing „ -PASS XHTML1.0 Strict parsing ⥧ -PASS XHTML1.0 Strict parsing ⥋ -PASS XHTML1.0 Strict parsing ↲ -PASS XHTML1.0 Strict parsing ≤ -PASS XHTML1.0 Strict parsing ≦ -PASS XHTML1.0 Strict parsing ⟨ -PASS XHTML1.0 Strict parsing ⇤ -PASS XHTML1.0 Strict parsing ← -PASS XHTML1.0 Strict parsing ← -PASS XHTML1.0 Strict parsing ⇐ -PASS XHTML1.0 Strict parsing ⇆ -PASS XHTML1.0 Strict parsing ↢ -PASS XHTML1.0 Strict parsing ⌈ -PASS XHTML1.0 Strict parsing ⟦ -PASS XHTML1.0 Strict parsing ⥡ -PASS XHTML1.0 Strict parsing ⥙ -PASS XHTML1.0 Strict parsing ⇃ -PASS XHTML1.0 Strict parsing ⌊ -PASS XHTML1.0 Strict parsing ↽ -PASS XHTML1.0 Strict parsing ↼ -PASS XHTML1.0 Strict parsing ⇇ -PASS XHTML1.0 Strict parsing ↔ -PASS XHTML1.0 Strict parsing ↔ -PASS XHTML1.0 Strict parsing ⇔ -PASS XHTML1.0 Strict parsing ⇆ -PASS XHTML1.0 Strict parsing ⇋ -PASS XHTML1.0 Strict parsing ↭ -PASS XHTML1.0 Strict parsing ⥎ -PASS XHTML1.0 Strict parsing ↤ -PASS XHTML1.0 Strict parsing ⊣ -PASS XHTML1.0 Strict parsing ⥚ -PASS XHTML1.0 Strict parsing ⋋ -PASS XHTML1.0 Strict parsing ⧏ -PASS XHTML1.0 Strict parsing ⊲ -PASS XHTML1.0 Strict parsing ⊴ -PASS XHTML1.0 Strict parsing ⥑ -PASS XHTML1.0 Strict parsing ⥠ -PASS XHTML1.0 Strict parsing ⥘ -PASS XHTML1.0 Strict parsing ↿ -PASS XHTML1.0 Strict parsing ⥒ -PASS XHTML1.0 Strict parsing ↼ -PASS XHTML1.0 Strict parsing ⪋ -PASS XHTML1.0 Strict parsing ⋚ -PASS XHTML1.0 Strict parsing ≤ -PASS XHTML1.0 Strict parsing ≦ -PASS XHTML1.0 Strict parsing ⩽ -PASS XHTML1.0 Strict parsing ⪨ -PASS XHTML1.0 Strict parsing ⩽ -PASS XHTML1.0 Strict parsing ⩿ -PASS XHTML1.0 Strict parsing ⪁ -PASS XHTML1.0 Strict parsing ⪃ -PASS XHTML1.0 Strict parsing ⋚︀ -PASS XHTML1.0 Strict parsing ⪓ -PASS XHTML1.0 Strict parsing ⪅ -PASS XHTML1.0 Strict parsing ⋖ -PASS XHTML1.0 Strict parsing ⋚ -PASS XHTML1.0 Strict parsing ⪋ -PASS XHTML1.0 Strict parsing ⋚ -PASS XHTML1.0 Strict parsing ≦ -PASS XHTML1.0 Strict parsing ≶ -PASS XHTML1.0 Strict parsing ≶ -PASS XHTML1.0 Strict parsing ⪡ -PASS XHTML1.0 Strict parsing ≲ -PASS XHTML1.0 Strict parsing ⩽ -PASS XHTML1.0 Strict parsing ≲ -PASS XHTML1.0 Strict parsing ⥼ -PASS XHTML1.0 Strict parsing ⌊ -PASS XHTML1.0 Strict parsing 𝔏 -PASS XHTML1.0 Strict parsing 𝔩 -PASS XHTML1.0 Strict parsing ≶ -PASS XHTML1.0 Strict parsing ⪑ -PASS XHTML1.0 Strict parsing ⥢ -PASS XHTML1.0 Strict parsing ↽ -PASS XHTML1.0 Strict parsing ↼ -PASS XHTML1.0 Strict parsing ⥪ -PASS XHTML1.0 Strict parsing ▄ -PASS XHTML1.0 Strict parsing Љ -PASS XHTML1.0 Strict parsing љ -PASS XHTML1.0 Strict parsing ⇇ -PASS XHTML1.0 Strict parsing ≪ -PASS XHTML1.0 Strict parsing ⋘ -PASS XHTML1.0 Strict parsing ⌞ -PASS XHTML1.0 Strict parsing ⇚ -PASS XHTML1.0 Strict parsing ⥫ -PASS XHTML1.0 Strict parsing ◺ -PASS XHTML1.0 Strict parsing Ŀ -PASS XHTML1.0 Strict parsing ŀ -PASS XHTML1.0 Strict parsing ⎰ -PASS XHTML1.0 Strict parsing ⎰ -PASS XHTML1.0 Strict parsing ⪉ -PASS XHTML1.0 Strict parsing ⪉ -PASS XHTML1.0 Strict parsing ⪇ -PASS XHTML1.0 Strict parsing ≨ -PASS XHTML1.0 Strict parsing ⪇ -PASS XHTML1.0 Strict parsing ≨ -PASS XHTML1.0 Strict parsing ⋦ -PASS XHTML1.0 Strict parsing ⟬ -PASS XHTML1.0 Strict parsing ⇽ -PASS XHTML1.0 Strict parsing ⟦ -PASS XHTML1.0 Strict parsing ⟵ -PASS XHTML1.0 Strict parsing ⟵ -PASS XHTML1.0 Strict parsing ⟸ -PASS XHTML1.0 Strict parsing ⟷ -PASS XHTML1.0 Strict parsing ⟷ -PASS XHTML1.0 Strict parsing ⟺ -PASS XHTML1.0 Strict parsing ⟼ -PASS XHTML1.0 Strict parsing ⟶ -PASS XHTML1.0 Strict parsing ⟶ -PASS XHTML1.0 Strict parsing ⟹ -PASS XHTML1.0 Strict parsing ↫ -PASS XHTML1.0 Strict parsing ↬ -PASS XHTML1.0 Strict parsing ⦅ -PASS XHTML1.0 Strict parsing 𝕃 -PASS XHTML1.0 Strict parsing 𝕝 -PASS XHTML1.0 Strict parsing ⨭ -PASS XHTML1.0 Strict parsing ⨴ -PASS XHTML1.0 Strict parsing ∗ -PASS XHTML1.0 Strict parsing _ -PASS XHTML1.0 Strict parsing ↙ -PASS XHTML1.0 Strict parsing ↘ -PASS XHTML1.0 Strict parsing ◊ -PASS XHTML1.0 Strict parsing ◊ -PASS XHTML1.0 Strict parsing ⧫ -PASS XHTML1.0 Strict parsing ( -PASS XHTML1.0 Strict parsing ⦓ -PASS XHTML1.0 Strict parsing ⇆ -PASS XHTML1.0 Strict parsing ⌟ -PASS XHTML1.0 Strict parsing ⇋ -PASS XHTML1.0 Strict parsing ⥭ -PASS XHTML1.0 Strict parsing ‎ -PASS XHTML1.0 Strict parsing ⊿ -PASS XHTML1.0 Strict parsing ‹ -PASS XHTML1.0 Strict parsing 𝓁 -PASS XHTML1.0 Strict parsing ℒ -PASS XHTML1.0 Strict parsing ↰ -PASS XHTML1.0 Strict parsing ↰ -PASS XHTML1.0 Strict parsing ≲ -PASS XHTML1.0 Strict parsing ⪍ -PASS XHTML1.0 Strict parsing ⪏ -PASS XHTML1.0 Strict parsing [ -PASS XHTML1.0 Strict parsing ‘ -PASS XHTML1.0 Strict parsing ‚ -PASS XHTML1.0 Strict parsing Ł -PASS XHTML1.0 Strict parsing ł -PASS XHTML1.0 Strict parsing ⪦ -PASS XHTML1.0 Strict parsing ⩹ -PASS XHTML1.0 Strict parsing < -FAIL XHTML1.0 Strict parsing < assert_true: expected true got false -PASS XHTML1.0 Strict parsing ≪ -PASS XHTML1.0 Strict parsing ⋖ -PASS XHTML1.0 Strict parsing ⋋ -PASS XHTML1.0 Strict parsing ⋉ -PASS XHTML1.0 Strict parsing ⥶ -PASS XHTML1.0 Strict parsing ⩻ -PASS XHTML1.0 Strict parsing ◃ -PASS XHTML1.0 Strict parsing ⊴ -PASS XHTML1.0 Strict parsing ◂ -PASS XHTML1.0 Strict parsing ⦖ -PASS XHTML1.0 Strict parsing ⥊ -PASS XHTML1.0 Strict parsing ⥦ -PASS XHTML1.0 Strict parsing ≨︀ -PASS XHTML1.0 Strict parsing ≨︀ -PASS XHTML1.0 Strict parsing ¯ -PASS XHTML1.0 Strict parsing ♂ -PASS XHTML1.0 Strict parsing ✠ -PASS XHTML1.0 Strict parsing ✠ -PASS XHTML1.0 Strict parsing ⤅ -PASS XHTML1.0 Strict parsing ↦ -PASS XHTML1.0 Strict parsing ↦ -PASS XHTML1.0 Strict parsing ↧ -PASS XHTML1.0 Strict parsing ↤ -PASS XHTML1.0 Strict parsing ↥ -PASS XHTML1.0 Strict parsing ▮ -PASS XHTML1.0 Strict parsing ⨩ -PASS XHTML1.0 Strict parsing М -PASS XHTML1.0 Strict parsing м -PASS XHTML1.0 Strict parsing — -PASS XHTML1.0 Strict parsing ∺ -PASS XHTML1.0 Strict parsing ∡ -PASS XHTML1.0 Strict parsing   -PASS XHTML1.0 Strict parsing ℳ -PASS XHTML1.0 Strict parsing 𝔐 -PASS XHTML1.0 Strict parsing 𝔪 -PASS XHTML1.0 Strict parsing ℧ -PASS XHTML1.0 Strict parsing µ -PASS XHTML1.0 Strict parsing * -PASS XHTML1.0 Strict parsing ⫰ -PASS XHTML1.0 Strict parsing ∣ -PASS XHTML1.0 Strict parsing · -PASS XHTML1.0 Strict parsing ⊟ -PASS XHTML1.0 Strict parsing − -PASS XHTML1.0 Strict parsing ∸ -PASS XHTML1.0 Strict parsing ⨪ -PASS XHTML1.0 Strict parsing ∓ -PASS XHTML1.0 Strict parsing ⫛ -PASS XHTML1.0 Strict parsing … -PASS XHTML1.0 Strict parsing ∓ -PASS XHTML1.0 Strict parsing ⊧ -PASS XHTML1.0 Strict parsing 𝕄 -PASS XHTML1.0 Strict parsing 𝕞 -PASS XHTML1.0 Strict parsing ∓ -PASS XHTML1.0 Strict parsing 𝓂 -PASS XHTML1.0 Strict parsing ℳ -PASS XHTML1.0 Strict parsing ∾ -PASS XHTML1.0 Strict parsing Μ -PASS XHTML1.0 Strict parsing μ -PASS XHTML1.0 Strict parsing ⊸ -PASS XHTML1.0 Strict parsing ⊸ -PASS XHTML1.0 Strict parsing ∇ -PASS XHTML1.0 Strict parsing Ń -PASS XHTML1.0 Strict parsing ń -PASS XHTML1.0 Strict parsing ∠⃒ -PASS XHTML1.0 Strict parsing ≉ -PASS XHTML1.0 Strict parsing ⩰̸ -PASS XHTML1.0 Strict parsing ≋̸ -PASS XHTML1.0 Strict parsing ʼn -PASS XHTML1.0 Strict parsing ≉ -PASS XHTML1.0 Strict parsing ♮ -PASS XHTML1.0 Strict parsing ℕ -PASS XHTML1.0 Strict parsing ♮ -PASS XHTML1.0 Strict parsing -PASS XHTML1.0 Strict parsing ≎̸ -PASS XHTML1.0 Strict parsing ≏̸ -PASS XHTML1.0 Strict parsing ⩃ -PASS XHTML1.0 Strict parsing Ň -PASS XHTML1.0 Strict parsing ň -PASS XHTML1.0 Strict parsing Ņ -PASS XHTML1.0 Strict parsing ņ -PASS XHTML1.0 Strict parsing ≇ -PASS XHTML1.0 Strict parsing ⩭̸ -PASS XHTML1.0 Strict parsing ⩂ -PASS XHTML1.0 Strict parsing Н -PASS XHTML1.0 Strict parsing н -PASS XHTML1.0 Strict parsing – -PASS XHTML1.0 Strict parsing ⤤ -PASS XHTML1.0 Strict parsing ↗ -PASS XHTML1.0 Strict parsing ⇗ -PASS XHTML1.0 Strict parsing ↗ -PASS XHTML1.0 Strict parsing ≠ -PASS XHTML1.0 Strict parsing ≐̸ -PASS XHTML1.0 Strict parsing ​ -PASS XHTML1.0 Strict parsing ​ -PASS XHTML1.0 Strict parsing ​ -PASS XHTML1.0 Strict parsing ​ -PASS XHTML1.0 Strict parsing ≢ -PASS XHTML1.0 Strict parsing ⤨ -PASS XHTML1.0 Strict parsing ≂̸ -PASS XHTML1.0 Strict parsing ≫ -PASS XHTML1.0 Strict parsing ≪ -PASS XHTML1.0 Strict parsing 
 -PASS XHTML1.0 Strict parsing ∄ -PASS XHTML1.0 Strict parsing ∄ -PASS XHTML1.0 Strict parsing 𝔑 -PASS XHTML1.0 Strict parsing 𝔫 -PASS XHTML1.0 Strict parsing ≧̸ -PASS XHTML1.0 Strict parsing ≱ -PASS XHTML1.0 Strict parsing ≱ -PASS XHTML1.0 Strict parsing ≧̸ -PASS XHTML1.0 Strict parsing ⩾̸ -PASS XHTML1.0 Strict parsing ⩾̸ -PASS XHTML1.0 Strict parsing ⋙̸ -PASS XHTML1.0 Strict parsing ≵ -PASS XHTML1.0 Strict parsing ≫⃒ -PASS XHTML1.0 Strict parsing ≯ -PASS XHTML1.0 Strict parsing ≯ -PASS XHTML1.0 Strict parsing ≫̸ -PASS XHTML1.0 Strict parsing ↮ -PASS XHTML1.0 Strict parsing ⇎ -PASS XHTML1.0 Strict parsing ⫲ -PASS XHTML1.0 Strict parsing ∋ -PASS XHTML1.0 Strict parsing ⋼ -PASS XHTML1.0 Strict parsing ⋺ -PASS XHTML1.0 Strict parsing ∋ -PASS XHTML1.0 Strict parsing Њ -PASS XHTML1.0 Strict parsing њ -PASS XHTML1.0 Strict parsing ↚ -PASS XHTML1.0 Strict parsing ⇍ -PASS XHTML1.0 Strict parsing ‥ -PASS XHTML1.0 Strict parsing ≦̸ -PASS XHTML1.0 Strict parsing ≰ -PASS XHTML1.0 Strict parsing ↚ -PASS XHTML1.0 Strict parsing ⇍ -PASS XHTML1.0 Strict parsing ↮ -PASS XHTML1.0 Strict parsing ⇎ -PASS XHTML1.0 Strict parsing ≰ -PASS XHTML1.0 Strict parsing ≦̸ -PASS XHTML1.0 Strict parsing ⩽̸ -PASS XHTML1.0 Strict parsing ⩽̸ -PASS XHTML1.0 Strict parsing ≮ -PASS XHTML1.0 Strict parsing ⋘̸ -PASS XHTML1.0 Strict parsing ≴ -PASS XHTML1.0 Strict parsing ≪⃒ -PASS XHTML1.0 Strict parsing ≮ -PASS XHTML1.0 Strict parsing ⋪ -PASS XHTML1.0 Strict parsing ⋬ -PASS XHTML1.0 Strict parsing ≪̸ -PASS XHTML1.0 Strict parsing ∤ -PASS XHTML1.0 Strict parsing ⁠ -PASS XHTML1.0 Strict parsing   -PASS XHTML1.0 Strict parsing 𝕟 -PASS XHTML1.0 Strict parsing ℕ -PASS XHTML1.0 Strict parsing ⫬ -PASS XHTML1.0 Strict parsing ¬ -PASS XHTML1.0 Strict parsing ≢ -PASS XHTML1.0 Strict parsing ≭ -PASS XHTML1.0 Strict parsing ∦ -PASS XHTML1.0 Strict parsing ∉ -PASS XHTML1.0 Strict parsing ≠ -PASS XHTML1.0 Strict parsing ≂̸ -PASS XHTML1.0 Strict parsing ∄ -PASS XHTML1.0 Strict parsing ≯ -PASS XHTML1.0 Strict parsing ≱ -PASS XHTML1.0 Strict parsing ≧̸ -PASS XHTML1.0 Strict parsing ≫̸ -PASS XHTML1.0 Strict parsing ≹ -PASS XHTML1.0 Strict parsing ⩾̸ -PASS XHTML1.0 Strict parsing ≵ -PASS XHTML1.0 Strict parsing ≎̸ -PASS XHTML1.0 Strict parsing ≏̸ -PASS XHTML1.0 Strict parsing ∉ -PASS XHTML1.0 Strict parsing ⋵̸ -PASS XHTML1.0 Strict parsing ⋹̸ -PASS XHTML1.0 Strict parsing ∉ -PASS XHTML1.0 Strict parsing ⋷ -PASS XHTML1.0 Strict parsing ⋶ -PASS XHTML1.0 Strict parsing ⧏̸ -PASS XHTML1.0 Strict parsing ⋪ -PASS XHTML1.0 Strict parsing ⋬ -PASS XHTML1.0 Strict parsing ≮ -PASS XHTML1.0 Strict parsing ≰ -PASS XHTML1.0 Strict parsing ≸ -PASS XHTML1.0 Strict parsing ≪̸ -PASS XHTML1.0 Strict parsing ⩽̸ -PASS XHTML1.0 Strict parsing ≴ -PASS XHTML1.0 Strict parsing ⪢̸ -PASS XHTML1.0 Strict parsing ⪡̸ -PASS XHTML1.0 Strict parsing ∌ -PASS XHTML1.0 Strict parsing ∌ -PASS XHTML1.0 Strict parsing ⋾ -PASS XHTML1.0 Strict parsing ⋽ -PASS XHTML1.0 Strict parsing ⊀ -PASS XHTML1.0 Strict parsing ⪯̸ -PASS XHTML1.0 Strict parsing ⋠ -PASS XHTML1.0 Strict parsing ∌ -PASS XHTML1.0 Strict parsing ⧐̸ -PASS XHTML1.0 Strict parsing ⋫ -PASS XHTML1.0 Strict parsing ⋭ -PASS XHTML1.0 Strict parsing ⊏̸ -PASS XHTML1.0 Strict parsing ⋢ -PASS XHTML1.0 Strict parsing ⊐̸ -PASS XHTML1.0 Strict parsing ⋣ -PASS XHTML1.0 Strict parsing ⊂⃒ -PASS XHTML1.0 Strict parsing ⊈ -PASS XHTML1.0 Strict parsing ⊁ -PASS XHTML1.0 Strict parsing ⪰̸ -PASS XHTML1.0 Strict parsing ⋡ -PASS XHTML1.0 Strict parsing ≿̸ -PASS XHTML1.0 Strict parsing ⊃⃒ -PASS XHTML1.0 Strict parsing ⊉ -PASS XHTML1.0 Strict parsing ≁ -PASS XHTML1.0 Strict parsing ≄ -PASS XHTML1.0 Strict parsing ≇ -PASS XHTML1.0 Strict parsing ≉ -PASS XHTML1.0 Strict parsing ∤ -PASS XHTML1.0 Strict parsing ∦ -PASS XHTML1.0 Strict parsing ∦ -PASS XHTML1.0 Strict parsing ⫽⃥ -PASS XHTML1.0 Strict parsing ∂̸ -PASS XHTML1.0 Strict parsing ⨔ -PASS XHTML1.0 Strict parsing ⊀ -PASS XHTML1.0 Strict parsing ⋠ -PASS XHTML1.0 Strict parsing ⊀ -PASS XHTML1.0 Strict parsing ⪯̸ -PASS XHTML1.0 Strict parsing ⪯̸ -PASS XHTML1.0 Strict parsing ⤳̸ -PASS XHTML1.0 Strict parsing ↛ -PASS XHTML1.0 Strict parsing ⇏ -PASS XHTML1.0 Strict parsing ↝̸ -PASS XHTML1.0 Strict parsing ↛ -PASS XHTML1.0 Strict parsing ⇏ -PASS XHTML1.0 Strict parsing ⋫ -PASS XHTML1.0 Strict parsing ⋭ -PASS XHTML1.0 Strict parsing ⊁ -PASS XHTML1.0 Strict parsing ⋡ -PASS XHTML1.0 Strict parsing ⪰̸ -PASS XHTML1.0 Strict parsing 𝒩 -PASS XHTML1.0 Strict parsing 𝓃 -PASS XHTML1.0 Strict parsing ∤ -PASS XHTML1.0 Strict parsing ∦ -PASS XHTML1.0 Strict parsing ≁ -PASS XHTML1.0 Strict parsing ≄ -PASS XHTML1.0 Strict parsing ≄ -PASS XHTML1.0 Strict parsing ∤ -PASS XHTML1.0 Strict parsing ∦ -PASS XHTML1.0 Strict parsing ⋢ -PASS XHTML1.0 Strict parsing ⋣ -PASS XHTML1.0 Strict parsing ⊄ -PASS XHTML1.0 Strict parsing ⫅̸ -PASS XHTML1.0 Strict parsing ⊈ -PASS XHTML1.0 Strict parsing ⊂⃒ -PASS XHTML1.0 Strict parsing ⊈ -PASS XHTML1.0 Strict parsing ⫅̸ -PASS XHTML1.0 Strict parsing ⊁ -PASS XHTML1.0 Strict parsing ⪰̸ -PASS XHTML1.0 Strict parsing ⊅ -PASS XHTML1.0 Strict parsing ⫆̸ -PASS XHTML1.0 Strict parsing ⊉ -PASS XHTML1.0 Strict parsing ⊃⃒ -PASS XHTML1.0 Strict parsing ⊉ -PASS XHTML1.0 Strict parsing ⫆̸ -PASS XHTML1.0 Strict parsing ≹ -PASS XHTML1.0 Strict parsing Ñ -PASS XHTML1.0 Strict parsing ñ -PASS XHTML1.0 Strict parsing ≸ -PASS XHTML1.0 Strict parsing ⋪ -PASS XHTML1.0 Strict parsing ⋬ -PASS XHTML1.0 Strict parsing ⋫ -PASS XHTML1.0 Strict parsing ⋭ -PASS XHTML1.0 Strict parsing Ν -PASS XHTML1.0 Strict parsing ν -PASS XHTML1.0 Strict parsing # -PASS XHTML1.0 Strict parsing № -PASS XHTML1.0 Strict parsing   -PASS XHTML1.0 Strict parsing ≍⃒ -PASS XHTML1.0 Strict parsing ⊬ -PASS XHTML1.0 Strict parsing ⊭ -PASS XHTML1.0 Strict parsing ⊮ -PASS XHTML1.0 Strict parsing ⊯ -PASS XHTML1.0 Strict parsing ≥⃒ -PASS XHTML1.0 Strict parsing >⃒ -PASS XHTML1.0 Strict parsing ⤄ -PASS XHTML1.0 Strict parsing ⧞ -PASS XHTML1.0 Strict parsing ⤂ -PASS XHTML1.0 Strict parsing ≤⃒ -FAIL XHTML1.0 Strict parsing <⃒ assert_equals: XHTML1.0 Strict parsing the entity reference caused a parse error; expected 3 but got 1 -PASS XHTML1.0 Strict parsing ⊴⃒ -PASS XHTML1.0 Strict parsing ⤃ -PASS XHTML1.0 Strict parsing ⊵⃒ -PASS XHTML1.0 Strict parsing ∼⃒ -PASS XHTML1.0 Strict parsing ⤣ -PASS XHTML1.0 Strict parsing ↖ -PASS XHTML1.0 Strict parsing ⇖ -PASS XHTML1.0 Strict parsing ↖ -PASS XHTML1.0 Strict parsing ⤧ -PASS XHTML1.0 Strict parsing Ó -PASS XHTML1.0 Strict parsing ó -PASS XHTML1.0 Strict parsing ⊛ -PASS XHTML1.0 Strict parsing Ô -PASS XHTML1.0 Strict parsing ô -PASS XHTML1.0 Strict parsing ⊚ -PASS XHTML1.0 Strict parsing О -PASS XHTML1.0 Strict parsing о -PASS XHTML1.0 Strict parsing ⊝ -PASS XHTML1.0 Strict parsing Ő -PASS XHTML1.0 Strict parsing ő -PASS XHTML1.0 Strict parsing ⨸ -PASS XHTML1.0 Strict parsing ⊙ -PASS XHTML1.0 Strict parsing ⦼ -PASS XHTML1.0 Strict parsing Œ -PASS XHTML1.0 Strict parsing œ -PASS XHTML1.0 Strict parsing ⦿ -PASS XHTML1.0 Strict parsing 𝔒 -PASS XHTML1.0 Strict parsing 𝔬 -PASS XHTML1.0 Strict parsing ˛ -PASS XHTML1.0 Strict parsing Ò -PASS XHTML1.0 Strict parsing ò -PASS XHTML1.0 Strict parsing ⧁ -PASS XHTML1.0 Strict parsing ⦵ -PASS XHTML1.0 Strict parsing Ω -PASS XHTML1.0 Strict parsing ∮ -PASS XHTML1.0 Strict parsing ↺ -PASS XHTML1.0 Strict parsing ⦾ -PASS XHTML1.0 Strict parsing ⦻ -PASS XHTML1.0 Strict parsing ‾ -PASS XHTML1.0 Strict parsing ⧀ -PASS XHTML1.0 Strict parsing Ō -PASS XHTML1.0 Strict parsing ō -PASS XHTML1.0 Strict parsing Ω -PASS XHTML1.0 Strict parsing ω -PASS XHTML1.0 Strict parsing Ο -PASS XHTML1.0 Strict parsing ο -PASS XHTML1.0 Strict parsing ⦶ -PASS XHTML1.0 Strict parsing ⊖ -PASS XHTML1.0 Strict parsing 𝕆 -PASS XHTML1.0 Strict parsing 𝕠 -PASS XHTML1.0 Strict parsing ⦷ -PASS XHTML1.0 Strict parsing “ -PASS XHTML1.0 Strict parsing ‘ -PASS XHTML1.0 Strict parsing ⦹ -PASS XHTML1.0 Strict parsing ⊕ -PASS XHTML1.0 Strict parsing ↻ -PASS XHTML1.0 Strict parsing ⩔ -PASS XHTML1.0 Strict parsing ∨ -PASS XHTML1.0 Strict parsing ⩝ -PASS XHTML1.0 Strict parsing ℴ -PASS XHTML1.0 Strict parsing ℴ -PASS XHTML1.0 Strict parsing ª -PASS XHTML1.0 Strict parsing º -PASS XHTML1.0 Strict parsing ⊶ -PASS XHTML1.0 Strict parsing ⩖ -PASS XHTML1.0 Strict parsing ⩗ -PASS XHTML1.0 Strict parsing ⩛ -PASS XHTML1.0 Strict parsing Ⓢ -PASS XHTML1.0 Strict parsing 𝒪 -PASS XHTML1.0 Strict parsing ℴ -PASS XHTML1.0 Strict parsing Ø -PASS XHTML1.0 Strict parsing ø -PASS XHTML1.0 Strict parsing ⊘ -PASS XHTML1.0 Strict parsing Õ -PASS XHTML1.0 Strict parsing õ -PASS XHTML1.0 Strict parsing ⨶ -PASS XHTML1.0 Strict parsing ⨷ -PASS XHTML1.0 Strict parsing ⊗ -PASS XHTML1.0 Strict parsing Ö -PASS XHTML1.0 Strict parsing ö -PASS XHTML1.0 Strict parsing ⌽ -PASS XHTML1.0 Strict parsing ‾ -PASS XHTML1.0 Strict parsing ⏞ -PASS XHTML1.0 Strict parsing ⎴ -PASS XHTML1.0 Strict parsing ⏜ -PASS XHTML1.0 Strict parsing ¶ -PASS XHTML1.0 Strict parsing ∥ -PASS XHTML1.0 Strict parsing ∥ -PASS XHTML1.0 Strict parsing ⫳ -PASS XHTML1.0 Strict parsing ⫽ -PASS XHTML1.0 Strict parsing ∂ -PASS XHTML1.0 Strict parsing ∂ -PASS XHTML1.0 Strict parsing П -PASS XHTML1.0 Strict parsing п -PASS XHTML1.0 Strict parsing % -PASS XHTML1.0 Strict parsing . -PASS XHTML1.0 Strict parsing ‰ -PASS XHTML1.0 Strict parsing ⊥ -PASS XHTML1.0 Strict parsing ‱ -PASS XHTML1.0 Strict parsing 𝔓 -PASS XHTML1.0 Strict parsing 𝔭 -PASS XHTML1.0 Strict parsing Φ -PASS XHTML1.0 Strict parsing φ -PASS XHTML1.0 Strict parsing ϕ -PASS XHTML1.0 Strict parsing ℳ -PASS XHTML1.0 Strict parsing ☎ -PASS XHTML1.0 Strict parsing Π -PASS XHTML1.0 Strict parsing π -PASS XHTML1.0 Strict parsing ⋔ -PASS XHTML1.0 Strict parsing ϖ -PASS XHTML1.0 Strict parsing ℏ -PASS XHTML1.0 Strict parsing ℎ -PASS XHTML1.0 Strict parsing ℏ -PASS XHTML1.0 Strict parsing ⨣ -PASS XHTML1.0 Strict parsing ⊞ -PASS XHTML1.0 Strict parsing ⨢ -PASS XHTML1.0 Strict parsing + -PASS XHTML1.0 Strict parsing ∔ -PASS XHTML1.0 Strict parsing ⨥ -PASS XHTML1.0 Strict parsing ⩲ -PASS XHTML1.0 Strict parsing ± -PASS XHTML1.0 Strict parsing ± -PASS XHTML1.0 Strict parsing ⨦ -PASS XHTML1.0 Strict parsing ⨧ -PASS XHTML1.0 Strict parsing ± -PASS XHTML1.0 Strict parsing ℌ -PASS XHTML1.0 Strict parsing ⨕ -PASS XHTML1.0 Strict parsing 𝕡 -PASS XHTML1.0 Strict parsing ℙ -PASS XHTML1.0 Strict parsing £ -PASS XHTML1.0 Strict parsing ⪷ -PASS XHTML1.0 Strict parsing ⪻ -PASS XHTML1.0 Strict parsing ≺ -PASS XHTML1.0 Strict parsing ≼ -PASS XHTML1.0 Strict parsing ⪷ -PASS XHTML1.0 Strict parsing ≺ -PASS XHTML1.0 Strict parsing ≼ -PASS XHTML1.0 Strict parsing ≺ -PASS XHTML1.0 Strict parsing ⪯ -PASS XHTML1.0 Strict parsing ≼ -PASS XHTML1.0 Strict parsing ≾ -PASS XHTML1.0 Strict parsing ⪯ -PASS XHTML1.0 Strict parsing ⪹ -PASS XHTML1.0 Strict parsing ⪵ -PASS XHTML1.0 Strict parsing ⋨ -PASS XHTML1.0 Strict parsing ⪯ -PASS XHTML1.0 Strict parsing ⪳ -PASS XHTML1.0 Strict parsing ≾ -PASS XHTML1.0 Strict parsing ′ -PASS XHTML1.0 Strict parsing ″ -PASS XHTML1.0 Strict parsing ℙ -PASS XHTML1.0 Strict parsing ⪹ -PASS XHTML1.0 Strict parsing ⪵ -PASS XHTML1.0 Strict parsing ⋨ -PASS XHTML1.0 Strict parsing ∏ -PASS XHTML1.0 Strict parsing ∏ -PASS XHTML1.0 Strict parsing ⌮ -PASS XHTML1.0 Strict parsing ⌒ -PASS XHTML1.0 Strict parsing ⌓ -PASS XHTML1.0 Strict parsing ∝ -PASS XHTML1.0 Strict parsing ∝ -PASS XHTML1.0 Strict parsing ∷ -PASS XHTML1.0 Strict parsing ∝ -PASS XHTML1.0 Strict parsing ≾ -PASS XHTML1.0 Strict parsing ⊰ -PASS XHTML1.0 Strict parsing 𝒫 -PASS XHTML1.0 Strict parsing 𝓅 -PASS XHTML1.0 Strict parsing Ψ -PASS XHTML1.0 Strict parsing ψ -PASS XHTML1.0 Strict parsing   -PASS XHTML1.0 Strict parsing 𝔔 -PASS XHTML1.0 Strict parsing 𝔮 -PASS XHTML1.0 Strict parsing ⨌ -PASS XHTML1.0 Strict parsing 𝕢 -PASS XHTML1.0 Strict parsing ℚ -PASS XHTML1.0 Strict parsing ⁗ -PASS XHTML1.0 Strict parsing 𝒬 -PASS XHTML1.0 Strict parsing 𝓆 -PASS XHTML1.0 Strict parsing ℍ -PASS XHTML1.0 Strict parsing ⨖ -PASS XHTML1.0 Strict parsing ? -PASS XHTML1.0 Strict parsing ≟ -PASS XHTML1.0 Strict parsing " -PASS XHTML1.0 Strict parsing " -PASS XHTML1.0 Strict parsing ⇛ -PASS XHTML1.0 Strict parsing ∽̱ -PASS XHTML1.0 Strict parsing Ŕ -PASS XHTML1.0 Strict parsing ŕ -PASS XHTML1.0 Strict parsing √ -PASS XHTML1.0 Strict parsing ⦳ -PASS XHTML1.0 Strict parsing ⟩ -PASS XHTML1.0 Strict parsing ⟫ -PASS XHTML1.0 Strict parsing ⦒ -PASS XHTML1.0 Strict parsing ⦥ -PASS XHTML1.0 Strict parsing ⟩ -PASS XHTML1.0 Strict parsing » -PASS XHTML1.0 Strict parsing ⥵ -PASS XHTML1.0 Strict parsing ⇥ -PASS XHTML1.0 Strict parsing ⤠ -PASS XHTML1.0 Strict parsing ⤳ -PASS XHTML1.0 Strict parsing → -PASS XHTML1.0 Strict parsing ↠ -PASS XHTML1.0 Strict parsing ⇒ -PASS XHTML1.0 Strict parsing ⤞ -PASS XHTML1.0 Strict parsing ↪ -PASS XHTML1.0 Strict parsing ↬ -PASS XHTML1.0 Strict parsing ⥅ -PASS XHTML1.0 Strict parsing ⥴ -PASS XHTML1.0 Strict parsing ⤖ -PASS XHTML1.0 Strict parsing ↣ -PASS XHTML1.0 Strict parsing ↝ -PASS XHTML1.0 Strict parsing ⤚ -PASS XHTML1.0 Strict parsing ⤜ -PASS XHTML1.0 Strict parsing ∶ -PASS XHTML1.0 Strict parsing ℚ -PASS XHTML1.0 Strict parsing ⤍ -PASS XHTML1.0 Strict parsing ⤏ -PASS XHTML1.0 Strict parsing ⤐ -PASS XHTML1.0 Strict parsing ❳ -PASS XHTML1.0 Strict parsing } -PASS XHTML1.0 Strict parsing ] -PASS XHTML1.0 Strict parsing ⦌ -PASS XHTML1.0 Strict parsing ⦎ -PASS XHTML1.0 Strict parsing ⦐ -PASS XHTML1.0 Strict parsing Ř -PASS XHTML1.0 Strict parsing ř -PASS XHTML1.0 Strict parsing Ŗ -PASS XHTML1.0 Strict parsing ŗ -PASS XHTML1.0 Strict parsing ⌉ -PASS XHTML1.0 Strict parsing } -PASS XHTML1.0 Strict parsing Р -PASS XHTML1.0 Strict parsing р -PASS XHTML1.0 Strict parsing ⤷ -PASS XHTML1.0 Strict parsing ⥩ -PASS XHTML1.0 Strict parsing ” -PASS XHTML1.0 Strict parsing ” -PASS XHTML1.0 Strict parsing ↳ -PASS XHTML1.0 Strict parsing ℜ -PASS XHTML1.0 Strict parsing ℛ -PASS XHTML1.0 Strict parsing ℜ -PASS XHTML1.0 Strict parsing ℝ -PASS XHTML1.0 Strict parsing ℜ -PASS XHTML1.0 Strict parsing ▭ -PASS XHTML1.0 Strict parsing ® -PASS XHTML1.0 Strict parsing ® -PASS XHTML1.0 Strict parsing ∋ -PASS XHTML1.0 Strict parsing ⇋ -PASS XHTML1.0 Strict parsing ⥯ -PASS XHTML1.0 Strict parsing ⥽ -PASS XHTML1.0 Strict parsing ⌋ -PASS XHTML1.0 Strict parsing 𝔯 -PASS XHTML1.0 Strict parsing ℜ -PASS XHTML1.0 Strict parsing ⥤ -PASS XHTML1.0 Strict parsing ⇁ -PASS XHTML1.0 Strict parsing ⇀ -PASS XHTML1.0 Strict parsing ⥬ -PASS XHTML1.0 Strict parsing Ρ -PASS XHTML1.0 Strict parsing ρ -PASS XHTML1.0 Strict parsing ϱ -PASS XHTML1.0 Strict parsing ⟩ -PASS XHTML1.0 Strict parsing ⇥ -PASS XHTML1.0 Strict parsing → -PASS XHTML1.0 Strict parsing → -PASS XHTML1.0 Strict parsing ⇒ -PASS XHTML1.0 Strict parsing ⇄ -PASS XHTML1.0 Strict parsing ↣ -PASS XHTML1.0 Strict parsing ⌉ -PASS XHTML1.0 Strict parsing ⟧ -PASS XHTML1.0 Strict parsing ⥝ -PASS XHTML1.0 Strict parsing ⥕ -PASS XHTML1.0 Strict parsing ⇂ -PASS XHTML1.0 Strict parsing ⌋ -PASS XHTML1.0 Strict parsing ⇁ -PASS XHTML1.0 Strict parsing ⇀ -PASS XHTML1.0 Strict parsing ⇄ -PASS XHTML1.0 Strict parsing ⇌ -PASS XHTML1.0 Strict parsing ⇉ -PASS XHTML1.0 Strict parsing ↝ -PASS XHTML1.0 Strict parsing ↦ -PASS XHTML1.0 Strict parsing ⊢ -PASS XHTML1.0 Strict parsing ⥛ -PASS XHTML1.0 Strict parsing ⋌ -PASS XHTML1.0 Strict parsing ⧐ -PASS XHTML1.0 Strict parsing ⊳ -PASS XHTML1.0 Strict parsing ⊵ -PASS XHTML1.0 Strict parsing ⥏ -PASS XHTML1.0 Strict parsing ⥜ -PASS XHTML1.0 Strict parsing ⥔ -PASS XHTML1.0 Strict parsing ↾ -PASS XHTML1.0 Strict parsing ⥓ -PASS XHTML1.0 Strict parsing ⇀ -PASS XHTML1.0 Strict parsing ˚ -PASS XHTML1.0 Strict parsing ≓ -PASS XHTML1.0 Strict parsing ⇄ -PASS XHTML1.0 Strict parsing ⇌ -PASS XHTML1.0 Strict parsing ‏ -PASS XHTML1.0 Strict parsing ⎱ -PASS XHTML1.0 Strict parsing ⎱ -PASS XHTML1.0 Strict parsing ⫮ -PASS XHTML1.0 Strict parsing ⟭ -PASS XHTML1.0 Strict parsing ⇾ -PASS XHTML1.0 Strict parsing ⟧ -PASS XHTML1.0 Strict parsing ⦆ -PASS XHTML1.0 Strict parsing 𝕣 -PASS XHTML1.0 Strict parsing ℝ -PASS XHTML1.0 Strict parsing ⨮ -PASS XHTML1.0 Strict parsing ⨵ -PASS XHTML1.0 Strict parsing ⥰ -PASS XHTML1.0 Strict parsing ) -PASS XHTML1.0 Strict parsing ⦔ -PASS XHTML1.0 Strict parsing ⨒ -PASS XHTML1.0 Strict parsing ⇉ -PASS XHTML1.0 Strict parsing ⇛ -PASS XHTML1.0 Strict parsing › -PASS XHTML1.0 Strict parsing 𝓇 -PASS XHTML1.0 Strict parsing ℛ -PASS XHTML1.0 Strict parsing ↱ -PASS XHTML1.0 Strict parsing ↱ -PASS XHTML1.0 Strict parsing ] -PASS XHTML1.0 Strict parsing ’ -PASS XHTML1.0 Strict parsing ’ -PASS XHTML1.0 Strict parsing ⋌ -PASS XHTML1.0 Strict parsing ⋊ -PASS XHTML1.0 Strict parsing ▹ -PASS XHTML1.0 Strict parsing ⊵ -PASS XHTML1.0 Strict parsing ▸ -PASS XHTML1.0 Strict parsing ⧎ -PASS XHTML1.0 Strict parsing ⧴ -PASS XHTML1.0 Strict parsing ⥨ -PASS XHTML1.0 Strict parsing ℞ -PASS XHTML1.0 Strict parsing Ś -PASS XHTML1.0 Strict parsing ś -PASS XHTML1.0 Strict parsing ‚ -PASS XHTML1.0 Strict parsing ⪸ -PASS XHTML1.0 Strict parsing Š -PASS XHTML1.0 Strict parsing š -PASS XHTML1.0 Strict parsing ⪼ -PASS XHTML1.0 Strict parsing ≻ -PASS XHTML1.0 Strict parsing ≽ -PASS XHTML1.0 Strict parsing ⪰ -PASS XHTML1.0 Strict parsing ⪴ -PASS XHTML1.0 Strict parsing Ş -PASS XHTML1.0 Strict parsing ş -PASS XHTML1.0 Strict parsing Ŝ -PASS XHTML1.0 Strict parsing ŝ -PASS XHTML1.0 Strict parsing ⪺ -PASS XHTML1.0 Strict parsing ⪶ -PASS XHTML1.0 Strict parsing ⋩ -PASS XHTML1.0 Strict parsing ⨓ -PASS XHTML1.0 Strict parsing ≿ -PASS XHTML1.0 Strict parsing С -PASS XHTML1.0 Strict parsing с -PASS XHTML1.0 Strict parsing ⊡ -PASS XHTML1.0 Strict parsing ⋅ -PASS XHTML1.0 Strict parsing ⩦ -PASS XHTML1.0 Strict parsing ⤥ -PASS XHTML1.0 Strict parsing ↘ -PASS XHTML1.0 Strict parsing ⇘ -PASS XHTML1.0 Strict parsing ↘ -PASS XHTML1.0 Strict parsing § -PASS XHTML1.0 Strict parsing ; -PASS XHTML1.0 Strict parsing ⤩ -PASS XHTML1.0 Strict parsing ∖ -PASS XHTML1.0 Strict parsing ∖ -PASS XHTML1.0 Strict parsing ✶ -PASS XHTML1.0 Strict parsing 𝔖 -PASS XHTML1.0 Strict parsing 𝔰 -PASS XHTML1.0 Strict parsing ⌢ -PASS XHTML1.0 Strict parsing ♯ -PASS XHTML1.0 Strict parsing Щ -PASS XHTML1.0 Strict parsing щ -PASS XHTML1.0 Strict parsing Ш -PASS XHTML1.0 Strict parsing ш -PASS XHTML1.0 Strict parsing ↓ -PASS XHTML1.0 Strict parsing ← -PASS XHTML1.0 Strict parsing ∣ -PASS XHTML1.0 Strict parsing ∥ -PASS XHTML1.0 Strict parsing → -PASS XHTML1.0 Strict parsing ↑ -PASS XHTML1.0 Strict parsing ­ -PASS XHTML1.0 Strict parsing Σ -PASS XHTML1.0 Strict parsing σ -PASS XHTML1.0 Strict parsing ς -PASS XHTML1.0 Strict parsing ς -PASS XHTML1.0 Strict parsing ∼ -PASS XHTML1.0 Strict parsing ⩪ -PASS XHTML1.0 Strict parsing ≃ -PASS XHTML1.0 Strict parsing ≃ -PASS XHTML1.0 Strict parsing ⪞ -PASS XHTML1.0 Strict parsing ⪠ -PASS XHTML1.0 Strict parsing ⪝ -PASS XHTML1.0 Strict parsing ⪟ -PASS XHTML1.0 Strict parsing ≆ -PASS XHTML1.0 Strict parsing ⨤ -PASS XHTML1.0 Strict parsing ⥲ -PASS XHTML1.0 Strict parsing ← -PASS XHTML1.0 Strict parsing ∘ -PASS XHTML1.0 Strict parsing ∖ -PASS XHTML1.0 Strict parsing ⨳ -PASS XHTML1.0 Strict parsing ⧤ -PASS XHTML1.0 Strict parsing ∣ -PASS XHTML1.0 Strict parsing ⌣ -PASS XHTML1.0 Strict parsing ⪪ -PASS XHTML1.0 Strict parsing ⪬ -PASS XHTML1.0 Strict parsing ⪬︀ -PASS XHTML1.0 Strict parsing Ь -PASS XHTML1.0 Strict parsing ь -PASS XHTML1.0 Strict parsing ⌿ -PASS XHTML1.0 Strict parsing ⧄ -PASS XHTML1.0 Strict parsing / -PASS XHTML1.0 Strict parsing 𝕊 -PASS XHTML1.0 Strict parsing 𝕤 -PASS XHTML1.0 Strict parsing ♠ -PASS XHTML1.0 Strict parsing ♠ -PASS XHTML1.0 Strict parsing ∥ -PASS XHTML1.0 Strict parsing ⊓ -PASS XHTML1.0 Strict parsing ⊓︀ -PASS XHTML1.0 Strict parsing ⊔ -PASS XHTML1.0 Strict parsing ⊔︀ -PASS XHTML1.0 Strict parsing √ -PASS XHTML1.0 Strict parsing ⊏ -PASS XHTML1.0 Strict parsing ⊑ -PASS XHTML1.0 Strict parsing ⊏ -PASS XHTML1.0 Strict parsing ⊑ -PASS XHTML1.0 Strict parsing ⊐ -PASS XHTML1.0 Strict parsing ⊒ -PASS XHTML1.0 Strict parsing ⊐ -PASS XHTML1.0 Strict parsing ⊒ -PASS XHTML1.0 Strict parsing □ -PASS XHTML1.0 Strict parsing □ -PASS XHTML1.0 Strict parsing ⊓ -PASS XHTML1.0 Strict parsing ⊏ -PASS XHTML1.0 Strict parsing ⊑ -PASS XHTML1.0 Strict parsing ⊐ -PASS XHTML1.0 Strict parsing ⊒ -PASS XHTML1.0 Strict parsing ⊔ -PASS XHTML1.0 Strict parsing ▪ -PASS XHTML1.0 Strict parsing □ -PASS XHTML1.0 Strict parsing ▪ -PASS XHTML1.0 Strict parsing → -PASS XHTML1.0 Strict parsing 𝒮 -PASS XHTML1.0 Strict parsing 𝓈 -PASS XHTML1.0 Strict parsing ∖ -PASS XHTML1.0 Strict parsing ⌣ -PASS XHTML1.0 Strict parsing ⋆ -PASS XHTML1.0 Strict parsing ⋆ -PASS XHTML1.0 Strict parsing ☆ -PASS XHTML1.0 Strict parsing ★ -PASS XHTML1.0 Strict parsing ϵ -PASS XHTML1.0 Strict parsing ϕ -PASS XHTML1.0 Strict parsing ¯ -PASS XHTML1.0 Strict parsing ⊂ -PASS XHTML1.0 Strict parsing ⋐ -PASS XHTML1.0 Strict parsing ⪽ -PASS XHTML1.0 Strict parsing ⫅ -PASS XHTML1.0 Strict parsing ⊆ -PASS XHTML1.0 Strict parsing ⫃ -PASS XHTML1.0 Strict parsing ⫁ -PASS XHTML1.0 Strict parsing ⫋ -PASS XHTML1.0 Strict parsing ⊊ -PASS XHTML1.0 Strict parsing ⪿ -PASS XHTML1.0 Strict parsing ⥹ -PASS XHTML1.0 Strict parsing ⊂ -PASS XHTML1.0 Strict parsing ⋐ -PASS XHTML1.0 Strict parsing ⊆ -PASS XHTML1.0 Strict parsing ⫅ -PASS XHTML1.0 Strict parsing ⊆ -PASS XHTML1.0 Strict parsing ⊊ -PASS XHTML1.0 Strict parsing ⫋ -PASS XHTML1.0 Strict parsing ⫇ -PASS XHTML1.0 Strict parsing ⫕ -PASS XHTML1.0 Strict parsing ⫓ -PASS XHTML1.0 Strict parsing ⪸ -PASS XHTML1.0 Strict parsing ≻ -PASS XHTML1.0 Strict parsing ≽ -PASS XHTML1.0 Strict parsing ≻ -PASS XHTML1.0 Strict parsing ⪰ -PASS XHTML1.0 Strict parsing ≽ -PASS XHTML1.0 Strict parsing ≿ -PASS XHTML1.0 Strict parsing ⪰ -PASS XHTML1.0 Strict parsing ⪺ -PASS XHTML1.0 Strict parsing ⪶ -PASS XHTML1.0 Strict parsing ⋩ -PASS XHTML1.0 Strict parsing ≿ -PASS XHTML1.0 Strict parsing ∋ -PASS XHTML1.0 Strict parsing ∑ -PASS XHTML1.0 Strict parsing ∑ -PASS XHTML1.0 Strict parsing ♪ -PASS XHTML1.0 Strict parsing ¹ -PASS XHTML1.0 Strict parsing ² -PASS XHTML1.0 Strict parsing ³ -PASS XHTML1.0 Strict parsing ⊃ -PASS XHTML1.0 Strict parsing ⋑ -PASS XHTML1.0 Strict parsing ⪾ -PASS XHTML1.0 Strict parsing ⫘ -PASS XHTML1.0 Strict parsing ⫆ -PASS XHTML1.0 Strict parsing ⊇ -PASS XHTML1.0 Strict parsing ⫄ -PASS XHTML1.0 Strict parsing ⊃ -PASS XHTML1.0 Strict parsing ⊇ -PASS XHTML1.0 Strict parsing ⟉ -PASS XHTML1.0 Strict parsing ⫗ -PASS XHTML1.0 Strict parsing ⥻ -PASS XHTML1.0 Strict parsing ⫂ -PASS XHTML1.0 Strict parsing ⫌ -PASS XHTML1.0 Strict parsing ⊋ -PASS XHTML1.0 Strict parsing ⫀ -PASS XHTML1.0 Strict parsing ⊃ -PASS XHTML1.0 Strict parsing ⋑ -PASS XHTML1.0 Strict parsing ⊇ -PASS XHTML1.0 Strict parsing ⫆ -PASS XHTML1.0 Strict parsing ⊋ -PASS XHTML1.0 Strict parsing ⫌ -PASS XHTML1.0 Strict parsing ⫈ -PASS XHTML1.0 Strict parsing ⫔ -PASS XHTML1.0 Strict parsing ⫖ -PASS XHTML1.0 Strict parsing ⤦ -PASS XHTML1.0 Strict parsing ↙ -PASS XHTML1.0 Strict parsing ⇙ -PASS XHTML1.0 Strict parsing ↙ -PASS XHTML1.0 Strict parsing ⤪ -PASS XHTML1.0 Strict parsing ß -PASS XHTML1.0 Strict parsing 	 -PASS XHTML1.0 Strict parsing ⌖ -PASS XHTML1.0 Strict parsing Τ -PASS XHTML1.0 Strict parsing τ -PASS XHTML1.0 Strict parsing ⎴ -PASS XHTML1.0 Strict parsing Ť -PASS XHTML1.0 Strict parsing ť -PASS XHTML1.0 Strict parsing Ţ -PASS XHTML1.0 Strict parsing ţ -PASS XHTML1.0 Strict parsing Т -PASS XHTML1.0 Strict parsing т -PASS XHTML1.0 Strict parsing ⃛ -PASS XHTML1.0 Strict parsing ⌕ -PASS XHTML1.0 Strict parsing 𝔗 -PASS XHTML1.0 Strict parsing 𝔱 -PASS XHTML1.0 Strict parsing ∴ -PASS XHTML1.0 Strict parsing ∴ -PASS XHTML1.0 Strict parsing ∴ -PASS XHTML1.0 Strict parsing Θ -PASS XHTML1.0 Strict parsing θ -PASS XHTML1.0 Strict parsing ϑ -PASS XHTML1.0 Strict parsing ϑ -PASS XHTML1.0 Strict parsing ≈ -PASS XHTML1.0 Strict parsing ∼ -PASS XHTML1.0 Strict parsing    -PASS XHTML1.0 Strict parsing   -PASS XHTML1.0 Strict parsing   -PASS XHTML1.0 Strict parsing ≈ -PASS XHTML1.0 Strict parsing ∼ -PASS XHTML1.0 Strict parsing Þ -PASS XHTML1.0 Strict parsing þ -PASS XHTML1.0 Strict parsing ˜ -PASS XHTML1.0 Strict parsing ∼ -PASS XHTML1.0 Strict parsing ≃ -PASS XHTML1.0 Strict parsing ≅ -PASS XHTML1.0 Strict parsing ≈ -PASS XHTML1.0 Strict parsing ⨱ -PASS XHTML1.0 Strict parsing ⊠ -PASS XHTML1.0 Strict parsing × -PASS XHTML1.0 Strict parsing ⨰ -PASS XHTML1.0 Strict parsing ∭ -PASS XHTML1.0 Strict parsing ⤨ -PASS XHTML1.0 Strict parsing ⌶ -PASS XHTML1.0 Strict parsing ⫱ -PASS XHTML1.0 Strict parsing ⊤ -PASS XHTML1.0 Strict parsing 𝕋 -PASS XHTML1.0 Strict parsing 𝕥 -PASS XHTML1.0 Strict parsing ⫚ -PASS XHTML1.0 Strict parsing ⤩ -PASS XHTML1.0 Strict parsing ‴ -PASS XHTML1.0 Strict parsing ™ -PASS XHTML1.0 Strict parsing ™ -PASS XHTML1.0 Strict parsing ▵ -PASS XHTML1.0 Strict parsing ▿ -PASS XHTML1.0 Strict parsing ◃ -PASS XHTML1.0 Strict parsing ⊴ -PASS XHTML1.0 Strict parsing ≜ -PASS XHTML1.0 Strict parsing ▹ -PASS XHTML1.0 Strict parsing ⊵ -PASS XHTML1.0 Strict parsing ◬ -PASS XHTML1.0 Strict parsing ≜ -PASS XHTML1.0 Strict parsing ⨺ -PASS XHTML1.0 Strict parsing ⃛ -PASS XHTML1.0 Strict parsing ⨹ -PASS XHTML1.0 Strict parsing ⧍ -PASS XHTML1.0 Strict parsing ⨻ -PASS XHTML1.0 Strict parsing ⏢ -PASS XHTML1.0 Strict parsing 𝒯 -PASS XHTML1.0 Strict parsing 𝓉 -PASS XHTML1.0 Strict parsing Ц -PASS XHTML1.0 Strict parsing ц -PASS XHTML1.0 Strict parsing Ћ -PASS XHTML1.0 Strict parsing ћ -PASS XHTML1.0 Strict parsing Ŧ -PASS XHTML1.0 Strict parsing ŧ -PASS XHTML1.0 Strict parsing ≬ -PASS XHTML1.0 Strict parsing ↞ -PASS XHTML1.0 Strict parsing ↠ -PASS XHTML1.0 Strict parsing Ú -PASS XHTML1.0 Strict parsing ú -PASS XHTML1.0 Strict parsing ↑ -PASS XHTML1.0 Strict parsing ↟ -PASS XHTML1.0 Strict parsing ⇑ -PASS XHTML1.0 Strict parsing ⥉ -PASS XHTML1.0 Strict parsing Ў -PASS XHTML1.0 Strict parsing ў -PASS XHTML1.0 Strict parsing Ŭ -PASS XHTML1.0 Strict parsing ŭ -PASS XHTML1.0 Strict parsing Û -PASS XHTML1.0 Strict parsing û -PASS XHTML1.0 Strict parsing У -PASS XHTML1.0 Strict parsing у -PASS XHTML1.0 Strict parsing ⇅ -PASS XHTML1.0 Strict parsing Ű -PASS XHTML1.0 Strict parsing ű -PASS XHTML1.0 Strict parsing ⥮ -PASS XHTML1.0 Strict parsing ⥾ -PASS XHTML1.0 Strict parsing 𝔘 -PASS XHTML1.0 Strict parsing 𝔲 -PASS XHTML1.0 Strict parsing Ù -PASS XHTML1.0 Strict parsing ù -PASS XHTML1.0 Strict parsing ⥣ -PASS XHTML1.0 Strict parsing ↿ -PASS XHTML1.0 Strict parsing ↾ -PASS XHTML1.0 Strict parsing ▀ -PASS XHTML1.0 Strict parsing ⌜ -PASS XHTML1.0 Strict parsing ⌜ -PASS XHTML1.0 Strict parsing ⌏ -PASS XHTML1.0 Strict parsing ◸ -PASS XHTML1.0 Strict parsing Ū -PASS XHTML1.0 Strict parsing ū -PASS XHTML1.0 Strict parsing ¨ -PASS XHTML1.0 Strict parsing _ -PASS XHTML1.0 Strict parsing ⏟ -PASS XHTML1.0 Strict parsing ⎵ -PASS XHTML1.0 Strict parsing ⏝ -PASS XHTML1.0 Strict parsing ⋃ -PASS XHTML1.0 Strict parsing ⊎ -PASS XHTML1.0 Strict parsing Ų -PASS XHTML1.0 Strict parsing ų -PASS XHTML1.0 Strict parsing 𝕌 -PASS XHTML1.0 Strict parsing 𝕦 -PASS XHTML1.0 Strict parsing ⤒ -PASS XHTML1.0 Strict parsing ↑ -PASS XHTML1.0 Strict parsing ↑ -PASS XHTML1.0 Strict parsing ⇑ -PASS XHTML1.0 Strict parsing ⇅ -PASS XHTML1.0 Strict parsing ↕ -PASS XHTML1.0 Strict parsing ↕ -PASS XHTML1.0 Strict parsing ⇕ -PASS XHTML1.0 Strict parsing ⥮ -PASS XHTML1.0 Strict parsing ↿ -PASS XHTML1.0 Strict parsing ↾ -PASS XHTML1.0 Strict parsing ⊎ -PASS XHTML1.0 Strict parsing ↖ -PASS XHTML1.0 Strict parsing ↗ -PASS XHTML1.0 Strict parsing υ -PASS XHTML1.0 Strict parsing ϒ -PASS XHTML1.0 Strict parsing ϒ -PASS XHTML1.0 Strict parsing Υ -PASS XHTML1.0 Strict parsing υ -PASS XHTML1.0 Strict parsing ↥ -PASS XHTML1.0 Strict parsing ⊥ -PASS XHTML1.0 Strict parsing ⇈ -PASS XHTML1.0 Strict parsing ⌝ -PASS XHTML1.0 Strict parsing ⌝ -PASS XHTML1.0 Strict parsing ⌎ -PASS XHTML1.0 Strict parsing Ů -PASS XHTML1.0 Strict parsing ů -PASS XHTML1.0 Strict parsing ◹ -PASS XHTML1.0 Strict parsing 𝒰 -PASS XHTML1.0 Strict parsing 𝓊 -PASS XHTML1.0 Strict parsing ⋰ -PASS XHTML1.0 Strict parsing Ũ -PASS XHTML1.0 Strict parsing ũ -PASS XHTML1.0 Strict parsing ▵ -PASS XHTML1.0 Strict parsing ▴ -PASS XHTML1.0 Strict parsing ⇈ -PASS XHTML1.0 Strict parsing Ü -PASS XHTML1.0 Strict parsing ü -PASS XHTML1.0 Strict parsing ⦧ -PASS XHTML1.0 Strict parsing ⦜ -PASS XHTML1.0 Strict parsing ϵ -PASS XHTML1.0 Strict parsing ϰ -PASS XHTML1.0 Strict parsing ∅ -PASS XHTML1.0 Strict parsing ϕ -PASS XHTML1.0 Strict parsing ϖ -PASS XHTML1.0 Strict parsing ∝ -PASS XHTML1.0 Strict parsing ↕ -PASS XHTML1.0 Strict parsing ⇕ -PASS XHTML1.0 Strict parsing ϱ -PASS XHTML1.0 Strict parsing ς -PASS XHTML1.0 Strict parsing ⊊︀ -PASS XHTML1.0 Strict parsing ⫋︀ -PASS XHTML1.0 Strict parsing ⊋︀ -PASS XHTML1.0 Strict parsing ⫌︀ -PASS XHTML1.0 Strict parsing ϑ -PASS XHTML1.0 Strict parsing ⊲ -PASS XHTML1.0 Strict parsing ⊳ -PASS XHTML1.0 Strict parsing ⫨ -PASS XHTML1.0 Strict parsing ⫫ -PASS XHTML1.0 Strict parsing ⫩ -PASS XHTML1.0 Strict parsing В -PASS XHTML1.0 Strict parsing в -PASS XHTML1.0 Strict parsing ⊢ -PASS XHTML1.0 Strict parsing ⊨ -PASS XHTML1.0 Strict parsing ⊩ -PASS XHTML1.0 Strict parsing ⊫ -PASS XHTML1.0 Strict parsing ⫦ -PASS XHTML1.0 Strict parsing ⊻ -PASS XHTML1.0 Strict parsing ∨ -PASS XHTML1.0 Strict parsing ⋁ -PASS XHTML1.0 Strict parsing ≚ -PASS XHTML1.0 Strict parsing ⋮ -PASS XHTML1.0 Strict parsing | -PASS XHTML1.0 Strict parsing ‖ -PASS XHTML1.0 Strict parsing | -PASS XHTML1.0 Strict parsing ‖ -PASS XHTML1.0 Strict parsing ∣ -PASS XHTML1.0 Strict parsing | -PASS XHTML1.0 Strict parsing ❘ -PASS XHTML1.0 Strict parsing ≀ -PASS XHTML1.0 Strict parsing   -PASS XHTML1.0 Strict parsing 𝔙 -PASS XHTML1.0 Strict parsing 𝔳 -PASS XHTML1.0 Strict parsing ⊲ -PASS XHTML1.0 Strict parsing ⊂⃒ -PASS XHTML1.0 Strict parsing ⊃⃒ -PASS XHTML1.0 Strict parsing 𝕍 -PASS XHTML1.0 Strict parsing 𝕧 -PASS XHTML1.0 Strict parsing ∝ -PASS XHTML1.0 Strict parsing ⊳ -PASS XHTML1.0 Strict parsing 𝒱 -PASS XHTML1.0 Strict parsing 𝓋 -PASS XHTML1.0 Strict parsing ⫋︀ -PASS XHTML1.0 Strict parsing ⊊︀ -PASS XHTML1.0 Strict parsing ⫌︀ -PASS XHTML1.0 Strict parsing ⊋︀ -PASS XHTML1.0 Strict parsing ⊪ -PASS XHTML1.0 Strict parsing ⦚ -PASS XHTML1.0 Strict parsing Ŵ -PASS XHTML1.0 Strict parsing ŵ -PASS XHTML1.0 Strict parsing ⩟ -PASS XHTML1.0 Strict parsing ∧ -PASS XHTML1.0 Strict parsing ⋀ -PASS XHTML1.0 Strict parsing ≙ -PASS XHTML1.0 Strict parsing ℘ -PASS XHTML1.0 Strict parsing 𝔚 -PASS XHTML1.0 Strict parsing 𝔴 -PASS XHTML1.0 Strict parsing 𝕎 -PASS XHTML1.0 Strict parsing 𝕨 -PASS XHTML1.0 Strict parsing ℘ -PASS XHTML1.0 Strict parsing ≀ -PASS XHTML1.0 Strict parsing ≀ -PASS XHTML1.0 Strict parsing 𝒲 -PASS XHTML1.0 Strict parsing 𝓌 -PASS XHTML1.0 Strict parsing ⋂ -PASS XHTML1.0 Strict parsing ◯ -PASS XHTML1.0 Strict parsing ⋃ -PASS XHTML1.0 Strict parsing ▽ -PASS XHTML1.0 Strict parsing 𝔛 -PASS XHTML1.0 Strict parsing 𝔵 -PASS XHTML1.0 Strict parsing ⟷ -PASS XHTML1.0 Strict parsing ⟺ -PASS XHTML1.0 Strict parsing Ξ -PASS XHTML1.0 Strict parsing ξ -PASS XHTML1.0 Strict parsing ⟵ -PASS XHTML1.0 Strict parsing ⟸ -PASS XHTML1.0 Strict parsing ⟼ -PASS XHTML1.0 Strict parsing ⋻ -PASS XHTML1.0 Strict parsing ⨀ -PASS XHTML1.0 Strict parsing 𝕏 -PASS XHTML1.0 Strict parsing 𝕩 -PASS XHTML1.0 Strict parsing ⨁ -PASS XHTML1.0 Strict parsing ⨂ -PASS XHTML1.0 Strict parsing ⟶ -PASS XHTML1.0 Strict parsing ⟹ -PASS XHTML1.0 Strict parsing 𝒳 -PASS XHTML1.0 Strict parsing 𝓍 -PASS XHTML1.0 Strict parsing ⨆ -PASS XHTML1.0 Strict parsing ⨄ -PASS XHTML1.0 Strict parsing △ -PASS XHTML1.0 Strict parsing ⋁ -PASS XHTML1.0 Strict parsing ⋀ -PASS XHTML1.0 Strict parsing Ý -PASS XHTML1.0 Strict parsing ý -PASS XHTML1.0 Strict parsing Я -PASS XHTML1.0 Strict parsing я -PASS XHTML1.0 Strict parsing Ŷ -PASS XHTML1.0 Strict parsing ŷ -PASS XHTML1.0 Strict parsing Ы -PASS XHTML1.0 Strict parsing ы -PASS XHTML1.0 Strict parsing ¥ -PASS XHTML1.0 Strict parsing 𝔜 -PASS XHTML1.0 Strict parsing 𝔶 -PASS XHTML1.0 Strict parsing Ї -PASS XHTML1.0 Strict parsing ї -PASS XHTML1.0 Strict parsing 𝕐 -PASS XHTML1.0 Strict parsing 𝕪 -PASS XHTML1.0 Strict parsing 𝒴 -PASS XHTML1.0 Strict parsing 𝓎 -PASS XHTML1.0 Strict parsing Ю -PASS XHTML1.0 Strict parsing ю -PASS XHTML1.0 Strict parsing ÿ -PASS XHTML1.0 Strict parsing Ÿ -PASS XHTML1.0 Strict parsing Ź -PASS XHTML1.0 Strict parsing ź -PASS XHTML1.0 Strict parsing Ž -PASS XHTML1.0 Strict parsing ž -PASS XHTML1.0 Strict parsing З -PASS XHTML1.0 Strict parsing з -PASS XHTML1.0 Strict parsing Ż -PASS XHTML1.0 Strict parsing ż -PASS XHTML1.0 Strict parsing ℨ -PASS XHTML1.0 Strict parsing ​ -PASS XHTML1.0 Strict parsing Ζ -PASS XHTML1.0 Strict parsing ζ -PASS XHTML1.0 Strict parsing 𝔷 -PASS XHTML1.0 Strict parsing ℨ -PASS XHTML1.0 Strict parsing Ж -PASS XHTML1.0 Strict parsing ж -PASS XHTML1.0 Strict parsing ⇝ -PASS XHTML1.0 Strict parsing 𝕫 -PASS XHTML1.0 Strict parsing ℤ -PASS XHTML1.0 Strict parsing 𝒵 -PASS XHTML1.0 Strict parsing 𝓏 -PASS XHTML1.0 Strict parsing ‍ -PASS XHTML1.0 Strict parsing ‌ -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-4-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-4-expected.txt deleted file mode 100644 index df5aae9..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-4-expected.txt +++ /dev/null
@@ -1,2129 +0,0 @@ -This is a testharness.js-based test. -Found 2125 tests; 2122 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS XHTML1.0 Frameset parsing Á -PASS XHTML1.0 Frameset parsing á -PASS XHTML1.0 Frameset parsing Ă -PASS XHTML1.0 Frameset parsing ă -PASS XHTML1.0 Frameset parsing ∾ -PASS XHTML1.0 Frameset parsing ∿ -PASS XHTML1.0 Frameset parsing ∾̳ -PASS XHTML1.0 Frameset parsing  -PASS XHTML1.0 Frameset parsing â -PASS XHTML1.0 Frameset parsing ´ -PASS XHTML1.0 Frameset parsing А -PASS XHTML1.0 Frameset parsing а -PASS XHTML1.0 Frameset parsing Æ -PASS XHTML1.0 Frameset parsing æ -PASS XHTML1.0 Frameset parsing ⁡ -PASS XHTML1.0 Frameset parsing 𝔄 -PASS XHTML1.0 Frameset parsing 𝔞 -PASS XHTML1.0 Frameset parsing À -PASS XHTML1.0 Frameset parsing à -PASS XHTML1.0 Frameset parsing ℵ -PASS XHTML1.0 Frameset parsing ℵ -PASS XHTML1.0 Frameset parsing Α -PASS XHTML1.0 Frameset parsing α -PASS XHTML1.0 Frameset parsing Ā -PASS XHTML1.0 Frameset parsing ā -PASS XHTML1.0 Frameset parsing ⨿ -PASS XHTML1.0 Frameset parsing & -FAIL XHTML1.0 Frameset parsing & assert_true: expected true got false -PASS XHTML1.0 Frameset parsing ⩕ -PASS XHTML1.0 Frameset parsing ⩓ -PASS XHTML1.0 Frameset parsing ∧ -PASS XHTML1.0 Frameset parsing ⩜ -PASS XHTML1.0 Frameset parsing ⩘ -PASS XHTML1.0 Frameset parsing ⩚ -PASS XHTML1.0 Frameset parsing ∠ -PASS XHTML1.0 Frameset parsing ⦤ -PASS XHTML1.0 Frameset parsing ∠ -PASS XHTML1.0 Frameset parsing ⦨ -PASS XHTML1.0 Frameset parsing ⦩ -PASS XHTML1.0 Frameset parsing ⦪ -PASS XHTML1.0 Frameset parsing ⦫ -PASS XHTML1.0 Frameset parsing ⦬ -PASS XHTML1.0 Frameset parsing ⦭ -PASS XHTML1.0 Frameset parsing ⦮ -PASS XHTML1.0 Frameset parsing ⦯ -PASS XHTML1.0 Frameset parsing ∡ -PASS XHTML1.0 Frameset parsing ∟ -PASS XHTML1.0 Frameset parsing ⊾ -PASS XHTML1.0 Frameset parsing ⦝ -PASS XHTML1.0 Frameset parsing ∢ -PASS XHTML1.0 Frameset parsing Å -PASS XHTML1.0 Frameset parsing ⍼ -PASS XHTML1.0 Frameset parsing Ą -PASS XHTML1.0 Frameset parsing ą -PASS XHTML1.0 Frameset parsing 𝔸 -PASS XHTML1.0 Frameset parsing 𝕒 -PASS XHTML1.0 Frameset parsing ⩯ -PASS XHTML1.0 Frameset parsing ≈ -PASS XHTML1.0 Frameset parsing ⩰ -PASS XHTML1.0 Frameset parsing ≊ -PASS XHTML1.0 Frameset parsing ≋ -PASS XHTML1.0 Frameset parsing ' -PASS XHTML1.0 Frameset parsing ⁡ -PASS XHTML1.0 Frameset parsing ≈ -PASS XHTML1.0 Frameset parsing ≊ -PASS XHTML1.0 Frameset parsing Å -PASS XHTML1.0 Frameset parsing å -PASS XHTML1.0 Frameset parsing 𝒜 -PASS XHTML1.0 Frameset parsing 𝒶 -PASS XHTML1.0 Frameset parsing ≔ -PASS XHTML1.0 Frameset parsing * -PASS XHTML1.0 Frameset parsing ≈ -PASS XHTML1.0 Frameset parsing ≍ -PASS XHTML1.0 Frameset parsing à -PASS XHTML1.0 Frameset parsing ã -PASS XHTML1.0 Frameset parsing Ä -PASS XHTML1.0 Frameset parsing ä -PASS XHTML1.0 Frameset parsing ∳ -PASS XHTML1.0 Frameset parsing ⨑ -PASS XHTML1.0 Frameset parsing ≌ -PASS XHTML1.0 Frameset parsing ϶ -PASS XHTML1.0 Frameset parsing ‵ -PASS XHTML1.0 Frameset parsing ∽ -PASS XHTML1.0 Frameset parsing ⋍ -PASS XHTML1.0 Frameset parsing ∖ -PASS XHTML1.0 Frameset parsing ⫧ -PASS XHTML1.0 Frameset parsing ⊽ -PASS XHTML1.0 Frameset parsing ⌅ -PASS XHTML1.0 Frameset parsing ⌆ -PASS XHTML1.0 Frameset parsing ⌅ -PASS XHTML1.0 Frameset parsing ⎵ -PASS XHTML1.0 Frameset parsing ⎶ -PASS XHTML1.0 Frameset parsing ≌ -PASS XHTML1.0 Frameset parsing Б -PASS XHTML1.0 Frameset parsing б -PASS XHTML1.0 Frameset parsing „ -PASS XHTML1.0 Frameset parsing ∵ -PASS XHTML1.0 Frameset parsing ∵ -PASS XHTML1.0 Frameset parsing ∵ -PASS XHTML1.0 Frameset parsing ⦰ -PASS XHTML1.0 Frameset parsing ϶ -PASS XHTML1.0 Frameset parsing ℬ -PASS XHTML1.0 Frameset parsing ℬ -PASS XHTML1.0 Frameset parsing Β -PASS XHTML1.0 Frameset parsing β -PASS XHTML1.0 Frameset parsing ℶ -PASS XHTML1.0 Frameset parsing ≬ -PASS XHTML1.0 Frameset parsing 𝔅 -PASS XHTML1.0 Frameset parsing 𝔟 -PASS XHTML1.0 Frameset parsing ⋂ -PASS XHTML1.0 Frameset parsing ◯ -PASS XHTML1.0 Frameset parsing ⋃ -PASS XHTML1.0 Frameset parsing ⨀ -PASS XHTML1.0 Frameset parsing ⨁ -PASS XHTML1.0 Frameset parsing ⨂ -PASS XHTML1.0 Frameset parsing ⨆ -PASS XHTML1.0 Frameset parsing ★ -PASS XHTML1.0 Frameset parsing ▽ -PASS XHTML1.0 Frameset parsing △ -PASS XHTML1.0 Frameset parsing ⨄ -PASS XHTML1.0 Frameset parsing ⋁ -PASS XHTML1.0 Frameset parsing ⋀ -PASS XHTML1.0 Frameset parsing ⤍ -PASS XHTML1.0 Frameset parsing ⧫ -PASS XHTML1.0 Frameset parsing ▪ -PASS XHTML1.0 Frameset parsing ▴ -PASS XHTML1.0 Frameset parsing ▾ -PASS XHTML1.0 Frameset parsing ◂ -PASS XHTML1.0 Frameset parsing ▸ -PASS XHTML1.0 Frameset parsing ␣ -PASS XHTML1.0 Frameset parsing ▒ -PASS XHTML1.0 Frameset parsing ░ -PASS XHTML1.0 Frameset parsing ▓ -PASS XHTML1.0 Frameset parsing █ -PASS XHTML1.0 Frameset parsing =⃥ -PASS XHTML1.0 Frameset parsing ≡⃥ -PASS XHTML1.0 Frameset parsing ⫭ -PASS XHTML1.0 Frameset parsing ⌐ -PASS XHTML1.0 Frameset parsing 𝔹 -PASS XHTML1.0 Frameset parsing 𝕓 -PASS XHTML1.0 Frameset parsing ⊥ -PASS XHTML1.0 Frameset parsing ⊥ -PASS XHTML1.0 Frameset parsing ⋈ -PASS XHTML1.0 Frameset parsing ⧉ -PASS XHTML1.0 Frameset parsing ┐ -PASS XHTML1.0 Frameset parsing ╕ -PASS XHTML1.0 Frameset parsing ╖ -PASS XHTML1.0 Frameset parsing ╗ -PASS XHTML1.0 Frameset parsing ┌ -PASS XHTML1.0 Frameset parsing ╒ -PASS XHTML1.0 Frameset parsing ╓ -PASS XHTML1.0 Frameset parsing ╔ -PASS XHTML1.0 Frameset parsing ─ -PASS XHTML1.0 Frameset parsing ═ -PASS XHTML1.0 Frameset parsing ┬ -PASS XHTML1.0 Frameset parsing ╤ -PASS XHTML1.0 Frameset parsing ╥ -PASS XHTML1.0 Frameset parsing ╦ -PASS XHTML1.0 Frameset parsing ┴ -PASS XHTML1.0 Frameset parsing ╧ -PASS XHTML1.0 Frameset parsing ╨ -PASS XHTML1.0 Frameset parsing ╩ -PASS XHTML1.0 Frameset parsing ⊟ -PASS XHTML1.0 Frameset parsing ⊞ -PASS XHTML1.0 Frameset parsing ⊠ -PASS XHTML1.0 Frameset parsing ┘ -PASS XHTML1.0 Frameset parsing ╛ -PASS XHTML1.0 Frameset parsing ╜ -PASS XHTML1.0 Frameset parsing ╝ -PASS XHTML1.0 Frameset parsing └ -PASS XHTML1.0 Frameset parsing ╘ -PASS XHTML1.0 Frameset parsing ╙ -PASS XHTML1.0 Frameset parsing ╚ -PASS XHTML1.0 Frameset parsing │ -PASS XHTML1.0 Frameset parsing ║ -PASS XHTML1.0 Frameset parsing ┼ -PASS XHTML1.0 Frameset parsing ╪ -PASS XHTML1.0 Frameset parsing ╫ -PASS XHTML1.0 Frameset parsing ╬ -PASS XHTML1.0 Frameset parsing ┤ -PASS XHTML1.0 Frameset parsing ╡ -PASS XHTML1.0 Frameset parsing ╢ -PASS XHTML1.0 Frameset parsing ╣ -PASS XHTML1.0 Frameset parsing ├ -PASS XHTML1.0 Frameset parsing ╞ -PASS XHTML1.0 Frameset parsing ╟ -PASS XHTML1.0 Frameset parsing ╠ -PASS XHTML1.0 Frameset parsing ‵ -PASS XHTML1.0 Frameset parsing ˘ -PASS XHTML1.0 Frameset parsing ˘ -PASS XHTML1.0 Frameset parsing ¦ -PASS XHTML1.0 Frameset parsing 𝒷 -PASS XHTML1.0 Frameset parsing ℬ -PASS XHTML1.0 Frameset parsing ⁏ -PASS XHTML1.0 Frameset parsing ∽ -PASS XHTML1.0 Frameset parsing ⋍ -PASS XHTML1.0 Frameset parsing ⧅ -PASS XHTML1.0 Frameset parsing \ -PASS XHTML1.0 Frameset parsing ⟈ -PASS XHTML1.0 Frameset parsing • -PASS XHTML1.0 Frameset parsing • -PASS XHTML1.0 Frameset parsing ≎ -PASS XHTML1.0 Frameset parsing ⪮ -PASS XHTML1.0 Frameset parsing ≏ -PASS XHTML1.0 Frameset parsing ≎ -PASS XHTML1.0 Frameset parsing ≏ -PASS XHTML1.0 Frameset parsing Ć -PASS XHTML1.0 Frameset parsing ć -PASS XHTML1.0 Frameset parsing ⩄ -PASS XHTML1.0 Frameset parsing ⩉ -PASS XHTML1.0 Frameset parsing ⩋ -PASS XHTML1.0 Frameset parsing ∩ -PASS XHTML1.0 Frameset parsing ⋒ -PASS XHTML1.0 Frameset parsing ⩇ -PASS XHTML1.0 Frameset parsing ⩀ -PASS XHTML1.0 Frameset parsing ⅅ -PASS XHTML1.0 Frameset parsing ∩︀ -PASS XHTML1.0 Frameset parsing ⁁ -PASS XHTML1.0 Frameset parsing ˇ -PASS XHTML1.0 Frameset parsing ℭ -PASS XHTML1.0 Frameset parsing ⩍ -PASS XHTML1.0 Frameset parsing Č -PASS XHTML1.0 Frameset parsing č -PASS XHTML1.0 Frameset parsing Ç -PASS XHTML1.0 Frameset parsing ç -PASS XHTML1.0 Frameset parsing Ĉ -PASS XHTML1.0 Frameset parsing ĉ -PASS XHTML1.0 Frameset parsing ∰ -PASS XHTML1.0 Frameset parsing ⩌ -PASS XHTML1.0 Frameset parsing ⩐ -PASS XHTML1.0 Frameset parsing Ċ -PASS XHTML1.0 Frameset parsing ċ -PASS XHTML1.0 Frameset parsing ¸ -PASS XHTML1.0 Frameset parsing ¸ -PASS XHTML1.0 Frameset parsing ⦲ -PASS XHTML1.0 Frameset parsing ¢ -PASS XHTML1.0 Frameset parsing · -PASS XHTML1.0 Frameset parsing · -PASS XHTML1.0 Frameset parsing 𝔠 -PASS XHTML1.0 Frameset parsing ℭ -PASS XHTML1.0 Frameset parsing Ч -PASS XHTML1.0 Frameset parsing ч -PASS XHTML1.0 Frameset parsing ✓ -PASS XHTML1.0 Frameset parsing ✓ -PASS XHTML1.0 Frameset parsing Χ -PASS XHTML1.0 Frameset parsing χ -PASS XHTML1.0 Frameset parsing ˆ -PASS XHTML1.0 Frameset parsing ≗ -PASS XHTML1.0 Frameset parsing ↺ -PASS XHTML1.0 Frameset parsing ↻ -PASS XHTML1.0 Frameset parsing ⊛ -PASS XHTML1.0 Frameset parsing ⊚ -PASS XHTML1.0 Frameset parsing ⊝ -PASS XHTML1.0 Frameset parsing ⊙ -PASS XHTML1.0 Frameset parsing ® -PASS XHTML1.0 Frameset parsing Ⓢ -PASS XHTML1.0 Frameset parsing ⊖ -PASS XHTML1.0 Frameset parsing ⊕ -PASS XHTML1.0 Frameset parsing ⊗ -PASS XHTML1.0 Frameset parsing ○ -PASS XHTML1.0 Frameset parsing ⧃ -PASS XHTML1.0 Frameset parsing ≗ -PASS XHTML1.0 Frameset parsing ⨐ -PASS XHTML1.0 Frameset parsing ⫯ -PASS XHTML1.0 Frameset parsing ⧂ -PASS XHTML1.0 Frameset parsing ∲ -PASS XHTML1.0 Frameset parsing ” -PASS XHTML1.0 Frameset parsing ’ -PASS XHTML1.0 Frameset parsing ♣ -PASS XHTML1.0 Frameset parsing ♣ -PASS XHTML1.0 Frameset parsing : -PASS XHTML1.0 Frameset parsing ∷ -PASS XHTML1.0 Frameset parsing ⩴ -PASS XHTML1.0 Frameset parsing ≔ -PASS XHTML1.0 Frameset parsing ≔ -PASS XHTML1.0 Frameset parsing , -PASS XHTML1.0 Frameset parsing @ -PASS XHTML1.0 Frameset parsing ∁ -PASS XHTML1.0 Frameset parsing ∘ -PASS XHTML1.0 Frameset parsing ∁ -PASS XHTML1.0 Frameset parsing ℂ -PASS XHTML1.0 Frameset parsing ≅ -PASS XHTML1.0 Frameset parsing ⩭ -PASS XHTML1.0 Frameset parsing ≡ -PASS XHTML1.0 Frameset parsing ∮ -PASS XHTML1.0 Frameset parsing ∯ -PASS XHTML1.0 Frameset parsing ∮ -PASS XHTML1.0 Frameset parsing 𝕔 -PASS XHTML1.0 Frameset parsing ℂ -PASS XHTML1.0 Frameset parsing ∐ -PASS XHTML1.0 Frameset parsing ∐ -PASS XHTML1.0 Frameset parsing © -PASS XHTML1.0 Frameset parsing © -PASS XHTML1.0 Frameset parsing ℗ -PASS XHTML1.0 Frameset parsing ∳ -PASS XHTML1.0 Frameset parsing ↵ -PASS XHTML1.0 Frameset parsing ✗ -PASS XHTML1.0 Frameset parsing ⨯ -PASS XHTML1.0 Frameset parsing 𝒞 -PASS XHTML1.0 Frameset parsing 𝒸 -PASS XHTML1.0 Frameset parsing ⫏ -PASS XHTML1.0 Frameset parsing ⫑ -PASS XHTML1.0 Frameset parsing ⫐ -PASS XHTML1.0 Frameset parsing ⫒ -PASS XHTML1.0 Frameset parsing ⋯ -PASS XHTML1.0 Frameset parsing ⤸ -PASS XHTML1.0 Frameset parsing ⤵ -PASS XHTML1.0 Frameset parsing ⋞ -PASS XHTML1.0 Frameset parsing ⋟ -PASS XHTML1.0 Frameset parsing ↶ -PASS XHTML1.0 Frameset parsing ⤽ -PASS XHTML1.0 Frameset parsing ⩈ -PASS XHTML1.0 Frameset parsing ⩆ -PASS XHTML1.0 Frameset parsing ≍ -PASS XHTML1.0 Frameset parsing ∪ -PASS XHTML1.0 Frameset parsing ⋓ -PASS XHTML1.0 Frameset parsing ⩊ -PASS XHTML1.0 Frameset parsing ⊍ -PASS XHTML1.0 Frameset parsing ⩅ -PASS XHTML1.0 Frameset parsing ∪︀ -PASS XHTML1.0 Frameset parsing ↷ -PASS XHTML1.0 Frameset parsing ⤼ -PASS XHTML1.0 Frameset parsing ⋞ -PASS XHTML1.0 Frameset parsing ⋟ -PASS XHTML1.0 Frameset parsing ⋎ -PASS XHTML1.0 Frameset parsing ⋏ -PASS XHTML1.0 Frameset parsing ¤ -PASS XHTML1.0 Frameset parsing ↶ -PASS XHTML1.0 Frameset parsing ↷ -PASS XHTML1.0 Frameset parsing ⋎ -PASS XHTML1.0 Frameset parsing ⋏ -PASS XHTML1.0 Frameset parsing ∲ -PASS XHTML1.0 Frameset parsing ∱ -PASS XHTML1.0 Frameset parsing ⌭ -PASS XHTML1.0 Frameset parsing † -PASS XHTML1.0 Frameset parsing ‡ -PASS XHTML1.0 Frameset parsing ℸ -PASS XHTML1.0 Frameset parsing ↓ -PASS XHTML1.0 Frameset parsing ↡ -PASS XHTML1.0 Frameset parsing ⇓ -PASS XHTML1.0 Frameset parsing ‐ -PASS XHTML1.0 Frameset parsing ⫤ -PASS XHTML1.0 Frameset parsing ⊣ -PASS XHTML1.0 Frameset parsing ⤏ -PASS XHTML1.0 Frameset parsing ˝ -PASS XHTML1.0 Frameset parsing Ď -PASS XHTML1.0 Frameset parsing ď -PASS XHTML1.0 Frameset parsing Д -PASS XHTML1.0 Frameset parsing д -PASS XHTML1.0 Frameset parsing ‡ -PASS XHTML1.0 Frameset parsing ⇊ -PASS XHTML1.0 Frameset parsing ⅅ -PASS XHTML1.0 Frameset parsing ⅆ -PASS XHTML1.0 Frameset parsing ⤑ -PASS XHTML1.0 Frameset parsing ⩷ -PASS XHTML1.0 Frameset parsing ° -PASS XHTML1.0 Frameset parsing ∇ -PASS XHTML1.0 Frameset parsing Δ -PASS XHTML1.0 Frameset parsing δ -PASS XHTML1.0 Frameset parsing ⦱ -PASS XHTML1.0 Frameset parsing ⥿ -PASS XHTML1.0 Frameset parsing 𝔇 -PASS XHTML1.0 Frameset parsing 𝔡 -PASS XHTML1.0 Frameset parsing ⥥ -PASS XHTML1.0 Frameset parsing ⇃ -PASS XHTML1.0 Frameset parsing ⇂ -PASS XHTML1.0 Frameset parsing ´ -PASS XHTML1.0 Frameset parsing ˙ -PASS XHTML1.0 Frameset parsing ˝ -PASS XHTML1.0 Frameset parsing ` -PASS XHTML1.0 Frameset parsing ˜ -PASS XHTML1.0 Frameset parsing ⋄ -PASS XHTML1.0 Frameset parsing ⋄ -PASS XHTML1.0 Frameset parsing ⋄ -PASS XHTML1.0 Frameset parsing ♦ -PASS XHTML1.0 Frameset parsing ♦ -PASS XHTML1.0 Frameset parsing ¨ -PASS XHTML1.0 Frameset parsing ⅆ -PASS XHTML1.0 Frameset parsing ϝ -PASS XHTML1.0 Frameset parsing ⋲ -PASS XHTML1.0 Frameset parsing ÷ -PASS XHTML1.0 Frameset parsing ÷ -PASS XHTML1.0 Frameset parsing ⋇ -PASS XHTML1.0 Frameset parsing ⋇ -PASS XHTML1.0 Frameset parsing Ђ -PASS XHTML1.0 Frameset parsing ђ -PASS XHTML1.0 Frameset parsing ⌞ -PASS XHTML1.0 Frameset parsing ⌍ -PASS XHTML1.0 Frameset parsing $ -PASS XHTML1.0 Frameset parsing 𝔻 -PASS XHTML1.0 Frameset parsing 𝕕 -PASS XHTML1.0 Frameset parsing ¨ -PASS XHTML1.0 Frameset parsing ˙ -PASS XHTML1.0 Frameset parsing ⃜ -PASS XHTML1.0 Frameset parsing ≐ -PASS XHTML1.0 Frameset parsing ≑ -PASS XHTML1.0 Frameset parsing ≐ -PASS XHTML1.0 Frameset parsing ∸ -PASS XHTML1.0 Frameset parsing ∔ -PASS XHTML1.0 Frameset parsing ⊡ -PASS XHTML1.0 Frameset parsing ⌆ -PASS XHTML1.0 Frameset parsing ∯ -PASS XHTML1.0 Frameset parsing ¨ -PASS XHTML1.0 Frameset parsing ⇓ -PASS XHTML1.0 Frameset parsing ⇐ -PASS XHTML1.0 Frameset parsing ⇔ -PASS XHTML1.0 Frameset parsing ⫤ -PASS XHTML1.0 Frameset parsing ⟸ -PASS XHTML1.0 Frameset parsing ⟺ -PASS XHTML1.0 Frameset parsing ⟹ -PASS XHTML1.0 Frameset parsing ⇒ -PASS XHTML1.0 Frameset parsing ⊨ -PASS XHTML1.0 Frameset parsing ⇑ -PASS XHTML1.0 Frameset parsing ⇕ -PASS XHTML1.0 Frameset parsing ∥ -PASS XHTML1.0 Frameset parsing ⤓ -PASS XHTML1.0 Frameset parsing ↓ -PASS XHTML1.0 Frameset parsing ↓ -PASS XHTML1.0 Frameset parsing ⇓ -PASS XHTML1.0 Frameset parsing ⇵ -PASS XHTML1.0 Frameset parsing ̑ -PASS XHTML1.0 Frameset parsing ⇊ -PASS XHTML1.0 Frameset parsing ⇃ -PASS XHTML1.0 Frameset parsing ⇂ -PASS XHTML1.0 Frameset parsing ⥐ -PASS XHTML1.0 Frameset parsing ⥞ -PASS XHTML1.0 Frameset parsing ⥖ -PASS XHTML1.0 Frameset parsing ↽ -PASS XHTML1.0 Frameset parsing ⥟ -PASS XHTML1.0 Frameset parsing ⥗ -PASS XHTML1.0 Frameset parsing ⇁ -PASS XHTML1.0 Frameset parsing ↧ -PASS XHTML1.0 Frameset parsing ⊤ -PASS XHTML1.0 Frameset parsing ⤐ -PASS XHTML1.0 Frameset parsing ⌟ -PASS XHTML1.0 Frameset parsing ⌌ -PASS XHTML1.0 Frameset parsing 𝒟 -PASS XHTML1.0 Frameset parsing 𝒹 -PASS XHTML1.0 Frameset parsing Ѕ -PASS XHTML1.0 Frameset parsing ѕ -PASS XHTML1.0 Frameset parsing ⧶ -PASS XHTML1.0 Frameset parsing Đ -PASS XHTML1.0 Frameset parsing đ -PASS XHTML1.0 Frameset parsing ⋱ -PASS XHTML1.0 Frameset parsing ▿ -PASS XHTML1.0 Frameset parsing ▾ -PASS XHTML1.0 Frameset parsing ⇵ -PASS XHTML1.0 Frameset parsing ⥯ -PASS XHTML1.0 Frameset parsing ⦦ -PASS XHTML1.0 Frameset parsing Џ -PASS XHTML1.0 Frameset parsing џ -PASS XHTML1.0 Frameset parsing ⟿ -PASS XHTML1.0 Frameset parsing É -PASS XHTML1.0 Frameset parsing é -PASS XHTML1.0 Frameset parsing ⩮ -PASS XHTML1.0 Frameset parsing Ě -PASS XHTML1.0 Frameset parsing ě -PASS XHTML1.0 Frameset parsing Ê -PASS XHTML1.0 Frameset parsing ê -PASS XHTML1.0 Frameset parsing ≖ -PASS XHTML1.0 Frameset parsing ≕ -PASS XHTML1.0 Frameset parsing Э -PASS XHTML1.0 Frameset parsing э -PASS XHTML1.0 Frameset parsing ⩷ -PASS XHTML1.0 Frameset parsing Ė -PASS XHTML1.0 Frameset parsing ė -PASS XHTML1.0 Frameset parsing ≑ -PASS XHTML1.0 Frameset parsing ⅇ -PASS XHTML1.0 Frameset parsing ≒ -PASS XHTML1.0 Frameset parsing 𝔈 -PASS XHTML1.0 Frameset parsing 𝔢 -PASS XHTML1.0 Frameset parsing ⪚ -PASS XHTML1.0 Frameset parsing È -PASS XHTML1.0 Frameset parsing è -PASS XHTML1.0 Frameset parsing ⪖ -PASS XHTML1.0 Frameset parsing ⪘ -PASS XHTML1.0 Frameset parsing ⪙ -PASS XHTML1.0 Frameset parsing ∈ -PASS XHTML1.0 Frameset parsing ⏧ -PASS XHTML1.0 Frameset parsing ℓ -PASS XHTML1.0 Frameset parsing ⪕ -PASS XHTML1.0 Frameset parsing ⪗ -PASS XHTML1.0 Frameset parsing Ē -PASS XHTML1.0 Frameset parsing ē -PASS XHTML1.0 Frameset parsing ∅ -PASS XHTML1.0 Frameset parsing ∅ -PASS XHTML1.0 Frameset parsing ◻ -PASS XHTML1.0 Frameset parsing ∅ -PASS XHTML1.0 Frameset parsing ▫ -PASS XHTML1.0 Frameset parsing   -PASS XHTML1.0 Frameset parsing   -PASS XHTML1.0 Frameset parsing   -PASS XHTML1.0 Frameset parsing Ŋ -PASS XHTML1.0 Frameset parsing ŋ -PASS XHTML1.0 Frameset parsing   -PASS XHTML1.0 Frameset parsing Ę -PASS XHTML1.0 Frameset parsing ę -PASS XHTML1.0 Frameset parsing 𝔼 -PASS XHTML1.0 Frameset parsing 𝕖 -PASS XHTML1.0 Frameset parsing ⋕ -PASS XHTML1.0 Frameset parsing ⧣ -PASS XHTML1.0 Frameset parsing ⩱ -PASS XHTML1.0 Frameset parsing ε -PASS XHTML1.0 Frameset parsing Ε -PASS XHTML1.0 Frameset parsing ε -PASS XHTML1.0 Frameset parsing ϵ -PASS XHTML1.0 Frameset parsing ≖ -PASS XHTML1.0 Frameset parsing ≕ -PASS XHTML1.0 Frameset parsing ≂ -PASS XHTML1.0 Frameset parsing ⪖ -PASS XHTML1.0 Frameset parsing ⪕ -PASS XHTML1.0 Frameset parsing ⩵ -PASS XHTML1.0 Frameset parsing = -PASS XHTML1.0 Frameset parsing ≂ -PASS XHTML1.0 Frameset parsing ≟ -PASS XHTML1.0 Frameset parsing ⇌ -PASS XHTML1.0 Frameset parsing ≡ -PASS XHTML1.0 Frameset parsing ⩸ -PASS XHTML1.0 Frameset parsing ⧥ -PASS XHTML1.0 Frameset parsing ⥱ -PASS XHTML1.0 Frameset parsing ≓ -PASS XHTML1.0 Frameset parsing ℯ -PASS XHTML1.0 Frameset parsing ℰ -PASS XHTML1.0 Frameset parsing ≐ -PASS XHTML1.0 Frameset parsing ⩳ -PASS XHTML1.0 Frameset parsing ≂ -PASS XHTML1.0 Frameset parsing Η -PASS XHTML1.0 Frameset parsing η -PASS XHTML1.0 Frameset parsing Ð -PASS XHTML1.0 Frameset parsing ð -PASS XHTML1.0 Frameset parsing Ë -PASS XHTML1.0 Frameset parsing ë -PASS XHTML1.0 Frameset parsing € -PASS XHTML1.0 Frameset parsing ! -PASS XHTML1.0 Frameset parsing ∃ -PASS XHTML1.0 Frameset parsing ∃ -PASS XHTML1.0 Frameset parsing ℰ -PASS XHTML1.0 Frameset parsing ⅇ -PASS XHTML1.0 Frameset parsing ⅇ -PASS XHTML1.0 Frameset parsing ≒ -PASS XHTML1.0 Frameset parsing Ф -PASS XHTML1.0 Frameset parsing ф -PASS XHTML1.0 Frameset parsing ♀ -PASS XHTML1.0 Frameset parsing ffi -PASS XHTML1.0 Frameset parsing ff -PASS XHTML1.0 Frameset parsing ffl -PASS XHTML1.0 Frameset parsing 𝔉 -PASS XHTML1.0 Frameset parsing 𝔣 -PASS XHTML1.0 Frameset parsing fi -PASS XHTML1.0 Frameset parsing ◼ -PASS XHTML1.0 Frameset parsing ▪ -PASS XHTML1.0 Frameset parsing fj -PASS XHTML1.0 Frameset parsing ♭ -PASS XHTML1.0 Frameset parsing fl -PASS XHTML1.0 Frameset parsing ▱ -PASS XHTML1.0 Frameset parsing ƒ -PASS XHTML1.0 Frameset parsing 𝔽 -PASS XHTML1.0 Frameset parsing 𝕗 -PASS XHTML1.0 Frameset parsing ∀ -PASS XHTML1.0 Frameset parsing ∀ -PASS XHTML1.0 Frameset parsing ⋔ -PASS XHTML1.0 Frameset parsing ⫙ -PASS XHTML1.0 Frameset parsing ℱ -PASS XHTML1.0 Frameset parsing ⨍ -PASS XHTML1.0 Frameset parsing ½ -PASS XHTML1.0 Frameset parsing ⅓ -PASS XHTML1.0 Frameset parsing ¼ -PASS XHTML1.0 Frameset parsing ⅕ -PASS XHTML1.0 Frameset parsing ⅙ -PASS XHTML1.0 Frameset parsing ⅛ -PASS XHTML1.0 Frameset parsing ⅔ -PASS XHTML1.0 Frameset parsing ⅖ -PASS XHTML1.0 Frameset parsing ¾ -PASS XHTML1.0 Frameset parsing ⅗ -PASS XHTML1.0 Frameset parsing ⅜ -PASS XHTML1.0 Frameset parsing ⅘ -PASS XHTML1.0 Frameset parsing ⅚ -PASS XHTML1.0 Frameset parsing ⅝ -PASS XHTML1.0 Frameset parsing ⅞ -PASS XHTML1.0 Frameset parsing ⁄ -PASS XHTML1.0 Frameset parsing ⌢ -PASS XHTML1.0 Frameset parsing 𝒻 -PASS XHTML1.0 Frameset parsing ℱ -PASS XHTML1.0 Frameset parsing ǵ -PASS XHTML1.0 Frameset parsing Γ -PASS XHTML1.0 Frameset parsing γ -PASS XHTML1.0 Frameset parsing Ϝ -PASS XHTML1.0 Frameset parsing ϝ -PASS XHTML1.0 Frameset parsing ⪆ -PASS XHTML1.0 Frameset parsing Ğ -PASS XHTML1.0 Frameset parsing ğ -PASS XHTML1.0 Frameset parsing Ģ -PASS XHTML1.0 Frameset parsing Ĝ -PASS XHTML1.0 Frameset parsing ĝ -PASS XHTML1.0 Frameset parsing Г -PASS XHTML1.0 Frameset parsing г -PASS XHTML1.0 Frameset parsing Ġ -PASS XHTML1.0 Frameset parsing ġ -PASS XHTML1.0 Frameset parsing ≥ -PASS XHTML1.0 Frameset parsing ≧ -PASS XHTML1.0 Frameset parsing ⪌ -PASS XHTML1.0 Frameset parsing ⋛ -PASS XHTML1.0 Frameset parsing ≥ -PASS XHTML1.0 Frameset parsing ≧ -PASS XHTML1.0 Frameset parsing ⩾ -PASS XHTML1.0 Frameset parsing ⪩ -PASS XHTML1.0 Frameset parsing ⩾ -PASS XHTML1.0 Frameset parsing ⪀ -PASS XHTML1.0 Frameset parsing ⪂ -PASS XHTML1.0 Frameset parsing ⪄ -PASS XHTML1.0 Frameset parsing ⋛︀ -PASS XHTML1.0 Frameset parsing ⪔ -PASS XHTML1.0 Frameset parsing 𝔊 -PASS XHTML1.0 Frameset parsing 𝔤 -PASS XHTML1.0 Frameset parsing ≫ -PASS XHTML1.0 Frameset parsing ⋙ -PASS XHTML1.0 Frameset parsing ⋙ -PASS XHTML1.0 Frameset parsing ℷ -PASS XHTML1.0 Frameset parsing Ѓ -PASS XHTML1.0 Frameset parsing ѓ -PASS XHTML1.0 Frameset parsing ⪥ -PASS XHTML1.0 Frameset parsing ≷ -PASS XHTML1.0 Frameset parsing ⪒ -PASS XHTML1.0 Frameset parsing ⪤ -PASS XHTML1.0 Frameset parsing ⪊ -PASS XHTML1.0 Frameset parsing ⪊ -PASS XHTML1.0 Frameset parsing ⪈ -PASS XHTML1.0 Frameset parsing ≩ -PASS XHTML1.0 Frameset parsing ⪈ -PASS XHTML1.0 Frameset parsing ≩ -PASS XHTML1.0 Frameset parsing ⋧ -PASS XHTML1.0 Frameset parsing 𝔾 -PASS XHTML1.0 Frameset parsing 𝕘 -PASS XHTML1.0 Frameset parsing ` -PASS XHTML1.0 Frameset parsing ≥ -PASS XHTML1.0 Frameset parsing ⋛ -PASS XHTML1.0 Frameset parsing ≧ -PASS XHTML1.0 Frameset parsing ⪢ -PASS XHTML1.0 Frameset parsing ≷ -PASS XHTML1.0 Frameset parsing ⩾ -PASS XHTML1.0 Frameset parsing ≳ -PASS XHTML1.0 Frameset parsing 𝒢 -PASS XHTML1.0 Frameset parsing ℊ -PASS XHTML1.0 Frameset parsing ≳ -PASS XHTML1.0 Frameset parsing ⪎ -PASS XHTML1.0 Frameset parsing ⪐ -PASS XHTML1.0 Frameset parsing ⪧ -PASS XHTML1.0 Frameset parsing ⩺ -PASS XHTML1.0 Frameset parsing > -PASS XHTML1.0 Frameset parsing > -PASS XHTML1.0 Frameset parsing ≫ -PASS XHTML1.0 Frameset parsing ⋗ -PASS XHTML1.0 Frameset parsing ⦕ -PASS XHTML1.0 Frameset parsing ⩼ -PASS XHTML1.0 Frameset parsing ⪆ -PASS XHTML1.0 Frameset parsing ⥸ -PASS XHTML1.0 Frameset parsing ⋗ -PASS XHTML1.0 Frameset parsing ⋛ -PASS XHTML1.0 Frameset parsing ⪌ -PASS XHTML1.0 Frameset parsing ≷ -PASS XHTML1.0 Frameset parsing ≳ -PASS XHTML1.0 Frameset parsing ≩︀ -PASS XHTML1.0 Frameset parsing ≩︀ -PASS XHTML1.0 Frameset parsing ˇ -PASS XHTML1.0 Frameset parsing   -PASS XHTML1.0 Frameset parsing ½ -PASS XHTML1.0 Frameset parsing ℋ -PASS XHTML1.0 Frameset parsing Ъ -PASS XHTML1.0 Frameset parsing ъ -PASS XHTML1.0 Frameset parsing ⥈ -PASS XHTML1.0 Frameset parsing ↔ -PASS XHTML1.0 Frameset parsing ⇔ -PASS XHTML1.0 Frameset parsing ↭ -PASS XHTML1.0 Frameset parsing ^ -PASS XHTML1.0 Frameset parsing ℏ -PASS XHTML1.0 Frameset parsing Ĥ -PASS XHTML1.0 Frameset parsing ĥ -PASS XHTML1.0 Frameset parsing ♥ -PASS XHTML1.0 Frameset parsing ♥ -PASS XHTML1.0 Frameset parsing … -PASS XHTML1.0 Frameset parsing ⊹ -PASS XHTML1.0 Frameset parsing 𝔥 -PASS XHTML1.0 Frameset parsing ℌ -PASS XHTML1.0 Frameset parsing ℋ -PASS XHTML1.0 Frameset parsing ⤥ -PASS XHTML1.0 Frameset parsing ⤦ -PASS XHTML1.0 Frameset parsing ⇿ -PASS XHTML1.0 Frameset parsing ∻ -PASS XHTML1.0 Frameset parsing ↩ -PASS XHTML1.0 Frameset parsing ↪ -PASS XHTML1.0 Frameset parsing 𝕙 -PASS XHTML1.0 Frameset parsing ℍ -PASS XHTML1.0 Frameset parsing ― -PASS XHTML1.0 Frameset parsing ─ -PASS XHTML1.0 Frameset parsing 𝒽 -PASS XHTML1.0 Frameset parsing ℋ -PASS XHTML1.0 Frameset parsing ℏ -PASS XHTML1.0 Frameset parsing Ħ -PASS XHTML1.0 Frameset parsing ħ -PASS XHTML1.0 Frameset parsing ≎ -PASS XHTML1.0 Frameset parsing ≏ -PASS XHTML1.0 Frameset parsing ⁃ -PASS XHTML1.0 Frameset parsing ‐ -PASS XHTML1.0 Frameset parsing Í -PASS XHTML1.0 Frameset parsing í -PASS XHTML1.0 Frameset parsing ⁣ -PASS XHTML1.0 Frameset parsing Î -PASS XHTML1.0 Frameset parsing î -PASS XHTML1.0 Frameset parsing И -PASS XHTML1.0 Frameset parsing и -PASS XHTML1.0 Frameset parsing İ -PASS XHTML1.0 Frameset parsing Е -PASS XHTML1.0 Frameset parsing е -PASS XHTML1.0 Frameset parsing ¡ -PASS XHTML1.0 Frameset parsing ⇔ -PASS XHTML1.0 Frameset parsing 𝔦 -PASS XHTML1.0 Frameset parsing ℑ -PASS XHTML1.0 Frameset parsing Ì -PASS XHTML1.0 Frameset parsing ì -PASS XHTML1.0 Frameset parsing ⅈ -PASS XHTML1.0 Frameset parsing ⨌ -PASS XHTML1.0 Frameset parsing ∭ -PASS XHTML1.0 Frameset parsing ⧜ -PASS XHTML1.0 Frameset parsing ℩ -PASS XHTML1.0 Frameset parsing IJ -PASS XHTML1.0 Frameset parsing ij -PASS XHTML1.0 Frameset parsing Ī -PASS XHTML1.0 Frameset parsing ī -PASS XHTML1.0 Frameset parsing ℑ -PASS XHTML1.0 Frameset parsing ⅈ -PASS XHTML1.0 Frameset parsing ℐ -PASS XHTML1.0 Frameset parsing ℑ -PASS XHTML1.0 Frameset parsing ı -PASS XHTML1.0 Frameset parsing ℑ -PASS XHTML1.0 Frameset parsing ⊷ -PASS XHTML1.0 Frameset parsing Ƶ -PASS XHTML1.0 Frameset parsing ⇒ -PASS XHTML1.0 Frameset parsing ℅ -PASS XHTML1.0 Frameset parsing ∈ -PASS XHTML1.0 Frameset parsing ∞ -PASS XHTML1.0 Frameset parsing ⧝ -PASS XHTML1.0 Frameset parsing ı -PASS XHTML1.0 Frameset parsing ⊺ -PASS XHTML1.0 Frameset parsing ∫ -PASS XHTML1.0 Frameset parsing ∬ -PASS XHTML1.0 Frameset parsing ℤ -PASS XHTML1.0 Frameset parsing ∫ -PASS XHTML1.0 Frameset parsing ⊺ -PASS XHTML1.0 Frameset parsing ⋂ -PASS XHTML1.0 Frameset parsing ⨗ -PASS XHTML1.0 Frameset parsing ⨼ -PASS XHTML1.0 Frameset parsing ⁣ -PASS XHTML1.0 Frameset parsing ⁢ -PASS XHTML1.0 Frameset parsing Ё -PASS XHTML1.0 Frameset parsing ё -PASS XHTML1.0 Frameset parsing Į -PASS XHTML1.0 Frameset parsing į -PASS XHTML1.0 Frameset parsing 𝕀 -PASS XHTML1.0 Frameset parsing 𝕚 -PASS XHTML1.0 Frameset parsing Ι -PASS XHTML1.0 Frameset parsing ι -PASS XHTML1.0 Frameset parsing ⨼ -PASS XHTML1.0 Frameset parsing ¿ -PASS XHTML1.0 Frameset parsing 𝒾 -PASS XHTML1.0 Frameset parsing ℐ -PASS XHTML1.0 Frameset parsing ∈ -PASS XHTML1.0 Frameset parsing ⋵ -PASS XHTML1.0 Frameset parsing ⋹ -PASS XHTML1.0 Frameset parsing ⋴ -PASS XHTML1.0 Frameset parsing ⋳ -PASS XHTML1.0 Frameset parsing ∈ -PASS XHTML1.0 Frameset parsing ⁢ -PASS XHTML1.0 Frameset parsing Ĩ -PASS XHTML1.0 Frameset parsing ĩ -PASS XHTML1.0 Frameset parsing І -PASS XHTML1.0 Frameset parsing і -PASS XHTML1.0 Frameset parsing Ï -PASS XHTML1.0 Frameset parsing ï -PASS XHTML1.0 Frameset parsing Ĵ -PASS XHTML1.0 Frameset parsing ĵ -PASS XHTML1.0 Frameset parsing Й -PASS XHTML1.0 Frameset parsing й -PASS XHTML1.0 Frameset parsing 𝔍 -PASS XHTML1.0 Frameset parsing 𝔧 -PASS XHTML1.0 Frameset parsing ȷ -PASS XHTML1.0 Frameset parsing 𝕁 -PASS XHTML1.0 Frameset parsing 𝕛 -PASS XHTML1.0 Frameset parsing 𝒥 -PASS XHTML1.0 Frameset parsing 𝒿 -PASS XHTML1.0 Frameset parsing Ј -PASS XHTML1.0 Frameset parsing ј -PASS XHTML1.0 Frameset parsing Є -PASS XHTML1.0 Frameset parsing є -PASS XHTML1.0 Frameset parsing Κ -PASS XHTML1.0 Frameset parsing κ -PASS XHTML1.0 Frameset parsing ϰ -PASS XHTML1.0 Frameset parsing Ķ -PASS XHTML1.0 Frameset parsing ķ -PASS XHTML1.0 Frameset parsing К -PASS XHTML1.0 Frameset parsing к -PASS XHTML1.0 Frameset parsing 𝔎 -PASS XHTML1.0 Frameset parsing 𝔨 -PASS XHTML1.0 Frameset parsing ĸ -PASS XHTML1.0 Frameset parsing Х -PASS XHTML1.0 Frameset parsing х -PASS XHTML1.0 Frameset parsing Ќ -PASS XHTML1.0 Frameset parsing ќ -PASS XHTML1.0 Frameset parsing 𝕂 -PASS XHTML1.0 Frameset parsing 𝕜 -PASS XHTML1.0 Frameset parsing 𝒦 -PASS XHTML1.0 Frameset parsing 𝓀 -PASS XHTML1.0 Frameset parsing ⇚ -PASS XHTML1.0 Frameset parsing Ĺ -PASS XHTML1.0 Frameset parsing ĺ -PASS XHTML1.0 Frameset parsing ⦴ -PASS XHTML1.0 Frameset parsing ℒ -PASS XHTML1.0 Frameset parsing Λ -PASS XHTML1.0 Frameset parsing λ -PASS XHTML1.0 Frameset parsing ⟨ -PASS XHTML1.0 Frameset parsing ⟪ -PASS XHTML1.0 Frameset parsing ⦑ -PASS XHTML1.0 Frameset parsing ⟨ -PASS XHTML1.0 Frameset parsing ⪅ -PASS XHTML1.0 Frameset parsing ℒ -PASS XHTML1.0 Frameset parsing « -PASS XHTML1.0 Frameset parsing ⇤ -PASS XHTML1.0 Frameset parsing ⤟ -PASS XHTML1.0 Frameset parsing ← -PASS XHTML1.0 Frameset parsing ↞ -PASS XHTML1.0 Frameset parsing ⇐ -PASS XHTML1.0 Frameset parsing ⤝ -PASS XHTML1.0 Frameset parsing ↩ -PASS XHTML1.0 Frameset parsing ↫ -PASS XHTML1.0 Frameset parsing ⤹ -PASS XHTML1.0 Frameset parsing ⥳ -PASS XHTML1.0 Frameset parsing ↢ -PASS XHTML1.0 Frameset parsing ⤙ -PASS XHTML1.0 Frameset parsing ⤛ -PASS XHTML1.0 Frameset parsing ⪫ -PASS XHTML1.0 Frameset parsing ⪭ -PASS XHTML1.0 Frameset parsing ⪭︀ -PASS XHTML1.0 Frameset parsing ⤌ -PASS XHTML1.0 Frameset parsing ⤎ -PASS XHTML1.0 Frameset parsing ❲ -PASS XHTML1.0 Frameset parsing { -PASS XHTML1.0 Frameset parsing [ -PASS XHTML1.0 Frameset parsing ⦋ -PASS XHTML1.0 Frameset parsing ⦏ -PASS XHTML1.0 Frameset parsing ⦍ -PASS XHTML1.0 Frameset parsing Ľ -PASS XHTML1.0 Frameset parsing ľ -PASS XHTML1.0 Frameset parsing Ļ -PASS XHTML1.0 Frameset parsing ļ -PASS XHTML1.0 Frameset parsing ⌈ -PASS XHTML1.0 Frameset parsing { -PASS XHTML1.0 Frameset parsing Л -PASS XHTML1.0 Frameset parsing л -PASS XHTML1.0 Frameset parsing ⤶ -PASS XHTML1.0 Frameset parsing “ -PASS XHTML1.0 Frameset parsing „ -PASS XHTML1.0 Frameset parsing ⥧ -PASS XHTML1.0 Frameset parsing ⥋ -PASS XHTML1.0 Frameset parsing ↲ -PASS XHTML1.0 Frameset parsing ≤ -PASS XHTML1.0 Frameset parsing ≦ -PASS XHTML1.0 Frameset parsing ⟨ -PASS XHTML1.0 Frameset parsing ⇤ -PASS XHTML1.0 Frameset parsing ← -PASS XHTML1.0 Frameset parsing ← -PASS XHTML1.0 Frameset parsing ⇐ -PASS XHTML1.0 Frameset parsing ⇆ -PASS XHTML1.0 Frameset parsing ↢ -PASS XHTML1.0 Frameset parsing ⌈ -PASS XHTML1.0 Frameset parsing ⟦ -PASS XHTML1.0 Frameset parsing ⥡ -PASS XHTML1.0 Frameset parsing ⥙ -PASS XHTML1.0 Frameset parsing ⇃ -PASS XHTML1.0 Frameset parsing ⌊ -PASS XHTML1.0 Frameset parsing ↽ -PASS XHTML1.0 Frameset parsing ↼ -PASS XHTML1.0 Frameset parsing ⇇ -PASS XHTML1.0 Frameset parsing ↔ -PASS XHTML1.0 Frameset parsing ↔ -PASS XHTML1.0 Frameset parsing ⇔ -PASS XHTML1.0 Frameset parsing ⇆ -PASS XHTML1.0 Frameset parsing ⇋ -PASS XHTML1.0 Frameset parsing ↭ -PASS XHTML1.0 Frameset parsing ⥎ -PASS XHTML1.0 Frameset parsing ↤ -PASS XHTML1.0 Frameset parsing ⊣ -PASS XHTML1.0 Frameset parsing ⥚ -PASS XHTML1.0 Frameset parsing ⋋ -PASS XHTML1.0 Frameset parsing ⧏ -PASS XHTML1.0 Frameset parsing ⊲ -PASS XHTML1.0 Frameset parsing ⊴ -PASS XHTML1.0 Frameset parsing ⥑ -PASS XHTML1.0 Frameset parsing ⥠ -PASS XHTML1.0 Frameset parsing ⥘ -PASS XHTML1.0 Frameset parsing ↿ -PASS XHTML1.0 Frameset parsing ⥒ -PASS XHTML1.0 Frameset parsing ↼ -PASS XHTML1.0 Frameset parsing ⪋ -PASS XHTML1.0 Frameset parsing ⋚ -PASS XHTML1.0 Frameset parsing ≤ -PASS XHTML1.0 Frameset parsing ≦ -PASS XHTML1.0 Frameset parsing ⩽ -PASS XHTML1.0 Frameset parsing ⪨ -PASS XHTML1.0 Frameset parsing ⩽ -PASS XHTML1.0 Frameset parsing ⩿ -PASS XHTML1.0 Frameset parsing ⪁ -PASS XHTML1.0 Frameset parsing ⪃ -PASS XHTML1.0 Frameset parsing ⋚︀ -PASS XHTML1.0 Frameset parsing ⪓ -PASS XHTML1.0 Frameset parsing ⪅ -PASS XHTML1.0 Frameset parsing ⋖ -PASS XHTML1.0 Frameset parsing ⋚ -PASS XHTML1.0 Frameset parsing ⪋ -PASS XHTML1.0 Frameset parsing ⋚ -PASS XHTML1.0 Frameset parsing ≦ -PASS XHTML1.0 Frameset parsing ≶ -PASS XHTML1.0 Frameset parsing ≶ -PASS XHTML1.0 Frameset parsing ⪡ -PASS XHTML1.0 Frameset parsing ≲ -PASS XHTML1.0 Frameset parsing ⩽ -PASS XHTML1.0 Frameset parsing ≲ -PASS XHTML1.0 Frameset parsing ⥼ -PASS XHTML1.0 Frameset parsing ⌊ -PASS XHTML1.0 Frameset parsing 𝔏 -PASS XHTML1.0 Frameset parsing 𝔩 -PASS XHTML1.0 Frameset parsing ≶ -PASS XHTML1.0 Frameset parsing ⪑ -PASS XHTML1.0 Frameset parsing ⥢ -PASS XHTML1.0 Frameset parsing ↽ -PASS XHTML1.0 Frameset parsing ↼ -PASS XHTML1.0 Frameset parsing ⥪ -PASS XHTML1.0 Frameset parsing ▄ -PASS XHTML1.0 Frameset parsing Љ -PASS XHTML1.0 Frameset parsing љ -PASS XHTML1.0 Frameset parsing ⇇ -PASS XHTML1.0 Frameset parsing ≪ -PASS XHTML1.0 Frameset parsing ⋘ -PASS XHTML1.0 Frameset parsing ⌞ -PASS XHTML1.0 Frameset parsing ⇚ -PASS XHTML1.0 Frameset parsing ⥫ -PASS XHTML1.0 Frameset parsing ◺ -PASS XHTML1.0 Frameset parsing Ŀ -PASS XHTML1.0 Frameset parsing ŀ -PASS XHTML1.0 Frameset parsing ⎰ -PASS XHTML1.0 Frameset parsing ⎰ -PASS XHTML1.0 Frameset parsing ⪉ -PASS XHTML1.0 Frameset parsing ⪉ -PASS XHTML1.0 Frameset parsing ⪇ -PASS XHTML1.0 Frameset parsing ≨ -PASS XHTML1.0 Frameset parsing ⪇ -PASS XHTML1.0 Frameset parsing ≨ -PASS XHTML1.0 Frameset parsing ⋦ -PASS XHTML1.0 Frameset parsing ⟬ -PASS XHTML1.0 Frameset parsing ⇽ -PASS XHTML1.0 Frameset parsing ⟦ -PASS XHTML1.0 Frameset parsing ⟵ -PASS XHTML1.0 Frameset parsing ⟵ -PASS XHTML1.0 Frameset parsing ⟸ -PASS XHTML1.0 Frameset parsing ⟷ -PASS XHTML1.0 Frameset parsing ⟷ -PASS XHTML1.0 Frameset parsing ⟺ -PASS XHTML1.0 Frameset parsing ⟼ -PASS XHTML1.0 Frameset parsing ⟶ -PASS XHTML1.0 Frameset parsing ⟶ -PASS XHTML1.0 Frameset parsing ⟹ -PASS XHTML1.0 Frameset parsing ↫ -PASS XHTML1.0 Frameset parsing ↬ -PASS XHTML1.0 Frameset parsing ⦅ -PASS XHTML1.0 Frameset parsing 𝕃 -PASS XHTML1.0 Frameset parsing 𝕝 -PASS XHTML1.0 Frameset parsing ⨭ -PASS XHTML1.0 Frameset parsing ⨴ -PASS XHTML1.0 Frameset parsing ∗ -PASS XHTML1.0 Frameset parsing _ -PASS XHTML1.0 Frameset parsing ↙ -PASS XHTML1.0 Frameset parsing ↘ -PASS XHTML1.0 Frameset parsing ◊ -PASS XHTML1.0 Frameset parsing ◊ -PASS XHTML1.0 Frameset parsing ⧫ -PASS XHTML1.0 Frameset parsing ( -PASS XHTML1.0 Frameset parsing ⦓ -PASS XHTML1.0 Frameset parsing ⇆ -PASS XHTML1.0 Frameset parsing ⌟ -PASS XHTML1.0 Frameset parsing ⇋ -PASS XHTML1.0 Frameset parsing ⥭ -PASS XHTML1.0 Frameset parsing ‎ -PASS XHTML1.0 Frameset parsing ⊿ -PASS XHTML1.0 Frameset parsing ‹ -PASS XHTML1.0 Frameset parsing 𝓁 -PASS XHTML1.0 Frameset parsing ℒ -PASS XHTML1.0 Frameset parsing ↰ -PASS XHTML1.0 Frameset parsing ↰ -PASS XHTML1.0 Frameset parsing ≲ -PASS XHTML1.0 Frameset parsing ⪍ -PASS XHTML1.0 Frameset parsing ⪏ -PASS XHTML1.0 Frameset parsing [ -PASS XHTML1.0 Frameset parsing ‘ -PASS XHTML1.0 Frameset parsing ‚ -PASS XHTML1.0 Frameset parsing Ł -PASS XHTML1.0 Frameset parsing ł -PASS XHTML1.0 Frameset parsing ⪦ -PASS XHTML1.0 Frameset parsing ⩹ -PASS XHTML1.0 Frameset parsing < -FAIL XHTML1.0 Frameset parsing < assert_true: expected true got false -PASS XHTML1.0 Frameset parsing ≪ -PASS XHTML1.0 Frameset parsing ⋖ -PASS XHTML1.0 Frameset parsing ⋋ -PASS XHTML1.0 Frameset parsing ⋉ -PASS XHTML1.0 Frameset parsing ⥶ -PASS XHTML1.0 Frameset parsing ⩻ -PASS XHTML1.0 Frameset parsing ◃ -PASS XHTML1.0 Frameset parsing ⊴ -PASS XHTML1.0 Frameset parsing ◂ -PASS XHTML1.0 Frameset parsing ⦖ -PASS XHTML1.0 Frameset parsing ⥊ -PASS XHTML1.0 Frameset parsing ⥦ -PASS XHTML1.0 Frameset parsing ≨︀ -PASS XHTML1.0 Frameset parsing ≨︀ -PASS XHTML1.0 Frameset parsing ¯ -PASS XHTML1.0 Frameset parsing ♂ -PASS XHTML1.0 Frameset parsing ✠ -PASS XHTML1.0 Frameset parsing ✠ -PASS XHTML1.0 Frameset parsing ⤅ -PASS XHTML1.0 Frameset parsing ↦ -PASS XHTML1.0 Frameset parsing ↦ -PASS XHTML1.0 Frameset parsing ↧ -PASS XHTML1.0 Frameset parsing ↤ -PASS XHTML1.0 Frameset parsing ↥ -PASS XHTML1.0 Frameset parsing ▮ -PASS XHTML1.0 Frameset parsing ⨩ -PASS XHTML1.0 Frameset parsing М -PASS XHTML1.0 Frameset parsing м -PASS XHTML1.0 Frameset parsing — -PASS XHTML1.0 Frameset parsing ∺ -PASS XHTML1.0 Frameset parsing ∡ -PASS XHTML1.0 Frameset parsing   -PASS XHTML1.0 Frameset parsing ℳ -PASS XHTML1.0 Frameset parsing 𝔐 -PASS XHTML1.0 Frameset parsing 𝔪 -PASS XHTML1.0 Frameset parsing ℧ -PASS XHTML1.0 Frameset parsing µ -PASS XHTML1.0 Frameset parsing * -PASS XHTML1.0 Frameset parsing ⫰ -PASS XHTML1.0 Frameset parsing ∣ -PASS XHTML1.0 Frameset parsing · -PASS XHTML1.0 Frameset parsing ⊟ -PASS XHTML1.0 Frameset parsing − -PASS XHTML1.0 Frameset parsing ∸ -PASS XHTML1.0 Frameset parsing ⨪ -PASS XHTML1.0 Frameset parsing ∓ -PASS XHTML1.0 Frameset parsing ⫛ -PASS XHTML1.0 Frameset parsing … -PASS XHTML1.0 Frameset parsing ∓ -PASS XHTML1.0 Frameset parsing ⊧ -PASS XHTML1.0 Frameset parsing 𝕄 -PASS XHTML1.0 Frameset parsing 𝕞 -PASS XHTML1.0 Frameset parsing ∓ -PASS XHTML1.0 Frameset parsing 𝓂 -PASS XHTML1.0 Frameset parsing ℳ -PASS XHTML1.0 Frameset parsing ∾ -PASS XHTML1.0 Frameset parsing Μ -PASS XHTML1.0 Frameset parsing μ -PASS XHTML1.0 Frameset parsing ⊸ -PASS XHTML1.0 Frameset parsing ⊸ -PASS XHTML1.0 Frameset parsing ∇ -PASS XHTML1.0 Frameset parsing Ń -PASS XHTML1.0 Frameset parsing ń -PASS XHTML1.0 Frameset parsing ∠⃒ -PASS XHTML1.0 Frameset parsing ≉ -PASS XHTML1.0 Frameset parsing ⩰̸ -PASS XHTML1.0 Frameset parsing ≋̸ -PASS XHTML1.0 Frameset parsing ʼn -PASS XHTML1.0 Frameset parsing ≉ -PASS XHTML1.0 Frameset parsing ♮ -PASS XHTML1.0 Frameset parsing ℕ -PASS XHTML1.0 Frameset parsing ♮ -PASS XHTML1.0 Frameset parsing -PASS XHTML1.0 Frameset parsing ≎̸ -PASS XHTML1.0 Frameset parsing ≏̸ -PASS XHTML1.0 Frameset parsing ⩃ -PASS XHTML1.0 Frameset parsing Ň -PASS XHTML1.0 Frameset parsing ň -PASS XHTML1.0 Frameset parsing Ņ -PASS XHTML1.0 Frameset parsing ņ -PASS XHTML1.0 Frameset parsing ≇ -PASS XHTML1.0 Frameset parsing ⩭̸ -PASS XHTML1.0 Frameset parsing ⩂ -PASS XHTML1.0 Frameset parsing Н -PASS XHTML1.0 Frameset parsing н -PASS XHTML1.0 Frameset parsing – -PASS XHTML1.0 Frameset parsing ⤤ -PASS XHTML1.0 Frameset parsing ↗ -PASS XHTML1.0 Frameset parsing ⇗ -PASS XHTML1.0 Frameset parsing ↗ -PASS XHTML1.0 Frameset parsing ≠ -PASS XHTML1.0 Frameset parsing ≐̸ -PASS XHTML1.0 Frameset parsing ​ -PASS XHTML1.0 Frameset parsing ​ -PASS XHTML1.0 Frameset parsing ​ -PASS XHTML1.0 Frameset parsing ​ -PASS XHTML1.0 Frameset parsing ≢ -PASS XHTML1.0 Frameset parsing ⤨ -PASS XHTML1.0 Frameset parsing ≂̸ -PASS XHTML1.0 Frameset parsing ≫ -PASS XHTML1.0 Frameset parsing ≪ -PASS XHTML1.0 Frameset parsing 
 -PASS XHTML1.0 Frameset parsing ∄ -PASS XHTML1.0 Frameset parsing ∄ -PASS XHTML1.0 Frameset parsing 𝔑 -PASS XHTML1.0 Frameset parsing 𝔫 -PASS XHTML1.0 Frameset parsing ≧̸ -PASS XHTML1.0 Frameset parsing ≱ -PASS XHTML1.0 Frameset parsing ≱ -PASS XHTML1.0 Frameset parsing ≧̸ -PASS XHTML1.0 Frameset parsing ⩾̸ -PASS XHTML1.0 Frameset parsing ⩾̸ -PASS XHTML1.0 Frameset parsing ⋙̸ -PASS XHTML1.0 Frameset parsing ≵ -PASS XHTML1.0 Frameset parsing ≫⃒ -PASS XHTML1.0 Frameset parsing ≯ -PASS XHTML1.0 Frameset parsing ≯ -PASS XHTML1.0 Frameset parsing ≫̸ -PASS XHTML1.0 Frameset parsing ↮ -PASS XHTML1.0 Frameset parsing ⇎ -PASS XHTML1.0 Frameset parsing ⫲ -PASS XHTML1.0 Frameset parsing ∋ -PASS XHTML1.0 Frameset parsing ⋼ -PASS XHTML1.0 Frameset parsing ⋺ -PASS XHTML1.0 Frameset parsing ∋ -PASS XHTML1.0 Frameset parsing Њ -PASS XHTML1.0 Frameset parsing њ -PASS XHTML1.0 Frameset parsing ↚ -PASS XHTML1.0 Frameset parsing ⇍ -PASS XHTML1.0 Frameset parsing ‥ -PASS XHTML1.0 Frameset parsing ≦̸ -PASS XHTML1.0 Frameset parsing ≰ -PASS XHTML1.0 Frameset parsing ↚ -PASS XHTML1.0 Frameset parsing ⇍ -PASS XHTML1.0 Frameset parsing ↮ -PASS XHTML1.0 Frameset parsing ⇎ -PASS XHTML1.0 Frameset parsing ≰ -PASS XHTML1.0 Frameset parsing ≦̸ -PASS XHTML1.0 Frameset parsing ⩽̸ -PASS XHTML1.0 Frameset parsing ⩽̸ -PASS XHTML1.0 Frameset parsing ≮ -PASS XHTML1.0 Frameset parsing ⋘̸ -PASS XHTML1.0 Frameset parsing ≴ -PASS XHTML1.0 Frameset parsing ≪⃒ -PASS XHTML1.0 Frameset parsing ≮ -PASS XHTML1.0 Frameset parsing ⋪ -PASS XHTML1.0 Frameset parsing ⋬ -PASS XHTML1.0 Frameset parsing ≪̸ -PASS XHTML1.0 Frameset parsing ∤ -PASS XHTML1.0 Frameset parsing ⁠ -PASS XHTML1.0 Frameset parsing   -PASS XHTML1.0 Frameset parsing 𝕟 -PASS XHTML1.0 Frameset parsing ℕ -PASS XHTML1.0 Frameset parsing ⫬ -PASS XHTML1.0 Frameset parsing ¬ -PASS XHTML1.0 Frameset parsing ≢ -PASS XHTML1.0 Frameset parsing ≭ -PASS XHTML1.0 Frameset parsing ∦ -PASS XHTML1.0 Frameset parsing ∉ -PASS XHTML1.0 Frameset parsing ≠ -PASS XHTML1.0 Frameset parsing ≂̸ -PASS XHTML1.0 Frameset parsing ∄ -PASS XHTML1.0 Frameset parsing ≯ -PASS XHTML1.0 Frameset parsing ≱ -PASS XHTML1.0 Frameset parsing ≧̸ -PASS XHTML1.0 Frameset parsing ≫̸ -PASS XHTML1.0 Frameset parsing ≹ -PASS XHTML1.0 Frameset parsing ⩾̸ -PASS XHTML1.0 Frameset parsing ≵ -PASS XHTML1.0 Frameset parsing ≎̸ -PASS XHTML1.0 Frameset parsing ≏̸ -PASS XHTML1.0 Frameset parsing ∉ -PASS XHTML1.0 Frameset parsing ⋵̸ -PASS XHTML1.0 Frameset parsing ⋹̸ -PASS XHTML1.0 Frameset parsing ∉ -PASS XHTML1.0 Frameset parsing ⋷ -PASS XHTML1.0 Frameset parsing ⋶ -PASS XHTML1.0 Frameset parsing ⧏̸ -PASS XHTML1.0 Frameset parsing ⋪ -PASS XHTML1.0 Frameset parsing ⋬ -PASS XHTML1.0 Frameset parsing ≮ -PASS XHTML1.0 Frameset parsing ≰ -PASS XHTML1.0 Frameset parsing ≸ -PASS XHTML1.0 Frameset parsing ≪̸ -PASS XHTML1.0 Frameset parsing ⩽̸ -PASS XHTML1.0 Frameset parsing ≴ -PASS XHTML1.0 Frameset parsing ⪢̸ -PASS XHTML1.0 Frameset parsing ⪡̸ -PASS XHTML1.0 Frameset parsing ∌ -PASS XHTML1.0 Frameset parsing ∌ -PASS XHTML1.0 Frameset parsing ⋾ -PASS XHTML1.0 Frameset parsing ⋽ -PASS XHTML1.0 Frameset parsing ⊀ -PASS XHTML1.0 Frameset parsing ⪯̸ -PASS XHTML1.0 Frameset parsing ⋠ -PASS XHTML1.0 Frameset parsing ∌ -PASS XHTML1.0 Frameset parsing ⧐̸ -PASS XHTML1.0 Frameset parsing ⋫ -PASS XHTML1.0 Frameset parsing ⋭ -PASS XHTML1.0 Frameset parsing ⊏̸ -PASS XHTML1.0 Frameset parsing ⋢ -PASS XHTML1.0 Frameset parsing ⊐̸ -PASS XHTML1.0 Frameset parsing ⋣ -PASS XHTML1.0 Frameset parsing ⊂⃒ -PASS XHTML1.0 Frameset parsing ⊈ -PASS XHTML1.0 Frameset parsing ⊁ -PASS XHTML1.0 Frameset parsing ⪰̸ -PASS XHTML1.0 Frameset parsing ⋡ -PASS XHTML1.0 Frameset parsing ≿̸ -PASS XHTML1.0 Frameset parsing ⊃⃒ -PASS XHTML1.0 Frameset parsing ⊉ -PASS XHTML1.0 Frameset parsing ≁ -PASS XHTML1.0 Frameset parsing ≄ -PASS XHTML1.0 Frameset parsing ≇ -PASS XHTML1.0 Frameset parsing ≉ -PASS XHTML1.0 Frameset parsing ∤ -PASS XHTML1.0 Frameset parsing ∦ -PASS XHTML1.0 Frameset parsing ∦ -PASS XHTML1.0 Frameset parsing ⫽⃥ -PASS XHTML1.0 Frameset parsing ∂̸ -PASS XHTML1.0 Frameset parsing ⨔ -PASS XHTML1.0 Frameset parsing ⊀ -PASS XHTML1.0 Frameset parsing ⋠ -PASS XHTML1.0 Frameset parsing ⊀ -PASS XHTML1.0 Frameset parsing ⪯̸ -PASS XHTML1.0 Frameset parsing ⪯̸ -PASS XHTML1.0 Frameset parsing ⤳̸ -PASS XHTML1.0 Frameset parsing ↛ -PASS XHTML1.0 Frameset parsing ⇏ -PASS XHTML1.0 Frameset parsing ↝̸ -PASS XHTML1.0 Frameset parsing ↛ -PASS XHTML1.0 Frameset parsing ⇏ -PASS XHTML1.0 Frameset parsing ⋫ -PASS XHTML1.0 Frameset parsing ⋭ -PASS XHTML1.0 Frameset parsing ⊁ -PASS XHTML1.0 Frameset parsing ⋡ -PASS XHTML1.0 Frameset parsing ⪰̸ -PASS XHTML1.0 Frameset parsing 𝒩 -PASS XHTML1.0 Frameset parsing 𝓃 -PASS XHTML1.0 Frameset parsing ∤ -PASS XHTML1.0 Frameset parsing ∦ -PASS XHTML1.0 Frameset parsing ≁ -PASS XHTML1.0 Frameset parsing ≄ -PASS XHTML1.0 Frameset parsing ≄ -PASS XHTML1.0 Frameset parsing ∤ -PASS XHTML1.0 Frameset parsing ∦ -PASS XHTML1.0 Frameset parsing ⋢ -PASS XHTML1.0 Frameset parsing ⋣ -PASS XHTML1.0 Frameset parsing ⊄ -PASS XHTML1.0 Frameset parsing ⫅̸ -PASS XHTML1.0 Frameset parsing ⊈ -PASS XHTML1.0 Frameset parsing ⊂⃒ -PASS XHTML1.0 Frameset parsing ⊈ -PASS XHTML1.0 Frameset parsing ⫅̸ -PASS XHTML1.0 Frameset parsing ⊁ -PASS XHTML1.0 Frameset parsing ⪰̸ -PASS XHTML1.0 Frameset parsing ⊅ -PASS XHTML1.0 Frameset parsing ⫆̸ -PASS XHTML1.0 Frameset parsing ⊉ -PASS XHTML1.0 Frameset parsing ⊃⃒ -PASS XHTML1.0 Frameset parsing ⊉ -PASS XHTML1.0 Frameset parsing ⫆̸ -PASS XHTML1.0 Frameset parsing ≹ -PASS XHTML1.0 Frameset parsing Ñ -PASS XHTML1.0 Frameset parsing ñ -PASS XHTML1.0 Frameset parsing ≸ -PASS XHTML1.0 Frameset parsing ⋪ -PASS XHTML1.0 Frameset parsing ⋬ -PASS XHTML1.0 Frameset parsing ⋫ -PASS XHTML1.0 Frameset parsing ⋭ -PASS XHTML1.0 Frameset parsing Ν -PASS XHTML1.0 Frameset parsing ν -PASS XHTML1.0 Frameset parsing # -PASS XHTML1.0 Frameset parsing № -PASS XHTML1.0 Frameset parsing   -PASS XHTML1.0 Frameset parsing ≍⃒ -PASS XHTML1.0 Frameset parsing ⊬ -PASS XHTML1.0 Frameset parsing ⊭ -PASS XHTML1.0 Frameset parsing ⊮ -PASS XHTML1.0 Frameset parsing ⊯ -PASS XHTML1.0 Frameset parsing ≥⃒ -PASS XHTML1.0 Frameset parsing >⃒ -PASS XHTML1.0 Frameset parsing ⤄ -PASS XHTML1.0 Frameset parsing ⧞ -PASS XHTML1.0 Frameset parsing ⤂ -PASS XHTML1.0 Frameset parsing ≤⃒ -FAIL XHTML1.0 Frameset parsing <⃒ assert_equals: XHTML1.0 Frameset parsing the entity reference caused a parse error; expected 3 but got 1 -PASS XHTML1.0 Frameset parsing ⊴⃒ -PASS XHTML1.0 Frameset parsing ⤃ -PASS XHTML1.0 Frameset parsing ⊵⃒ -PASS XHTML1.0 Frameset parsing ∼⃒ -PASS XHTML1.0 Frameset parsing ⤣ -PASS XHTML1.0 Frameset parsing ↖ -PASS XHTML1.0 Frameset parsing ⇖ -PASS XHTML1.0 Frameset parsing ↖ -PASS XHTML1.0 Frameset parsing ⤧ -PASS XHTML1.0 Frameset parsing Ó -PASS XHTML1.0 Frameset parsing ó -PASS XHTML1.0 Frameset parsing ⊛ -PASS XHTML1.0 Frameset parsing Ô -PASS XHTML1.0 Frameset parsing ô -PASS XHTML1.0 Frameset parsing ⊚ -PASS XHTML1.0 Frameset parsing О -PASS XHTML1.0 Frameset parsing о -PASS XHTML1.0 Frameset parsing ⊝ -PASS XHTML1.0 Frameset parsing Ő -PASS XHTML1.0 Frameset parsing ő -PASS XHTML1.0 Frameset parsing ⨸ -PASS XHTML1.0 Frameset parsing ⊙ -PASS XHTML1.0 Frameset parsing ⦼ -PASS XHTML1.0 Frameset parsing Œ -PASS XHTML1.0 Frameset parsing œ -PASS XHTML1.0 Frameset parsing ⦿ -PASS XHTML1.0 Frameset parsing 𝔒 -PASS XHTML1.0 Frameset parsing 𝔬 -PASS XHTML1.0 Frameset parsing ˛ -PASS XHTML1.0 Frameset parsing Ò -PASS XHTML1.0 Frameset parsing ò -PASS XHTML1.0 Frameset parsing ⧁ -PASS XHTML1.0 Frameset parsing ⦵ -PASS XHTML1.0 Frameset parsing Ω -PASS XHTML1.0 Frameset parsing ∮ -PASS XHTML1.0 Frameset parsing ↺ -PASS XHTML1.0 Frameset parsing ⦾ -PASS XHTML1.0 Frameset parsing ⦻ -PASS XHTML1.0 Frameset parsing ‾ -PASS XHTML1.0 Frameset parsing ⧀ -PASS XHTML1.0 Frameset parsing Ō -PASS XHTML1.0 Frameset parsing ō -PASS XHTML1.0 Frameset parsing Ω -PASS XHTML1.0 Frameset parsing ω -PASS XHTML1.0 Frameset parsing Ο -PASS XHTML1.0 Frameset parsing ο -PASS XHTML1.0 Frameset parsing ⦶ -PASS XHTML1.0 Frameset parsing ⊖ -PASS XHTML1.0 Frameset parsing 𝕆 -PASS XHTML1.0 Frameset parsing 𝕠 -PASS XHTML1.0 Frameset parsing ⦷ -PASS XHTML1.0 Frameset parsing “ -PASS XHTML1.0 Frameset parsing ‘ -PASS XHTML1.0 Frameset parsing ⦹ -PASS XHTML1.0 Frameset parsing ⊕ -PASS XHTML1.0 Frameset parsing ↻ -PASS XHTML1.0 Frameset parsing ⩔ -PASS XHTML1.0 Frameset parsing ∨ -PASS XHTML1.0 Frameset parsing ⩝ -PASS XHTML1.0 Frameset parsing ℴ -PASS XHTML1.0 Frameset parsing ℴ -PASS XHTML1.0 Frameset parsing ª -PASS XHTML1.0 Frameset parsing º -PASS XHTML1.0 Frameset parsing ⊶ -PASS XHTML1.0 Frameset parsing ⩖ -PASS XHTML1.0 Frameset parsing ⩗ -PASS XHTML1.0 Frameset parsing ⩛ -PASS XHTML1.0 Frameset parsing Ⓢ -PASS XHTML1.0 Frameset parsing 𝒪 -PASS XHTML1.0 Frameset parsing ℴ -PASS XHTML1.0 Frameset parsing Ø -PASS XHTML1.0 Frameset parsing ø -PASS XHTML1.0 Frameset parsing ⊘ -PASS XHTML1.0 Frameset parsing Õ -PASS XHTML1.0 Frameset parsing õ -PASS XHTML1.0 Frameset parsing ⨶ -PASS XHTML1.0 Frameset parsing ⨷ -PASS XHTML1.0 Frameset parsing ⊗ -PASS XHTML1.0 Frameset parsing Ö -PASS XHTML1.0 Frameset parsing ö -PASS XHTML1.0 Frameset parsing ⌽ -PASS XHTML1.0 Frameset parsing ‾ -PASS XHTML1.0 Frameset parsing ⏞ -PASS XHTML1.0 Frameset parsing ⎴ -PASS XHTML1.0 Frameset parsing ⏜ -PASS XHTML1.0 Frameset parsing ¶ -PASS XHTML1.0 Frameset parsing ∥ -PASS XHTML1.0 Frameset parsing ∥ -PASS XHTML1.0 Frameset parsing ⫳ -PASS XHTML1.0 Frameset parsing ⫽ -PASS XHTML1.0 Frameset parsing ∂ -PASS XHTML1.0 Frameset parsing ∂ -PASS XHTML1.0 Frameset parsing П -PASS XHTML1.0 Frameset parsing п -PASS XHTML1.0 Frameset parsing % -PASS XHTML1.0 Frameset parsing . -PASS XHTML1.0 Frameset parsing ‰ -PASS XHTML1.0 Frameset parsing ⊥ -PASS XHTML1.0 Frameset parsing ‱ -PASS XHTML1.0 Frameset parsing 𝔓 -PASS XHTML1.0 Frameset parsing 𝔭 -PASS XHTML1.0 Frameset parsing Φ -PASS XHTML1.0 Frameset parsing φ -PASS XHTML1.0 Frameset parsing ϕ -PASS XHTML1.0 Frameset parsing ℳ -PASS XHTML1.0 Frameset parsing ☎ -PASS XHTML1.0 Frameset parsing Π -PASS XHTML1.0 Frameset parsing π -PASS XHTML1.0 Frameset parsing ⋔ -PASS XHTML1.0 Frameset parsing ϖ -PASS XHTML1.0 Frameset parsing ℏ -PASS XHTML1.0 Frameset parsing ℎ -PASS XHTML1.0 Frameset parsing ℏ -PASS XHTML1.0 Frameset parsing ⨣ -PASS XHTML1.0 Frameset parsing ⊞ -PASS XHTML1.0 Frameset parsing ⨢ -PASS XHTML1.0 Frameset parsing + -PASS XHTML1.0 Frameset parsing ∔ -PASS XHTML1.0 Frameset parsing ⨥ -PASS XHTML1.0 Frameset parsing ⩲ -PASS XHTML1.0 Frameset parsing ± -PASS XHTML1.0 Frameset parsing ± -PASS XHTML1.0 Frameset parsing ⨦ -PASS XHTML1.0 Frameset parsing ⨧ -PASS XHTML1.0 Frameset parsing ± -PASS XHTML1.0 Frameset parsing ℌ -PASS XHTML1.0 Frameset parsing ⨕ -PASS XHTML1.0 Frameset parsing 𝕡 -PASS XHTML1.0 Frameset parsing ℙ -PASS XHTML1.0 Frameset parsing £ -PASS XHTML1.0 Frameset parsing ⪷ -PASS XHTML1.0 Frameset parsing ⪻ -PASS XHTML1.0 Frameset parsing ≺ -PASS XHTML1.0 Frameset parsing ≼ -PASS XHTML1.0 Frameset parsing ⪷ -PASS XHTML1.0 Frameset parsing ≺ -PASS XHTML1.0 Frameset parsing ≼ -PASS XHTML1.0 Frameset parsing ≺ -PASS XHTML1.0 Frameset parsing ⪯ -PASS XHTML1.0 Frameset parsing ≼ -PASS XHTML1.0 Frameset parsing ≾ -PASS XHTML1.0 Frameset parsing ⪯ -PASS XHTML1.0 Frameset parsing ⪹ -PASS XHTML1.0 Frameset parsing ⪵ -PASS XHTML1.0 Frameset parsing ⋨ -PASS XHTML1.0 Frameset parsing ⪯ -PASS XHTML1.0 Frameset parsing ⪳ -PASS XHTML1.0 Frameset parsing ≾ -PASS XHTML1.0 Frameset parsing ′ -PASS XHTML1.0 Frameset parsing ″ -PASS XHTML1.0 Frameset parsing ℙ -PASS XHTML1.0 Frameset parsing ⪹ -PASS XHTML1.0 Frameset parsing ⪵ -PASS XHTML1.0 Frameset parsing ⋨ -PASS XHTML1.0 Frameset parsing ∏ -PASS XHTML1.0 Frameset parsing ∏ -PASS XHTML1.0 Frameset parsing ⌮ -PASS XHTML1.0 Frameset parsing ⌒ -PASS XHTML1.0 Frameset parsing ⌓ -PASS XHTML1.0 Frameset parsing ∝ -PASS XHTML1.0 Frameset parsing ∝ -PASS XHTML1.0 Frameset parsing ∷ -PASS XHTML1.0 Frameset parsing ∝ -PASS XHTML1.0 Frameset parsing ≾ -PASS XHTML1.0 Frameset parsing ⊰ -PASS XHTML1.0 Frameset parsing 𝒫 -PASS XHTML1.0 Frameset parsing 𝓅 -PASS XHTML1.0 Frameset parsing Ψ -PASS XHTML1.0 Frameset parsing ψ -PASS XHTML1.0 Frameset parsing   -PASS XHTML1.0 Frameset parsing 𝔔 -PASS XHTML1.0 Frameset parsing 𝔮 -PASS XHTML1.0 Frameset parsing ⨌ -PASS XHTML1.0 Frameset parsing 𝕢 -PASS XHTML1.0 Frameset parsing ℚ -PASS XHTML1.0 Frameset parsing ⁗ -PASS XHTML1.0 Frameset parsing 𝒬 -PASS XHTML1.0 Frameset parsing 𝓆 -PASS XHTML1.0 Frameset parsing ℍ -PASS XHTML1.0 Frameset parsing ⨖ -PASS XHTML1.0 Frameset parsing ? -PASS XHTML1.0 Frameset parsing ≟ -PASS XHTML1.0 Frameset parsing " -PASS XHTML1.0 Frameset parsing " -PASS XHTML1.0 Frameset parsing ⇛ -PASS XHTML1.0 Frameset parsing ∽̱ -PASS XHTML1.0 Frameset parsing Ŕ -PASS XHTML1.0 Frameset parsing ŕ -PASS XHTML1.0 Frameset parsing √ -PASS XHTML1.0 Frameset parsing ⦳ -PASS XHTML1.0 Frameset parsing ⟩ -PASS XHTML1.0 Frameset parsing ⟫ -PASS XHTML1.0 Frameset parsing ⦒ -PASS XHTML1.0 Frameset parsing ⦥ -PASS XHTML1.0 Frameset parsing ⟩ -PASS XHTML1.0 Frameset parsing » -PASS XHTML1.0 Frameset parsing ⥵ -PASS XHTML1.0 Frameset parsing ⇥ -PASS XHTML1.0 Frameset parsing ⤠ -PASS XHTML1.0 Frameset parsing ⤳ -PASS XHTML1.0 Frameset parsing → -PASS XHTML1.0 Frameset parsing ↠ -PASS XHTML1.0 Frameset parsing ⇒ -PASS XHTML1.0 Frameset parsing ⤞ -PASS XHTML1.0 Frameset parsing ↪ -PASS XHTML1.0 Frameset parsing ↬ -PASS XHTML1.0 Frameset parsing ⥅ -PASS XHTML1.0 Frameset parsing ⥴ -PASS XHTML1.0 Frameset parsing ⤖ -PASS XHTML1.0 Frameset parsing ↣ -PASS XHTML1.0 Frameset parsing ↝ -PASS XHTML1.0 Frameset parsing ⤚ -PASS XHTML1.0 Frameset parsing ⤜ -PASS XHTML1.0 Frameset parsing ∶ -PASS XHTML1.0 Frameset parsing ℚ -PASS XHTML1.0 Frameset parsing ⤍ -PASS XHTML1.0 Frameset parsing ⤏ -PASS XHTML1.0 Frameset parsing ⤐ -PASS XHTML1.0 Frameset parsing ❳ -PASS XHTML1.0 Frameset parsing } -PASS XHTML1.0 Frameset parsing ] -PASS XHTML1.0 Frameset parsing ⦌ -PASS XHTML1.0 Frameset parsing ⦎ -PASS XHTML1.0 Frameset parsing ⦐ -PASS XHTML1.0 Frameset parsing Ř -PASS XHTML1.0 Frameset parsing ř -PASS XHTML1.0 Frameset parsing Ŗ -PASS XHTML1.0 Frameset parsing ŗ -PASS XHTML1.0 Frameset parsing ⌉ -PASS XHTML1.0 Frameset parsing } -PASS XHTML1.0 Frameset parsing Р -PASS XHTML1.0 Frameset parsing р -PASS XHTML1.0 Frameset parsing ⤷ -PASS XHTML1.0 Frameset parsing ⥩ -PASS XHTML1.0 Frameset parsing ” -PASS XHTML1.0 Frameset parsing ” -PASS XHTML1.0 Frameset parsing ↳ -PASS XHTML1.0 Frameset parsing ℜ -PASS XHTML1.0 Frameset parsing ℛ -PASS XHTML1.0 Frameset parsing ℜ -PASS XHTML1.0 Frameset parsing ℝ -PASS XHTML1.0 Frameset parsing ℜ -PASS XHTML1.0 Frameset parsing ▭ -PASS XHTML1.0 Frameset parsing ® -PASS XHTML1.0 Frameset parsing ® -PASS XHTML1.0 Frameset parsing ∋ -PASS XHTML1.0 Frameset parsing ⇋ -PASS XHTML1.0 Frameset parsing ⥯ -PASS XHTML1.0 Frameset parsing ⥽ -PASS XHTML1.0 Frameset parsing ⌋ -PASS XHTML1.0 Frameset parsing 𝔯 -PASS XHTML1.0 Frameset parsing ℜ -PASS XHTML1.0 Frameset parsing ⥤ -PASS XHTML1.0 Frameset parsing ⇁ -PASS XHTML1.0 Frameset parsing ⇀ -PASS XHTML1.0 Frameset parsing ⥬ -PASS XHTML1.0 Frameset parsing Ρ -PASS XHTML1.0 Frameset parsing ρ -PASS XHTML1.0 Frameset parsing ϱ -PASS XHTML1.0 Frameset parsing ⟩ -PASS XHTML1.0 Frameset parsing ⇥ -PASS XHTML1.0 Frameset parsing → -PASS XHTML1.0 Frameset parsing → -PASS XHTML1.0 Frameset parsing ⇒ -PASS XHTML1.0 Frameset parsing ⇄ -PASS XHTML1.0 Frameset parsing ↣ -PASS XHTML1.0 Frameset parsing ⌉ -PASS XHTML1.0 Frameset parsing ⟧ -PASS XHTML1.0 Frameset parsing ⥝ -PASS XHTML1.0 Frameset parsing ⥕ -PASS XHTML1.0 Frameset parsing ⇂ -PASS XHTML1.0 Frameset parsing ⌋ -PASS XHTML1.0 Frameset parsing ⇁ -PASS XHTML1.0 Frameset parsing ⇀ -PASS XHTML1.0 Frameset parsing ⇄ -PASS XHTML1.0 Frameset parsing ⇌ -PASS XHTML1.0 Frameset parsing ⇉ -PASS XHTML1.0 Frameset parsing ↝ -PASS XHTML1.0 Frameset parsing ↦ -PASS XHTML1.0 Frameset parsing ⊢ -PASS XHTML1.0 Frameset parsing ⥛ -PASS XHTML1.0 Frameset parsing ⋌ -PASS XHTML1.0 Frameset parsing ⧐ -PASS XHTML1.0 Frameset parsing ⊳ -PASS XHTML1.0 Frameset parsing ⊵ -PASS XHTML1.0 Frameset parsing ⥏ -PASS XHTML1.0 Frameset parsing ⥜ -PASS XHTML1.0 Frameset parsing ⥔ -PASS XHTML1.0 Frameset parsing ↾ -PASS XHTML1.0 Frameset parsing ⥓ -PASS XHTML1.0 Frameset parsing ⇀ -PASS XHTML1.0 Frameset parsing ˚ -PASS XHTML1.0 Frameset parsing ≓ -PASS XHTML1.0 Frameset parsing ⇄ -PASS XHTML1.0 Frameset parsing ⇌ -PASS XHTML1.0 Frameset parsing ‏ -PASS XHTML1.0 Frameset parsing ⎱ -PASS XHTML1.0 Frameset parsing ⎱ -PASS XHTML1.0 Frameset parsing ⫮ -PASS XHTML1.0 Frameset parsing ⟭ -PASS XHTML1.0 Frameset parsing ⇾ -PASS XHTML1.0 Frameset parsing ⟧ -PASS XHTML1.0 Frameset parsing ⦆ -PASS XHTML1.0 Frameset parsing 𝕣 -PASS XHTML1.0 Frameset parsing ℝ -PASS XHTML1.0 Frameset parsing ⨮ -PASS XHTML1.0 Frameset parsing ⨵ -PASS XHTML1.0 Frameset parsing ⥰ -PASS XHTML1.0 Frameset parsing ) -PASS XHTML1.0 Frameset parsing ⦔ -PASS XHTML1.0 Frameset parsing ⨒ -PASS XHTML1.0 Frameset parsing ⇉ -PASS XHTML1.0 Frameset parsing ⇛ -PASS XHTML1.0 Frameset parsing › -PASS XHTML1.0 Frameset parsing 𝓇 -PASS XHTML1.0 Frameset parsing ℛ -PASS XHTML1.0 Frameset parsing ↱ -PASS XHTML1.0 Frameset parsing ↱ -PASS XHTML1.0 Frameset parsing ] -PASS XHTML1.0 Frameset parsing ’ -PASS XHTML1.0 Frameset parsing ’ -PASS XHTML1.0 Frameset parsing ⋌ -PASS XHTML1.0 Frameset parsing ⋊ -PASS XHTML1.0 Frameset parsing ▹ -PASS XHTML1.0 Frameset parsing ⊵ -PASS XHTML1.0 Frameset parsing ▸ -PASS XHTML1.0 Frameset parsing ⧎ -PASS XHTML1.0 Frameset parsing ⧴ -PASS XHTML1.0 Frameset parsing ⥨ -PASS XHTML1.0 Frameset parsing ℞ -PASS XHTML1.0 Frameset parsing Ś -PASS XHTML1.0 Frameset parsing ś -PASS XHTML1.0 Frameset parsing ‚ -PASS XHTML1.0 Frameset parsing ⪸ -PASS XHTML1.0 Frameset parsing Š -PASS XHTML1.0 Frameset parsing š -PASS XHTML1.0 Frameset parsing ⪼ -PASS XHTML1.0 Frameset parsing ≻ -PASS XHTML1.0 Frameset parsing ≽ -PASS XHTML1.0 Frameset parsing ⪰ -PASS XHTML1.0 Frameset parsing ⪴ -PASS XHTML1.0 Frameset parsing Ş -PASS XHTML1.0 Frameset parsing ş -PASS XHTML1.0 Frameset parsing Ŝ -PASS XHTML1.0 Frameset parsing ŝ -PASS XHTML1.0 Frameset parsing ⪺ -PASS XHTML1.0 Frameset parsing ⪶ -PASS XHTML1.0 Frameset parsing ⋩ -PASS XHTML1.0 Frameset parsing ⨓ -PASS XHTML1.0 Frameset parsing ≿ -PASS XHTML1.0 Frameset parsing С -PASS XHTML1.0 Frameset parsing с -PASS XHTML1.0 Frameset parsing ⊡ -PASS XHTML1.0 Frameset parsing ⋅ -PASS XHTML1.0 Frameset parsing ⩦ -PASS XHTML1.0 Frameset parsing ⤥ -PASS XHTML1.0 Frameset parsing ↘ -PASS XHTML1.0 Frameset parsing ⇘ -PASS XHTML1.0 Frameset parsing ↘ -PASS XHTML1.0 Frameset parsing § -PASS XHTML1.0 Frameset parsing ; -PASS XHTML1.0 Frameset parsing ⤩ -PASS XHTML1.0 Frameset parsing ∖ -PASS XHTML1.0 Frameset parsing ∖ -PASS XHTML1.0 Frameset parsing ✶ -PASS XHTML1.0 Frameset parsing 𝔖 -PASS XHTML1.0 Frameset parsing 𝔰 -PASS XHTML1.0 Frameset parsing ⌢ -PASS XHTML1.0 Frameset parsing ♯ -PASS XHTML1.0 Frameset parsing Щ -PASS XHTML1.0 Frameset parsing щ -PASS XHTML1.0 Frameset parsing Ш -PASS XHTML1.0 Frameset parsing ш -PASS XHTML1.0 Frameset parsing ↓ -PASS XHTML1.0 Frameset parsing ← -PASS XHTML1.0 Frameset parsing ∣ -PASS XHTML1.0 Frameset parsing ∥ -PASS XHTML1.0 Frameset parsing → -PASS XHTML1.0 Frameset parsing ↑ -PASS XHTML1.0 Frameset parsing ­ -PASS XHTML1.0 Frameset parsing Σ -PASS XHTML1.0 Frameset parsing σ -PASS XHTML1.0 Frameset parsing ς -PASS XHTML1.0 Frameset parsing ς -PASS XHTML1.0 Frameset parsing ∼ -PASS XHTML1.0 Frameset parsing ⩪ -PASS XHTML1.0 Frameset parsing ≃ -PASS XHTML1.0 Frameset parsing ≃ -PASS XHTML1.0 Frameset parsing ⪞ -PASS XHTML1.0 Frameset parsing ⪠ -PASS XHTML1.0 Frameset parsing ⪝ -PASS XHTML1.0 Frameset parsing ⪟ -PASS XHTML1.0 Frameset parsing ≆ -PASS XHTML1.0 Frameset parsing ⨤ -PASS XHTML1.0 Frameset parsing ⥲ -PASS XHTML1.0 Frameset parsing ← -PASS XHTML1.0 Frameset parsing ∘ -PASS XHTML1.0 Frameset parsing ∖ -PASS XHTML1.0 Frameset parsing ⨳ -PASS XHTML1.0 Frameset parsing ⧤ -PASS XHTML1.0 Frameset parsing ∣ -PASS XHTML1.0 Frameset parsing ⌣ -PASS XHTML1.0 Frameset parsing ⪪ -PASS XHTML1.0 Frameset parsing ⪬ -PASS XHTML1.0 Frameset parsing ⪬︀ -PASS XHTML1.0 Frameset parsing Ь -PASS XHTML1.0 Frameset parsing ь -PASS XHTML1.0 Frameset parsing ⌿ -PASS XHTML1.0 Frameset parsing ⧄ -PASS XHTML1.0 Frameset parsing / -PASS XHTML1.0 Frameset parsing 𝕊 -PASS XHTML1.0 Frameset parsing 𝕤 -PASS XHTML1.0 Frameset parsing ♠ -PASS XHTML1.0 Frameset parsing ♠ -PASS XHTML1.0 Frameset parsing ∥ -PASS XHTML1.0 Frameset parsing ⊓ -PASS XHTML1.0 Frameset parsing ⊓︀ -PASS XHTML1.0 Frameset parsing ⊔ -PASS XHTML1.0 Frameset parsing ⊔︀ -PASS XHTML1.0 Frameset parsing √ -PASS XHTML1.0 Frameset parsing ⊏ -PASS XHTML1.0 Frameset parsing ⊑ -PASS XHTML1.0 Frameset parsing ⊏ -PASS XHTML1.0 Frameset parsing ⊑ -PASS XHTML1.0 Frameset parsing ⊐ -PASS XHTML1.0 Frameset parsing ⊒ -PASS XHTML1.0 Frameset parsing ⊐ -PASS XHTML1.0 Frameset parsing ⊒ -PASS XHTML1.0 Frameset parsing □ -PASS XHTML1.0 Frameset parsing □ -PASS XHTML1.0 Frameset parsing ⊓ -PASS XHTML1.0 Frameset parsing ⊏ -PASS XHTML1.0 Frameset parsing ⊑ -PASS XHTML1.0 Frameset parsing ⊐ -PASS XHTML1.0 Frameset parsing ⊒ -PASS XHTML1.0 Frameset parsing ⊔ -PASS XHTML1.0 Frameset parsing ▪ -PASS XHTML1.0 Frameset parsing □ -PASS XHTML1.0 Frameset parsing ▪ -PASS XHTML1.0 Frameset parsing → -PASS XHTML1.0 Frameset parsing 𝒮 -PASS XHTML1.0 Frameset parsing 𝓈 -PASS XHTML1.0 Frameset parsing ∖ -PASS XHTML1.0 Frameset parsing ⌣ -PASS XHTML1.0 Frameset parsing ⋆ -PASS XHTML1.0 Frameset parsing ⋆ -PASS XHTML1.0 Frameset parsing ☆ -PASS XHTML1.0 Frameset parsing ★ -PASS XHTML1.0 Frameset parsing ϵ -PASS XHTML1.0 Frameset parsing ϕ -PASS XHTML1.0 Frameset parsing ¯ -PASS XHTML1.0 Frameset parsing ⊂ -PASS XHTML1.0 Frameset parsing ⋐ -PASS XHTML1.0 Frameset parsing ⪽ -PASS XHTML1.0 Frameset parsing ⫅ -PASS XHTML1.0 Frameset parsing ⊆ -PASS XHTML1.0 Frameset parsing ⫃ -PASS XHTML1.0 Frameset parsing ⫁ -PASS XHTML1.0 Frameset parsing ⫋ -PASS XHTML1.0 Frameset parsing ⊊ -PASS XHTML1.0 Frameset parsing ⪿ -PASS XHTML1.0 Frameset parsing ⥹ -PASS XHTML1.0 Frameset parsing ⊂ -PASS XHTML1.0 Frameset parsing ⋐ -PASS XHTML1.0 Frameset parsing ⊆ -PASS XHTML1.0 Frameset parsing ⫅ -PASS XHTML1.0 Frameset parsing ⊆ -PASS XHTML1.0 Frameset parsing ⊊ -PASS XHTML1.0 Frameset parsing ⫋ -PASS XHTML1.0 Frameset parsing ⫇ -PASS XHTML1.0 Frameset parsing ⫕ -PASS XHTML1.0 Frameset parsing ⫓ -PASS XHTML1.0 Frameset parsing ⪸ -PASS XHTML1.0 Frameset parsing ≻ -PASS XHTML1.0 Frameset parsing ≽ -PASS XHTML1.0 Frameset parsing ≻ -PASS XHTML1.0 Frameset parsing ⪰ -PASS XHTML1.0 Frameset parsing ≽ -PASS XHTML1.0 Frameset parsing ≿ -PASS XHTML1.0 Frameset parsing ⪰ -PASS XHTML1.0 Frameset parsing ⪺ -PASS XHTML1.0 Frameset parsing ⪶ -PASS XHTML1.0 Frameset parsing ⋩ -PASS XHTML1.0 Frameset parsing ≿ -PASS XHTML1.0 Frameset parsing ∋ -PASS XHTML1.0 Frameset parsing ∑ -PASS XHTML1.0 Frameset parsing ∑ -PASS XHTML1.0 Frameset parsing ♪ -PASS XHTML1.0 Frameset parsing ¹ -PASS XHTML1.0 Frameset parsing ² -PASS XHTML1.0 Frameset parsing ³ -PASS XHTML1.0 Frameset parsing ⊃ -PASS XHTML1.0 Frameset parsing ⋑ -PASS XHTML1.0 Frameset parsing ⪾ -PASS XHTML1.0 Frameset parsing ⫘ -PASS XHTML1.0 Frameset parsing ⫆ -PASS XHTML1.0 Frameset parsing ⊇ -PASS XHTML1.0 Frameset parsing ⫄ -PASS XHTML1.0 Frameset parsing ⊃ -PASS XHTML1.0 Frameset parsing ⊇ -PASS XHTML1.0 Frameset parsing ⟉ -PASS XHTML1.0 Frameset parsing ⫗ -PASS XHTML1.0 Frameset parsing ⥻ -PASS XHTML1.0 Frameset parsing ⫂ -PASS XHTML1.0 Frameset parsing ⫌ -PASS XHTML1.0 Frameset parsing ⊋ -PASS XHTML1.0 Frameset parsing ⫀ -PASS XHTML1.0 Frameset parsing ⊃ -PASS XHTML1.0 Frameset parsing ⋑ -PASS XHTML1.0 Frameset parsing ⊇ -PASS XHTML1.0 Frameset parsing ⫆ -PASS XHTML1.0 Frameset parsing ⊋ -PASS XHTML1.0 Frameset parsing ⫌ -PASS XHTML1.0 Frameset parsing ⫈ -PASS XHTML1.0 Frameset parsing ⫔ -PASS XHTML1.0 Frameset parsing ⫖ -PASS XHTML1.0 Frameset parsing ⤦ -PASS XHTML1.0 Frameset parsing ↙ -PASS XHTML1.0 Frameset parsing ⇙ -PASS XHTML1.0 Frameset parsing ↙ -PASS XHTML1.0 Frameset parsing ⤪ -PASS XHTML1.0 Frameset parsing ß -PASS XHTML1.0 Frameset parsing 	 -PASS XHTML1.0 Frameset parsing ⌖ -PASS XHTML1.0 Frameset parsing Τ -PASS XHTML1.0 Frameset parsing τ -PASS XHTML1.0 Frameset parsing ⎴ -PASS XHTML1.0 Frameset parsing Ť -PASS XHTML1.0 Frameset parsing ť -PASS XHTML1.0 Frameset parsing Ţ -PASS XHTML1.0 Frameset parsing ţ -PASS XHTML1.0 Frameset parsing Т -PASS XHTML1.0 Frameset parsing т -PASS XHTML1.0 Frameset parsing ⃛ -PASS XHTML1.0 Frameset parsing ⌕ -PASS XHTML1.0 Frameset parsing 𝔗 -PASS XHTML1.0 Frameset parsing 𝔱 -PASS XHTML1.0 Frameset parsing ∴ -PASS XHTML1.0 Frameset parsing ∴ -PASS XHTML1.0 Frameset parsing ∴ -PASS XHTML1.0 Frameset parsing Θ -PASS XHTML1.0 Frameset parsing θ -PASS XHTML1.0 Frameset parsing ϑ -PASS XHTML1.0 Frameset parsing ϑ -PASS XHTML1.0 Frameset parsing ≈ -PASS XHTML1.0 Frameset parsing ∼ -PASS XHTML1.0 Frameset parsing    -PASS XHTML1.0 Frameset parsing   -PASS XHTML1.0 Frameset parsing   -PASS XHTML1.0 Frameset parsing ≈ -PASS XHTML1.0 Frameset parsing ∼ -PASS XHTML1.0 Frameset parsing Þ -PASS XHTML1.0 Frameset parsing þ -PASS XHTML1.0 Frameset parsing ˜ -PASS XHTML1.0 Frameset parsing ∼ -PASS XHTML1.0 Frameset parsing ≃ -PASS XHTML1.0 Frameset parsing ≅ -PASS XHTML1.0 Frameset parsing ≈ -PASS XHTML1.0 Frameset parsing ⨱ -PASS XHTML1.0 Frameset parsing ⊠ -PASS XHTML1.0 Frameset parsing × -PASS XHTML1.0 Frameset parsing ⨰ -PASS XHTML1.0 Frameset parsing ∭ -PASS XHTML1.0 Frameset parsing ⤨ -PASS XHTML1.0 Frameset parsing ⌶ -PASS XHTML1.0 Frameset parsing ⫱ -PASS XHTML1.0 Frameset parsing ⊤ -PASS XHTML1.0 Frameset parsing 𝕋 -PASS XHTML1.0 Frameset parsing 𝕥 -PASS XHTML1.0 Frameset parsing ⫚ -PASS XHTML1.0 Frameset parsing ⤩ -PASS XHTML1.0 Frameset parsing ‴ -PASS XHTML1.0 Frameset parsing ™ -PASS XHTML1.0 Frameset parsing ™ -PASS XHTML1.0 Frameset parsing ▵ -PASS XHTML1.0 Frameset parsing ▿ -PASS XHTML1.0 Frameset parsing ◃ -PASS XHTML1.0 Frameset parsing ⊴ -PASS XHTML1.0 Frameset parsing ≜ -PASS XHTML1.0 Frameset parsing ▹ -PASS XHTML1.0 Frameset parsing ⊵ -PASS XHTML1.0 Frameset parsing ◬ -PASS XHTML1.0 Frameset parsing ≜ -PASS XHTML1.0 Frameset parsing ⨺ -PASS XHTML1.0 Frameset parsing ⃛ -PASS XHTML1.0 Frameset parsing ⨹ -PASS XHTML1.0 Frameset parsing ⧍ -PASS XHTML1.0 Frameset parsing ⨻ -PASS XHTML1.0 Frameset parsing ⏢ -PASS XHTML1.0 Frameset parsing 𝒯 -PASS XHTML1.0 Frameset parsing 𝓉 -PASS XHTML1.0 Frameset parsing Ц -PASS XHTML1.0 Frameset parsing ц -PASS XHTML1.0 Frameset parsing Ћ -PASS XHTML1.0 Frameset parsing ћ -PASS XHTML1.0 Frameset parsing Ŧ -PASS XHTML1.0 Frameset parsing ŧ -PASS XHTML1.0 Frameset parsing ≬ -PASS XHTML1.0 Frameset parsing ↞ -PASS XHTML1.0 Frameset parsing ↠ -PASS XHTML1.0 Frameset parsing Ú -PASS XHTML1.0 Frameset parsing ú -PASS XHTML1.0 Frameset parsing ↑ -PASS XHTML1.0 Frameset parsing ↟ -PASS XHTML1.0 Frameset parsing ⇑ -PASS XHTML1.0 Frameset parsing ⥉ -PASS XHTML1.0 Frameset parsing Ў -PASS XHTML1.0 Frameset parsing ў -PASS XHTML1.0 Frameset parsing Ŭ -PASS XHTML1.0 Frameset parsing ŭ -PASS XHTML1.0 Frameset parsing Û -PASS XHTML1.0 Frameset parsing û -PASS XHTML1.0 Frameset parsing У -PASS XHTML1.0 Frameset parsing у -PASS XHTML1.0 Frameset parsing ⇅ -PASS XHTML1.0 Frameset parsing Ű -PASS XHTML1.0 Frameset parsing ű -PASS XHTML1.0 Frameset parsing ⥮ -PASS XHTML1.0 Frameset parsing ⥾ -PASS XHTML1.0 Frameset parsing 𝔘 -PASS XHTML1.0 Frameset parsing 𝔲 -PASS XHTML1.0 Frameset parsing Ù -PASS XHTML1.0 Frameset parsing ù -PASS XHTML1.0 Frameset parsing ⥣ -PASS XHTML1.0 Frameset parsing ↿ -PASS XHTML1.0 Frameset parsing ↾ -PASS XHTML1.0 Frameset parsing ▀ -PASS XHTML1.0 Frameset parsing ⌜ -PASS XHTML1.0 Frameset parsing ⌜ -PASS XHTML1.0 Frameset parsing ⌏ -PASS XHTML1.0 Frameset parsing ◸ -PASS XHTML1.0 Frameset parsing Ū -PASS XHTML1.0 Frameset parsing ū -PASS XHTML1.0 Frameset parsing ¨ -PASS XHTML1.0 Frameset parsing _ -PASS XHTML1.0 Frameset parsing ⏟ -PASS XHTML1.0 Frameset parsing ⎵ -PASS XHTML1.0 Frameset parsing ⏝ -PASS XHTML1.0 Frameset parsing ⋃ -PASS XHTML1.0 Frameset parsing ⊎ -PASS XHTML1.0 Frameset parsing Ų -PASS XHTML1.0 Frameset parsing ų -PASS XHTML1.0 Frameset parsing 𝕌 -PASS XHTML1.0 Frameset parsing 𝕦 -PASS XHTML1.0 Frameset parsing ⤒ -PASS XHTML1.0 Frameset parsing ↑ -PASS XHTML1.0 Frameset parsing ↑ -PASS XHTML1.0 Frameset parsing ⇑ -PASS XHTML1.0 Frameset parsing ⇅ -PASS XHTML1.0 Frameset parsing ↕ -PASS XHTML1.0 Frameset parsing ↕ -PASS XHTML1.0 Frameset parsing ⇕ -PASS XHTML1.0 Frameset parsing ⥮ -PASS XHTML1.0 Frameset parsing ↿ -PASS XHTML1.0 Frameset parsing ↾ -PASS XHTML1.0 Frameset parsing ⊎ -PASS XHTML1.0 Frameset parsing ↖ -PASS XHTML1.0 Frameset parsing ↗ -PASS XHTML1.0 Frameset parsing υ -PASS XHTML1.0 Frameset parsing ϒ -PASS XHTML1.0 Frameset parsing ϒ -PASS XHTML1.0 Frameset parsing Υ -PASS XHTML1.0 Frameset parsing υ -PASS XHTML1.0 Frameset parsing ↥ -PASS XHTML1.0 Frameset parsing ⊥ -PASS XHTML1.0 Frameset parsing ⇈ -PASS XHTML1.0 Frameset parsing ⌝ -PASS XHTML1.0 Frameset parsing ⌝ -PASS XHTML1.0 Frameset parsing ⌎ -PASS XHTML1.0 Frameset parsing Ů -PASS XHTML1.0 Frameset parsing ů -PASS XHTML1.0 Frameset parsing ◹ -PASS XHTML1.0 Frameset parsing 𝒰 -PASS XHTML1.0 Frameset parsing 𝓊 -PASS XHTML1.0 Frameset parsing ⋰ -PASS XHTML1.0 Frameset parsing Ũ -PASS XHTML1.0 Frameset parsing ũ -PASS XHTML1.0 Frameset parsing ▵ -PASS XHTML1.0 Frameset parsing ▴ -PASS XHTML1.0 Frameset parsing ⇈ -PASS XHTML1.0 Frameset parsing Ü -PASS XHTML1.0 Frameset parsing ü -PASS XHTML1.0 Frameset parsing ⦧ -PASS XHTML1.0 Frameset parsing ⦜ -PASS XHTML1.0 Frameset parsing ϵ -PASS XHTML1.0 Frameset parsing ϰ -PASS XHTML1.0 Frameset parsing ∅ -PASS XHTML1.0 Frameset parsing ϕ -PASS XHTML1.0 Frameset parsing ϖ -PASS XHTML1.0 Frameset parsing ∝ -PASS XHTML1.0 Frameset parsing ↕ -PASS XHTML1.0 Frameset parsing ⇕ -PASS XHTML1.0 Frameset parsing ϱ -PASS XHTML1.0 Frameset parsing ς -PASS XHTML1.0 Frameset parsing ⊊︀ -PASS XHTML1.0 Frameset parsing ⫋︀ -PASS XHTML1.0 Frameset parsing ⊋︀ -PASS XHTML1.0 Frameset parsing ⫌︀ -PASS XHTML1.0 Frameset parsing ϑ -PASS XHTML1.0 Frameset parsing ⊲ -PASS XHTML1.0 Frameset parsing ⊳ -PASS XHTML1.0 Frameset parsing ⫨ -PASS XHTML1.0 Frameset parsing ⫫ -PASS XHTML1.0 Frameset parsing ⫩ -PASS XHTML1.0 Frameset parsing В -PASS XHTML1.0 Frameset parsing в -PASS XHTML1.0 Frameset parsing ⊢ -PASS XHTML1.0 Frameset parsing ⊨ -PASS XHTML1.0 Frameset parsing ⊩ -PASS XHTML1.0 Frameset parsing ⊫ -PASS XHTML1.0 Frameset parsing ⫦ -PASS XHTML1.0 Frameset parsing ⊻ -PASS XHTML1.0 Frameset parsing ∨ -PASS XHTML1.0 Frameset parsing ⋁ -PASS XHTML1.0 Frameset parsing ≚ -PASS XHTML1.0 Frameset parsing ⋮ -PASS XHTML1.0 Frameset parsing | -PASS XHTML1.0 Frameset parsing ‖ -PASS XHTML1.0 Frameset parsing | -PASS XHTML1.0 Frameset parsing ‖ -PASS XHTML1.0 Frameset parsing ∣ -PASS XHTML1.0 Frameset parsing | -PASS XHTML1.0 Frameset parsing ❘ -PASS XHTML1.0 Frameset parsing ≀ -PASS XHTML1.0 Frameset parsing   -PASS XHTML1.0 Frameset parsing 𝔙 -PASS XHTML1.0 Frameset parsing 𝔳 -PASS XHTML1.0 Frameset parsing ⊲ -PASS XHTML1.0 Frameset parsing ⊂⃒ -PASS XHTML1.0 Frameset parsing ⊃⃒ -PASS XHTML1.0 Frameset parsing 𝕍 -PASS XHTML1.0 Frameset parsing 𝕧 -PASS XHTML1.0 Frameset parsing ∝ -PASS XHTML1.0 Frameset parsing ⊳ -PASS XHTML1.0 Frameset parsing 𝒱 -PASS XHTML1.0 Frameset parsing 𝓋 -PASS XHTML1.0 Frameset parsing ⫋︀ -PASS XHTML1.0 Frameset parsing ⊊︀ -PASS XHTML1.0 Frameset parsing ⫌︀ -PASS XHTML1.0 Frameset parsing ⊋︀ -PASS XHTML1.0 Frameset parsing ⊪ -PASS XHTML1.0 Frameset parsing ⦚ -PASS XHTML1.0 Frameset parsing Ŵ -PASS XHTML1.0 Frameset parsing ŵ -PASS XHTML1.0 Frameset parsing ⩟ -PASS XHTML1.0 Frameset parsing ∧ -PASS XHTML1.0 Frameset parsing ⋀ -PASS XHTML1.0 Frameset parsing ≙ -PASS XHTML1.0 Frameset parsing ℘ -PASS XHTML1.0 Frameset parsing 𝔚 -PASS XHTML1.0 Frameset parsing 𝔴 -PASS XHTML1.0 Frameset parsing 𝕎 -PASS XHTML1.0 Frameset parsing 𝕨 -PASS XHTML1.0 Frameset parsing ℘ -PASS XHTML1.0 Frameset parsing ≀ -PASS XHTML1.0 Frameset parsing ≀ -PASS XHTML1.0 Frameset parsing 𝒲 -PASS XHTML1.0 Frameset parsing 𝓌 -PASS XHTML1.0 Frameset parsing ⋂ -PASS XHTML1.0 Frameset parsing ◯ -PASS XHTML1.0 Frameset parsing ⋃ -PASS XHTML1.0 Frameset parsing ▽ -PASS XHTML1.0 Frameset parsing 𝔛 -PASS XHTML1.0 Frameset parsing 𝔵 -PASS XHTML1.0 Frameset parsing ⟷ -PASS XHTML1.0 Frameset parsing ⟺ -PASS XHTML1.0 Frameset parsing Ξ -PASS XHTML1.0 Frameset parsing ξ -PASS XHTML1.0 Frameset parsing ⟵ -PASS XHTML1.0 Frameset parsing ⟸ -PASS XHTML1.0 Frameset parsing ⟼ -PASS XHTML1.0 Frameset parsing ⋻ -PASS XHTML1.0 Frameset parsing ⨀ -PASS XHTML1.0 Frameset parsing 𝕏 -PASS XHTML1.0 Frameset parsing 𝕩 -PASS XHTML1.0 Frameset parsing ⨁ -PASS XHTML1.0 Frameset parsing ⨂ -PASS XHTML1.0 Frameset parsing ⟶ -PASS XHTML1.0 Frameset parsing ⟹ -PASS XHTML1.0 Frameset parsing 𝒳 -PASS XHTML1.0 Frameset parsing 𝓍 -PASS XHTML1.0 Frameset parsing ⨆ -PASS XHTML1.0 Frameset parsing ⨄ -PASS XHTML1.0 Frameset parsing △ -PASS XHTML1.0 Frameset parsing ⋁ -PASS XHTML1.0 Frameset parsing ⋀ -PASS XHTML1.0 Frameset parsing Ý -PASS XHTML1.0 Frameset parsing ý -PASS XHTML1.0 Frameset parsing Я -PASS XHTML1.0 Frameset parsing я -PASS XHTML1.0 Frameset parsing Ŷ -PASS XHTML1.0 Frameset parsing ŷ -PASS XHTML1.0 Frameset parsing Ы -PASS XHTML1.0 Frameset parsing ы -PASS XHTML1.0 Frameset parsing ¥ -PASS XHTML1.0 Frameset parsing 𝔜 -PASS XHTML1.0 Frameset parsing 𝔶 -PASS XHTML1.0 Frameset parsing Ї -PASS XHTML1.0 Frameset parsing ї -PASS XHTML1.0 Frameset parsing 𝕐 -PASS XHTML1.0 Frameset parsing 𝕪 -PASS XHTML1.0 Frameset parsing 𝒴 -PASS XHTML1.0 Frameset parsing 𝓎 -PASS XHTML1.0 Frameset parsing Ю -PASS XHTML1.0 Frameset parsing ю -PASS XHTML1.0 Frameset parsing ÿ -PASS XHTML1.0 Frameset parsing Ÿ -PASS XHTML1.0 Frameset parsing Ź -PASS XHTML1.0 Frameset parsing ź -PASS XHTML1.0 Frameset parsing Ž -PASS XHTML1.0 Frameset parsing ž -PASS XHTML1.0 Frameset parsing З -PASS XHTML1.0 Frameset parsing з -PASS XHTML1.0 Frameset parsing Ż -PASS XHTML1.0 Frameset parsing ż -PASS XHTML1.0 Frameset parsing ℨ -PASS XHTML1.0 Frameset parsing ​ -PASS XHTML1.0 Frameset parsing Ζ -PASS XHTML1.0 Frameset parsing ζ -PASS XHTML1.0 Frameset parsing 𝔷 -PASS XHTML1.0 Frameset parsing ℨ -PASS XHTML1.0 Frameset parsing Ж -PASS XHTML1.0 Frameset parsing ж -PASS XHTML1.0 Frameset parsing ⇝ -PASS XHTML1.0 Frameset parsing 𝕫 -PASS XHTML1.0 Frameset parsing ℤ -PASS XHTML1.0 Frameset parsing 𝒵 -PASS XHTML1.0 Frameset parsing 𝓏 -PASS XHTML1.0 Frameset parsing ‍ -PASS XHTML1.0 Frameset parsing ‌ -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-5-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-5-expected.txt deleted file mode 100644 index 694f456c..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-5-expected.txt +++ /dev/null
@@ -1,2129 +0,0 @@ -This is a testharness.js-based test. -Found 2125 tests; 2122 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS XHTML Basic parsing Á -PASS XHTML Basic parsing á -PASS XHTML Basic parsing Ă -PASS XHTML Basic parsing ă -PASS XHTML Basic parsing ∾ -PASS XHTML Basic parsing ∿ -PASS XHTML Basic parsing ∾̳ -PASS XHTML Basic parsing  -PASS XHTML Basic parsing â -PASS XHTML Basic parsing ´ -PASS XHTML Basic parsing А -PASS XHTML Basic parsing а -PASS XHTML Basic parsing Æ -PASS XHTML Basic parsing æ -PASS XHTML Basic parsing ⁡ -PASS XHTML Basic parsing 𝔄 -PASS XHTML Basic parsing 𝔞 -PASS XHTML Basic parsing À -PASS XHTML Basic parsing à -PASS XHTML Basic parsing ℵ -PASS XHTML Basic parsing ℵ -PASS XHTML Basic parsing Α -PASS XHTML Basic parsing α -PASS XHTML Basic parsing Ā -PASS XHTML Basic parsing ā -PASS XHTML Basic parsing ⨿ -PASS XHTML Basic parsing & -FAIL XHTML Basic parsing & assert_true: expected true got false -PASS XHTML Basic parsing ⩕ -PASS XHTML Basic parsing ⩓ -PASS XHTML Basic parsing ∧ -PASS XHTML Basic parsing ⩜ -PASS XHTML Basic parsing ⩘ -PASS XHTML Basic parsing ⩚ -PASS XHTML Basic parsing ∠ -PASS XHTML Basic parsing ⦤ -PASS XHTML Basic parsing ∠ -PASS XHTML Basic parsing ⦨ -PASS XHTML Basic parsing ⦩ -PASS XHTML Basic parsing ⦪ -PASS XHTML Basic parsing ⦫ -PASS XHTML Basic parsing ⦬ -PASS XHTML Basic parsing ⦭ -PASS XHTML Basic parsing ⦮ -PASS XHTML Basic parsing ⦯ -PASS XHTML Basic parsing ∡ -PASS XHTML Basic parsing ∟ -PASS XHTML Basic parsing ⊾ -PASS XHTML Basic parsing ⦝ -PASS XHTML Basic parsing ∢ -PASS XHTML Basic parsing Å -PASS XHTML Basic parsing ⍼ -PASS XHTML Basic parsing Ą -PASS XHTML Basic parsing ą -PASS XHTML Basic parsing 𝔸 -PASS XHTML Basic parsing 𝕒 -PASS XHTML Basic parsing ⩯ -PASS XHTML Basic parsing ≈ -PASS XHTML Basic parsing ⩰ -PASS XHTML Basic parsing ≊ -PASS XHTML Basic parsing ≋ -PASS XHTML Basic parsing ' -PASS XHTML Basic parsing ⁡ -PASS XHTML Basic parsing ≈ -PASS XHTML Basic parsing ≊ -PASS XHTML Basic parsing Å -PASS XHTML Basic parsing å -PASS XHTML Basic parsing 𝒜 -PASS XHTML Basic parsing 𝒶 -PASS XHTML Basic parsing ≔ -PASS XHTML Basic parsing * -PASS XHTML Basic parsing ≈ -PASS XHTML Basic parsing ≍ -PASS XHTML Basic parsing à -PASS XHTML Basic parsing ã -PASS XHTML Basic parsing Ä -PASS XHTML Basic parsing ä -PASS XHTML Basic parsing ∳ -PASS XHTML Basic parsing ⨑ -PASS XHTML Basic parsing ≌ -PASS XHTML Basic parsing ϶ -PASS XHTML Basic parsing ‵ -PASS XHTML Basic parsing ∽ -PASS XHTML Basic parsing ⋍ -PASS XHTML Basic parsing ∖ -PASS XHTML Basic parsing ⫧ -PASS XHTML Basic parsing ⊽ -PASS XHTML Basic parsing ⌅ -PASS XHTML Basic parsing ⌆ -PASS XHTML Basic parsing ⌅ -PASS XHTML Basic parsing ⎵ -PASS XHTML Basic parsing ⎶ -PASS XHTML Basic parsing ≌ -PASS XHTML Basic parsing Б -PASS XHTML Basic parsing б -PASS XHTML Basic parsing „ -PASS XHTML Basic parsing ∵ -PASS XHTML Basic parsing ∵ -PASS XHTML Basic parsing ∵ -PASS XHTML Basic parsing ⦰ -PASS XHTML Basic parsing ϶ -PASS XHTML Basic parsing ℬ -PASS XHTML Basic parsing ℬ -PASS XHTML Basic parsing Β -PASS XHTML Basic parsing β -PASS XHTML Basic parsing ℶ -PASS XHTML Basic parsing ≬ -PASS XHTML Basic parsing 𝔅 -PASS XHTML Basic parsing 𝔟 -PASS XHTML Basic parsing ⋂ -PASS XHTML Basic parsing ◯ -PASS XHTML Basic parsing ⋃ -PASS XHTML Basic parsing ⨀ -PASS XHTML Basic parsing ⨁ -PASS XHTML Basic parsing ⨂ -PASS XHTML Basic parsing ⨆ -PASS XHTML Basic parsing ★ -PASS XHTML Basic parsing ▽ -PASS XHTML Basic parsing △ -PASS XHTML Basic parsing ⨄ -PASS XHTML Basic parsing ⋁ -PASS XHTML Basic parsing ⋀ -PASS XHTML Basic parsing ⤍ -PASS XHTML Basic parsing ⧫ -PASS XHTML Basic parsing ▪ -PASS XHTML Basic parsing ▴ -PASS XHTML Basic parsing ▾ -PASS XHTML Basic parsing ◂ -PASS XHTML Basic parsing ▸ -PASS XHTML Basic parsing ␣ -PASS XHTML Basic parsing ▒ -PASS XHTML Basic parsing ░ -PASS XHTML Basic parsing ▓ -PASS XHTML Basic parsing █ -PASS XHTML Basic parsing =⃥ -PASS XHTML Basic parsing ≡⃥ -PASS XHTML Basic parsing ⫭ -PASS XHTML Basic parsing ⌐ -PASS XHTML Basic parsing 𝔹 -PASS XHTML Basic parsing 𝕓 -PASS XHTML Basic parsing ⊥ -PASS XHTML Basic parsing ⊥ -PASS XHTML Basic parsing ⋈ -PASS XHTML Basic parsing ⧉ -PASS XHTML Basic parsing ┐ -PASS XHTML Basic parsing ╕ -PASS XHTML Basic parsing ╖ -PASS XHTML Basic parsing ╗ -PASS XHTML Basic parsing ┌ -PASS XHTML Basic parsing ╒ -PASS XHTML Basic parsing ╓ -PASS XHTML Basic parsing ╔ -PASS XHTML Basic parsing ─ -PASS XHTML Basic parsing ═ -PASS XHTML Basic parsing ┬ -PASS XHTML Basic parsing ╤ -PASS XHTML Basic parsing ╥ -PASS XHTML Basic parsing ╦ -PASS XHTML Basic parsing ┴ -PASS XHTML Basic parsing ╧ -PASS XHTML Basic parsing ╨ -PASS XHTML Basic parsing ╩ -PASS XHTML Basic parsing ⊟ -PASS XHTML Basic parsing ⊞ -PASS XHTML Basic parsing ⊠ -PASS XHTML Basic parsing ┘ -PASS XHTML Basic parsing ╛ -PASS XHTML Basic parsing ╜ -PASS XHTML Basic parsing ╝ -PASS XHTML Basic parsing └ -PASS XHTML Basic parsing ╘ -PASS XHTML Basic parsing ╙ -PASS XHTML Basic parsing ╚ -PASS XHTML Basic parsing │ -PASS XHTML Basic parsing ║ -PASS XHTML Basic parsing ┼ -PASS XHTML Basic parsing ╪ -PASS XHTML Basic parsing ╫ -PASS XHTML Basic parsing ╬ -PASS XHTML Basic parsing ┤ -PASS XHTML Basic parsing ╡ -PASS XHTML Basic parsing ╢ -PASS XHTML Basic parsing ╣ -PASS XHTML Basic parsing ├ -PASS XHTML Basic parsing ╞ -PASS XHTML Basic parsing ╟ -PASS XHTML Basic parsing ╠ -PASS XHTML Basic parsing ‵ -PASS XHTML Basic parsing ˘ -PASS XHTML Basic parsing ˘ -PASS XHTML Basic parsing ¦ -PASS XHTML Basic parsing 𝒷 -PASS XHTML Basic parsing ℬ -PASS XHTML Basic parsing ⁏ -PASS XHTML Basic parsing ∽ -PASS XHTML Basic parsing ⋍ -PASS XHTML Basic parsing ⧅ -PASS XHTML Basic parsing \ -PASS XHTML Basic parsing ⟈ -PASS XHTML Basic parsing • -PASS XHTML Basic parsing • -PASS XHTML Basic parsing ≎ -PASS XHTML Basic parsing ⪮ -PASS XHTML Basic parsing ≏ -PASS XHTML Basic parsing ≎ -PASS XHTML Basic parsing ≏ -PASS XHTML Basic parsing Ć -PASS XHTML Basic parsing ć -PASS XHTML Basic parsing ⩄ -PASS XHTML Basic parsing ⩉ -PASS XHTML Basic parsing ⩋ -PASS XHTML Basic parsing ∩ -PASS XHTML Basic parsing ⋒ -PASS XHTML Basic parsing ⩇ -PASS XHTML Basic parsing ⩀ -PASS XHTML Basic parsing ⅅ -PASS XHTML Basic parsing ∩︀ -PASS XHTML Basic parsing ⁁ -PASS XHTML Basic parsing ˇ -PASS XHTML Basic parsing ℭ -PASS XHTML Basic parsing ⩍ -PASS XHTML Basic parsing Č -PASS XHTML Basic parsing č -PASS XHTML Basic parsing Ç -PASS XHTML Basic parsing ç -PASS XHTML Basic parsing Ĉ -PASS XHTML Basic parsing ĉ -PASS XHTML Basic parsing ∰ -PASS XHTML Basic parsing ⩌ -PASS XHTML Basic parsing ⩐ -PASS XHTML Basic parsing Ċ -PASS XHTML Basic parsing ċ -PASS XHTML Basic parsing ¸ -PASS XHTML Basic parsing ¸ -PASS XHTML Basic parsing ⦲ -PASS XHTML Basic parsing ¢ -PASS XHTML Basic parsing · -PASS XHTML Basic parsing · -PASS XHTML Basic parsing 𝔠 -PASS XHTML Basic parsing ℭ -PASS XHTML Basic parsing Ч -PASS XHTML Basic parsing ч -PASS XHTML Basic parsing ✓ -PASS XHTML Basic parsing ✓ -PASS XHTML Basic parsing Χ -PASS XHTML Basic parsing χ -PASS XHTML Basic parsing ˆ -PASS XHTML Basic parsing ≗ -PASS XHTML Basic parsing ↺ -PASS XHTML Basic parsing ↻ -PASS XHTML Basic parsing ⊛ -PASS XHTML Basic parsing ⊚ -PASS XHTML Basic parsing ⊝ -PASS XHTML Basic parsing ⊙ -PASS XHTML Basic parsing ® -PASS XHTML Basic parsing Ⓢ -PASS XHTML Basic parsing ⊖ -PASS XHTML Basic parsing ⊕ -PASS XHTML Basic parsing ⊗ -PASS XHTML Basic parsing ○ -PASS XHTML Basic parsing ⧃ -PASS XHTML Basic parsing ≗ -PASS XHTML Basic parsing ⨐ -PASS XHTML Basic parsing ⫯ -PASS XHTML Basic parsing ⧂ -PASS XHTML Basic parsing ∲ -PASS XHTML Basic parsing ” -PASS XHTML Basic parsing ’ -PASS XHTML Basic parsing ♣ -PASS XHTML Basic parsing ♣ -PASS XHTML Basic parsing : -PASS XHTML Basic parsing ∷ -PASS XHTML Basic parsing ⩴ -PASS XHTML Basic parsing ≔ -PASS XHTML Basic parsing ≔ -PASS XHTML Basic parsing , -PASS XHTML Basic parsing @ -PASS XHTML Basic parsing ∁ -PASS XHTML Basic parsing ∘ -PASS XHTML Basic parsing ∁ -PASS XHTML Basic parsing ℂ -PASS XHTML Basic parsing ≅ -PASS XHTML Basic parsing ⩭ -PASS XHTML Basic parsing ≡ -PASS XHTML Basic parsing ∮ -PASS XHTML Basic parsing ∯ -PASS XHTML Basic parsing ∮ -PASS XHTML Basic parsing 𝕔 -PASS XHTML Basic parsing ℂ -PASS XHTML Basic parsing ∐ -PASS XHTML Basic parsing ∐ -PASS XHTML Basic parsing © -PASS XHTML Basic parsing © -PASS XHTML Basic parsing ℗ -PASS XHTML Basic parsing ∳ -PASS XHTML Basic parsing ↵ -PASS XHTML Basic parsing ✗ -PASS XHTML Basic parsing ⨯ -PASS XHTML Basic parsing 𝒞 -PASS XHTML Basic parsing 𝒸 -PASS XHTML Basic parsing ⫏ -PASS XHTML Basic parsing ⫑ -PASS XHTML Basic parsing ⫐ -PASS XHTML Basic parsing ⫒ -PASS XHTML Basic parsing ⋯ -PASS XHTML Basic parsing ⤸ -PASS XHTML Basic parsing ⤵ -PASS XHTML Basic parsing ⋞ -PASS XHTML Basic parsing ⋟ -PASS XHTML Basic parsing ↶ -PASS XHTML Basic parsing ⤽ -PASS XHTML Basic parsing ⩈ -PASS XHTML Basic parsing ⩆ -PASS XHTML Basic parsing ≍ -PASS XHTML Basic parsing ∪ -PASS XHTML Basic parsing ⋓ -PASS XHTML Basic parsing ⩊ -PASS XHTML Basic parsing ⊍ -PASS XHTML Basic parsing ⩅ -PASS XHTML Basic parsing ∪︀ -PASS XHTML Basic parsing ↷ -PASS XHTML Basic parsing ⤼ -PASS XHTML Basic parsing ⋞ -PASS XHTML Basic parsing ⋟ -PASS XHTML Basic parsing ⋎ -PASS XHTML Basic parsing ⋏ -PASS XHTML Basic parsing ¤ -PASS XHTML Basic parsing ↶ -PASS XHTML Basic parsing ↷ -PASS XHTML Basic parsing ⋎ -PASS XHTML Basic parsing ⋏ -PASS XHTML Basic parsing ∲ -PASS XHTML Basic parsing ∱ -PASS XHTML Basic parsing ⌭ -PASS XHTML Basic parsing † -PASS XHTML Basic parsing ‡ -PASS XHTML Basic parsing ℸ -PASS XHTML Basic parsing ↓ -PASS XHTML Basic parsing ↡ -PASS XHTML Basic parsing ⇓ -PASS XHTML Basic parsing ‐ -PASS XHTML Basic parsing ⫤ -PASS XHTML Basic parsing ⊣ -PASS XHTML Basic parsing ⤏ -PASS XHTML Basic parsing ˝ -PASS XHTML Basic parsing Ď -PASS XHTML Basic parsing ď -PASS XHTML Basic parsing Д -PASS XHTML Basic parsing д -PASS XHTML Basic parsing ‡ -PASS XHTML Basic parsing ⇊ -PASS XHTML Basic parsing ⅅ -PASS XHTML Basic parsing ⅆ -PASS XHTML Basic parsing ⤑ -PASS XHTML Basic parsing ⩷ -PASS XHTML Basic parsing ° -PASS XHTML Basic parsing ∇ -PASS XHTML Basic parsing Δ -PASS XHTML Basic parsing δ -PASS XHTML Basic parsing ⦱ -PASS XHTML Basic parsing ⥿ -PASS XHTML Basic parsing 𝔇 -PASS XHTML Basic parsing 𝔡 -PASS XHTML Basic parsing ⥥ -PASS XHTML Basic parsing ⇃ -PASS XHTML Basic parsing ⇂ -PASS XHTML Basic parsing ´ -PASS XHTML Basic parsing ˙ -PASS XHTML Basic parsing ˝ -PASS XHTML Basic parsing ` -PASS XHTML Basic parsing ˜ -PASS XHTML Basic parsing ⋄ -PASS XHTML Basic parsing ⋄ -PASS XHTML Basic parsing ⋄ -PASS XHTML Basic parsing ♦ -PASS XHTML Basic parsing ♦ -PASS XHTML Basic parsing ¨ -PASS XHTML Basic parsing ⅆ -PASS XHTML Basic parsing ϝ -PASS XHTML Basic parsing ⋲ -PASS XHTML Basic parsing ÷ -PASS XHTML Basic parsing ÷ -PASS XHTML Basic parsing ⋇ -PASS XHTML Basic parsing ⋇ -PASS XHTML Basic parsing Ђ -PASS XHTML Basic parsing ђ -PASS XHTML Basic parsing ⌞ -PASS XHTML Basic parsing ⌍ -PASS XHTML Basic parsing $ -PASS XHTML Basic parsing 𝔻 -PASS XHTML Basic parsing 𝕕 -PASS XHTML Basic parsing ¨ -PASS XHTML Basic parsing ˙ -PASS XHTML Basic parsing ⃜ -PASS XHTML Basic parsing ≐ -PASS XHTML Basic parsing ≑ -PASS XHTML Basic parsing ≐ -PASS XHTML Basic parsing ∸ -PASS XHTML Basic parsing ∔ -PASS XHTML Basic parsing ⊡ -PASS XHTML Basic parsing ⌆ -PASS XHTML Basic parsing ∯ -PASS XHTML Basic parsing ¨ -PASS XHTML Basic parsing ⇓ -PASS XHTML Basic parsing ⇐ -PASS XHTML Basic parsing ⇔ -PASS XHTML Basic parsing ⫤ -PASS XHTML Basic parsing ⟸ -PASS XHTML Basic parsing ⟺ -PASS XHTML Basic parsing ⟹ -PASS XHTML Basic parsing ⇒ -PASS XHTML Basic parsing ⊨ -PASS XHTML Basic parsing ⇑ -PASS XHTML Basic parsing ⇕ -PASS XHTML Basic parsing ∥ -PASS XHTML Basic parsing ⤓ -PASS XHTML Basic parsing ↓ -PASS XHTML Basic parsing ↓ -PASS XHTML Basic parsing ⇓ -PASS XHTML Basic parsing ⇵ -PASS XHTML Basic parsing ̑ -PASS XHTML Basic parsing ⇊ -PASS XHTML Basic parsing ⇃ -PASS XHTML Basic parsing ⇂ -PASS XHTML Basic parsing ⥐ -PASS XHTML Basic parsing ⥞ -PASS XHTML Basic parsing ⥖ -PASS XHTML Basic parsing ↽ -PASS XHTML Basic parsing ⥟ -PASS XHTML Basic parsing ⥗ -PASS XHTML Basic parsing ⇁ -PASS XHTML Basic parsing ↧ -PASS XHTML Basic parsing ⊤ -PASS XHTML Basic parsing ⤐ -PASS XHTML Basic parsing ⌟ -PASS XHTML Basic parsing ⌌ -PASS XHTML Basic parsing 𝒟 -PASS XHTML Basic parsing 𝒹 -PASS XHTML Basic parsing Ѕ -PASS XHTML Basic parsing ѕ -PASS XHTML Basic parsing ⧶ -PASS XHTML Basic parsing Đ -PASS XHTML Basic parsing đ -PASS XHTML Basic parsing ⋱ -PASS XHTML Basic parsing ▿ -PASS XHTML Basic parsing ▾ -PASS XHTML Basic parsing ⇵ -PASS XHTML Basic parsing ⥯ -PASS XHTML Basic parsing ⦦ -PASS XHTML Basic parsing Џ -PASS XHTML Basic parsing џ -PASS XHTML Basic parsing ⟿ -PASS XHTML Basic parsing É -PASS XHTML Basic parsing é -PASS XHTML Basic parsing ⩮ -PASS XHTML Basic parsing Ě -PASS XHTML Basic parsing ě -PASS XHTML Basic parsing Ê -PASS XHTML Basic parsing ê -PASS XHTML Basic parsing ≖ -PASS XHTML Basic parsing ≕ -PASS XHTML Basic parsing Э -PASS XHTML Basic parsing э -PASS XHTML Basic parsing ⩷ -PASS XHTML Basic parsing Ė -PASS XHTML Basic parsing ė -PASS XHTML Basic parsing ≑ -PASS XHTML Basic parsing ⅇ -PASS XHTML Basic parsing ≒ -PASS XHTML Basic parsing 𝔈 -PASS XHTML Basic parsing 𝔢 -PASS XHTML Basic parsing ⪚ -PASS XHTML Basic parsing È -PASS XHTML Basic parsing è -PASS XHTML Basic parsing ⪖ -PASS XHTML Basic parsing ⪘ -PASS XHTML Basic parsing ⪙ -PASS XHTML Basic parsing ∈ -PASS XHTML Basic parsing ⏧ -PASS XHTML Basic parsing ℓ -PASS XHTML Basic parsing ⪕ -PASS XHTML Basic parsing ⪗ -PASS XHTML Basic parsing Ē -PASS XHTML Basic parsing ē -PASS XHTML Basic parsing ∅ -PASS XHTML Basic parsing ∅ -PASS XHTML Basic parsing ◻ -PASS XHTML Basic parsing ∅ -PASS XHTML Basic parsing ▫ -PASS XHTML Basic parsing   -PASS XHTML Basic parsing   -PASS XHTML Basic parsing   -PASS XHTML Basic parsing Ŋ -PASS XHTML Basic parsing ŋ -PASS XHTML Basic parsing   -PASS XHTML Basic parsing Ę -PASS XHTML Basic parsing ę -PASS XHTML Basic parsing 𝔼 -PASS XHTML Basic parsing 𝕖 -PASS XHTML Basic parsing ⋕ -PASS XHTML Basic parsing ⧣ -PASS XHTML Basic parsing ⩱ -PASS XHTML Basic parsing ε -PASS XHTML Basic parsing Ε -PASS XHTML Basic parsing ε -PASS XHTML Basic parsing ϵ -PASS XHTML Basic parsing ≖ -PASS XHTML Basic parsing ≕ -PASS XHTML Basic parsing ≂ -PASS XHTML Basic parsing ⪖ -PASS XHTML Basic parsing ⪕ -PASS XHTML Basic parsing ⩵ -PASS XHTML Basic parsing = -PASS XHTML Basic parsing ≂ -PASS XHTML Basic parsing ≟ -PASS XHTML Basic parsing ⇌ -PASS XHTML Basic parsing ≡ -PASS XHTML Basic parsing ⩸ -PASS XHTML Basic parsing ⧥ -PASS XHTML Basic parsing ⥱ -PASS XHTML Basic parsing ≓ -PASS XHTML Basic parsing ℯ -PASS XHTML Basic parsing ℰ -PASS XHTML Basic parsing ≐ -PASS XHTML Basic parsing ⩳ -PASS XHTML Basic parsing ≂ -PASS XHTML Basic parsing Η -PASS XHTML Basic parsing η -PASS XHTML Basic parsing Ð -PASS XHTML Basic parsing ð -PASS XHTML Basic parsing Ë -PASS XHTML Basic parsing ë -PASS XHTML Basic parsing € -PASS XHTML Basic parsing ! -PASS XHTML Basic parsing ∃ -PASS XHTML Basic parsing ∃ -PASS XHTML Basic parsing ℰ -PASS XHTML Basic parsing ⅇ -PASS XHTML Basic parsing ⅇ -PASS XHTML Basic parsing ≒ -PASS XHTML Basic parsing Ф -PASS XHTML Basic parsing ф -PASS XHTML Basic parsing ♀ -PASS XHTML Basic parsing ffi -PASS XHTML Basic parsing ff -PASS XHTML Basic parsing ffl -PASS XHTML Basic parsing 𝔉 -PASS XHTML Basic parsing 𝔣 -PASS XHTML Basic parsing fi -PASS XHTML Basic parsing ◼ -PASS XHTML Basic parsing ▪ -PASS XHTML Basic parsing fj -PASS XHTML Basic parsing ♭ -PASS XHTML Basic parsing fl -PASS XHTML Basic parsing ▱ -PASS XHTML Basic parsing ƒ -PASS XHTML Basic parsing 𝔽 -PASS XHTML Basic parsing 𝕗 -PASS XHTML Basic parsing ∀ -PASS XHTML Basic parsing ∀ -PASS XHTML Basic parsing ⋔ -PASS XHTML Basic parsing ⫙ -PASS XHTML Basic parsing ℱ -PASS XHTML Basic parsing ⨍ -PASS XHTML Basic parsing ½ -PASS XHTML Basic parsing ⅓ -PASS XHTML Basic parsing ¼ -PASS XHTML Basic parsing ⅕ -PASS XHTML Basic parsing ⅙ -PASS XHTML Basic parsing ⅛ -PASS XHTML Basic parsing ⅔ -PASS XHTML Basic parsing ⅖ -PASS XHTML Basic parsing ¾ -PASS XHTML Basic parsing ⅗ -PASS XHTML Basic parsing ⅜ -PASS XHTML Basic parsing ⅘ -PASS XHTML Basic parsing ⅚ -PASS XHTML Basic parsing ⅝ -PASS XHTML Basic parsing ⅞ -PASS XHTML Basic parsing ⁄ -PASS XHTML Basic parsing ⌢ -PASS XHTML Basic parsing 𝒻 -PASS XHTML Basic parsing ℱ -PASS XHTML Basic parsing ǵ -PASS XHTML Basic parsing Γ -PASS XHTML Basic parsing γ -PASS XHTML Basic parsing Ϝ -PASS XHTML Basic parsing ϝ -PASS XHTML Basic parsing ⪆ -PASS XHTML Basic parsing Ğ -PASS XHTML Basic parsing ğ -PASS XHTML Basic parsing Ģ -PASS XHTML Basic parsing Ĝ -PASS XHTML Basic parsing ĝ -PASS XHTML Basic parsing Г -PASS XHTML Basic parsing г -PASS XHTML Basic parsing Ġ -PASS XHTML Basic parsing ġ -PASS XHTML Basic parsing ≥ -PASS XHTML Basic parsing ≧ -PASS XHTML Basic parsing ⪌ -PASS XHTML Basic parsing ⋛ -PASS XHTML Basic parsing ≥ -PASS XHTML Basic parsing ≧ -PASS XHTML Basic parsing ⩾ -PASS XHTML Basic parsing ⪩ -PASS XHTML Basic parsing ⩾ -PASS XHTML Basic parsing ⪀ -PASS XHTML Basic parsing ⪂ -PASS XHTML Basic parsing ⪄ -PASS XHTML Basic parsing ⋛︀ -PASS XHTML Basic parsing ⪔ -PASS XHTML Basic parsing 𝔊 -PASS XHTML Basic parsing 𝔤 -PASS XHTML Basic parsing ≫ -PASS XHTML Basic parsing ⋙ -PASS XHTML Basic parsing ⋙ -PASS XHTML Basic parsing ℷ -PASS XHTML Basic parsing Ѓ -PASS XHTML Basic parsing ѓ -PASS XHTML Basic parsing ⪥ -PASS XHTML Basic parsing ≷ -PASS XHTML Basic parsing ⪒ -PASS XHTML Basic parsing ⪤ -PASS XHTML Basic parsing ⪊ -PASS XHTML Basic parsing ⪊ -PASS XHTML Basic parsing ⪈ -PASS XHTML Basic parsing ≩ -PASS XHTML Basic parsing ⪈ -PASS XHTML Basic parsing ≩ -PASS XHTML Basic parsing ⋧ -PASS XHTML Basic parsing 𝔾 -PASS XHTML Basic parsing 𝕘 -PASS XHTML Basic parsing ` -PASS XHTML Basic parsing ≥ -PASS XHTML Basic parsing ⋛ -PASS XHTML Basic parsing ≧ -PASS XHTML Basic parsing ⪢ -PASS XHTML Basic parsing ≷ -PASS XHTML Basic parsing ⩾ -PASS XHTML Basic parsing ≳ -PASS XHTML Basic parsing 𝒢 -PASS XHTML Basic parsing ℊ -PASS XHTML Basic parsing ≳ -PASS XHTML Basic parsing ⪎ -PASS XHTML Basic parsing ⪐ -PASS XHTML Basic parsing ⪧ -PASS XHTML Basic parsing ⩺ -PASS XHTML Basic parsing > -PASS XHTML Basic parsing > -PASS XHTML Basic parsing ≫ -PASS XHTML Basic parsing ⋗ -PASS XHTML Basic parsing ⦕ -PASS XHTML Basic parsing ⩼ -PASS XHTML Basic parsing ⪆ -PASS XHTML Basic parsing ⥸ -PASS XHTML Basic parsing ⋗ -PASS XHTML Basic parsing ⋛ -PASS XHTML Basic parsing ⪌ -PASS XHTML Basic parsing ≷ -PASS XHTML Basic parsing ≳ -PASS XHTML Basic parsing ≩︀ -PASS XHTML Basic parsing ≩︀ -PASS XHTML Basic parsing ˇ -PASS XHTML Basic parsing   -PASS XHTML Basic parsing ½ -PASS XHTML Basic parsing ℋ -PASS XHTML Basic parsing Ъ -PASS XHTML Basic parsing ъ -PASS XHTML Basic parsing ⥈ -PASS XHTML Basic parsing ↔ -PASS XHTML Basic parsing ⇔ -PASS XHTML Basic parsing ↭ -PASS XHTML Basic parsing ^ -PASS XHTML Basic parsing ℏ -PASS XHTML Basic parsing Ĥ -PASS XHTML Basic parsing ĥ -PASS XHTML Basic parsing ♥ -PASS XHTML Basic parsing ♥ -PASS XHTML Basic parsing … -PASS XHTML Basic parsing ⊹ -PASS XHTML Basic parsing 𝔥 -PASS XHTML Basic parsing ℌ -PASS XHTML Basic parsing ℋ -PASS XHTML Basic parsing ⤥ -PASS XHTML Basic parsing ⤦ -PASS XHTML Basic parsing ⇿ -PASS XHTML Basic parsing ∻ -PASS XHTML Basic parsing ↩ -PASS XHTML Basic parsing ↪ -PASS XHTML Basic parsing 𝕙 -PASS XHTML Basic parsing ℍ -PASS XHTML Basic parsing ― -PASS XHTML Basic parsing ─ -PASS XHTML Basic parsing 𝒽 -PASS XHTML Basic parsing ℋ -PASS XHTML Basic parsing ℏ -PASS XHTML Basic parsing Ħ -PASS XHTML Basic parsing ħ -PASS XHTML Basic parsing ≎ -PASS XHTML Basic parsing ≏ -PASS XHTML Basic parsing ⁃ -PASS XHTML Basic parsing ‐ -PASS XHTML Basic parsing Í -PASS XHTML Basic parsing í -PASS XHTML Basic parsing ⁣ -PASS XHTML Basic parsing Î -PASS XHTML Basic parsing î -PASS XHTML Basic parsing И -PASS XHTML Basic parsing и -PASS XHTML Basic parsing İ -PASS XHTML Basic parsing Е -PASS XHTML Basic parsing е -PASS XHTML Basic parsing ¡ -PASS XHTML Basic parsing ⇔ -PASS XHTML Basic parsing 𝔦 -PASS XHTML Basic parsing ℑ -PASS XHTML Basic parsing Ì -PASS XHTML Basic parsing ì -PASS XHTML Basic parsing ⅈ -PASS XHTML Basic parsing ⨌ -PASS XHTML Basic parsing ∭ -PASS XHTML Basic parsing ⧜ -PASS XHTML Basic parsing ℩ -PASS XHTML Basic parsing IJ -PASS XHTML Basic parsing ij -PASS XHTML Basic parsing Ī -PASS XHTML Basic parsing ī -PASS XHTML Basic parsing ℑ -PASS XHTML Basic parsing ⅈ -PASS XHTML Basic parsing ℐ -PASS XHTML Basic parsing ℑ -PASS XHTML Basic parsing ı -PASS XHTML Basic parsing ℑ -PASS XHTML Basic parsing ⊷ -PASS XHTML Basic parsing Ƶ -PASS XHTML Basic parsing ⇒ -PASS XHTML Basic parsing ℅ -PASS XHTML Basic parsing ∈ -PASS XHTML Basic parsing ∞ -PASS XHTML Basic parsing ⧝ -PASS XHTML Basic parsing ı -PASS XHTML Basic parsing ⊺ -PASS XHTML Basic parsing ∫ -PASS XHTML Basic parsing ∬ -PASS XHTML Basic parsing ℤ -PASS XHTML Basic parsing ∫ -PASS XHTML Basic parsing ⊺ -PASS XHTML Basic parsing ⋂ -PASS XHTML Basic parsing ⨗ -PASS XHTML Basic parsing ⨼ -PASS XHTML Basic parsing ⁣ -PASS XHTML Basic parsing ⁢ -PASS XHTML Basic parsing Ё -PASS XHTML Basic parsing ё -PASS XHTML Basic parsing Į -PASS XHTML Basic parsing į -PASS XHTML Basic parsing 𝕀 -PASS XHTML Basic parsing 𝕚 -PASS XHTML Basic parsing Ι -PASS XHTML Basic parsing ι -PASS XHTML Basic parsing ⨼ -PASS XHTML Basic parsing ¿ -PASS XHTML Basic parsing 𝒾 -PASS XHTML Basic parsing ℐ -PASS XHTML Basic parsing ∈ -PASS XHTML Basic parsing ⋵ -PASS XHTML Basic parsing ⋹ -PASS XHTML Basic parsing ⋴ -PASS XHTML Basic parsing ⋳ -PASS XHTML Basic parsing ∈ -PASS XHTML Basic parsing ⁢ -PASS XHTML Basic parsing Ĩ -PASS XHTML Basic parsing ĩ -PASS XHTML Basic parsing І -PASS XHTML Basic parsing і -PASS XHTML Basic parsing Ï -PASS XHTML Basic parsing ï -PASS XHTML Basic parsing Ĵ -PASS XHTML Basic parsing ĵ -PASS XHTML Basic parsing Й -PASS XHTML Basic parsing й -PASS XHTML Basic parsing 𝔍 -PASS XHTML Basic parsing 𝔧 -PASS XHTML Basic parsing ȷ -PASS XHTML Basic parsing 𝕁 -PASS XHTML Basic parsing 𝕛 -PASS XHTML Basic parsing 𝒥 -PASS XHTML Basic parsing 𝒿 -PASS XHTML Basic parsing Ј -PASS XHTML Basic parsing ј -PASS XHTML Basic parsing Є -PASS XHTML Basic parsing є -PASS XHTML Basic parsing Κ -PASS XHTML Basic parsing κ -PASS XHTML Basic parsing ϰ -PASS XHTML Basic parsing Ķ -PASS XHTML Basic parsing ķ -PASS XHTML Basic parsing К -PASS XHTML Basic parsing к -PASS XHTML Basic parsing 𝔎 -PASS XHTML Basic parsing 𝔨 -PASS XHTML Basic parsing ĸ -PASS XHTML Basic parsing Х -PASS XHTML Basic parsing х -PASS XHTML Basic parsing Ќ -PASS XHTML Basic parsing ќ -PASS XHTML Basic parsing 𝕂 -PASS XHTML Basic parsing 𝕜 -PASS XHTML Basic parsing 𝒦 -PASS XHTML Basic parsing 𝓀 -PASS XHTML Basic parsing ⇚ -PASS XHTML Basic parsing Ĺ -PASS XHTML Basic parsing ĺ -PASS XHTML Basic parsing ⦴ -PASS XHTML Basic parsing ℒ -PASS XHTML Basic parsing Λ -PASS XHTML Basic parsing λ -PASS XHTML Basic parsing ⟨ -PASS XHTML Basic parsing ⟪ -PASS XHTML Basic parsing ⦑ -PASS XHTML Basic parsing ⟨ -PASS XHTML Basic parsing ⪅ -PASS XHTML Basic parsing ℒ -PASS XHTML Basic parsing « -PASS XHTML Basic parsing ⇤ -PASS XHTML Basic parsing ⤟ -PASS XHTML Basic parsing ← -PASS XHTML Basic parsing ↞ -PASS XHTML Basic parsing ⇐ -PASS XHTML Basic parsing ⤝ -PASS XHTML Basic parsing ↩ -PASS XHTML Basic parsing ↫ -PASS XHTML Basic parsing ⤹ -PASS XHTML Basic parsing ⥳ -PASS XHTML Basic parsing ↢ -PASS XHTML Basic parsing ⤙ -PASS XHTML Basic parsing ⤛ -PASS XHTML Basic parsing ⪫ -PASS XHTML Basic parsing ⪭ -PASS XHTML Basic parsing ⪭︀ -PASS XHTML Basic parsing ⤌ -PASS XHTML Basic parsing ⤎ -PASS XHTML Basic parsing ❲ -PASS XHTML Basic parsing { -PASS XHTML Basic parsing [ -PASS XHTML Basic parsing ⦋ -PASS XHTML Basic parsing ⦏ -PASS XHTML Basic parsing ⦍ -PASS XHTML Basic parsing Ľ -PASS XHTML Basic parsing ľ -PASS XHTML Basic parsing Ļ -PASS XHTML Basic parsing ļ -PASS XHTML Basic parsing ⌈ -PASS XHTML Basic parsing { -PASS XHTML Basic parsing Л -PASS XHTML Basic parsing л -PASS XHTML Basic parsing ⤶ -PASS XHTML Basic parsing “ -PASS XHTML Basic parsing „ -PASS XHTML Basic parsing ⥧ -PASS XHTML Basic parsing ⥋ -PASS XHTML Basic parsing ↲ -PASS XHTML Basic parsing ≤ -PASS XHTML Basic parsing ≦ -PASS XHTML Basic parsing ⟨ -PASS XHTML Basic parsing ⇤ -PASS XHTML Basic parsing ← -PASS XHTML Basic parsing ← -PASS XHTML Basic parsing ⇐ -PASS XHTML Basic parsing ⇆ -PASS XHTML Basic parsing ↢ -PASS XHTML Basic parsing ⌈ -PASS XHTML Basic parsing ⟦ -PASS XHTML Basic parsing ⥡ -PASS XHTML Basic parsing ⥙ -PASS XHTML Basic parsing ⇃ -PASS XHTML Basic parsing ⌊ -PASS XHTML Basic parsing ↽ -PASS XHTML Basic parsing ↼ -PASS XHTML Basic parsing ⇇ -PASS XHTML Basic parsing ↔ -PASS XHTML Basic parsing ↔ -PASS XHTML Basic parsing ⇔ -PASS XHTML Basic parsing ⇆ -PASS XHTML Basic parsing ⇋ -PASS XHTML Basic parsing ↭ -PASS XHTML Basic parsing ⥎ -PASS XHTML Basic parsing ↤ -PASS XHTML Basic parsing ⊣ -PASS XHTML Basic parsing ⥚ -PASS XHTML Basic parsing ⋋ -PASS XHTML Basic parsing ⧏ -PASS XHTML Basic parsing ⊲ -PASS XHTML Basic parsing ⊴ -PASS XHTML Basic parsing ⥑ -PASS XHTML Basic parsing ⥠ -PASS XHTML Basic parsing ⥘ -PASS XHTML Basic parsing ↿ -PASS XHTML Basic parsing ⥒ -PASS XHTML Basic parsing ↼ -PASS XHTML Basic parsing ⪋ -PASS XHTML Basic parsing ⋚ -PASS XHTML Basic parsing ≤ -PASS XHTML Basic parsing ≦ -PASS XHTML Basic parsing ⩽ -PASS XHTML Basic parsing ⪨ -PASS XHTML Basic parsing ⩽ -PASS XHTML Basic parsing ⩿ -PASS XHTML Basic parsing ⪁ -PASS XHTML Basic parsing ⪃ -PASS XHTML Basic parsing ⋚︀ -PASS XHTML Basic parsing ⪓ -PASS XHTML Basic parsing ⪅ -PASS XHTML Basic parsing ⋖ -PASS XHTML Basic parsing ⋚ -PASS XHTML Basic parsing ⪋ -PASS XHTML Basic parsing ⋚ -PASS XHTML Basic parsing ≦ -PASS XHTML Basic parsing ≶ -PASS XHTML Basic parsing ≶ -PASS XHTML Basic parsing ⪡ -PASS XHTML Basic parsing ≲ -PASS XHTML Basic parsing ⩽ -PASS XHTML Basic parsing ≲ -PASS XHTML Basic parsing ⥼ -PASS XHTML Basic parsing ⌊ -PASS XHTML Basic parsing 𝔏 -PASS XHTML Basic parsing 𝔩 -PASS XHTML Basic parsing ≶ -PASS XHTML Basic parsing ⪑ -PASS XHTML Basic parsing ⥢ -PASS XHTML Basic parsing ↽ -PASS XHTML Basic parsing ↼ -PASS XHTML Basic parsing ⥪ -PASS XHTML Basic parsing ▄ -PASS XHTML Basic parsing Љ -PASS XHTML Basic parsing љ -PASS XHTML Basic parsing ⇇ -PASS XHTML Basic parsing ≪ -PASS XHTML Basic parsing ⋘ -PASS XHTML Basic parsing ⌞ -PASS XHTML Basic parsing ⇚ -PASS XHTML Basic parsing ⥫ -PASS XHTML Basic parsing ◺ -PASS XHTML Basic parsing Ŀ -PASS XHTML Basic parsing ŀ -PASS XHTML Basic parsing ⎰ -PASS XHTML Basic parsing ⎰ -PASS XHTML Basic parsing ⪉ -PASS XHTML Basic parsing ⪉ -PASS XHTML Basic parsing ⪇ -PASS XHTML Basic parsing ≨ -PASS XHTML Basic parsing ⪇ -PASS XHTML Basic parsing ≨ -PASS XHTML Basic parsing ⋦ -PASS XHTML Basic parsing ⟬ -PASS XHTML Basic parsing ⇽ -PASS XHTML Basic parsing ⟦ -PASS XHTML Basic parsing ⟵ -PASS XHTML Basic parsing ⟵ -PASS XHTML Basic parsing ⟸ -PASS XHTML Basic parsing ⟷ -PASS XHTML Basic parsing ⟷ -PASS XHTML Basic parsing ⟺ -PASS XHTML Basic parsing ⟼ -PASS XHTML Basic parsing ⟶ -PASS XHTML Basic parsing ⟶ -PASS XHTML Basic parsing ⟹ -PASS XHTML Basic parsing ↫ -PASS XHTML Basic parsing ↬ -PASS XHTML Basic parsing ⦅ -PASS XHTML Basic parsing 𝕃 -PASS XHTML Basic parsing 𝕝 -PASS XHTML Basic parsing ⨭ -PASS XHTML Basic parsing ⨴ -PASS XHTML Basic parsing ∗ -PASS XHTML Basic parsing _ -PASS XHTML Basic parsing ↙ -PASS XHTML Basic parsing ↘ -PASS XHTML Basic parsing ◊ -PASS XHTML Basic parsing ◊ -PASS XHTML Basic parsing ⧫ -PASS XHTML Basic parsing ( -PASS XHTML Basic parsing ⦓ -PASS XHTML Basic parsing ⇆ -PASS XHTML Basic parsing ⌟ -PASS XHTML Basic parsing ⇋ -PASS XHTML Basic parsing ⥭ -PASS XHTML Basic parsing ‎ -PASS XHTML Basic parsing ⊿ -PASS XHTML Basic parsing ‹ -PASS XHTML Basic parsing 𝓁 -PASS XHTML Basic parsing ℒ -PASS XHTML Basic parsing ↰ -PASS XHTML Basic parsing ↰ -PASS XHTML Basic parsing ≲ -PASS XHTML Basic parsing ⪍ -PASS XHTML Basic parsing ⪏ -PASS XHTML Basic parsing [ -PASS XHTML Basic parsing ‘ -PASS XHTML Basic parsing ‚ -PASS XHTML Basic parsing Ł -PASS XHTML Basic parsing ł -PASS XHTML Basic parsing ⪦ -PASS XHTML Basic parsing ⩹ -PASS XHTML Basic parsing < -FAIL XHTML Basic parsing < assert_true: expected true got false -PASS XHTML Basic parsing ≪ -PASS XHTML Basic parsing ⋖ -PASS XHTML Basic parsing ⋋ -PASS XHTML Basic parsing ⋉ -PASS XHTML Basic parsing ⥶ -PASS XHTML Basic parsing ⩻ -PASS XHTML Basic parsing ◃ -PASS XHTML Basic parsing ⊴ -PASS XHTML Basic parsing ◂ -PASS XHTML Basic parsing ⦖ -PASS XHTML Basic parsing ⥊ -PASS XHTML Basic parsing ⥦ -PASS XHTML Basic parsing ≨︀ -PASS XHTML Basic parsing ≨︀ -PASS XHTML Basic parsing ¯ -PASS XHTML Basic parsing ♂ -PASS XHTML Basic parsing ✠ -PASS XHTML Basic parsing ✠ -PASS XHTML Basic parsing ⤅ -PASS XHTML Basic parsing ↦ -PASS XHTML Basic parsing ↦ -PASS XHTML Basic parsing ↧ -PASS XHTML Basic parsing ↤ -PASS XHTML Basic parsing ↥ -PASS XHTML Basic parsing ▮ -PASS XHTML Basic parsing ⨩ -PASS XHTML Basic parsing М -PASS XHTML Basic parsing м -PASS XHTML Basic parsing — -PASS XHTML Basic parsing ∺ -PASS XHTML Basic parsing ∡ -PASS XHTML Basic parsing   -PASS XHTML Basic parsing ℳ -PASS XHTML Basic parsing 𝔐 -PASS XHTML Basic parsing 𝔪 -PASS XHTML Basic parsing ℧ -PASS XHTML Basic parsing µ -PASS XHTML Basic parsing * -PASS XHTML Basic parsing ⫰ -PASS XHTML Basic parsing ∣ -PASS XHTML Basic parsing · -PASS XHTML Basic parsing ⊟ -PASS XHTML Basic parsing − -PASS XHTML Basic parsing ∸ -PASS XHTML Basic parsing ⨪ -PASS XHTML Basic parsing ∓ -PASS XHTML Basic parsing ⫛ -PASS XHTML Basic parsing … -PASS XHTML Basic parsing ∓ -PASS XHTML Basic parsing ⊧ -PASS XHTML Basic parsing 𝕄 -PASS XHTML Basic parsing 𝕞 -PASS XHTML Basic parsing ∓ -PASS XHTML Basic parsing 𝓂 -PASS XHTML Basic parsing ℳ -PASS XHTML Basic parsing ∾ -PASS XHTML Basic parsing Μ -PASS XHTML Basic parsing μ -PASS XHTML Basic parsing ⊸ -PASS XHTML Basic parsing ⊸ -PASS XHTML Basic parsing ∇ -PASS XHTML Basic parsing Ń -PASS XHTML Basic parsing ń -PASS XHTML Basic parsing ∠⃒ -PASS XHTML Basic parsing ≉ -PASS XHTML Basic parsing ⩰̸ -PASS XHTML Basic parsing ≋̸ -PASS XHTML Basic parsing ʼn -PASS XHTML Basic parsing ≉ -PASS XHTML Basic parsing ♮ -PASS XHTML Basic parsing ℕ -PASS XHTML Basic parsing ♮ -PASS XHTML Basic parsing -PASS XHTML Basic parsing ≎̸ -PASS XHTML Basic parsing ≏̸ -PASS XHTML Basic parsing ⩃ -PASS XHTML Basic parsing Ň -PASS XHTML Basic parsing ň -PASS XHTML Basic parsing Ņ -PASS XHTML Basic parsing ņ -PASS XHTML Basic parsing ≇ -PASS XHTML Basic parsing ⩭̸ -PASS XHTML Basic parsing ⩂ -PASS XHTML Basic parsing Н -PASS XHTML Basic parsing н -PASS XHTML Basic parsing – -PASS XHTML Basic parsing ⤤ -PASS XHTML Basic parsing ↗ -PASS XHTML Basic parsing ⇗ -PASS XHTML Basic parsing ↗ -PASS XHTML Basic parsing ≠ -PASS XHTML Basic parsing ≐̸ -PASS XHTML Basic parsing ​ -PASS XHTML Basic parsing ​ -PASS XHTML Basic parsing ​ -PASS XHTML Basic parsing ​ -PASS XHTML Basic parsing ≢ -PASS XHTML Basic parsing ⤨ -PASS XHTML Basic parsing ≂̸ -PASS XHTML Basic parsing ≫ -PASS XHTML Basic parsing ≪ -PASS XHTML Basic parsing 
 -PASS XHTML Basic parsing ∄ -PASS XHTML Basic parsing ∄ -PASS XHTML Basic parsing 𝔑 -PASS XHTML Basic parsing 𝔫 -PASS XHTML Basic parsing ≧̸ -PASS XHTML Basic parsing ≱ -PASS XHTML Basic parsing ≱ -PASS XHTML Basic parsing ≧̸ -PASS XHTML Basic parsing ⩾̸ -PASS XHTML Basic parsing ⩾̸ -PASS XHTML Basic parsing ⋙̸ -PASS XHTML Basic parsing ≵ -PASS XHTML Basic parsing ≫⃒ -PASS XHTML Basic parsing ≯ -PASS XHTML Basic parsing ≯ -PASS XHTML Basic parsing ≫̸ -PASS XHTML Basic parsing ↮ -PASS XHTML Basic parsing ⇎ -PASS XHTML Basic parsing ⫲ -PASS XHTML Basic parsing ∋ -PASS XHTML Basic parsing ⋼ -PASS XHTML Basic parsing ⋺ -PASS XHTML Basic parsing ∋ -PASS XHTML Basic parsing Њ -PASS XHTML Basic parsing њ -PASS XHTML Basic parsing ↚ -PASS XHTML Basic parsing ⇍ -PASS XHTML Basic parsing ‥ -PASS XHTML Basic parsing ≦̸ -PASS XHTML Basic parsing ≰ -PASS XHTML Basic parsing ↚ -PASS XHTML Basic parsing ⇍ -PASS XHTML Basic parsing ↮ -PASS XHTML Basic parsing ⇎ -PASS XHTML Basic parsing ≰ -PASS XHTML Basic parsing ≦̸ -PASS XHTML Basic parsing ⩽̸ -PASS XHTML Basic parsing ⩽̸ -PASS XHTML Basic parsing ≮ -PASS XHTML Basic parsing ⋘̸ -PASS XHTML Basic parsing ≴ -PASS XHTML Basic parsing ≪⃒ -PASS XHTML Basic parsing ≮ -PASS XHTML Basic parsing ⋪ -PASS XHTML Basic parsing ⋬ -PASS XHTML Basic parsing ≪̸ -PASS XHTML Basic parsing ∤ -PASS XHTML Basic parsing ⁠ -PASS XHTML Basic parsing   -PASS XHTML Basic parsing 𝕟 -PASS XHTML Basic parsing ℕ -PASS XHTML Basic parsing ⫬ -PASS XHTML Basic parsing ¬ -PASS XHTML Basic parsing ≢ -PASS XHTML Basic parsing ≭ -PASS XHTML Basic parsing ∦ -PASS XHTML Basic parsing ∉ -PASS XHTML Basic parsing ≠ -PASS XHTML Basic parsing ≂̸ -PASS XHTML Basic parsing ∄ -PASS XHTML Basic parsing ≯ -PASS XHTML Basic parsing ≱ -PASS XHTML Basic parsing ≧̸ -PASS XHTML Basic parsing ≫̸ -PASS XHTML Basic parsing ≹ -PASS XHTML Basic parsing ⩾̸ -PASS XHTML Basic parsing ≵ -PASS XHTML Basic parsing ≎̸ -PASS XHTML Basic parsing ≏̸ -PASS XHTML Basic parsing ∉ -PASS XHTML Basic parsing ⋵̸ -PASS XHTML Basic parsing ⋹̸ -PASS XHTML Basic parsing ∉ -PASS XHTML Basic parsing ⋷ -PASS XHTML Basic parsing ⋶ -PASS XHTML Basic parsing ⧏̸ -PASS XHTML Basic parsing ⋪ -PASS XHTML Basic parsing ⋬ -PASS XHTML Basic parsing ≮ -PASS XHTML Basic parsing ≰ -PASS XHTML Basic parsing ≸ -PASS XHTML Basic parsing ≪̸ -PASS XHTML Basic parsing ⩽̸ -PASS XHTML Basic parsing ≴ -PASS XHTML Basic parsing ⪢̸ -PASS XHTML Basic parsing ⪡̸ -PASS XHTML Basic parsing ∌ -PASS XHTML Basic parsing ∌ -PASS XHTML Basic parsing ⋾ -PASS XHTML Basic parsing ⋽ -PASS XHTML Basic parsing ⊀ -PASS XHTML Basic parsing ⪯̸ -PASS XHTML Basic parsing ⋠ -PASS XHTML Basic parsing ∌ -PASS XHTML Basic parsing ⧐̸ -PASS XHTML Basic parsing ⋫ -PASS XHTML Basic parsing ⋭ -PASS XHTML Basic parsing ⊏̸ -PASS XHTML Basic parsing ⋢ -PASS XHTML Basic parsing ⊐̸ -PASS XHTML Basic parsing ⋣ -PASS XHTML Basic parsing ⊂⃒ -PASS XHTML Basic parsing ⊈ -PASS XHTML Basic parsing ⊁ -PASS XHTML Basic parsing ⪰̸ -PASS XHTML Basic parsing ⋡ -PASS XHTML Basic parsing ≿̸ -PASS XHTML Basic parsing ⊃⃒ -PASS XHTML Basic parsing ⊉ -PASS XHTML Basic parsing ≁ -PASS XHTML Basic parsing ≄ -PASS XHTML Basic parsing ≇ -PASS XHTML Basic parsing ≉ -PASS XHTML Basic parsing ∤ -PASS XHTML Basic parsing ∦ -PASS XHTML Basic parsing ∦ -PASS XHTML Basic parsing ⫽⃥ -PASS XHTML Basic parsing ∂̸ -PASS XHTML Basic parsing ⨔ -PASS XHTML Basic parsing ⊀ -PASS XHTML Basic parsing ⋠ -PASS XHTML Basic parsing ⊀ -PASS XHTML Basic parsing ⪯̸ -PASS XHTML Basic parsing ⪯̸ -PASS XHTML Basic parsing ⤳̸ -PASS XHTML Basic parsing ↛ -PASS XHTML Basic parsing ⇏ -PASS XHTML Basic parsing ↝̸ -PASS XHTML Basic parsing ↛ -PASS XHTML Basic parsing ⇏ -PASS XHTML Basic parsing ⋫ -PASS XHTML Basic parsing ⋭ -PASS XHTML Basic parsing ⊁ -PASS XHTML Basic parsing ⋡ -PASS XHTML Basic parsing ⪰̸ -PASS XHTML Basic parsing 𝒩 -PASS XHTML Basic parsing 𝓃 -PASS XHTML Basic parsing ∤ -PASS XHTML Basic parsing ∦ -PASS XHTML Basic parsing ≁ -PASS XHTML Basic parsing ≄ -PASS XHTML Basic parsing ≄ -PASS XHTML Basic parsing ∤ -PASS XHTML Basic parsing ∦ -PASS XHTML Basic parsing ⋢ -PASS XHTML Basic parsing ⋣ -PASS XHTML Basic parsing ⊄ -PASS XHTML Basic parsing ⫅̸ -PASS XHTML Basic parsing ⊈ -PASS XHTML Basic parsing ⊂⃒ -PASS XHTML Basic parsing ⊈ -PASS XHTML Basic parsing ⫅̸ -PASS XHTML Basic parsing ⊁ -PASS XHTML Basic parsing ⪰̸ -PASS XHTML Basic parsing ⊅ -PASS XHTML Basic parsing ⫆̸ -PASS XHTML Basic parsing ⊉ -PASS XHTML Basic parsing ⊃⃒ -PASS XHTML Basic parsing ⊉ -PASS XHTML Basic parsing ⫆̸ -PASS XHTML Basic parsing ≹ -PASS XHTML Basic parsing Ñ -PASS XHTML Basic parsing ñ -PASS XHTML Basic parsing ≸ -PASS XHTML Basic parsing ⋪ -PASS XHTML Basic parsing ⋬ -PASS XHTML Basic parsing ⋫ -PASS XHTML Basic parsing ⋭ -PASS XHTML Basic parsing Ν -PASS XHTML Basic parsing ν -PASS XHTML Basic parsing # -PASS XHTML Basic parsing № -PASS XHTML Basic parsing   -PASS XHTML Basic parsing ≍⃒ -PASS XHTML Basic parsing ⊬ -PASS XHTML Basic parsing ⊭ -PASS XHTML Basic parsing ⊮ -PASS XHTML Basic parsing ⊯ -PASS XHTML Basic parsing ≥⃒ -PASS XHTML Basic parsing >⃒ -PASS XHTML Basic parsing ⤄ -PASS XHTML Basic parsing ⧞ -PASS XHTML Basic parsing ⤂ -PASS XHTML Basic parsing ≤⃒ -FAIL XHTML Basic parsing <⃒ assert_equals: XHTML Basic parsing the entity reference caused a parse error; expected 3 but got 1 -PASS XHTML Basic parsing ⊴⃒ -PASS XHTML Basic parsing ⤃ -PASS XHTML Basic parsing ⊵⃒ -PASS XHTML Basic parsing ∼⃒ -PASS XHTML Basic parsing ⤣ -PASS XHTML Basic parsing ↖ -PASS XHTML Basic parsing ⇖ -PASS XHTML Basic parsing ↖ -PASS XHTML Basic parsing ⤧ -PASS XHTML Basic parsing Ó -PASS XHTML Basic parsing ó -PASS XHTML Basic parsing ⊛ -PASS XHTML Basic parsing Ô -PASS XHTML Basic parsing ô -PASS XHTML Basic parsing ⊚ -PASS XHTML Basic parsing О -PASS XHTML Basic parsing о -PASS XHTML Basic parsing ⊝ -PASS XHTML Basic parsing Ő -PASS XHTML Basic parsing ő -PASS XHTML Basic parsing ⨸ -PASS XHTML Basic parsing ⊙ -PASS XHTML Basic parsing ⦼ -PASS XHTML Basic parsing Œ -PASS XHTML Basic parsing œ -PASS XHTML Basic parsing ⦿ -PASS XHTML Basic parsing 𝔒 -PASS XHTML Basic parsing 𝔬 -PASS XHTML Basic parsing ˛ -PASS XHTML Basic parsing Ò -PASS XHTML Basic parsing ò -PASS XHTML Basic parsing ⧁ -PASS XHTML Basic parsing ⦵ -PASS XHTML Basic parsing Ω -PASS XHTML Basic parsing ∮ -PASS XHTML Basic parsing ↺ -PASS XHTML Basic parsing ⦾ -PASS XHTML Basic parsing ⦻ -PASS XHTML Basic parsing ‾ -PASS XHTML Basic parsing ⧀ -PASS XHTML Basic parsing Ō -PASS XHTML Basic parsing ō -PASS XHTML Basic parsing Ω -PASS XHTML Basic parsing ω -PASS XHTML Basic parsing Ο -PASS XHTML Basic parsing ο -PASS XHTML Basic parsing ⦶ -PASS XHTML Basic parsing ⊖ -PASS XHTML Basic parsing 𝕆 -PASS XHTML Basic parsing 𝕠 -PASS XHTML Basic parsing ⦷ -PASS XHTML Basic parsing “ -PASS XHTML Basic parsing ‘ -PASS XHTML Basic parsing ⦹ -PASS XHTML Basic parsing ⊕ -PASS XHTML Basic parsing ↻ -PASS XHTML Basic parsing ⩔ -PASS XHTML Basic parsing ∨ -PASS XHTML Basic parsing ⩝ -PASS XHTML Basic parsing ℴ -PASS XHTML Basic parsing ℴ -PASS XHTML Basic parsing ª -PASS XHTML Basic parsing º -PASS XHTML Basic parsing ⊶ -PASS XHTML Basic parsing ⩖ -PASS XHTML Basic parsing ⩗ -PASS XHTML Basic parsing ⩛ -PASS XHTML Basic parsing Ⓢ -PASS XHTML Basic parsing 𝒪 -PASS XHTML Basic parsing ℴ -PASS XHTML Basic parsing Ø -PASS XHTML Basic parsing ø -PASS XHTML Basic parsing ⊘ -PASS XHTML Basic parsing Õ -PASS XHTML Basic parsing õ -PASS XHTML Basic parsing ⨶ -PASS XHTML Basic parsing ⨷ -PASS XHTML Basic parsing ⊗ -PASS XHTML Basic parsing Ö -PASS XHTML Basic parsing ö -PASS XHTML Basic parsing ⌽ -PASS XHTML Basic parsing ‾ -PASS XHTML Basic parsing ⏞ -PASS XHTML Basic parsing ⎴ -PASS XHTML Basic parsing ⏜ -PASS XHTML Basic parsing ¶ -PASS XHTML Basic parsing ∥ -PASS XHTML Basic parsing ∥ -PASS XHTML Basic parsing ⫳ -PASS XHTML Basic parsing ⫽ -PASS XHTML Basic parsing ∂ -PASS XHTML Basic parsing ∂ -PASS XHTML Basic parsing П -PASS XHTML Basic parsing п -PASS XHTML Basic parsing % -PASS XHTML Basic parsing . -PASS XHTML Basic parsing ‰ -PASS XHTML Basic parsing ⊥ -PASS XHTML Basic parsing ‱ -PASS XHTML Basic parsing 𝔓 -PASS XHTML Basic parsing 𝔭 -PASS XHTML Basic parsing Φ -PASS XHTML Basic parsing φ -PASS XHTML Basic parsing ϕ -PASS XHTML Basic parsing ℳ -PASS XHTML Basic parsing ☎ -PASS XHTML Basic parsing Π -PASS XHTML Basic parsing π -PASS XHTML Basic parsing ⋔ -PASS XHTML Basic parsing ϖ -PASS XHTML Basic parsing ℏ -PASS XHTML Basic parsing ℎ -PASS XHTML Basic parsing ℏ -PASS XHTML Basic parsing ⨣ -PASS XHTML Basic parsing ⊞ -PASS XHTML Basic parsing ⨢ -PASS XHTML Basic parsing + -PASS XHTML Basic parsing ∔ -PASS XHTML Basic parsing ⨥ -PASS XHTML Basic parsing ⩲ -PASS XHTML Basic parsing ± -PASS XHTML Basic parsing ± -PASS XHTML Basic parsing ⨦ -PASS XHTML Basic parsing ⨧ -PASS XHTML Basic parsing ± -PASS XHTML Basic parsing ℌ -PASS XHTML Basic parsing ⨕ -PASS XHTML Basic parsing 𝕡 -PASS XHTML Basic parsing ℙ -PASS XHTML Basic parsing £ -PASS XHTML Basic parsing ⪷ -PASS XHTML Basic parsing ⪻ -PASS XHTML Basic parsing ≺ -PASS XHTML Basic parsing ≼ -PASS XHTML Basic parsing ⪷ -PASS XHTML Basic parsing ≺ -PASS XHTML Basic parsing ≼ -PASS XHTML Basic parsing ≺ -PASS XHTML Basic parsing ⪯ -PASS XHTML Basic parsing ≼ -PASS XHTML Basic parsing ≾ -PASS XHTML Basic parsing ⪯ -PASS XHTML Basic parsing ⪹ -PASS XHTML Basic parsing ⪵ -PASS XHTML Basic parsing ⋨ -PASS XHTML Basic parsing ⪯ -PASS XHTML Basic parsing ⪳ -PASS XHTML Basic parsing ≾ -PASS XHTML Basic parsing ′ -PASS XHTML Basic parsing ″ -PASS XHTML Basic parsing ℙ -PASS XHTML Basic parsing ⪹ -PASS XHTML Basic parsing ⪵ -PASS XHTML Basic parsing ⋨ -PASS XHTML Basic parsing ∏ -PASS XHTML Basic parsing ∏ -PASS XHTML Basic parsing ⌮ -PASS XHTML Basic parsing ⌒ -PASS XHTML Basic parsing ⌓ -PASS XHTML Basic parsing ∝ -PASS XHTML Basic parsing ∝ -PASS XHTML Basic parsing ∷ -PASS XHTML Basic parsing ∝ -PASS XHTML Basic parsing ≾ -PASS XHTML Basic parsing ⊰ -PASS XHTML Basic parsing 𝒫 -PASS XHTML Basic parsing 𝓅 -PASS XHTML Basic parsing Ψ -PASS XHTML Basic parsing ψ -PASS XHTML Basic parsing   -PASS XHTML Basic parsing 𝔔 -PASS XHTML Basic parsing 𝔮 -PASS XHTML Basic parsing ⨌ -PASS XHTML Basic parsing 𝕢 -PASS XHTML Basic parsing ℚ -PASS XHTML Basic parsing ⁗ -PASS XHTML Basic parsing 𝒬 -PASS XHTML Basic parsing 𝓆 -PASS XHTML Basic parsing ℍ -PASS XHTML Basic parsing ⨖ -PASS XHTML Basic parsing ? -PASS XHTML Basic parsing ≟ -PASS XHTML Basic parsing " -PASS XHTML Basic parsing " -PASS XHTML Basic parsing ⇛ -PASS XHTML Basic parsing ∽̱ -PASS XHTML Basic parsing Ŕ -PASS XHTML Basic parsing ŕ -PASS XHTML Basic parsing √ -PASS XHTML Basic parsing ⦳ -PASS XHTML Basic parsing ⟩ -PASS XHTML Basic parsing ⟫ -PASS XHTML Basic parsing ⦒ -PASS XHTML Basic parsing ⦥ -PASS XHTML Basic parsing ⟩ -PASS XHTML Basic parsing » -PASS XHTML Basic parsing ⥵ -PASS XHTML Basic parsing ⇥ -PASS XHTML Basic parsing ⤠ -PASS XHTML Basic parsing ⤳ -PASS XHTML Basic parsing → -PASS XHTML Basic parsing ↠ -PASS XHTML Basic parsing ⇒ -PASS XHTML Basic parsing ⤞ -PASS XHTML Basic parsing ↪ -PASS XHTML Basic parsing ↬ -PASS XHTML Basic parsing ⥅ -PASS XHTML Basic parsing ⥴ -PASS XHTML Basic parsing ⤖ -PASS XHTML Basic parsing ↣ -PASS XHTML Basic parsing ↝ -PASS XHTML Basic parsing ⤚ -PASS XHTML Basic parsing ⤜ -PASS XHTML Basic parsing ∶ -PASS XHTML Basic parsing ℚ -PASS XHTML Basic parsing ⤍ -PASS XHTML Basic parsing ⤏ -PASS XHTML Basic parsing ⤐ -PASS XHTML Basic parsing ❳ -PASS XHTML Basic parsing } -PASS XHTML Basic parsing ] -PASS XHTML Basic parsing ⦌ -PASS XHTML Basic parsing ⦎ -PASS XHTML Basic parsing ⦐ -PASS XHTML Basic parsing Ř -PASS XHTML Basic parsing ř -PASS XHTML Basic parsing Ŗ -PASS XHTML Basic parsing ŗ -PASS XHTML Basic parsing ⌉ -PASS XHTML Basic parsing } -PASS XHTML Basic parsing Р -PASS XHTML Basic parsing р -PASS XHTML Basic parsing ⤷ -PASS XHTML Basic parsing ⥩ -PASS XHTML Basic parsing ” -PASS XHTML Basic parsing ” -PASS XHTML Basic parsing ↳ -PASS XHTML Basic parsing ℜ -PASS XHTML Basic parsing ℛ -PASS XHTML Basic parsing ℜ -PASS XHTML Basic parsing ℝ -PASS XHTML Basic parsing ℜ -PASS XHTML Basic parsing ▭ -PASS XHTML Basic parsing ® -PASS XHTML Basic parsing ® -PASS XHTML Basic parsing ∋ -PASS XHTML Basic parsing ⇋ -PASS XHTML Basic parsing ⥯ -PASS XHTML Basic parsing ⥽ -PASS XHTML Basic parsing ⌋ -PASS XHTML Basic parsing 𝔯 -PASS XHTML Basic parsing ℜ -PASS XHTML Basic parsing ⥤ -PASS XHTML Basic parsing ⇁ -PASS XHTML Basic parsing ⇀ -PASS XHTML Basic parsing ⥬ -PASS XHTML Basic parsing Ρ -PASS XHTML Basic parsing ρ -PASS XHTML Basic parsing ϱ -PASS XHTML Basic parsing ⟩ -PASS XHTML Basic parsing ⇥ -PASS XHTML Basic parsing → -PASS XHTML Basic parsing → -PASS XHTML Basic parsing ⇒ -PASS XHTML Basic parsing ⇄ -PASS XHTML Basic parsing ↣ -PASS XHTML Basic parsing ⌉ -PASS XHTML Basic parsing ⟧ -PASS XHTML Basic parsing ⥝ -PASS XHTML Basic parsing ⥕ -PASS XHTML Basic parsing ⇂ -PASS XHTML Basic parsing ⌋ -PASS XHTML Basic parsing ⇁ -PASS XHTML Basic parsing ⇀ -PASS XHTML Basic parsing ⇄ -PASS XHTML Basic parsing ⇌ -PASS XHTML Basic parsing ⇉ -PASS XHTML Basic parsing ↝ -PASS XHTML Basic parsing ↦ -PASS XHTML Basic parsing ⊢ -PASS XHTML Basic parsing ⥛ -PASS XHTML Basic parsing ⋌ -PASS XHTML Basic parsing ⧐ -PASS XHTML Basic parsing ⊳ -PASS XHTML Basic parsing ⊵ -PASS XHTML Basic parsing ⥏ -PASS XHTML Basic parsing ⥜ -PASS XHTML Basic parsing ⥔ -PASS XHTML Basic parsing ↾ -PASS XHTML Basic parsing ⥓ -PASS XHTML Basic parsing ⇀ -PASS XHTML Basic parsing ˚ -PASS XHTML Basic parsing ≓ -PASS XHTML Basic parsing ⇄ -PASS XHTML Basic parsing ⇌ -PASS XHTML Basic parsing ‏ -PASS XHTML Basic parsing ⎱ -PASS XHTML Basic parsing ⎱ -PASS XHTML Basic parsing ⫮ -PASS XHTML Basic parsing ⟭ -PASS XHTML Basic parsing ⇾ -PASS XHTML Basic parsing ⟧ -PASS XHTML Basic parsing ⦆ -PASS XHTML Basic parsing 𝕣 -PASS XHTML Basic parsing ℝ -PASS XHTML Basic parsing ⨮ -PASS XHTML Basic parsing ⨵ -PASS XHTML Basic parsing ⥰ -PASS XHTML Basic parsing ) -PASS XHTML Basic parsing ⦔ -PASS XHTML Basic parsing ⨒ -PASS XHTML Basic parsing ⇉ -PASS XHTML Basic parsing ⇛ -PASS XHTML Basic parsing › -PASS XHTML Basic parsing 𝓇 -PASS XHTML Basic parsing ℛ -PASS XHTML Basic parsing ↱ -PASS XHTML Basic parsing ↱ -PASS XHTML Basic parsing ] -PASS XHTML Basic parsing ’ -PASS XHTML Basic parsing ’ -PASS XHTML Basic parsing ⋌ -PASS XHTML Basic parsing ⋊ -PASS XHTML Basic parsing ▹ -PASS XHTML Basic parsing ⊵ -PASS XHTML Basic parsing ▸ -PASS XHTML Basic parsing ⧎ -PASS XHTML Basic parsing ⧴ -PASS XHTML Basic parsing ⥨ -PASS XHTML Basic parsing ℞ -PASS XHTML Basic parsing Ś -PASS XHTML Basic parsing ś -PASS XHTML Basic parsing ‚ -PASS XHTML Basic parsing ⪸ -PASS XHTML Basic parsing Š -PASS XHTML Basic parsing š -PASS XHTML Basic parsing ⪼ -PASS XHTML Basic parsing ≻ -PASS XHTML Basic parsing ≽ -PASS XHTML Basic parsing ⪰ -PASS XHTML Basic parsing ⪴ -PASS XHTML Basic parsing Ş -PASS XHTML Basic parsing ş -PASS XHTML Basic parsing Ŝ -PASS XHTML Basic parsing ŝ -PASS XHTML Basic parsing ⪺ -PASS XHTML Basic parsing ⪶ -PASS XHTML Basic parsing ⋩ -PASS XHTML Basic parsing ⨓ -PASS XHTML Basic parsing ≿ -PASS XHTML Basic parsing С -PASS XHTML Basic parsing с -PASS XHTML Basic parsing ⊡ -PASS XHTML Basic parsing ⋅ -PASS XHTML Basic parsing ⩦ -PASS XHTML Basic parsing ⤥ -PASS XHTML Basic parsing ↘ -PASS XHTML Basic parsing ⇘ -PASS XHTML Basic parsing ↘ -PASS XHTML Basic parsing § -PASS XHTML Basic parsing ; -PASS XHTML Basic parsing ⤩ -PASS XHTML Basic parsing ∖ -PASS XHTML Basic parsing ∖ -PASS XHTML Basic parsing ✶ -PASS XHTML Basic parsing 𝔖 -PASS XHTML Basic parsing 𝔰 -PASS XHTML Basic parsing ⌢ -PASS XHTML Basic parsing ♯ -PASS XHTML Basic parsing Щ -PASS XHTML Basic parsing щ -PASS XHTML Basic parsing Ш -PASS XHTML Basic parsing ш -PASS XHTML Basic parsing ↓ -PASS XHTML Basic parsing ← -PASS XHTML Basic parsing ∣ -PASS XHTML Basic parsing ∥ -PASS XHTML Basic parsing → -PASS XHTML Basic parsing ↑ -PASS XHTML Basic parsing ­ -PASS XHTML Basic parsing Σ -PASS XHTML Basic parsing σ -PASS XHTML Basic parsing ς -PASS XHTML Basic parsing ς -PASS XHTML Basic parsing ∼ -PASS XHTML Basic parsing ⩪ -PASS XHTML Basic parsing ≃ -PASS XHTML Basic parsing ≃ -PASS XHTML Basic parsing ⪞ -PASS XHTML Basic parsing ⪠ -PASS XHTML Basic parsing ⪝ -PASS XHTML Basic parsing ⪟ -PASS XHTML Basic parsing ≆ -PASS XHTML Basic parsing ⨤ -PASS XHTML Basic parsing ⥲ -PASS XHTML Basic parsing ← -PASS XHTML Basic parsing ∘ -PASS XHTML Basic parsing ∖ -PASS XHTML Basic parsing ⨳ -PASS XHTML Basic parsing ⧤ -PASS XHTML Basic parsing ∣ -PASS XHTML Basic parsing ⌣ -PASS XHTML Basic parsing ⪪ -PASS XHTML Basic parsing ⪬ -PASS XHTML Basic parsing ⪬︀ -PASS XHTML Basic parsing Ь -PASS XHTML Basic parsing ь -PASS XHTML Basic parsing ⌿ -PASS XHTML Basic parsing ⧄ -PASS XHTML Basic parsing / -PASS XHTML Basic parsing 𝕊 -PASS XHTML Basic parsing 𝕤 -PASS XHTML Basic parsing ♠ -PASS XHTML Basic parsing ♠ -PASS XHTML Basic parsing ∥ -PASS XHTML Basic parsing ⊓ -PASS XHTML Basic parsing ⊓︀ -PASS XHTML Basic parsing ⊔ -PASS XHTML Basic parsing ⊔︀ -PASS XHTML Basic parsing √ -PASS XHTML Basic parsing ⊏ -PASS XHTML Basic parsing ⊑ -PASS XHTML Basic parsing ⊏ -PASS XHTML Basic parsing ⊑ -PASS XHTML Basic parsing ⊐ -PASS XHTML Basic parsing ⊒ -PASS XHTML Basic parsing ⊐ -PASS XHTML Basic parsing ⊒ -PASS XHTML Basic parsing □ -PASS XHTML Basic parsing □ -PASS XHTML Basic parsing ⊓ -PASS XHTML Basic parsing ⊏ -PASS XHTML Basic parsing ⊑ -PASS XHTML Basic parsing ⊐ -PASS XHTML Basic parsing ⊒ -PASS XHTML Basic parsing ⊔ -PASS XHTML Basic parsing ▪ -PASS XHTML Basic parsing □ -PASS XHTML Basic parsing ▪ -PASS XHTML Basic parsing → -PASS XHTML Basic parsing 𝒮 -PASS XHTML Basic parsing 𝓈 -PASS XHTML Basic parsing ∖ -PASS XHTML Basic parsing ⌣ -PASS XHTML Basic parsing ⋆ -PASS XHTML Basic parsing ⋆ -PASS XHTML Basic parsing ☆ -PASS XHTML Basic parsing ★ -PASS XHTML Basic parsing ϵ -PASS XHTML Basic parsing ϕ -PASS XHTML Basic parsing ¯ -PASS XHTML Basic parsing ⊂ -PASS XHTML Basic parsing ⋐ -PASS XHTML Basic parsing ⪽ -PASS XHTML Basic parsing ⫅ -PASS XHTML Basic parsing ⊆ -PASS XHTML Basic parsing ⫃ -PASS XHTML Basic parsing ⫁ -PASS XHTML Basic parsing ⫋ -PASS XHTML Basic parsing ⊊ -PASS XHTML Basic parsing ⪿ -PASS XHTML Basic parsing ⥹ -PASS XHTML Basic parsing ⊂ -PASS XHTML Basic parsing ⋐ -PASS XHTML Basic parsing ⊆ -PASS XHTML Basic parsing ⫅ -PASS XHTML Basic parsing ⊆ -PASS XHTML Basic parsing ⊊ -PASS XHTML Basic parsing ⫋ -PASS XHTML Basic parsing ⫇ -PASS XHTML Basic parsing ⫕ -PASS XHTML Basic parsing ⫓ -PASS XHTML Basic parsing ⪸ -PASS XHTML Basic parsing ≻ -PASS XHTML Basic parsing ≽ -PASS XHTML Basic parsing ≻ -PASS XHTML Basic parsing ⪰ -PASS XHTML Basic parsing ≽ -PASS XHTML Basic parsing ≿ -PASS XHTML Basic parsing ⪰ -PASS XHTML Basic parsing ⪺ -PASS XHTML Basic parsing ⪶ -PASS XHTML Basic parsing ⋩ -PASS XHTML Basic parsing ≿ -PASS XHTML Basic parsing ∋ -PASS XHTML Basic parsing ∑ -PASS XHTML Basic parsing ∑ -PASS XHTML Basic parsing ♪ -PASS XHTML Basic parsing ¹ -PASS XHTML Basic parsing ² -PASS XHTML Basic parsing ³ -PASS XHTML Basic parsing ⊃ -PASS XHTML Basic parsing ⋑ -PASS XHTML Basic parsing ⪾ -PASS XHTML Basic parsing ⫘ -PASS XHTML Basic parsing ⫆ -PASS XHTML Basic parsing ⊇ -PASS XHTML Basic parsing ⫄ -PASS XHTML Basic parsing ⊃ -PASS XHTML Basic parsing ⊇ -PASS XHTML Basic parsing ⟉ -PASS XHTML Basic parsing ⫗ -PASS XHTML Basic parsing ⥻ -PASS XHTML Basic parsing ⫂ -PASS XHTML Basic parsing ⫌ -PASS XHTML Basic parsing ⊋ -PASS XHTML Basic parsing ⫀ -PASS XHTML Basic parsing ⊃ -PASS XHTML Basic parsing ⋑ -PASS XHTML Basic parsing ⊇ -PASS XHTML Basic parsing ⫆ -PASS XHTML Basic parsing ⊋ -PASS XHTML Basic parsing ⫌ -PASS XHTML Basic parsing ⫈ -PASS XHTML Basic parsing ⫔ -PASS XHTML Basic parsing ⫖ -PASS XHTML Basic parsing ⤦ -PASS XHTML Basic parsing ↙ -PASS XHTML Basic parsing ⇙ -PASS XHTML Basic parsing ↙ -PASS XHTML Basic parsing ⤪ -PASS XHTML Basic parsing ß -PASS XHTML Basic parsing 	 -PASS XHTML Basic parsing ⌖ -PASS XHTML Basic parsing Τ -PASS XHTML Basic parsing τ -PASS XHTML Basic parsing ⎴ -PASS XHTML Basic parsing Ť -PASS XHTML Basic parsing ť -PASS XHTML Basic parsing Ţ -PASS XHTML Basic parsing ţ -PASS XHTML Basic parsing Т -PASS XHTML Basic parsing т -PASS XHTML Basic parsing ⃛ -PASS XHTML Basic parsing ⌕ -PASS XHTML Basic parsing 𝔗 -PASS XHTML Basic parsing 𝔱 -PASS XHTML Basic parsing ∴ -PASS XHTML Basic parsing ∴ -PASS XHTML Basic parsing ∴ -PASS XHTML Basic parsing Θ -PASS XHTML Basic parsing θ -PASS XHTML Basic parsing ϑ -PASS XHTML Basic parsing ϑ -PASS XHTML Basic parsing ≈ -PASS XHTML Basic parsing ∼ -PASS XHTML Basic parsing    -PASS XHTML Basic parsing   -PASS XHTML Basic parsing   -PASS XHTML Basic parsing ≈ -PASS XHTML Basic parsing ∼ -PASS XHTML Basic parsing Þ -PASS XHTML Basic parsing þ -PASS XHTML Basic parsing ˜ -PASS XHTML Basic parsing ∼ -PASS XHTML Basic parsing ≃ -PASS XHTML Basic parsing ≅ -PASS XHTML Basic parsing ≈ -PASS XHTML Basic parsing ⨱ -PASS XHTML Basic parsing ⊠ -PASS XHTML Basic parsing × -PASS XHTML Basic parsing ⨰ -PASS XHTML Basic parsing ∭ -PASS XHTML Basic parsing ⤨ -PASS XHTML Basic parsing ⌶ -PASS XHTML Basic parsing ⫱ -PASS XHTML Basic parsing ⊤ -PASS XHTML Basic parsing 𝕋 -PASS XHTML Basic parsing 𝕥 -PASS XHTML Basic parsing ⫚ -PASS XHTML Basic parsing ⤩ -PASS XHTML Basic parsing ‴ -PASS XHTML Basic parsing ™ -PASS XHTML Basic parsing ™ -PASS XHTML Basic parsing ▵ -PASS XHTML Basic parsing ▿ -PASS XHTML Basic parsing ◃ -PASS XHTML Basic parsing ⊴ -PASS XHTML Basic parsing ≜ -PASS XHTML Basic parsing ▹ -PASS XHTML Basic parsing ⊵ -PASS XHTML Basic parsing ◬ -PASS XHTML Basic parsing ≜ -PASS XHTML Basic parsing ⨺ -PASS XHTML Basic parsing ⃛ -PASS XHTML Basic parsing ⨹ -PASS XHTML Basic parsing ⧍ -PASS XHTML Basic parsing ⨻ -PASS XHTML Basic parsing ⏢ -PASS XHTML Basic parsing 𝒯 -PASS XHTML Basic parsing 𝓉 -PASS XHTML Basic parsing Ц -PASS XHTML Basic parsing ц -PASS XHTML Basic parsing Ћ -PASS XHTML Basic parsing ћ -PASS XHTML Basic parsing Ŧ -PASS XHTML Basic parsing ŧ -PASS XHTML Basic parsing ≬ -PASS XHTML Basic parsing ↞ -PASS XHTML Basic parsing ↠ -PASS XHTML Basic parsing Ú -PASS XHTML Basic parsing ú -PASS XHTML Basic parsing ↑ -PASS XHTML Basic parsing ↟ -PASS XHTML Basic parsing ⇑ -PASS XHTML Basic parsing ⥉ -PASS XHTML Basic parsing Ў -PASS XHTML Basic parsing ў -PASS XHTML Basic parsing Ŭ -PASS XHTML Basic parsing ŭ -PASS XHTML Basic parsing Û -PASS XHTML Basic parsing û -PASS XHTML Basic parsing У -PASS XHTML Basic parsing у -PASS XHTML Basic parsing ⇅ -PASS XHTML Basic parsing Ű -PASS XHTML Basic parsing ű -PASS XHTML Basic parsing ⥮ -PASS XHTML Basic parsing ⥾ -PASS XHTML Basic parsing 𝔘 -PASS XHTML Basic parsing 𝔲 -PASS XHTML Basic parsing Ù -PASS XHTML Basic parsing ù -PASS XHTML Basic parsing ⥣ -PASS XHTML Basic parsing ↿ -PASS XHTML Basic parsing ↾ -PASS XHTML Basic parsing ▀ -PASS XHTML Basic parsing ⌜ -PASS XHTML Basic parsing ⌜ -PASS XHTML Basic parsing ⌏ -PASS XHTML Basic parsing ◸ -PASS XHTML Basic parsing Ū -PASS XHTML Basic parsing ū -PASS XHTML Basic parsing ¨ -PASS XHTML Basic parsing _ -PASS XHTML Basic parsing ⏟ -PASS XHTML Basic parsing ⎵ -PASS XHTML Basic parsing ⏝ -PASS XHTML Basic parsing ⋃ -PASS XHTML Basic parsing ⊎ -PASS XHTML Basic parsing Ų -PASS XHTML Basic parsing ų -PASS XHTML Basic parsing 𝕌 -PASS XHTML Basic parsing 𝕦 -PASS XHTML Basic parsing ⤒ -PASS XHTML Basic parsing ↑ -PASS XHTML Basic parsing ↑ -PASS XHTML Basic parsing ⇑ -PASS XHTML Basic parsing ⇅ -PASS XHTML Basic parsing ↕ -PASS XHTML Basic parsing ↕ -PASS XHTML Basic parsing ⇕ -PASS XHTML Basic parsing ⥮ -PASS XHTML Basic parsing ↿ -PASS XHTML Basic parsing ↾ -PASS XHTML Basic parsing ⊎ -PASS XHTML Basic parsing ↖ -PASS XHTML Basic parsing ↗ -PASS XHTML Basic parsing υ -PASS XHTML Basic parsing ϒ -PASS XHTML Basic parsing ϒ -PASS XHTML Basic parsing Υ -PASS XHTML Basic parsing υ -PASS XHTML Basic parsing ↥ -PASS XHTML Basic parsing ⊥ -PASS XHTML Basic parsing ⇈ -PASS XHTML Basic parsing ⌝ -PASS XHTML Basic parsing ⌝ -PASS XHTML Basic parsing ⌎ -PASS XHTML Basic parsing Ů -PASS XHTML Basic parsing ů -PASS XHTML Basic parsing ◹ -PASS XHTML Basic parsing 𝒰 -PASS XHTML Basic parsing 𝓊 -PASS XHTML Basic parsing ⋰ -PASS XHTML Basic parsing Ũ -PASS XHTML Basic parsing ũ -PASS XHTML Basic parsing ▵ -PASS XHTML Basic parsing ▴ -PASS XHTML Basic parsing ⇈ -PASS XHTML Basic parsing Ü -PASS XHTML Basic parsing ü -PASS XHTML Basic parsing ⦧ -PASS XHTML Basic parsing ⦜ -PASS XHTML Basic parsing ϵ -PASS XHTML Basic parsing ϰ -PASS XHTML Basic parsing ∅ -PASS XHTML Basic parsing ϕ -PASS XHTML Basic parsing ϖ -PASS XHTML Basic parsing ∝ -PASS XHTML Basic parsing ↕ -PASS XHTML Basic parsing ⇕ -PASS XHTML Basic parsing ϱ -PASS XHTML Basic parsing ς -PASS XHTML Basic parsing ⊊︀ -PASS XHTML Basic parsing ⫋︀ -PASS XHTML Basic parsing ⊋︀ -PASS XHTML Basic parsing ⫌︀ -PASS XHTML Basic parsing ϑ -PASS XHTML Basic parsing ⊲ -PASS XHTML Basic parsing ⊳ -PASS XHTML Basic parsing ⫨ -PASS XHTML Basic parsing ⫫ -PASS XHTML Basic parsing ⫩ -PASS XHTML Basic parsing В -PASS XHTML Basic parsing в -PASS XHTML Basic parsing ⊢ -PASS XHTML Basic parsing ⊨ -PASS XHTML Basic parsing ⊩ -PASS XHTML Basic parsing ⊫ -PASS XHTML Basic parsing ⫦ -PASS XHTML Basic parsing ⊻ -PASS XHTML Basic parsing ∨ -PASS XHTML Basic parsing ⋁ -PASS XHTML Basic parsing ≚ -PASS XHTML Basic parsing ⋮ -PASS XHTML Basic parsing | -PASS XHTML Basic parsing ‖ -PASS XHTML Basic parsing | -PASS XHTML Basic parsing ‖ -PASS XHTML Basic parsing ∣ -PASS XHTML Basic parsing | -PASS XHTML Basic parsing ❘ -PASS XHTML Basic parsing ≀ -PASS XHTML Basic parsing   -PASS XHTML Basic parsing 𝔙 -PASS XHTML Basic parsing 𝔳 -PASS XHTML Basic parsing ⊲ -PASS XHTML Basic parsing ⊂⃒ -PASS XHTML Basic parsing ⊃⃒ -PASS XHTML Basic parsing 𝕍 -PASS XHTML Basic parsing 𝕧 -PASS XHTML Basic parsing ∝ -PASS XHTML Basic parsing ⊳ -PASS XHTML Basic parsing 𝒱 -PASS XHTML Basic parsing 𝓋 -PASS XHTML Basic parsing ⫋︀ -PASS XHTML Basic parsing ⊊︀ -PASS XHTML Basic parsing ⫌︀ -PASS XHTML Basic parsing ⊋︀ -PASS XHTML Basic parsing ⊪ -PASS XHTML Basic parsing ⦚ -PASS XHTML Basic parsing Ŵ -PASS XHTML Basic parsing ŵ -PASS XHTML Basic parsing ⩟ -PASS XHTML Basic parsing ∧ -PASS XHTML Basic parsing ⋀ -PASS XHTML Basic parsing ≙ -PASS XHTML Basic parsing ℘ -PASS XHTML Basic parsing 𝔚 -PASS XHTML Basic parsing 𝔴 -PASS XHTML Basic parsing 𝕎 -PASS XHTML Basic parsing 𝕨 -PASS XHTML Basic parsing ℘ -PASS XHTML Basic parsing ≀ -PASS XHTML Basic parsing ≀ -PASS XHTML Basic parsing 𝒲 -PASS XHTML Basic parsing 𝓌 -PASS XHTML Basic parsing ⋂ -PASS XHTML Basic parsing ◯ -PASS XHTML Basic parsing ⋃ -PASS XHTML Basic parsing ▽ -PASS XHTML Basic parsing 𝔛 -PASS XHTML Basic parsing 𝔵 -PASS XHTML Basic parsing ⟷ -PASS XHTML Basic parsing ⟺ -PASS XHTML Basic parsing Ξ -PASS XHTML Basic parsing ξ -PASS XHTML Basic parsing ⟵ -PASS XHTML Basic parsing ⟸ -PASS XHTML Basic parsing ⟼ -PASS XHTML Basic parsing ⋻ -PASS XHTML Basic parsing ⨀ -PASS XHTML Basic parsing 𝕏 -PASS XHTML Basic parsing 𝕩 -PASS XHTML Basic parsing ⨁ -PASS XHTML Basic parsing ⨂ -PASS XHTML Basic parsing ⟶ -PASS XHTML Basic parsing ⟹ -PASS XHTML Basic parsing 𝒳 -PASS XHTML Basic parsing 𝓍 -PASS XHTML Basic parsing ⨆ -PASS XHTML Basic parsing ⨄ -PASS XHTML Basic parsing △ -PASS XHTML Basic parsing ⋁ -PASS XHTML Basic parsing ⋀ -PASS XHTML Basic parsing Ý -PASS XHTML Basic parsing ý -PASS XHTML Basic parsing Я -PASS XHTML Basic parsing я -PASS XHTML Basic parsing Ŷ -PASS XHTML Basic parsing ŷ -PASS XHTML Basic parsing Ы -PASS XHTML Basic parsing ы -PASS XHTML Basic parsing ¥ -PASS XHTML Basic parsing 𝔜 -PASS XHTML Basic parsing 𝔶 -PASS XHTML Basic parsing Ї -PASS XHTML Basic parsing ї -PASS XHTML Basic parsing 𝕐 -PASS XHTML Basic parsing 𝕪 -PASS XHTML Basic parsing 𝒴 -PASS XHTML Basic parsing 𝓎 -PASS XHTML Basic parsing Ю -PASS XHTML Basic parsing ю -PASS XHTML Basic parsing ÿ -PASS XHTML Basic parsing Ÿ -PASS XHTML Basic parsing Ź -PASS XHTML Basic parsing ź -PASS XHTML Basic parsing Ž -PASS XHTML Basic parsing ž -PASS XHTML Basic parsing З -PASS XHTML Basic parsing з -PASS XHTML Basic parsing Ż -PASS XHTML Basic parsing ż -PASS XHTML Basic parsing ℨ -PASS XHTML Basic parsing ​ -PASS XHTML Basic parsing Ζ -PASS XHTML Basic parsing ζ -PASS XHTML Basic parsing 𝔷 -PASS XHTML Basic parsing ℨ -PASS XHTML Basic parsing Ж -PASS XHTML Basic parsing ж -PASS XHTML Basic parsing ⇝ -PASS XHTML Basic parsing 𝕫 -PASS XHTML Basic parsing ℤ -PASS XHTML Basic parsing 𝒵 -PASS XHTML Basic parsing 𝓏 -PASS XHTML Basic parsing ‍ -PASS XHTML Basic parsing ‌ -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-6-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-6-expected.txt deleted file mode 100644 index 777395a..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-6-expected.txt +++ /dev/null
@@ -1,2129 +0,0 @@ -This is a testharness.js-based test. -Found 2125 tests; 2122 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS XHTML1.1+MathML parsing Á -PASS XHTML1.1+MathML parsing á -PASS XHTML1.1+MathML parsing Ă -PASS XHTML1.1+MathML parsing ă -PASS XHTML1.1+MathML parsing ∾ -PASS XHTML1.1+MathML parsing ∿ -PASS XHTML1.1+MathML parsing ∾̳ -PASS XHTML1.1+MathML parsing  -PASS XHTML1.1+MathML parsing â -PASS XHTML1.1+MathML parsing ´ -PASS XHTML1.1+MathML parsing А -PASS XHTML1.1+MathML parsing а -PASS XHTML1.1+MathML parsing Æ -PASS XHTML1.1+MathML parsing æ -PASS XHTML1.1+MathML parsing ⁡ -PASS XHTML1.1+MathML parsing 𝔄 -PASS XHTML1.1+MathML parsing 𝔞 -PASS XHTML1.1+MathML parsing À -PASS XHTML1.1+MathML parsing à -PASS XHTML1.1+MathML parsing ℵ -PASS XHTML1.1+MathML parsing ℵ -PASS XHTML1.1+MathML parsing Α -PASS XHTML1.1+MathML parsing α -PASS XHTML1.1+MathML parsing Ā -PASS XHTML1.1+MathML parsing ā -PASS XHTML1.1+MathML parsing ⨿ -PASS XHTML1.1+MathML parsing & -FAIL XHTML1.1+MathML parsing & assert_true: expected true got false -PASS XHTML1.1+MathML parsing ⩕ -PASS XHTML1.1+MathML parsing ⩓ -PASS XHTML1.1+MathML parsing ∧ -PASS XHTML1.1+MathML parsing ⩜ -PASS XHTML1.1+MathML parsing ⩘ -PASS XHTML1.1+MathML parsing ⩚ -PASS XHTML1.1+MathML parsing ∠ -PASS XHTML1.1+MathML parsing ⦤ -PASS XHTML1.1+MathML parsing ∠ -PASS XHTML1.1+MathML parsing ⦨ -PASS XHTML1.1+MathML parsing ⦩ -PASS XHTML1.1+MathML parsing ⦪ -PASS XHTML1.1+MathML parsing ⦫ -PASS XHTML1.1+MathML parsing ⦬ -PASS XHTML1.1+MathML parsing ⦭ -PASS XHTML1.1+MathML parsing ⦮ -PASS XHTML1.1+MathML parsing ⦯ -PASS XHTML1.1+MathML parsing ∡ -PASS XHTML1.1+MathML parsing ∟ -PASS XHTML1.1+MathML parsing ⊾ -PASS XHTML1.1+MathML parsing ⦝ -PASS XHTML1.1+MathML parsing ∢ -PASS XHTML1.1+MathML parsing Å -PASS XHTML1.1+MathML parsing ⍼ -PASS XHTML1.1+MathML parsing Ą -PASS XHTML1.1+MathML parsing ą -PASS XHTML1.1+MathML parsing 𝔸 -PASS XHTML1.1+MathML parsing 𝕒 -PASS XHTML1.1+MathML parsing ⩯ -PASS XHTML1.1+MathML parsing ≈ -PASS XHTML1.1+MathML parsing ⩰ -PASS XHTML1.1+MathML parsing ≊ -PASS XHTML1.1+MathML parsing ≋ -PASS XHTML1.1+MathML parsing ' -PASS XHTML1.1+MathML parsing ⁡ -PASS XHTML1.1+MathML parsing ≈ -PASS XHTML1.1+MathML parsing ≊ -PASS XHTML1.1+MathML parsing Å -PASS XHTML1.1+MathML parsing å -PASS XHTML1.1+MathML parsing 𝒜 -PASS XHTML1.1+MathML parsing 𝒶 -PASS XHTML1.1+MathML parsing ≔ -PASS XHTML1.1+MathML parsing * -PASS XHTML1.1+MathML parsing ≈ -PASS XHTML1.1+MathML parsing ≍ -PASS XHTML1.1+MathML parsing à -PASS XHTML1.1+MathML parsing ã -PASS XHTML1.1+MathML parsing Ä -PASS XHTML1.1+MathML parsing ä -PASS XHTML1.1+MathML parsing ∳ -PASS XHTML1.1+MathML parsing ⨑ -PASS XHTML1.1+MathML parsing ≌ -PASS XHTML1.1+MathML parsing ϶ -PASS XHTML1.1+MathML parsing ‵ -PASS XHTML1.1+MathML parsing ∽ -PASS XHTML1.1+MathML parsing ⋍ -PASS XHTML1.1+MathML parsing ∖ -PASS XHTML1.1+MathML parsing ⫧ -PASS XHTML1.1+MathML parsing ⊽ -PASS XHTML1.1+MathML parsing ⌅ -PASS XHTML1.1+MathML parsing ⌆ -PASS XHTML1.1+MathML parsing ⌅ -PASS XHTML1.1+MathML parsing ⎵ -PASS XHTML1.1+MathML parsing ⎶ -PASS XHTML1.1+MathML parsing ≌ -PASS XHTML1.1+MathML parsing Б -PASS XHTML1.1+MathML parsing б -PASS XHTML1.1+MathML parsing „ -PASS XHTML1.1+MathML parsing ∵ -PASS XHTML1.1+MathML parsing ∵ -PASS XHTML1.1+MathML parsing ∵ -PASS XHTML1.1+MathML parsing ⦰ -PASS XHTML1.1+MathML parsing ϶ -PASS XHTML1.1+MathML parsing ℬ -PASS XHTML1.1+MathML parsing ℬ -PASS XHTML1.1+MathML parsing Β -PASS XHTML1.1+MathML parsing β -PASS XHTML1.1+MathML parsing ℶ -PASS XHTML1.1+MathML parsing ≬ -PASS XHTML1.1+MathML parsing 𝔅 -PASS XHTML1.1+MathML parsing 𝔟 -PASS XHTML1.1+MathML parsing ⋂ -PASS XHTML1.1+MathML parsing ◯ -PASS XHTML1.1+MathML parsing ⋃ -PASS XHTML1.1+MathML parsing ⨀ -PASS XHTML1.1+MathML parsing ⨁ -PASS XHTML1.1+MathML parsing ⨂ -PASS XHTML1.1+MathML parsing ⨆ -PASS XHTML1.1+MathML parsing ★ -PASS XHTML1.1+MathML parsing ▽ -PASS XHTML1.1+MathML parsing △ -PASS XHTML1.1+MathML parsing ⨄ -PASS XHTML1.1+MathML parsing ⋁ -PASS XHTML1.1+MathML parsing ⋀ -PASS XHTML1.1+MathML parsing ⤍ -PASS XHTML1.1+MathML parsing ⧫ -PASS XHTML1.1+MathML parsing ▪ -PASS XHTML1.1+MathML parsing ▴ -PASS XHTML1.1+MathML parsing ▾ -PASS XHTML1.1+MathML parsing ◂ -PASS XHTML1.1+MathML parsing ▸ -PASS XHTML1.1+MathML parsing ␣ -PASS XHTML1.1+MathML parsing ▒ -PASS XHTML1.1+MathML parsing ░ -PASS XHTML1.1+MathML parsing ▓ -PASS XHTML1.1+MathML parsing █ -PASS XHTML1.1+MathML parsing =⃥ -PASS XHTML1.1+MathML parsing ≡⃥ -PASS XHTML1.1+MathML parsing ⫭ -PASS XHTML1.1+MathML parsing ⌐ -PASS XHTML1.1+MathML parsing 𝔹 -PASS XHTML1.1+MathML parsing 𝕓 -PASS XHTML1.1+MathML parsing ⊥ -PASS XHTML1.1+MathML parsing ⊥ -PASS XHTML1.1+MathML parsing ⋈ -PASS XHTML1.1+MathML parsing ⧉ -PASS XHTML1.1+MathML parsing ┐ -PASS XHTML1.1+MathML parsing ╕ -PASS XHTML1.1+MathML parsing ╖ -PASS XHTML1.1+MathML parsing ╗ -PASS XHTML1.1+MathML parsing ┌ -PASS XHTML1.1+MathML parsing ╒ -PASS XHTML1.1+MathML parsing ╓ -PASS XHTML1.1+MathML parsing ╔ -PASS XHTML1.1+MathML parsing ─ -PASS XHTML1.1+MathML parsing ═ -PASS XHTML1.1+MathML parsing ┬ -PASS XHTML1.1+MathML parsing ╤ -PASS XHTML1.1+MathML parsing ╥ -PASS XHTML1.1+MathML parsing ╦ -PASS XHTML1.1+MathML parsing ┴ -PASS XHTML1.1+MathML parsing ╧ -PASS XHTML1.1+MathML parsing ╨ -PASS XHTML1.1+MathML parsing ╩ -PASS XHTML1.1+MathML parsing ⊟ -PASS XHTML1.1+MathML parsing ⊞ -PASS XHTML1.1+MathML parsing ⊠ -PASS XHTML1.1+MathML parsing ┘ -PASS XHTML1.1+MathML parsing ╛ -PASS XHTML1.1+MathML parsing ╜ -PASS XHTML1.1+MathML parsing ╝ -PASS XHTML1.1+MathML parsing └ -PASS XHTML1.1+MathML parsing ╘ -PASS XHTML1.1+MathML parsing ╙ -PASS XHTML1.1+MathML parsing ╚ -PASS XHTML1.1+MathML parsing │ -PASS XHTML1.1+MathML parsing ║ -PASS XHTML1.1+MathML parsing ┼ -PASS XHTML1.1+MathML parsing ╪ -PASS XHTML1.1+MathML parsing ╫ -PASS XHTML1.1+MathML parsing ╬ -PASS XHTML1.1+MathML parsing ┤ -PASS XHTML1.1+MathML parsing ╡ -PASS XHTML1.1+MathML parsing ╢ -PASS XHTML1.1+MathML parsing ╣ -PASS XHTML1.1+MathML parsing ├ -PASS XHTML1.1+MathML parsing ╞ -PASS XHTML1.1+MathML parsing ╟ -PASS XHTML1.1+MathML parsing ╠ -PASS XHTML1.1+MathML parsing ‵ -PASS XHTML1.1+MathML parsing ˘ -PASS XHTML1.1+MathML parsing ˘ -PASS XHTML1.1+MathML parsing ¦ -PASS XHTML1.1+MathML parsing 𝒷 -PASS XHTML1.1+MathML parsing ℬ -PASS XHTML1.1+MathML parsing ⁏ -PASS XHTML1.1+MathML parsing ∽ -PASS XHTML1.1+MathML parsing ⋍ -PASS XHTML1.1+MathML parsing ⧅ -PASS XHTML1.1+MathML parsing \ -PASS XHTML1.1+MathML parsing ⟈ -PASS XHTML1.1+MathML parsing • -PASS XHTML1.1+MathML parsing • -PASS XHTML1.1+MathML parsing ≎ -PASS XHTML1.1+MathML parsing ⪮ -PASS XHTML1.1+MathML parsing ≏ -PASS XHTML1.1+MathML parsing ≎ -PASS XHTML1.1+MathML parsing ≏ -PASS XHTML1.1+MathML parsing Ć -PASS XHTML1.1+MathML parsing ć -PASS XHTML1.1+MathML parsing ⩄ -PASS XHTML1.1+MathML parsing ⩉ -PASS XHTML1.1+MathML parsing ⩋ -PASS XHTML1.1+MathML parsing ∩ -PASS XHTML1.1+MathML parsing ⋒ -PASS XHTML1.1+MathML parsing ⩇ -PASS XHTML1.1+MathML parsing ⩀ -PASS XHTML1.1+MathML parsing ⅅ -PASS XHTML1.1+MathML parsing ∩︀ -PASS XHTML1.1+MathML parsing ⁁ -PASS XHTML1.1+MathML parsing ˇ -PASS XHTML1.1+MathML parsing ℭ -PASS XHTML1.1+MathML parsing ⩍ -PASS XHTML1.1+MathML parsing Č -PASS XHTML1.1+MathML parsing č -PASS XHTML1.1+MathML parsing Ç -PASS XHTML1.1+MathML parsing ç -PASS XHTML1.1+MathML parsing Ĉ -PASS XHTML1.1+MathML parsing ĉ -PASS XHTML1.1+MathML parsing ∰ -PASS XHTML1.1+MathML parsing ⩌ -PASS XHTML1.1+MathML parsing ⩐ -PASS XHTML1.1+MathML parsing Ċ -PASS XHTML1.1+MathML parsing ċ -PASS XHTML1.1+MathML parsing ¸ -PASS XHTML1.1+MathML parsing ¸ -PASS XHTML1.1+MathML parsing ⦲ -PASS XHTML1.1+MathML parsing ¢ -PASS XHTML1.1+MathML parsing · -PASS XHTML1.1+MathML parsing · -PASS XHTML1.1+MathML parsing 𝔠 -PASS XHTML1.1+MathML parsing ℭ -PASS XHTML1.1+MathML parsing Ч -PASS XHTML1.1+MathML parsing ч -PASS XHTML1.1+MathML parsing ✓ -PASS XHTML1.1+MathML parsing ✓ -PASS XHTML1.1+MathML parsing Χ -PASS XHTML1.1+MathML parsing χ -PASS XHTML1.1+MathML parsing ˆ -PASS XHTML1.1+MathML parsing ≗ -PASS XHTML1.1+MathML parsing ↺ -PASS XHTML1.1+MathML parsing ↻ -PASS XHTML1.1+MathML parsing ⊛ -PASS XHTML1.1+MathML parsing ⊚ -PASS XHTML1.1+MathML parsing ⊝ -PASS XHTML1.1+MathML parsing ⊙ -PASS XHTML1.1+MathML parsing ® -PASS XHTML1.1+MathML parsing Ⓢ -PASS XHTML1.1+MathML parsing ⊖ -PASS XHTML1.1+MathML parsing ⊕ -PASS XHTML1.1+MathML parsing ⊗ -PASS XHTML1.1+MathML parsing ○ -PASS XHTML1.1+MathML parsing ⧃ -PASS XHTML1.1+MathML parsing ≗ -PASS XHTML1.1+MathML parsing ⨐ -PASS XHTML1.1+MathML parsing ⫯ -PASS XHTML1.1+MathML parsing ⧂ -PASS XHTML1.1+MathML parsing ∲ -PASS XHTML1.1+MathML parsing ” -PASS XHTML1.1+MathML parsing ’ -PASS XHTML1.1+MathML parsing ♣ -PASS XHTML1.1+MathML parsing ♣ -PASS XHTML1.1+MathML parsing : -PASS XHTML1.1+MathML parsing ∷ -PASS XHTML1.1+MathML parsing ⩴ -PASS XHTML1.1+MathML parsing ≔ -PASS XHTML1.1+MathML parsing ≔ -PASS XHTML1.1+MathML parsing , -PASS XHTML1.1+MathML parsing @ -PASS XHTML1.1+MathML parsing ∁ -PASS XHTML1.1+MathML parsing ∘ -PASS XHTML1.1+MathML parsing ∁ -PASS XHTML1.1+MathML parsing ℂ -PASS XHTML1.1+MathML parsing ≅ -PASS XHTML1.1+MathML parsing ⩭ -PASS XHTML1.1+MathML parsing ≡ -PASS XHTML1.1+MathML parsing ∮ -PASS XHTML1.1+MathML parsing ∯ -PASS XHTML1.1+MathML parsing ∮ -PASS XHTML1.1+MathML parsing 𝕔 -PASS XHTML1.1+MathML parsing ℂ -PASS XHTML1.1+MathML parsing ∐ -PASS XHTML1.1+MathML parsing ∐ -PASS XHTML1.1+MathML parsing © -PASS XHTML1.1+MathML parsing © -PASS XHTML1.1+MathML parsing ℗ -PASS XHTML1.1+MathML parsing ∳ -PASS XHTML1.1+MathML parsing ↵ -PASS XHTML1.1+MathML parsing ✗ -PASS XHTML1.1+MathML parsing ⨯ -PASS XHTML1.1+MathML parsing 𝒞 -PASS XHTML1.1+MathML parsing 𝒸 -PASS XHTML1.1+MathML parsing ⫏ -PASS XHTML1.1+MathML parsing ⫑ -PASS XHTML1.1+MathML parsing ⫐ -PASS XHTML1.1+MathML parsing ⫒ -PASS XHTML1.1+MathML parsing ⋯ -PASS XHTML1.1+MathML parsing ⤸ -PASS XHTML1.1+MathML parsing ⤵ -PASS XHTML1.1+MathML parsing ⋞ -PASS XHTML1.1+MathML parsing ⋟ -PASS XHTML1.1+MathML parsing ↶ -PASS XHTML1.1+MathML parsing ⤽ -PASS XHTML1.1+MathML parsing ⩈ -PASS XHTML1.1+MathML parsing ⩆ -PASS XHTML1.1+MathML parsing ≍ -PASS XHTML1.1+MathML parsing ∪ -PASS XHTML1.1+MathML parsing ⋓ -PASS XHTML1.1+MathML parsing ⩊ -PASS XHTML1.1+MathML parsing ⊍ -PASS XHTML1.1+MathML parsing ⩅ -PASS XHTML1.1+MathML parsing ∪︀ -PASS XHTML1.1+MathML parsing ↷ -PASS XHTML1.1+MathML parsing ⤼ -PASS XHTML1.1+MathML parsing ⋞ -PASS XHTML1.1+MathML parsing ⋟ -PASS XHTML1.1+MathML parsing ⋎ -PASS XHTML1.1+MathML parsing ⋏ -PASS XHTML1.1+MathML parsing ¤ -PASS XHTML1.1+MathML parsing ↶ -PASS XHTML1.1+MathML parsing ↷ -PASS XHTML1.1+MathML parsing ⋎ -PASS XHTML1.1+MathML parsing ⋏ -PASS XHTML1.1+MathML parsing ∲ -PASS XHTML1.1+MathML parsing ∱ -PASS XHTML1.1+MathML parsing ⌭ -PASS XHTML1.1+MathML parsing † -PASS XHTML1.1+MathML parsing ‡ -PASS XHTML1.1+MathML parsing ℸ -PASS XHTML1.1+MathML parsing ↓ -PASS XHTML1.1+MathML parsing ↡ -PASS XHTML1.1+MathML parsing ⇓ -PASS XHTML1.1+MathML parsing ‐ -PASS XHTML1.1+MathML parsing ⫤ -PASS XHTML1.1+MathML parsing ⊣ -PASS XHTML1.1+MathML parsing ⤏ -PASS XHTML1.1+MathML parsing ˝ -PASS XHTML1.1+MathML parsing Ď -PASS XHTML1.1+MathML parsing ď -PASS XHTML1.1+MathML parsing Д -PASS XHTML1.1+MathML parsing д -PASS XHTML1.1+MathML parsing ‡ -PASS XHTML1.1+MathML parsing ⇊ -PASS XHTML1.1+MathML parsing ⅅ -PASS XHTML1.1+MathML parsing ⅆ -PASS XHTML1.1+MathML parsing ⤑ -PASS XHTML1.1+MathML parsing ⩷ -PASS XHTML1.1+MathML parsing ° -PASS XHTML1.1+MathML parsing ∇ -PASS XHTML1.1+MathML parsing Δ -PASS XHTML1.1+MathML parsing δ -PASS XHTML1.1+MathML parsing ⦱ -PASS XHTML1.1+MathML parsing ⥿ -PASS XHTML1.1+MathML parsing 𝔇 -PASS XHTML1.1+MathML parsing 𝔡 -PASS XHTML1.1+MathML parsing ⥥ -PASS XHTML1.1+MathML parsing ⇃ -PASS XHTML1.1+MathML parsing ⇂ -PASS XHTML1.1+MathML parsing ´ -PASS XHTML1.1+MathML parsing ˙ -PASS XHTML1.1+MathML parsing ˝ -PASS XHTML1.1+MathML parsing ` -PASS XHTML1.1+MathML parsing ˜ -PASS XHTML1.1+MathML parsing ⋄ -PASS XHTML1.1+MathML parsing ⋄ -PASS XHTML1.1+MathML parsing ⋄ -PASS XHTML1.1+MathML parsing ♦ -PASS XHTML1.1+MathML parsing ♦ -PASS XHTML1.1+MathML parsing ¨ -PASS XHTML1.1+MathML parsing ⅆ -PASS XHTML1.1+MathML parsing ϝ -PASS XHTML1.1+MathML parsing ⋲ -PASS XHTML1.1+MathML parsing ÷ -PASS XHTML1.1+MathML parsing ÷ -PASS XHTML1.1+MathML parsing ⋇ -PASS XHTML1.1+MathML parsing ⋇ -PASS XHTML1.1+MathML parsing Ђ -PASS XHTML1.1+MathML parsing ђ -PASS XHTML1.1+MathML parsing ⌞ -PASS XHTML1.1+MathML parsing ⌍ -PASS XHTML1.1+MathML parsing $ -PASS XHTML1.1+MathML parsing 𝔻 -PASS XHTML1.1+MathML parsing 𝕕 -PASS XHTML1.1+MathML parsing ¨ -PASS XHTML1.1+MathML parsing ˙ -PASS XHTML1.1+MathML parsing ⃜ -PASS XHTML1.1+MathML parsing ≐ -PASS XHTML1.1+MathML parsing ≑ -PASS XHTML1.1+MathML parsing ≐ -PASS XHTML1.1+MathML parsing ∸ -PASS XHTML1.1+MathML parsing ∔ -PASS XHTML1.1+MathML parsing ⊡ -PASS XHTML1.1+MathML parsing ⌆ -PASS XHTML1.1+MathML parsing ∯ -PASS XHTML1.1+MathML parsing ¨ -PASS XHTML1.1+MathML parsing ⇓ -PASS XHTML1.1+MathML parsing ⇐ -PASS XHTML1.1+MathML parsing ⇔ -PASS XHTML1.1+MathML parsing ⫤ -PASS XHTML1.1+MathML parsing ⟸ -PASS XHTML1.1+MathML parsing ⟺ -PASS XHTML1.1+MathML parsing ⟹ -PASS XHTML1.1+MathML parsing ⇒ -PASS XHTML1.1+MathML parsing ⊨ -PASS XHTML1.1+MathML parsing ⇑ -PASS XHTML1.1+MathML parsing ⇕ -PASS XHTML1.1+MathML parsing ∥ -PASS XHTML1.1+MathML parsing ⤓ -PASS XHTML1.1+MathML parsing ↓ -PASS XHTML1.1+MathML parsing ↓ -PASS XHTML1.1+MathML parsing ⇓ -PASS XHTML1.1+MathML parsing ⇵ -PASS XHTML1.1+MathML parsing ̑ -PASS XHTML1.1+MathML parsing ⇊ -PASS XHTML1.1+MathML parsing ⇃ -PASS XHTML1.1+MathML parsing ⇂ -PASS XHTML1.1+MathML parsing ⥐ -PASS XHTML1.1+MathML parsing ⥞ -PASS XHTML1.1+MathML parsing ⥖ -PASS XHTML1.1+MathML parsing ↽ -PASS XHTML1.1+MathML parsing ⥟ -PASS XHTML1.1+MathML parsing ⥗ -PASS XHTML1.1+MathML parsing ⇁ -PASS XHTML1.1+MathML parsing ↧ -PASS XHTML1.1+MathML parsing ⊤ -PASS XHTML1.1+MathML parsing ⤐ -PASS XHTML1.1+MathML parsing ⌟ -PASS XHTML1.1+MathML parsing ⌌ -PASS XHTML1.1+MathML parsing 𝒟 -PASS XHTML1.1+MathML parsing 𝒹 -PASS XHTML1.1+MathML parsing Ѕ -PASS XHTML1.1+MathML parsing ѕ -PASS XHTML1.1+MathML parsing ⧶ -PASS XHTML1.1+MathML parsing Đ -PASS XHTML1.1+MathML parsing đ -PASS XHTML1.1+MathML parsing ⋱ -PASS XHTML1.1+MathML parsing ▿ -PASS XHTML1.1+MathML parsing ▾ -PASS XHTML1.1+MathML parsing ⇵ -PASS XHTML1.1+MathML parsing ⥯ -PASS XHTML1.1+MathML parsing ⦦ -PASS XHTML1.1+MathML parsing Џ -PASS XHTML1.1+MathML parsing џ -PASS XHTML1.1+MathML parsing ⟿ -PASS XHTML1.1+MathML parsing É -PASS XHTML1.1+MathML parsing é -PASS XHTML1.1+MathML parsing ⩮ -PASS XHTML1.1+MathML parsing Ě -PASS XHTML1.1+MathML parsing ě -PASS XHTML1.1+MathML parsing Ê -PASS XHTML1.1+MathML parsing ê -PASS XHTML1.1+MathML parsing ≖ -PASS XHTML1.1+MathML parsing ≕ -PASS XHTML1.1+MathML parsing Э -PASS XHTML1.1+MathML parsing э -PASS XHTML1.1+MathML parsing ⩷ -PASS XHTML1.1+MathML parsing Ė -PASS XHTML1.1+MathML parsing ė -PASS XHTML1.1+MathML parsing ≑ -PASS XHTML1.1+MathML parsing ⅇ -PASS XHTML1.1+MathML parsing ≒ -PASS XHTML1.1+MathML parsing 𝔈 -PASS XHTML1.1+MathML parsing 𝔢 -PASS XHTML1.1+MathML parsing ⪚ -PASS XHTML1.1+MathML parsing È -PASS XHTML1.1+MathML parsing è -PASS XHTML1.1+MathML parsing ⪖ -PASS XHTML1.1+MathML parsing ⪘ -PASS XHTML1.1+MathML parsing ⪙ -PASS XHTML1.1+MathML parsing ∈ -PASS XHTML1.1+MathML parsing ⏧ -PASS XHTML1.1+MathML parsing ℓ -PASS XHTML1.1+MathML parsing ⪕ -PASS XHTML1.1+MathML parsing ⪗ -PASS XHTML1.1+MathML parsing Ē -PASS XHTML1.1+MathML parsing ē -PASS XHTML1.1+MathML parsing ∅ -PASS XHTML1.1+MathML parsing ∅ -PASS XHTML1.1+MathML parsing ◻ -PASS XHTML1.1+MathML parsing ∅ -PASS XHTML1.1+MathML parsing ▫ -PASS XHTML1.1+MathML parsing   -PASS XHTML1.1+MathML parsing   -PASS XHTML1.1+MathML parsing   -PASS XHTML1.1+MathML parsing Ŋ -PASS XHTML1.1+MathML parsing ŋ -PASS XHTML1.1+MathML parsing   -PASS XHTML1.1+MathML parsing Ę -PASS XHTML1.1+MathML parsing ę -PASS XHTML1.1+MathML parsing 𝔼 -PASS XHTML1.1+MathML parsing 𝕖 -PASS XHTML1.1+MathML parsing ⋕ -PASS XHTML1.1+MathML parsing ⧣ -PASS XHTML1.1+MathML parsing ⩱ -PASS XHTML1.1+MathML parsing ε -PASS XHTML1.1+MathML parsing Ε -PASS XHTML1.1+MathML parsing ε -PASS XHTML1.1+MathML parsing ϵ -PASS XHTML1.1+MathML parsing ≖ -PASS XHTML1.1+MathML parsing ≕ -PASS XHTML1.1+MathML parsing ≂ -PASS XHTML1.1+MathML parsing ⪖ -PASS XHTML1.1+MathML parsing ⪕ -PASS XHTML1.1+MathML parsing ⩵ -PASS XHTML1.1+MathML parsing = -PASS XHTML1.1+MathML parsing ≂ -PASS XHTML1.1+MathML parsing ≟ -PASS XHTML1.1+MathML parsing ⇌ -PASS XHTML1.1+MathML parsing ≡ -PASS XHTML1.1+MathML parsing ⩸ -PASS XHTML1.1+MathML parsing ⧥ -PASS XHTML1.1+MathML parsing ⥱ -PASS XHTML1.1+MathML parsing ≓ -PASS XHTML1.1+MathML parsing ℯ -PASS XHTML1.1+MathML parsing ℰ -PASS XHTML1.1+MathML parsing ≐ -PASS XHTML1.1+MathML parsing ⩳ -PASS XHTML1.1+MathML parsing ≂ -PASS XHTML1.1+MathML parsing Η -PASS XHTML1.1+MathML parsing η -PASS XHTML1.1+MathML parsing Ð -PASS XHTML1.1+MathML parsing ð -PASS XHTML1.1+MathML parsing Ë -PASS XHTML1.1+MathML parsing ë -PASS XHTML1.1+MathML parsing € -PASS XHTML1.1+MathML parsing ! -PASS XHTML1.1+MathML parsing ∃ -PASS XHTML1.1+MathML parsing ∃ -PASS XHTML1.1+MathML parsing ℰ -PASS XHTML1.1+MathML parsing ⅇ -PASS XHTML1.1+MathML parsing ⅇ -PASS XHTML1.1+MathML parsing ≒ -PASS XHTML1.1+MathML parsing Ф -PASS XHTML1.1+MathML parsing ф -PASS XHTML1.1+MathML parsing ♀ -PASS XHTML1.1+MathML parsing ffi -PASS XHTML1.1+MathML parsing ff -PASS XHTML1.1+MathML parsing ffl -PASS XHTML1.1+MathML parsing 𝔉 -PASS XHTML1.1+MathML parsing 𝔣 -PASS XHTML1.1+MathML parsing fi -PASS XHTML1.1+MathML parsing ◼ -PASS XHTML1.1+MathML parsing ▪ -PASS XHTML1.1+MathML parsing fj -PASS XHTML1.1+MathML parsing ♭ -PASS XHTML1.1+MathML parsing fl -PASS XHTML1.1+MathML parsing ▱ -PASS XHTML1.1+MathML parsing ƒ -PASS XHTML1.1+MathML parsing 𝔽 -PASS XHTML1.1+MathML parsing 𝕗 -PASS XHTML1.1+MathML parsing ∀ -PASS XHTML1.1+MathML parsing ∀ -PASS XHTML1.1+MathML parsing ⋔ -PASS XHTML1.1+MathML parsing ⫙ -PASS XHTML1.1+MathML parsing ℱ -PASS XHTML1.1+MathML parsing ⨍ -PASS XHTML1.1+MathML parsing ½ -PASS XHTML1.1+MathML parsing ⅓ -PASS XHTML1.1+MathML parsing ¼ -PASS XHTML1.1+MathML parsing ⅕ -PASS XHTML1.1+MathML parsing ⅙ -PASS XHTML1.1+MathML parsing ⅛ -PASS XHTML1.1+MathML parsing ⅔ -PASS XHTML1.1+MathML parsing ⅖ -PASS XHTML1.1+MathML parsing ¾ -PASS XHTML1.1+MathML parsing ⅗ -PASS XHTML1.1+MathML parsing ⅜ -PASS XHTML1.1+MathML parsing ⅘ -PASS XHTML1.1+MathML parsing ⅚ -PASS XHTML1.1+MathML parsing ⅝ -PASS XHTML1.1+MathML parsing ⅞ -PASS XHTML1.1+MathML parsing ⁄ -PASS XHTML1.1+MathML parsing ⌢ -PASS XHTML1.1+MathML parsing 𝒻 -PASS XHTML1.1+MathML parsing ℱ -PASS XHTML1.1+MathML parsing ǵ -PASS XHTML1.1+MathML parsing Γ -PASS XHTML1.1+MathML parsing γ -PASS XHTML1.1+MathML parsing Ϝ -PASS XHTML1.1+MathML parsing ϝ -PASS XHTML1.1+MathML parsing ⪆ -PASS XHTML1.1+MathML parsing Ğ -PASS XHTML1.1+MathML parsing ğ -PASS XHTML1.1+MathML parsing Ģ -PASS XHTML1.1+MathML parsing Ĝ -PASS XHTML1.1+MathML parsing ĝ -PASS XHTML1.1+MathML parsing Г -PASS XHTML1.1+MathML parsing г -PASS XHTML1.1+MathML parsing Ġ -PASS XHTML1.1+MathML parsing ġ -PASS XHTML1.1+MathML parsing ≥ -PASS XHTML1.1+MathML parsing ≧ -PASS XHTML1.1+MathML parsing ⪌ -PASS XHTML1.1+MathML parsing ⋛ -PASS XHTML1.1+MathML parsing ≥ -PASS XHTML1.1+MathML parsing ≧ -PASS XHTML1.1+MathML parsing ⩾ -PASS XHTML1.1+MathML parsing ⪩ -PASS XHTML1.1+MathML parsing ⩾ -PASS XHTML1.1+MathML parsing ⪀ -PASS XHTML1.1+MathML parsing ⪂ -PASS XHTML1.1+MathML parsing ⪄ -PASS XHTML1.1+MathML parsing ⋛︀ -PASS XHTML1.1+MathML parsing ⪔ -PASS XHTML1.1+MathML parsing 𝔊 -PASS XHTML1.1+MathML parsing 𝔤 -PASS XHTML1.1+MathML parsing ≫ -PASS XHTML1.1+MathML parsing ⋙ -PASS XHTML1.1+MathML parsing ⋙ -PASS XHTML1.1+MathML parsing ℷ -PASS XHTML1.1+MathML parsing Ѓ -PASS XHTML1.1+MathML parsing ѓ -PASS XHTML1.1+MathML parsing ⪥ -PASS XHTML1.1+MathML parsing ≷ -PASS XHTML1.1+MathML parsing ⪒ -PASS XHTML1.1+MathML parsing ⪤ -PASS XHTML1.1+MathML parsing ⪊ -PASS XHTML1.1+MathML parsing ⪊ -PASS XHTML1.1+MathML parsing ⪈ -PASS XHTML1.1+MathML parsing ≩ -PASS XHTML1.1+MathML parsing ⪈ -PASS XHTML1.1+MathML parsing ≩ -PASS XHTML1.1+MathML parsing ⋧ -PASS XHTML1.1+MathML parsing 𝔾 -PASS XHTML1.1+MathML parsing 𝕘 -PASS XHTML1.1+MathML parsing ` -PASS XHTML1.1+MathML parsing ≥ -PASS XHTML1.1+MathML parsing ⋛ -PASS XHTML1.1+MathML parsing ≧ -PASS XHTML1.1+MathML parsing ⪢ -PASS XHTML1.1+MathML parsing ≷ -PASS XHTML1.1+MathML parsing ⩾ -PASS XHTML1.1+MathML parsing ≳ -PASS XHTML1.1+MathML parsing 𝒢 -PASS XHTML1.1+MathML parsing ℊ -PASS XHTML1.1+MathML parsing ≳ -PASS XHTML1.1+MathML parsing ⪎ -PASS XHTML1.1+MathML parsing ⪐ -PASS XHTML1.1+MathML parsing ⪧ -PASS XHTML1.1+MathML parsing ⩺ -PASS XHTML1.1+MathML parsing > -PASS XHTML1.1+MathML parsing > -PASS XHTML1.1+MathML parsing ≫ -PASS XHTML1.1+MathML parsing ⋗ -PASS XHTML1.1+MathML parsing ⦕ -PASS XHTML1.1+MathML parsing ⩼ -PASS XHTML1.1+MathML parsing ⪆ -PASS XHTML1.1+MathML parsing ⥸ -PASS XHTML1.1+MathML parsing ⋗ -PASS XHTML1.1+MathML parsing ⋛ -PASS XHTML1.1+MathML parsing ⪌ -PASS XHTML1.1+MathML parsing ≷ -PASS XHTML1.1+MathML parsing ≳ -PASS XHTML1.1+MathML parsing ≩︀ -PASS XHTML1.1+MathML parsing ≩︀ -PASS XHTML1.1+MathML parsing ˇ -PASS XHTML1.1+MathML parsing   -PASS XHTML1.1+MathML parsing ½ -PASS XHTML1.1+MathML parsing ℋ -PASS XHTML1.1+MathML parsing Ъ -PASS XHTML1.1+MathML parsing ъ -PASS XHTML1.1+MathML parsing ⥈ -PASS XHTML1.1+MathML parsing ↔ -PASS XHTML1.1+MathML parsing ⇔ -PASS XHTML1.1+MathML parsing ↭ -PASS XHTML1.1+MathML parsing ^ -PASS XHTML1.1+MathML parsing ℏ -PASS XHTML1.1+MathML parsing Ĥ -PASS XHTML1.1+MathML parsing ĥ -PASS XHTML1.1+MathML parsing ♥ -PASS XHTML1.1+MathML parsing ♥ -PASS XHTML1.1+MathML parsing … -PASS XHTML1.1+MathML parsing ⊹ -PASS XHTML1.1+MathML parsing 𝔥 -PASS XHTML1.1+MathML parsing ℌ -PASS XHTML1.1+MathML parsing ℋ -PASS XHTML1.1+MathML parsing ⤥ -PASS XHTML1.1+MathML parsing ⤦ -PASS XHTML1.1+MathML parsing ⇿ -PASS XHTML1.1+MathML parsing ∻ -PASS XHTML1.1+MathML parsing ↩ -PASS XHTML1.1+MathML parsing ↪ -PASS XHTML1.1+MathML parsing 𝕙 -PASS XHTML1.1+MathML parsing ℍ -PASS XHTML1.1+MathML parsing ― -PASS XHTML1.1+MathML parsing ─ -PASS XHTML1.1+MathML parsing 𝒽 -PASS XHTML1.1+MathML parsing ℋ -PASS XHTML1.1+MathML parsing ℏ -PASS XHTML1.1+MathML parsing Ħ -PASS XHTML1.1+MathML parsing ħ -PASS XHTML1.1+MathML parsing ≎ -PASS XHTML1.1+MathML parsing ≏ -PASS XHTML1.1+MathML parsing ⁃ -PASS XHTML1.1+MathML parsing ‐ -PASS XHTML1.1+MathML parsing Í -PASS XHTML1.1+MathML parsing í -PASS XHTML1.1+MathML parsing ⁣ -PASS XHTML1.1+MathML parsing Î -PASS XHTML1.1+MathML parsing î -PASS XHTML1.1+MathML parsing И -PASS XHTML1.1+MathML parsing и -PASS XHTML1.1+MathML parsing İ -PASS XHTML1.1+MathML parsing Е -PASS XHTML1.1+MathML parsing е -PASS XHTML1.1+MathML parsing ¡ -PASS XHTML1.1+MathML parsing ⇔ -PASS XHTML1.1+MathML parsing 𝔦 -PASS XHTML1.1+MathML parsing ℑ -PASS XHTML1.1+MathML parsing Ì -PASS XHTML1.1+MathML parsing ì -PASS XHTML1.1+MathML parsing ⅈ -PASS XHTML1.1+MathML parsing ⨌ -PASS XHTML1.1+MathML parsing ∭ -PASS XHTML1.1+MathML parsing ⧜ -PASS XHTML1.1+MathML parsing ℩ -PASS XHTML1.1+MathML parsing IJ -PASS XHTML1.1+MathML parsing ij -PASS XHTML1.1+MathML parsing Ī -PASS XHTML1.1+MathML parsing ī -PASS XHTML1.1+MathML parsing ℑ -PASS XHTML1.1+MathML parsing ⅈ -PASS XHTML1.1+MathML parsing ℐ -PASS XHTML1.1+MathML parsing ℑ -PASS XHTML1.1+MathML parsing ı -PASS XHTML1.1+MathML parsing ℑ -PASS XHTML1.1+MathML parsing ⊷ -PASS XHTML1.1+MathML parsing Ƶ -PASS XHTML1.1+MathML parsing ⇒ -PASS XHTML1.1+MathML parsing ℅ -PASS XHTML1.1+MathML parsing ∈ -PASS XHTML1.1+MathML parsing ∞ -PASS XHTML1.1+MathML parsing ⧝ -PASS XHTML1.1+MathML parsing ı -PASS XHTML1.1+MathML parsing ⊺ -PASS XHTML1.1+MathML parsing ∫ -PASS XHTML1.1+MathML parsing ∬ -PASS XHTML1.1+MathML parsing ℤ -PASS XHTML1.1+MathML parsing ∫ -PASS XHTML1.1+MathML parsing ⊺ -PASS XHTML1.1+MathML parsing ⋂ -PASS XHTML1.1+MathML parsing ⨗ -PASS XHTML1.1+MathML parsing ⨼ -PASS XHTML1.1+MathML parsing ⁣ -PASS XHTML1.1+MathML parsing ⁢ -PASS XHTML1.1+MathML parsing Ё -PASS XHTML1.1+MathML parsing ё -PASS XHTML1.1+MathML parsing Į -PASS XHTML1.1+MathML parsing į -PASS XHTML1.1+MathML parsing 𝕀 -PASS XHTML1.1+MathML parsing 𝕚 -PASS XHTML1.1+MathML parsing Ι -PASS XHTML1.1+MathML parsing ι -PASS XHTML1.1+MathML parsing ⨼ -PASS XHTML1.1+MathML parsing ¿ -PASS XHTML1.1+MathML parsing 𝒾 -PASS XHTML1.1+MathML parsing ℐ -PASS XHTML1.1+MathML parsing ∈ -PASS XHTML1.1+MathML parsing ⋵ -PASS XHTML1.1+MathML parsing ⋹ -PASS XHTML1.1+MathML parsing ⋴ -PASS XHTML1.1+MathML parsing ⋳ -PASS XHTML1.1+MathML parsing ∈ -PASS XHTML1.1+MathML parsing ⁢ -PASS XHTML1.1+MathML parsing Ĩ -PASS XHTML1.1+MathML parsing ĩ -PASS XHTML1.1+MathML parsing І -PASS XHTML1.1+MathML parsing і -PASS XHTML1.1+MathML parsing Ï -PASS XHTML1.1+MathML parsing ï -PASS XHTML1.1+MathML parsing Ĵ -PASS XHTML1.1+MathML parsing ĵ -PASS XHTML1.1+MathML parsing Й -PASS XHTML1.1+MathML parsing й -PASS XHTML1.1+MathML parsing 𝔍 -PASS XHTML1.1+MathML parsing 𝔧 -PASS XHTML1.1+MathML parsing ȷ -PASS XHTML1.1+MathML parsing 𝕁 -PASS XHTML1.1+MathML parsing 𝕛 -PASS XHTML1.1+MathML parsing 𝒥 -PASS XHTML1.1+MathML parsing 𝒿 -PASS XHTML1.1+MathML parsing Ј -PASS XHTML1.1+MathML parsing ј -PASS XHTML1.1+MathML parsing Є -PASS XHTML1.1+MathML parsing є -PASS XHTML1.1+MathML parsing Κ -PASS XHTML1.1+MathML parsing κ -PASS XHTML1.1+MathML parsing ϰ -PASS XHTML1.1+MathML parsing Ķ -PASS XHTML1.1+MathML parsing ķ -PASS XHTML1.1+MathML parsing К -PASS XHTML1.1+MathML parsing к -PASS XHTML1.1+MathML parsing 𝔎 -PASS XHTML1.1+MathML parsing 𝔨 -PASS XHTML1.1+MathML parsing ĸ -PASS XHTML1.1+MathML parsing Х -PASS XHTML1.1+MathML parsing х -PASS XHTML1.1+MathML parsing Ќ -PASS XHTML1.1+MathML parsing ќ -PASS XHTML1.1+MathML parsing 𝕂 -PASS XHTML1.1+MathML parsing 𝕜 -PASS XHTML1.1+MathML parsing 𝒦 -PASS XHTML1.1+MathML parsing 𝓀 -PASS XHTML1.1+MathML parsing ⇚ -PASS XHTML1.1+MathML parsing Ĺ -PASS XHTML1.1+MathML parsing ĺ -PASS XHTML1.1+MathML parsing ⦴ -PASS XHTML1.1+MathML parsing ℒ -PASS XHTML1.1+MathML parsing Λ -PASS XHTML1.1+MathML parsing λ -PASS XHTML1.1+MathML parsing ⟨ -PASS XHTML1.1+MathML parsing ⟪ -PASS XHTML1.1+MathML parsing ⦑ -PASS XHTML1.1+MathML parsing ⟨ -PASS XHTML1.1+MathML parsing ⪅ -PASS XHTML1.1+MathML parsing ℒ -PASS XHTML1.1+MathML parsing « -PASS XHTML1.1+MathML parsing ⇤ -PASS XHTML1.1+MathML parsing ⤟ -PASS XHTML1.1+MathML parsing ← -PASS XHTML1.1+MathML parsing ↞ -PASS XHTML1.1+MathML parsing ⇐ -PASS XHTML1.1+MathML parsing ⤝ -PASS XHTML1.1+MathML parsing ↩ -PASS XHTML1.1+MathML parsing ↫ -PASS XHTML1.1+MathML parsing ⤹ -PASS XHTML1.1+MathML parsing ⥳ -PASS XHTML1.1+MathML parsing ↢ -PASS XHTML1.1+MathML parsing ⤙ -PASS XHTML1.1+MathML parsing ⤛ -PASS XHTML1.1+MathML parsing ⪫ -PASS XHTML1.1+MathML parsing ⪭ -PASS XHTML1.1+MathML parsing ⪭︀ -PASS XHTML1.1+MathML parsing ⤌ -PASS XHTML1.1+MathML parsing ⤎ -PASS XHTML1.1+MathML parsing ❲ -PASS XHTML1.1+MathML parsing { -PASS XHTML1.1+MathML parsing [ -PASS XHTML1.1+MathML parsing ⦋ -PASS XHTML1.1+MathML parsing ⦏ -PASS XHTML1.1+MathML parsing ⦍ -PASS XHTML1.1+MathML parsing Ľ -PASS XHTML1.1+MathML parsing ľ -PASS XHTML1.1+MathML parsing Ļ -PASS XHTML1.1+MathML parsing ļ -PASS XHTML1.1+MathML parsing ⌈ -PASS XHTML1.1+MathML parsing { -PASS XHTML1.1+MathML parsing Л -PASS XHTML1.1+MathML parsing л -PASS XHTML1.1+MathML parsing ⤶ -PASS XHTML1.1+MathML parsing “ -PASS XHTML1.1+MathML parsing „ -PASS XHTML1.1+MathML parsing ⥧ -PASS XHTML1.1+MathML parsing ⥋ -PASS XHTML1.1+MathML parsing ↲ -PASS XHTML1.1+MathML parsing ≤ -PASS XHTML1.1+MathML parsing ≦ -PASS XHTML1.1+MathML parsing ⟨ -PASS XHTML1.1+MathML parsing ⇤ -PASS XHTML1.1+MathML parsing ← -PASS XHTML1.1+MathML parsing ← -PASS XHTML1.1+MathML parsing ⇐ -PASS XHTML1.1+MathML parsing ⇆ -PASS XHTML1.1+MathML parsing ↢ -PASS XHTML1.1+MathML parsing ⌈ -PASS XHTML1.1+MathML parsing ⟦ -PASS XHTML1.1+MathML parsing ⥡ -PASS XHTML1.1+MathML parsing ⥙ -PASS XHTML1.1+MathML parsing ⇃ -PASS XHTML1.1+MathML parsing ⌊ -PASS XHTML1.1+MathML parsing ↽ -PASS XHTML1.1+MathML parsing ↼ -PASS XHTML1.1+MathML parsing ⇇ -PASS XHTML1.1+MathML parsing ↔ -PASS XHTML1.1+MathML parsing ↔ -PASS XHTML1.1+MathML parsing ⇔ -PASS XHTML1.1+MathML parsing ⇆ -PASS XHTML1.1+MathML parsing ⇋ -PASS XHTML1.1+MathML parsing ↭ -PASS XHTML1.1+MathML parsing ⥎ -PASS XHTML1.1+MathML parsing ↤ -PASS XHTML1.1+MathML parsing ⊣ -PASS XHTML1.1+MathML parsing ⥚ -PASS XHTML1.1+MathML parsing ⋋ -PASS XHTML1.1+MathML parsing ⧏ -PASS XHTML1.1+MathML parsing ⊲ -PASS XHTML1.1+MathML parsing ⊴ -PASS XHTML1.1+MathML parsing ⥑ -PASS XHTML1.1+MathML parsing ⥠ -PASS XHTML1.1+MathML parsing ⥘ -PASS XHTML1.1+MathML parsing ↿ -PASS XHTML1.1+MathML parsing ⥒ -PASS XHTML1.1+MathML parsing ↼ -PASS XHTML1.1+MathML parsing ⪋ -PASS XHTML1.1+MathML parsing ⋚ -PASS XHTML1.1+MathML parsing ≤ -PASS XHTML1.1+MathML parsing ≦ -PASS XHTML1.1+MathML parsing ⩽ -PASS XHTML1.1+MathML parsing ⪨ -PASS XHTML1.1+MathML parsing ⩽ -PASS XHTML1.1+MathML parsing ⩿ -PASS XHTML1.1+MathML parsing ⪁ -PASS XHTML1.1+MathML parsing ⪃ -PASS XHTML1.1+MathML parsing ⋚︀ -PASS XHTML1.1+MathML parsing ⪓ -PASS XHTML1.1+MathML parsing ⪅ -PASS XHTML1.1+MathML parsing ⋖ -PASS XHTML1.1+MathML parsing ⋚ -PASS XHTML1.1+MathML parsing ⪋ -PASS XHTML1.1+MathML parsing ⋚ -PASS XHTML1.1+MathML parsing ≦ -PASS XHTML1.1+MathML parsing ≶ -PASS XHTML1.1+MathML parsing ≶ -PASS XHTML1.1+MathML parsing ⪡ -PASS XHTML1.1+MathML parsing ≲ -PASS XHTML1.1+MathML parsing ⩽ -PASS XHTML1.1+MathML parsing ≲ -PASS XHTML1.1+MathML parsing ⥼ -PASS XHTML1.1+MathML parsing ⌊ -PASS XHTML1.1+MathML parsing 𝔏 -PASS XHTML1.1+MathML parsing 𝔩 -PASS XHTML1.1+MathML parsing ≶ -PASS XHTML1.1+MathML parsing ⪑ -PASS XHTML1.1+MathML parsing ⥢ -PASS XHTML1.1+MathML parsing ↽ -PASS XHTML1.1+MathML parsing ↼ -PASS XHTML1.1+MathML parsing ⥪ -PASS XHTML1.1+MathML parsing ▄ -PASS XHTML1.1+MathML parsing Љ -PASS XHTML1.1+MathML parsing љ -PASS XHTML1.1+MathML parsing ⇇ -PASS XHTML1.1+MathML parsing ≪ -PASS XHTML1.1+MathML parsing ⋘ -PASS XHTML1.1+MathML parsing ⌞ -PASS XHTML1.1+MathML parsing ⇚ -PASS XHTML1.1+MathML parsing ⥫ -PASS XHTML1.1+MathML parsing ◺ -PASS XHTML1.1+MathML parsing Ŀ -PASS XHTML1.1+MathML parsing ŀ -PASS XHTML1.1+MathML parsing ⎰ -PASS XHTML1.1+MathML parsing ⎰ -PASS XHTML1.1+MathML parsing ⪉ -PASS XHTML1.1+MathML parsing ⪉ -PASS XHTML1.1+MathML parsing ⪇ -PASS XHTML1.1+MathML parsing ≨ -PASS XHTML1.1+MathML parsing ⪇ -PASS XHTML1.1+MathML parsing ≨ -PASS XHTML1.1+MathML parsing ⋦ -PASS XHTML1.1+MathML parsing ⟬ -PASS XHTML1.1+MathML parsing ⇽ -PASS XHTML1.1+MathML parsing ⟦ -PASS XHTML1.1+MathML parsing ⟵ -PASS XHTML1.1+MathML parsing ⟵ -PASS XHTML1.1+MathML parsing ⟸ -PASS XHTML1.1+MathML parsing ⟷ -PASS XHTML1.1+MathML parsing ⟷ -PASS XHTML1.1+MathML parsing ⟺ -PASS XHTML1.1+MathML parsing ⟼ -PASS XHTML1.1+MathML parsing ⟶ -PASS XHTML1.1+MathML parsing ⟶ -PASS XHTML1.1+MathML parsing ⟹ -PASS XHTML1.1+MathML parsing ↫ -PASS XHTML1.1+MathML parsing ↬ -PASS XHTML1.1+MathML parsing ⦅ -PASS XHTML1.1+MathML parsing 𝕃 -PASS XHTML1.1+MathML parsing 𝕝 -PASS XHTML1.1+MathML parsing ⨭ -PASS XHTML1.1+MathML parsing ⨴ -PASS XHTML1.1+MathML parsing ∗ -PASS XHTML1.1+MathML parsing _ -PASS XHTML1.1+MathML parsing ↙ -PASS XHTML1.1+MathML parsing ↘ -PASS XHTML1.1+MathML parsing ◊ -PASS XHTML1.1+MathML parsing ◊ -PASS XHTML1.1+MathML parsing ⧫ -PASS XHTML1.1+MathML parsing ( -PASS XHTML1.1+MathML parsing ⦓ -PASS XHTML1.1+MathML parsing ⇆ -PASS XHTML1.1+MathML parsing ⌟ -PASS XHTML1.1+MathML parsing ⇋ -PASS XHTML1.1+MathML parsing ⥭ -PASS XHTML1.1+MathML parsing ‎ -PASS XHTML1.1+MathML parsing ⊿ -PASS XHTML1.1+MathML parsing ‹ -PASS XHTML1.1+MathML parsing 𝓁 -PASS XHTML1.1+MathML parsing ℒ -PASS XHTML1.1+MathML parsing ↰ -PASS XHTML1.1+MathML parsing ↰ -PASS XHTML1.1+MathML parsing ≲ -PASS XHTML1.1+MathML parsing ⪍ -PASS XHTML1.1+MathML parsing ⪏ -PASS XHTML1.1+MathML parsing [ -PASS XHTML1.1+MathML parsing ‘ -PASS XHTML1.1+MathML parsing ‚ -PASS XHTML1.1+MathML parsing Ł -PASS XHTML1.1+MathML parsing ł -PASS XHTML1.1+MathML parsing ⪦ -PASS XHTML1.1+MathML parsing ⩹ -PASS XHTML1.1+MathML parsing < -FAIL XHTML1.1+MathML parsing < assert_true: expected true got false -PASS XHTML1.1+MathML parsing ≪ -PASS XHTML1.1+MathML parsing ⋖ -PASS XHTML1.1+MathML parsing ⋋ -PASS XHTML1.1+MathML parsing ⋉ -PASS XHTML1.1+MathML parsing ⥶ -PASS XHTML1.1+MathML parsing ⩻ -PASS XHTML1.1+MathML parsing ◃ -PASS XHTML1.1+MathML parsing ⊴ -PASS XHTML1.1+MathML parsing ◂ -PASS XHTML1.1+MathML parsing ⦖ -PASS XHTML1.1+MathML parsing ⥊ -PASS XHTML1.1+MathML parsing ⥦ -PASS XHTML1.1+MathML parsing ≨︀ -PASS XHTML1.1+MathML parsing ≨︀ -PASS XHTML1.1+MathML parsing ¯ -PASS XHTML1.1+MathML parsing ♂ -PASS XHTML1.1+MathML parsing ✠ -PASS XHTML1.1+MathML parsing ✠ -PASS XHTML1.1+MathML parsing ⤅ -PASS XHTML1.1+MathML parsing ↦ -PASS XHTML1.1+MathML parsing ↦ -PASS XHTML1.1+MathML parsing ↧ -PASS XHTML1.1+MathML parsing ↤ -PASS XHTML1.1+MathML parsing ↥ -PASS XHTML1.1+MathML parsing ▮ -PASS XHTML1.1+MathML parsing ⨩ -PASS XHTML1.1+MathML parsing М -PASS XHTML1.1+MathML parsing м -PASS XHTML1.1+MathML parsing — -PASS XHTML1.1+MathML parsing ∺ -PASS XHTML1.1+MathML parsing ∡ -PASS XHTML1.1+MathML parsing   -PASS XHTML1.1+MathML parsing ℳ -PASS XHTML1.1+MathML parsing 𝔐 -PASS XHTML1.1+MathML parsing 𝔪 -PASS XHTML1.1+MathML parsing ℧ -PASS XHTML1.1+MathML parsing µ -PASS XHTML1.1+MathML parsing * -PASS XHTML1.1+MathML parsing ⫰ -PASS XHTML1.1+MathML parsing ∣ -PASS XHTML1.1+MathML parsing · -PASS XHTML1.1+MathML parsing ⊟ -PASS XHTML1.1+MathML parsing − -PASS XHTML1.1+MathML parsing ∸ -PASS XHTML1.1+MathML parsing ⨪ -PASS XHTML1.1+MathML parsing ∓ -PASS XHTML1.1+MathML parsing ⫛ -PASS XHTML1.1+MathML parsing … -PASS XHTML1.1+MathML parsing ∓ -PASS XHTML1.1+MathML parsing ⊧ -PASS XHTML1.1+MathML parsing 𝕄 -PASS XHTML1.1+MathML parsing 𝕞 -PASS XHTML1.1+MathML parsing ∓ -PASS XHTML1.1+MathML parsing 𝓂 -PASS XHTML1.1+MathML parsing ℳ -PASS XHTML1.1+MathML parsing ∾ -PASS XHTML1.1+MathML parsing Μ -PASS XHTML1.1+MathML parsing μ -PASS XHTML1.1+MathML parsing ⊸ -PASS XHTML1.1+MathML parsing ⊸ -PASS XHTML1.1+MathML parsing ∇ -PASS XHTML1.1+MathML parsing Ń -PASS XHTML1.1+MathML parsing ń -PASS XHTML1.1+MathML parsing ∠⃒ -PASS XHTML1.1+MathML parsing ≉ -PASS XHTML1.1+MathML parsing ⩰̸ -PASS XHTML1.1+MathML parsing ≋̸ -PASS XHTML1.1+MathML parsing ʼn -PASS XHTML1.1+MathML parsing ≉ -PASS XHTML1.1+MathML parsing ♮ -PASS XHTML1.1+MathML parsing ℕ -PASS XHTML1.1+MathML parsing ♮ -PASS XHTML1.1+MathML parsing -PASS XHTML1.1+MathML parsing ≎̸ -PASS XHTML1.1+MathML parsing ≏̸ -PASS XHTML1.1+MathML parsing ⩃ -PASS XHTML1.1+MathML parsing Ň -PASS XHTML1.1+MathML parsing ň -PASS XHTML1.1+MathML parsing Ņ -PASS XHTML1.1+MathML parsing ņ -PASS XHTML1.1+MathML parsing ≇ -PASS XHTML1.1+MathML parsing ⩭̸ -PASS XHTML1.1+MathML parsing ⩂ -PASS XHTML1.1+MathML parsing Н -PASS XHTML1.1+MathML parsing н -PASS XHTML1.1+MathML parsing – -PASS XHTML1.1+MathML parsing ⤤ -PASS XHTML1.1+MathML parsing ↗ -PASS XHTML1.1+MathML parsing ⇗ -PASS XHTML1.1+MathML parsing ↗ -PASS XHTML1.1+MathML parsing ≠ -PASS XHTML1.1+MathML parsing ≐̸ -PASS XHTML1.1+MathML parsing ​ -PASS XHTML1.1+MathML parsing ​ -PASS XHTML1.1+MathML parsing ​ -PASS XHTML1.1+MathML parsing ​ -PASS XHTML1.1+MathML parsing ≢ -PASS XHTML1.1+MathML parsing ⤨ -PASS XHTML1.1+MathML parsing ≂̸ -PASS XHTML1.1+MathML parsing ≫ -PASS XHTML1.1+MathML parsing ≪ -PASS XHTML1.1+MathML parsing 
 -PASS XHTML1.1+MathML parsing ∄ -PASS XHTML1.1+MathML parsing ∄ -PASS XHTML1.1+MathML parsing 𝔑 -PASS XHTML1.1+MathML parsing 𝔫 -PASS XHTML1.1+MathML parsing ≧̸ -PASS XHTML1.1+MathML parsing ≱ -PASS XHTML1.1+MathML parsing ≱ -PASS XHTML1.1+MathML parsing ≧̸ -PASS XHTML1.1+MathML parsing ⩾̸ -PASS XHTML1.1+MathML parsing ⩾̸ -PASS XHTML1.1+MathML parsing ⋙̸ -PASS XHTML1.1+MathML parsing ≵ -PASS XHTML1.1+MathML parsing ≫⃒ -PASS XHTML1.1+MathML parsing ≯ -PASS XHTML1.1+MathML parsing ≯ -PASS XHTML1.1+MathML parsing ≫̸ -PASS XHTML1.1+MathML parsing ↮ -PASS XHTML1.1+MathML parsing ⇎ -PASS XHTML1.1+MathML parsing ⫲ -PASS XHTML1.1+MathML parsing ∋ -PASS XHTML1.1+MathML parsing ⋼ -PASS XHTML1.1+MathML parsing ⋺ -PASS XHTML1.1+MathML parsing ∋ -PASS XHTML1.1+MathML parsing Њ -PASS XHTML1.1+MathML parsing њ -PASS XHTML1.1+MathML parsing ↚ -PASS XHTML1.1+MathML parsing ⇍ -PASS XHTML1.1+MathML parsing ‥ -PASS XHTML1.1+MathML parsing ≦̸ -PASS XHTML1.1+MathML parsing ≰ -PASS XHTML1.1+MathML parsing ↚ -PASS XHTML1.1+MathML parsing ⇍ -PASS XHTML1.1+MathML parsing ↮ -PASS XHTML1.1+MathML parsing ⇎ -PASS XHTML1.1+MathML parsing ≰ -PASS XHTML1.1+MathML parsing ≦̸ -PASS XHTML1.1+MathML parsing ⩽̸ -PASS XHTML1.1+MathML parsing ⩽̸ -PASS XHTML1.1+MathML parsing ≮ -PASS XHTML1.1+MathML parsing ⋘̸ -PASS XHTML1.1+MathML parsing ≴ -PASS XHTML1.1+MathML parsing ≪⃒ -PASS XHTML1.1+MathML parsing ≮ -PASS XHTML1.1+MathML parsing ⋪ -PASS XHTML1.1+MathML parsing ⋬ -PASS XHTML1.1+MathML parsing ≪̸ -PASS XHTML1.1+MathML parsing ∤ -PASS XHTML1.1+MathML parsing ⁠ -PASS XHTML1.1+MathML parsing   -PASS XHTML1.1+MathML parsing 𝕟 -PASS XHTML1.1+MathML parsing ℕ -PASS XHTML1.1+MathML parsing ⫬ -PASS XHTML1.1+MathML parsing ¬ -PASS XHTML1.1+MathML parsing ≢ -PASS XHTML1.1+MathML parsing ≭ -PASS XHTML1.1+MathML parsing ∦ -PASS XHTML1.1+MathML parsing ∉ -PASS XHTML1.1+MathML parsing ≠ -PASS XHTML1.1+MathML parsing ≂̸ -PASS XHTML1.1+MathML parsing ∄ -PASS XHTML1.1+MathML parsing ≯ -PASS XHTML1.1+MathML parsing ≱ -PASS XHTML1.1+MathML parsing ≧̸ -PASS XHTML1.1+MathML parsing ≫̸ -PASS XHTML1.1+MathML parsing ≹ -PASS XHTML1.1+MathML parsing ⩾̸ -PASS XHTML1.1+MathML parsing ≵ -PASS XHTML1.1+MathML parsing ≎̸ -PASS XHTML1.1+MathML parsing ≏̸ -PASS XHTML1.1+MathML parsing ∉ -PASS XHTML1.1+MathML parsing ⋵̸ -PASS XHTML1.1+MathML parsing ⋹̸ -PASS XHTML1.1+MathML parsing ∉ -PASS XHTML1.1+MathML parsing ⋷ -PASS XHTML1.1+MathML parsing ⋶ -PASS XHTML1.1+MathML parsing ⧏̸ -PASS XHTML1.1+MathML parsing ⋪ -PASS XHTML1.1+MathML parsing ⋬ -PASS XHTML1.1+MathML parsing ≮ -PASS XHTML1.1+MathML parsing ≰ -PASS XHTML1.1+MathML parsing ≸ -PASS XHTML1.1+MathML parsing ≪̸ -PASS XHTML1.1+MathML parsing ⩽̸ -PASS XHTML1.1+MathML parsing ≴ -PASS XHTML1.1+MathML parsing ⪢̸ -PASS XHTML1.1+MathML parsing ⪡̸ -PASS XHTML1.1+MathML parsing ∌ -PASS XHTML1.1+MathML parsing ∌ -PASS XHTML1.1+MathML parsing ⋾ -PASS XHTML1.1+MathML parsing ⋽ -PASS XHTML1.1+MathML parsing ⊀ -PASS XHTML1.1+MathML parsing ⪯̸ -PASS XHTML1.1+MathML parsing ⋠ -PASS XHTML1.1+MathML parsing ∌ -PASS XHTML1.1+MathML parsing ⧐̸ -PASS XHTML1.1+MathML parsing ⋫ -PASS XHTML1.1+MathML parsing ⋭ -PASS XHTML1.1+MathML parsing ⊏̸ -PASS XHTML1.1+MathML parsing ⋢ -PASS XHTML1.1+MathML parsing ⊐̸ -PASS XHTML1.1+MathML parsing ⋣ -PASS XHTML1.1+MathML parsing ⊂⃒ -PASS XHTML1.1+MathML parsing ⊈ -PASS XHTML1.1+MathML parsing ⊁ -PASS XHTML1.1+MathML parsing ⪰̸ -PASS XHTML1.1+MathML parsing ⋡ -PASS XHTML1.1+MathML parsing ≿̸ -PASS XHTML1.1+MathML parsing ⊃⃒ -PASS XHTML1.1+MathML parsing ⊉ -PASS XHTML1.1+MathML parsing ≁ -PASS XHTML1.1+MathML parsing ≄ -PASS XHTML1.1+MathML parsing ≇ -PASS XHTML1.1+MathML parsing ≉ -PASS XHTML1.1+MathML parsing ∤ -PASS XHTML1.1+MathML parsing ∦ -PASS XHTML1.1+MathML parsing ∦ -PASS XHTML1.1+MathML parsing ⫽⃥ -PASS XHTML1.1+MathML parsing ∂̸ -PASS XHTML1.1+MathML parsing ⨔ -PASS XHTML1.1+MathML parsing ⊀ -PASS XHTML1.1+MathML parsing ⋠ -PASS XHTML1.1+MathML parsing ⊀ -PASS XHTML1.1+MathML parsing ⪯̸ -PASS XHTML1.1+MathML parsing ⪯̸ -PASS XHTML1.1+MathML parsing ⤳̸ -PASS XHTML1.1+MathML parsing ↛ -PASS XHTML1.1+MathML parsing ⇏ -PASS XHTML1.1+MathML parsing ↝̸ -PASS XHTML1.1+MathML parsing ↛ -PASS XHTML1.1+MathML parsing ⇏ -PASS XHTML1.1+MathML parsing ⋫ -PASS XHTML1.1+MathML parsing ⋭ -PASS XHTML1.1+MathML parsing ⊁ -PASS XHTML1.1+MathML parsing ⋡ -PASS XHTML1.1+MathML parsing ⪰̸ -PASS XHTML1.1+MathML parsing 𝒩 -PASS XHTML1.1+MathML parsing 𝓃 -PASS XHTML1.1+MathML parsing ∤ -PASS XHTML1.1+MathML parsing ∦ -PASS XHTML1.1+MathML parsing ≁ -PASS XHTML1.1+MathML parsing ≄ -PASS XHTML1.1+MathML parsing ≄ -PASS XHTML1.1+MathML parsing ∤ -PASS XHTML1.1+MathML parsing ∦ -PASS XHTML1.1+MathML parsing ⋢ -PASS XHTML1.1+MathML parsing ⋣ -PASS XHTML1.1+MathML parsing ⊄ -PASS XHTML1.1+MathML parsing ⫅̸ -PASS XHTML1.1+MathML parsing ⊈ -PASS XHTML1.1+MathML parsing ⊂⃒ -PASS XHTML1.1+MathML parsing ⊈ -PASS XHTML1.1+MathML parsing ⫅̸ -PASS XHTML1.1+MathML parsing ⊁ -PASS XHTML1.1+MathML parsing ⪰̸ -PASS XHTML1.1+MathML parsing ⊅ -PASS XHTML1.1+MathML parsing ⫆̸ -PASS XHTML1.1+MathML parsing ⊉ -PASS XHTML1.1+MathML parsing ⊃⃒ -PASS XHTML1.1+MathML parsing ⊉ -PASS XHTML1.1+MathML parsing ⫆̸ -PASS XHTML1.1+MathML parsing ≹ -PASS XHTML1.1+MathML parsing Ñ -PASS XHTML1.1+MathML parsing ñ -PASS XHTML1.1+MathML parsing ≸ -PASS XHTML1.1+MathML parsing ⋪ -PASS XHTML1.1+MathML parsing ⋬ -PASS XHTML1.1+MathML parsing ⋫ -PASS XHTML1.1+MathML parsing ⋭ -PASS XHTML1.1+MathML parsing Ν -PASS XHTML1.1+MathML parsing ν -PASS XHTML1.1+MathML parsing # -PASS XHTML1.1+MathML parsing № -PASS XHTML1.1+MathML parsing   -PASS XHTML1.1+MathML parsing ≍⃒ -PASS XHTML1.1+MathML parsing ⊬ -PASS XHTML1.1+MathML parsing ⊭ -PASS XHTML1.1+MathML parsing ⊮ -PASS XHTML1.1+MathML parsing ⊯ -PASS XHTML1.1+MathML parsing ≥⃒ -PASS XHTML1.1+MathML parsing >⃒ -PASS XHTML1.1+MathML parsing ⤄ -PASS XHTML1.1+MathML parsing ⧞ -PASS XHTML1.1+MathML parsing ⤂ -PASS XHTML1.1+MathML parsing ≤⃒ -FAIL XHTML1.1+MathML parsing <⃒ assert_equals: XHTML1.1+MathML parsing the entity reference caused a parse error; expected 3 but got 1 -PASS XHTML1.1+MathML parsing ⊴⃒ -PASS XHTML1.1+MathML parsing ⤃ -PASS XHTML1.1+MathML parsing ⊵⃒ -PASS XHTML1.1+MathML parsing ∼⃒ -PASS XHTML1.1+MathML parsing ⤣ -PASS XHTML1.1+MathML parsing ↖ -PASS XHTML1.1+MathML parsing ⇖ -PASS XHTML1.1+MathML parsing ↖ -PASS XHTML1.1+MathML parsing ⤧ -PASS XHTML1.1+MathML parsing Ó -PASS XHTML1.1+MathML parsing ó -PASS XHTML1.1+MathML parsing ⊛ -PASS XHTML1.1+MathML parsing Ô -PASS XHTML1.1+MathML parsing ô -PASS XHTML1.1+MathML parsing ⊚ -PASS XHTML1.1+MathML parsing О -PASS XHTML1.1+MathML parsing о -PASS XHTML1.1+MathML parsing ⊝ -PASS XHTML1.1+MathML parsing Ő -PASS XHTML1.1+MathML parsing ő -PASS XHTML1.1+MathML parsing ⨸ -PASS XHTML1.1+MathML parsing ⊙ -PASS XHTML1.1+MathML parsing ⦼ -PASS XHTML1.1+MathML parsing Œ -PASS XHTML1.1+MathML parsing œ -PASS XHTML1.1+MathML parsing ⦿ -PASS XHTML1.1+MathML parsing 𝔒 -PASS XHTML1.1+MathML parsing 𝔬 -PASS XHTML1.1+MathML parsing ˛ -PASS XHTML1.1+MathML parsing Ò -PASS XHTML1.1+MathML parsing ò -PASS XHTML1.1+MathML parsing ⧁ -PASS XHTML1.1+MathML parsing ⦵ -PASS XHTML1.1+MathML parsing Ω -PASS XHTML1.1+MathML parsing ∮ -PASS XHTML1.1+MathML parsing ↺ -PASS XHTML1.1+MathML parsing ⦾ -PASS XHTML1.1+MathML parsing ⦻ -PASS XHTML1.1+MathML parsing ‾ -PASS XHTML1.1+MathML parsing ⧀ -PASS XHTML1.1+MathML parsing Ō -PASS XHTML1.1+MathML parsing ō -PASS XHTML1.1+MathML parsing Ω -PASS XHTML1.1+MathML parsing ω -PASS XHTML1.1+MathML parsing Ο -PASS XHTML1.1+MathML parsing ο -PASS XHTML1.1+MathML parsing ⦶ -PASS XHTML1.1+MathML parsing ⊖ -PASS XHTML1.1+MathML parsing 𝕆 -PASS XHTML1.1+MathML parsing 𝕠 -PASS XHTML1.1+MathML parsing ⦷ -PASS XHTML1.1+MathML parsing “ -PASS XHTML1.1+MathML parsing ‘ -PASS XHTML1.1+MathML parsing ⦹ -PASS XHTML1.1+MathML parsing ⊕ -PASS XHTML1.1+MathML parsing ↻ -PASS XHTML1.1+MathML parsing ⩔ -PASS XHTML1.1+MathML parsing ∨ -PASS XHTML1.1+MathML parsing ⩝ -PASS XHTML1.1+MathML parsing ℴ -PASS XHTML1.1+MathML parsing ℴ -PASS XHTML1.1+MathML parsing ª -PASS XHTML1.1+MathML parsing º -PASS XHTML1.1+MathML parsing ⊶ -PASS XHTML1.1+MathML parsing ⩖ -PASS XHTML1.1+MathML parsing ⩗ -PASS XHTML1.1+MathML parsing ⩛ -PASS XHTML1.1+MathML parsing Ⓢ -PASS XHTML1.1+MathML parsing 𝒪 -PASS XHTML1.1+MathML parsing ℴ -PASS XHTML1.1+MathML parsing Ø -PASS XHTML1.1+MathML parsing ø -PASS XHTML1.1+MathML parsing ⊘ -PASS XHTML1.1+MathML parsing Õ -PASS XHTML1.1+MathML parsing õ -PASS XHTML1.1+MathML parsing ⨶ -PASS XHTML1.1+MathML parsing ⨷ -PASS XHTML1.1+MathML parsing ⊗ -PASS XHTML1.1+MathML parsing Ö -PASS XHTML1.1+MathML parsing ö -PASS XHTML1.1+MathML parsing ⌽ -PASS XHTML1.1+MathML parsing ‾ -PASS XHTML1.1+MathML parsing ⏞ -PASS XHTML1.1+MathML parsing ⎴ -PASS XHTML1.1+MathML parsing ⏜ -PASS XHTML1.1+MathML parsing ¶ -PASS XHTML1.1+MathML parsing ∥ -PASS XHTML1.1+MathML parsing ∥ -PASS XHTML1.1+MathML parsing ⫳ -PASS XHTML1.1+MathML parsing ⫽ -PASS XHTML1.1+MathML parsing ∂ -PASS XHTML1.1+MathML parsing ∂ -PASS XHTML1.1+MathML parsing П -PASS XHTML1.1+MathML parsing п -PASS XHTML1.1+MathML parsing % -PASS XHTML1.1+MathML parsing . -PASS XHTML1.1+MathML parsing ‰ -PASS XHTML1.1+MathML parsing ⊥ -PASS XHTML1.1+MathML parsing ‱ -PASS XHTML1.1+MathML parsing 𝔓 -PASS XHTML1.1+MathML parsing 𝔭 -PASS XHTML1.1+MathML parsing Φ -PASS XHTML1.1+MathML parsing φ -PASS XHTML1.1+MathML parsing ϕ -PASS XHTML1.1+MathML parsing ℳ -PASS XHTML1.1+MathML parsing ☎ -PASS XHTML1.1+MathML parsing Π -PASS XHTML1.1+MathML parsing π -PASS XHTML1.1+MathML parsing ⋔ -PASS XHTML1.1+MathML parsing ϖ -PASS XHTML1.1+MathML parsing ℏ -PASS XHTML1.1+MathML parsing ℎ -PASS XHTML1.1+MathML parsing ℏ -PASS XHTML1.1+MathML parsing ⨣ -PASS XHTML1.1+MathML parsing ⊞ -PASS XHTML1.1+MathML parsing ⨢ -PASS XHTML1.1+MathML parsing + -PASS XHTML1.1+MathML parsing ∔ -PASS XHTML1.1+MathML parsing ⨥ -PASS XHTML1.1+MathML parsing ⩲ -PASS XHTML1.1+MathML parsing ± -PASS XHTML1.1+MathML parsing ± -PASS XHTML1.1+MathML parsing ⨦ -PASS XHTML1.1+MathML parsing ⨧ -PASS XHTML1.1+MathML parsing ± -PASS XHTML1.1+MathML parsing ℌ -PASS XHTML1.1+MathML parsing ⨕ -PASS XHTML1.1+MathML parsing 𝕡 -PASS XHTML1.1+MathML parsing ℙ -PASS XHTML1.1+MathML parsing £ -PASS XHTML1.1+MathML parsing ⪷ -PASS XHTML1.1+MathML parsing ⪻ -PASS XHTML1.1+MathML parsing ≺ -PASS XHTML1.1+MathML parsing ≼ -PASS XHTML1.1+MathML parsing ⪷ -PASS XHTML1.1+MathML parsing ≺ -PASS XHTML1.1+MathML parsing ≼ -PASS XHTML1.1+MathML parsing ≺ -PASS XHTML1.1+MathML parsing ⪯ -PASS XHTML1.1+MathML parsing ≼ -PASS XHTML1.1+MathML parsing ≾ -PASS XHTML1.1+MathML parsing ⪯ -PASS XHTML1.1+MathML parsing ⪹ -PASS XHTML1.1+MathML parsing ⪵ -PASS XHTML1.1+MathML parsing ⋨ -PASS XHTML1.1+MathML parsing ⪯ -PASS XHTML1.1+MathML parsing ⪳ -PASS XHTML1.1+MathML parsing ≾ -PASS XHTML1.1+MathML parsing ′ -PASS XHTML1.1+MathML parsing ″ -PASS XHTML1.1+MathML parsing ℙ -PASS XHTML1.1+MathML parsing ⪹ -PASS XHTML1.1+MathML parsing ⪵ -PASS XHTML1.1+MathML parsing ⋨ -PASS XHTML1.1+MathML parsing ∏ -PASS XHTML1.1+MathML parsing ∏ -PASS XHTML1.1+MathML parsing ⌮ -PASS XHTML1.1+MathML parsing ⌒ -PASS XHTML1.1+MathML parsing ⌓ -PASS XHTML1.1+MathML parsing ∝ -PASS XHTML1.1+MathML parsing ∝ -PASS XHTML1.1+MathML parsing ∷ -PASS XHTML1.1+MathML parsing ∝ -PASS XHTML1.1+MathML parsing ≾ -PASS XHTML1.1+MathML parsing ⊰ -PASS XHTML1.1+MathML parsing 𝒫 -PASS XHTML1.1+MathML parsing 𝓅 -PASS XHTML1.1+MathML parsing Ψ -PASS XHTML1.1+MathML parsing ψ -PASS XHTML1.1+MathML parsing   -PASS XHTML1.1+MathML parsing 𝔔 -PASS XHTML1.1+MathML parsing 𝔮 -PASS XHTML1.1+MathML parsing ⨌ -PASS XHTML1.1+MathML parsing 𝕢 -PASS XHTML1.1+MathML parsing ℚ -PASS XHTML1.1+MathML parsing ⁗ -PASS XHTML1.1+MathML parsing 𝒬 -PASS XHTML1.1+MathML parsing 𝓆 -PASS XHTML1.1+MathML parsing ℍ -PASS XHTML1.1+MathML parsing ⨖ -PASS XHTML1.1+MathML parsing ? -PASS XHTML1.1+MathML parsing ≟ -PASS XHTML1.1+MathML parsing " -PASS XHTML1.1+MathML parsing " -PASS XHTML1.1+MathML parsing ⇛ -PASS XHTML1.1+MathML parsing ∽̱ -PASS XHTML1.1+MathML parsing Ŕ -PASS XHTML1.1+MathML parsing ŕ -PASS XHTML1.1+MathML parsing √ -PASS XHTML1.1+MathML parsing ⦳ -PASS XHTML1.1+MathML parsing ⟩ -PASS XHTML1.1+MathML parsing ⟫ -PASS XHTML1.1+MathML parsing ⦒ -PASS XHTML1.1+MathML parsing ⦥ -PASS XHTML1.1+MathML parsing ⟩ -PASS XHTML1.1+MathML parsing » -PASS XHTML1.1+MathML parsing ⥵ -PASS XHTML1.1+MathML parsing ⇥ -PASS XHTML1.1+MathML parsing ⤠ -PASS XHTML1.1+MathML parsing ⤳ -PASS XHTML1.1+MathML parsing → -PASS XHTML1.1+MathML parsing ↠ -PASS XHTML1.1+MathML parsing ⇒ -PASS XHTML1.1+MathML parsing ⤞ -PASS XHTML1.1+MathML parsing ↪ -PASS XHTML1.1+MathML parsing ↬ -PASS XHTML1.1+MathML parsing ⥅ -PASS XHTML1.1+MathML parsing ⥴ -PASS XHTML1.1+MathML parsing ⤖ -PASS XHTML1.1+MathML parsing ↣ -PASS XHTML1.1+MathML parsing ↝ -PASS XHTML1.1+MathML parsing ⤚ -PASS XHTML1.1+MathML parsing ⤜ -PASS XHTML1.1+MathML parsing ∶ -PASS XHTML1.1+MathML parsing ℚ -PASS XHTML1.1+MathML parsing ⤍ -PASS XHTML1.1+MathML parsing ⤏ -PASS XHTML1.1+MathML parsing ⤐ -PASS XHTML1.1+MathML parsing ❳ -PASS XHTML1.1+MathML parsing } -PASS XHTML1.1+MathML parsing ] -PASS XHTML1.1+MathML parsing ⦌ -PASS XHTML1.1+MathML parsing ⦎ -PASS XHTML1.1+MathML parsing ⦐ -PASS XHTML1.1+MathML parsing Ř -PASS XHTML1.1+MathML parsing ř -PASS XHTML1.1+MathML parsing Ŗ -PASS XHTML1.1+MathML parsing ŗ -PASS XHTML1.1+MathML parsing ⌉ -PASS XHTML1.1+MathML parsing } -PASS XHTML1.1+MathML parsing Р -PASS XHTML1.1+MathML parsing р -PASS XHTML1.1+MathML parsing ⤷ -PASS XHTML1.1+MathML parsing ⥩ -PASS XHTML1.1+MathML parsing ” -PASS XHTML1.1+MathML parsing ” -PASS XHTML1.1+MathML parsing ↳ -PASS XHTML1.1+MathML parsing ℜ -PASS XHTML1.1+MathML parsing ℛ -PASS XHTML1.1+MathML parsing ℜ -PASS XHTML1.1+MathML parsing ℝ -PASS XHTML1.1+MathML parsing ℜ -PASS XHTML1.1+MathML parsing ▭ -PASS XHTML1.1+MathML parsing ® -PASS XHTML1.1+MathML parsing ® -PASS XHTML1.1+MathML parsing ∋ -PASS XHTML1.1+MathML parsing ⇋ -PASS XHTML1.1+MathML parsing ⥯ -PASS XHTML1.1+MathML parsing ⥽ -PASS XHTML1.1+MathML parsing ⌋ -PASS XHTML1.1+MathML parsing 𝔯 -PASS XHTML1.1+MathML parsing ℜ -PASS XHTML1.1+MathML parsing ⥤ -PASS XHTML1.1+MathML parsing ⇁ -PASS XHTML1.1+MathML parsing ⇀ -PASS XHTML1.1+MathML parsing ⥬ -PASS XHTML1.1+MathML parsing Ρ -PASS XHTML1.1+MathML parsing ρ -PASS XHTML1.1+MathML parsing ϱ -PASS XHTML1.1+MathML parsing ⟩ -PASS XHTML1.1+MathML parsing ⇥ -PASS XHTML1.1+MathML parsing → -PASS XHTML1.1+MathML parsing → -PASS XHTML1.1+MathML parsing ⇒ -PASS XHTML1.1+MathML parsing ⇄ -PASS XHTML1.1+MathML parsing ↣ -PASS XHTML1.1+MathML parsing ⌉ -PASS XHTML1.1+MathML parsing ⟧ -PASS XHTML1.1+MathML parsing ⥝ -PASS XHTML1.1+MathML parsing ⥕ -PASS XHTML1.1+MathML parsing ⇂ -PASS XHTML1.1+MathML parsing ⌋ -PASS XHTML1.1+MathML parsing ⇁ -PASS XHTML1.1+MathML parsing ⇀ -PASS XHTML1.1+MathML parsing ⇄ -PASS XHTML1.1+MathML parsing ⇌ -PASS XHTML1.1+MathML parsing ⇉ -PASS XHTML1.1+MathML parsing ↝ -PASS XHTML1.1+MathML parsing ↦ -PASS XHTML1.1+MathML parsing ⊢ -PASS XHTML1.1+MathML parsing ⥛ -PASS XHTML1.1+MathML parsing ⋌ -PASS XHTML1.1+MathML parsing ⧐ -PASS XHTML1.1+MathML parsing ⊳ -PASS XHTML1.1+MathML parsing ⊵ -PASS XHTML1.1+MathML parsing ⥏ -PASS XHTML1.1+MathML parsing ⥜ -PASS XHTML1.1+MathML parsing ⥔ -PASS XHTML1.1+MathML parsing ↾ -PASS XHTML1.1+MathML parsing ⥓ -PASS XHTML1.1+MathML parsing ⇀ -PASS XHTML1.1+MathML parsing ˚ -PASS XHTML1.1+MathML parsing ≓ -PASS XHTML1.1+MathML parsing ⇄ -PASS XHTML1.1+MathML parsing ⇌ -PASS XHTML1.1+MathML parsing ‏ -PASS XHTML1.1+MathML parsing ⎱ -PASS XHTML1.1+MathML parsing ⎱ -PASS XHTML1.1+MathML parsing ⫮ -PASS XHTML1.1+MathML parsing ⟭ -PASS XHTML1.1+MathML parsing ⇾ -PASS XHTML1.1+MathML parsing ⟧ -PASS XHTML1.1+MathML parsing ⦆ -PASS XHTML1.1+MathML parsing 𝕣 -PASS XHTML1.1+MathML parsing ℝ -PASS XHTML1.1+MathML parsing ⨮ -PASS XHTML1.1+MathML parsing ⨵ -PASS XHTML1.1+MathML parsing ⥰ -PASS XHTML1.1+MathML parsing ) -PASS XHTML1.1+MathML parsing ⦔ -PASS XHTML1.1+MathML parsing ⨒ -PASS XHTML1.1+MathML parsing ⇉ -PASS XHTML1.1+MathML parsing ⇛ -PASS XHTML1.1+MathML parsing › -PASS XHTML1.1+MathML parsing 𝓇 -PASS XHTML1.1+MathML parsing ℛ -PASS XHTML1.1+MathML parsing ↱ -PASS XHTML1.1+MathML parsing ↱ -PASS XHTML1.1+MathML parsing ] -PASS XHTML1.1+MathML parsing ’ -PASS XHTML1.1+MathML parsing ’ -PASS XHTML1.1+MathML parsing ⋌ -PASS XHTML1.1+MathML parsing ⋊ -PASS XHTML1.1+MathML parsing ▹ -PASS XHTML1.1+MathML parsing ⊵ -PASS XHTML1.1+MathML parsing ▸ -PASS XHTML1.1+MathML parsing ⧎ -PASS XHTML1.1+MathML parsing ⧴ -PASS XHTML1.1+MathML parsing ⥨ -PASS XHTML1.1+MathML parsing ℞ -PASS XHTML1.1+MathML parsing Ś -PASS XHTML1.1+MathML parsing ś -PASS XHTML1.1+MathML parsing ‚ -PASS XHTML1.1+MathML parsing ⪸ -PASS XHTML1.1+MathML parsing Š -PASS XHTML1.1+MathML parsing š -PASS XHTML1.1+MathML parsing ⪼ -PASS XHTML1.1+MathML parsing ≻ -PASS XHTML1.1+MathML parsing ≽ -PASS XHTML1.1+MathML parsing ⪰ -PASS XHTML1.1+MathML parsing ⪴ -PASS XHTML1.1+MathML parsing Ş -PASS XHTML1.1+MathML parsing ş -PASS XHTML1.1+MathML parsing Ŝ -PASS XHTML1.1+MathML parsing ŝ -PASS XHTML1.1+MathML parsing ⪺ -PASS XHTML1.1+MathML parsing ⪶ -PASS XHTML1.1+MathML parsing ⋩ -PASS XHTML1.1+MathML parsing ⨓ -PASS XHTML1.1+MathML parsing ≿ -PASS XHTML1.1+MathML parsing С -PASS XHTML1.1+MathML parsing с -PASS XHTML1.1+MathML parsing ⊡ -PASS XHTML1.1+MathML parsing ⋅ -PASS XHTML1.1+MathML parsing ⩦ -PASS XHTML1.1+MathML parsing ⤥ -PASS XHTML1.1+MathML parsing ↘ -PASS XHTML1.1+MathML parsing ⇘ -PASS XHTML1.1+MathML parsing ↘ -PASS XHTML1.1+MathML parsing § -PASS XHTML1.1+MathML parsing ; -PASS XHTML1.1+MathML parsing ⤩ -PASS XHTML1.1+MathML parsing ∖ -PASS XHTML1.1+MathML parsing ∖ -PASS XHTML1.1+MathML parsing ✶ -PASS XHTML1.1+MathML parsing 𝔖 -PASS XHTML1.1+MathML parsing 𝔰 -PASS XHTML1.1+MathML parsing ⌢ -PASS XHTML1.1+MathML parsing ♯ -PASS XHTML1.1+MathML parsing Щ -PASS XHTML1.1+MathML parsing щ -PASS XHTML1.1+MathML parsing Ш -PASS XHTML1.1+MathML parsing ш -PASS XHTML1.1+MathML parsing ↓ -PASS XHTML1.1+MathML parsing ← -PASS XHTML1.1+MathML parsing ∣ -PASS XHTML1.1+MathML parsing ∥ -PASS XHTML1.1+MathML parsing → -PASS XHTML1.1+MathML parsing ↑ -PASS XHTML1.1+MathML parsing ­ -PASS XHTML1.1+MathML parsing Σ -PASS XHTML1.1+MathML parsing σ -PASS XHTML1.1+MathML parsing ς -PASS XHTML1.1+MathML parsing ς -PASS XHTML1.1+MathML parsing ∼ -PASS XHTML1.1+MathML parsing ⩪ -PASS XHTML1.1+MathML parsing ≃ -PASS XHTML1.1+MathML parsing ≃ -PASS XHTML1.1+MathML parsing ⪞ -PASS XHTML1.1+MathML parsing ⪠ -PASS XHTML1.1+MathML parsing ⪝ -PASS XHTML1.1+MathML parsing ⪟ -PASS XHTML1.1+MathML parsing ≆ -PASS XHTML1.1+MathML parsing ⨤ -PASS XHTML1.1+MathML parsing ⥲ -PASS XHTML1.1+MathML parsing ← -PASS XHTML1.1+MathML parsing ∘ -PASS XHTML1.1+MathML parsing ∖ -PASS XHTML1.1+MathML parsing ⨳ -PASS XHTML1.1+MathML parsing ⧤ -PASS XHTML1.1+MathML parsing ∣ -PASS XHTML1.1+MathML parsing ⌣ -PASS XHTML1.1+MathML parsing ⪪ -PASS XHTML1.1+MathML parsing ⪬ -PASS XHTML1.1+MathML parsing ⪬︀ -PASS XHTML1.1+MathML parsing Ь -PASS XHTML1.1+MathML parsing ь -PASS XHTML1.1+MathML parsing ⌿ -PASS XHTML1.1+MathML parsing ⧄ -PASS XHTML1.1+MathML parsing / -PASS XHTML1.1+MathML parsing 𝕊 -PASS XHTML1.1+MathML parsing 𝕤 -PASS XHTML1.1+MathML parsing ♠ -PASS XHTML1.1+MathML parsing ♠ -PASS XHTML1.1+MathML parsing ∥ -PASS XHTML1.1+MathML parsing ⊓ -PASS XHTML1.1+MathML parsing ⊓︀ -PASS XHTML1.1+MathML parsing ⊔ -PASS XHTML1.1+MathML parsing ⊔︀ -PASS XHTML1.1+MathML parsing √ -PASS XHTML1.1+MathML parsing ⊏ -PASS XHTML1.1+MathML parsing ⊑ -PASS XHTML1.1+MathML parsing ⊏ -PASS XHTML1.1+MathML parsing ⊑ -PASS XHTML1.1+MathML parsing ⊐ -PASS XHTML1.1+MathML parsing ⊒ -PASS XHTML1.1+MathML parsing ⊐ -PASS XHTML1.1+MathML parsing ⊒ -PASS XHTML1.1+MathML parsing □ -PASS XHTML1.1+MathML parsing □ -PASS XHTML1.1+MathML parsing ⊓ -PASS XHTML1.1+MathML parsing ⊏ -PASS XHTML1.1+MathML parsing ⊑ -PASS XHTML1.1+MathML parsing ⊐ -PASS XHTML1.1+MathML parsing ⊒ -PASS XHTML1.1+MathML parsing ⊔ -PASS XHTML1.1+MathML parsing ▪ -PASS XHTML1.1+MathML parsing □ -PASS XHTML1.1+MathML parsing ▪ -PASS XHTML1.1+MathML parsing → -PASS XHTML1.1+MathML parsing 𝒮 -PASS XHTML1.1+MathML parsing 𝓈 -PASS XHTML1.1+MathML parsing ∖ -PASS XHTML1.1+MathML parsing ⌣ -PASS XHTML1.1+MathML parsing ⋆ -PASS XHTML1.1+MathML parsing ⋆ -PASS XHTML1.1+MathML parsing ☆ -PASS XHTML1.1+MathML parsing ★ -PASS XHTML1.1+MathML parsing ϵ -PASS XHTML1.1+MathML parsing ϕ -PASS XHTML1.1+MathML parsing ¯ -PASS XHTML1.1+MathML parsing ⊂ -PASS XHTML1.1+MathML parsing ⋐ -PASS XHTML1.1+MathML parsing ⪽ -PASS XHTML1.1+MathML parsing ⫅ -PASS XHTML1.1+MathML parsing ⊆ -PASS XHTML1.1+MathML parsing ⫃ -PASS XHTML1.1+MathML parsing ⫁ -PASS XHTML1.1+MathML parsing ⫋ -PASS XHTML1.1+MathML parsing ⊊ -PASS XHTML1.1+MathML parsing ⪿ -PASS XHTML1.1+MathML parsing ⥹ -PASS XHTML1.1+MathML parsing ⊂ -PASS XHTML1.1+MathML parsing ⋐ -PASS XHTML1.1+MathML parsing ⊆ -PASS XHTML1.1+MathML parsing ⫅ -PASS XHTML1.1+MathML parsing ⊆ -PASS XHTML1.1+MathML parsing ⊊ -PASS XHTML1.1+MathML parsing ⫋ -PASS XHTML1.1+MathML parsing ⫇ -PASS XHTML1.1+MathML parsing ⫕ -PASS XHTML1.1+MathML parsing ⫓ -PASS XHTML1.1+MathML parsing ⪸ -PASS XHTML1.1+MathML parsing ≻ -PASS XHTML1.1+MathML parsing ≽ -PASS XHTML1.1+MathML parsing ≻ -PASS XHTML1.1+MathML parsing ⪰ -PASS XHTML1.1+MathML parsing ≽ -PASS XHTML1.1+MathML parsing ≿ -PASS XHTML1.1+MathML parsing ⪰ -PASS XHTML1.1+MathML parsing ⪺ -PASS XHTML1.1+MathML parsing ⪶ -PASS XHTML1.1+MathML parsing ⋩ -PASS XHTML1.1+MathML parsing ≿ -PASS XHTML1.1+MathML parsing ∋ -PASS XHTML1.1+MathML parsing ∑ -PASS XHTML1.1+MathML parsing ∑ -PASS XHTML1.1+MathML parsing ♪ -PASS XHTML1.1+MathML parsing ¹ -PASS XHTML1.1+MathML parsing ² -PASS XHTML1.1+MathML parsing ³ -PASS XHTML1.1+MathML parsing ⊃ -PASS XHTML1.1+MathML parsing ⋑ -PASS XHTML1.1+MathML parsing ⪾ -PASS XHTML1.1+MathML parsing ⫘ -PASS XHTML1.1+MathML parsing ⫆ -PASS XHTML1.1+MathML parsing ⊇ -PASS XHTML1.1+MathML parsing ⫄ -PASS XHTML1.1+MathML parsing ⊃ -PASS XHTML1.1+MathML parsing ⊇ -PASS XHTML1.1+MathML parsing ⟉ -PASS XHTML1.1+MathML parsing ⫗ -PASS XHTML1.1+MathML parsing ⥻ -PASS XHTML1.1+MathML parsing ⫂ -PASS XHTML1.1+MathML parsing ⫌ -PASS XHTML1.1+MathML parsing ⊋ -PASS XHTML1.1+MathML parsing ⫀ -PASS XHTML1.1+MathML parsing ⊃ -PASS XHTML1.1+MathML parsing ⋑ -PASS XHTML1.1+MathML parsing ⊇ -PASS XHTML1.1+MathML parsing ⫆ -PASS XHTML1.1+MathML parsing ⊋ -PASS XHTML1.1+MathML parsing ⫌ -PASS XHTML1.1+MathML parsing ⫈ -PASS XHTML1.1+MathML parsing ⫔ -PASS XHTML1.1+MathML parsing ⫖ -PASS XHTML1.1+MathML parsing ⤦ -PASS XHTML1.1+MathML parsing ↙ -PASS XHTML1.1+MathML parsing ⇙ -PASS XHTML1.1+MathML parsing ↙ -PASS XHTML1.1+MathML parsing ⤪ -PASS XHTML1.1+MathML parsing ß -PASS XHTML1.1+MathML parsing 	 -PASS XHTML1.1+MathML parsing ⌖ -PASS XHTML1.1+MathML parsing Τ -PASS XHTML1.1+MathML parsing τ -PASS XHTML1.1+MathML parsing ⎴ -PASS XHTML1.1+MathML parsing Ť -PASS XHTML1.1+MathML parsing ť -PASS XHTML1.1+MathML parsing Ţ -PASS XHTML1.1+MathML parsing ţ -PASS XHTML1.1+MathML parsing Т -PASS XHTML1.1+MathML parsing т -PASS XHTML1.1+MathML parsing ⃛ -PASS XHTML1.1+MathML parsing ⌕ -PASS XHTML1.1+MathML parsing 𝔗 -PASS XHTML1.1+MathML parsing 𝔱 -PASS XHTML1.1+MathML parsing ∴ -PASS XHTML1.1+MathML parsing ∴ -PASS XHTML1.1+MathML parsing ∴ -PASS XHTML1.1+MathML parsing Θ -PASS XHTML1.1+MathML parsing θ -PASS XHTML1.1+MathML parsing ϑ -PASS XHTML1.1+MathML parsing ϑ -PASS XHTML1.1+MathML parsing ≈ -PASS XHTML1.1+MathML parsing ∼ -PASS XHTML1.1+MathML parsing    -PASS XHTML1.1+MathML parsing   -PASS XHTML1.1+MathML parsing   -PASS XHTML1.1+MathML parsing ≈ -PASS XHTML1.1+MathML parsing ∼ -PASS XHTML1.1+MathML parsing Þ -PASS XHTML1.1+MathML parsing þ -PASS XHTML1.1+MathML parsing ˜ -PASS XHTML1.1+MathML parsing ∼ -PASS XHTML1.1+MathML parsing ≃ -PASS XHTML1.1+MathML parsing ≅ -PASS XHTML1.1+MathML parsing ≈ -PASS XHTML1.1+MathML parsing ⨱ -PASS XHTML1.1+MathML parsing ⊠ -PASS XHTML1.1+MathML parsing × -PASS XHTML1.1+MathML parsing ⨰ -PASS XHTML1.1+MathML parsing ∭ -PASS XHTML1.1+MathML parsing ⤨ -PASS XHTML1.1+MathML parsing ⌶ -PASS XHTML1.1+MathML parsing ⫱ -PASS XHTML1.1+MathML parsing ⊤ -PASS XHTML1.1+MathML parsing 𝕋 -PASS XHTML1.1+MathML parsing 𝕥 -PASS XHTML1.1+MathML parsing ⫚ -PASS XHTML1.1+MathML parsing ⤩ -PASS XHTML1.1+MathML parsing ‴ -PASS XHTML1.1+MathML parsing ™ -PASS XHTML1.1+MathML parsing ™ -PASS XHTML1.1+MathML parsing ▵ -PASS XHTML1.1+MathML parsing ▿ -PASS XHTML1.1+MathML parsing ◃ -PASS XHTML1.1+MathML parsing ⊴ -PASS XHTML1.1+MathML parsing ≜ -PASS XHTML1.1+MathML parsing ▹ -PASS XHTML1.1+MathML parsing ⊵ -PASS XHTML1.1+MathML parsing ◬ -PASS XHTML1.1+MathML parsing ≜ -PASS XHTML1.1+MathML parsing ⨺ -PASS XHTML1.1+MathML parsing ⃛ -PASS XHTML1.1+MathML parsing ⨹ -PASS XHTML1.1+MathML parsing ⧍ -PASS XHTML1.1+MathML parsing ⨻ -PASS XHTML1.1+MathML parsing ⏢ -PASS XHTML1.1+MathML parsing 𝒯 -PASS XHTML1.1+MathML parsing 𝓉 -PASS XHTML1.1+MathML parsing Ц -PASS XHTML1.1+MathML parsing ц -PASS XHTML1.1+MathML parsing Ћ -PASS XHTML1.1+MathML parsing ћ -PASS XHTML1.1+MathML parsing Ŧ -PASS XHTML1.1+MathML parsing ŧ -PASS XHTML1.1+MathML parsing ≬ -PASS XHTML1.1+MathML parsing ↞ -PASS XHTML1.1+MathML parsing ↠ -PASS XHTML1.1+MathML parsing Ú -PASS XHTML1.1+MathML parsing ú -PASS XHTML1.1+MathML parsing ↑ -PASS XHTML1.1+MathML parsing ↟ -PASS XHTML1.1+MathML parsing ⇑ -PASS XHTML1.1+MathML parsing ⥉ -PASS XHTML1.1+MathML parsing Ў -PASS XHTML1.1+MathML parsing ў -PASS XHTML1.1+MathML parsing Ŭ -PASS XHTML1.1+MathML parsing ŭ -PASS XHTML1.1+MathML parsing Û -PASS XHTML1.1+MathML parsing û -PASS XHTML1.1+MathML parsing У -PASS XHTML1.1+MathML parsing у -PASS XHTML1.1+MathML parsing ⇅ -PASS XHTML1.1+MathML parsing Ű -PASS XHTML1.1+MathML parsing ű -PASS XHTML1.1+MathML parsing ⥮ -PASS XHTML1.1+MathML parsing ⥾ -PASS XHTML1.1+MathML parsing 𝔘 -PASS XHTML1.1+MathML parsing 𝔲 -PASS XHTML1.1+MathML parsing Ù -PASS XHTML1.1+MathML parsing ù -PASS XHTML1.1+MathML parsing ⥣ -PASS XHTML1.1+MathML parsing ↿ -PASS XHTML1.1+MathML parsing ↾ -PASS XHTML1.1+MathML parsing ▀ -PASS XHTML1.1+MathML parsing ⌜ -PASS XHTML1.1+MathML parsing ⌜ -PASS XHTML1.1+MathML parsing ⌏ -PASS XHTML1.1+MathML parsing ◸ -PASS XHTML1.1+MathML parsing Ū -PASS XHTML1.1+MathML parsing ū -PASS XHTML1.1+MathML parsing ¨ -PASS XHTML1.1+MathML parsing _ -PASS XHTML1.1+MathML parsing ⏟ -PASS XHTML1.1+MathML parsing ⎵ -PASS XHTML1.1+MathML parsing ⏝ -PASS XHTML1.1+MathML parsing ⋃ -PASS XHTML1.1+MathML parsing ⊎ -PASS XHTML1.1+MathML parsing Ų -PASS XHTML1.1+MathML parsing ų -PASS XHTML1.1+MathML parsing 𝕌 -PASS XHTML1.1+MathML parsing 𝕦 -PASS XHTML1.1+MathML parsing ⤒ -PASS XHTML1.1+MathML parsing ↑ -PASS XHTML1.1+MathML parsing ↑ -PASS XHTML1.1+MathML parsing ⇑ -PASS XHTML1.1+MathML parsing ⇅ -PASS XHTML1.1+MathML parsing ↕ -PASS XHTML1.1+MathML parsing ↕ -PASS XHTML1.1+MathML parsing ⇕ -PASS XHTML1.1+MathML parsing ⥮ -PASS XHTML1.1+MathML parsing ↿ -PASS XHTML1.1+MathML parsing ↾ -PASS XHTML1.1+MathML parsing ⊎ -PASS XHTML1.1+MathML parsing ↖ -PASS XHTML1.1+MathML parsing ↗ -PASS XHTML1.1+MathML parsing υ -PASS XHTML1.1+MathML parsing ϒ -PASS XHTML1.1+MathML parsing ϒ -PASS XHTML1.1+MathML parsing Υ -PASS XHTML1.1+MathML parsing υ -PASS XHTML1.1+MathML parsing ↥ -PASS XHTML1.1+MathML parsing ⊥ -PASS XHTML1.1+MathML parsing ⇈ -PASS XHTML1.1+MathML parsing ⌝ -PASS XHTML1.1+MathML parsing ⌝ -PASS XHTML1.1+MathML parsing ⌎ -PASS XHTML1.1+MathML parsing Ů -PASS XHTML1.1+MathML parsing ů -PASS XHTML1.1+MathML parsing ◹ -PASS XHTML1.1+MathML parsing 𝒰 -PASS XHTML1.1+MathML parsing 𝓊 -PASS XHTML1.1+MathML parsing ⋰ -PASS XHTML1.1+MathML parsing Ũ -PASS XHTML1.1+MathML parsing ũ -PASS XHTML1.1+MathML parsing ▵ -PASS XHTML1.1+MathML parsing ▴ -PASS XHTML1.1+MathML parsing ⇈ -PASS XHTML1.1+MathML parsing Ü -PASS XHTML1.1+MathML parsing ü -PASS XHTML1.1+MathML parsing ⦧ -PASS XHTML1.1+MathML parsing ⦜ -PASS XHTML1.1+MathML parsing ϵ -PASS XHTML1.1+MathML parsing ϰ -PASS XHTML1.1+MathML parsing ∅ -PASS XHTML1.1+MathML parsing ϕ -PASS XHTML1.1+MathML parsing ϖ -PASS XHTML1.1+MathML parsing ∝ -PASS XHTML1.1+MathML parsing ↕ -PASS XHTML1.1+MathML parsing ⇕ -PASS XHTML1.1+MathML parsing ϱ -PASS XHTML1.1+MathML parsing ς -PASS XHTML1.1+MathML parsing ⊊︀ -PASS XHTML1.1+MathML parsing ⫋︀ -PASS XHTML1.1+MathML parsing ⊋︀ -PASS XHTML1.1+MathML parsing ⫌︀ -PASS XHTML1.1+MathML parsing ϑ -PASS XHTML1.1+MathML parsing ⊲ -PASS XHTML1.1+MathML parsing ⊳ -PASS XHTML1.1+MathML parsing ⫨ -PASS XHTML1.1+MathML parsing ⫫ -PASS XHTML1.1+MathML parsing ⫩ -PASS XHTML1.1+MathML parsing В -PASS XHTML1.1+MathML parsing в -PASS XHTML1.1+MathML parsing ⊢ -PASS XHTML1.1+MathML parsing ⊨ -PASS XHTML1.1+MathML parsing ⊩ -PASS XHTML1.1+MathML parsing ⊫ -PASS XHTML1.1+MathML parsing ⫦ -PASS XHTML1.1+MathML parsing ⊻ -PASS XHTML1.1+MathML parsing ∨ -PASS XHTML1.1+MathML parsing ⋁ -PASS XHTML1.1+MathML parsing ≚ -PASS XHTML1.1+MathML parsing ⋮ -PASS XHTML1.1+MathML parsing | -PASS XHTML1.1+MathML parsing ‖ -PASS XHTML1.1+MathML parsing | -PASS XHTML1.1+MathML parsing ‖ -PASS XHTML1.1+MathML parsing ∣ -PASS XHTML1.1+MathML parsing | -PASS XHTML1.1+MathML parsing ❘ -PASS XHTML1.1+MathML parsing ≀ -PASS XHTML1.1+MathML parsing   -PASS XHTML1.1+MathML parsing 𝔙 -PASS XHTML1.1+MathML parsing 𝔳 -PASS XHTML1.1+MathML parsing ⊲ -PASS XHTML1.1+MathML parsing ⊂⃒ -PASS XHTML1.1+MathML parsing ⊃⃒ -PASS XHTML1.1+MathML parsing 𝕍 -PASS XHTML1.1+MathML parsing 𝕧 -PASS XHTML1.1+MathML parsing ∝ -PASS XHTML1.1+MathML parsing ⊳ -PASS XHTML1.1+MathML parsing 𝒱 -PASS XHTML1.1+MathML parsing 𝓋 -PASS XHTML1.1+MathML parsing ⫋︀ -PASS XHTML1.1+MathML parsing ⊊︀ -PASS XHTML1.1+MathML parsing ⫌︀ -PASS XHTML1.1+MathML parsing ⊋︀ -PASS XHTML1.1+MathML parsing ⊪ -PASS XHTML1.1+MathML parsing ⦚ -PASS XHTML1.1+MathML parsing Ŵ -PASS XHTML1.1+MathML parsing ŵ -PASS XHTML1.1+MathML parsing ⩟ -PASS XHTML1.1+MathML parsing ∧ -PASS XHTML1.1+MathML parsing ⋀ -PASS XHTML1.1+MathML parsing ≙ -PASS XHTML1.1+MathML parsing ℘ -PASS XHTML1.1+MathML parsing 𝔚 -PASS XHTML1.1+MathML parsing 𝔴 -PASS XHTML1.1+MathML parsing 𝕎 -PASS XHTML1.1+MathML parsing 𝕨 -PASS XHTML1.1+MathML parsing ℘ -PASS XHTML1.1+MathML parsing ≀ -PASS XHTML1.1+MathML parsing ≀ -PASS XHTML1.1+MathML parsing 𝒲 -PASS XHTML1.1+MathML parsing 𝓌 -PASS XHTML1.1+MathML parsing ⋂ -PASS XHTML1.1+MathML parsing ◯ -PASS XHTML1.1+MathML parsing ⋃ -PASS XHTML1.1+MathML parsing ▽ -PASS XHTML1.1+MathML parsing 𝔛 -PASS XHTML1.1+MathML parsing 𝔵 -PASS XHTML1.1+MathML parsing ⟷ -PASS XHTML1.1+MathML parsing ⟺ -PASS XHTML1.1+MathML parsing Ξ -PASS XHTML1.1+MathML parsing ξ -PASS XHTML1.1+MathML parsing ⟵ -PASS XHTML1.1+MathML parsing ⟸ -PASS XHTML1.1+MathML parsing ⟼ -PASS XHTML1.1+MathML parsing ⋻ -PASS XHTML1.1+MathML parsing ⨀ -PASS XHTML1.1+MathML parsing 𝕏 -PASS XHTML1.1+MathML parsing 𝕩 -PASS XHTML1.1+MathML parsing ⨁ -PASS XHTML1.1+MathML parsing ⨂ -PASS XHTML1.1+MathML parsing ⟶ -PASS XHTML1.1+MathML parsing ⟹ -PASS XHTML1.1+MathML parsing 𝒳 -PASS XHTML1.1+MathML parsing 𝓍 -PASS XHTML1.1+MathML parsing ⨆ -PASS XHTML1.1+MathML parsing ⨄ -PASS XHTML1.1+MathML parsing △ -PASS XHTML1.1+MathML parsing ⋁ -PASS XHTML1.1+MathML parsing ⋀ -PASS XHTML1.1+MathML parsing Ý -PASS XHTML1.1+MathML parsing ý -PASS XHTML1.1+MathML parsing Я -PASS XHTML1.1+MathML parsing я -PASS XHTML1.1+MathML parsing Ŷ -PASS XHTML1.1+MathML parsing ŷ -PASS XHTML1.1+MathML parsing Ы -PASS XHTML1.1+MathML parsing ы -PASS XHTML1.1+MathML parsing ¥ -PASS XHTML1.1+MathML parsing 𝔜 -PASS XHTML1.1+MathML parsing 𝔶 -PASS XHTML1.1+MathML parsing Ї -PASS XHTML1.1+MathML parsing ї -PASS XHTML1.1+MathML parsing 𝕐 -PASS XHTML1.1+MathML parsing 𝕪 -PASS XHTML1.1+MathML parsing 𝒴 -PASS XHTML1.1+MathML parsing 𝓎 -PASS XHTML1.1+MathML parsing Ю -PASS XHTML1.1+MathML parsing ю -PASS XHTML1.1+MathML parsing ÿ -PASS XHTML1.1+MathML parsing Ÿ -PASS XHTML1.1+MathML parsing Ź -PASS XHTML1.1+MathML parsing ź -PASS XHTML1.1+MathML parsing Ž -PASS XHTML1.1+MathML parsing ž -PASS XHTML1.1+MathML parsing З -PASS XHTML1.1+MathML parsing з -PASS XHTML1.1+MathML parsing Ż -PASS XHTML1.1+MathML parsing ż -PASS XHTML1.1+MathML parsing ℨ -PASS XHTML1.1+MathML parsing ​ -PASS XHTML1.1+MathML parsing Ζ -PASS XHTML1.1+MathML parsing ζ -PASS XHTML1.1+MathML parsing 𝔷 -PASS XHTML1.1+MathML parsing ℨ -PASS XHTML1.1+MathML parsing Ж -PASS XHTML1.1+MathML parsing ж -PASS XHTML1.1+MathML parsing ⇝ -PASS XHTML1.1+MathML parsing 𝕫 -PASS XHTML1.1+MathML parsing ℤ -PASS XHTML1.1+MathML parsing 𝒵 -PASS XHTML1.1+MathML parsing 𝓏 -PASS XHTML1.1+MathML parsing ‍ -PASS XHTML1.1+MathML parsing ‌ -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-7-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-7-expected.txt deleted file mode 100644 index 2affd980..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-7-expected.txt +++ /dev/null
@@ -1,2129 +0,0 @@ -This is a testharness.js-based test. -Found 2125 tests; 2122 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS XHTML1.1+MathML+SVG parsing Á -PASS XHTML1.1+MathML+SVG parsing á -PASS XHTML1.1+MathML+SVG parsing Ă -PASS XHTML1.1+MathML+SVG parsing ă -PASS XHTML1.1+MathML+SVG parsing ∾ -PASS XHTML1.1+MathML+SVG parsing ∿ -PASS XHTML1.1+MathML+SVG parsing ∾̳ -PASS XHTML1.1+MathML+SVG parsing  -PASS XHTML1.1+MathML+SVG parsing â -PASS XHTML1.1+MathML+SVG parsing ´ -PASS XHTML1.1+MathML+SVG parsing А -PASS XHTML1.1+MathML+SVG parsing а -PASS XHTML1.1+MathML+SVG parsing Æ -PASS XHTML1.1+MathML+SVG parsing æ -PASS XHTML1.1+MathML+SVG parsing ⁡ -PASS XHTML1.1+MathML+SVG parsing 𝔄 -PASS XHTML1.1+MathML+SVG parsing 𝔞 -PASS XHTML1.1+MathML+SVG parsing À -PASS XHTML1.1+MathML+SVG parsing à -PASS XHTML1.1+MathML+SVG parsing ℵ -PASS XHTML1.1+MathML+SVG parsing ℵ -PASS XHTML1.1+MathML+SVG parsing Α -PASS XHTML1.1+MathML+SVG parsing α -PASS XHTML1.1+MathML+SVG parsing Ā -PASS XHTML1.1+MathML+SVG parsing ā -PASS XHTML1.1+MathML+SVG parsing ⨿ -PASS XHTML1.1+MathML+SVG parsing & -FAIL XHTML1.1+MathML+SVG parsing & assert_true: expected true got false -PASS XHTML1.1+MathML+SVG parsing ⩕ -PASS XHTML1.1+MathML+SVG parsing ⩓ -PASS XHTML1.1+MathML+SVG parsing ∧ -PASS XHTML1.1+MathML+SVG parsing ⩜ -PASS XHTML1.1+MathML+SVG parsing ⩘ -PASS XHTML1.1+MathML+SVG parsing ⩚ -PASS XHTML1.1+MathML+SVG parsing ∠ -PASS XHTML1.1+MathML+SVG parsing ⦤ -PASS XHTML1.1+MathML+SVG parsing ∠ -PASS XHTML1.1+MathML+SVG parsing ⦨ -PASS XHTML1.1+MathML+SVG parsing ⦩ -PASS XHTML1.1+MathML+SVG parsing ⦪ -PASS XHTML1.1+MathML+SVG parsing ⦫ -PASS XHTML1.1+MathML+SVG parsing ⦬ -PASS XHTML1.1+MathML+SVG parsing ⦭ -PASS XHTML1.1+MathML+SVG parsing ⦮ -PASS XHTML1.1+MathML+SVG parsing ⦯ -PASS XHTML1.1+MathML+SVG parsing ∡ -PASS XHTML1.1+MathML+SVG parsing ∟ -PASS XHTML1.1+MathML+SVG parsing ⊾ -PASS XHTML1.1+MathML+SVG parsing ⦝ -PASS XHTML1.1+MathML+SVG parsing ∢ -PASS XHTML1.1+MathML+SVG parsing Å -PASS XHTML1.1+MathML+SVG parsing ⍼ -PASS XHTML1.1+MathML+SVG parsing Ą -PASS XHTML1.1+MathML+SVG parsing ą -PASS XHTML1.1+MathML+SVG parsing 𝔸 -PASS XHTML1.1+MathML+SVG parsing 𝕒 -PASS XHTML1.1+MathML+SVG parsing ⩯ -PASS XHTML1.1+MathML+SVG parsing ≈ -PASS XHTML1.1+MathML+SVG parsing ⩰ -PASS XHTML1.1+MathML+SVG parsing ≊ -PASS XHTML1.1+MathML+SVG parsing ≋ -PASS XHTML1.1+MathML+SVG parsing ' -PASS XHTML1.1+MathML+SVG parsing ⁡ -PASS XHTML1.1+MathML+SVG parsing ≈ -PASS XHTML1.1+MathML+SVG parsing ≊ -PASS XHTML1.1+MathML+SVG parsing Å -PASS XHTML1.1+MathML+SVG parsing å -PASS XHTML1.1+MathML+SVG parsing 𝒜 -PASS XHTML1.1+MathML+SVG parsing 𝒶 -PASS XHTML1.1+MathML+SVG parsing ≔ -PASS XHTML1.1+MathML+SVG parsing * -PASS XHTML1.1+MathML+SVG parsing ≈ -PASS XHTML1.1+MathML+SVG parsing ≍ -PASS XHTML1.1+MathML+SVG parsing à -PASS XHTML1.1+MathML+SVG parsing ã -PASS XHTML1.1+MathML+SVG parsing Ä -PASS XHTML1.1+MathML+SVG parsing ä -PASS XHTML1.1+MathML+SVG parsing ∳ -PASS XHTML1.1+MathML+SVG parsing ⨑ -PASS XHTML1.1+MathML+SVG parsing ≌ -PASS XHTML1.1+MathML+SVG parsing ϶ -PASS XHTML1.1+MathML+SVG parsing ‵ -PASS XHTML1.1+MathML+SVG parsing ∽ -PASS XHTML1.1+MathML+SVG parsing ⋍ -PASS XHTML1.1+MathML+SVG parsing ∖ -PASS XHTML1.1+MathML+SVG parsing ⫧ -PASS XHTML1.1+MathML+SVG parsing ⊽ -PASS XHTML1.1+MathML+SVG parsing ⌅ -PASS XHTML1.1+MathML+SVG parsing ⌆ -PASS XHTML1.1+MathML+SVG parsing ⌅ -PASS XHTML1.1+MathML+SVG parsing ⎵ -PASS XHTML1.1+MathML+SVG parsing ⎶ -PASS XHTML1.1+MathML+SVG parsing ≌ -PASS XHTML1.1+MathML+SVG parsing Б -PASS XHTML1.1+MathML+SVG parsing б -PASS XHTML1.1+MathML+SVG parsing „ -PASS XHTML1.1+MathML+SVG parsing ∵ -PASS XHTML1.1+MathML+SVG parsing ∵ -PASS XHTML1.1+MathML+SVG parsing ∵ -PASS XHTML1.1+MathML+SVG parsing ⦰ -PASS XHTML1.1+MathML+SVG parsing ϶ -PASS XHTML1.1+MathML+SVG parsing ℬ -PASS XHTML1.1+MathML+SVG parsing ℬ -PASS XHTML1.1+MathML+SVG parsing Β -PASS XHTML1.1+MathML+SVG parsing β -PASS XHTML1.1+MathML+SVG parsing ℶ -PASS XHTML1.1+MathML+SVG parsing ≬ -PASS XHTML1.1+MathML+SVG parsing 𝔅 -PASS XHTML1.1+MathML+SVG parsing 𝔟 -PASS XHTML1.1+MathML+SVG parsing ⋂ -PASS XHTML1.1+MathML+SVG parsing ◯ -PASS XHTML1.1+MathML+SVG parsing ⋃ -PASS XHTML1.1+MathML+SVG parsing ⨀ -PASS XHTML1.1+MathML+SVG parsing ⨁ -PASS XHTML1.1+MathML+SVG parsing ⨂ -PASS XHTML1.1+MathML+SVG parsing ⨆ -PASS XHTML1.1+MathML+SVG parsing ★ -PASS XHTML1.1+MathML+SVG parsing ▽ -PASS XHTML1.1+MathML+SVG parsing △ -PASS XHTML1.1+MathML+SVG parsing ⨄ -PASS XHTML1.1+MathML+SVG parsing ⋁ -PASS XHTML1.1+MathML+SVG parsing ⋀ -PASS XHTML1.1+MathML+SVG parsing ⤍ -PASS XHTML1.1+MathML+SVG parsing ⧫ -PASS XHTML1.1+MathML+SVG parsing ▪ -PASS XHTML1.1+MathML+SVG parsing ▴ -PASS XHTML1.1+MathML+SVG parsing ▾ -PASS XHTML1.1+MathML+SVG parsing ◂ -PASS XHTML1.1+MathML+SVG parsing ▸ -PASS XHTML1.1+MathML+SVG parsing ␣ -PASS XHTML1.1+MathML+SVG parsing ▒ -PASS XHTML1.1+MathML+SVG parsing ░ -PASS XHTML1.1+MathML+SVG parsing ▓ -PASS XHTML1.1+MathML+SVG parsing █ -PASS XHTML1.1+MathML+SVG parsing =⃥ -PASS XHTML1.1+MathML+SVG parsing ≡⃥ -PASS XHTML1.1+MathML+SVG parsing ⫭ -PASS XHTML1.1+MathML+SVG parsing ⌐ -PASS XHTML1.1+MathML+SVG parsing 𝔹 -PASS XHTML1.1+MathML+SVG parsing 𝕓 -PASS XHTML1.1+MathML+SVG parsing ⊥ -PASS XHTML1.1+MathML+SVG parsing ⊥ -PASS XHTML1.1+MathML+SVG parsing ⋈ -PASS XHTML1.1+MathML+SVG parsing ⧉ -PASS XHTML1.1+MathML+SVG parsing ┐ -PASS XHTML1.1+MathML+SVG parsing ╕ -PASS XHTML1.1+MathML+SVG parsing ╖ -PASS XHTML1.1+MathML+SVG parsing ╗ -PASS XHTML1.1+MathML+SVG parsing ┌ -PASS XHTML1.1+MathML+SVG parsing ╒ -PASS XHTML1.1+MathML+SVG parsing ╓ -PASS XHTML1.1+MathML+SVG parsing ╔ -PASS XHTML1.1+MathML+SVG parsing ─ -PASS XHTML1.1+MathML+SVG parsing ═ -PASS XHTML1.1+MathML+SVG parsing ┬ -PASS XHTML1.1+MathML+SVG parsing ╤ -PASS XHTML1.1+MathML+SVG parsing ╥ -PASS XHTML1.1+MathML+SVG parsing ╦ -PASS XHTML1.1+MathML+SVG parsing ┴ -PASS XHTML1.1+MathML+SVG parsing ╧ -PASS XHTML1.1+MathML+SVG parsing ╨ -PASS XHTML1.1+MathML+SVG parsing ╩ -PASS XHTML1.1+MathML+SVG parsing ⊟ -PASS XHTML1.1+MathML+SVG parsing ⊞ -PASS XHTML1.1+MathML+SVG parsing ⊠ -PASS XHTML1.1+MathML+SVG parsing ┘ -PASS XHTML1.1+MathML+SVG parsing ╛ -PASS XHTML1.1+MathML+SVG parsing ╜ -PASS XHTML1.1+MathML+SVG parsing ╝ -PASS XHTML1.1+MathML+SVG parsing └ -PASS XHTML1.1+MathML+SVG parsing ╘ -PASS XHTML1.1+MathML+SVG parsing ╙ -PASS XHTML1.1+MathML+SVG parsing ╚ -PASS XHTML1.1+MathML+SVG parsing │ -PASS XHTML1.1+MathML+SVG parsing ║ -PASS XHTML1.1+MathML+SVG parsing ┼ -PASS XHTML1.1+MathML+SVG parsing ╪ -PASS XHTML1.1+MathML+SVG parsing ╫ -PASS XHTML1.1+MathML+SVG parsing ╬ -PASS XHTML1.1+MathML+SVG parsing ┤ -PASS XHTML1.1+MathML+SVG parsing ╡ -PASS XHTML1.1+MathML+SVG parsing ╢ -PASS XHTML1.1+MathML+SVG parsing ╣ -PASS XHTML1.1+MathML+SVG parsing ├ -PASS XHTML1.1+MathML+SVG parsing ╞ -PASS XHTML1.1+MathML+SVG parsing ╟ -PASS XHTML1.1+MathML+SVG parsing ╠ -PASS XHTML1.1+MathML+SVG parsing ‵ -PASS XHTML1.1+MathML+SVG parsing ˘ -PASS XHTML1.1+MathML+SVG parsing ˘ -PASS XHTML1.1+MathML+SVG parsing ¦ -PASS XHTML1.1+MathML+SVG parsing 𝒷 -PASS XHTML1.1+MathML+SVG parsing ℬ -PASS XHTML1.1+MathML+SVG parsing ⁏ -PASS XHTML1.1+MathML+SVG parsing ∽ -PASS XHTML1.1+MathML+SVG parsing ⋍ -PASS XHTML1.1+MathML+SVG parsing ⧅ -PASS XHTML1.1+MathML+SVG parsing \ -PASS XHTML1.1+MathML+SVG parsing ⟈ -PASS XHTML1.1+MathML+SVG parsing • -PASS XHTML1.1+MathML+SVG parsing • -PASS XHTML1.1+MathML+SVG parsing ≎ -PASS XHTML1.1+MathML+SVG parsing ⪮ -PASS XHTML1.1+MathML+SVG parsing ≏ -PASS XHTML1.1+MathML+SVG parsing ≎ -PASS XHTML1.1+MathML+SVG parsing ≏ -PASS XHTML1.1+MathML+SVG parsing Ć -PASS XHTML1.1+MathML+SVG parsing ć -PASS XHTML1.1+MathML+SVG parsing ⩄ -PASS XHTML1.1+MathML+SVG parsing ⩉ -PASS XHTML1.1+MathML+SVG parsing ⩋ -PASS XHTML1.1+MathML+SVG parsing ∩ -PASS XHTML1.1+MathML+SVG parsing ⋒ -PASS XHTML1.1+MathML+SVG parsing ⩇ -PASS XHTML1.1+MathML+SVG parsing ⩀ -PASS XHTML1.1+MathML+SVG parsing ⅅ -PASS XHTML1.1+MathML+SVG parsing ∩︀ -PASS XHTML1.1+MathML+SVG parsing ⁁ -PASS XHTML1.1+MathML+SVG parsing ˇ -PASS XHTML1.1+MathML+SVG parsing ℭ -PASS XHTML1.1+MathML+SVG parsing ⩍ -PASS XHTML1.1+MathML+SVG parsing Č -PASS XHTML1.1+MathML+SVG parsing č -PASS XHTML1.1+MathML+SVG parsing Ç -PASS XHTML1.1+MathML+SVG parsing ç -PASS XHTML1.1+MathML+SVG parsing Ĉ -PASS XHTML1.1+MathML+SVG parsing ĉ -PASS XHTML1.1+MathML+SVG parsing ∰ -PASS XHTML1.1+MathML+SVG parsing ⩌ -PASS XHTML1.1+MathML+SVG parsing ⩐ -PASS XHTML1.1+MathML+SVG parsing Ċ -PASS XHTML1.1+MathML+SVG parsing ċ -PASS XHTML1.1+MathML+SVG parsing ¸ -PASS XHTML1.1+MathML+SVG parsing ¸ -PASS XHTML1.1+MathML+SVG parsing ⦲ -PASS XHTML1.1+MathML+SVG parsing ¢ -PASS XHTML1.1+MathML+SVG parsing · -PASS XHTML1.1+MathML+SVG parsing · -PASS XHTML1.1+MathML+SVG parsing 𝔠 -PASS XHTML1.1+MathML+SVG parsing ℭ -PASS XHTML1.1+MathML+SVG parsing Ч -PASS XHTML1.1+MathML+SVG parsing ч -PASS XHTML1.1+MathML+SVG parsing ✓ -PASS XHTML1.1+MathML+SVG parsing ✓ -PASS XHTML1.1+MathML+SVG parsing Χ -PASS XHTML1.1+MathML+SVG parsing χ -PASS XHTML1.1+MathML+SVG parsing ˆ -PASS XHTML1.1+MathML+SVG parsing ≗ -PASS XHTML1.1+MathML+SVG parsing ↺ -PASS XHTML1.1+MathML+SVG parsing ↻ -PASS XHTML1.1+MathML+SVG parsing ⊛ -PASS XHTML1.1+MathML+SVG parsing ⊚ -PASS XHTML1.1+MathML+SVG parsing ⊝ -PASS XHTML1.1+MathML+SVG parsing ⊙ -PASS XHTML1.1+MathML+SVG parsing ® -PASS XHTML1.1+MathML+SVG parsing Ⓢ -PASS XHTML1.1+MathML+SVG parsing ⊖ -PASS XHTML1.1+MathML+SVG parsing ⊕ -PASS XHTML1.1+MathML+SVG parsing ⊗ -PASS XHTML1.1+MathML+SVG parsing ○ -PASS XHTML1.1+MathML+SVG parsing ⧃ -PASS XHTML1.1+MathML+SVG parsing ≗ -PASS XHTML1.1+MathML+SVG parsing ⨐ -PASS XHTML1.1+MathML+SVG parsing ⫯ -PASS XHTML1.1+MathML+SVG parsing ⧂ -PASS XHTML1.1+MathML+SVG parsing ∲ -PASS XHTML1.1+MathML+SVG parsing ” -PASS XHTML1.1+MathML+SVG parsing ’ -PASS XHTML1.1+MathML+SVG parsing ♣ -PASS XHTML1.1+MathML+SVG parsing ♣ -PASS XHTML1.1+MathML+SVG parsing : -PASS XHTML1.1+MathML+SVG parsing ∷ -PASS XHTML1.1+MathML+SVG parsing ⩴ -PASS XHTML1.1+MathML+SVG parsing ≔ -PASS XHTML1.1+MathML+SVG parsing ≔ -PASS XHTML1.1+MathML+SVG parsing , -PASS XHTML1.1+MathML+SVG parsing @ -PASS XHTML1.1+MathML+SVG parsing ∁ -PASS XHTML1.1+MathML+SVG parsing ∘ -PASS XHTML1.1+MathML+SVG parsing ∁ -PASS XHTML1.1+MathML+SVG parsing ℂ -PASS XHTML1.1+MathML+SVG parsing ≅ -PASS XHTML1.1+MathML+SVG parsing ⩭ -PASS XHTML1.1+MathML+SVG parsing ≡ -PASS XHTML1.1+MathML+SVG parsing ∮ -PASS XHTML1.1+MathML+SVG parsing ∯ -PASS XHTML1.1+MathML+SVG parsing ∮ -PASS XHTML1.1+MathML+SVG parsing 𝕔 -PASS XHTML1.1+MathML+SVG parsing ℂ -PASS XHTML1.1+MathML+SVG parsing ∐ -PASS XHTML1.1+MathML+SVG parsing ∐ -PASS XHTML1.1+MathML+SVG parsing © -PASS XHTML1.1+MathML+SVG parsing © -PASS XHTML1.1+MathML+SVG parsing ℗ -PASS XHTML1.1+MathML+SVG parsing ∳ -PASS XHTML1.1+MathML+SVG parsing ↵ -PASS XHTML1.1+MathML+SVG parsing ✗ -PASS XHTML1.1+MathML+SVG parsing ⨯ -PASS XHTML1.1+MathML+SVG parsing 𝒞 -PASS XHTML1.1+MathML+SVG parsing 𝒸 -PASS XHTML1.1+MathML+SVG parsing ⫏ -PASS XHTML1.1+MathML+SVG parsing ⫑ -PASS XHTML1.1+MathML+SVG parsing ⫐ -PASS XHTML1.1+MathML+SVG parsing ⫒ -PASS XHTML1.1+MathML+SVG parsing ⋯ -PASS XHTML1.1+MathML+SVG parsing ⤸ -PASS XHTML1.1+MathML+SVG parsing ⤵ -PASS XHTML1.1+MathML+SVG parsing ⋞ -PASS XHTML1.1+MathML+SVG parsing ⋟ -PASS XHTML1.1+MathML+SVG parsing ↶ -PASS XHTML1.1+MathML+SVG parsing ⤽ -PASS XHTML1.1+MathML+SVG parsing ⩈ -PASS XHTML1.1+MathML+SVG parsing ⩆ -PASS XHTML1.1+MathML+SVG parsing ≍ -PASS XHTML1.1+MathML+SVG parsing ∪ -PASS XHTML1.1+MathML+SVG parsing ⋓ -PASS XHTML1.1+MathML+SVG parsing ⩊ -PASS XHTML1.1+MathML+SVG parsing ⊍ -PASS XHTML1.1+MathML+SVG parsing ⩅ -PASS XHTML1.1+MathML+SVG parsing ∪︀ -PASS XHTML1.1+MathML+SVG parsing ↷ -PASS XHTML1.1+MathML+SVG parsing ⤼ -PASS XHTML1.1+MathML+SVG parsing ⋞ -PASS XHTML1.1+MathML+SVG parsing ⋟ -PASS XHTML1.1+MathML+SVG parsing ⋎ -PASS XHTML1.1+MathML+SVG parsing ⋏ -PASS XHTML1.1+MathML+SVG parsing ¤ -PASS XHTML1.1+MathML+SVG parsing ↶ -PASS XHTML1.1+MathML+SVG parsing ↷ -PASS XHTML1.1+MathML+SVG parsing ⋎ -PASS XHTML1.1+MathML+SVG parsing ⋏ -PASS XHTML1.1+MathML+SVG parsing ∲ -PASS XHTML1.1+MathML+SVG parsing ∱ -PASS XHTML1.1+MathML+SVG parsing ⌭ -PASS XHTML1.1+MathML+SVG parsing † -PASS XHTML1.1+MathML+SVG parsing ‡ -PASS XHTML1.1+MathML+SVG parsing ℸ -PASS XHTML1.1+MathML+SVG parsing ↓ -PASS XHTML1.1+MathML+SVG parsing ↡ -PASS XHTML1.1+MathML+SVG parsing ⇓ -PASS XHTML1.1+MathML+SVG parsing ‐ -PASS XHTML1.1+MathML+SVG parsing ⫤ -PASS XHTML1.1+MathML+SVG parsing ⊣ -PASS XHTML1.1+MathML+SVG parsing ⤏ -PASS XHTML1.1+MathML+SVG parsing ˝ -PASS XHTML1.1+MathML+SVG parsing Ď -PASS XHTML1.1+MathML+SVG parsing ď -PASS XHTML1.1+MathML+SVG parsing Д -PASS XHTML1.1+MathML+SVG parsing д -PASS XHTML1.1+MathML+SVG parsing ‡ -PASS XHTML1.1+MathML+SVG parsing ⇊ -PASS XHTML1.1+MathML+SVG parsing ⅅ -PASS XHTML1.1+MathML+SVG parsing ⅆ -PASS XHTML1.1+MathML+SVG parsing ⤑ -PASS XHTML1.1+MathML+SVG parsing ⩷ -PASS XHTML1.1+MathML+SVG parsing ° -PASS XHTML1.1+MathML+SVG parsing ∇ -PASS XHTML1.1+MathML+SVG parsing Δ -PASS XHTML1.1+MathML+SVG parsing δ -PASS XHTML1.1+MathML+SVG parsing ⦱ -PASS XHTML1.1+MathML+SVG parsing ⥿ -PASS XHTML1.1+MathML+SVG parsing 𝔇 -PASS XHTML1.1+MathML+SVG parsing 𝔡 -PASS XHTML1.1+MathML+SVG parsing ⥥ -PASS XHTML1.1+MathML+SVG parsing ⇃ -PASS XHTML1.1+MathML+SVG parsing ⇂ -PASS XHTML1.1+MathML+SVG parsing ´ -PASS XHTML1.1+MathML+SVG parsing ˙ -PASS XHTML1.1+MathML+SVG parsing ˝ -PASS XHTML1.1+MathML+SVG parsing ` -PASS XHTML1.1+MathML+SVG parsing ˜ -PASS XHTML1.1+MathML+SVG parsing ⋄ -PASS XHTML1.1+MathML+SVG parsing ⋄ -PASS XHTML1.1+MathML+SVG parsing ⋄ -PASS XHTML1.1+MathML+SVG parsing ♦ -PASS XHTML1.1+MathML+SVG parsing ♦ -PASS XHTML1.1+MathML+SVG parsing ¨ -PASS XHTML1.1+MathML+SVG parsing ⅆ -PASS XHTML1.1+MathML+SVG parsing ϝ -PASS XHTML1.1+MathML+SVG parsing ⋲ -PASS XHTML1.1+MathML+SVG parsing ÷ -PASS XHTML1.1+MathML+SVG parsing ÷ -PASS XHTML1.1+MathML+SVG parsing ⋇ -PASS XHTML1.1+MathML+SVG parsing ⋇ -PASS XHTML1.1+MathML+SVG parsing Ђ -PASS XHTML1.1+MathML+SVG parsing ђ -PASS XHTML1.1+MathML+SVG parsing ⌞ -PASS XHTML1.1+MathML+SVG parsing ⌍ -PASS XHTML1.1+MathML+SVG parsing $ -PASS XHTML1.1+MathML+SVG parsing 𝔻 -PASS XHTML1.1+MathML+SVG parsing 𝕕 -PASS XHTML1.1+MathML+SVG parsing ¨ -PASS XHTML1.1+MathML+SVG parsing ˙ -PASS XHTML1.1+MathML+SVG parsing ⃜ -PASS XHTML1.1+MathML+SVG parsing ≐ -PASS XHTML1.1+MathML+SVG parsing ≑ -PASS XHTML1.1+MathML+SVG parsing ≐ -PASS XHTML1.1+MathML+SVG parsing ∸ -PASS XHTML1.1+MathML+SVG parsing ∔ -PASS XHTML1.1+MathML+SVG parsing ⊡ -PASS XHTML1.1+MathML+SVG parsing ⌆ -PASS XHTML1.1+MathML+SVG parsing ∯ -PASS XHTML1.1+MathML+SVG parsing ¨ -PASS XHTML1.1+MathML+SVG parsing ⇓ -PASS XHTML1.1+MathML+SVG parsing ⇐ -PASS XHTML1.1+MathML+SVG parsing ⇔ -PASS XHTML1.1+MathML+SVG parsing ⫤ -PASS XHTML1.1+MathML+SVG parsing ⟸ -PASS XHTML1.1+MathML+SVG parsing ⟺ -PASS XHTML1.1+MathML+SVG parsing ⟹ -PASS XHTML1.1+MathML+SVG parsing ⇒ -PASS XHTML1.1+MathML+SVG parsing ⊨ -PASS XHTML1.1+MathML+SVG parsing ⇑ -PASS XHTML1.1+MathML+SVG parsing ⇕ -PASS XHTML1.1+MathML+SVG parsing ∥ -PASS XHTML1.1+MathML+SVG parsing ⤓ -PASS XHTML1.1+MathML+SVG parsing ↓ -PASS XHTML1.1+MathML+SVG parsing ↓ -PASS XHTML1.1+MathML+SVG parsing ⇓ -PASS XHTML1.1+MathML+SVG parsing ⇵ -PASS XHTML1.1+MathML+SVG parsing ̑ -PASS XHTML1.1+MathML+SVG parsing ⇊ -PASS XHTML1.1+MathML+SVG parsing ⇃ -PASS XHTML1.1+MathML+SVG parsing ⇂ -PASS XHTML1.1+MathML+SVG parsing ⥐ -PASS XHTML1.1+MathML+SVG parsing ⥞ -PASS XHTML1.1+MathML+SVG parsing ⥖ -PASS XHTML1.1+MathML+SVG parsing ↽ -PASS XHTML1.1+MathML+SVG parsing ⥟ -PASS XHTML1.1+MathML+SVG parsing ⥗ -PASS XHTML1.1+MathML+SVG parsing ⇁ -PASS XHTML1.1+MathML+SVG parsing ↧ -PASS XHTML1.1+MathML+SVG parsing ⊤ -PASS XHTML1.1+MathML+SVG parsing ⤐ -PASS XHTML1.1+MathML+SVG parsing ⌟ -PASS XHTML1.1+MathML+SVG parsing ⌌ -PASS XHTML1.1+MathML+SVG parsing 𝒟 -PASS XHTML1.1+MathML+SVG parsing 𝒹 -PASS XHTML1.1+MathML+SVG parsing Ѕ -PASS XHTML1.1+MathML+SVG parsing ѕ -PASS XHTML1.1+MathML+SVG parsing ⧶ -PASS XHTML1.1+MathML+SVG parsing Đ -PASS XHTML1.1+MathML+SVG parsing đ -PASS XHTML1.1+MathML+SVG parsing ⋱ -PASS XHTML1.1+MathML+SVG parsing ▿ -PASS XHTML1.1+MathML+SVG parsing ▾ -PASS XHTML1.1+MathML+SVG parsing ⇵ -PASS XHTML1.1+MathML+SVG parsing ⥯ -PASS XHTML1.1+MathML+SVG parsing ⦦ -PASS XHTML1.1+MathML+SVG parsing Џ -PASS XHTML1.1+MathML+SVG parsing џ -PASS XHTML1.1+MathML+SVG parsing ⟿ -PASS XHTML1.1+MathML+SVG parsing É -PASS XHTML1.1+MathML+SVG parsing é -PASS XHTML1.1+MathML+SVG parsing ⩮ -PASS XHTML1.1+MathML+SVG parsing Ě -PASS XHTML1.1+MathML+SVG parsing ě -PASS XHTML1.1+MathML+SVG parsing Ê -PASS XHTML1.1+MathML+SVG parsing ê -PASS XHTML1.1+MathML+SVG parsing ≖ -PASS XHTML1.1+MathML+SVG parsing ≕ -PASS XHTML1.1+MathML+SVG parsing Э -PASS XHTML1.1+MathML+SVG parsing э -PASS XHTML1.1+MathML+SVG parsing ⩷ -PASS XHTML1.1+MathML+SVG parsing Ė -PASS XHTML1.1+MathML+SVG parsing ė -PASS XHTML1.1+MathML+SVG parsing ≑ -PASS XHTML1.1+MathML+SVG parsing ⅇ -PASS XHTML1.1+MathML+SVG parsing ≒ -PASS XHTML1.1+MathML+SVG parsing 𝔈 -PASS XHTML1.1+MathML+SVG parsing 𝔢 -PASS XHTML1.1+MathML+SVG parsing ⪚ -PASS XHTML1.1+MathML+SVG parsing È -PASS XHTML1.1+MathML+SVG parsing è -PASS XHTML1.1+MathML+SVG parsing ⪖ -PASS XHTML1.1+MathML+SVG parsing ⪘ -PASS XHTML1.1+MathML+SVG parsing ⪙ -PASS XHTML1.1+MathML+SVG parsing ∈ -PASS XHTML1.1+MathML+SVG parsing ⏧ -PASS XHTML1.1+MathML+SVG parsing ℓ -PASS XHTML1.1+MathML+SVG parsing ⪕ -PASS XHTML1.1+MathML+SVG parsing ⪗ -PASS XHTML1.1+MathML+SVG parsing Ē -PASS XHTML1.1+MathML+SVG parsing ē -PASS XHTML1.1+MathML+SVG parsing ∅ -PASS XHTML1.1+MathML+SVG parsing ∅ -PASS XHTML1.1+MathML+SVG parsing ◻ -PASS XHTML1.1+MathML+SVG parsing ∅ -PASS XHTML1.1+MathML+SVG parsing ▫ -PASS XHTML1.1+MathML+SVG parsing   -PASS XHTML1.1+MathML+SVG parsing   -PASS XHTML1.1+MathML+SVG parsing   -PASS XHTML1.1+MathML+SVG parsing Ŋ -PASS XHTML1.1+MathML+SVG parsing ŋ -PASS XHTML1.1+MathML+SVG parsing   -PASS XHTML1.1+MathML+SVG parsing Ę -PASS XHTML1.1+MathML+SVG parsing ę -PASS XHTML1.1+MathML+SVG parsing 𝔼 -PASS XHTML1.1+MathML+SVG parsing 𝕖 -PASS XHTML1.1+MathML+SVG parsing ⋕ -PASS XHTML1.1+MathML+SVG parsing ⧣ -PASS XHTML1.1+MathML+SVG parsing ⩱ -PASS XHTML1.1+MathML+SVG parsing ε -PASS XHTML1.1+MathML+SVG parsing Ε -PASS XHTML1.1+MathML+SVG parsing ε -PASS XHTML1.1+MathML+SVG parsing ϵ -PASS XHTML1.1+MathML+SVG parsing ≖ -PASS XHTML1.1+MathML+SVG parsing ≕ -PASS XHTML1.1+MathML+SVG parsing ≂ -PASS XHTML1.1+MathML+SVG parsing ⪖ -PASS XHTML1.1+MathML+SVG parsing ⪕ -PASS XHTML1.1+MathML+SVG parsing ⩵ -PASS XHTML1.1+MathML+SVG parsing = -PASS XHTML1.1+MathML+SVG parsing ≂ -PASS XHTML1.1+MathML+SVG parsing ≟ -PASS XHTML1.1+MathML+SVG parsing ⇌ -PASS XHTML1.1+MathML+SVG parsing ≡ -PASS XHTML1.1+MathML+SVG parsing ⩸ -PASS XHTML1.1+MathML+SVG parsing ⧥ -PASS XHTML1.1+MathML+SVG parsing ⥱ -PASS XHTML1.1+MathML+SVG parsing ≓ -PASS XHTML1.1+MathML+SVG parsing ℯ -PASS XHTML1.1+MathML+SVG parsing ℰ -PASS XHTML1.1+MathML+SVG parsing ≐ -PASS XHTML1.1+MathML+SVG parsing ⩳ -PASS XHTML1.1+MathML+SVG parsing ≂ -PASS XHTML1.1+MathML+SVG parsing Η -PASS XHTML1.1+MathML+SVG parsing η -PASS XHTML1.1+MathML+SVG parsing Ð -PASS XHTML1.1+MathML+SVG parsing ð -PASS XHTML1.1+MathML+SVG parsing Ë -PASS XHTML1.1+MathML+SVG parsing ë -PASS XHTML1.1+MathML+SVG parsing € -PASS XHTML1.1+MathML+SVG parsing ! -PASS XHTML1.1+MathML+SVG parsing ∃ -PASS XHTML1.1+MathML+SVG parsing ∃ -PASS XHTML1.1+MathML+SVG parsing ℰ -PASS XHTML1.1+MathML+SVG parsing ⅇ -PASS XHTML1.1+MathML+SVG parsing ⅇ -PASS XHTML1.1+MathML+SVG parsing ≒ -PASS XHTML1.1+MathML+SVG parsing Ф -PASS XHTML1.1+MathML+SVG parsing ф -PASS XHTML1.1+MathML+SVG parsing ♀ -PASS XHTML1.1+MathML+SVG parsing ffi -PASS XHTML1.1+MathML+SVG parsing ff -PASS XHTML1.1+MathML+SVG parsing ffl -PASS XHTML1.1+MathML+SVG parsing 𝔉 -PASS XHTML1.1+MathML+SVG parsing 𝔣 -PASS XHTML1.1+MathML+SVG parsing fi -PASS XHTML1.1+MathML+SVG parsing ◼ -PASS XHTML1.1+MathML+SVG parsing ▪ -PASS XHTML1.1+MathML+SVG parsing fj -PASS XHTML1.1+MathML+SVG parsing ♭ -PASS XHTML1.1+MathML+SVG parsing fl -PASS XHTML1.1+MathML+SVG parsing ▱ -PASS XHTML1.1+MathML+SVG parsing ƒ -PASS XHTML1.1+MathML+SVG parsing 𝔽 -PASS XHTML1.1+MathML+SVG parsing 𝕗 -PASS XHTML1.1+MathML+SVG parsing ∀ -PASS XHTML1.1+MathML+SVG parsing ∀ -PASS XHTML1.1+MathML+SVG parsing ⋔ -PASS XHTML1.1+MathML+SVG parsing ⫙ -PASS XHTML1.1+MathML+SVG parsing ℱ -PASS XHTML1.1+MathML+SVG parsing ⨍ -PASS XHTML1.1+MathML+SVG parsing ½ -PASS XHTML1.1+MathML+SVG parsing ⅓ -PASS XHTML1.1+MathML+SVG parsing ¼ -PASS XHTML1.1+MathML+SVG parsing ⅕ -PASS XHTML1.1+MathML+SVG parsing ⅙ -PASS XHTML1.1+MathML+SVG parsing ⅛ -PASS XHTML1.1+MathML+SVG parsing ⅔ -PASS XHTML1.1+MathML+SVG parsing ⅖ -PASS XHTML1.1+MathML+SVG parsing ¾ -PASS XHTML1.1+MathML+SVG parsing ⅗ -PASS XHTML1.1+MathML+SVG parsing ⅜ -PASS XHTML1.1+MathML+SVG parsing ⅘ -PASS XHTML1.1+MathML+SVG parsing ⅚ -PASS XHTML1.1+MathML+SVG parsing ⅝ -PASS XHTML1.1+MathML+SVG parsing ⅞ -PASS XHTML1.1+MathML+SVG parsing ⁄ -PASS XHTML1.1+MathML+SVG parsing ⌢ -PASS XHTML1.1+MathML+SVG parsing 𝒻 -PASS XHTML1.1+MathML+SVG parsing ℱ -PASS XHTML1.1+MathML+SVG parsing ǵ -PASS XHTML1.1+MathML+SVG parsing Γ -PASS XHTML1.1+MathML+SVG parsing γ -PASS XHTML1.1+MathML+SVG parsing Ϝ -PASS XHTML1.1+MathML+SVG parsing ϝ -PASS XHTML1.1+MathML+SVG parsing ⪆ -PASS XHTML1.1+MathML+SVG parsing Ğ -PASS XHTML1.1+MathML+SVG parsing ğ -PASS XHTML1.1+MathML+SVG parsing Ģ -PASS XHTML1.1+MathML+SVG parsing Ĝ -PASS XHTML1.1+MathML+SVG parsing ĝ -PASS XHTML1.1+MathML+SVG parsing Г -PASS XHTML1.1+MathML+SVG parsing г -PASS XHTML1.1+MathML+SVG parsing Ġ -PASS XHTML1.1+MathML+SVG parsing ġ -PASS XHTML1.1+MathML+SVG parsing ≥ -PASS XHTML1.1+MathML+SVG parsing ≧ -PASS XHTML1.1+MathML+SVG parsing ⪌ -PASS XHTML1.1+MathML+SVG parsing ⋛ -PASS XHTML1.1+MathML+SVG parsing ≥ -PASS XHTML1.1+MathML+SVG parsing ≧ -PASS XHTML1.1+MathML+SVG parsing ⩾ -PASS XHTML1.1+MathML+SVG parsing ⪩ -PASS XHTML1.1+MathML+SVG parsing ⩾ -PASS XHTML1.1+MathML+SVG parsing ⪀ -PASS XHTML1.1+MathML+SVG parsing ⪂ -PASS XHTML1.1+MathML+SVG parsing ⪄ -PASS XHTML1.1+MathML+SVG parsing ⋛︀ -PASS XHTML1.1+MathML+SVG parsing ⪔ -PASS XHTML1.1+MathML+SVG parsing 𝔊 -PASS XHTML1.1+MathML+SVG parsing 𝔤 -PASS XHTML1.1+MathML+SVG parsing ≫ -PASS XHTML1.1+MathML+SVG parsing ⋙ -PASS XHTML1.1+MathML+SVG parsing ⋙ -PASS XHTML1.1+MathML+SVG parsing ℷ -PASS XHTML1.1+MathML+SVG parsing Ѓ -PASS XHTML1.1+MathML+SVG parsing ѓ -PASS XHTML1.1+MathML+SVG parsing ⪥ -PASS XHTML1.1+MathML+SVG parsing ≷ -PASS XHTML1.1+MathML+SVG parsing ⪒ -PASS XHTML1.1+MathML+SVG parsing ⪤ -PASS XHTML1.1+MathML+SVG parsing ⪊ -PASS XHTML1.1+MathML+SVG parsing ⪊ -PASS XHTML1.1+MathML+SVG parsing ⪈ -PASS XHTML1.1+MathML+SVG parsing ≩ -PASS XHTML1.1+MathML+SVG parsing ⪈ -PASS XHTML1.1+MathML+SVG parsing ≩ -PASS XHTML1.1+MathML+SVG parsing ⋧ -PASS XHTML1.1+MathML+SVG parsing 𝔾 -PASS XHTML1.1+MathML+SVG parsing 𝕘 -PASS XHTML1.1+MathML+SVG parsing ` -PASS XHTML1.1+MathML+SVG parsing ≥ -PASS XHTML1.1+MathML+SVG parsing ⋛ -PASS XHTML1.1+MathML+SVG parsing ≧ -PASS XHTML1.1+MathML+SVG parsing ⪢ -PASS XHTML1.1+MathML+SVG parsing ≷ -PASS XHTML1.1+MathML+SVG parsing ⩾ -PASS XHTML1.1+MathML+SVG parsing ≳ -PASS XHTML1.1+MathML+SVG parsing 𝒢 -PASS XHTML1.1+MathML+SVG parsing ℊ -PASS XHTML1.1+MathML+SVG parsing ≳ -PASS XHTML1.1+MathML+SVG parsing ⪎ -PASS XHTML1.1+MathML+SVG parsing ⪐ -PASS XHTML1.1+MathML+SVG parsing ⪧ -PASS XHTML1.1+MathML+SVG parsing ⩺ -PASS XHTML1.1+MathML+SVG parsing > -PASS XHTML1.1+MathML+SVG parsing > -PASS XHTML1.1+MathML+SVG parsing ≫ -PASS XHTML1.1+MathML+SVG parsing ⋗ -PASS XHTML1.1+MathML+SVG parsing ⦕ -PASS XHTML1.1+MathML+SVG parsing ⩼ -PASS XHTML1.1+MathML+SVG parsing ⪆ -PASS XHTML1.1+MathML+SVG parsing ⥸ -PASS XHTML1.1+MathML+SVG parsing ⋗ -PASS XHTML1.1+MathML+SVG parsing ⋛ -PASS XHTML1.1+MathML+SVG parsing ⪌ -PASS XHTML1.1+MathML+SVG parsing ≷ -PASS XHTML1.1+MathML+SVG parsing ≳ -PASS XHTML1.1+MathML+SVG parsing ≩︀ -PASS XHTML1.1+MathML+SVG parsing ≩︀ -PASS XHTML1.1+MathML+SVG parsing ˇ -PASS XHTML1.1+MathML+SVG parsing   -PASS XHTML1.1+MathML+SVG parsing ½ -PASS XHTML1.1+MathML+SVG parsing ℋ -PASS XHTML1.1+MathML+SVG parsing Ъ -PASS XHTML1.1+MathML+SVG parsing ъ -PASS XHTML1.1+MathML+SVG parsing ⥈ -PASS XHTML1.1+MathML+SVG parsing ↔ -PASS XHTML1.1+MathML+SVG parsing ⇔ -PASS XHTML1.1+MathML+SVG parsing ↭ -PASS XHTML1.1+MathML+SVG parsing ^ -PASS XHTML1.1+MathML+SVG parsing ℏ -PASS XHTML1.1+MathML+SVG parsing Ĥ -PASS XHTML1.1+MathML+SVG parsing ĥ -PASS XHTML1.1+MathML+SVG parsing ♥ -PASS XHTML1.1+MathML+SVG parsing ♥ -PASS XHTML1.1+MathML+SVG parsing … -PASS XHTML1.1+MathML+SVG parsing ⊹ -PASS XHTML1.1+MathML+SVG parsing 𝔥 -PASS XHTML1.1+MathML+SVG parsing ℌ -PASS XHTML1.1+MathML+SVG parsing ℋ -PASS XHTML1.1+MathML+SVG parsing ⤥ -PASS XHTML1.1+MathML+SVG parsing ⤦ -PASS XHTML1.1+MathML+SVG parsing ⇿ -PASS XHTML1.1+MathML+SVG parsing ∻ -PASS XHTML1.1+MathML+SVG parsing ↩ -PASS XHTML1.1+MathML+SVG parsing ↪ -PASS XHTML1.1+MathML+SVG parsing 𝕙 -PASS XHTML1.1+MathML+SVG parsing ℍ -PASS XHTML1.1+MathML+SVG parsing ― -PASS XHTML1.1+MathML+SVG parsing ─ -PASS XHTML1.1+MathML+SVG parsing 𝒽 -PASS XHTML1.1+MathML+SVG parsing ℋ -PASS XHTML1.1+MathML+SVG parsing ℏ -PASS XHTML1.1+MathML+SVG parsing Ħ -PASS XHTML1.1+MathML+SVG parsing ħ -PASS XHTML1.1+MathML+SVG parsing ≎ -PASS XHTML1.1+MathML+SVG parsing ≏ -PASS XHTML1.1+MathML+SVG parsing ⁃ -PASS XHTML1.1+MathML+SVG parsing ‐ -PASS XHTML1.1+MathML+SVG parsing Í -PASS XHTML1.1+MathML+SVG parsing í -PASS XHTML1.1+MathML+SVG parsing ⁣ -PASS XHTML1.1+MathML+SVG parsing Î -PASS XHTML1.1+MathML+SVG parsing î -PASS XHTML1.1+MathML+SVG parsing И -PASS XHTML1.1+MathML+SVG parsing и -PASS XHTML1.1+MathML+SVG parsing İ -PASS XHTML1.1+MathML+SVG parsing Е -PASS XHTML1.1+MathML+SVG parsing е -PASS XHTML1.1+MathML+SVG parsing ¡ -PASS XHTML1.1+MathML+SVG parsing ⇔ -PASS XHTML1.1+MathML+SVG parsing 𝔦 -PASS XHTML1.1+MathML+SVG parsing ℑ -PASS XHTML1.1+MathML+SVG parsing Ì -PASS XHTML1.1+MathML+SVG parsing ì -PASS XHTML1.1+MathML+SVG parsing ⅈ -PASS XHTML1.1+MathML+SVG parsing ⨌ -PASS XHTML1.1+MathML+SVG parsing ∭ -PASS XHTML1.1+MathML+SVG parsing ⧜ -PASS XHTML1.1+MathML+SVG parsing ℩ -PASS XHTML1.1+MathML+SVG parsing IJ -PASS XHTML1.1+MathML+SVG parsing ij -PASS XHTML1.1+MathML+SVG parsing Ī -PASS XHTML1.1+MathML+SVG parsing ī -PASS XHTML1.1+MathML+SVG parsing ℑ -PASS XHTML1.1+MathML+SVG parsing ⅈ -PASS XHTML1.1+MathML+SVG parsing ℐ -PASS XHTML1.1+MathML+SVG parsing ℑ -PASS XHTML1.1+MathML+SVG parsing ı -PASS XHTML1.1+MathML+SVG parsing ℑ -PASS XHTML1.1+MathML+SVG parsing ⊷ -PASS XHTML1.1+MathML+SVG parsing Ƶ -PASS XHTML1.1+MathML+SVG parsing ⇒ -PASS XHTML1.1+MathML+SVG parsing ℅ -PASS XHTML1.1+MathML+SVG parsing ∈ -PASS XHTML1.1+MathML+SVG parsing ∞ -PASS XHTML1.1+MathML+SVG parsing ⧝ -PASS XHTML1.1+MathML+SVG parsing ı -PASS XHTML1.1+MathML+SVG parsing ⊺ -PASS XHTML1.1+MathML+SVG parsing ∫ -PASS XHTML1.1+MathML+SVG parsing ∬ -PASS XHTML1.1+MathML+SVG parsing ℤ -PASS XHTML1.1+MathML+SVG parsing ∫ -PASS XHTML1.1+MathML+SVG parsing ⊺ -PASS XHTML1.1+MathML+SVG parsing ⋂ -PASS XHTML1.1+MathML+SVG parsing ⨗ -PASS XHTML1.1+MathML+SVG parsing ⨼ -PASS XHTML1.1+MathML+SVG parsing ⁣ -PASS XHTML1.1+MathML+SVG parsing ⁢ -PASS XHTML1.1+MathML+SVG parsing Ё -PASS XHTML1.1+MathML+SVG parsing ё -PASS XHTML1.1+MathML+SVG parsing Į -PASS XHTML1.1+MathML+SVG parsing į -PASS XHTML1.1+MathML+SVG parsing 𝕀 -PASS XHTML1.1+MathML+SVG parsing 𝕚 -PASS XHTML1.1+MathML+SVG parsing Ι -PASS XHTML1.1+MathML+SVG parsing ι -PASS XHTML1.1+MathML+SVG parsing ⨼ -PASS XHTML1.1+MathML+SVG parsing ¿ -PASS XHTML1.1+MathML+SVG parsing 𝒾 -PASS XHTML1.1+MathML+SVG parsing ℐ -PASS XHTML1.1+MathML+SVG parsing ∈ -PASS XHTML1.1+MathML+SVG parsing ⋵ -PASS XHTML1.1+MathML+SVG parsing ⋹ -PASS XHTML1.1+MathML+SVG parsing ⋴ -PASS XHTML1.1+MathML+SVG parsing ⋳ -PASS XHTML1.1+MathML+SVG parsing ∈ -PASS XHTML1.1+MathML+SVG parsing ⁢ -PASS XHTML1.1+MathML+SVG parsing Ĩ -PASS XHTML1.1+MathML+SVG parsing ĩ -PASS XHTML1.1+MathML+SVG parsing І -PASS XHTML1.1+MathML+SVG parsing і -PASS XHTML1.1+MathML+SVG parsing Ï -PASS XHTML1.1+MathML+SVG parsing ï -PASS XHTML1.1+MathML+SVG parsing Ĵ -PASS XHTML1.1+MathML+SVG parsing ĵ -PASS XHTML1.1+MathML+SVG parsing Й -PASS XHTML1.1+MathML+SVG parsing й -PASS XHTML1.1+MathML+SVG parsing 𝔍 -PASS XHTML1.1+MathML+SVG parsing 𝔧 -PASS XHTML1.1+MathML+SVG parsing ȷ -PASS XHTML1.1+MathML+SVG parsing 𝕁 -PASS XHTML1.1+MathML+SVG parsing 𝕛 -PASS XHTML1.1+MathML+SVG parsing 𝒥 -PASS XHTML1.1+MathML+SVG parsing 𝒿 -PASS XHTML1.1+MathML+SVG parsing Ј -PASS XHTML1.1+MathML+SVG parsing ј -PASS XHTML1.1+MathML+SVG parsing Є -PASS XHTML1.1+MathML+SVG parsing є -PASS XHTML1.1+MathML+SVG parsing Κ -PASS XHTML1.1+MathML+SVG parsing κ -PASS XHTML1.1+MathML+SVG parsing ϰ -PASS XHTML1.1+MathML+SVG parsing Ķ -PASS XHTML1.1+MathML+SVG parsing ķ -PASS XHTML1.1+MathML+SVG parsing К -PASS XHTML1.1+MathML+SVG parsing к -PASS XHTML1.1+MathML+SVG parsing 𝔎 -PASS XHTML1.1+MathML+SVG parsing 𝔨 -PASS XHTML1.1+MathML+SVG parsing ĸ -PASS XHTML1.1+MathML+SVG parsing Х -PASS XHTML1.1+MathML+SVG parsing х -PASS XHTML1.1+MathML+SVG parsing Ќ -PASS XHTML1.1+MathML+SVG parsing ќ -PASS XHTML1.1+MathML+SVG parsing 𝕂 -PASS XHTML1.1+MathML+SVG parsing 𝕜 -PASS XHTML1.1+MathML+SVG parsing 𝒦 -PASS XHTML1.1+MathML+SVG parsing 𝓀 -PASS XHTML1.1+MathML+SVG parsing ⇚ -PASS XHTML1.1+MathML+SVG parsing Ĺ -PASS XHTML1.1+MathML+SVG parsing ĺ -PASS XHTML1.1+MathML+SVG parsing ⦴ -PASS XHTML1.1+MathML+SVG parsing ℒ -PASS XHTML1.1+MathML+SVG parsing Λ -PASS XHTML1.1+MathML+SVG parsing λ -PASS XHTML1.1+MathML+SVG parsing ⟨ -PASS XHTML1.1+MathML+SVG parsing ⟪ -PASS XHTML1.1+MathML+SVG parsing ⦑ -PASS XHTML1.1+MathML+SVG parsing ⟨ -PASS XHTML1.1+MathML+SVG parsing ⪅ -PASS XHTML1.1+MathML+SVG parsing ℒ -PASS XHTML1.1+MathML+SVG parsing « -PASS XHTML1.1+MathML+SVG parsing ⇤ -PASS XHTML1.1+MathML+SVG parsing ⤟ -PASS XHTML1.1+MathML+SVG parsing ← -PASS XHTML1.1+MathML+SVG parsing ↞ -PASS XHTML1.1+MathML+SVG parsing ⇐ -PASS XHTML1.1+MathML+SVG parsing ⤝ -PASS XHTML1.1+MathML+SVG parsing ↩ -PASS XHTML1.1+MathML+SVG parsing ↫ -PASS XHTML1.1+MathML+SVG parsing ⤹ -PASS XHTML1.1+MathML+SVG parsing ⥳ -PASS XHTML1.1+MathML+SVG parsing ↢ -PASS XHTML1.1+MathML+SVG parsing ⤙ -PASS XHTML1.1+MathML+SVG parsing ⤛ -PASS XHTML1.1+MathML+SVG parsing ⪫ -PASS XHTML1.1+MathML+SVG parsing ⪭ -PASS XHTML1.1+MathML+SVG parsing ⪭︀ -PASS XHTML1.1+MathML+SVG parsing ⤌ -PASS XHTML1.1+MathML+SVG parsing ⤎ -PASS XHTML1.1+MathML+SVG parsing ❲ -PASS XHTML1.1+MathML+SVG parsing { -PASS XHTML1.1+MathML+SVG parsing [ -PASS XHTML1.1+MathML+SVG parsing ⦋ -PASS XHTML1.1+MathML+SVG parsing ⦏ -PASS XHTML1.1+MathML+SVG parsing ⦍ -PASS XHTML1.1+MathML+SVG parsing Ľ -PASS XHTML1.1+MathML+SVG parsing ľ -PASS XHTML1.1+MathML+SVG parsing Ļ -PASS XHTML1.1+MathML+SVG parsing ļ -PASS XHTML1.1+MathML+SVG parsing ⌈ -PASS XHTML1.1+MathML+SVG parsing { -PASS XHTML1.1+MathML+SVG parsing Л -PASS XHTML1.1+MathML+SVG parsing л -PASS XHTML1.1+MathML+SVG parsing ⤶ -PASS XHTML1.1+MathML+SVG parsing “ -PASS XHTML1.1+MathML+SVG parsing „ -PASS XHTML1.1+MathML+SVG parsing ⥧ -PASS XHTML1.1+MathML+SVG parsing ⥋ -PASS XHTML1.1+MathML+SVG parsing ↲ -PASS XHTML1.1+MathML+SVG parsing ≤ -PASS XHTML1.1+MathML+SVG parsing ≦ -PASS XHTML1.1+MathML+SVG parsing ⟨ -PASS XHTML1.1+MathML+SVG parsing ⇤ -PASS XHTML1.1+MathML+SVG parsing ← -PASS XHTML1.1+MathML+SVG parsing ← -PASS XHTML1.1+MathML+SVG parsing ⇐ -PASS XHTML1.1+MathML+SVG parsing ⇆ -PASS XHTML1.1+MathML+SVG parsing ↢ -PASS XHTML1.1+MathML+SVG parsing ⌈ -PASS XHTML1.1+MathML+SVG parsing ⟦ -PASS XHTML1.1+MathML+SVG parsing ⥡ -PASS XHTML1.1+MathML+SVG parsing ⥙ -PASS XHTML1.1+MathML+SVG parsing ⇃ -PASS XHTML1.1+MathML+SVG parsing ⌊ -PASS XHTML1.1+MathML+SVG parsing ↽ -PASS XHTML1.1+MathML+SVG parsing ↼ -PASS XHTML1.1+MathML+SVG parsing ⇇ -PASS XHTML1.1+MathML+SVG parsing ↔ -PASS XHTML1.1+MathML+SVG parsing ↔ -PASS XHTML1.1+MathML+SVG parsing ⇔ -PASS XHTML1.1+MathML+SVG parsing ⇆ -PASS XHTML1.1+MathML+SVG parsing ⇋ -PASS XHTML1.1+MathML+SVG parsing ↭ -PASS XHTML1.1+MathML+SVG parsing ⥎ -PASS XHTML1.1+MathML+SVG parsing ↤ -PASS XHTML1.1+MathML+SVG parsing ⊣ -PASS XHTML1.1+MathML+SVG parsing ⥚ -PASS XHTML1.1+MathML+SVG parsing ⋋ -PASS XHTML1.1+MathML+SVG parsing ⧏ -PASS XHTML1.1+MathML+SVG parsing ⊲ -PASS XHTML1.1+MathML+SVG parsing ⊴ -PASS XHTML1.1+MathML+SVG parsing ⥑ -PASS XHTML1.1+MathML+SVG parsing ⥠ -PASS XHTML1.1+MathML+SVG parsing ⥘ -PASS XHTML1.1+MathML+SVG parsing ↿ -PASS XHTML1.1+MathML+SVG parsing ⥒ -PASS XHTML1.1+MathML+SVG parsing ↼ -PASS XHTML1.1+MathML+SVG parsing ⪋ -PASS XHTML1.1+MathML+SVG parsing ⋚ -PASS XHTML1.1+MathML+SVG parsing ≤ -PASS XHTML1.1+MathML+SVG parsing ≦ -PASS XHTML1.1+MathML+SVG parsing ⩽ -PASS XHTML1.1+MathML+SVG parsing ⪨ -PASS XHTML1.1+MathML+SVG parsing ⩽ -PASS XHTML1.1+MathML+SVG parsing ⩿ -PASS XHTML1.1+MathML+SVG parsing ⪁ -PASS XHTML1.1+MathML+SVG parsing ⪃ -PASS XHTML1.1+MathML+SVG parsing ⋚︀ -PASS XHTML1.1+MathML+SVG parsing ⪓ -PASS XHTML1.1+MathML+SVG parsing ⪅ -PASS XHTML1.1+MathML+SVG parsing ⋖ -PASS XHTML1.1+MathML+SVG parsing ⋚ -PASS XHTML1.1+MathML+SVG parsing ⪋ -PASS XHTML1.1+MathML+SVG parsing ⋚ -PASS XHTML1.1+MathML+SVG parsing ≦ -PASS XHTML1.1+MathML+SVG parsing ≶ -PASS XHTML1.1+MathML+SVG parsing ≶ -PASS XHTML1.1+MathML+SVG parsing ⪡ -PASS XHTML1.1+MathML+SVG parsing ≲ -PASS XHTML1.1+MathML+SVG parsing ⩽ -PASS XHTML1.1+MathML+SVG parsing ≲ -PASS XHTML1.1+MathML+SVG parsing ⥼ -PASS XHTML1.1+MathML+SVG parsing ⌊ -PASS XHTML1.1+MathML+SVG parsing 𝔏 -PASS XHTML1.1+MathML+SVG parsing 𝔩 -PASS XHTML1.1+MathML+SVG parsing ≶ -PASS XHTML1.1+MathML+SVG parsing ⪑ -PASS XHTML1.1+MathML+SVG parsing ⥢ -PASS XHTML1.1+MathML+SVG parsing ↽ -PASS XHTML1.1+MathML+SVG parsing ↼ -PASS XHTML1.1+MathML+SVG parsing ⥪ -PASS XHTML1.1+MathML+SVG parsing ▄ -PASS XHTML1.1+MathML+SVG parsing Љ -PASS XHTML1.1+MathML+SVG parsing љ -PASS XHTML1.1+MathML+SVG parsing ⇇ -PASS XHTML1.1+MathML+SVG parsing ≪ -PASS XHTML1.1+MathML+SVG parsing ⋘ -PASS XHTML1.1+MathML+SVG parsing ⌞ -PASS XHTML1.1+MathML+SVG parsing ⇚ -PASS XHTML1.1+MathML+SVG parsing ⥫ -PASS XHTML1.1+MathML+SVG parsing ◺ -PASS XHTML1.1+MathML+SVG parsing Ŀ -PASS XHTML1.1+MathML+SVG parsing ŀ -PASS XHTML1.1+MathML+SVG parsing ⎰ -PASS XHTML1.1+MathML+SVG parsing ⎰ -PASS XHTML1.1+MathML+SVG parsing ⪉ -PASS XHTML1.1+MathML+SVG parsing ⪉ -PASS XHTML1.1+MathML+SVG parsing ⪇ -PASS XHTML1.1+MathML+SVG parsing ≨ -PASS XHTML1.1+MathML+SVG parsing ⪇ -PASS XHTML1.1+MathML+SVG parsing ≨ -PASS XHTML1.1+MathML+SVG parsing ⋦ -PASS XHTML1.1+MathML+SVG parsing ⟬ -PASS XHTML1.1+MathML+SVG parsing ⇽ -PASS XHTML1.1+MathML+SVG parsing ⟦ -PASS XHTML1.1+MathML+SVG parsing ⟵ -PASS XHTML1.1+MathML+SVG parsing ⟵ -PASS XHTML1.1+MathML+SVG parsing ⟸ -PASS XHTML1.1+MathML+SVG parsing ⟷ -PASS XHTML1.1+MathML+SVG parsing ⟷ -PASS XHTML1.1+MathML+SVG parsing ⟺ -PASS XHTML1.1+MathML+SVG parsing ⟼ -PASS XHTML1.1+MathML+SVG parsing ⟶ -PASS XHTML1.1+MathML+SVG parsing ⟶ -PASS XHTML1.1+MathML+SVG parsing ⟹ -PASS XHTML1.1+MathML+SVG parsing ↫ -PASS XHTML1.1+MathML+SVG parsing ↬ -PASS XHTML1.1+MathML+SVG parsing ⦅ -PASS XHTML1.1+MathML+SVG parsing 𝕃 -PASS XHTML1.1+MathML+SVG parsing 𝕝 -PASS XHTML1.1+MathML+SVG parsing ⨭ -PASS XHTML1.1+MathML+SVG parsing ⨴ -PASS XHTML1.1+MathML+SVG parsing ∗ -PASS XHTML1.1+MathML+SVG parsing _ -PASS XHTML1.1+MathML+SVG parsing ↙ -PASS XHTML1.1+MathML+SVG parsing ↘ -PASS XHTML1.1+MathML+SVG parsing ◊ -PASS XHTML1.1+MathML+SVG parsing ◊ -PASS XHTML1.1+MathML+SVG parsing ⧫ -PASS XHTML1.1+MathML+SVG parsing ( -PASS XHTML1.1+MathML+SVG parsing ⦓ -PASS XHTML1.1+MathML+SVG parsing ⇆ -PASS XHTML1.1+MathML+SVG parsing ⌟ -PASS XHTML1.1+MathML+SVG parsing ⇋ -PASS XHTML1.1+MathML+SVG parsing ⥭ -PASS XHTML1.1+MathML+SVG parsing ‎ -PASS XHTML1.1+MathML+SVG parsing ⊿ -PASS XHTML1.1+MathML+SVG parsing ‹ -PASS XHTML1.1+MathML+SVG parsing 𝓁 -PASS XHTML1.1+MathML+SVG parsing ℒ -PASS XHTML1.1+MathML+SVG parsing ↰ -PASS XHTML1.1+MathML+SVG parsing ↰ -PASS XHTML1.1+MathML+SVG parsing ≲ -PASS XHTML1.1+MathML+SVG parsing ⪍ -PASS XHTML1.1+MathML+SVG parsing ⪏ -PASS XHTML1.1+MathML+SVG parsing [ -PASS XHTML1.1+MathML+SVG parsing ‘ -PASS XHTML1.1+MathML+SVG parsing ‚ -PASS XHTML1.1+MathML+SVG parsing Ł -PASS XHTML1.1+MathML+SVG parsing ł -PASS XHTML1.1+MathML+SVG parsing ⪦ -PASS XHTML1.1+MathML+SVG parsing ⩹ -PASS XHTML1.1+MathML+SVG parsing < -FAIL XHTML1.1+MathML+SVG parsing < assert_true: expected true got false -PASS XHTML1.1+MathML+SVG parsing ≪ -PASS XHTML1.1+MathML+SVG parsing ⋖ -PASS XHTML1.1+MathML+SVG parsing ⋋ -PASS XHTML1.1+MathML+SVG parsing ⋉ -PASS XHTML1.1+MathML+SVG parsing ⥶ -PASS XHTML1.1+MathML+SVG parsing ⩻ -PASS XHTML1.1+MathML+SVG parsing ◃ -PASS XHTML1.1+MathML+SVG parsing ⊴ -PASS XHTML1.1+MathML+SVG parsing ◂ -PASS XHTML1.1+MathML+SVG parsing ⦖ -PASS XHTML1.1+MathML+SVG parsing ⥊ -PASS XHTML1.1+MathML+SVG parsing ⥦ -PASS XHTML1.1+MathML+SVG parsing ≨︀ -PASS XHTML1.1+MathML+SVG parsing ≨︀ -PASS XHTML1.1+MathML+SVG parsing ¯ -PASS XHTML1.1+MathML+SVG parsing ♂ -PASS XHTML1.1+MathML+SVG parsing ✠ -PASS XHTML1.1+MathML+SVG parsing ✠ -PASS XHTML1.1+MathML+SVG parsing ⤅ -PASS XHTML1.1+MathML+SVG parsing ↦ -PASS XHTML1.1+MathML+SVG parsing ↦ -PASS XHTML1.1+MathML+SVG parsing ↧ -PASS XHTML1.1+MathML+SVG parsing ↤ -PASS XHTML1.1+MathML+SVG parsing ↥ -PASS XHTML1.1+MathML+SVG parsing ▮ -PASS XHTML1.1+MathML+SVG parsing ⨩ -PASS XHTML1.1+MathML+SVG parsing М -PASS XHTML1.1+MathML+SVG parsing м -PASS XHTML1.1+MathML+SVG parsing — -PASS XHTML1.1+MathML+SVG parsing ∺ -PASS XHTML1.1+MathML+SVG parsing ∡ -PASS XHTML1.1+MathML+SVG parsing   -PASS XHTML1.1+MathML+SVG parsing ℳ -PASS XHTML1.1+MathML+SVG parsing 𝔐 -PASS XHTML1.1+MathML+SVG parsing 𝔪 -PASS XHTML1.1+MathML+SVG parsing ℧ -PASS XHTML1.1+MathML+SVG parsing µ -PASS XHTML1.1+MathML+SVG parsing * -PASS XHTML1.1+MathML+SVG parsing ⫰ -PASS XHTML1.1+MathML+SVG parsing ∣ -PASS XHTML1.1+MathML+SVG parsing · -PASS XHTML1.1+MathML+SVG parsing ⊟ -PASS XHTML1.1+MathML+SVG parsing − -PASS XHTML1.1+MathML+SVG parsing ∸ -PASS XHTML1.1+MathML+SVG parsing ⨪ -PASS XHTML1.1+MathML+SVG parsing ∓ -PASS XHTML1.1+MathML+SVG parsing ⫛ -PASS XHTML1.1+MathML+SVG parsing … -PASS XHTML1.1+MathML+SVG parsing ∓ -PASS XHTML1.1+MathML+SVG parsing ⊧ -PASS XHTML1.1+MathML+SVG parsing 𝕄 -PASS XHTML1.1+MathML+SVG parsing 𝕞 -PASS XHTML1.1+MathML+SVG parsing ∓ -PASS XHTML1.1+MathML+SVG parsing 𝓂 -PASS XHTML1.1+MathML+SVG parsing ℳ -PASS XHTML1.1+MathML+SVG parsing ∾ -PASS XHTML1.1+MathML+SVG parsing Μ -PASS XHTML1.1+MathML+SVG parsing μ -PASS XHTML1.1+MathML+SVG parsing ⊸ -PASS XHTML1.1+MathML+SVG parsing ⊸ -PASS XHTML1.1+MathML+SVG parsing ∇ -PASS XHTML1.1+MathML+SVG parsing Ń -PASS XHTML1.1+MathML+SVG parsing ń -PASS XHTML1.1+MathML+SVG parsing ∠⃒ -PASS XHTML1.1+MathML+SVG parsing ≉ -PASS XHTML1.1+MathML+SVG parsing ⩰̸ -PASS XHTML1.1+MathML+SVG parsing ≋̸ -PASS XHTML1.1+MathML+SVG parsing ʼn -PASS XHTML1.1+MathML+SVG parsing ≉ -PASS XHTML1.1+MathML+SVG parsing ♮ -PASS XHTML1.1+MathML+SVG parsing ℕ -PASS XHTML1.1+MathML+SVG parsing ♮ -PASS XHTML1.1+MathML+SVG parsing -PASS XHTML1.1+MathML+SVG parsing ≎̸ -PASS XHTML1.1+MathML+SVG parsing ≏̸ -PASS XHTML1.1+MathML+SVG parsing ⩃ -PASS XHTML1.1+MathML+SVG parsing Ň -PASS XHTML1.1+MathML+SVG parsing ň -PASS XHTML1.1+MathML+SVG parsing Ņ -PASS XHTML1.1+MathML+SVG parsing ņ -PASS XHTML1.1+MathML+SVG parsing ≇ -PASS XHTML1.1+MathML+SVG parsing ⩭̸ -PASS XHTML1.1+MathML+SVG parsing ⩂ -PASS XHTML1.1+MathML+SVG parsing Н -PASS XHTML1.1+MathML+SVG parsing н -PASS XHTML1.1+MathML+SVG parsing – -PASS XHTML1.1+MathML+SVG parsing ⤤ -PASS XHTML1.1+MathML+SVG parsing ↗ -PASS XHTML1.1+MathML+SVG parsing ⇗ -PASS XHTML1.1+MathML+SVG parsing ↗ -PASS XHTML1.1+MathML+SVG parsing ≠ -PASS XHTML1.1+MathML+SVG parsing ≐̸ -PASS XHTML1.1+MathML+SVG parsing ​ -PASS XHTML1.1+MathML+SVG parsing ​ -PASS XHTML1.1+MathML+SVG parsing ​ -PASS XHTML1.1+MathML+SVG parsing ​ -PASS XHTML1.1+MathML+SVG parsing ≢ -PASS XHTML1.1+MathML+SVG parsing ⤨ -PASS XHTML1.1+MathML+SVG parsing ≂̸ -PASS XHTML1.1+MathML+SVG parsing ≫ -PASS XHTML1.1+MathML+SVG parsing ≪ -PASS XHTML1.1+MathML+SVG parsing 
 -PASS XHTML1.1+MathML+SVG parsing ∄ -PASS XHTML1.1+MathML+SVG parsing ∄ -PASS XHTML1.1+MathML+SVG parsing 𝔑 -PASS XHTML1.1+MathML+SVG parsing 𝔫 -PASS XHTML1.1+MathML+SVG parsing ≧̸ -PASS XHTML1.1+MathML+SVG parsing ≱ -PASS XHTML1.1+MathML+SVG parsing ≱ -PASS XHTML1.1+MathML+SVG parsing ≧̸ -PASS XHTML1.1+MathML+SVG parsing ⩾̸ -PASS XHTML1.1+MathML+SVG parsing ⩾̸ -PASS XHTML1.1+MathML+SVG parsing ⋙̸ -PASS XHTML1.1+MathML+SVG parsing ≵ -PASS XHTML1.1+MathML+SVG parsing ≫⃒ -PASS XHTML1.1+MathML+SVG parsing ≯ -PASS XHTML1.1+MathML+SVG parsing ≯ -PASS XHTML1.1+MathML+SVG parsing ≫̸ -PASS XHTML1.1+MathML+SVG parsing ↮ -PASS XHTML1.1+MathML+SVG parsing ⇎ -PASS XHTML1.1+MathML+SVG parsing ⫲ -PASS XHTML1.1+MathML+SVG parsing ∋ -PASS XHTML1.1+MathML+SVG parsing ⋼ -PASS XHTML1.1+MathML+SVG parsing ⋺ -PASS XHTML1.1+MathML+SVG parsing ∋ -PASS XHTML1.1+MathML+SVG parsing Њ -PASS XHTML1.1+MathML+SVG parsing њ -PASS XHTML1.1+MathML+SVG parsing ↚ -PASS XHTML1.1+MathML+SVG parsing ⇍ -PASS XHTML1.1+MathML+SVG parsing ‥ -PASS XHTML1.1+MathML+SVG parsing ≦̸ -PASS XHTML1.1+MathML+SVG parsing ≰ -PASS XHTML1.1+MathML+SVG parsing ↚ -PASS XHTML1.1+MathML+SVG parsing ⇍ -PASS XHTML1.1+MathML+SVG parsing ↮ -PASS XHTML1.1+MathML+SVG parsing ⇎ -PASS XHTML1.1+MathML+SVG parsing ≰ -PASS XHTML1.1+MathML+SVG parsing ≦̸ -PASS XHTML1.1+MathML+SVG parsing ⩽̸ -PASS XHTML1.1+MathML+SVG parsing ⩽̸ -PASS XHTML1.1+MathML+SVG parsing ≮ -PASS XHTML1.1+MathML+SVG parsing ⋘̸ -PASS XHTML1.1+MathML+SVG parsing ≴ -PASS XHTML1.1+MathML+SVG parsing ≪⃒ -PASS XHTML1.1+MathML+SVG parsing ≮ -PASS XHTML1.1+MathML+SVG parsing ⋪ -PASS XHTML1.1+MathML+SVG parsing ⋬ -PASS XHTML1.1+MathML+SVG parsing ≪̸ -PASS XHTML1.1+MathML+SVG parsing ∤ -PASS XHTML1.1+MathML+SVG parsing ⁠ -PASS XHTML1.1+MathML+SVG parsing   -PASS XHTML1.1+MathML+SVG parsing 𝕟 -PASS XHTML1.1+MathML+SVG parsing ℕ -PASS XHTML1.1+MathML+SVG parsing ⫬ -PASS XHTML1.1+MathML+SVG parsing ¬ -PASS XHTML1.1+MathML+SVG parsing ≢ -PASS XHTML1.1+MathML+SVG parsing ≭ -PASS XHTML1.1+MathML+SVG parsing ∦ -PASS XHTML1.1+MathML+SVG parsing ∉ -PASS XHTML1.1+MathML+SVG parsing ≠ -PASS XHTML1.1+MathML+SVG parsing ≂̸ -PASS XHTML1.1+MathML+SVG parsing ∄ -PASS XHTML1.1+MathML+SVG parsing ≯ -PASS XHTML1.1+MathML+SVG parsing ≱ -PASS XHTML1.1+MathML+SVG parsing ≧̸ -PASS XHTML1.1+MathML+SVG parsing ≫̸ -PASS XHTML1.1+MathML+SVG parsing ≹ -PASS XHTML1.1+MathML+SVG parsing ⩾̸ -PASS XHTML1.1+MathML+SVG parsing ≵ -PASS XHTML1.1+MathML+SVG parsing ≎̸ -PASS XHTML1.1+MathML+SVG parsing ≏̸ -PASS XHTML1.1+MathML+SVG parsing ∉ -PASS XHTML1.1+MathML+SVG parsing ⋵̸ -PASS XHTML1.1+MathML+SVG parsing ⋹̸ -PASS XHTML1.1+MathML+SVG parsing ∉ -PASS XHTML1.1+MathML+SVG parsing ⋷ -PASS XHTML1.1+MathML+SVG parsing ⋶ -PASS XHTML1.1+MathML+SVG parsing ⧏̸ -PASS XHTML1.1+MathML+SVG parsing ⋪ -PASS XHTML1.1+MathML+SVG parsing ⋬ -PASS XHTML1.1+MathML+SVG parsing ≮ -PASS XHTML1.1+MathML+SVG parsing ≰ -PASS XHTML1.1+MathML+SVG parsing ≸ -PASS XHTML1.1+MathML+SVG parsing ≪̸ -PASS XHTML1.1+MathML+SVG parsing ⩽̸ -PASS XHTML1.1+MathML+SVG parsing ≴ -PASS XHTML1.1+MathML+SVG parsing ⪢̸ -PASS XHTML1.1+MathML+SVG parsing ⪡̸ -PASS XHTML1.1+MathML+SVG parsing ∌ -PASS XHTML1.1+MathML+SVG parsing ∌ -PASS XHTML1.1+MathML+SVG parsing ⋾ -PASS XHTML1.1+MathML+SVG parsing ⋽ -PASS XHTML1.1+MathML+SVG parsing ⊀ -PASS XHTML1.1+MathML+SVG parsing ⪯̸ -PASS XHTML1.1+MathML+SVG parsing ⋠ -PASS XHTML1.1+MathML+SVG parsing ∌ -PASS XHTML1.1+MathML+SVG parsing ⧐̸ -PASS XHTML1.1+MathML+SVG parsing ⋫ -PASS XHTML1.1+MathML+SVG parsing ⋭ -PASS XHTML1.1+MathML+SVG parsing ⊏̸ -PASS XHTML1.1+MathML+SVG parsing ⋢ -PASS XHTML1.1+MathML+SVG parsing ⊐̸ -PASS XHTML1.1+MathML+SVG parsing ⋣ -PASS XHTML1.1+MathML+SVG parsing ⊂⃒ -PASS XHTML1.1+MathML+SVG parsing ⊈ -PASS XHTML1.1+MathML+SVG parsing ⊁ -PASS XHTML1.1+MathML+SVG parsing ⪰̸ -PASS XHTML1.1+MathML+SVG parsing ⋡ -PASS XHTML1.1+MathML+SVG parsing ≿̸ -PASS XHTML1.1+MathML+SVG parsing ⊃⃒ -PASS XHTML1.1+MathML+SVG parsing ⊉ -PASS XHTML1.1+MathML+SVG parsing ≁ -PASS XHTML1.1+MathML+SVG parsing ≄ -PASS XHTML1.1+MathML+SVG parsing ≇ -PASS XHTML1.1+MathML+SVG parsing ≉ -PASS XHTML1.1+MathML+SVG parsing ∤ -PASS XHTML1.1+MathML+SVG parsing ∦ -PASS XHTML1.1+MathML+SVG parsing ∦ -PASS XHTML1.1+MathML+SVG parsing ⫽⃥ -PASS XHTML1.1+MathML+SVG parsing ∂̸ -PASS XHTML1.1+MathML+SVG parsing ⨔ -PASS XHTML1.1+MathML+SVG parsing ⊀ -PASS XHTML1.1+MathML+SVG parsing ⋠ -PASS XHTML1.1+MathML+SVG parsing ⊀ -PASS XHTML1.1+MathML+SVG parsing ⪯̸ -PASS XHTML1.1+MathML+SVG parsing ⪯̸ -PASS XHTML1.1+MathML+SVG parsing ⤳̸ -PASS XHTML1.1+MathML+SVG parsing ↛ -PASS XHTML1.1+MathML+SVG parsing ⇏ -PASS XHTML1.1+MathML+SVG parsing ↝̸ -PASS XHTML1.1+MathML+SVG parsing ↛ -PASS XHTML1.1+MathML+SVG parsing ⇏ -PASS XHTML1.1+MathML+SVG parsing ⋫ -PASS XHTML1.1+MathML+SVG parsing ⋭ -PASS XHTML1.1+MathML+SVG parsing ⊁ -PASS XHTML1.1+MathML+SVG parsing ⋡ -PASS XHTML1.1+MathML+SVG parsing ⪰̸ -PASS XHTML1.1+MathML+SVG parsing 𝒩 -PASS XHTML1.1+MathML+SVG parsing 𝓃 -PASS XHTML1.1+MathML+SVG parsing ∤ -PASS XHTML1.1+MathML+SVG parsing ∦ -PASS XHTML1.1+MathML+SVG parsing ≁ -PASS XHTML1.1+MathML+SVG parsing ≄ -PASS XHTML1.1+MathML+SVG parsing ≄ -PASS XHTML1.1+MathML+SVG parsing ∤ -PASS XHTML1.1+MathML+SVG parsing ∦ -PASS XHTML1.1+MathML+SVG parsing ⋢ -PASS XHTML1.1+MathML+SVG parsing ⋣ -PASS XHTML1.1+MathML+SVG parsing ⊄ -PASS XHTML1.1+MathML+SVG parsing ⫅̸ -PASS XHTML1.1+MathML+SVG parsing ⊈ -PASS XHTML1.1+MathML+SVG parsing ⊂⃒ -PASS XHTML1.1+MathML+SVG parsing ⊈ -PASS XHTML1.1+MathML+SVG parsing ⫅̸ -PASS XHTML1.1+MathML+SVG parsing ⊁ -PASS XHTML1.1+MathML+SVG parsing ⪰̸ -PASS XHTML1.1+MathML+SVG parsing ⊅ -PASS XHTML1.1+MathML+SVG parsing ⫆̸ -PASS XHTML1.1+MathML+SVG parsing ⊉ -PASS XHTML1.1+MathML+SVG parsing ⊃⃒ -PASS XHTML1.1+MathML+SVG parsing ⊉ -PASS XHTML1.1+MathML+SVG parsing ⫆̸ -PASS XHTML1.1+MathML+SVG parsing ≹ -PASS XHTML1.1+MathML+SVG parsing Ñ -PASS XHTML1.1+MathML+SVG parsing ñ -PASS XHTML1.1+MathML+SVG parsing ≸ -PASS XHTML1.1+MathML+SVG parsing ⋪ -PASS XHTML1.1+MathML+SVG parsing ⋬ -PASS XHTML1.1+MathML+SVG parsing ⋫ -PASS XHTML1.1+MathML+SVG parsing ⋭ -PASS XHTML1.1+MathML+SVG parsing Ν -PASS XHTML1.1+MathML+SVG parsing ν -PASS XHTML1.1+MathML+SVG parsing # -PASS XHTML1.1+MathML+SVG parsing № -PASS XHTML1.1+MathML+SVG parsing   -PASS XHTML1.1+MathML+SVG parsing ≍⃒ -PASS XHTML1.1+MathML+SVG parsing ⊬ -PASS XHTML1.1+MathML+SVG parsing ⊭ -PASS XHTML1.1+MathML+SVG parsing ⊮ -PASS XHTML1.1+MathML+SVG parsing ⊯ -PASS XHTML1.1+MathML+SVG parsing ≥⃒ -PASS XHTML1.1+MathML+SVG parsing >⃒ -PASS XHTML1.1+MathML+SVG parsing ⤄ -PASS XHTML1.1+MathML+SVG parsing ⧞ -PASS XHTML1.1+MathML+SVG parsing ⤂ -PASS XHTML1.1+MathML+SVG parsing ≤⃒ -FAIL XHTML1.1+MathML+SVG parsing <⃒ assert_equals: XHTML1.1+MathML+SVG parsing the entity reference caused a parse error; expected 3 but got 1 -PASS XHTML1.1+MathML+SVG parsing ⊴⃒ -PASS XHTML1.1+MathML+SVG parsing ⤃ -PASS XHTML1.1+MathML+SVG parsing ⊵⃒ -PASS XHTML1.1+MathML+SVG parsing ∼⃒ -PASS XHTML1.1+MathML+SVG parsing ⤣ -PASS XHTML1.1+MathML+SVG parsing ↖ -PASS XHTML1.1+MathML+SVG parsing ⇖ -PASS XHTML1.1+MathML+SVG parsing ↖ -PASS XHTML1.1+MathML+SVG parsing ⤧ -PASS XHTML1.1+MathML+SVG parsing Ó -PASS XHTML1.1+MathML+SVG parsing ó -PASS XHTML1.1+MathML+SVG parsing ⊛ -PASS XHTML1.1+MathML+SVG parsing Ô -PASS XHTML1.1+MathML+SVG parsing ô -PASS XHTML1.1+MathML+SVG parsing ⊚ -PASS XHTML1.1+MathML+SVG parsing О -PASS XHTML1.1+MathML+SVG parsing о -PASS XHTML1.1+MathML+SVG parsing ⊝ -PASS XHTML1.1+MathML+SVG parsing Ő -PASS XHTML1.1+MathML+SVG parsing ő -PASS XHTML1.1+MathML+SVG parsing ⨸ -PASS XHTML1.1+MathML+SVG parsing ⊙ -PASS XHTML1.1+MathML+SVG parsing ⦼ -PASS XHTML1.1+MathML+SVG parsing Œ -PASS XHTML1.1+MathML+SVG parsing œ -PASS XHTML1.1+MathML+SVG parsing ⦿ -PASS XHTML1.1+MathML+SVG parsing 𝔒 -PASS XHTML1.1+MathML+SVG parsing 𝔬 -PASS XHTML1.1+MathML+SVG parsing ˛ -PASS XHTML1.1+MathML+SVG parsing Ò -PASS XHTML1.1+MathML+SVG parsing ò -PASS XHTML1.1+MathML+SVG parsing ⧁ -PASS XHTML1.1+MathML+SVG parsing ⦵ -PASS XHTML1.1+MathML+SVG parsing Ω -PASS XHTML1.1+MathML+SVG parsing ∮ -PASS XHTML1.1+MathML+SVG parsing ↺ -PASS XHTML1.1+MathML+SVG parsing ⦾ -PASS XHTML1.1+MathML+SVG parsing ⦻ -PASS XHTML1.1+MathML+SVG parsing ‾ -PASS XHTML1.1+MathML+SVG parsing ⧀ -PASS XHTML1.1+MathML+SVG parsing Ō -PASS XHTML1.1+MathML+SVG parsing ō -PASS XHTML1.1+MathML+SVG parsing Ω -PASS XHTML1.1+MathML+SVG parsing ω -PASS XHTML1.1+MathML+SVG parsing Ο -PASS XHTML1.1+MathML+SVG parsing ο -PASS XHTML1.1+MathML+SVG parsing ⦶ -PASS XHTML1.1+MathML+SVG parsing ⊖ -PASS XHTML1.1+MathML+SVG parsing 𝕆 -PASS XHTML1.1+MathML+SVG parsing 𝕠 -PASS XHTML1.1+MathML+SVG parsing ⦷ -PASS XHTML1.1+MathML+SVG parsing “ -PASS XHTML1.1+MathML+SVG parsing ‘ -PASS XHTML1.1+MathML+SVG parsing ⦹ -PASS XHTML1.1+MathML+SVG parsing ⊕ -PASS XHTML1.1+MathML+SVG parsing ↻ -PASS XHTML1.1+MathML+SVG parsing ⩔ -PASS XHTML1.1+MathML+SVG parsing ∨ -PASS XHTML1.1+MathML+SVG parsing ⩝ -PASS XHTML1.1+MathML+SVG parsing ℴ -PASS XHTML1.1+MathML+SVG parsing ℴ -PASS XHTML1.1+MathML+SVG parsing ª -PASS XHTML1.1+MathML+SVG parsing º -PASS XHTML1.1+MathML+SVG parsing ⊶ -PASS XHTML1.1+MathML+SVG parsing ⩖ -PASS XHTML1.1+MathML+SVG parsing ⩗ -PASS XHTML1.1+MathML+SVG parsing ⩛ -PASS XHTML1.1+MathML+SVG parsing Ⓢ -PASS XHTML1.1+MathML+SVG parsing 𝒪 -PASS XHTML1.1+MathML+SVG parsing ℴ -PASS XHTML1.1+MathML+SVG parsing Ø -PASS XHTML1.1+MathML+SVG parsing ø -PASS XHTML1.1+MathML+SVG parsing ⊘ -PASS XHTML1.1+MathML+SVG parsing Õ -PASS XHTML1.1+MathML+SVG parsing õ -PASS XHTML1.1+MathML+SVG parsing ⨶ -PASS XHTML1.1+MathML+SVG parsing ⨷ -PASS XHTML1.1+MathML+SVG parsing ⊗ -PASS XHTML1.1+MathML+SVG parsing Ö -PASS XHTML1.1+MathML+SVG parsing ö -PASS XHTML1.1+MathML+SVG parsing ⌽ -PASS XHTML1.1+MathML+SVG parsing ‾ -PASS XHTML1.1+MathML+SVG parsing ⏞ -PASS XHTML1.1+MathML+SVG parsing ⎴ -PASS XHTML1.1+MathML+SVG parsing ⏜ -PASS XHTML1.1+MathML+SVG parsing ¶ -PASS XHTML1.1+MathML+SVG parsing ∥ -PASS XHTML1.1+MathML+SVG parsing ∥ -PASS XHTML1.1+MathML+SVG parsing ⫳ -PASS XHTML1.1+MathML+SVG parsing ⫽ -PASS XHTML1.1+MathML+SVG parsing ∂ -PASS XHTML1.1+MathML+SVG parsing ∂ -PASS XHTML1.1+MathML+SVG parsing П -PASS XHTML1.1+MathML+SVG parsing п -PASS XHTML1.1+MathML+SVG parsing % -PASS XHTML1.1+MathML+SVG parsing . -PASS XHTML1.1+MathML+SVG parsing ‰ -PASS XHTML1.1+MathML+SVG parsing ⊥ -PASS XHTML1.1+MathML+SVG parsing ‱ -PASS XHTML1.1+MathML+SVG parsing 𝔓 -PASS XHTML1.1+MathML+SVG parsing 𝔭 -PASS XHTML1.1+MathML+SVG parsing Φ -PASS XHTML1.1+MathML+SVG parsing φ -PASS XHTML1.1+MathML+SVG parsing ϕ -PASS XHTML1.1+MathML+SVG parsing ℳ -PASS XHTML1.1+MathML+SVG parsing ☎ -PASS XHTML1.1+MathML+SVG parsing Π -PASS XHTML1.1+MathML+SVG parsing π -PASS XHTML1.1+MathML+SVG parsing ⋔ -PASS XHTML1.1+MathML+SVG parsing ϖ -PASS XHTML1.1+MathML+SVG parsing ℏ -PASS XHTML1.1+MathML+SVG parsing ℎ -PASS XHTML1.1+MathML+SVG parsing ℏ -PASS XHTML1.1+MathML+SVG parsing ⨣ -PASS XHTML1.1+MathML+SVG parsing ⊞ -PASS XHTML1.1+MathML+SVG parsing ⨢ -PASS XHTML1.1+MathML+SVG parsing + -PASS XHTML1.1+MathML+SVG parsing ∔ -PASS XHTML1.1+MathML+SVG parsing ⨥ -PASS XHTML1.1+MathML+SVG parsing ⩲ -PASS XHTML1.1+MathML+SVG parsing ± -PASS XHTML1.1+MathML+SVG parsing ± -PASS XHTML1.1+MathML+SVG parsing ⨦ -PASS XHTML1.1+MathML+SVG parsing ⨧ -PASS XHTML1.1+MathML+SVG parsing ± -PASS XHTML1.1+MathML+SVG parsing ℌ -PASS XHTML1.1+MathML+SVG parsing ⨕ -PASS XHTML1.1+MathML+SVG parsing 𝕡 -PASS XHTML1.1+MathML+SVG parsing ℙ -PASS XHTML1.1+MathML+SVG parsing £ -PASS XHTML1.1+MathML+SVG parsing ⪷ -PASS XHTML1.1+MathML+SVG parsing ⪻ -PASS XHTML1.1+MathML+SVG parsing ≺ -PASS XHTML1.1+MathML+SVG parsing ≼ -PASS XHTML1.1+MathML+SVG parsing ⪷ -PASS XHTML1.1+MathML+SVG parsing ≺ -PASS XHTML1.1+MathML+SVG parsing ≼ -PASS XHTML1.1+MathML+SVG parsing ≺ -PASS XHTML1.1+MathML+SVG parsing ⪯ -PASS XHTML1.1+MathML+SVG parsing ≼ -PASS XHTML1.1+MathML+SVG parsing ≾ -PASS XHTML1.1+MathML+SVG parsing ⪯ -PASS XHTML1.1+MathML+SVG parsing ⪹ -PASS XHTML1.1+MathML+SVG parsing ⪵ -PASS XHTML1.1+MathML+SVG parsing ⋨ -PASS XHTML1.1+MathML+SVG parsing ⪯ -PASS XHTML1.1+MathML+SVG parsing ⪳ -PASS XHTML1.1+MathML+SVG parsing ≾ -PASS XHTML1.1+MathML+SVG parsing ′ -PASS XHTML1.1+MathML+SVG parsing ″ -PASS XHTML1.1+MathML+SVG parsing ℙ -PASS XHTML1.1+MathML+SVG parsing ⪹ -PASS XHTML1.1+MathML+SVG parsing ⪵ -PASS XHTML1.1+MathML+SVG parsing ⋨ -PASS XHTML1.1+MathML+SVG parsing ∏ -PASS XHTML1.1+MathML+SVG parsing ∏ -PASS XHTML1.1+MathML+SVG parsing ⌮ -PASS XHTML1.1+MathML+SVG parsing ⌒ -PASS XHTML1.1+MathML+SVG parsing ⌓ -PASS XHTML1.1+MathML+SVG parsing ∝ -PASS XHTML1.1+MathML+SVG parsing ∝ -PASS XHTML1.1+MathML+SVG parsing ∷ -PASS XHTML1.1+MathML+SVG parsing ∝ -PASS XHTML1.1+MathML+SVG parsing ≾ -PASS XHTML1.1+MathML+SVG parsing ⊰ -PASS XHTML1.1+MathML+SVG parsing 𝒫 -PASS XHTML1.1+MathML+SVG parsing 𝓅 -PASS XHTML1.1+MathML+SVG parsing Ψ -PASS XHTML1.1+MathML+SVG parsing ψ -PASS XHTML1.1+MathML+SVG parsing   -PASS XHTML1.1+MathML+SVG parsing 𝔔 -PASS XHTML1.1+MathML+SVG parsing 𝔮 -PASS XHTML1.1+MathML+SVG parsing ⨌ -PASS XHTML1.1+MathML+SVG parsing 𝕢 -PASS XHTML1.1+MathML+SVG parsing ℚ -PASS XHTML1.1+MathML+SVG parsing ⁗ -PASS XHTML1.1+MathML+SVG parsing 𝒬 -PASS XHTML1.1+MathML+SVG parsing 𝓆 -PASS XHTML1.1+MathML+SVG parsing ℍ -PASS XHTML1.1+MathML+SVG parsing ⨖ -PASS XHTML1.1+MathML+SVG parsing ? -PASS XHTML1.1+MathML+SVG parsing ≟ -PASS XHTML1.1+MathML+SVG parsing " -PASS XHTML1.1+MathML+SVG parsing " -PASS XHTML1.1+MathML+SVG parsing ⇛ -PASS XHTML1.1+MathML+SVG parsing ∽̱ -PASS XHTML1.1+MathML+SVG parsing Ŕ -PASS XHTML1.1+MathML+SVG parsing ŕ -PASS XHTML1.1+MathML+SVG parsing √ -PASS XHTML1.1+MathML+SVG parsing ⦳ -PASS XHTML1.1+MathML+SVG parsing ⟩ -PASS XHTML1.1+MathML+SVG parsing ⟫ -PASS XHTML1.1+MathML+SVG parsing ⦒ -PASS XHTML1.1+MathML+SVG parsing ⦥ -PASS XHTML1.1+MathML+SVG parsing ⟩ -PASS XHTML1.1+MathML+SVG parsing » -PASS XHTML1.1+MathML+SVG parsing ⥵ -PASS XHTML1.1+MathML+SVG parsing ⇥ -PASS XHTML1.1+MathML+SVG parsing ⤠ -PASS XHTML1.1+MathML+SVG parsing ⤳ -PASS XHTML1.1+MathML+SVG parsing → -PASS XHTML1.1+MathML+SVG parsing ↠ -PASS XHTML1.1+MathML+SVG parsing ⇒ -PASS XHTML1.1+MathML+SVG parsing ⤞ -PASS XHTML1.1+MathML+SVG parsing ↪ -PASS XHTML1.1+MathML+SVG parsing ↬ -PASS XHTML1.1+MathML+SVG parsing ⥅ -PASS XHTML1.1+MathML+SVG parsing ⥴ -PASS XHTML1.1+MathML+SVG parsing ⤖ -PASS XHTML1.1+MathML+SVG parsing ↣ -PASS XHTML1.1+MathML+SVG parsing ↝ -PASS XHTML1.1+MathML+SVG parsing ⤚ -PASS XHTML1.1+MathML+SVG parsing ⤜ -PASS XHTML1.1+MathML+SVG parsing ∶ -PASS XHTML1.1+MathML+SVG parsing ℚ -PASS XHTML1.1+MathML+SVG parsing ⤍ -PASS XHTML1.1+MathML+SVG parsing ⤏ -PASS XHTML1.1+MathML+SVG parsing ⤐ -PASS XHTML1.1+MathML+SVG parsing ❳ -PASS XHTML1.1+MathML+SVG parsing } -PASS XHTML1.1+MathML+SVG parsing ] -PASS XHTML1.1+MathML+SVG parsing ⦌ -PASS XHTML1.1+MathML+SVG parsing ⦎ -PASS XHTML1.1+MathML+SVG parsing ⦐ -PASS XHTML1.1+MathML+SVG parsing Ř -PASS XHTML1.1+MathML+SVG parsing ř -PASS XHTML1.1+MathML+SVG parsing Ŗ -PASS XHTML1.1+MathML+SVG parsing ŗ -PASS XHTML1.1+MathML+SVG parsing ⌉ -PASS XHTML1.1+MathML+SVG parsing } -PASS XHTML1.1+MathML+SVG parsing Р -PASS XHTML1.1+MathML+SVG parsing р -PASS XHTML1.1+MathML+SVG parsing ⤷ -PASS XHTML1.1+MathML+SVG parsing ⥩ -PASS XHTML1.1+MathML+SVG parsing ” -PASS XHTML1.1+MathML+SVG parsing ” -PASS XHTML1.1+MathML+SVG parsing ↳ -PASS XHTML1.1+MathML+SVG parsing ℜ -PASS XHTML1.1+MathML+SVG parsing ℛ -PASS XHTML1.1+MathML+SVG parsing ℜ -PASS XHTML1.1+MathML+SVG parsing ℝ -PASS XHTML1.1+MathML+SVG parsing ℜ -PASS XHTML1.1+MathML+SVG parsing ▭ -PASS XHTML1.1+MathML+SVG parsing ® -PASS XHTML1.1+MathML+SVG parsing ® -PASS XHTML1.1+MathML+SVG parsing ∋ -PASS XHTML1.1+MathML+SVG parsing ⇋ -PASS XHTML1.1+MathML+SVG parsing ⥯ -PASS XHTML1.1+MathML+SVG parsing ⥽ -PASS XHTML1.1+MathML+SVG parsing ⌋ -PASS XHTML1.1+MathML+SVG parsing 𝔯 -PASS XHTML1.1+MathML+SVG parsing ℜ -PASS XHTML1.1+MathML+SVG parsing ⥤ -PASS XHTML1.1+MathML+SVG parsing ⇁ -PASS XHTML1.1+MathML+SVG parsing ⇀ -PASS XHTML1.1+MathML+SVG parsing ⥬ -PASS XHTML1.1+MathML+SVG parsing Ρ -PASS XHTML1.1+MathML+SVG parsing ρ -PASS XHTML1.1+MathML+SVG parsing ϱ -PASS XHTML1.1+MathML+SVG parsing ⟩ -PASS XHTML1.1+MathML+SVG parsing ⇥ -PASS XHTML1.1+MathML+SVG parsing → -PASS XHTML1.1+MathML+SVG parsing → -PASS XHTML1.1+MathML+SVG parsing ⇒ -PASS XHTML1.1+MathML+SVG parsing ⇄ -PASS XHTML1.1+MathML+SVG parsing ↣ -PASS XHTML1.1+MathML+SVG parsing ⌉ -PASS XHTML1.1+MathML+SVG parsing ⟧ -PASS XHTML1.1+MathML+SVG parsing ⥝ -PASS XHTML1.1+MathML+SVG parsing ⥕ -PASS XHTML1.1+MathML+SVG parsing ⇂ -PASS XHTML1.1+MathML+SVG parsing ⌋ -PASS XHTML1.1+MathML+SVG parsing ⇁ -PASS XHTML1.1+MathML+SVG parsing ⇀ -PASS XHTML1.1+MathML+SVG parsing ⇄ -PASS XHTML1.1+MathML+SVG parsing ⇌ -PASS XHTML1.1+MathML+SVG parsing ⇉ -PASS XHTML1.1+MathML+SVG parsing ↝ -PASS XHTML1.1+MathML+SVG parsing ↦ -PASS XHTML1.1+MathML+SVG parsing ⊢ -PASS XHTML1.1+MathML+SVG parsing ⥛ -PASS XHTML1.1+MathML+SVG parsing ⋌ -PASS XHTML1.1+MathML+SVG parsing ⧐ -PASS XHTML1.1+MathML+SVG parsing ⊳ -PASS XHTML1.1+MathML+SVG parsing ⊵ -PASS XHTML1.1+MathML+SVG parsing ⥏ -PASS XHTML1.1+MathML+SVG parsing ⥜ -PASS XHTML1.1+MathML+SVG parsing ⥔ -PASS XHTML1.1+MathML+SVG parsing ↾ -PASS XHTML1.1+MathML+SVG parsing ⥓ -PASS XHTML1.1+MathML+SVG parsing ⇀ -PASS XHTML1.1+MathML+SVG parsing ˚ -PASS XHTML1.1+MathML+SVG parsing ≓ -PASS XHTML1.1+MathML+SVG parsing ⇄ -PASS XHTML1.1+MathML+SVG parsing ⇌ -PASS XHTML1.1+MathML+SVG parsing ‏ -PASS XHTML1.1+MathML+SVG parsing ⎱ -PASS XHTML1.1+MathML+SVG parsing ⎱ -PASS XHTML1.1+MathML+SVG parsing ⫮ -PASS XHTML1.1+MathML+SVG parsing ⟭ -PASS XHTML1.1+MathML+SVG parsing ⇾ -PASS XHTML1.1+MathML+SVG parsing ⟧ -PASS XHTML1.1+MathML+SVG parsing ⦆ -PASS XHTML1.1+MathML+SVG parsing 𝕣 -PASS XHTML1.1+MathML+SVG parsing ℝ -PASS XHTML1.1+MathML+SVG parsing ⨮ -PASS XHTML1.1+MathML+SVG parsing ⨵ -PASS XHTML1.1+MathML+SVG parsing ⥰ -PASS XHTML1.1+MathML+SVG parsing ) -PASS XHTML1.1+MathML+SVG parsing ⦔ -PASS XHTML1.1+MathML+SVG parsing ⨒ -PASS XHTML1.1+MathML+SVG parsing ⇉ -PASS XHTML1.1+MathML+SVG parsing ⇛ -PASS XHTML1.1+MathML+SVG parsing › -PASS XHTML1.1+MathML+SVG parsing 𝓇 -PASS XHTML1.1+MathML+SVG parsing ℛ -PASS XHTML1.1+MathML+SVG parsing ↱ -PASS XHTML1.1+MathML+SVG parsing ↱ -PASS XHTML1.1+MathML+SVG parsing ] -PASS XHTML1.1+MathML+SVG parsing ’ -PASS XHTML1.1+MathML+SVG parsing ’ -PASS XHTML1.1+MathML+SVG parsing ⋌ -PASS XHTML1.1+MathML+SVG parsing ⋊ -PASS XHTML1.1+MathML+SVG parsing ▹ -PASS XHTML1.1+MathML+SVG parsing ⊵ -PASS XHTML1.1+MathML+SVG parsing ▸ -PASS XHTML1.1+MathML+SVG parsing ⧎ -PASS XHTML1.1+MathML+SVG parsing ⧴ -PASS XHTML1.1+MathML+SVG parsing ⥨ -PASS XHTML1.1+MathML+SVG parsing ℞ -PASS XHTML1.1+MathML+SVG parsing Ś -PASS XHTML1.1+MathML+SVG parsing ś -PASS XHTML1.1+MathML+SVG parsing ‚ -PASS XHTML1.1+MathML+SVG parsing ⪸ -PASS XHTML1.1+MathML+SVG parsing Š -PASS XHTML1.1+MathML+SVG parsing š -PASS XHTML1.1+MathML+SVG parsing ⪼ -PASS XHTML1.1+MathML+SVG parsing ≻ -PASS XHTML1.1+MathML+SVG parsing ≽ -PASS XHTML1.1+MathML+SVG parsing ⪰ -PASS XHTML1.1+MathML+SVG parsing ⪴ -PASS XHTML1.1+MathML+SVG parsing Ş -PASS XHTML1.1+MathML+SVG parsing ş -PASS XHTML1.1+MathML+SVG parsing Ŝ -PASS XHTML1.1+MathML+SVG parsing ŝ -PASS XHTML1.1+MathML+SVG parsing ⪺ -PASS XHTML1.1+MathML+SVG parsing ⪶ -PASS XHTML1.1+MathML+SVG parsing ⋩ -PASS XHTML1.1+MathML+SVG parsing ⨓ -PASS XHTML1.1+MathML+SVG parsing ≿ -PASS XHTML1.1+MathML+SVG parsing С -PASS XHTML1.1+MathML+SVG parsing с -PASS XHTML1.1+MathML+SVG parsing ⊡ -PASS XHTML1.1+MathML+SVG parsing ⋅ -PASS XHTML1.1+MathML+SVG parsing ⩦ -PASS XHTML1.1+MathML+SVG parsing ⤥ -PASS XHTML1.1+MathML+SVG parsing ↘ -PASS XHTML1.1+MathML+SVG parsing ⇘ -PASS XHTML1.1+MathML+SVG parsing ↘ -PASS XHTML1.1+MathML+SVG parsing § -PASS XHTML1.1+MathML+SVG parsing ; -PASS XHTML1.1+MathML+SVG parsing ⤩ -PASS XHTML1.1+MathML+SVG parsing ∖ -PASS XHTML1.1+MathML+SVG parsing ∖ -PASS XHTML1.1+MathML+SVG parsing ✶ -PASS XHTML1.1+MathML+SVG parsing 𝔖 -PASS XHTML1.1+MathML+SVG parsing 𝔰 -PASS XHTML1.1+MathML+SVG parsing ⌢ -PASS XHTML1.1+MathML+SVG parsing ♯ -PASS XHTML1.1+MathML+SVG parsing Щ -PASS XHTML1.1+MathML+SVG parsing щ -PASS XHTML1.1+MathML+SVG parsing Ш -PASS XHTML1.1+MathML+SVG parsing ш -PASS XHTML1.1+MathML+SVG parsing ↓ -PASS XHTML1.1+MathML+SVG parsing ← -PASS XHTML1.1+MathML+SVG parsing ∣ -PASS XHTML1.1+MathML+SVG parsing ∥ -PASS XHTML1.1+MathML+SVG parsing → -PASS XHTML1.1+MathML+SVG parsing ↑ -PASS XHTML1.1+MathML+SVG parsing ­ -PASS XHTML1.1+MathML+SVG parsing Σ -PASS XHTML1.1+MathML+SVG parsing σ -PASS XHTML1.1+MathML+SVG parsing ς -PASS XHTML1.1+MathML+SVG parsing ς -PASS XHTML1.1+MathML+SVG parsing ∼ -PASS XHTML1.1+MathML+SVG parsing ⩪ -PASS XHTML1.1+MathML+SVG parsing ≃ -PASS XHTML1.1+MathML+SVG parsing ≃ -PASS XHTML1.1+MathML+SVG parsing ⪞ -PASS XHTML1.1+MathML+SVG parsing ⪠ -PASS XHTML1.1+MathML+SVG parsing ⪝ -PASS XHTML1.1+MathML+SVG parsing ⪟ -PASS XHTML1.1+MathML+SVG parsing ≆ -PASS XHTML1.1+MathML+SVG parsing ⨤ -PASS XHTML1.1+MathML+SVG parsing ⥲ -PASS XHTML1.1+MathML+SVG parsing ← -PASS XHTML1.1+MathML+SVG parsing ∘ -PASS XHTML1.1+MathML+SVG parsing ∖ -PASS XHTML1.1+MathML+SVG parsing ⨳ -PASS XHTML1.1+MathML+SVG parsing ⧤ -PASS XHTML1.1+MathML+SVG parsing ∣ -PASS XHTML1.1+MathML+SVG parsing ⌣ -PASS XHTML1.1+MathML+SVG parsing ⪪ -PASS XHTML1.1+MathML+SVG parsing ⪬ -PASS XHTML1.1+MathML+SVG parsing ⪬︀ -PASS XHTML1.1+MathML+SVG parsing Ь -PASS XHTML1.1+MathML+SVG parsing ь -PASS XHTML1.1+MathML+SVG parsing ⌿ -PASS XHTML1.1+MathML+SVG parsing ⧄ -PASS XHTML1.1+MathML+SVG parsing / -PASS XHTML1.1+MathML+SVG parsing 𝕊 -PASS XHTML1.1+MathML+SVG parsing 𝕤 -PASS XHTML1.1+MathML+SVG parsing ♠ -PASS XHTML1.1+MathML+SVG parsing ♠ -PASS XHTML1.1+MathML+SVG parsing ∥ -PASS XHTML1.1+MathML+SVG parsing ⊓ -PASS XHTML1.1+MathML+SVG parsing ⊓︀ -PASS XHTML1.1+MathML+SVG parsing ⊔ -PASS XHTML1.1+MathML+SVG parsing ⊔︀ -PASS XHTML1.1+MathML+SVG parsing √ -PASS XHTML1.1+MathML+SVG parsing ⊏ -PASS XHTML1.1+MathML+SVG parsing ⊑ -PASS XHTML1.1+MathML+SVG parsing ⊏ -PASS XHTML1.1+MathML+SVG parsing ⊑ -PASS XHTML1.1+MathML+SVG parsing ⊐ -PASS XHTML1.1+MathML+SVG parsing ⊒ -PASS XHTML1.1+MathML+SVG parsing ⊐ -PASS XHTML1.1+MathML+SVG parsing ⊒ -PASS XHTML1.1+MathML+SVG parsing □ -PASS XHTML1.1+MathML+SVG parsing □ -PASS XHTML1.1+MathML+SVG parsing ⊓ -PASS XHTML1.1+MathML+SVG parsing ⊏ -PASS XHTML1.1+MathML+SVG parsing ⊑ -PASS XHTML1.1+MathML+SVG parsing ⊐ -PASS XHTML1.1+MathML+SVG parsing ⊒ -PASS XHTML1.1+MathML+SVG parsing ⊔ -PASS XHTML1.1+MathML+SVG parsing ▪ -PASS XHTML1.1+MathML+SVG parsing □ -PASS XHTML1.1+MathML+SVG parsing ▪ -PASS XHTML1.1+MathML+SVG parsing → -PASS XHTML1.1+MathML+SVG parsing 𝒮 -PASS XHTML1.1+MathML+SVG parsing 𝓈 -PASS XHTML1.1+MathML+SVG parsing ∖ -PASS XHTML1.1+MathML+SVG parsing ⌣ -PASS XHTML1.1+MathML+SVG parsing ⋆ -PASS XHTML1.1+MathML+SVG parsing ⋆ -PASS XHTML1.1+MathML+SVG parsing ☆ -PASS XHTML1.1+MathML+SVG parsing ★ -PASS XHTML1.1+MathML+SVG parsing ϵ -PASS XHTML1.1+MathML+SVG parsing ϕ -PASS XHTML1.1+MathML+SVG parsing ¯ -PASS XHTML1.1+MathML+SVG parsing ⊂ -PASS XHTML1.1+MathML+SVG parsing ⋐ -PASS XHTML1.1+MathML+SVG parsing ⪽ -PASS XHTML1.1+MathML+SVG parsing ⫅ -PASS XHTML1.1+MathML+SVG parsing ⊆ -PASS XHTML1.1+MathML+SVG parsing ⫃ -PASS XHTML1.1+MathML+SVG parsing ⫁ -PASS XHTML1.1+MathML+SVG parsing ⫋ -PASS XHTML1.1+MathML+SVG parsing ⊊ -PASS XHTML1.1+MathML+SVG parsing ⪿ -PASS XHTML1.1+MathML+SVG parsing ⥹ -PASS XHTML1.1+MathML+SVG parsing ⊂ -PASS XHTML1.1+MathML+SVG parsing ⋐ -PASS XHTML1.1+MathML+SVG parsing ⊆ -PASS XHTML1.1+MathML+SVG parsing ⫅ -PASS XHTML1.1+MathML+SVG parsing ⊆ -PASS XHTML1.1+MathML+SVG parsing ⊊ -PASS XHTML1.1+MathML+SVG parsing ⫋ -PASS XHTML1.1+MathML+SVG parsing ⫇ -PASS XHTML1.1+MathML+SVG parsing ⫕ -PASS XHTML1.1+MathML+SVG parsing ⫓ -PASS XHTML1.1+MathML+SVG parsing ⪸ -PASS XHTML1.1+MathML+SVG parsing ≻ -PASS XHTML1.1+MathML+SVG parsing ≽ -PASS XHTML1.1+MathML+SVG parsing ≻ -PASS XHTML1.1+MathML+SVG parsing ⪰ -PASS XHTML1.1+MathML+SVG parsing ≽ -PASS XHTML1.1+MathML+SVG parsing ≿ -PASS XHTML1.1+MathML+SVG parsing ⪰ -PASS XHTML1.1+MathML+SVG parsing ⪺ -PASS XHTML1.1+MathML+SVG parsing ⪶ -PASS XHTML1.1+MathML+SVG parsing ⋩ -PASS XHTML1.1+MathML+SVG parsing ≿ -PASS XHTML1.1+MathML+SVG parsing ∋ -PASS XHTML1.1+MathML+SVG parsing ∑ -PASS XHTML1.1+MathML+SVG parsing ∑ -PASS XHTML1.1+MathML+SVG parsing ♪ -PASS XHTML1.1+MathML+SVG parsing ¹ -PASS XHTML1.1+MathML+SVG parsing ² -PASS XHTML1.1+MathML+SVG parsing ³ -PASS XHTML1.1+MathML+SVG parsing ⊃ -PASS XHTML1.1+MathML+SVG parsing ⋑ -PASS XHTML1.1+MathML+SVG parsing ⪾ -PASS XHTML1.1+MathML+SVG parsing ⫘ -PASS XHTML1.1+MathML+SVG parsing ⫆ -PASS XHTML1.1+MathML+SVG parsing ⊇ -PASS XHTML1.1+MathML+SVG parsing ⫄ -PASS XHTML1.1+MathML+SVG parsing ⊃ -PASS XHTML1.1+MathML+SVG parsing ⊇ -PASS XHTML1.1+MathML+SVG parsing ⟉ -PASS XHTML1.1+MathML+SVG parsing ⫗ -PASS XHTML1.1+MathML+SVG parsing ⥻ -PASS XHTML1.1+MathML+SVG parsing ⫂ -PASS XHTML1.1+MathML+SVG parsing ⫌ -PASS XHTML1.1+MathML+SVG parsing ⊋ -PASS XHTML1.1+MathML+SVG parsing ⫀ -PASS XHTML1.1+MathML+SVG parsing ⊃ -PASS XHTML1.1+MathML+SVG parsing ⋑ -PASS XHTML1.1+MathML+SVG parsing ⊇ -PASS XHTML1.1+MathML+SVG parsing ⫆ -PASS XHTML1.1+MathML+SVG parsing ⊋ -PASS XHTML1.1+MathML+SVG parsing ⫌ -PASS XHTML1.1+MathML+SVG parsing ⫈ -PASS XHTML1.1+MathML+SVG parsing ⫔ -PASS XHTML1.1+MathML+SVG parsing ⫖ -PASS XHTML1.1+MathML+SVG parsing ⤦ -PASS XHTML1.1+MathML+SVG parsing ↙ -PASS XHTML1.1+MathML+SVG parsing ⇙ -PASS XHTML1.1+MathML+SVG parsing ↙ -PASS XHTML1.1+MathML+SVG parsing ⤪ -PASS XHTML1.1+MathML+SVG parsing ß -PASS XHTML1.1+MathML+SVG parsing 	 -PASS XHTML1.1+MathML+SVG parsing ⌖ -PASS XHTML1.1+MathML+SVG parsing Τ -PASS XHTML1.1+MathML+SVG parsing τ -PASS XHTML1.1+MathML+SVG parsing ⎴ -PASS XHTML1.1+MathML+SVG parsing Ť -PASS XHTML1.1+MathML+SVG parsing ť -PASS XHTML1.1+MathML+SVG parsing Ţ -PASS XHTML1.1+MathML+SVG parsing ţ -PASS XHTML1.1+MathML+SVG parsing Т -PASS XHTML1.1+MathML+SVG parsing т -PASS XHTML1.1+MathML+SVG parsing ⃛ -PASS XHTML1.1+MathML+SVG parsing ⌕ -PASS XHTML1.1+MathML+SVG parsing 𝔗 -PASS XHTML1.1+MathML+SVG parsing 𝔱 -PASS XHTML1.1+MathML+SVG parsing ∴ -PASS XHTML1.1+MathML+SVG parsing ∴ -PASS XHTML1.1+MathML+SVG parsing ∴ -PASS XHTML1.1+MathML+SVG parsing Θ -PASS XHTML1.1+MathML+SVG parsing θ -PASS XHTML1.1+MathML+SVG parsing ϑ -PASS XHTML1.1+MathML+SVG parsing ϑ -PASS XHTML1.1+MathML+SVG parsing ≈ -PASS XHTML1.1+MathML+SVG parsing ∼ -PASS XHTML1.1+MathML+SVG parsing    -PASS XHTML1.1+MathML+SVG parsing   -PASS XHTML1.1+MathML+SVG parsing   -PASS XHTML1.1+MathML+SVG parsing ≈ -PASS XHTML1.1+MathML+SVG parsing ∼ -PASS XHTML1.1+MathML+SVG parsing Þ -PASS XHTML1.1+MathML+SVG parsing þ -PASS XHTML1.1+MathML+SVG parsing ˜ -PASS XHTML1.1+MathML+SVG parsing ∼ -PASS XHTML1.1+MathML+SVG parsing ≃ -PASS XHTML1.1+MathML+SVG parsing ≅ -PASS XHTML1.1+MathML+SVG parsing ≈ -PASS XHTML1.1+MathML+SVG parsing ⨱ -PASS XHTML1.1+MathML+SVG parsing ⊠ -PASS XHTML1.1+MathML+SVG parsing × -PASS XHTML1.1+MathML+SVG parsing ⨰ -PASS XHTML1.1+MathML+SVG parsing ∭ -PASS XHTML1.1+MathML+SVG parsing ⤨ -PASS XHTML1.1+MathML+SVG parsing ⌶ -PASS XHTML1.1+MathML+SVG parsing ⫱ -PASS XHTML1.1+MathML+SVG parsing ⊤ -PASS XHTML1.1+MathML+SVG parsing 𝕋 -PASS XHTML1.1+MathML+SVG parsing 𝕥 -PASS XHTML1.1+MathML+SVG parsing ⫚ -PASS XHTML1.1+MathML+SVG parsing ⤩ -PASS XHTML1.1+MathML+SVG parsing ‴ -PASS XHTML1.1+MathML+SVG parsing ™ -PASS XHTML1.1+MathML+SVG parsing ™ -PASS XHTML1.1+MathML+SVG parsing ▵ -PASS XHTML1.1+MathML+SVG parsing ▿ -PASS XHTML1.1+MathML+SVG parsing ◃ -PASS XHTML1.1+MathML+SVG parsing ⊴ -PASS XHTML1.1+MathML+SVG parsing ≜ -PASS XHTML1.1+MathML+SVG parsing ▹ -PASS XHTML1.1+MathML+SVG parsing ⊵ -PASS XHTML1.1+MathML+SVG parsing ◬ -PASS XHTML1.1+MathML+SVG parsing ≜ -PASS XHTML1.1+MathML+SVG parsing ⨺ -PASS XHTML1.1+MathML+SVG parsing ⃛ -PASS XHTML1.1+MathML+SVG parsing ⨹ -PASS XHTML1.1+MathML+SVG parsing ⧍ -PASS XHTML1.1+MathML+SVG parsing ⨻ -PASS XHTML1.1+MathML+SVG parsing ⏢ -PASS XHTML1.1+MathML+SVG parsing 𝒯 -PASS XHTML1.1+MathML+SVG parsing 𝓉 -PASS XHTML1.1+MathML+SVG parsing Ц -PASS XHTML1.1+MathML+SVG parsing ц -PASS XHTML1.1+MathML+SVG parsing Ћ -PASS XHTML1.1+MathML+SVG parsing ћ -PASS XHTML1.1+MathML+SVG parsing Ŧ -PASS XHTML1.1+MathML+SVG parsing ŧ -PASS XHTML1.1+MathML+SVG parsing ≬ -PASS XHTML1.1+MathML+SVG parsing ↞ -PASS XHTML1.1+MathML+SVG parsing ↠ -PASS XHTML1.1+MathML+SVG parsing Ú -PASS XHTML1.1+MathML+SVG parsing ú -PASS XHTML1.1+MathML+SVG parsing ↑ -PASS XHTML1.1+MathML+SVG parsing ↟ -PASS XHTML1.1+MathML+SVG parsing ⇑ -PASS XHTML1.1+MathML+SVG parsing ⥉ -PASS XHTML1.1+MathML+SVG parsing Ў -PASS XHTML1.1+MathML+SVG parsing ў -PASS XHTML1.1+MathML+SVG parsing Ŭ -PASS XHTML1.1+MathML+SVG parsing ŭ -PASS XHTML1.1+MathML+SVG parsing Û -PASS XHTML1.1+MathML+SVG parsing û -PASS XHTML1.1+MathML+SVG parsing У -PASS XHTML1.1+MathML+SVG parsing у -PASS XHTML1.1+MathML+SVG parsing ⇅ -PASS XHTML1.1+MathML+SVG parsing Ű -PASS XHTML1.1+MathML+SVG parsing ű -PASS XHTML1.1+MathML+SVG parsing ⥮ -PASS XHTML1.1+MathML+SVG parsing ⥾ -PASS XHTML1.1+MathML+SVG parsing 𝔘 -PASS XHTML1.1+MathML+SVG parsing 𝔲 -PASS XHTML1.1+MathML+SVG parsing Ù -PASS XHTML1.1+MathML+SVG parsing ù -PASS XHTML1.1+MathML+SVG parsing ⥣ -PASS XHTML1.1+MathML+SVG parsing ↿ -PASS XHTML1.1+MathML+SVG parsing ↾ -PASS XHTML1.1+MathML+SVG parsing ▀ -PASS XHTML1.1+MathML+SVG parsing ⌜ -PASS XHTML1.1+MathML+SVG parsing ⌜ -PASS XHTML1.1+MathML+SVG parsing ⌏ -PASS XHTML1.1+MathML+SVG parsing ◸ -PASS XHTML1.1+MathML+SVG parsing Ū -PASS XHTML1.1+MathML+SVG parsing ū -PASS XHTML1.1+MathML+SVG parsing ¨ -PASS XHTML1.1+MathML+SVG parsing _ -PASS XHTML1.1+MathML+SVG parsing ⏟ -PASS XHTML1.1+MathML+SVG parsing ⎵ -PASS XHTML1.1+MathML+SVG parsing ⏝ -PASS XHTML1.1+MathML+SVG parsing ⋃ -PASS XHTML1.1+MathML+SVG parsing ⊎ -PASS XHTML1.1+MathML+SVG parsing Ų -PASS XHTML1.1+MathML+SVG parsing ų -PASS XHTML1.1+MathML+SVG parsing 𝕌 -PASS XHTML1.1+MathML+SVG parsing 𝕦 -PASS XHTML1.1+MathML+SVG parsing ⤒ -PASS XHTML1.1+MathML+SVG parsing ↑ -PASS XHTML1.1+MathML+SVG parsing ↑ -PASS XHTML1.1+MathML+SVG parsing ⇑ -PASS XHTML1.1+MathML+SVG parsing ⇅ -PASS XHTML1.1+MathML+SVG parsing ↕ -PASS XHTML1.1+MathML+SVG parsing ↕ -PASS XHTML1.1+MathML+SVG parsing ⇕ -PASS XHTML1.1+MathML+SVG parsing ⥮ -PASS XHTML1.1+MathML+SVG parsing ↿ -PASS XHTML1.1+MathML+SVG parsing ↾ -PASS XHTML1.1+MathML+SVG parsing ⊎ -PASS XHTML1.1+MathML+SVG parsing ↖ -PASS XHTML1.1+MathML+SVG parsing ↗ -PASS XHTML1.1+MathML+SVG parsing υ -PASS XHTML1.1+MathML+SVG parsing ϒ -PASS XHTML1.1+MathML+SVG parsing ϒ -PASS XHTML1.1+MathML+SVG parsing Υ -PASS XHTML1.1+MathML+SVG parsing υ -PASS XHTML1.1+MathML+SVG parsing ↥ -PASS XHTML1.1+MathML+SVG parsing ⊥ -PASS XHTML1.1+MathML+SVG parsing ⇈ -PASS XHTML1.1+MathML+SVG parsing ⌝ -PASS XHTML1.1+MathML+SVG parsing ⌝ -PASS XHTML1.1+MathML+SVG parsing ⌎ -PASS XHTML1.1+MathML+SVG parsing Ů -PASS XHTML1.1+MathML+SVG parsing ů -PASS XHTML1.1+MathML+SVG parsing ◹ -PASS XHTML1.1+MathML+SVG parsing 𝒰 -PASS XHTML1.1+MathML+SVG parsing 𝓊 -PASS XHTML1.1+MathML+SVG parsing ⋰ -PASS XHTML1.1+MathML+SVG parsing Ũ -PASS XHTML1.1+MathML+SVG parsing ũ -PASS XHTML1.1+MathML+SVG parsing ▵ -PASS XHTML1.1+MathML+SVG parsing ▴ -PASS XHTML1.1+MathML+SVG parsing ⇈ -PASS XHTML1.1+MathML+SVG parsing Ü -PASS XHTML1.1+MathML+SVG parsing ü -PASS XHTML1.1+MathML+SVG parsing ⦧ -PASS XHTML1.1+MathML+SVG parsing ⦜ -PASS XHTML1.1+MathML+SVG parsing ϵ -PASS XHTML1.1+MathML+SVG parsing ϰ -PASS XHTML1.1+MathML+SVG parsing ∅ -PASS XHTML1.1+MathML+SVG parsing ϕ -PASS XHTML1.1+MathML+SVG parsing ϖ -PASS XHTML1.1+MathML+SVG parsing ∝ -PASS XHTML1.1+MathML+SVG parsing ↕ -PASS XHTML1.1+MathML+SVG parsing ⇕ -PASS XHTML1.1+MathML+SVG parsing ϱ -PASS XHTML1.1+MathML+SVG parsing ς -PASS XHTML1.1+MathML+SVG parsing ⊊︀ -PASS XHTML1.1+MathML+SVG parsing ⫋︀ -PASS XHTML1.1+MathML+SVG parsing ⊋︀ -PASS XHTML1.1+MathML+SVG parsing ⫌︀ -PASS XHTML1.1+MathML+SVG parsing ϑ -PASS XHTML1.1+MathML+SVG parsing ⊲ -PASS XHTML1.1+MathML+SVG parsing ⊳ -PASS XHTML1.1+MathML+SVG parsing ⫨ -PASS XHTML1.1+MathML+SVG parsing ⫫ -PASS XHTML1.1+MathML+SVG parsing ⫩ -PASS XHTML1.1+MathML+SVG parsing В -PASS XHTML1.1+MathML+SVG parsing в -PASS XHTML1.1+MathML+SVG parsing ⊢ -PASS XHTML1.1+MathML+SVG parsing ⊨ -PASS XHTML1.1+MathML+SVG parsing ⊩ -PASS XHTML1.1+MathML+SVG parsing ⊫ -PASS XHTML1.1+MathML+SVG parsing ⫦ -PASS XHTML1.1+MathML+SVG parsing ⊻ -PASS XHTML1.1+MathML+SVG parsing ∨ -PASS XHTML1.1+MathML+SVG parsing ⋁ -PASS XHTML1.1+MathML+SVG parsing ≚ -PASS XHTML1.1+MathML+SVG parsing ⋮ -PASS XHTML1.1+MathML+SVG parsing | -PASS XHTML1.1+MathML+SVG parsing ‖ -PASS XHTML1.1+MathML+SVG parsing | -PASS XHTML1.1+MathML+SVG parsing ‖ -PASS XHTML1.1+MathML+SVG parsing ∣ -PASS XHTML1.1+MathML+SVG parsing | -PASS XHTML1.1+MathML+SVG parsing ❘ -PASS XHTML1.1+MathML+SVG parsing ≀ -PASS XHTML1.1+MathML+SVG parsing   -PASS XHTML1.1+MathML+SVG parsing 𝔙 -PASS XHTML1.1+MathML+SVG parsing 𝔳 -PASS XHTML1.1+MathML+SVG parsing ⊲ -PASS XHTML1.1+MathML+SVG parsing ⊂⃒ -PASS XHTML1.1+MathML+SVG parsing ⊃⃒ -PASS XHTML1.1+MathML+SVG parsing 𝕍 -PASS XHTML1.1+MathML+SVG parsing 𝕧 -PASS XHTML1.1+MathML+SVG parsing ∝ -PASS XHTML1.1+MathML+SVG parsing ⊳ -PASS XHTML1.1+MathML+SVG parsing 𝒱 -PASS XHTML1.1+MathML+SVG parsing 𝓋 -PASS XHTML1.1+MathML+SVG parsing ⫋︀ -PASS XHTML1.1+MathML+SVG parsing ⊊︀ -PASS XHTML1.1+MathML+SVG parsing ⫌︀ -PASS XHTML1.1+MathML+SVG parsing ⊋︀ -PASS XHTML1.1+MathML+SVG parsing ⊪ -PASS XHTML1.1+MathML+SVG parsing ⦚ -PASS XHTML1.1+MathML+SVG parsing Ŵ -PASS XHTML1.1+MathML+SVG parsing ŵ -PASS XHTML1.1+MathML+SVG parsing ⩟ -PASS XHTML1.1+MathML+SVG parsing ∧ -PASS XHTML1.1+MathML+SVG parsing ⋀ -PASS XHTML1.1+MathML+SVG parsing ≙ -PASS XHTML1.1+MathML+SVG parsing ℘ -PASS XHTML1.1+MathML+SVG parsing 𝔚 -PASS XHTML1.1+MathML+SVG parsing 𝔴 -PASS XHTML1.1+MathML+SVG parsing 𝕎 -PASS XHTML1.1+MathML+SVG parsing 𝕨 -PASS XHTML1.1+MathML+SVG parsing ℘ -PASS XHTML1.1+MathML+SVG parsing ≀ -PASS XHTML1.1+MathML+SVG parsing ≀ -PASS XHTML1.1+MathML+SVG parsing 𝒲 -PASS XHTML1.1+MathML+SVG parsing 𝓌 -PASS XHTML1.1+MathML+SVG parsing ⋂ -PASS XHTML1.1+MathML+SVG parsing ◯ -PASS XHTML1.1+MathML+SVG parsing ⋃ -PASS XHTML1.1+MathML+SVG parsing ▽ -PASS XHTML1.1+MathML+SVG parsing 𝔛 -PASS XHTML1.1+MathML+SVG parsing 𝔵 -PASS XHTML1.1+MathML+SVG parsing ⟷ -PASS XHTML1.1+MathML+SVG parsing ⟺ -PASS XHTML1.1+MathML+SVG parsing Ξ -PASS XHTML1.1+MathML+SVG parsing ξ -PASS XHTML1.1+MathML+SVG parsing ⟵ -PASS XHTML1.1+MathML+SVG parsing ⟸ -PASS XHTML1.1+MathML+SVG parsing ⟼ -PASS XHTML1.1+MathML+SVG parsing ⋻ -PASS XHTML1.1+MathML+SVG parsing ⨀ -PASS XHTML1.1+MathML+SVG parsing 𝕏 -PASS XHTML1.1+MathML+SVG parsing 𝕩 -PASS XHTML1.1+MathML+SVG parsing ⨁ -PASS XHTML1.1+MathML+SVG parsing ⨂ -PASS XHTML1.1+MathML+SVG parsing ⟶ -PASS XHTML1.1+MathML+SVG parsing ⟹ -PASS XHTML1.1+MathML+SVG parsing 𝒳 -PASS XHTML1.1+MathML+SVG parsing 𝓍 -PASS XHTML1.1+MathML+SVG parsing ⨆ -PASS XHTML1.1+MathML+SVG parsing ⨄ -PASS XHTML1.1+MathML+SVG parsing △ -PASS XHTML1.1+MathML+SVG parsing ⋁ -PASS XHTML1.1+MathML+SVG parsing ⋀ -PASS XHTML1.1+MathML+SVG parsing Ý -PASS XHTML1.1+MathML+SVG parsing ý -PASS XHTML1.1+MathML+SVG parsing Я -PASS XHTML1.1+MathML+SVG parsing я -PASS XHTML1.1+MathML+SVG parsing Ŷ -PASS XHTML1.1+MathML+SVG parsing ŷ -PASS XHTML1.1+MathML+SVG parsing Ы -PASS XHTML1.1+MathML+SVG parsing ы -PASS XHTML1.1+MathML+SVG parsing ¥ -PASS XHTML1.1+MathML+SVG parsing 𝔜 -PASS XHTML1.1+MathML+SVG parsing 𝔶 -PASS XHTML1.1+MathML+SVG parsing Ї -PASS XHTML1.1+MathML+SVG parsing ї -PASS XHTML1.1+MathML+SVG parsing 𝕐 -PASS XHTML1.1+MathML+SVG parsing 𝕪 -PASS XHTML1.1+MathML+SVG parsing 𝒴 -PASS XHTML1.1+MathML+SVG parsing 𝓎 -PASS XHTML1.1+MathML+SVG parsing Ю -PASS XHTML1.1+MathML+SVG parsing ю -PASS XHTML1.1+MathML+SVG parsing ÿ -PASS XHTML1.1+MathML+SVG parsing Ÿ -PASS XHTML1.1+MathML+SVG parsing Ź -PASS XHTML1.1+MathML+SVG parsing ź -PASS XHTML1.1+MathML+SVG parsing Ž -PASS XHTML1.1+MathML+SVG parsing ž -PASS XHTML1.1+MathML+SVG parsing З -PASS XHTML1.1+MathML+SVG parsing з -PASS XHTML1.1+MathML+SVG parsing Ż -PASS XHTML1.1+MathML+SVG parsing ż -PASS XHTML1.1+MathML+SVG parsing ℨ -PASS XHTML1.1+MathML+SVG parsing ​ -PASS XHTML1.1+MathML+SVG parsing Ζ -PASS XHTML1.1+MathML+SVG parsing ζ -PASS XHTML1.1+MathML+SVG parsing 𝔷 -PASS XHTML1.1+MathML+SVG parsing ℨ -PASS XHTML1.1+MathML+SVG parsing Ж -PASS XHTML1.1+MathML+SVG parsing ж -PASS XHTML1.1+MathML+SVG parsing ⇝ -PASS XHTML1.1+MathML+SVG parsing 𝕫 -PASS XHTML1.1+MathML+SVG parsing ℤ -PASS XHTML1.1+MathML+SVG parsing 𝒵 -PASS XHTML1.1+MathML+SVG parsing 𝓏 -PASS XHTML1.1+MathML+SVG parsing ‍ -PASS XHTML1.1+MathML+SVG parsing ‌ -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-8-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-8-expected.txt deleted file mode 100644 index 9e36baf..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-8-expected.txt +++ /dev/null
@@ -1,2129 +0,0 @@ -This is a testharness.js-based test. -Found 2125 tests; 5 PASS, 2120 FAIL, 0 TIMEOUT, 0 NOTRUN. -FAIL MathML parsing Á assert_true: expected true got false -FAIL MathML parsing á assert_true: expected true got false -FAIL MathML parsing Ă assert_true: expected true got false -FAIL MathML parsing ă assert_true: expected true got false -FAIL MathML parsing ∾ assert_true: expected true got false -FAIL MathML parsing ∿ assert_true: expected true got false -FAIL MathML parsing ∾̳ assert_true: expected true got false -FAIL MathML parsing  assert_true: expected true got false -FAIL MathML parsing â assert_true: expected true got false -FAIL MathML parsing ´ assert_true: expected true got false -FAIL MathML parsing А assert_true: expected true got false -FAIL MathML parsing а assert_true: expected true got false -FAIL MathML parsing Æ assert_true: expected true got false -FAIL MathML parsing æ assert_true: expected true got false -FAIL MathML parsing ⁡ assert_true: expected true got false -FAIL MathML parsing 𝔄 assert_true: expected true got false -FAIL MathML parsing 𝔞 assert_true: expected true got false -FAIL MathML parsing À assert_true: expected true got false -FAIL MathML parsing à assert_true: expected true got false -FAIL MathML parsing ℵ assert_true: expected true got false -FAIL MathML parsing ℵ assert_true: expected true got false -FAIL MathML parsing Α assert_true: expected true got false -FAIL MathML parsing α assert_true: expected true got false -FAIL MathML parsing Ā assert_true: expected true got false -FAIL MathML parsing ā assert_true: expected true got false -FAIL MathML parsing ⨿ assert_true: expected true got false -PASS MathML parsing & -FAIL MathML parsing & assert_true: expected true got false -FAIL MathML parsing ⩕ assert_true: expected true got false -FAIL MathML parsing ⩓ assert_true: expected true got false -FAIL MathML parsing ∧ assert_true: expected true got false -FAIL MathML parsing ⩜ assert_true: expected true got false -FAIL MathML parsing ⩘ assert_true: expected true got false -FAIL MathML parsing ⩚ assert_true: expected true got false -FAIL MathML parsing ∠ assert_true: expected true got false -FAIL MathML parsing ⦤ assert_true: expected true got false -FAIL MathML parsing ∠ assert_true: expected true got false -FAIL MathML parsing ⦨ assert_true: expected true got false -FAIL MathML parsing ⦩ assert_true: expected true got false -FAIL MathML parsing ⦪ assert_true: expected true got false -FAIL MathML parsing ⦫ assert_true: expected true got false -FAIL MathML parsing ⦬ assert_true: expected true got false -FAIL MathML parsing ⦭ assert_true: expected true got false -FAIL MathML parsing ⦮ assert_true: expected true got false -FAIL MathML parsing ⦯ assert_true: expected true got false -FAIL MathML parsing ∡ assert_true: expected true got false -FAIL MathML parsing ∟ assert_true: expected true got false -FAIL MathML parsing ⊾ assert_true: expected true got false -FAIL MathML parsing ⦝ assert_true: expected true got false -FAIL MathML parsing ∢ assert_true: expected true got false -FAIL MathML parsing Å assert_true: expected true got false -FAIL MathML parsing ⍼ assert_true: expected true got false -FAIL MathML parsing Ą assert_true: expected true got false -FAIL MathML parsing ą assert_true: expected true got false -FAIL MathML parsing 𝔸 assert_true: expected true got false -FAIL MathML parsing 𝕒 assert_true: expected true got false -FAIL MathML parsing ⩯ assert_true: expected true got false -FAIL MathML parsing ≈ assert_true: expected true got false -FAIL MathML parsing ⩰ assert_true: expected true got false -FAIL MathML parsing ≊ assert_true: expected true got false -FAIL MathML parsing ≋ assert_true: expected true got false -PASS MathML parsing ' -FAIL MathML parsing ⁡ assert_true: expected true got false -FAIL MathML parsing ≈ assert_true: expected true got false -FAIL MathML parsing ≊ assert_true: expected true got false -FAIL MathML parsing Å assert_true: expected true got false -FAIL MathML parsing å assert_true: expected true got false -FAIL MathML parsing 𝒜 assert_true: expected true got false -FAIL MathML parsing 𝒶 assert_true: expected true got false -FAIL MathML parsing ≔ assert_true: expected true got false -FAIL MathML parsing * assert_true: expected true got false -FAIL MathML parsing ≈ assert_true: expected true got false -FAIL MathML parsing ≍ assert_true: expected true got false -FAIL MathML parsing à assert_true: expected true got false -FAIL MathML parsing ã assert_true: expected true got false -FAIL MathML parsing Ä assert_true: expected true got false -FAIL MathML parsing ä assert_true: expected true got false -FAIL MathML parsing ∳ assert_true: expected true got false -FAIL MathML parsing ⨑ assert_true: expected true got false -FAIL MathML parsing ≌ assert_true: expected true got false -FAIL MathML parsing ϶ assert_true: expected true got false -FAIL MathML parsing ‵ assert_true: expected true got false -FAIL MathML parsing ∽ assert_true: expected true got false -FAIL MathML parsing ⋍ assert_true: expected true got false -FAIL MathML parsing ∖ assert_true: expected true got false -FAIL MathML parsing ⫧ assert_true: expected true got false -FAIL MathML parsing ⊽ assert_true: expected true got false -FAIL MathML parsing ⌅ assert_true: expected true got false -FAIL MathML parsing ⌆ assert_true: expected true got false -FAIL MathML parsing ⌅ assert_true: expected true got false -FAIL MathML parsing ⎵ assert_true: expected true got false -FAIL MathML parsing ⎶ assert_true: expected true got false -FAIL MathML parsing ≌ assert_true: expected true got false -FAIL MathML parsing Б assert_true: expected true got false -FAIL MathML parsing б assert_true: expected true got false -FAIL MathML parsing „ assert_true: expected true got false -FAIL MathML parsing ∵ assert_true: expected true got false -FAIL MathML parsing ∵ assert_true: expected true got false -FAIL MathML parsing ∵ assert_true: expected true got false -FAIL MathML parsing ⦰ assert_true: expected true got false -FAIL MathML parsing ϶ assert_true: expected true got false -FAIL MathML parsing ℬ assert_true: expected true got false -FAIL MathML parsing ℬ assert_true: expected true got false -FAIL MathML parsing Β assert_true: expected true got false -FAIL MathML parsing β assert_true: expected true got false -FAIL MathML parsing ℶ assert_true: expected true got false -FAIL MathML parsing ≬ assert_true: expected true got false -FAIL MathML parsing 𝔅 assert_true: expected true got false -FAIL MathML parsing 𝔟 assert_true: expected true got false -FAIL MathML parsing ⋂ assert_true: expected true got false -FAIL MathML parsing ◯ assert_true: expected true got false -FAIL MathML parsing ⋃ assert_true: expected true got false -FAIL MathML parsing ⨀ assert_true: expected true got false -FAIL MathML parsing ⨁ assert_true: expected true got false -FAIL MathML parsing ⨂ assert_true: expected true got false -FAIL MathML parsing ⨆ assert_true: expected true got false -FAIL MathML parsing ★ assert_true: expected true got false -FAIL MathML parsing ▽ assert_true: expected true got false -FAIL MathML parsing △ assert_true: expected true got false -FAIL MathML parsing ⨄ assert_true: expected true got false -FAIL MathML parsing ⋁ assert_true: expected true got false -FAIL MathML parsing ⋀ assert_true: expected true got false -FAIL MathML parsing ⤍ assert_true: expected true got false -FAIL MathML parsing ⧫ assert_true: expected true got false -FAIL MathML parsing ▪ assert_true: expected true got false -FAIL MathML parsing ▴ assert_true: expected true got false -FAIL MathML parsing ▾ assert_true: expected true got false -FAIL MathML parsing ◂ assert_true: expected true got false -FAIL MathML parsing ▸ assert_true: expected true got false -FAIL MathML parsing ␣ assert_true: expected true got false -FAIL MathML parsing ▒ assert_true: expected true got false -FAIL MathML parsing ░ assert_true: expected true got false -FAIL MathML parsing ▓ assert_true: expected true got false -FAIL MathML parsing █ assert_true: expected true got false -FAIL MathML parsing =⃥ assert_true: expected true got false -FAIL MathML parsing ≡⃥ assert_true: expected true got false -FAIL MathML parsing ⫭ assert_true: expected true got false -FAIL MathML parsing ⌐ assert_true: expected true got false -FAIL MathML parsing 𝔹 assert_true: expected true got false -FAIL MathML parsing 𝕓 assert_true: expected true got false -FAIL MathML parsing ⊥ assert_true: expected true got false -FAIL MathML parsing ⊥ assert_true: expected true got false -FAIL MathML parsing ⋈ assert_true: expected true got false -FAIL MathML parsing ⧉ assert_true: expected true got false -FAIL MathML parsing ┐ assert_true: expected true got false -FAIL MathML parsing ╕ assert_true: expected true got false -FAIL MathML parsing ╖ assert_true: expected true got false -FAIL MathML parsing ╗ assert_true: expected true got false -FAIL MathML parsing ┌ assert_true: expected true got false -FAIL MathML parsing ╒ assert_true: expected true got false -FAIL MathML parsing ╓ assert_true: expected true got false -FAIL MathML parsing ╔ assert_true: expected true got false -FAIL MathML parsing ─ assert_true: expected true got false -FAIL MathML parsing ═ assert_true: expected true got false -FAIL MathML parsing ┬ assert_true: expected true got false -FAIL MathML parsing ╤ assert_true: expected true got false -FAIL MathML parsing ╥ assert_true: expected true got false -FAIL MathML parsing ╦ assert_true: expected true got false -FAIL MathML parsing ┴ assert_true: expected true got false -FAIL MathML parsing ╧ assert_true: expected true got false -FAIL MathML parsing ╨ assert_true: expected true got false -FAIL MathML parsing ╩ assert_true: expected true got false -FAIL MathML parsing ⊟ assert_true: expected true got false -FAIL MathML parsing ⊞ assert_true: expected true got false -FAIL MathML parsing ⊠ assert_true: expected true got false -FAIL MathML parsing ┘ assert_true: expected true got false -FAIL MathML parsing ╛ assert_true: expected true got false -FAIL MathML parsing ╜ assert_true: expected true got false -FAIL MathML parsing ╝ assert_true: expected true got false -FAIL MathML parsing └ assert_true: expected true got false -FAIL MathML parsing ╘ assert_true: expected true got false -FAIL MathML parsing ╙ assert_true: expected true got false -FAIL MathML parsing ╚ assert_true: expected true got false -FAIL MathML parsing │ assert_true: expected true got false -FAIL MathML parsing ║ assert_true: expected true got false -FAIL MathML parsing ┼ assert_true: expected true got false -FAIL MathML parsing ╪ assert_true: expected true got false -FAIL MathML parsing ╫ assert_true: expected true got false -FAIL MathML parsing ╬ assert_true: expected true got false -FAIL MathML parsing ┤ assert_true: expected true got false -FAIL MathML parsing ╡ assert_true: expected true got false -FAIL MathML parsing ╢ assert_true: expected true got false -FAIL MathML parsing ╣ assert_true: expected true got false -FAIL MathML parsing ├ assert_true: expected true got false -FAIL MathML parsing ╞ assert_true: expected true got false -FAIL MathML parsing ╟ assert_true: expected true got false -FAIL MathML parsing ╠ assert_true: expected true got false -FAIL MathML parsing ‵ assert_true: expected true got false -FAIL MathML parsing ˘ assert_true: expected true got false -FAIL MathML parsing ˘ assert_true: expected true got false -FAIL MathML parsing ¦ assert_true: expected true got false -FAIL MathML parsing 𝒷 assert_true: expected true got false -FAIL MathML parsing ℬ assert_true: expected true got false -FAIL MathML parsing ⁏ assert_true: expected true got false -FAIL MathML parsing ∽ assert_true: expected true got false -FAIL MathML parsing ⋍ assert_true: expected true got false -FAIL MathML parsing ⧅ assert_true: expected true got false -FAIL MathML parsing \ assert_true: expected true got false -FAIL MathML parsing ⟈ assert_true: expected true got false -FAIL MathML parsing • assert_true: expected true got false -FAIL MathML parsing • assert_true: expected true got false -FAIL MathML parsing ≎ assert_true: expected true got false -FAIL MathML parsing ⪮ assert_true: expected true got false -FAIL MathML parsing ≏ assert_true: expected true got false -FAIL MathML parsing ≎ assert_true: expected true got false -FAIL MathML parsing ≏ assert_true: expected true got false -FAIL MathML parsing Ć assert_true: expected true got false -FAIL MathML parsing ć assert_true: expected true got false -FAIL MathML parsing ⩄ assert_true: expected true got false -FAIL MathML parsing ⩉ assert_true: expected true got false -FAIL MathML parsing ⩋ assert_true: expected true got false -FAIL MathML parsing ∩ assert_true: expected true got false -FAIL MathML parsing ⋒ assert_true: expected true got false -FAIL MathML parsing ⩇ assert_true: expected true got false -FAIL MathML parsing ⩀ assert_true: expected true got false -FAIL MathML parsing ⅅ assert_true: expected true got false -FAIL MathML parsing ∩︀ assert_true: expected true got false -FAIL MathML parsing ⁁ assert_true: expected true got false -FAIL MathML parsing ˇ assert_true: expected true got false -FAIL MathML parsing ℭ assert_true: expected true got false -FAIL MathML parsing ⩍ assert_true: expected true got false -FAIL MathML parsing Č assert_true: expected true got false -FAIL MathML parsing č assert_true: expected true got false -FAIL MathML parsing Ç assert_true: expected true got false -FAIL MathML parsing ç assert_true: expected true got false -FAIL MathML parsing Ĉ assert_true: expected true got false -FAIL MathML parsing ĉ assert_true: expected true got false -FAIL MathML parsing ∰ assert_true: expected true got false -FAIL MathML parsing ⩌ assert_true: expected true got false -FAIL MathML parsing ⩐ assert_true: expected true got false -FAIL MathML parsing Ċ assert_true: expected true got false -FAIL MathML parsing ċ assert_true: expected true got false -FAIL MathML parsing ¸ assert_true: expected true got false -FAIL MathML parsing ¸ assert_true: expected true got false -FAIL MathML parsing ⦲ assert_true: expected true got false -FAIL MathML parsing ¢ assert_true: expected true got false -FAIL MathML parsing · assert_true: expected true got false -FAIL MathML parsing · assert_true: expected true got false -FAIL MathML parsing 𝔠 assert_true: expected true got false -FAIL MathML parsing ℭ assert_true: expected true got false -FAIL MathML parsing Ч assert_true: expected true got false -FAIL MathML parsing ч assert_true: expected true got false -FAIL MathML parsing ✓ assert_true: expected true got false -FAIL MathML parsing ✓ assert_true: expected true got false -FAIL MathML parsing Χ assert_true: expected true got false -FAIL MathML parsing χ assert_true: expected true got false -FAIL MathML parsing ˆ assert_true: expected true got false -FAIL MathML parsing ≗ assert_true: expected true got false -FAIL MathML parsing ↺ assert_true: expected true got false -FAIL MathML parsing ↻ assert_true: expected true got false -FAIL MathML parsing ⊛ assert_true: expected true got false -FAIL MathML parsing ⊚ assert_true: expected true got false -FAIL MathML parsing ⊝ assert_true: expected true got false -FAIL MathML parsing ⊙ assert_true: expected true got false -FAIL MathML parsing ® assert_true: expected true got false -FAIL MathML parsing Ⓢ assert_true: expected true got false -FAIL MathML parsing ⊖ assert_true: expected true got false -FAIL MathML parsing ⊕ assert_true: expected true got false -FAIL MathML parsing ⊗ assert_true: expected true got false -FAIL MathML parsing ○ assert_true: expected true got false -FAIL MathML parsing ⧃ assert_true: expected true got false -FAIL MathML parsing ≗ assert_true: expected true got false -FAIL MathML parsing ⨐ assert_true: expected true got false -FAIL MathML parsing ⫯ assert_true: expected true got false -FAIL MathML parsing ⧂ assert_true: expected true got false -FAIL MathML parsing ∲ assert_true: expected true got false -FAIL MathML parsing ” assert_true: expected true got false -FAIL MathML parsing ’ assert_true: expected true got false -FAIL MathML parsing ♣ assert_true: expected true got false -FAIL MathML parsing ♣ assert_true: expected true got false -FAIL MathML parsing : assert_true: expected true got false -FAIL MathML parsing ∷ assert_true: expected true got false -FAIL MathML parsing ⩴ assert_true: expected true got false -FAIL MathML parsing ≔ assert_true: expected true got false -FAIL MathML parsing ≔ assert_true: expected true got false -FAIL MathML parsing , assert_true: expected true got false -FAIL MathML parsing @ assert_true: expected true got false -FAIL MathML parsing ∁ assert_true: expected true got false -FAIL MathML parsing ∘ assert_true: expected true got false -FAIL MathML parsing ∁ assert_true: expected true got false -FAIL MathML parsing ℂ assert_true: expected true got false -FAIL MathML parsing ≅ assert_true: expected true got false -FAIL MathML parsing ⩭ assert_true: expected true got false -FAIL MathML parsing ≡ assert_true: expected true got false -FAIL MathML parsing ∮ assert_true: expected true got false -FAIL MathML parsing ∯ assert_true: expected true got false -FAIL MathML parsing ∮ assert_true: expected true got false -FAIL MathML parsing 𝕔 assert_true: expected true got false -FAIL MathML parsing ℂ assert_true: expected true got false -FAIL MathML parsing ∐ assert_true: expected true got false -FAIL MathML parsing ∐ assert_true: expected true got false -FAIL MathML parsing © assert_true: expected true got false -FAIL MathML parsing © assert_true: expected true got false -FAIL MathML parsing ℗ assert_true: expected true got false -FAIL MathML parsing ∳ assert_true: expected true got false -FAIL MathML parsing ↵ assert_true: expected true got false -FAIL MathML parsing ✗ assert_true: expected true got false -FAIL MathML parsing ⨯ assert_true: expected true got false -FAIL MathML parsing 𝒞 assert_true: expected true got false -FAIL MathML parsing 𝒸 assert_true: expected true got false -FAIL MathML parsing ⫏ assert_true: expected true got false -FAIL MathML parsing ⫑ assert_true: expected true got false -FAIL MathML parsing ⫐ assert_true: expected true got false -FAIL MathML parsing ⫒ assert_true: expected true got false -FAIL MathML parsing ⋯ assert_true: expected true got false -FAIL MathML parsing ⤸ assert_true: expected true got false -FAIL MathML parsing ⤵ assert_true: expected true got false -FAIL MathML parsing ⋞ assert_true: expected true got false -FAIL MathML parsing ⋟ assert_true: expected true got false -FAIL MathML parsing ↶ assert_true: expected true got false -FAIL MathML parsing ⤽ assert_true: expected true got false -FAIL MathML parsing ⩈ assert_true: expected true got false -FAIL MathML parsing ⩆ assert_true: expected true got false -FAIL MathML parsing ≍ assert_true: expected true got false -FAIL MathML parsing ∪ assert_true: expected true got false -FAIL MathML parsing ⋓ assert_true: expected true got false -FAIL MathML parsing ⩊ assert_true: expected true got false -FAIL MathML parsing ⊍ assert_true: expected true got false -FAIL MathML parsing ⩅ assert_true: expected true got false -FAIL MathML parsing ∪︀ assert_true: expected true got false -FAIL MathML parsing ↷ assert_true: expected true got false -FAIL MathML parsing ⤼ assert_true: expected true got false -FAIL MathML parsing ⋞ assert_true: expected true got false -FAIL MathML parsing ⋟ assert_true: expected true got false -FAIL MathML parsing ⋎ assert_true: expected true got false -FAIL MathML parsing ⋏ assert_true: expected true got false -FAIL MathML parsing ¤ assert_true: expected true got false -FAIL MathML parsing ↶ assert_true: expected true got false -FAIL MathML parsing ↷ assert_true: expected true got false -FAIL MathML parsing ⋎ assert_true: expected true got false -FAIL MathML parsing ⋏ assert_true: expected true got false -FAIL MathML parsing ∲ assert_true: expected true got false -FAIL MathML parsing ∱ assert_true: expected true got false -FAIL MathML parsing ⌭ assert_true: expected true got false -FAIL MathML parsing † assert_true: expected true got false -FAIL MathML parsing ‡ assert_true: expected true got false -FAIL MathML parsing ℸ assert_true: expected true got false -FAIL MathML parsing ↓ assert_true: expected true got false -FAIL MathML parsing ↡ assert_true: expected true got false -FAIL MathML parsing ⇓ assert_true: expected true got false -FAIL MathML parsing ‐ assert_true: expected true got false -FAIL MathML parsing ⫤ assert_true: expected true got false -FAIL MathML parsing ⊣ assert_true: expected true got false -FAIL MathML parsing ⤏ assert_true: expected true got false -FAIL MathML parsing ˝ assert_true: expected true got false -FAIL MathML parsing Ď assert_true: expected true got false -FAIL MathML parsing ď assert_true: expected true got false -FAIL MathML parsing Д assert_true: expected true got false -FAIL MathML parsing д assert_true: expected true got false -FAIL MathML parsing ‡ assert_true: expected true got false -FAIL MathML parsing ⇊ assert_true: expected true got false -FAIL MathML parsing ⅅ assert_true: expected true got false -FAIL MathML parsing ⅆ assert_true: expected true got false -FAIL MathML parsing ⤑ assert_true: expected true got false -FAIL MathML parsing ⩷ assert_true: expected true got false -FAIL MathML parsing ° assert_true: expected true got false -FAIL MathML parsing ∇ assert_true: expected true got false -FAIL MathML parsing Δ assert_true: expected true got false -FAIL MathML parsing δ assert_true: expected true got false -FAIL MathML parsing ⦱ assert_true: expected true got false -FAIL MathML parsing ⥿ assert_true: expected true got false -FAIL MathML parsing 𝔇 assert_true: expected true got false -FAIL MathML parsing 𝔡 assert_true: expected true got false -FAIL MathML parsing ⥥ assert_true: expected true got false -FAIL MathML parsing ⇃ assert_true: expected true got false -FAIL MathML parsing ⇂ assert_true: expected true got false -FAIL MathML parsing ´ assert_true: expected true got false -FAIL MathML parsing ˙ assert_true: expected true got false -FAIL MathML parsing ˝ assert_true: expected true got false -FAIL MathML parsing ` assert_true: expected true got false -FAIL MathML parsing ˜ assert_true: expected true got false -FAIL MathML parsing ⋄ assert_true: expected true got false -FAIL MathML parsing ⋄ assert_true: expected true got false -FAIL MathML parsing ⋄ assert_true: expected true got false -FAIL MathML parsing ♦ assert_true: expected true got false -FAIL MathML parsing ♦ assert_true: expected true got false -FAIL MathML parsing ¨ assert_true: expected true got false -FAIL MathML parsing ⅆ assert_true: expected true got false -FAIL MathML parsing ϝ assert_true: expected true got false -FAIL MathML parsing ⋲ assert_true: expected true got false -FAIL MathML parsing ÷ assert_true: expected true got false -FAIL MathML parsing ÷ assert_true: expected true got false -FAIL MathML parsing ⋇ assert_true: expected true got false -FAIL MathML parsing ⋇ assert_true: expected true got false -FAIL MathML parsing Ђ assert_true: expected true got false -FAIL MathML parsing ђ assert_true: expected true got false -FAIL MathML parsing ⌞ assert_true: expected true got false -FAIL MathML parsing ⌍ assert_true: expected true got false -FAIL MathML parsing $ assert_true: expected true got false -FAIL MathML parsing 𝔻 assert_true: expected true got false -FAIL MathML parsing 𝕕 assert_true: expected true got false -FAIL MathML parsing ¨ assert_true: expected true got false -FAIL MathML parsing ˙ assert_true: expected true got false -FAIL MathML parsing ⃜ assert_true: expected true got false -FAIL MathML parsing ≐ assert_true: expected true got false -FAIL MathML parsing ≑ assert_true: expected true got false -FAIL MathML parsing ≐ assert_true: expected true got false -FAIL MathML parsing ∸ assert_true: expected true got false -FAIL MathML parsing ∔ assert_true: expected true got false -FAIL MathML parsing ⊡ assert_true: expected true got false -FAIL MathML parsing ⌆ assert_true: expected true got false -FAIL MathML parsing ∯ assert_true: expected true got false -FAIL MathML parsing ¨ assert_true: expected true got false -FAIL MathML parsing ⇓ assert_true: expected true got false -FAIL MathML parsing ⇐ assert_true: expected true got false -FAIL MathML parsing ⇔ assert_true: expected true got false -FAIL MathML parsing ⫤ assert_true: expected true got false -FAIL MathML parsing ⟸ assert_true: expected true got false -FAIL MathML parsing ⟺ assert_true: expected true got false -FAIL MathML parsing ⟹ assert_true: expected true got false -FAIL MathML parsing ⇒ assert_true: expected true got false -FAIL MathML parsing ⊨ assert_true: expected true got false -FAIL MathML parsing ⇑ assert_true: expected true got false -FAIL MathML parsing ⇕ assert_true: expected true got false -FAIL MathML parsing ∥ assert_true: expected true got false -FAIL MathML parsing ⤓ assert_true: expected true got false -FAIL MathML parsing ↓ assert_true: expected true got false -FAIL MathML parsing ↓ assert_true: expected true got false -FAIL MathML parsing ⇓ assert_true: expected true got false -FAIL MathML parsing ⇵ assert_true: expected true got false -FAIL MathML parsing ̑ assert_true: expected true got false -FAIL MathML parsing ⇊ assert_true: expected true got false -FAIL MathML parsing ⇃ assert_true: expected true got false -FAIL MathML parsing ⇂ assert_true: expected true got false -FAIL MathML parsing ⥐ assert_true: expected true got false -FAIL MathML parsing ⥞ assert_true: expected true got false -FAIL MathML parsing ⥖ assert_true: expected true got false -FAIL MathML parsing ↽ assert_true: expected true got false -FAIL MathML parsing ⥟ assert_true: expected true got false -FAIL MathML parsing ⥗ assert_true: expected true got false -FAIL MathML parsing ⇁ assert_true: expected true got false -FAIL MathML parsing ↧ assert_true: expected true got false -FAIL MathML parsing ⊤ assert_true: expected true got false -FAIL MathML parsing ⤐ assert_true: expected true got false -FAIL MathML parsing ⌟ assert_true: expected true got false -FAIL MathML parsing ⌌ assert_true: expected true got false -FAIL MathML parsing 𝒟 assert_true: expected true got false -FAIL MathML parsing 𝒹 assert_true: expected true got false -FAIL MathML parsing Ѕ assert_true: expected true got false -FAIL MathML parsing ѕ assert_true: expected true got false -FAIL MathML parsing ⧶ assert_true: expected true got false -FAIL MathML parsing Đ assert_true: expected true got false -FAIL MathML parsing đ assert_true: expected true got false -FAIL MathML parsing ⋱ assert_true: expected true got false -FAIL MathML parsing ▿ assert_true: expected true got false -FAIL MathML parsing ▾ assert_true: expected true got false -FAIL MathML parsing ⇵ assert_true: expected true got false -FAIL MathML parsing ⥯ assert_true: expected true got false -FAIL MathML parsing ⦦ assert_true: expected true got false -FAIL MathML parsing Џ assert_true: expected true got false -FAIL MathML parsing џ assert_true: expected true got false -FAIL MathML parsing ⟿ assert_true: expected true got false -FAIL MathML parsing É assert_true: expected true got false -FAIL MathML parsing é assert_true: expected true got false -FAIL MathML parsing ⩮ assert_true: expected true got false -FAIL MathML parsing Ě assert_true: expected true got false -FAIL MathML parsing ě assert_true: expected true got false -FAIL MathML parsing Ê assert_true: expected true got false -FAIL MathML parsing ê assert_true: expected true got false -FAIL MathML parsing ≖ assert_true: expected true got false -FAIL MathML parsing ≕ assert_true: expected true got false -FAIL MathML parsing Э assert_true: expected true got false -FAIL MathML parsing э assert_true: expected true got false -FAIL MathML parsing ⩷ assert_true: expected true got false -FAIL MathML parsing Ė assert_true: expected true got false -FAIL MathML parsing ė assert_true: expected true got false -FAIL MathML parsing ≑ assert_true: expected true got false -FAIL MathML parsing ⅇ assert_true: expected true got false -FAIL MathML parsing ≒ assert_true: expected true got false -FAIL MathML parsing 𝔈 assert_true: expected true got false -FAIL MathML parsing 𝔢 assert_true: expected true got false -FAIL MathML parsing ⪚ assert_true: expected true got false -FAIL MathML parsing È assert_true: expected true got false -FAIL MathML parsing è assert_true: expected true got false -FAIL MathML parsing ⪖ assert_true: expected true got false -FAIL MathML parsing ⪘ assert_true: expected true got false -FAIL MathML parsing ⪙ assert_true: expected true got false -FAIL MathML parsing ∈ assert_true: expected true got false -FAIL MathML parsing ⏧ assert_true: expected true got false -FAIL MathML parsing ℓ assert_true: expected true got false -FAIL MathML parsing ⪕ assert_true: expected true got false -FAIL MathML parsing ⪗ assert_true: expected true got false -FAIL MathML parsing Ē assert_true: expected true got false -FAIL MathML parsing ē assert_true: expected true got false -FAIL MathML parsing ∅ assert_true: expected true got false -FAIL MathML parsing ∅ assert_true: expected true got false -FAIL MathML parsing ◻ assert_true: expected true got false -FAIL MathML parsing ∅ assert_true: expected true got false -FAIL MathML parsing ▫ assert_true: expected true got false -FAIL MathML parsing   assert_true: expected true got false -FAIL MathML parsing   assert_true: expected true got false -FAIL MathML parsing   assert_true: expected true got false -FAIL MathML parsing Ŋ assert_true: expected true got false -FAIL MathML parsing ŋ assert_true: expected true got false -FAIL MathML parsing   assert_true: expected true got false -FAIL MathML parsing Ę assert_true: expected true got false -FAIL MathML parsing ę assert_true: expected true got false -FAIL MathML parsing 𝔼 assert_true: expected true got false -FAIL MathML parsing 𝕖 assert_true: expected true got false -FAIL MathML parsing ⋕ assert_true: expected true got false -FAIL MathML parsing ⧣ assert_true: expected true got false -FAIL MathML parsing ⩱ assert_true: expected true got false -FAIL MathML parsing ε assert_true: expected true got false -FAIL MathML parsing Ε assert_true: expected true got false -FAIL MathML parsing ε assert_true: expected true got false -FAIL MathML parsing ϵ assert_true: expected true got false -FAIL MathML parsing ≖ assert_true: expected true got false -FAIL MathML parsing ≕ assert_true: expected true got false -FAIL MathML parsing ≂ assert_true: expected true got false -FAIL MathML parsing ⪖ assert_true: expected true got false -FAIL MathML parsing ⪕ assert_true: expected true got false -FAIL MathML parsing ⩵ assert_true: expected true got false -FAIL MathML parsing = assert_true: expected true got false -FAIL MathML parsing ≂ assert_true: expected true got false -FAIL MathML parsing ≟ assert_true: expected true got false -FAIL MathML parsing ⇌ assert_true: expected true got false -FAIL MathML parsing ≡ assert_true: expected true got false -FAIL MathML parsing ⩸ assert_true: expected true got false -FAIL MathML parsing ⧥ assert_true: expected true got false -FAIL MathML parsing ⥱ assert_true: expected true got false -FAIL MathML parsing ≓ assert_true: expected true got false -FAIL MathML parsing ℯ assert_true: expected true got false -FAIL MathML parsing ℰ assert_true: expected true got false -FAIL MathML parsing ≐ assert_true: expected true got false -FAIL MathML parsing ⩳ assert_true: expected true got false -FAIL MathML parsing ≂ assert_true: expected true got false -FAIL MathML parsing Η assert_true: expected true got false -FAIL MathML parsing η assert_true: expected true got false -FAIL MathML parsing Ð assert_true: expected true got false -FAIL MathML parsing ð assert_true: expected true got false -FAIL MathML parsing Ë assert_true: expected true got false -FAIL MathML parsing ë assert_true: expected true got false -FAIL MathML parsing € assert_true: expected true got false -FAIL MathML parsing ! assert_true: expected true got false -FAIL MathML parsing ∃ assert_true: expected true got false -FAIL MathML parsing ∃ assert_true: expected true got false -FAIL MathML parsing ℰ assert_true: expected true got false -FAIL MathML parsing ⅇ assert_true: expected true got false -FAIL MathML parsing ⅇ assert_true: expected true got false -FAIL MathML parsing ≒ assert_true: expected true got false -FAIL MathML parsing Ф assert_true: expected true got false -FAIL MathML parsing ф assert_true: expected true got false -FAIL MathML parsing ♀ assert_true: expected true got false -FAIL MathML parsing ffi assert_true: expected true got false -FAIL MathML parsing ff assert_true: expected true got false -FAIL MathML parsing ffl assert_true: expected true got false -FAIL MathML parsing 𝔉 assert_true: expected true got false -FAIL MathML parsing 𝔣 assert_true: expected true got false -FAIL MathML parsing fi assert_true: expected true got false -FAIL MathML parsing ◼ assert_true: expected true got false -FAIL MathML parsing ▪ assert_true: expected true got false -FAIL MathML parsing fj assert_true: expected true got false -FAIL MathML parsing ♭ assert_true: expected true got false -FAIL MathML parsing fl assert_true: expected true got false -FAIL MathML parsing ▱ assert_true: expected true got false -FAIL MathML parsing ƒ assert_true: expected true got false -FAIL MathML parsing 𝔽 assert_true: expected true got false -FAIL MathML parsing 𝕗 assert_true: expected true got false -FAIL MathML parsing ∀ assert_true: expected true got false -FAIL MathML parsing ∀ assert_true: expected true got false -FAIL MathML parsing ⋔ assert_true: expected true got false -FAIL MathML parsing ⫙ assert_true: expected true got false -FAIL MathML parsing ℱ assert_true: expected true got false -FAIL MathML parsing ⨍ assert_true: expected true got false -FAIL MathML parsing ½ assert_true: expected true got false -FAIL MathML parsing ⅓ assert_true: expected true got false -FAIL MathML parsing ¼ assert_true: expected true got false -FAIL MathML parsing ⅕ assert_true: expected true got false -FAIL MathML parsing ⅙ assert_true: expected true got false -FAIL MathML parsing ⅛ assert_true: expected true got false -FAIL MathML parsing ⅔ assert_true: expected true got false -FAIL MathML parsing ⅖ assert_true: expected true got false -FAIL MathML parsing ¾ assert_true: expected true got false -FAIL MathML parsing ⅗ assert_true: expected true got false -FAIL MathML parsing ⅜ assert_true: expected true got false -FAIL MathML parsing ⅘ assert_true: expected true got false -FAIL MathML parsing ⅚ assert_true: expected true got false -FAIL MathML parsing ⅝ assert_true: expected true got false -FAIL MathML parsing ⅞ assert_true: expected true got false -FAIL MathML parsing ⁄ assert_true: expected true got false -FAIL MathML parsing ⌢ assert_true: expected true got false -FAIL MathML parsing 𝒻 assert_true: expected true got false -FAIL MathML parsing ℱ assert_true: expected true got false -FAIL MathML parsing ǵ assert_true: expected true got false -FAIL MathML parsing Γ assert_true: expected true got false -FAIL MathML parsing γ assert_true: expected true got false -FAIL MathML parsing Ϝ assert_true: expected true got false -FAIL MathML parsing ϝ assert_true: expected true got false -FAIL MathML parsing ⪆ assert_true: expected true got false -FAIL MathML parsing Ğ assert_true: expected true got false -FAIL MathML parsing ğ assert_true: expected true got false -FAIL MathML parsing Ģ assert_true: expected true got false -FAIL MathML parsing Ĝ assert_true: expected true got false -FAIL MathML parsing ĝ assert_true: expected true got false -FAIL MathML parsing Г assert_true: expected true got false -FAIL MathML parsing г assert_true: expected true got false -FAIL MathML parsing Ġ assert_true: expected true got false -FAIL MathML parsing ġ assert_true: expected true got false -FAIL MathML parsing ≥ assert_true: expected true got false -FAIL MathML parsing ≧ assert_true: expected true got false -FAIL MathML parsing ⪌ assert_true: expected true got false -FAIL MathML parsing ⋛ assert_true: expected true got false -FAIL MathML parsing ≥ assert_true: expected true got false -FAIL MathML parsing ≧ assert_true: expected true got false -FAIL MathML parsing ⩾ assert_true: expected true got false -FAIL MathML parsing ⪩ assert_true: expected true got false -FAIL MathML parsing ⩾ assert_true: expected true got false -FAIL MathML parsing ⪀ assert_true: expected true got false -FAIL MathML parsing ⪂ assert_true: expected true got false -FAIL MathML parsing ⪄ assert_true: expected true got false -FAIL MathML parsing ⋛︀ assert_true: expected true got false -FAIL MathML parsing ⪔ assert_true: expected true got false -FAIL MathML parsing 𝔊 assert_true: expected true got false -FAIL MathML parsing 𝔤 assert_true: expected true got false -FAIL MathML parsing ≫ assert_true: expected true got false -FAIL MathML parsing ⋙ assert_true: expected true got false -FAIL MathML parsing ⋙ assert_true: expected true got false -FAIL MathML parsing ℷ assert_true: expected true got false -FAIL MathML parsing Ѓ assert_true: expected true got false -FAIL MathML parsing ѓ assert_true: expected true got false -FAIL MathML parsing ⪥ assert_true: expected true got false -FAIL MathML parsing ≷ assert_true: expected true got false -FAIL MathML parsing ⪒ assert_true: expected true got false -FAIL MathML parsing ⪤ assert_true: expected true got false -FAIL MathML parsing ⪊ assert_true: expected true got false -FAIL MathML parsing ⪊ assert_true: expected true got false -FAIL MathML parsing ⪈ assert_true: expected true got false -FAIL MathML parsing ≩ assert_true: expected true got false -FAIL MathML parsing ⪈ assert_true: expected true got false -FAIL MathML parsing ≩ assert_true: expected true got false -FAIL MathML parsing ⋧ assert_true: expected true got false -FAIL MathML parsing 𝔾 assert_true: expected true got false -FAIL MathML parsing 𝕘 assert_true: expected true got false -FAIL MathML parsing ` assert_true: expected true got false -FAIL MathML parsing ≥ assert_true: expected true got false -FAIL MathML parsing ⋛ assert_true: expected true got false -FAIL MathML parsing ≧ assert_true: expected true got false -FAIL MathML parsing ⪢ assert_true: expected true got false -FAIL MathML parsing ≷ assert_true: expected true got false -FAIL MathML parsing ⩾ assert_true: expected true got false -FAIL MathML parsing ≳ assert_true: expected true got false -FAIL MathML parsing 𝒢 assert_true: expected true got false -FAIL MathML parsing ℊ assert_true: expected true got false -FAIL MathML parsing ≳ assert_true: expected true got false -FAIL MathML parsing ⪎ assert_true: expected true got false -FAIL MathML parsing ⪐ assert_true: expected true got false -FAIL MathML parsing ⪧ assert_true: expected true got false -FAIL MathML parsing ⩺ assert_true: expected true got false -PASS MathML parsing > -FAIL MathML parsing > assert_true: expected true got false -FAIL MathML parsing ≫ assert_true: expected true got false -FAIL MathML parsing ⋗ assert_true: expected true got false -FAIL MathML parsing ⦕ assert_true: expected true got false -FAIL MathML parsing ⩼ assert_true: expected true got false -FAIL MathML parsing ⪆ assert_true: expected true got false -FAIL MathML parsing ⥸ assert_true: expected true got false -FAIL MathML parsing ⋗ assert_true: expected true got false -FAIL MathML parsing ⋛ assert_true: expected true got false -FAIL MathML parsing ⪌ assert_true: expected true got false -FAIL MathML parsing ≷ assert_true: expected true got false -FAIL MathML parsing ≳ assert_true: expected true got false -FAIL MathML parsing ≩︀ assert_true: expected true got false -FAIL MathML parsing ≩︀ assert_true: expected true got false -FAIL MathML parsing ˇ assert_true: expected true got false -FAIL MathML parsing   assert_true: expected true got false -FAIL MathML parsing ½ assert_true: expected true got false -FAIL MathML parsing ℋ assert_true: expected true got false -FAIL MathML parsing Ъ assert_true: expected true got false -FAIL MathML parsing ъ assert_true: expected true got false -FAIL MathML parsing ⥈ assert_true: expected true got false -FAIL MathML parsing ↔ assert_true: expected true got false -FAIL MathML parsing ⇔ assert_true: expected true got false -FAIL MathML parsing ↭ assert_true: expected true got false -FAIL MathML parsing ^ assert_true: expected true got false -FAIL MathML parsing ℏ assert_true: expected true got false -FAIL MathML parsing Ĥ assert_true: expected true got false -FAIL MathML parsing ĥ assert_true: expected true got false -FAIL MathML parsing ♥ assert_true: expected true got false -FAIL MathML parsing ♥ assert_true: expected true got false -FAIL MathML parsing … assert_true: expected true got false -FAIL MathML parsing ⊹ assert_true: expected true got false -FAIL MathML parsing 𝔥 assert_true: expected true got false -FAIL MathML parsing ℌ assert_true: expected true got false -FAIL MathML parsing ℋ assert_true: expected true got false -FAIL MathML parsing ⤥ assert_true: expected true got false -FAIL MathML parsing ⤦ assert_true: expected true got false -FAIL MathML parsing ⇿ assert_true: expected true got false -FAIL MathML parsing ∻ assert_true: expected true got false -FAIL MathML parsing ↩ assert_true: expected true got false -FAIL MathML parsing ↪ assert_true: expected true got false -FAIL MathML parsing 𝕙 assert_true: expected true got false -FAIL MathML parsing ℍ assert_true: expected true got false -FAIL MathML parsing ― assert_true: expected true got false -FAIL MathML parsing ─ assert_true: expected true got false -FAIL MathML parsing 𝒽 assert_true: expected true got false -FAIL MathML parsing ℋ assert_true: expected true got false -FAIL MathML parsing ℏ assert_true: expected true got false -FAIL MathML parsing Ħ assert_true: expected true got false -FAIL MathML parsing ħ assert_true: expected true got false -FAIL MathML parsing ≎ assert_true: expected true got false -FAIL MathML parsing ≏ assert_true: expected true got false -FAIL MathML parsing ⁃ assert_true: expected true got false -FAIL MathML parsing ‐ assert_true: expected true got false -FAIL MathML parsing Í assert_true: expected true got false -FAIL MathML parsing í assert_true: expected true got false -FAIL MathML parsing ⁣ assert_true: expected true got false -FAIL MathML parsing Î assert_true: expected true got false -FAIL MathML parsing î assert_true: expected true got false -FAIL MathML parsing И assert_true: expected true got false -FAIL MathML parsing и assert_true: expected true got false -FAIL MathML parsing İ assert_true: expected true got false -FAIL MathML parsing Е assert_true: expected true got false -FAIL MathML parsing е assert_true: expected true got false -FAIL MathML parsing ¡ assert_true: expected true got false -FAIL MathML parsing ⇔ assert_true: expected true got false -FAIL MathML parsing 𝔦 assert_true: expected true got false -FAIL MathML parsing ℑ assert_true: expected true got false -FAIL MathML parsing Ì assert_true: expected true got false -FAIL MathML parsing ì assert_true: expected true got false -FAIL MathML parsing ⅈ assert_true: expected true got false -FAIL MathML parsing ⨌ assert_true: expected true got false -FAIL MathML parsing ∭ assert_true: expected true got false -FAIL MathML parsing ⧜ assert_true: expected true got false -FAIL MathML parsing ℩ assert_true: expected true got false -FAIL MathML parsing IJ assert_true: expected true got false -FAIL MathML parsing ij assert_true: expected true got false -FAIL MathML parsing Ī assert_true: expected true got false -FAIL MathML parsing ī assert_true: expected true got false -FAIL MathML parsing ℑ assert_true: expected true got false -FAIL MathML parsing ⅈ assert_true: expected true got false -FAIL MathML parsing ℐ assert_true: expected true got false -FAIL MathML parsing ℑ assert_true: expected true got false -FAIL MathML parsing ı assert_true: expected true got false -FAIL MathML parsing ℑ assert_true: expected true got false -FAIL MathML parsing ⊷ assert_true: expected true got false -FAIL MathML parsing Ƶ assert_true: expected true got false -FAIL MathML parsing ⇒ assert_true: expected true got false -FAIL MathML parsing ℅ assert_true: expected true got false -FAIL MathML parsing ∈ assert_true: expected true got false -FAIL MathML parsing ∞ assert_true: expected true got false -FAIL MathML parsing ⧝ assert_true: expected true got false -FAIL MathML parsing ı assert_true: expected true got false -FAIL MathML parsing ⊺ assert_true: expected true got false -FAIL MathML parsing ∫ assert_true: expected true got false -FAIL MathML parsing ∬ assert_true: expected true got false -FAIL MathML parsing ℤ assert_true: expected true got false -FAIL MathML parsing ∫ assert_true: expected true got false -FAIL MathML parsing ⊺ assert_true: expected true got false -FAIL MathML parsing ⋂ assert_true: expected true got false -FAIL MathML parsing ⨗ assert_true: expected true got false -FAIL MathML parsing ⨼ assert_true: expected true got false -FAIL MathML parsing ⁣ assert_true: expected true got false -FAIL MathML parsing ⁢ assert_true: expected true got false -FAIL MathML parsing Ё assert_true: expected true got false -FAIL MathML parsing ё assert_true: expected true got false -FAIL MathML parsing Į assert_true: expected true got false -FAIL MathML parsing į assert_true: expected true got false -FAIL MathML parsing 𝕀 assert_true: expected true got false -FAIL MathML parsing 𝕚 assert_true: expected true got false -FAIL MathML parsing Ι assert_true: expected true got false -FAIL MathML parsing ι assert_true: expected true got false -FAIL MathML parsing ⨼ assert_true: expected true got false -FAIL MathML parsing ¿ assert_true: expected true got false -FAIL MathML parsing 𝒾 assert_true: expected true got false -FAIL MathML parsing ℐ assert_true: expected true got false -FAIL MathML parsing ∈ assert_true: expected true got false -FAIL MathML parsing ⋵ assert_true: expected true got false -FAIL MathML parsing ⋹ assert_true: expected true got false -FAIL MathML parsing ⋴ assert_true: expected true got false -FAIL MathML parsing ⋳ assert_true: expected true got false -FAIL MathML parsing ∈ assert_true: expected true got false -FAIL MathML parsing ⁢ assert_true: expected true got false -FAIL MathML parsing Ĩ assert_true: expected true got false -FAIL MathML parsing ĩ assert_true: expected true got false -FAIL MathML parsing І assert_true: expected true got false -FAIL MathML parsing і assert_true: expected true got false -FAIL MathML parsing Ï assert_true: expected true got false -FAIL MathML parsing ï assert_true: expected true got false -FAIL MathML parsing Ĵ assert_true: expected true got false -FAIL MathML parsing ĵ assert_true: expected true got false -FAIL MathML parsing Й assert_true: expected true got false -FAIL MathML parsing й assert_true: expected true got false -FAIL MathML parsing 𝔍 assert_true: expected true got false -FAIL MathML parsing 𝔧 assert_true: expected true got false -FAIL MathML parsing ȷ assert_true: expected true got false -FAIL MathML parsing 𝕁 assert_true: expected true got false -FAIL MathML parsing 𝕛 assert_true: expected true got false -FAIL MathML parsing 𝒥 assert_true: expected true got false -FAIL MathML parsing 𝒿 assert_true: expected true got false -FAIL MathML parsing Ј assert_true: expected true got false -FAIL MathML parsing ј assert_true: expected true got false -FAIL MathML parsing Є assert_true: expected true got false -FAIL MathML parsing є assert_true: expected true got false -FAIL MathML parsing Κ assert_true: expected true got false -FAIL MathML parsing κ assert_true: expected true got false -FAIL MathML parsing ϰ assert_true: expected true got false -FAIL MathML parsing Ķ assert_true: expected true got false -FAIL MathML parsing ķ assert_true: expected true got false -FAIL MathML parsing К assert_true: expected true got false -FAIL MathML parsing к assert_true: expected true got false -FAIL MathML parsing 𝔎 assert_true: expected true got false -FAIL MathML parsing 𝔨 assert_true: expected true got false -FAIL MathML parsing ĸ assert_true: expected true got false -FAIL MathML parsing Х assert_true: expected true got false -FAIL MathML parsing х assert_true: expected true got false -FAIL MathML parsing Ќ assert_true: expected true got false -FAIL MathML parsing ќ assert_true: expected true got false -FAIL MathML parsing 𝕂 assert_true: expected true got false -FAIL MathML parsing 𝕜 assert_true: expected true got false -FAIL MathML parsing 𝒦 assert_true: expected true got false -FAIL MathML parsing 𝓀 assert_true: expected true got false -FAIL MathML parsing ⇚ assert_true: expected true got false -FAIL MathML parsing Ĺ assert_true: expected true got false -FAIL MathML parsing ĺ assert_true: expected true got false -FAIL MathML parsing ⦴ assert_true: expected true got false -FAIL MathML parsing ℒ assert_true: expected true got false -FAIL MathML parsing Λ assert_true: expected true got false -FAIL MathML parsing λ assert_true: expected true got false -FAIL MathML parsing ⟨ assert_true: expected true got false -FAIL MathML parsing ⟪ assert_true: expected true got false -FAIL MathML parsing ⦑ assert_true: expected true got false -FAIL MathML parsing ⟨ assert_true: expected true got false -FAIL MathML parsing ⪅ assert_true: expected true got false -FAIL MathML parsing ℒ assert_true: expected true got false -FAIL MathML parsing « assert_true: expected true got false -FAIL MathML parsing ⇤ assert_true: expected true got false -FAIL MathML parsing ⤟ assert_true: expected true got false -FAIL MathML parsing ← assert_true: expected true got false -FAIL MathML parsing ↞ assert_true: expected true got false -FAIL MathML parsing ⇐ assert_true: expected true got false -FAIL MathML parsing ⤝ assert_true: expected true got false -FAIL MathML parsing ↩ assert_true: expected true got false -FAIL MathML parsing ↫ assert_true: expected true got false -FAIL MathML parsing ⤹ assert_true: expected true got false -FAIL MathML parsing ⥳ assert_true: expected true got false -FAIL MathML parsing ↢ assert_true: expected true got false -FAIL MathML parsing ⤙ assert_true: expected true got false -FAIL MathML parsing ⤛ assert_true: expected true got false -FAIL MathML parsing ⪫ assert_true: expected true got false -FAIL MathML parsing ⪭ assert_true: expected true got false -FAIL MathML parsing ⪭︀ assert_true: expected true got false -FAIL MathML parsing ⤌ assert_true: expected true got false -FAIL MathML parsing ⤎ assert_true: expected true got false -FAIL MathML parsing ❲ assert_true: expected true got false -FAIL MathML parsing { assert_true: expected true got false -FAIL MathML parsing [ assert_true: expected true got false -FAIL MathML parsing ⦋ assert_true: expected true got false -FAIL MathML parsing ⦏ assert_true: expected true got false -FAIL MathML parsing ⦍ assert_true: expected true got false -FAIL MathML parsing Ľ assert_true: expected true got false -FAIL MathML parsing ľ assert_true: expected true got false -FAIL MathML parsing Ļ assert_true: expected true got false -FAIL MathML parsing ļ assert_true: expected true got false -FAIL MathML parsing ⌈ assert_true: expected true got false -FAIL MathML parsing { assert_true: expected true got false -FAIL MathML parsing Л assert_true: expected true got false -FAIL MathML parsing л assert_true: expected true got false -FAIL MathML parsing ⤶ assert_true: expected true got false -FAIL MathML parsing “ assert_true: expected true got false -FAIL MathML parsing „ assert_true: expected true got false -FAIL MathML parsing ⥧ assert_true: expected true got false -FAIL MathML parsing ⥋ assert_true: expected true got false -FAIL MathML parsing ↲ assert_true: expected true got false -FAIL MathML parsing ≤ assert_true: expected true got false -FAIL MathML parsing ≦ assert_true: expected true got false -FAIL MathML parsing ⟨ assert_true: expected true got false -FAIL MathML parsing ⇤ assert_true: expected true got false -FAIL MathML parsing ← assert_true: expected true got false -FAIL MathML parsing ← assert_true: expected true got false -FAIL MathML parsing ⇐ assert_true: expected true got false -FAIL MathML parsing ⇆ assert_true: expected true got false -FAIL MathML parsing ↢ assert_true: expected true got false -FAIL MathML parsing ⌈ assert_true: expected true got false -FAIL MathML parsing ⟦ assert_true: expected true got false -FAIL MathML parsing ⥡ assert_true: expected true got false -FAIL MathML parsing ⥙ assert_true: expected true got false -FAIL MathML parsing ⇃ assert_true: expected true got false -FAIL MathML parsing ⌊ assert_true: expected true got false -FAIL MathML parsing ↽ assert_true: expected true got false -FAIL MathML parsing ↼ assert_true: expected true got false -FAIL MathML parsing ⇇ assert_true: expected true got false -FAIL MathML parsing ↔ assert_true: expected true got false -FAIL MathML parsing ↔ assert_true: expected true got false -FAIL MathML parsing ⇔ assert_true: expected true got false -FAIL MathML parsing ⇆ assert_true: expected true got false -FAIL MathML parsing ⇋ assert_true: expected true got false -FAIL MathML parsing ↭ assert_true: expected true got false -FAIL MathML parsing ⥎ assert_true: expected true got false -FAIL MathML parsing ↤ assert_true: expected true got false -FAIL MathML parsing ⊣ assert_true: expected true got false -FAIL MathML parsing ⥚ assert_true: expected true got false -FAIL MathML parsing ⋋ assert_true: expected true got false -FAIL MathML parsing ⧏ assert_true: expected true got false -FAIL MathML parsing ⊲ assert_true: expected true got false -FAIL MathML parsing ⊴ assert_true: expected true got false -FAIL MathML parsing ⥑ assert_true: expected true got false -FAIL MathML parsing ⥠ assert_true: expected true got false -FAIL MathML parsing ⥘ assert_true: expected true got false -FAIL MathML parsing ↿ assert_true: expected true got false -FAIL MathML parsing ⥒ assert_true: expected true got false -FAIL MathML parsing ↼ assert_true: expected true got false -FAIL MathML parsing ⪋ assert_true: expected true got false -FAIL MathML parsing ⋚ assert_true: expected true got false -FAIL MathML parsing ≤ assert_true: expected true got false -FAIL MathML parsing ≦ assert_true: expected true got false -FAIL MathML parsing ⩽ assert_true: expected true got false -FAIL MathML parsing ⪨ assert_true: expected true got false -FAIL MathML parsing ⩽ assert_true: expected true got false -FAIL MathML parsing ⩿ assert_true: expected true got false -FAIL MathML parsing ⪁ assert_true: expected true got false -FAIL MathML parsing ⪃ assert_true: expected true got false -FAIL MathML parsing ⋚︀ assert_true: expected true got false -FAIL MathML parsing ⪓ assert_true: expected true got false -FAIL MathML parsing ⪅ assert_true: expected true got false -FAIL MathML parsing ⋖ assert_true: expected true got false -FAIL MathML parsing ⋚ assert_true: expected true got false -FAIL MathML parsing ⪋ assert_true: expected true got false -FAIL MathML parsing ⋚ assert_true: expected true got false -FAIL MathML parsing ≦ assert_true: expected true got false -FAIL MathML parsing ≶ assert_true: expected true got false -FAIL MathML parsing ≶ assert_true: expected true got false -FAIL MathML parsing ⪡ assert_true: expected true got false -FAIL MathML parsing ≲ assert_true: expected true got false -FAIL MathML parsing ⩽ assert_true: expected true got false -FAIL MathML parsing ≲ assert_true: expected true got false -FAIL MathML parsing ⥼ assert_true: expected true got false -FAIL MathML parsing ⌊ assert_true: expected true got false -FAIL MathML parsing 𝔏 assert_true: expected true got false -FAIL MathML parsing 𝔩 assert_true: expected true got false -FAIL MathML parsing ≶ assert_true: expected true got false -FAIL MathML parsing ⪑ assert_true: expected true got false -FAIL MathML parsing ⥢ assert_true: expected true got false -FAIL MathML parsing ↽ assert_true: expected true got false -FAIL MathML parsing ↼ assert_true: expected true got false -FAIL MathML parsing ⥪ assert_true: expected true got false -FAIL MathML parsing ▄ assert_true: expected true got false -FAIL MathML parsing Љ assert_true: expected true got false -FAIL MathML parsing љ assert_true: expected true got false -FAIL MathML parsing ⇇ assert_true: expected true got false -FAIL MathML parsing ≪ assert_true: expected true got false -FAIL MathML parsing ⋘ assert_true: expected true got false -FAIL MathML parsing ⌞ assert_true: expected true got false -FAIL MathML parsing ⇚ assert_true: expected true got false -FAIL MathML parsing ⥫ assert_true: expected true got false -FAIL MathML parsing ◺ assert_true: expected true got false -FAIL MathML parsing Ŀ assert_true: expected true got false -FAIL MathML parsing ŀ assert_true: expected true got false -FAIL MathML parsing ⎰ assert_true: expected true got false -FAIL MathML parsing ⎰ assert_true: expected true got false -FAIL MathML parsing ⪉ assert_true: expected true got false -FAIL MathML parsing ⪉ assert_true: expected true got false -FAIL MathML parsing ⪇ assert_true: expected true got false -FAIL MathML parsing ≨ assert_true: expected true got false -FAIL MathML parsing ⪇ assert_true: expected true got false -FAIL MathML parsing ≨ assert_true: expected true got false -FAIL MathML parsing ⋦ assert_true: expected true got false -FAIL MathML parsing ⟬ assert_true: expected true got false -FAIL MathML parsing ⇽ assert_true: expected true got false -FAIL MathML parsing ⟦ assert_true: expected true got false -FAIL MathML parsing ⟵ assert_true: expected true got false -FAIL MathML parsing ⟵ assert_true: expected true got false -FAIL MathML parsing ⟸ assert_true: expected true got false -FAIL MathML parsing ⟷ assert_true: expected true got false -FAIL MathML parsing ⟷ assert_true: expected true got false -FAIL MathML parsing ⟺ assert_true: expected true got false -FAIL MathML parsing ⟼ assert_true: expected true got false -FAIL MathML parsing ⟶ assert_true: expected true got false -FAIL MathML parsing ⟶ assert_true: expected true got false -FAIL MathML parsing ⟹ assert_true: expected true got false -FAIL MathML parsing ↫ assert_true: expected true got false -FAIL MathML parsing ↬ assert_true: expected true got false -FAIL MathML parsing ⦅ assert_true: expected true got false -FAIL MathML parsing 𝕃 assert_true: expected true got false -FAIL MathML parsing 𝕝 assert_true: expected true got false -FAIL MathML parsing ⨭ assert_true: expected true got false -FAIL MathML parsing ⨴ assert_true: expected true got false -FAIL MathML parsing ∗ assert_true: expected true got false -FAIL MathML parsing _ assert_true: expected true got false -FAIL MathML parsing ↙ assert_true: expected true got false -FAIL MathML parsing ↘ assert_true: expected true got false -FAIL MathML parsing ◊ assert_true: expected true got false -FAIL MathML parsing ◊ assert_true: expected true got false -FAIL MathML parsing ⧫ assert_true: expected true got false -FAIL MathML parsing ( assert_true: expected true got false -FAIL MathML parsing ⦓ assert_true: expected true got false -FAIL MathML parsing ⇆ assert_true: expected true got false -FAIL MathML parsing ⌟ assert_true: expected true got false -FAIL MathML parsing ⇋ assert_true: expected true got false -FAIL MathML parsing ⥭ assert_true: expected true got false -FAIL MathML parsing ‎ assert_true: expected true got false -FAIL MathML parsing ⊿ assert_true: expected true got false -FAIL MathML parsing ‹ assert_true: expected true got false -FAIL MathML parsing 𝓁 assert_true: expected true got false -FAIL MathML parsing ℒ assert_true: expected true got false -FAIL MathML parsing ↰ assert_true: expected true got false -FAIL MathML parsing ↰ assert_true: expected true got false -FAIL MathML parsing ≲ assert_true: expected true got false -FAIL MathML parsing ⪍ assert_true: expected true got false -FAIL MathML parsing ⪏ assert_true: expected true got false -FAIL MathML parsing [ assert_true: expected true got false -FAIL MathML parsing ‘ assert_true: expected true got false -FAIL MathML parsing ‚ assert_true: expected true got false -FAIL MathML parsing Ł assert_true: expected true got false -FAIL MathML parsing ł assert_true: expected true got false -FAIL MathML parsing ⪦ assert_true: expected true got false -FAIL MathML parsing ⩹ assert_true: expected true got false -PASS MathML parsing < -FAIL MathML parsing < assert_true: expected true got false -FAIL MathML parsing ≪ assert_true: expected true got false -FAIL MathML parsing ⋖ assert_true: expected true got false -FAIL MathML parsing ⋋ assert_true: expected true got false -FAIL MathML parsing ⋉ assert_true: expected true got false -FAIL MathML parsing ⥶ assert_true: expected true got false -FAIL MathML parsing ⩻ assert_true: expected true got false -FAIL MathML parsing ◃ assert_true: expected true got false -FAIL MathML parsing ⊴ assert_true: expected true got false -FAIL MathML parsing ◂ assert_true: expected true got false -FAIL MathML parsing ⦖ assert_true: expected true got false -FAIL MathML parsing ⥊ assert_true: expected true got false -FAIL MathML parsing ⥦ assert_true: expected true got false -FAIL MathML parsing ≨︀ assert_true: expected true got false -FAIL MathML parsing ≨︀ assert_true: expected true got false -FAIL MathML parsing ¯ assert_true: expected true got false -FAIL MathML parsing ♂ assert_true: expected true got false -FAIL MathML parsing ✠ assert_true: expected true got false -FAIL MathML parsing ✠ assert_true: expected true got false -FAIL MathML parsing ⤅ assert_true: expected true got false -FAIL MathML parsing ↦ assert_true: expected true got false -FAIL MathML parsing ↦ assert_true: expected true got false -FAIL MathML parsing ↧ assert_true: expected true got false -FAIL MathML parsing ↤ assert_true: expected true got false -FAIL MathML parsing ↥ assert_true: expected true got false -FAIL MathML parsing ▮ assert_true: expected true got false -FAIL MathML parsing ⨩ assert_true: expected true got false -FAIL MathML parsing М assert_true: expected true got false -FAIL MathML parsing м assert_true: expected true got false -FAIL MathML parsing — assert_true: expected true got false -FAIL MathML parsing ∺ assert_true: expected true got false -FAIL MathML parsing ∡ assert_true: expected true got false -FAIL MathML parsing   assert_true: expected true got false -FAIL MathML parsing ℳ assert_true: expected true got false -FAIL MathML parsing 𝔐 assert_true: expected true got false -FAIL MathML parsing 𝔪 assert_true: expected true got false -FAIL MathML parsing ℧ assert_true: expected true got false -FAIL MathML parsing µ assert_true: expected true got false -FAIL MathML parsing * assert_true: expected true got false -FAIL MathML parsing ⫰ assert_true: expected true got false -FAIL MathML parsing ∣ assert_true: expected true got false -FAIL MathML parsing · assert_true: expected true got false -FAIL MathML parsing ⊟ assert_true: expected true got false -FAIL MathML parsing − assert_true: expected true got false -FAIL MathML parsing ∸ assert_true: expected true got false -FAIL MathML parsing ⨪ assert_true: expected true got false -FAIL MathML parsing ∓ assert_true: expected true got false -FAIL MathML parsing ⫛ assert_true: expected true got false -FAIL MathML parsing … assert_true: expected true got false -FAIL MathML parsing ∓ assert_true: expected true got false -FAIL MathML parsing ⊧ assert_true: expected true got false -FAIL MathML parsing 𝕄 assert_true: expected true got false -FAIL MathML parsing 𝕞 assert_true: expected true got false -FAIL MathML parsing ∓ assert_true: expected true got false -FAIL MathML parsing 𝓂 assert_true: expected true got false -FAIL MathML parsing ℳ assert_true: expected true got false -FAIL MathML parsing ∾ assert_true: expected true got false -FAIL MathML parsing Μ assert_true: expected true got false -FAIL MathML parsing μ assert_true: expected true got false -FAIL MathML parsing ⊸ assert_true: expected true got false -FAIL MathML parsing ⊸ assert_true: expected true got false -FAIL MathML parsing ∇ assert_true: expected true got false -FAIL MathML parsing Ń assert_true: expected true got false -FAIL MathML parsing ń assert_true: expected true got false -FAIL MathML parsing ∠⃒ assert_true: expected true got false -FAIL MathML parsing ≉ assert_true: expected true got false -FAIL MathML parsing ⩰̸ assert_true: expected true got false -FAIL MathML parsing ≋̸ assert_true: expected true got false -FAIL MathML parsing ʼn assert_true: expected true got false -FAIL MathML parsing ≉ assert_true: expected true got false -FAIL MathML parsing ♮ assert_true: expected true got false -FAIL MathML parsing ℕ assert_true: expected true got false -FAIL MathML parsing ♮ assert_true: expected true got false -FAIL MathML parsing assert_true: expected true got false -FAIL MathML parsing ≎̸ assert_true: expected true got false -FAIL MathML parsing ≏̸ assert_true: expected true got false -FAIL MathML parsing ⩃ assert_true: expected true got false -FAIL MathML parsing Ň assert_true: expected true got false -FAIL MathML parsing ň assert_true: expected true got false -FAIL MathML parsing Ņ assert_true: expected true got false -FAIL MathML parsing ņ assert_true: expected true got false -FAIL MathML parsing ≇ assert_true: expected true got false -FAIL MathML parsing ⩭̸ assert_true: expected true got false -FAIL MathML parsing ⩂ assert_true: expected true got false -FAIL MathML parsing Н assert_true: expected true got false -FAIL MathML parsing н assert_true: expected true got false -FAIL MathML parsing – assert_true: expected true got false -FAIL MathML parsing ⤤ assert_true: expected true got false -FAIL MathML parsing ↗ assert_true: expected true got false -FAIL MathML parsing ⇗ assert_true: expected true got false -FAIL MathML parsing ↗ assert_true: expected true got false -FAIL MathML parsing ≠ assert_true: expected true got false -FAIL MathML parsing ≐̸ assert_true: expected true got false -FAIL MathML parsing ​ assert_true: expected true got false -FAIL MathML parsing ​ assert_true: expected true got false -FAIL MathML parsing ​ assert_true: expected true got false -FAIL MathML parsing ​ assert_true: expected true got false -FAIL MathML parsing ≢ assert_true: expected true got false -FAIL MathML parsing ⤨ assert_true: expected true got false -FAIL MathML parsing ≂̸ assert_true: expected true got false -FAIL MathML parsing ≫ assert_true: expected true got false -FAIL MathML parsing ≪ assert_true: expected true got false -FAIL MathML parsing 
 assert_true: expected true got false -FAIL MathML parsing ∄ assert_true: expected true got false -FAIL MathML parsing ∄ assert_true: expected true got false -FAIL MathML parsing 𝔑 assert_true: expected true got false -FAIL MathML parsing 𝔫 assert_true: expected true got false -FAIL MathML parsing ≧̸ assert_true: expected true got false -FAIL MathML parsing ≱ assert_true: expected true got false -FAIL MathML parsing ≱ assert_true: expected true got false -FAIL MathML parsing ≧̸ assert_true: expected true got false -FAIL MathML parsing ⩾̸ assert_true: expected true got false -FAIL MathML parsing ⩾̸ assert_true: expected true got false -FAIL MathML parsing ⋙̸ assert_true: expected true got false -FAIL MathML parsing ≵ assert_true: expected true got false -FAIL MathML parsing ≫⃒ assert_true: expected true got false -FAIL MathML parsing ≯ assert_true: expected true got false -FAIL MathML parsing ≯ assert_true: expected true got false -FAIL MathML parsing ≫̸ assert_true: expected true got false -FAIL MathML parsing ↮ assert_true: expected true got false -FAIL MathML parsing ⇎ assert_true: expected true got false -FAIL MathML parsing ⫲ assert_true: expected true got false -FAIL MathML parsing ∋ assert_true: expected true got false -FAIL MathML parsing ⋼ assert_true: expected true got false -FAIL MathML parsing ⋺ assert_true: expected true got false -FAIL MathML parsing ∋ assert_true: expected true got false -FAIL MathML parsing Њ assert_true: expected true got false -FAIL MathML parsing њ assert_true: expected true got false -FAIL MathML parsing ↚ assert_true: expected true got false -FAIL MathML parsing ⇍ assert_true: expected true got false -FAIL MathML parsing ‥ assert_true: expected true got false -FAIL MathML parsing ≦̸ assert_true: expected true got false -FAIL MathML parsing ≰ assert_true: expected true got false -FAIL MathML parsing ↚ assert_true: expected true got false -FAIL MathML parsing ⇍ assert_true: expected true got false -FAIL MathML parsing ↮ assert_true: expected true got false -FAIL MathML parsing ⇎ assert_true: expected true got false -FAIL MathML parsing ≰ assert_true: expected true got false -FAIL MathML parsing ≦̸ assert_true: expected true got false -FAIL MathML parsing ⩽̸ assert_true: expected true got false -FAIL MathML parsing ⩽̸ assert_true: expected true got false -FAIL MathML parsing ≮ assert_true: expected true got false -FAIL MathML parsing ⋘̸ assert_true: expected true got false -FAIL MathML parsing ≴ assert_true: expected true got false -FAIL MathML parsing ≪⃒ assert_true: expected true got false -FAIL MathML parsing ≮ assert_true: expected true got false -FAIL MathML parsing ⋪ assert_true: expected true got false -FAIL MathML parsing ⋬ assert_true: expected true got false -FAIL MathML parsing ≪̸ assert_true: expected true got false -FAIL MathML parsing ∤ assert_true: expected true got false -FAIL MathML parsing ⁠ assert_true: expected true got false -FAIL MathML parsing   assert_true: expected true got false -FAIL MathML parsing 𝕟 assert_true: expected true got false -FAIL MathML parsing ℕ assert_true: expected true got false -FAIL MathML parsing ⫬ assert_true: expected true got false -FAIL MathML parsing ¬ assert_true: expected true got false -FAIL MathML parsing ≢ assert_true: expected true got false -FAIL MathML parsing ≭ assert_true: expected true got false -FAIL MathML parsing ∦ assert_true: expected true got false -FAIL MathML parsing ∉ assert_true: expected true got false -FAIL MathML parsing ≠ assert_true: expected true got false -FAIL MathML parsing ≂̸ assert_true: expected true got false -FAIL MathML parsing ∄ assert_true: expected true got false -FAIL MathML parsing ≯ assert_true: expected true got false -FAIL MathML parsing ≱ assert_true: expected true got false -FAIL MathML parsing ≧̸ assert_true: expected true got false -FAIL MathML parsing ≫̸ assert_true: expected true got false -FAIL MathML parsing ≹ assert_true: expected true got false -FAIL MathML parsing ⩾̸ assert_true: expected true got false -FAIL MathML parsing ≵ assert_true: expected true got false -FAIL MathML parsing ≎̸ assert_true: expected true got false -FAIL MathML parsing ≏̸ assert_true: expected true got false -FAIL MathML parsing ∉ assert_true: expected true got false -FAIL MathML parsing ⋵̸ assert_true: expected true got false -FAIL MathML parsing ⋹̸ assert_true: expected true got false -FAIL MathML parsing ∉ assert_true: expected true got false -FAIL MathML parsing ⋷ assert_true: expected true got false -FAIL MathML parsing ⋶ assert_true: expected true got false -FAIL MathML parsing ⧏̸ assert_true: expected true got false -FAIL MathML parsing ⋪ assert_true: expected true got false -FAIL MathML parsing ⋬ assert_true: expected true got false -FAIL MathML parsing ≮ assert_true: expected true got false -FAIL MathML parsing ≰ assert_true: expected true got false -FAIL MathML parsing ≸ assert_true: expected true got false -FAIL MathML parsing ≪̸ assert_true: expected true got false -FAIL MathML parsing ⩽̸ assert_true: expected true got false -FAIL MathML parsing ≴ assert_true: expected true got false -FAIL MathML parsing ⪢̸ assert_true: expected true got false -FAIL MathML parsing ⪡̸ assert_true: expected true got false -FAIL MathML parsing ∌ assert_true: expected true got false -FAIL MathML parsing ∌ assert_true: expected true got false -FAIL MathML parsing ⋾ assert_true: expected true got false -FAIL MathML parsing ⋽ assert_true: expected true got false -FAIL MathML parsing ⊀ assert_true: expected true got false -FAIL MathML parsing ⪯̸ assert_true: expected true got false -FAIL MathML parsing ⋠ assert_true: expected true got false -FAIL MathML parsing ∌ assert_true: expected true got false -FAIL MathML parsing ⧐̸ assert_true: expected true got false -FAIL MathML parsing ⋫ assert_true: expected true got false -FAIL MathML parsing ⋭ assert_true: expected true got false -FAIL MathML parsing ⊏̸ assert_true: expected true got false -FAIL MathML parsing ⋢ assert_true: expected true got false -FAIL MathML parsing ⊐̸ assert_true: expected true got false -FAIL MathML parsing ⋣ assert_true: expected true got false -FAIL MathML parsing ⊂⃒ assert_true: expected true got false -FAIL MathML parsing ⊈ assert_true: expected true got false -FAIL MathML parsing ⊁ assert_true: expected true got false -FAIL MathML parsing ⪰̸ assert_true: expected true got false -FAIL MathML parsing ⋡ assert_true: expected true got false -FAIL MathML parsing ≿̸ assert_true: expected true got false -FAIL MathML parsing ⊃⃒ assert_true: expected true got false -FAIL MathML parsing ⊉ assert_true: expected true got false -FAIL MathML parsing ≁ assert_true: expected true got false -FAIL MathML parsing ≄ assert_true: expected true got false -FAIL MathML parsing ≇ assert_true: expected true got false -FAIL MathML parsing ≉ assert_true: expected true got false -FAIL MathML parsing ∤ assert_true: expected true got false -FAIL MathML parsing ∦ assert_true: expected true got false -FAIL MathML parsing ∦ assert_true: expected true got false -FAIL MathML parsing ⫽⃥ assert_true: expected true got false -FAIL MathML parsing ∂̸ assert_true: expected true got false -FAIL MathML parsing ⨔ assert_true: expected true got false -FAIL MathML parsing ⊀ assert_true: expected true got false -FAIL MathML parsing ⋠ assert_true: expected true got false -FAIL MathML parsing ⊀ assert_true: expected true got false -FAIL MathML parsing ⪯̸ assert_true: expected true got false -FAIL MathML parsing ⪯̸ assert_true: expected true got false -FAIL MathML parsing ⤳̸ assert_true: expected true got false -FAIL MathML parsing ↛ assert_true: expected true got false -FAIL MathML parsing ⇏ assert_true: expected true got false -FAIL MathML parsing ↝̸ assert_true: expected true got false -FAIL MathML parsing ↛ assert_true: expected true got false -FAIL MathML parsing ⇏ assert_true: expected true got false -FAIL MathML parsing ⋫ assert_true: expected true got false -FAIL MathML parsing ⋭ assert_true: expected true got false -FAIL MathML parsing ⊁ assert_true: expected true got false -FAIL MathML parsing ⋡ assert_true: expected true got false -FAIL MathML parsing ⪰̸ assert_true: expected true got false -FAIL MathML parsing 𝒩 assert_true: expected true got false -FAIL MathML parsing 𝓃 assert_true: expected true got false -FAIL MathML parsing ∤ assert_true: expected true got false -FAIL MathML parsing ∦ assert_true: expected true got false -FAIL MathML parsing ≁ assert_true: expected true got false -FAIL MathML parsing ≄ assert_true: expected true got false -FAIL MathML parsing ≄ assert_true: expected true got false -FAIL MathML parsing ∤ assert_true: expected true got false -FAIL MathML parsing ∦ assert_true: expected true got false -FAIL MathML parsing ⋢ assert_true: expected true got false -FAIL MathML parsing ⋣ assert_true: expected true got false -FAIL MathML parsing ⊄ assert_true: expected true got false -FAIL MathML parsing ⫅̸ assert_true: expected true got false -FAIL MathML parsing ⊈ assert_true: expected true got false -FAIL MathML parsing ⊂⃒ assert_true: expected true got false -FAIL MathML parsing ⊈ assert_true: expected true got false -FAIL MathML parsing ⫅̸ assert_true: expected true got false -FAIL MathML parsing ⊁ assert_true: expected true got false -FAIL MathML parsing ⪰̸ assert_true: expected true got false -FAIL MathML parsing ⊅ assert_true: expected true got false -FAIL MathML parsing ⫆̸ assert_true: expected true got false -FAIL MathML parsing ⊉ assert_true: expected true got false -FAIL MathML parsing ⊃⃒ assert_true: expected true got false -FAIL MathML parsing ⊉ assert_true: expected true got false -FAIL MathML parsing ⫆̸ assert_true: expected true got false -FAIL MathML parsing ≹ assert_true: expected true got false -FAIL MathML parsing Ñ assert_true: expected true got false -FAIL MathML parsing ñ assert_true: expected true got false -FAIL MathML parsing ≸ assert_true: expected true got false -FAIL MathML parsing ⋪ assert_true: expected true got false -FAIL MathML parsing ⋬ assert_true: expected true got false -FAIL MathML parsing ⋫ assert_true: expected true got false -FAIL MathML parsing ⋭ assert_true: expected true got false -FAIL MathML parsing Ν assert_true: expected true got false -FAIL MathML parsing ν assert_true: expected true got false -FAIL MathML parsing # assert_true: expected true got false -FAIL MathML parsing № assert_true: expected true got false -FAIL MathML parsing   assert_true: expected true got false -FAIL MathML parsing ≍⃒ assert_true: expected true got false -FAIL MathML parsing ⊬ assert_true: expected true got false -FAIL MathML parsing ⊭ assert_true: expected true got false -FAIL MathML parsing ⊮ assert_true: expected true got false -FAIL MathML parsing ⊯ assert_true: expected true got false -FAIL MathML parsing ≥⃒ assert_true: expected true got false -FAIL MathML parsing >⃒ assert_true: expected true got false -FAIL MathML parsing ⤄ assert_true: expected true got false -FAIL MathML parsing ⧞ assert_true: expected true got false -FAIL MathML parsing ⤂ assert_true: expected true got false -FAIL MathML parsing ≤⃒ assert_true: expected true got false -FAIL MathML parsing <⃒ assert_true: expected true got false -FAIL MathML parsing ⊴⃒ assert_true: expected true got false -FAIL MathML parsing ⤃ assert_true: expected true got false -FAIL MathML parsing ⊵⃒ assert_true: expected true got false -FAIL MathML parsing ∼⃒ assert_true: expected true got false -FAIL MathML parsing ⤣ assert_true: expected true got false -FAIL MathML parsing ↖ assert_true: expected true got false -FAIL MathML parsing ⇖ assert_true: expected true got false -FAIL MathML parsing ↖ assert_true: expected true got false -FAIL MathML parsing ⤧ assert_true: expected true got false -FAIL MathML parsing Ó assert_true: expected true got false -FAIL MathML parsing ó assert_true: expected true got false -FAIL MathML parsing ⊛ assert_true: expected true got false -FAIL MathML parsing Ô assert_true: expected true got false -FAIL MathML parsing ô assert_true: expected true got false -FAIL MathML parsing ⊚ assert_true: expected true got false -FAIL MathML parsing О assert_true: expected true got false -FAIL MathML parsing о assert_true: expected true got false -FAIL MathML parsing ⊝ assert_true: expected true got false -FAIL MathML parsing Ő assert_true: expected true got false -FAIL MathML parsing ő assert_true: expected true got false -FAIL MathML parsing ⨸ assert_true: expected true got false -FAIL MathML parsing ⊙ assert_true: expected true got false -FAIL MathML parsing ⦼ assert_true: expected true got false -FAIL MathML parsing Œ assert_true: expected true got false -FAIL MathML parsing œ assert_true: expected true got false -FAIL MathML parsing ⦿ assert_true: expected true got false -FAIL MathML parsing 𝔒 assert_true: expected true got false -FAIL MathML parsing 𝔬 assert_true: expected true got false -FAIL MathML parsing ˛ assert_true: expected true got false -FAIL MathML parsing Ò assert_true: expected true got false -FAIL MathML parsing ò assert_true: expected true got false -FAIL MathML parsing ⧁ assert_true: expected true got false -FAIL MathML parsing ⦵ assert_true: expected true got false -FAIL MathML parsing Ω assert_true: expected true got false -FAIL MathML parsing ∮ assert_true: expected true got false -FAIL MathML parsing ↺ assert_true: expected true got false -FAIL MathML parsing ⦾ assert_true: expected true got false -FAIL MathML parsing ⦻ assert_true: expected true got false -FAIL MathML parsing ‾ assert_true: expected true got false -FAIL MathML parsing ⧀ assert_true: expected true got false -FAIL MathML parsing Ō assert_true: expected true got false -FAIL MathML parsing ō assert_true: expected true got false -FAIL MathML parsing Ω assert_true: expected true got false -FAIL MathML parsing ω assert_true: expected true got false -FAIL MathML parsing Ο assert_true: expected true got false -FAIL MathML parsing ο assert_true: expected true got false -FAIL MathML parsing ⦶ assert_true: expected true got false -FAIL MathML parsing ⊖ assert_true: expected true got false -FAIL MathML parsing 𝕆 assert_true: expected true got false -FAIL MathML parsing 𝕠 assert_true: expected true got false -FAIL MathML parsing ⦷ assert_true: expected true got false -FAIL MathML parsing “ assert_true: expected true got false -FAIL MathML parsing ‘ assert_true: expected true got false -FAIL MathML parsing ⦹ assert_true: expected true got false -FAIL MathML parsing ⊕ assert_true: expected true got false -FAIL MathML parsing ↻ assert_true: expected true got false -FAIL MathML parsing ⩔ assert_true: expected true got false -FAIL MathML parsing ∨ assert_true: expected true got false -FAIL MathML parsing ⩝ assert_true: expected true got false -FAIL MathML parsing ℴ assert_true: expected true got false -FAIL MathML parsing ℴ assert_true: expected true got false -FAIL MathML parsing ª assert_true: expected true got false -FAIL MathML parsing º assert_true: expected true got false -FAIL MathML parsing ⊶ assert_true: expected true got false -FAIL MathML parsing ⩖ assert_true: expected true got false -FAIL MathML parsing ⩗ assert_true: expected true got false -FAIL MathML parsing ⩛ assert_true: expected true got false -FAIL MathML parsing Ⓢ assert_true: expected true got false -FAIL MathML parsing 𝒪 assert_true: expected true got false -FAIL MathML parsing ℴ assert_true: expected true got false -FAIL MathML parsing Ø assert_true: expected true got false -FAIL MathML parsing ø assert_true: expected true got false -FAIL MathML parsing ⊘ assert_true: expected true got false -FAIL MathML parsing Õ assert_true: expected true got false -FAIL MathML parsing õ assert_true: expected true got false -FAIL MathML parsing ⨶ assert_true: expected true got false -FAIL MathML parsing ⨷ assert_true: expected true got false -FAIL MathML parsing ⊗ assert_true: expected true got false -FAIL MathML parsing Ö assert_true: expected true got false -FAIL MathML parsing ö assert_true: expected true got false -FAIL MathML parsing ⌽ assert_true: expected true got false -FAIL MathML parsing ‾ assert_true: expected true got false -FAIL MathML parsing ⏞ assert_true: expected true got false -FAIL MathML parsing ⎴ assert_true: expected true got false -FAIL MathML parsing ⏜ assert_true: expected true got false -FAIL MathML parsing ¶ assert_true: expected true got false -FAIL MathML parsing ∥ assert_true: expected true got false -FAIL MathML parsing ∥ assert_true: expected true got false -FAIL MathML parsing ⫳ assert_true: expected true got false -FAIL MathML parsing ⫽ assert_true: expected true got false -FAIL MathML parsing ∂ assert_true: expected true got false -FAIL MathML parsing ∂ assert_true: expected true got false -FAIL MathML parsing П assert_true: expected true got false -FAIL MathML parsing п assert_true: expected true got false -FAIL MathML parsing % assert_true: expected true got false -FAIL MathML parsing . assert_true: expected true got false -FAIL MathML parsing ‰ assert_true: expected true got false -FAIL MathML parsing ⊥ assert_true: expected true got false -FAIL MathML parsing ‱ assert_true: expected true got false -FAIL MathML parsing 𝔓 assert_true: expected true got false -FAIL MathML parsing 𝔭 assert_true: expected true got false -FAIL MathML parsing Φ assert_true: expected true got false -FAIL MathML parsing φ assert_true: expected true got false -FAIL MathML parsing ϕ assert_true: expected true got false -FAIL MathML parsing ℳ assert_true: expected true got false -FAIL MathML parsing ☎ assert_true: expected true got false -FAIL MathML parsing Π assert_true: expected true got false -FAIL MathML parsing π assert_true: expected true got false -FAIL MathML parsing ⋔ assert_true: expected true got false -FAIL MathML parsing ϖ assert_true: expected true got false -FAIL MathML parsing ℏ assert_true: expected true got false -FAIL MathML parsing ℎ assert_true: expected true got false -FAIL MathML parsing ℏ assert_true: expected true got false -FAIL MathML parsing ⨣ assert_true: expected true got false -FAIL MathML parsing ⊞ assert_true: expected true got false -FAIL MathML parsing ⨢ assert_true: expected true got false -FAIL MathML parsing + assert_true: expected true got false -FAIL MathML parsing ∔ assert_true: expected true got false -FAIL MathML parsing ⨥ assert_true: expected true got false -FAIL MathML parsing ⩲ assert_true: expected true got false -FAIL MathML parsing ± assert_true: expected true got false -FAIL MathML parsing ± assert_true: expected true got false -FAIL MathML parsing ⨦ assert_true: expected true got false -FAIL MathML parsing ⨧ assert_true: expected true got false -FAIL MathML parsing ± assert_true: expected true got false -FAIL MathML parsing ℌ assert_true: expected true got false -FAIL MathML parsing ⨕ assert_true: expected true got false -FAIL MathML parsing 𝕡 assert_true: expected true got false -FAIL MathML parsing ℙ assert_true: expected true got false -FAIL MathML parsing £ assert_true: expected true got false -FAIL MathML parsing ⪷ assert_true: expected true got false -FAIL MathML parsing ⪻ assert_true: expected true got false -FAIL MathML parsing ≺ assert_true: expected true got false -FAIL MathML parsing ≼ assert_true: expected true got false -FAIL MathML parsing ⪷ assert_true: expected true got false -FAIL MathML parsing ≺ assert_true: expected true got false -FAIL MathML parsing ≼ assert_true: expected true got false -FAIL MathML parsing ≺ assert_true: expected true got false -FAIL MathML parsing ⪯ assert_true: expected true got false -FAIL MathML parsing ≼ assert_true: expected true got false -FAIL MathML parsing ≾ assert_true: expected true got false -FAIL MathML parsing ⪯ assert_true: expected true got false -FAIL MathML parsing ⪹ assert_true: expected true got false -FAIL MathML parsing ⪵ assert_true: expected true got false -FAIL MathML parsing ⋨ assert_true: expected true got false -FAIL MathML parsing ⪯ assert_true: expected true got false -FAIL MathML parsing ⪳ assert_true: expected true got false -FAIL MathML parsing ≾ assert_true: expected true got false -FAIL MathML parsing ′ assert_true: expected true got false -FAIL MathML parsing ″ assert_true: expected true got false -FAIL MathML parsing ℙ assert_true: expected true got false -FAIL MathML parsing ⪹ assert_true: expected true got false -FAIL MathML parsing ⪵ assert_true: expected true got false -FAIL MathML parsing ⋨ assert_true: expected true got false -FAIL MathML parsing ∏ assert_true: expected true got false -FAIL MathML parsing ∏ assert_true: expected true got false -FAIL MathML parsing ⌮ assert_true: expected true got false -FAIL MathML parsing ⌒ assert_true: expected true got false -FAIL MathML parsing ⌓ assert_true: expected true got false -FAIL MathML parsing ∝ assert_true: expected true got false -FAIL MathML parsing ∝ assert_true: expected true got false -FAIL MathML parsing ∷ assert_true: expected true got false -FAIL MathML parsing ∝ assert_true: expected true got false -FAIL MathML parsing ≾ assert_true: expected true got false -FAIL MathML parsing ⊰ assert_true: expected true got false -FAIL MathML parsing 𝒫 assert_true: expected true got false -FAIL MathML parsing 𝓅 assert_true: expected true got false -FAIL MathML parsing Ψ assert_true: expected true got false -FAIL MathML parsing ψ assert_true: expected true got false -FAIL MathML parsing   assert_true: expected true got false -FAIL MathML parsing 𝔔 assert_true: expected true got false -FAIL MathML parsing 𝔮 assert_true: expected true got false -FAIL MathML parsing ⨌ assert_true: expected true got false -FAIL MathML parsing 𝕢 assert_true: expected true got false -FAIL MathML parsing ℚ assert_true: expected true got false -FAIL MathML parsing ⁗ assert_true: expected true got false -FAIL MathML parsing 𝒬 assert_true: expected true got false -FAIL MathML parsing 𝓆 assert_true: expected true got false -FAIL MathML parsing ℍ assert_true: expected true got false -FAIL MathML parsing ⨖ assert_true: expected true got false -FAIL MathML parsing ? assert_true: expected true got false -FAIL MathML parsing ≟ assert_true: expected true got false -PASS MathML parsing " -FAIL MathML parsing " assert_true: expected true got false -FAIL MathML parsing ⇛ assert_true: expected true got false -FAIL MathML parsing ∽̱ assert_true: expected true got false -FAIL MathML parsing Ŕ assert_true: expected true got false -FAIL MathML parsing ŕ assert_true: expected true got false -FAIL MathML parsing √ assert_true: expected true got false -FAIL MathML parsing ⦳ assert_true: expected true got false -FAIL MathML parsing ⟩ assert_true: expected true got false -FAIL MathML parsing ⟫ assert_true: expected true got false -FAIL MathML parsing ⦒ assert_true: expected true got false -FAIL MathML parsing ⦥ assert_true: expected true got false -FAIL MathML parsing ⟩ assert_true: expected true got false -FAIL MathML parsing » assert_true: expected true got false -FAIL MathML parsing ⥵ assert_true: expected true got false -FAIL MathML parsing ⇥ assert_true: expected true got false -FAIL MathML parsing ⤠ assert_true: expected true got false -FAIL MathML parsing ⤳ assert_true: expected true got false -FAIL MathML parsing → assert_true: expected true got false -FAIL MathML parsing ↠ assert_true: expected true got false -FAIL MathML parsing ⇒ assert_true: expected true got false -FAIL MathML parsing ⤞ assert_true: expected true got false -FAIL MathML parsing ↪ assert_true: expected true got false -FAIL MathML parsing ↬ assert_true: expected true got false -FAIL MathML parsing ⥅ assert_true: expected true got false -FAIL MathML parsing ⥴ assert_true: expected true got false -FAIL MathML parsing ⤖ assert_true: expected true got false -FAIL MathML parsing ↣ assert_true: expected true got false -FAIL MathML parsing ↝ assert_true: expected true got false -FAIL MathML parsing ⤚ assert_true: expected true got false -FAIL MathML parsing ⤜ assert_true: expected true got false -FAIL MathML parsing ∶ assert_true: expected true got false -FAIL MathML parsing ℚ assert_true: expected true got false -FAIL MathML parsing ⤍ assert_true: expected true got false -FAIL MathML parsing ⤏ assert_true: expected true got false -FAIL MathML parsing ⤐ assert_true: expected true got false -FAIL MathML parsing ❳ assert_true: expected true got false -FAIL MathML parsing } assert_true: expected true got false -FAIL MathML parsing ] assert_true: expected true got false -FAIL MathML parsing ⦌ assert_true: expected true got false -FAIL MathML parsing ⦎ assert_true: expected true got false -FAIL MathML parsing ⦐ assert_true: expected true got false -FAIL MathML parsing Ř assert_true: expected true got false -FAIL MathML parsing ř assert_true: expected true got false -FAIL MathML parsing Ŗ assert_true: expected true got false -FAIL MathML parsing ŗ assert_true: expected true got false -FAIL MathML parsing ⌉ assert_true: expected true got false -FAIL MathML parsing } assert_true: expected true got false -FAIL MathML parsing Р assert_true: expected true got false -FAIL MathML parsing р assert_true: expected true got false -FAIL MathML parsing ⤷ assert_true: expected true got false -FAIL MathML parsing ⥩ assert_true: expected true got false -FAIL MathML parsing ” assert_true: expected true got false -FAIL MathML parsing ” assert_true: expected true got false -FAIL MathML parsing ↳ assert_true: expected true got false -FAIL MathML parsing ℜ assert_true: expected true got false -FAIL MathML parsing ℛ assert_true: expected true got false -FAIL MathML parsing ℜ assert_true: expected true got false -FAIL MathML parsing ℝ assert_true: expected true got false -FAIL MathML parsing ℜ assert_true: expected true got false -FAIL MathML parsing ▭ assert_true: expected true got false -FAIL MathML parsing ® assert_true: expected true got false -FAIL MathML parsing ® assert_true: expected true got false -FAIL MathML parsing ∋ assert_true: expected true got false -FAIL MathML parsing ⇋ assert_true: expected true got false -FAIL MathML parsing ⥯ assert_true: expected true got false -FAIL MathML parsing ⥽ assert_true: expected true got false -FAIL MathML parsing ⌋ assert_true: expected true got false -FAIL MathML parsing 𝔯 assert_true: expected true got false -FAIL MathML parsing ℜ assert_true: expected true got false -FAIL MathML parsing ⥤ assert_true: expected true got false -FAIL MathML parsing ⇁ assert_true: expected true got false -FAIL MathML parsing ⇀ assert_true: expected true got false -FAIL MathML parsing ⥬ assert_true: expected true got false -FAIL MathML parsing Ρ assert_true: expected true got false -FAIL MathML parsing ρ assert_true: expected true got false -FAIL MathML parsing ϱ assert_true: expected true got false -FAIL MathML parsing ⟩ assert_true: expected true got false -FAIL MathML parsing ⇥ assert_true: expected true got false -FAIL MathML parsing → assert_true: expected true got false -FAIL MathML parsing → assert_true: expected true got false -FAIL MathML parsing ⇒ assert_true: expected true got false -FAIL MathML parsing ⇄ assert_true: expected true got false -FAIL MathML parsing ↣ assert_true: expected true got false -FAIL MathML parsing ⌉ assert_true: expected true got false -FAIL MathML parsing ⟧ assert_true: expected true got false -FAIL MathML parsing ⥝ assert_true: expected true got false -FAIL MathML parsing ⥕ assert_true: expected true got false -FAIL MathML parsing ⇂ assert_true: expected true got false -FAIL MathML parsing ⌋ assert_true: expected true got false -FAIL MathML parsing ⇁ assert_true: expected true got false -FAIL MathML parsing ⇀ assert_true: expected true got false -FAIL MathML parsing ⇄ assert_true: expected true got false -FAIL MathML parsing ⇌ assert_true: expected true got false -FAIL MathML parsing ⇉ assert_true: expected true got false -FAIL MathML parsing ↝ assert_true: expected true got false -FAIL MathML parsing ↦ assert_true: expected true got false -FAIL MathML parsing ⊢ assert_true: expected true got false -FAIL MathML parsing ⥛ assert_true: expected true got false -FAIL MathML parsing ⋌ assert_true: expected true got false -FAIL MathML parsing ⧐ assert_true: expected true got false -FAIL MathML parsing ⊳ assert_true: expected true got false -FAIL MathML parsing ⊵ assert_true: expected true got false -FAIL MathML parsing ⥏ assert_true: expected true got false -FAIL MathML parsing ⥜ assert_true: expected true got false -FAIL MathML parsing ⥔ assert_true: expected true got false -FAIL MathML parsing ↾ assert_true: expected true got false -FAIL MathML parsing ⥓ assert_true: expected true got false -FAIL MathML parsing ⇀ assert_true: expected true got false -FAIL MathML parsing ˚ assert_true: expected true got false -FAIL MathML parsing ≓ assert_true: expected true got false -FAIL MathML parsing ⇄ assert_true: expected true got false -FAIL MathML parsing ⇌ assert_true: expected true got false -FAIL MathML parsing ‏ assert_true: expected true got false -FAIL MathML parsing ⎱ assert_true: expected true got false -FAIL MathML parsing ⎱ assert_true: expected true got false -FAIL MathML parsing ⫮ assert_true: expected true got false -FAIL MathML parsing ⟭ assert_true: expected true got false -FAIL MathML parsing ⇾ assert_true: expected true got false -FAIL MathML parsing ⟧ assert_true: expected true got false -FAIL MathML parsing ⦆ assert_true: expected true got false -FAIL MathML parsing 𝕣 assert_true: expected true got false -FAIL MathML parsing ℝ assert_true: expected true got false -FAIL MathML parsing ⨮ assert_true: expected true got false -FAIL MathML parsing ⨵ assert_true: expected true got false -FAIL MathML parsing ⥰ assert_true: expected true got false -FAIL MathML parsing ) assert_true: expected true got false -FAIL MathML parsing ⦔ assert_true: expected true got false -FAIL MathML parsing ⨒ assert_true: expected true got false -FAIL MathML parsing ⇉ assert_true: expected true got false -FAIL MathML parsing ⇛ assert_true: expected true got false -FAIL MathML parsing › assert_true: expected true got false -FAIL MathML parsing 𝓇 assert_true: expected true got false -FAIL MathML parsing ℛ assert_true: expected true got false -FAIL MathML parsing ↱ assert_true: expected true got false -FAIL MathML parsing ↱ assert_true: expected true got false -FAIL MathML parsing ] assert_true: expected true got false -FAIL MathML parsing ’ assert_true: expected true got false -FAIL MathML parsing ’ assert_true: expected true got false -FAIL MathML parsing ⋌ assert_true: expected true got false -FAIL MathML parsing ⋊ assert_true: expected true got false -FAIL MathML parsing ▹ assert_true: expected true got false -FAIL MathML parsing ⊵ assert_true: expected true got false -FAIL MathML parsing ▸ assert_true: expected true got false -FAIL MathML parsing ⧎ assert_true: expected true got false -FAIL MathML parsing ⧴ assert_true: expected true got false -FAIL MathML parsing ⥨ assert_true: expected true got false -FAIL MathML parsing ℞ assert_true: expected true got false -FAIL MathML parsing Ś assert_true: expected true got false -FAIL MathML parsing ś assert_true: expected true got false -FAIL MathML parsing ‚ assert_true: expected true got false -FAIL MathML parsing ⪸ assert_true: expected true got false -FAIL MathML parsing Š assert_true: expected true got false -FAIL MathML parsing š assert_true: expected true got false -FAIL MathML parsing ⪼ assert_true: expected true got false -FAIL MathML parsing ≻ assert_true: expected true got false -FAIL MathML parsing ≽ assert_true: expected true got false -FAIL MathML parsing ⪰ assert_true: expected true got false -FAIL MathML parsing ⪴ assert_true: expected true got false -FAIL MathML parsing Ş assert_true: expected true got false -FAIL MathML parsing ş assert_true: expected true got false -FAIL MathML parsing Ŝ assert_true: expected true got false -FAIL MathML parsing ŝ assert_true: expected true got false -FAIL MathML parsing ⪺ assert_true: expected true got false -FAIL MathML parsing ⪶ assert_true: expected true got false -FAIL MathML parsing ⋩ assert_true: expected true got false -FAIL MathML parsing ⨓ assert_true: expected true got false -FAIL MathML parsing ≿ assert_true: expected true got false -FAIL MathML parsing С assert_true: expected true got false -FAIL MathML parsing с assert_true: expected true got false -FAIL MathML parsing ⊡ assert_true: expected true got false -FAIL MathML parsing ⋅ assert_true: expected true got false -FAIL MathML parsing ⩦ assert_true: expected true got false -FAIL MathML parsing ⤥ assert_true: expected true got false -FAIL MathML parsing ↘ assert_true: expected true got false -FAIL MathML parsing ⇘ assert_true: expected true got false -FAIL MathML parsing ↘ assert_true: expected true got false -FAIL MathML parsing § assert_true: expected true got false -FAIL MathML parsing ; assert_true: expected true got false -FAIL MathML parsing ⤩ assert_true: expected true got false -FAIL MathML parsing ∖ assert_true: expected true got false -FAIL MathML parsing ∖ assert_true: expected true got false -FAIL MathML parsing ✶ assert_true: expected true got false -FAIL MathML parsing 𝔖 assert_true: expected true got false -FAIL MathML parsing 𝔰 assert_true: expected true got false -FAIL MathML parsing ⌢ assert_true: expected true got false -FAIL MathML parsing ♯ assert_true: expected true got false -FAIL MathML parsing Щ assert_true: expected true got false -FAIL MathML parsing щ assert_true: expected true got false -FAIL MathML parsing Ш assert_true: expected true got false -FAIL MathML parsing ш assert_true: expected true got false -FAIL MathML parsing ↓ assert_true: expected true got false -FAIL MathML parsing ← assert_true: expected true got false -FAIL MathML parsing ∣ assert_true: expected true got false -FAIL MathML parsing ∥ assert_true: expected true got false -FAIL MathML parsing → assert_true: expected true got false -FAIL MathML parsing ↑ assert_true: expected true got false -FAIL MathML parsing ­ assert_true: expected true got false -FAIL MathML parsing Σ assert_true: expected true got false -FAIL MathML parsing σ assert_true: expected true got false -FAIL MathML parsing ς assert_true: expected true got false -FAIL MathML parsing ς assert_true: expected true got false -FAIL MathML parsing ∼ assert_true: expected true got false -FAIL MathML parsing ⩪ assert_true: expected true got false -FAIL MathML parsing ≃ assert_true: expected true got false -FAIL MathML parsing ≃ assert_true: expected true got false -FAIL MathML parsing ⪞ assert_true: expected true got false -FAIL MathML parsing ⪠ assert_true: expected true got false -FAIL MathML parsing ⪝ assert_true: expected true got false -FAIL MathML parsing ⪟ assert_true: expected true got false -FAIL MathML parsing ≆ assert_true: expected true got false -FAIL MathML parsing ⨤ assert_true: expected true got false -FAIL MathML parsing ⥲ assert_true: expected true got false -FAIL MathML parsing ← assert_true: expected true got false -FAIL MathML parsing ∘ assert_true: expected true got false -FAIL MathML parsing ∖ assert_true: expected true got false -FAIL MathML parsing ⨳ assert_true: expected true got false -FAIL MathML parsing ⧤ assert_true: expected true got false -FAIL MathML parsing ∣ assert_true: expected true got false -FAIL MathML parsing ⌣ assert_true: expected true got false -FAIL MathML parsing ⪪ assert_true: expected true got false -FAIL MathML parsing ⪬ assert_true: expected true got false -FAIL MathML parsing ⪬︀ assert_true: expected true got false -FAIL MathML parsing Ь assert_true: expected true got false -FAIL MathML parsing ь assert_true: expected true got false -FAIL MathML parsing ⌿ assert_true: expected true got false -FAIL MathML parsing ⧄ assert_true: expected true got false -FAIL MathML parsing / assert_true: expected true got false -FAIL MathML parsing 𝕊 assert_true: expected true got false -FAIL MathML parsing 𝕤 assert_true: expected true got false -FAIL MathML parsing ♠ assert_true: expected true got false -FAIL MathML parsing ♠ assert_true: expected true got false -FAIL MathML parsing ∥ assert_true: expected true got false -FAIL MathML parsing ⊓ assert_true: expected true got false -FAIL MathML parsing ⊓︀ assert_true: expected true got false -FAIL MathML parsing ⊔ assert_true: expected true got false -FAIL MathML parsing ⊔︀ assert_true: expected true got false -FAIL MathML parsing √ assert_true: expected true got false -FAIL MathML parsing ⊏ assert_true: expected true got false -FAIL MathML parsing ⊑ assert_true: expected true got false -FAIL MathML parsing ⊏ assert_true: expected true got false -FAIL MathML parsing ⊑ assert_true: expected true got false -FAIL MathML parsing ⊐ assert_true: expected true got false -FAIL MathML parsing ⊒ assert_true: expected true got false -FAIL MathML parsing ⊐ assert_true: expected true got false -FAIL MathML parsing ⊒ assert_true: expected true got false -FAIL MathML parsing □ assert_true: expected true got false -FAIL MathML parsing □ assert_true: expected true got false -FAIL MathML parsing ⊓ assert_true: expected true got false -FAIL MathML parsing ⊏ assert_true: expected true got false -FAIL MathML parsing ⊑ assert_true: expected true got false -FAIL MathML parsing ⊐ assert_true: expected true got false -FAIL MathML parsing ⊒ assert_true: expected true got false -FAIL MathML parsing ⊔ assert_true: expected true got false -FAIL MathML parsing ▪ assert_true: expected true got false -FAIL MathML parsing □ assert_true: expected true got false -FAIL MathML parsing ▪ assert_true: expected true got false -FAIL MathML parsing → assert_true: expected true got false -FAIL MathML parsing 𝒮 assert_true: expected true got false -FAIL MathML parsing 𝓈 assert_true: expected true got false -FAIL MathML parsing ∖ assert_true: expected true got false -FAIL MathML parsing ⌣ assert_true: expected true got false -FAIL MathML parsing ⋆ assert_true: expected true got false -FAIL MathML parsing ⋆ assert_true: expected true got false -FAIL MathML parsing ☆ assert_true: expected true got false -FAIL MathML parsing ★ assert_true: expected true got false -FAIL MathML parsing ϵ assert_true: expected true got false -FAIL MathML parsing ϕ assert_true: expected true got false -FAIL MathML parsing ¯ assert_true: expected true got false -FAIL MathML parsing ⊂ assert_true: expected true got false -FAIL MathML parsing ⋐ assert_true: expected true got false -FAIL MathML parsing ⪽ assert_true: expected true got false -FAIL MathML parsing ⫅ assert_true: expected true got false -FAIL MathML parsing ⊆ assert_true: expected true got false -FAIL MathML parsing ⫃ assert_true: expected true got false -FAIL MathML parsing ⫁ assert_true: expected true got false -FAIL MathML parsing ⫋ assert_true: expected true got false -FAIL MathML parsing ⊊ assert_true: expected true got false -FAIL MathML parsing ⪿ assert_true: expected true got false -FAIL MathML parsing ⥹ assert_true: expected true got false -FAIL MathML parsing ⊂ assert_true: expected true got false -FAIL MathML parsing ⋐ assert_true: expected true got false -FAIL MathML parsing ⊆ assert_true: expected true got false -FAIL MathML parsing ⫅ assert_true: expected true got false -FAIL MathML parsing ⊆ assert_true: expected true got false -FAIL MathML parsing ⊊ assert_true: expected true got false -FAIL MathML parsing ⫋ assert_true: expected true got false -FAIL MathML parsing ⫇ assert_true: expected true got false -FAIL MathML parsing ⫕ assert_true: expected true got false -FAIL MathML parsing ⫓ assert_true: expected true got false -FAIL MathML parsing ⪸ assert_true: expected true got false -FAIL MathML parsing ≻ assert_true: expected true got false -FAIL MathML parsing ≽ assert_true: expected true got false -FAIL MathML parsing ≻ assert_true: expected true got false -FAIL MathML parsing ⪰ assert_true: expected true got false -FAIL MathML parsing ≽ assert_true: expected true got false -FAIL MathML parsing ≿ assert_true: expected true got false -FAIL MathML parsing ⪰ assert_true: expected true got false -FAIL MathML parsing ⪺ assert_true: expected true got false -FAIL MathML parsing ⪶ assert_true: expected true got false -FAIL MathML parsing ⋩ assert_true: expected true got false -FAIL MathML parsing ≿ assert_true: expected true got false -FAIL MathML parsing ∋ assert_true: expected true got false -FAIL MathML parsing ∑ assert_true: expected true got false -FAIL MathML parsing ∑ assert_true: expected true got false -FAIL MathML parsing ♪ assert_true: expected true got false -FAIL MathML parsing ¹ assert_true: expected true got false -FAIL MathML parsing ² assert_true: expected true got false -FAIL MathML parsing ³ assert_true: expected true got false -FAIL MathML parsing ⊃ assert_true: expected true got false -FAIL MathML parsing ⋑ assert_true: expected true got false -FAIL MathML parsing ⪾ assert_true: expected true got false -FAIL MathML parsing ⫘ assert_true: expected true got false -FAIL MathML parsing ⫆ assert_true: expected true got false -FAIL MathML parsing ⊇ assert_true: expected true got false -FAIL MathML parsing ⫄ assert_true: expected true got false -FAIL MathML parsing ⊃ assert_true: expected true got false -FAIL MathML parsing ⊇ assert_true: expected true got false -FAIL MathML parsing ⟉ assert_true: expected true got false -FAIL MathML parsing ⫗ assert_true: expected true got false -FAIL MathML parsing ⥻ assert_true: expected true got false -FAIL MathML parsing ⫂ assert_true: expected true got false -FAIL MathML parsing ⫌ assert_true: expected true got false -FAIL MathML parsing ⊋ assert_true: expected true got false -FAIL MathML parsing ⫀ assert_true: expected true got false -FAIL MathML parsing ⊃ assert_true: expected true got false -FAIL MathML parsing ⋑ assert_true: expected true got false -FAIL MathML parsing ⊇ assert_true: expected true got false -FAIL MathML parsing ⫆ assert_true: expected true got false -FAIL MathML parsing ⊋ assert_true: expected true got false -FAIL MathML parsing ⫌ assert_true: expected true got false -FAIL MathML parsing ⫈ assert_true: expected true got false -FAIL MathML parsing ⫔ assert_true: expected true got false -FAIL MathML parsing ⫖ assert_true: expected true got false -FAIL MathML parsing ⤦ assert_true: expected true got false -FAIL MathML parsing ↙ assert_true: expected true got false -FAIL MathML parsing ⇙ assert_true: expected true got false -FAIL MathML parsing ↙ assert_true: expected true got false -FAIL MathML parsing ⤪ assert_true: expected true got false -FAIL MathML parsing ß assert_true: expected true got false -FAIL MathML parsing 	 assert_true: expected true got false -FAIL MathML parsing ⌖ assert_true: expected true got false -FAIL MathML parsing Τ assert_true: expected true got false -FAIL MathML parsing τ assert_true: expected true got false -FAIL MathML parsing ⎴ assert_true: expected true got false -FAIL MathML parsing Ť assert_true: expected true got false -FAIL MathML parsing ť assert_true: expected true got false -FAIL MathML parsing Ţ assert_true: expected true got false -FAIL MathML parsing ţ assert_true: expected true got false -FAIL MathML parsing Т assert_true: expected true got false -FAIL MathML parsing т assert_true: expected true got false -FAIL MathML parsing ⃛ assert_true: expected true got false -FAIL MathML parsing ⌕ assert_true: expected true got false -FAIL MathML parsing 𝔗 assert_true: expected true got false -FAIL MathML parsing 𝔱 assert_true: expected true got false -FAIL MathML parsing ∴ assert_true: expected true got false -FAIL MathML parsing ∴ assert_true: expected true got false -FAIL MathML parsing ∴ assert_true: expected true got false -FAIL MathML parsing Θ assert_true: expected true got false -FAIL MathML parsing θ assert_true: expected true got false -FAIL MathML parsing ϑ assert_true: expected true got false -FAIL MathML parsing ϑ assert_true: expected true got false -FAIL MathML parsing ≈ assert_true: expected true got false -FAIL MathML parsing ∼ assert_true: expected true got false -FAIL MathML parsing    assert_true: expected true got false -FAIL MathML parsing   assert_true: expected true got false -FAIL MathML parsing   assert_true: expected true got false -FAIL MathML parsing ≈ assert_true: expected true got false -FAIL MathML parsing ∼ assert_true: expected true got false -FAIL MathML parsing Þ assert_true: expected true got false -FAIL MathML parsing þ assert_true: expected true got false -FAIL MathML parsing ˜ assert_true: expected true got false -FAIL MathML parsing ∼ assert_true: expected true got false -FAIL MathML parsing ≃ assert_true: expected true got false -FAIL MathML parsing ≅ assert_true: expected true got false -FAIL MathML parsing ≈ assert_true: expected true got false -FAIL MathML parsing ⨱ assert_true: expected true got false -FAIL MathML parsing ⊠ assert_true: expected true got false -FAIL MathML parsing × assert_true: expected true got false -FAIL MathML parsing ⨰ assert_true: expected true got false -FAIL MathML parsing ∭ assert_true: expected true got false -FAIL MathML parsing ⤨ assert_true: expected true got false -FAIL MathML parsing ⌶ assert_true: expected true got false -FAIL MathML parsing ⫱ assert_true: expected true got false -FAIL MathML parsing ⊤ assert_true: expected true got false -FAIL MathML parsing 𝕋 assert_true: expected true got false -FAIL MathML parsing 𝕥 assert_true: expected true got false -FAIL MathML parsing ⫚ assert_true: expected true got false -FAIL MathML parsing ⤩ assert_true: expected true got false -FAIL MathML parsing ‴ assert_true: expected true got false -FAIL MathML parsing ™ assert_true: expected true got false -FAIL MathML parsing ™ assert_true: expected true got false -FAIL MathML parsing ▵ assert_true: expected true got false -FAIL MathML parsing ▿ assert_true: expected true got false -FAIL MathML parsing ◃ assert_true: expected true got false -FAIL MathML parsing ⊴ assert_true: expected true got false -FAIL MathML parsing ≜ assert_true: expected true got false -FAIL MathML parsing ▹ assert_true: expected true got false -FAIL MathML parsing ⊵ assert_true: expected true got false -FAIL MathML parsing ◬ assert_true: expected true got false -FAIL MathML parsing ≜ assert_true: expected true got false -FAIL MathML parsing ⨺ assert_true: expected true got false -FAIL MathML parsing ⃛ assert_true: expected true got false -FAIL MathML parsing ⨹ assert_true: expected true got false -FAIL MathML parsing ⧍ assert_true: expected true got false -FAIL MathML parsing ⨻ assert_true: expected true got false -FAIL MathML parsing ⏢ assert_true: expected true got false -FAIL MathML parsing 𝒯 assert_true: expected true got false -FAIL MathML parsing 𝓉 assert_true: expected true got false -FAIL MathML parsing Ц assert_true: expected true got false -FAIL MathML parsing ц assert_true: expected true got false -FAIL MathML parsing Ћ assert_true: expected true got false -FAIL MathML parsing ћ assert_true: expected true got false -FAIL MathML parsing Ŧ assert_true: expected true got false -FAIL MathML parsing ŧ assert_true: expected true got false -FAIL MathML parsing ≬ assert_true: expected true got false -FAIL MathML parsing ↞ assert_true: expected true got false -FAIL MathML parsing ↠ assert_true: expected true got false -FAIL MathML parsing Ú assert_true: expected true got false -FAIL MathML parsing ú assert_true: expected true got false -FAIL MathML parsing ↑ assert_true: expected true got false -FAIL MathML parsing ↟ assert_true: expected true got false -FAIL MathML parsing ⇑ assert_true: expected true got false -FAIL MathML parsing ⥉ assert_true: expected true got false -FAIL MathML parsing Ў assert_true: expected true got false -FAIL MathML parsing ў assert_true: expected true got false -FAIL MathML parsing Ŭ assert_true: expected true got false -FAIL MathML parsing ŭ assert_true: expected true got false -FAIL MathML parsing Û assert_true: expected true got false -FAIL MathML parsing û assert_true: expected true got false -FAIL MathML parsing У assert_true: expected true got false -FAIL MathML parsing у assert_true: expected true got false -FAIL MathML parsing ⇅ assert_true: expected true got false -FAIL MathML parsing Ű assert_true: expected true got false -FAIL MathML parsing ű assert_true: expected true got false -FAIL MathML parsing ⥮ assert_true: expected true got false -FAIL MathML parsing ⥾ assert_true: expected true got false -FAIL MathML parsing 𝔘 assert_true: expected true got false -FAIL MathML parsing 𝔲 assert_true: expected true got false -FAIL MathML parsing Ù assert_true: expected true got false -FAIL MathML parsing ù assert_true: expected true got false -FAIL MathML parsing ⥣ assert_true: expected true got false -FAIL MathML parsing ↿ assert_true: expected true got false -FAIL MathML parsing ↾ assert_true: expected true got false -FAIL MathML parsing ▀ assert_true: expected true got false -FAIL MathML parsing ⌜ assert_true: expected true got false -FAIL MathML parsing ⌜ assert_true: expected true got false -FAIL MathML parsing ⌏ assert_true: expected true got false -FAIL MathML parsing ◸ assert_true: expected true got false -FAIL MathML parsing Ū assert_true: expected true got false -FAIL MathML parsing ū assert_true: expected true got false -FAIL MathML parsing ¨ assert_true: expected true got false -FAIL MathML parsing _ assert_true: expected true got false -FAIL MathML parsing ⏟ assert_true: expected true got false -FAIL MathML parsing ⎵ assert_true: expected true got false -FAIL MathML parsing ⏝ assert_true: expected true got false -FAIL MathML parsing ⋃ assert_true: expected true got false -FAIL MathML parsing ⊎ assert_true: expected true got false -FAIL MathML parsing Ų assert_true: expected true got false -FAIL MathML parsing ų assert_true: expected true got false -FAIL MathML parsing 𝕌 assert_true: expected true got false -FAIL MathML parsing 𝕦 assert_true: expected true got false -FAIL MathML parsing ⤒ assert_true: expected true got false -FAIL MathML parsing ↑ assert_true: expected true got false -FAIL MathML parsing ↑ assert_true: expected true got false -FAIL MathML parsing ⇑ assert_true: expected true got false -FAIL MathML parsing ⇅ assert_true: expected true got false -FAIL MathML parsing ↕ assert_true: expected true got false -FAIL MathML parsing ↕ assert_true: expected true got false -FAIL MathML parsing ⇕ assert_true: expected true got false -FAIL MathML parsing ⥮ assert_true: expected true got false -FAIL MathML parsing ↿ assert_true: expected true got false -FAIL MathML parsing ↾ assert_true: expected true got false -FAIL MathML parsing ⊎ assert_true: expected true got false -FAIL MathML parsing ↖ assert_true: expected true got false -FAIL MathML parsing ↗ assert_true: expected true got false -FAIL MathML parsing υ assert_true: expected true got false -FAIL MathML parsing ϒ assert_true: expected true got false -FAIL MathML parsing ϒ assert_true: expected true got false -FAIL MathML parsing Υ assert_true: expected true got false -FAIL MathML parsing υ assert_true: expected true got false -FAIL MathML parsing ↥ assert_true: expected true got false -FAIL MathML parsing ⊥ assert_true: expected true got false -FAIL MathML parsing ⇈ assert_true: expected true got false -FAIL MathML parsing ⌝ assert_true: expected true got false -FAIL MathML parsing ⌝ assert_true: expected true got false -FAIL MathML parsing ⌎ assert_true: expected true got false -FAIL MathML parsing Ů assert_true: expected true got false -FAIL MathML parsing ů assert_true: expected true got false -FAIL MathML parsing ◹ assert_true: expected true got false -FAIL MathML parsing 𝒰 assert_true: expected true got false -FAIL MathML parsing 𝓊 assert_true: expected true got false -FAIL MathML parsing ⋰ assert_true: expected true got false -FAIL MathML parsing Ũ assert_true: expected true got false -FAIL MathML parsing ũ assert_true: expected true got false -FAIL MathML parsing ▵ assert_true: expected true got false -FAIL MathML parsing ▴ assert_true: expected true got false -FAIL MathML parsing ⇈ assert_true: expected true got false -FAIL MathML parsing Ü assert_true: expected true got false -FAIL MathML parsing ü assert_true: expected true got false -FAIL MathML parsing ⦧ assert_true: expected true got false -FAIL MathML parsing ⦜ assert_true: expected true got false -FAIL MathML parsing ϵ assert_true: expected true got false -FAIL MathML parsing ϰ assert_true: expected true got false -FAIL MathML parsing ∅ assert_true: expected true got false -FAIL MathML parsing ϕ assert_true: expected true got false -FAIL MathML parsing ϖ assert_true: expected true got false -FAIL MathML parsing ∝ assert_true: expected true got false -FAIL MathML parsing ↕ assert_true: expected true got false -FAIL MathML parsing ⇕ assert_true: expected true got false -FAIL MathML parsing ϱ assert_true: expected true got false -FAIL MathML parsing ς assert_true: expected true got false -FAIL MathML parsing ⊊︀ assert_true: expected true got false -FAIL MathML parsing ⫋︀ assert_true: expected true got false -FAIL MathML parsing ⊋︀ assert_true: expected true got false -FAIL MathML parsing ⫌︀ assert_true: expected true got false -FAIL MathML parsing ϑ assert_true: expected true got false -FAIL MathML parsing ⊲ assert_true: expected true got false -FAIL MathML parsing ⊳ assert_true: expected true got false -FAIL MathML parsing ⫨ assert_true: expected true got false -FAIL MathML parsing ⫫ assert_true: expected true got false -FAIL MathML parsing ⫩ assert_true: expected true got false -FAIL MathML parsing В assert_true: expected true got false -FAIL MathML parsing в assert_true: expected true got false -FAIL MathML parsing ⊢ assert_true: expected true got false -FAIL MathML parsing ⊨ assert_true: expected true got false -FAIL MathML parsing ⊩ assert_true: expected true got false -FAIL MathML parsing ⊫ assert_true: expected true got false -FAIL MathML parsing ⫦ assert_true: expected true got false -FAIL MathML parsing ⊻ assert_true: expected true got false -FAIL MathML parsing ∨ assert_true: expected true got false -FAIL MathML parsing ⋁ assert_true: expected true got false -FAIL MathML parsing ≚ assert_true: expected true got false -FAIL MathML parsing ⋮ assert_true: expected true got false -FAIL MathML parsing | assert_true: expected true got false -FAIL MathML parsing ‖ assert_true: expected true got false -FAIL MathML parsing | assert_true: expected true got false -FAIL MathML parsing ‖ assert_true: expected true got false -FAIL MathML parsing ∣ assert_true: expected true got false -FAIL MathML parsing | assert_true: expected true got false -FAIL MathML parsing ❘ assert_true: expected true got false -FAIL MathML parsing ≀ assert_true: expected true got false -FAIL MathML parsing   assert_true: expected true got false -FAIL MathML parsing 𝔙 assert_true: expected true got false -FAIL MathML parsing 𝔳 assert_true: expected true got false -FAIL MathML parsing ⊲ assert_true: expected true got false -FAIL MathML parsing ⊂⃒ assert_true: expected true got false -FAIL MathML parsing ⊃⃒ assert_true: expected true got false -FAIL MathML parsing 𝕍 assert_true: expected true got false -FAIL MathML parsing 𝕧 assert_true: expected true got false -FAIL MathML parsing ∝ assert_true: expected true got false -FAIL MathML parsing ⊳ assert_true: expected true got false -FAIL MathML parsing 𝒱 assert_true: expected true got false -FAIL MathML parsing 𝓋 assert_true: expected true got false -FAIL MathML parsing ⫋︀ assert_true: expected true got false -FAIL MathML parsing ⊊︀ assert_true: expected true got false -FAIL MathML parsing ⫌︀ assert_true: expected true got false -FAIL MathML parsing ⊋︀ assert_true: expected true got false -FAIL MathML parsing ⊪ assert_true: expected true got false -FAIL MathML parsing ⦚ assert_true: expected true got false -FAIL MathML parsing Ŵ assert_true: expected true got false -FAIL MathML parsing ŵ assert_true: expected true got false -FAIL MathML parsing ⩟ assert_true: expected true got false -FAIL MathML parsing ∧ assert_true: expected true got false -FAIL MathML parsing ⋀ assert_true: expected true got false -FAIL MathML parsing ≙ assert_true: expected true got false -FAIL MathML parsing ℘ assert_true: expected true got false -FAIL MathML parsing 𝔚 assert_true: expected true got false -FAIL MathML parsing 𝔴 assert_true: expected true got false -FAIL MathML parsing 𝕎 assert_true: expected true got false -FAIL MathML parsing 𝕨 assert_true: expected true got false -FAIL MathML parsing ℘ assert_true: expected true got false -FAIL MathML parsing ≀ assert_true: expected true got false -FAIL MathML parsing ≀ assert_true: expected true got false -FAIL MathML parsing 𝒲 assert_true: expected true got false -FAIL MathML parsing 𝓌 assert_true: expected true got false -FAIL MathML parsing ⋂ assert_true: expected true got false -FAIL MathML parsing ◯ assert_true: expected true got false -FAIL MathML parsing ⋃ assert_true: expected true got false -FAIL MathML parsing ▽ assert_true: expected true got false -FAIL MathML parsing 𝔛 assert_true: expected true got false -FAIL MathML parsing 𝔵 assert_true: expected true got false -FAIL MathML parsing ⟷ assert_true: expected true got false -FAIL MathML parsing ⟺ assert_true: expected true got false -FAIL MathML parsing Ξ assert_true: expected true got false -FAIL MathML parsing ξ assert_true: expected true got false -FAIL MathML parsing ⟵ assert_true: expected true got false -FAIL MathML parsing ⟸ assert_true: expected true got false -FAIL MathML parsing ⟼ assert_true: expected true got false -FAIL MathML parsing ⋻ assert_true: expected true got false -FAIL MathML parsing ⨀ assert_true: expected true got false -FAIL MathML parsing 𝕏 assert_true: expected true got false -FAIL MathML parsing 𝕩 assert_true: expected true got false -FAIL MathML parsing ⨁ assert_true: expected true got false -FAIL MathML parsing ⨂ assert_true: expected true got false -FAIL MathML parsing ⟶ assert_true: expected true got false -FAIL MathML parsing ⟹ assert_true: expected true got false -FAIL MathML parsing 𝒳 assert_true: expected true got false -FAIL MathML parsing 𝓍 assert_true: expected true got false -FAIL MathML parsing ⨆ assert_true: expected true got false -FAIL MathML parsing ⨄ assert_true: expected true got false -FAIL MathML parsing △ assert_true: expected true got false -FAIL MathML parsing ⋁ assert_true: expected true got false -FAIL MathML parsing ⋀ assert_true: expected true got false -FAIL MathML parsing Ý assert_true: expected true got false -FAIL MathML parsing ý assert_true: expected true got false -FAIL MathML parsing Я assert_true: expected true got false -FAIL MathML parsing я assert_true: expected true got false -FAIL MathML parsing Ŷ assert_true: expected true got false -FAIL MathML parsing ŷ assert_true: expected true got false -FAIL MathML parsing Ы assert_true: expected true got false -FAIL MathML parsing ы assert_true: expected true got false -FAIL MathML parsing ¥ assert_true: expected true got false -FAIL MathML parsing 𝔜 assert_true: expected true got false -FAIL MathML parsing 𝔶 assert_true: expected true got false -FAIL MathML parsing Ї assert_true: expected true got false -FAIL MathML parsing ї assert_true: expected true got false -FAIL MathML parsing 𝕐 assert_true: expected true got false -FAIL MathML parsing 𝕪 assert_true: expected true got false -FAIL MathML parsing 𝒴 assert_true: expected true got false -FAIL MathML parsing 𝓎 assert_true: expected true got false -FAIL MathML parsing Ю assert_true: expected true got false -FAIL MathML parsing ю assert_true: expected true got false -FAIL MathML parsing ÿ assert_true: expected true got false -FAIL MathML parsing Ÿ assert_true: expected true got false -FAIL MathML parsing Ź assert_true: expected true got false -FAIL MathML parsing ź assert_true: expected true got false -FAIL MathML parsing Ž assert_true: expected true got false -FAIL MathML parsing ž assert_true: expected true got false -FAIL MathML parsing З assert_true: expected true got false -FAIL MathML parsing з assert_true: expected true got false -FAIL MathML parsing Ż assert_true: expected true got false -FAIL MathML parsing ż assert_true: expected true got false -FAIL MathML parsing ℨ assert_true: expected true got false -FAIL MathML parsing ​ assert_true: expected true got false -FAIL MathML parsing Ζ assert_true: expected true got false -FAIL MathML parsing ζ assert_true: expected true got false -FAIL MathML parsing 𝔷 assert_true: expected true got false -FAIL MathML parsing ℨ assert_true: expected true got false -FAIL MathML parsing Ж assert_true: expected true got false -FAIL MathML parsing ж assert_true: expected true got false -FAIL MathML parsing ⇝ assert_true: expected true got false -FAIL MathML parsing 𝕫 assert_true: expected true got false -FAIL MathML parsing ℤ assert_true: expected true got false -FAIL MathML parsing 𝒵 assert_true: expected true got false -FAIL MathML parsing 𝓏 assert_true: expected true got false -FAIL MathML parsing ‍ assert_true: expected true got false -FAIL MathML parsing ‌ assert_true: expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-9-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-9-expected.txt deleted file mode 100644 index 29ed1b1..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-9-expected.txt +++ /dev/null
@@ -1,2129 +0,0 @@ -This is a testharness.js-based test. -Found 2125 tests; 2122 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS XHTML Mobile parsing Á -PASS XHTML Mobile parsing á -PASS XHTML Mobile parsing Ă -PASS XHTML Mobile parsing ă -PASS XHTML Mobile parsing ∾ -PASS XHTML Mobile parsing ∿ -PASS XHTML Mobile parsing ∾̳ -PASS XHTML Mobile parsing  -PASS XHTML Mobile parsing â -PASS XHTML Mobile parsing ´ -PASS XHTML Mobile parsing А -PASS XHTML Mobile parsing а -PASS XHTML Mobile parsing Æ -PASS XHTML Mobile parsing æ -PASS XHTML Mobile parsing ⁡ -PASS XHTML Mobile parsing 𝔄 -PASS XHTML Mobile parsing 𝔞 -PASS XHTML Mobile parsing À -PASS XHTML Mobile parsing à -PASS XHTML Mobile parsing ℵ -PASS XHTML Mobile parsing ℵ -PASS XHTML Mobile parsing Α -PASS XHTML Mobile parsing α -PASS XHTML Mobile parsing Ā -PASS XHTML Mobile parsing ā -PASS XHTML Mobile parsing ⨿ -PASS XHTML Mobile parsing & -FAIL XHTML Mobile parsing & assert_true: expected true got false -PASS XHTML Mobile parsing ⩕ -PASS XHTML Mobile parsing ⩓ -PASS XHTML Mobile parsing ∧ -PASS XHTML Mobile parsing ⩜ -PASS XHTML Mobile parsing ⩘ -PASS XHTML Mobile parsing ⩚ -PASS XHTML Mobile parsing ∠ -PASS XHTML Mobile parsing ⦤ -PASS XHTML Mobile parsing ∠ -PASS XHTML Mobile parsing ⦨ -PASS XHTML Mobile parsing ⦩ -PASS XHTML Mobile parsing ⦪ -PASS XHTML Mobile parsing ⦫ -PASS XHTML Mobile parsing ⦬ -PASS XHTML Mobile parsing ⦭ -PASS XHTML Mobile parsing ⦮ -PASS XHTML Mobile parsing ⦯ -PASS XHTML Mobile parsing ∡ -PASS XHTML Mobile parsing ∟ -PASS XHTML Mobile parsing ⊾ -PASS XHTML Mobile parsing ⦝ -PASS XHTML Mobile parsing ∢ -PASS XHTML Mobile parsing Å -PASS XHTML Mobile parsing ⍼ -PASS XHTML Mobile parsing Ą -PASS XHTML Mobile parsing ą -PASS XHTML Mobile parsing 𝔸 -PASS XHTML Mobile parsing 𝕒 -PASS XHTML Mobile parsing ⩯ -PASS XHTML Mobile parsing ≈ -PASS XHTML Mobile parsing ⩰ -PASS XHTML Mobile parsing ≊ -PASS XHTML Mobile parsing ≋ -PASS XHTML Mobile parsing ' -PASS XHTML Mobile parsing ⁡ -PASS XHTML Mobile parsing ≈ -PASS XHTML Mobile parsing ≊ -PASS XHTML Mobile parsing Å -PASS XHTML Mobile parsing å -PASS XHTML Mobile parsing 𝒜 -PASS XHTML Mobile parsing 𝒶 -PASS XHTML Mobile parsing ≔ -PASS XHTML Mobile parsing * -PASS XHTML Mobile parsing ≈ -PASS XHTML Mobile parsing ≍ -PASS XHTML Mobile parsing à -PASS XHTML Mobile parsing ã -PASS XHTML Mobile parsing Ä -PASS XHTML Mobile parsing ä -PASS XHTML Mobile parsing ∳ -PASS XHTML Mobile parsing ⨑ -PASS XHTML Mobile parsing ≌ -PASS XHTML Mobile parsing ϶ -PASS XHTML Mobile parsing ‵ -PASS XHTML Mobile parsing ∽ -PASS XHTML Mobile parsing ⋍ -PASS XHTML Mobile parsing ∖ -PASS XHTML Mobile parsing ⫧ -PASS XHTML Mobile parsing ⊽ -PASS XHTML Mobile parsing ⌅ -PASS XHTML Mobile parsing ⌆ -PASS XHTML Mobile parsing ⌅ -PASS XHTML Mobile parsing ⎵ -PASS XHTML Mobile parsing ⎶ -PASS XHTML Mobile parsing ≌ -PASS XHTML Mobile parsing Б -PASS XHTML Mobile parsing б -PASS XHTML Mobile parsing „ -PASS XHTML Mobile parsing ∵ -PASS XHTML Mobile parsing ∵ -PASS XHTML Mobile parsing ∵ -PASS XHTML Mobile parsing ⦰ -PASS XHTML Mobile parsing ϶ -PASS XHTML Mobile parsing ℬ -PASS XHTML Mobile parsing ℬ -PASS XHTML Mobile parsing Β -PASS XHTML Mobile parsing β -PASS XHTML Mobile parsing ℶ -PASS XHTML Mobile parsing ≬ -PASS XHTML Mobile parsing 𝔅 -PASS XHTML Mobile parsing 𝔟 -PASS XHTML Mobile parsing ⋂ -PASS XHTML Mobile parsing ◯ -PASS XHTML Mobile parsing ⋃ -PASS XHTML Mobile parsing ⨀ -PASS XHTML Mobile parsing ⨁ -PASS XHTML Mobile parsing ⨂ -PASS XHTML Mobile parsing ⨆ -PASS XHTML Mobile parsing ★ -PASS XHTML Mobile parsing ▽ -PASS XHTML Mobile parsing △ -PASS XHTML Mobile parsing ⨄ -PASS XHTML Mobile parsing ⋁ -PASS XHTML Mobile parsing ⋀ -PASS XHTML Mobile parsing ⤍ -PASS XHTML Mobile parsing ⧫ -PASS XHTML Mobile parsing ▪ -PASS XHTML Mobile parsing ▴ -PASS XHTML Mobile parsing ▾ -PASS XHTML Mobile parsing ◂ -PASS XHTML Mobile parsing ▸ -PASS XHTML Mobile parsing ␣ -PASS XHTML Mobile parsing ▒ -PASS XHTML Mobile parsing ░ -PASS XHTML Mobile parsing ▓ -PASS XHTML Mobile parsing █ -PASS XHTML Mobile parsing =⃥ -PASS XHTML Mobile parsing ≡⃥ -PASS XHTML Mobile parsing ⫭ -PASS XHTML Mobile parsing ⌐ -PASS XHTML Mobile parsing 𝔹 -PASS XHTML Mobile parsing 𝕓 -PASS XHTML Mobile parsing ⊥ -PASS XHTML Mobile parsing ⊥ -PASS XHTML Mobile parsing ⋈ -PASS XHTML Mobile parsing ⧉ -PASS XHTML Mobile parsing ┐ -PASS XHTML Mobile parsing ╕ -PASS XHTML Mobile parsing ╖ -PASS XHTML Mobile parsing ╗ -PASS XHTML Mobile parsing ┌ -PASS XHTML Mobile parsing ╒ -PASS XHTML Mobile parsing ╓ -PASS XHTML Mobile parsing ╔ -PASS XHTML Mobile parsing ─ -PASS XHTML Mobile parsing ═ -PASS XHTML Mobile parsing ┬ -PASS XHTML Mobile parsing ╤ -PASS XHTML Mobile parsing ╥ -PASS XHTML Mobile parsing ╦ -PASS XHTML Mobile parsing ┴ -PASS XHTML Mobile parsing ╧ -PASS XHTML Mobile parsing ╨ -PASS XHTML Mobile parsing ╩ -PASS XHTML Mobile parsing ⊟ -PASS XHTML Mobile parsing ⊞ -PASS XHTML Mobile parsing ⊠ -PASS XHTML Mobile parsing ┘ -PASS XHTML Mobile parsing ╛ -PASS XHTML Mobile parsing ╜ -PASS XHTML Mobile parsing ╝ -PASS XHTML Mobile parsing └ -PASS XHTML Mobile parsing ╘ -PASS XHTML Mobile parsing ╙ -PASS XHTML Mobile parsing ╚ -PASS XHTML Mobile parsing │ -PASS XHTML Mobile parsing ║ -PASS XHTML Mobile parsing ┼ -PASS XHTML Mobile parsing ╪ -PASS XHTML Mobile parsing ╫ -PASS XHTML Mobile parsing ╬ -PASS XHTML Mobile parsing ┤ -PASS XHTML Mobile parsing ╡ -PASS XHTML Mobile parsing ╢ -PASS XHTML Mobile parsing ╣ -PASS XHTML Mobile parsing ├ -PASS XHTML Mobile parsing ╞ -PASS XHTML Mobile parsing ╟ -PASS XHTML Mobile parsing ╠ -PASS XHTML Mobile parsing ‵ -PASS XHTML Mobile parsing ˘ -PASS XHTML Mobile parsing ˘ -PASS XHTML Mobile parsing ¦ -PASS XHTML Mobile parsing 𝒷 -PASS XHTML Mobile parsing ℬ -PASS XHTML Mobile parsing ⁏ -PASS XHTML Mobile parsing ∽ -PASS XHTML Mobile parsing ⋍ -PASS XHTML Mobile parsing ⧅ -PASS XHTML Mobile parsing \ -PASS XHTML Mobile parsing ⟈ -PASS XHTML Mobile parsing • -PASS XHTML Mobile parsing • -PASS XHTML Mobile parsing ≎ -PASS XHTML Mobile parsing ⪮ -PASS XHTML Mobile parsing ≏ -PASS XHTML Mobile parsing ≎ -PASS XHTML Mobile parsing ≏ -PASS XHTML Mobile parsing Ć -PASS XHTML Mobile parsing ć -PASS XHTML Mobile parsing ⩄ -PASS XHTML Mobile parsing ⩉ -PASS XHTML Mobile parsing ⩋ -PASS XHTML Mobile parsing ∩ -PASS XHTML Mobile parsing ⋒ -PASS XHTML Mobile parsing ⩇ -PASS XHTML Mobile parsing ⩀ -PASS XHTML Mobile parsing ⅅ -PASS XHTML Mobile parsing ∩︀ -PASS XHTML Mobile parsing ⁁ -PASS XHTML Mobile parsing ˇ -PASS XHTML Mobile parsing ℭ -PASS XHTML Mobile parsing ⩍ -PASS XHTML Mobile parsing Č -PASS XHTML Mobile parsing č -PASS XHTML Mobile parsing Ç -PASS XHTML Mobile parsing ç -PASS XHTML Mobile parsing Ĉ -PASS XHTML Mobile parsing ĉ -PASS XHTML Mobile parsing ∰ -PASS XHTML Mobile parsing ⩌ -PASS XHTML Mobile parsing ⩐ -PASS XHTML Mobile parsing Ċ -PASS XHTML Mobile parsing ċ -PASS XHTML Mobile parsing ¸ -PASS XHTML Mobile parsing ¸ -PASS XHTML Mobile parsing ⦲ -PASS XHTML Mobile parsing ¢ -PASS XHTML Mobile parsing · -PASS XHTML Mobile parsing · -PASS XHTML Mobile parsing 𝔠 -PASS XHTML Mobile parsing ℭ -PASS XHTML Mobile parsing Ч -PASS XHTML Mobile parsing ч -PASS XHTML Mobile parsing ✓ -PASS XHTML Mobile parsing ✓ -PASS XHTML Mobile parsing Χ -PASS XHTML Mobile parsing χ -PASS XHTML Mobile parsing ˆ -PASS XHTML Mobile parsing ≗ -PASS XHTML Mobile parsing ↺ -PASS XHTML Mobile parsing ↻ -PASS XHTML Mobile parsing ⊛ -PASS XHTML Mobile parsing ⊚ -PASS XHTML Mobile parsing ⊝ -PASS XHTML Mobile parsing ⊙ -PASS XHTML Mobile parsing ® -PASS XHTML Mobile parsing Ⓢ -PASS XHTML Mobile parsing ⊖ -PASS XHTML Mobile parsing ⊕ -PASS XHTML Mobile parsing ⊗ -PASS XHTML Mobile parsing ○ -PASS XHTML Mobile parsing ⧃ -PASS XHTML Mobile parsing ≗ -PASS XHTML Mobile parsing ⨐ -PASS XHTML Mobile parsing ⫯ -PASS XHTML Mobile parsing ⧂ -PASS XHTML Mobile parsing ∲ -PASS XHTML Mobile parsing ” -PASS XHTML Mobile parsing ’ -PASS XHTML Mobile parsing ♣ -PASS XHTML Mobile parsing ♣ -PASS XHTML Mobile parsing : -PASS XHTML Mobile parsing ∷ -PASS XHTML Mobile parsing ⩴ -PASS XHTML Mobile parsing ≔ -PASS XHTML Mobile parsing ≔ -PASS XHTML Mobile parsing , -PASS XHTML Mobile parsing @ -PASS XHTML Mobile parsing ∁ -PASS XHTML Mobile parsing ∘ -PASS XHTML Mobile parsing ∁ -PASS XHTML Mobile parsing ℂ -PASS XHTML Mobile parsing ≅ -PASS XHTML Mobile parsing ⩭ -PASS XHTML Mobile parsing ≡ -PASS XHTML Mobile parsing ∮ -PASS XHTML Mobile parsing ∯ -PASS XHTML Mobile parsing ∮ -PASS XHTML Mobile parsing 𝕔 -PASS XHTML Mobile parsing ℂ -PASS XHTML Mobile parsing ∐ -PASS XHTML Mobile parsing ∐ -PASS XHTML Mobile parsing © -PASS XHTML Mobile parsing © -PASS XHTML Mobile parsing ℗ -PASS XHTML Mobile parsing ∳ -PASS XHTML Mobile parsing ↵ -PASS XHTML Mobile parsing ✗ -PASS XHTML Mobile parsing ⨯ -PASS XHTML Mobile parsing 𝒞 -PASS XHTML Mobile parsing 𝒸 -PASS XHTML Mobile parsing ⫏ -PASS XHTML Mobile parsing ⫑ -PASS XHTML Mobile parsing ⫐ -PASS XHTML Mobile parsing ⫒ -PASS XHTML Mobile parsing ⋯ -PASS XHTML Mobile parsing ⤸ -PASS XHTML Mobile parsing ⤵ -PASS XHTML Mobile parsing ⋞ -PASS XHTML Mobile parsing ⋟ -PASS XHTML Mobile parsing ↶ -PASS XHTML Mobile parsing ⤽ -PASS XHTML Mobile parsing ⩈ -PASS XHTML Mobile parsing ⩆ -PASS XHTML Mobile parsing ≍ -PASS XHTML Mobile parsing ∪ -PASS XHTML Mobile parsing ⋓ -PASS XHTML Mobile parsing ⩊ -PASS XHTML Mobile parsing ⊍ -PASS XHTML Mobile parsing ⩅ -PASS XHTML Mobile parsing ∪︀ -PASS XHTML Mobile parsing ↷ -PASS XHTML Mobile parsing ⤼ -PASS XHTML Mobile parsing ⋞ -PASS XHTML Mobile parsing ⋟ -PASS XHTML Mobile parsing ⋎ -PASS XHTML Mobile parsing ⋏ -PASS XHTML Mobile parsing ¤ -PASS XHTML Mobile parsing ↶ -PASS XHTML Mobile parsing ↷ -PASS XHTML Mobile parsing ⋎ -PASS XHTML Mobile parsing ⋏ -PASS XHTML Mobile parsing ∲ -PASS XHTML Mobile parsing ∱ -PASS XHTML Mobile parsing ⌭ -PASS XHTML Mobile parsing † -PASS XHTML Mobile parsing ‡ -PASS XHTML Mobile parsing ℸ -PASS XHTML Mobile parsing ↓ -PASS XHTML Mobile parsing ↡ -PASS XHTML Mobile parsing ⇓ -PASS XHTML Mobile parsing ‐ -PASS XHTML Mobile parsing ⫤ -PASS XHTML Mobile parsing ⊣ -PASS XHTML Mobile parsing ⤏ -PASS XHTML Mobile parsing ˝ -PASS XHTML Mobile parsing Ď -PASS XHTML Mobile parsing ď -PASS XHTML Mobile parsing Д -PASS XHTML Mobile parsing д -PASS XHTML Mobile parsing ‡ -PASS XHTML Mobile parsing ⇊ -PASS XHTML Mobile parsing ⅅ -PASS XHTML Mobile parsing ⅆ -PASS XHTML Mobile parsing ⤑ -PASS XHTML Mobile parsing ⩷ -PASS XHTML Mobile parsing ° -PASS XHTML Mobile parsing ∇ -PASS XHTML Mobile parsing Δ -PASS XHTML Mobile parsing δ -PASS XHTML Mobile parsing ⦱ -PASS XHTML Mobile parsing ⥿ -PASS XHTML Mobile parsing 𝔇 -PASS XHTML Mobile parsing 𝔡 -PASS XHTML Mobile parsing ⥥ -PASS XHTML Mobile parsing ⇃ -PASS XHTML Mobile parsing ⇂ -PASS XHTML Mobile parsing ´ -PASS XHTML Mobile parsing ˙ -PASS XHTML Mobile parsing ˝ -PASS XHTML Mobile parsing ` -PASS XHTML Mobile parsing ˜ -PASS XHTML Mobile parsing ⋄ -PASS XHTML Mobile parsing ⋄ -PASS XHTML Mobile parsing ⋄ -PASS XHTML Mobile parsing ♦ -PASS XHTML Mobile parsing ♦ -PASS XHTML Mobile parsing ¨ -PASS XHTML Mobile parsing ⅆ -PASS XHTML Mobile parsing ϝ -PASS XHTML Mobile parsing ⋲ -PASS XHTML Mobile parsing ÷ -PASS XHTML Mobile parsing ÷ -PASS XHTML Mobile parsing ⋇ -PASS XHTML Mobile parsing ⋇ -PASS XHTML Mobile parsing Ђ -PASS XHTML Mobile parsing ђ -PASS XHTML Mobile parsing ⌞ -PASS XHTML Mobile parsing ⌍ -PASS XHTML Mobile parsing $ -PASS XHTML Mobile parsing 𝔻 -PASS XHTML Mobile parsing 𝕕 -PASS XHTML Mobile parsing ¨ -PASS XHTML Mobile parsing ˙ -PASS XHTML Mobile parsing ⃜ -PASS XHTML Mobile parsing ≐ -PASS XHTML Mobile parsing ≑ -PASS XHTML Mobile parsing ≐ -PASS XHTML Mobile parsing ∸ -PASS XHTML Mobile parsing ∔ -PASS XHTML Mobile parsing ⊡ -PASS XHTML Mobile parsing ⌆ -PASS XHTML Mobile parsing ∯ -PASS XHTML Mobile parsing ¨ -PASS XHTML Mobile parsing ⇓ -PASS XHTML Mobile parsing ⇐ -PASS XHTML Mobile parsing ⇔ -PASS XHTML Mobile parsing ⫤ -PASS XHTML Mobile parsing ⟸ -PASS XHTML Mobile parsing ⟺ -PASS XHTML Mobile parsing ⟹ -PASS XHTML Mobile parsing ⇒ -PASS XHTML Mobile parsing ⊨ -PASS XHTML Mobile parsing ⇑ -PASS XHTML Mobile parsing ⇕ -PASS XHTML Mobile parsing ∥ -PASS XHTML Mobile parsing ⤓ -PASS XHTML Mobile parsing ↓ -PASS XHTML Mobile parsing ↓ -PASS XHTML Mobile parsing ⇓ -PASS XHTML Mobile parsing ⇵ -PASS XHTML Mobile parsing ̑ -PASS XHTML Mobile parsing ⇊ -PASS XHTML Mobile parsing ⇃ -PASS XHTML Mobile parsing ⇂ -PASS XHTML Mobile parsing ⥐ -PASS XHTML Mobile parsing ⥞ -PASS XHTML Mobile parsing ⥖ -PASS XHTML Mobile parsing ↽ -PASS XHTML Mobile parsing ⥟ -PASS XHTML Mobile parsing ⥗ -PASS XHTML Mobile parsing ⇁ -PASS XHTML Mobile parsing ↧ -PASS XHTML Mobile parsing ⊤ -PASS XHTML Mobile parsing ⤐ -PASS XHTML Mobile parsing ⌟ -PASS XHTML Mobile parsing ⌌ -PASS XHTML Mobile parsing 𝒟 -PASS XHTML Mobile parsing 𝒹 -PASS XHTML Mobile parsing Ѕ -PASS XHTML Mobile parsing ѕ -PASS XHTML Mobile parsing ⧶ -PASS XHTML Mobile parsing Đ -PASS XHTML Mobile parsing đ -PASS XHTML Mobile parsing ⋱ -PASS XHTML Mobile parsing ▿ -PASS XHTML Mobile parsing ▾ -PASS XHTML Mobile parsing ⇵ -PASS XHTML Mobile parsing ⥯ -PASS XHTML Mobile parsing ⦦ -PASS XHTML Mobile parsing Џ -PASS XHTML Mobile parsing џ -PASS XHTML Mobile parsing ⟿ -PASS XHTML Mobile parsing É -PASS XHTML Mobile parsing é -PASS XHTML Mobile parsing ⩮ -PASS XHTML Mobile parsing Ě -PASS XHTML Mobile parsing ě -PASS XHTML Mobile parsing Ê -PASS XHTML Mobile parsing ê -PASS XHTML Mobile parsing ≖ -PASS XHTML Mobile parsing ≕ -PASS XHTML Mobile parsing Э -PASS XHTML Mobile parsing э -PASS XHTML Mobile parsing ⩷ -PASS XHTML Mobile parsing Ė -PASS XHTML Mobile parsing ė -PASS XHTML Mobile parsing ≑ -PASS XHTML Mobile parsing ⅇ -PASS XHTML Mobile parsing ≒ -PASS XHTML Mobile parsing 𝔈 -PASS XHTML Mobile parsing 𝔢 -PASS XHTML Mobile parsing ⪚ -PASS XHTML Mobile parsing È -PASS XHTML Mobile parsing è -PASS XHTML Mobile parsing ⪖ -PASS XHTML Mobile parsing ⪘ -PASS XHTML Mobile parsing ⪙ -PASS XHTML Mobile parsing ∈ -PASS XHTML Mobile parsing ⏧ -PASS XHTML Mobile parsing ℓ -PASS XHTML Mobile parsing ⪕ -PASS XHTML Mobile parsing ⪗ -PASS XHTML Mobile parsing Ē -PASS XHTML Mobile parsing ē -PASS XHTML Mobile parsing ∅ -PASS XHTML Mobile parsing ∅ -PASS XHTML Mobile parsing ◻ -PASS XHTML Mobile parsing ∅ -PASS XHTML Mobile parsing ▫ -PASS XHTML Mobile parsing   -PASS XHTML Mobile parsing   -PASS XHTML Mobile parsing   -PASS XHTML Mobile parsing Ŋ -PASS XHTML Mobile parsing ŋ -PASS XHTML Mobile parsing   -PASS XHTML Mobile parsing Ę -PASS XHTML Mobile parsing ę -PASS XHTML Mobile parsing 𝔼 -PASS XHTML Mobile parsing 𝕖 -PASS XHTML Mobile parsing ⋕ -PASS XHTML Mobile parsing ⧣ -PASS XHTML Mobile parsing ⩱ -PASS XHTML Mobile parsing ε -PASS XHTML Mobile parsing Ε -PASS XHTML Mobile parsing ε -PASS XHTML Mobile parsing ϵ -PASS XHTML Mobile parsing ≖ -PASS XHTML Mobile parsing ≕ -PASS XHTML Mobile parsing ≂ -PASS XHTML Mobile parsing ⪖ -PASS XHTML Mobile parsing ⪕ -PASS XHTML Mobile parsing ⩵ -PASS XHTML Mobile parsing = -PASS XHTML Mobile parsing ≂ -PASS XHTML Mobile parsing ≟ -PASS XHTML Mobile parsing ⇌ -PASS XHTML Mobile parsing ≡ -PASS XHTML Mobile parsing ⩸ -PASS XHTML Mobile parsing ⧥ -PASS XHTML Mobile parsing ⥱ -PASS XHTML Mobile parsing ≓ -PASS XHTML Mobile parsing ℯ -PASS XHTML Mobile parsing ℰ -PASS XHTML Mobile parsing ≐ -PASS XHTML Mobile parsing ⩳ -PASS XHTML Mobile parsing ≂ -PASS XHTML Mobile parsing Η -PASS XHTML Mobile parsing η -PASS XHTML Mobile parsing Ð -PASS XHTML Mobile parsing ð -PASS XHTML Mobile parsing Ë -PASS XHTML Mobile parsing ë -PASS XHTML Mobile parsing € -PASS XHTML Mobile parsing ! -PASS XHTML Mobile parsing ∃ -PASS XHTML Mobile parsing ∃ -PASS XHTML Mobile parsing ℰ -PASS XHTML Mobile parsing ⅇ -PASS XHTML Mobile parsing ⅇ -PASS XHTML Mobile parsing ≒ -PASS XHTML Mobile parsing Ф -PASS XHTML Mobile parsing ф -PASS XHTML Mobile parsing ♀ -PASS XHTML Mobile parsing ffi -PASS XHTML Mobile parsing ff -PASS XHTML Mobile parsing ffl -PASS XHTML Mobile parsing 𝔉 -PASS XHTML Mobile parsing 𝔣 -PASS XHTML Mobile parsing fi -PASS XHTML Mobile parsing ◼ -PASS XHTML Mobile parsing ▪ -PASS XHTML Mobile parsing fj -PASS XHTML Mobile parsing ♭ -PASS XHTML Mobile parsing fl -PASS XHTML Mobile parsing ▱ -PASS XHTML Mobile parsing ƒ -PASS XHTML Mobile parsing 𝔽 -PASS XHTML Mobile parsing 𝕗 -PASS XHTML Mobile parsing ∀ -PASS XHTML Mobile parsing ∀ -PASS XHTML Mobile parsing ⋔ -PASS XHTML Mobile parsing ⫙ -PASS XHTML Mobile parsing ℱ -PASS XHTML Mobile parsing ⨍ -PASS XHTML Mobile parsing ½ -PASS XHTML Mobile parsing ⅓ -PASS XHTML Mobile parsing ¼ -PASS XHTML Mobile parsing ⅕ -PASS XHTML Mobile parsing ⅙ -PASS XHTML Mobile parsing ⅛ -PASS XHTML Mobile parsing ⅔ -PASS XHTML Mobile parsing ⅖ -PASS XHTML Mobile parsing ¾ -PASS XHTML Mobile parsing ⅗ -PASS XHTML Mobile parsing ⅜ -PASS XHTML Mobile parsing ⅘ -PASS XHTML Mobile parsing ⅚ -PASS XHTML Mobile parsing ⅝ -PASS XHTML Mobile parsing ⅞ -PASS XHTML Mobile parsing ⁄ -PASS XHTML Mobile parsing ⌢ -PASS XHTML Mobile parsing 𝒻 -PASS XHTML Mobile parsing ℱ -PASS XHTML Mobile parsing ǵ -PASS XHTML Mobile parsing Γ -PASS XHTML Mobile parsing γ -PASS XHTML Mobile parsing Ϝ -PASS XHTML Mobile parsing ϝ -PASS XHTML Mobile parsing ⪆ -PASS XHTML Mobile parsing Ğ -PASS XHTML Mobile parsing ğ -PASS XHTML Mobile parsing Ģ -PASS XHTML Mobile parsing Ĝ -PASS XHTML Mobile parsing ĝ -PASS XHTML Mobile parsing Г -PASS XHTML Mobile parsing г -PASS XHTML Mobile parsing Ġ -PASS XHTML Mobile parsing ġ -PASS XHTML Mobile parsing ≥ -PASS XHTML Mobile parsing ≧ -PASS XHTML Mobile parsing ⪌ -PASS XHTML Mobile parsing ⋛ -PASS XHTML Mobile parsing ≥ -PASS XHTML Mobile parsing ≧ -PASS XHTML Mobile parsing ⩾ -PASS XHTML Mobile parsing ⪩ -PASS XHTML Mobile parsing ⩾ -PASS XHTML Mobile parsing ⪀ -PASS XHTML Mobile parsing ⪂ -PASS XHTML Mobile parsing ⪄ -PASS XHTML Mobile parsing ⋛︀ -PASS XHTML Mobile parsing ⪔ -PASS XHTML Mobile parsing 𝔊 -PASS XHTML Mobile parsing 𝔤 -PASS XHTML Mobile parsing ≫ -PASS XHTML Mobile parsing ⋙ -PASS XHTML Mobile parsing ⋙ -PASS XHTML Mobile parsing ℷ -PASS XHTML Mobile parsing Ѓ -PASS XHTML Mobile parsing ѓ -PASS XHTML Mobile parsing ⪥ -PASS XHTML Mobile parsing ≷ -PASS XHTML Mobile parsing ⪒ -PASS XHTML Mobile parsing ⪤ -PASS XHTML Mobile parsing ⪊ -PASS XHTML Mobile parsing ⪊ -PASS XHTML Mobile parsing ⪈ -PASS XHTML Mobile parsing ≩ -PASS XHTML Mobile parsing ⪈ -PASS XHTML Mobile parsing ≩ -PASS XHTML Mobile parsing ⋧ -PASS XHTML Mobile parsing 𝔾 -PASS XHTML Mobile parsing 𝕘 -PASS XHTML Mobile parsing ` -PASS XHTML Mobile parsing ≥ -PASS XHTML Mobile parsing ⋛ -PASS XHTML Mobile parsing ≧ -PASS XHTML Mobile parsing ⪢ -PASS XHTML Mobile parsing ≷ -PASS XHTML Mobile parsing ⩾ -PASS XHTML Mobile parsing ≳ -PASS XHTML Mobile parsing 𝒢 -PASS XHTML Mobile parsing ℊ -PASS XHTML Mobile parsing ≳ -PASS XHTML Mobile parsing ⪎ -PASS XHTML Mobile parsing ⪐ -PASS XHTML Mobile parsing ⪧ -PASS XHTML Mobile parsing ⩺ -PASS XHTML Mobile parsing > -PASS XHTML Mobile parsing > -PASS XHTML Mobile parsing ≫ -PASS XHTML Mobile parsing ⋗ -PASS XHTML Mobile parsing ⦕ -PASS XHTML Mobile parsing ⩼ -PASS XHTML Mobile parsing ⪆ -PASS XHTML Mobile parsing ⥸ -PASS XHTML Mobile parsing ⋗ -PASS XHTML Mobile parsing ⋛ -PASS XHTML Mobile parsing ⪌ -PASS XHTML Mobile parsing ≷ -PASS XHTML Mobile parsing ≳ -PASS XHTML Mobile parsing ≩︀ -PASS XHTML Mobile parsing ≩︀ -PASS XHTML Mobile parsing ˇ -PASS XHTML Mobile parsing   -PASS XHTML Mobile parsing ½ -PASS XHTML Mobile parsing ℋ -PASS XHTML Mobile parsing Ъ -PASS XHTML Mobile parsing ъ -PASS XHTML Mobile parsing ⥈ -PASS XHTML Mobile parsing ↔ -PASS XHTML Mobile parsing ⇔ -PASS XHTML Mobile parsing ↭ -PASS XHTML Mobile parsing ^ -PASS XHTML Mobile parsing ℏ -PASS XHTML Mobile parsing Ĥ -PASS XHTML Mobile parsing ĥ -PASS XHTML Mobile parsing ♥ -PASS XHTML Mobile parsing ♥ -PASS XHTML Mobile parsing … -PASS XHTML Mobile parsing ⊹ -PASS XHTML Mobile parsing 𝔥 -PASS XHTML Mobile parsing ℌ -PASS XHTML Mobile parsing ℋ -PASS XHTML Mobile parsing ⤥ -PASS XHTML Mobile parsing ⤦ -PASS XHTML Mobile parsing ⇿ -PASS XHTML Mobile parsing ∻ -PASS XHTML Mobile parsing ↩ -PASS XHTML Mobile parsing ↪ -PASS XHTML Mobile parsing 𝕙 -PASS XHTML Mobile parsing ℍ -PASS XHTML Mobile parsing ― -PASS XHTML Mobile parsing ─ -PASS XHTML Mobile parsing 𝒽 -PASS XHTML Mobile parsing ℋ -PASS XHTML Mobile parsing ℏ -PASS XHTML Mobile parsing Ħ -PASS XHTML Mobile parsing ħ -PASS XHTML Mobile parsing ≎ -PASS XHTML Mobile parsing ≏ -PASS XHTML Mobile parsing ⁃ -PASS XHTML Mobile parsing ‐ -PASS XHTML Mobile parsing Í -PASS XHTML Mobile parsing í -PASS XHTML Mobile parsing ⁣ -PASS XHTML Mobile parsing Î -PASS XHTML Mobile parsing î -PASS XHTML Mobile parsing И -PASS XHTML Mobile parsing и -PASS XHTML Mobile parsing İ -PASS XHTML Mobile parsing Е -PASS XHTML Mobile parsing е -PASS XHTML Mobile parsing ¡ -PASS XHTML Mobile parsing ⇔ -PASS XHTML Mobile parsing 𝔦 -PASS XHTML Mobile parsing ℑ -PASS XHTML Mobile parsing Ì -PASS XHTML Mobile parsing ì -PASS XHTML Mobile parsing ⅈ -PASS XHTML Mobile parsing ⨌ -PASS XHTML Mobile parsing ∭ -PASS XHTML Mobile parsing ⧜ -PASS XHTML Mobile parsing ℩ -PASS XHTML Mobile parsing IJ -PASS XHTML Mobile parsing ij -PASS XHTML Mobile parsing Ī -PASS XHTML Mobile parsing ī -PASS XHTML Mobile parsing ℑ -PASS XHTML Mobile parsing ⅈ -PASS XHTML Mobile parsing ℐ -PASS XHTML Mobile parsing ℑ -PASS XHTML Mobile parsing ı -PASS XHTML Mobile parsing ℑ -PASS XHTML Mobile parsing ⊷ -PASS XHTML Mobile parsing Ƶ -PASS XHTML Mobile parsing ⇒ -PASS XHTML Mobile parsing ℅ -PASS XHTML Mobile parsing ∈ -PASS XHTML Mobile parsing ∞ -PASS XHTML Mobile parsing ⧝ -PASS XHTML Mobile parsing ı -PASS XHTML Mobile parsing ⊺ -PASS XHTML Mobile parsing ∫ -PASS XHTML Mobile parsing ∬ -PASS XHTML Mobile parsing ℤ -PASS XHTML Mobile parsing ∫ -PASS XHTML Mobile parsing ⊺ -PASS XHTML Mobile parsing ⋂ -PASS XHTML Mobile parsing ⨗ -PASS XHTML Mobile parsing ⨼ -PASS XHTML Mobile parsing ⁣ -PASS XHTML Mobile parsing ⁢ -PASS XHTML Mobile parsing Ё -PASS XHTML Mobile parsing ё -PASS XHTML Mobile parsing Į -PASS XHTML Mobile parsing į -PASS XHTML Mobile parsing 𝕀 -PASS XHTML Mobile parsing 𝕚 -PASS XHTML Mobile parsing Ι -PASS XHTML Mobile parsing ι -PASS XHTML Mobile parsing ⨼ -PASS XHTML Mobile parsing ¿ -PASS XHTML Mobile parsing 𝒾 -PASS XHTML Mobile parsing ℐ -PASS XHTML Mobile parsing ∈ -PASS XHTML Mobile parsing ⋵ -PASS XHTML Mobile parsing ⋹ -PASS XHTML Mobile parsing ⋴ -PASS XHTML Mobile parsing ⋳ -PASS XHTML Mobile parsing ∈ -PASS XHTML Mobile parsing ⁢ -PASS XHTML Mobile parsing Ĩ -PASS XHTML Mobile parsing ĩ -PASS XHTML Mobile parsing І -PASS XHTML Mobile parsing і -PASS XHTML Mobile parsing Ï -PASS XHTML Mobile parsing ï -PASS XHTML Mobile parsing Ĵ -PASS XHTML Mobile parsing ĵ -PASS XHTML Mobile parsing Й -PASS XHTML Mobile parsing й -PASS XHTML Mobile parsing 𝔍 -PASS XHTML Mobile parsing 𝔧 -PASS XHTML Mobile parsing ȷ -PASS XHTML Mobile parsing 𝕁 -PASS XHTML Mobile parsing 𝕛 -PASS XHTML Mobile parsing 𝒥 -PASS XHTML Mobile parsing 𝒿 -PASS XHTML Mobile parsing Ј -PASS XHTML Mobile parsing ј -PASS XHTML Mobile parsing Є -PASS XHTML Mobile parsing є -PASS XHTML Mobile parsing Κ -PASS XHTML Mobile parsing κ -PASS XHTML Mobile parsing ϰ -PASS XHTML Mobile parsing Ķ -PASS XHTML Mobile parsing ķ -PASS XHTML Mobile parsing К -PASS XHTML Mobile parsing к -PASS XHTML Mobile parsing 𝔎 -PASS XHTML Mobile parsing 𝔨 -PASS XHTML Mobile parsing ĸ -PASS XHTML Mobile parsing Х -PASS XHTML Mobile parsing х -PASS XHTML Mobile parsing Ќ -PASS XHTML Mobile parsing ќ -PASS XHTML Mobile parsing 𝕂 -PASS XHTML Mobile parsing 𝕜 -PASS XHTML Mobile parsing 𝒦 -PASS XHTML Mobile parsing 𝓀 -PASS XHTML Mobile parsing ⇚ -PASS XHTML Mobile parsing Ĺ -PASS XHTML Mobile parsing ĺ -PASS XHTML Mobile parsing ⦴ -PASS XHTML Mobile parsing ℒ -PASS XHTML Mobile parsing Λ -PASS XHTML Mobile parsing λ -PASS XHTML Mobile parsing ⟨ -PASS XHTML Mobile parsing ⟪ -PASS XHTML Mobile parsing ⦑ -PASS XHTML Mobile parsing ⟨ -PASS XHTML Mobile parsing ⪅ -PASS XHTML Mobile parsing ℒ -PASS XHTML Mobile parsing « -PASS XHTML Mobile parsing ⇤ -PASS XHTML Mobile parsing ⤟ -PASS XHTML Mobile parsing ← -PASS XHTML Mobile parsing ↞ -PASS XHTML Mobile parsing ⇐ -PASS XHTML Mobile parsing ⤝ -PASS XHTML Mobile parsing ↩ -PASS XHTML Mobile parsing ↫ -PASS XHTML Mobile parsing ⤹ -PASS XHTML Mobile parsing ⥳ -PASS XHTML Mobile parsing ↢ -PASS XHTML Mobile parsing ⤙ -PASS XHTML Mobile parsing ⤛ -PASS XHTML Mobile parsing ⪫ -PASS XHTML Mobile parsing ⪭ -PASS XHTML Mobile parsing ⪭︀ -PASS XHTML Mobile parsing ⤌ -PASS XHTML Mobile parsing ⤎ -PASS XHTML Mobile parsing ❲ -PASS XHTML Mobile parsing { -PASS XHTML Mobile parsing [ -PASS XHTML Mobile parsing ⦋ -PASS XHTML Mobile parsing ⦏ -PASS XHTML Mobile parsing ⦍ -PASS XHTML Mobile parsing Ľ -PASS XHTML Mobile parsing ľ -PASS XHTML Mobile parsing Ļ -PASS XHTML Mobile parsing ļ -PASS XHTML Mobile parsing ⌈ -PASS XHTML Mobile parsing { -PASS XHTML Mobile parsing Л -PASS XHTML Mobile parsing л -PASS XHTML Mobile parsing ⤶ -PASS XHTML Mobile parsing “ -PASS XHTML Mobile parsing „ -PASS XHTML Mobile parsing ⥧ -PASS XHTML Mobile parsing ⥋ -PASS XHTML Mobile parsing ↲ -PASS XHTML Mobile parsing ≤ -PASS XHTML Mobile parsing ≦ -PASS XHTML Mobile parsing ⟨ -PASS XHTML Mobile parsing ⇤ -PASS XHTML Mobile parsing ← -PASS XHTML Mobile parsing ← -PASS XHTML Mobile parsing ⇐ -PASS XHTML Mobile parsing ⇆ -PASS XHTML Mobile parsing ↢ -PASS XHTML Mobile parsing ⌈ -PASS XHTML Mobile parsing ⟦ -PASS XHTML Mobile parsing ⥡ -PASS XHTML Mobile parsing ⥙ -PASS XHTML Mobile parsing ⇃ -PASS XHTML Mobile parsing ⌊ -PASS XHTML Mobile parsing ↽ -PASS XHTML Mobile parsing ↼ -PASS XHTML Mobile parsing ⇇ -PASS XHTML Mobile parsing ↔ -PASS XHTML Mobile parsing ↔ -PASS XHTML Mobile parsing ⇔ -PASS XHTML Mobile parsing ⇆ -PASS XHTML Mobile parsing ⇋ -PASS XHTML Mobile parsing ↭ -PASS XHTML Mobile parsing ⥎ -PASS XHTML Mobile parsing ↤ -PASS XHTML Mobile parsing ⊣ -PASS XHTML Mobile parsing ⥚ -PASS XHTML Mobile parsing ⋋ -PASS XHTML Mobile parsing ⧏ -PASS XHTML Mobile parsing ⊲ -PASS XHTML Mobile parsing ⊴ -PASS XHTML Mobile parsing ⥑ -PASS XHTML Mobile parsing ⥠ -PASS XHTML Mobile parsing ⥘ -PASS XHTML Mobile parsing ↿ -PASS XHTML Mobile parsing ⥒ -PASS XHTML Mobile parsing ↼ -PASS XHTML Mobile parsing ⪋ -PASS XHTML Mobile parsing ⋚ -PASS XHTML Mobile parsing ≤ -PASS XHTML Mobile parsing ≦ -PASS XHTML Mobile parsing ⩽ -PASS XHTML Mobile parsing ⪨ -PASS XHTML Mobile parsing ⩽ -PASS XHTML Mobile parsing ⩿ -PASS XHTML Mobile parsing ⪁ -PASS XHTML Mobile parsing ⪃ -PASS XHTML Mobile parsing ⋚︀ -PASS XHTML Mobile parsing ⪓ -PASS XHTML Mobile parsing ⪅ -PASS XHTML Mobile parsing ⋖ -PASS XHTML Mobile parsing ⋚ -PASS XHTML Mobile parsing ⪋ -PASS XHTML Mobile parsing ⋚ -PASS XHTML Mobile parsing ≦ -PASS XHTML Mobile parsing ≶ -PASS XHTML Mobile parsing ≶ -PASS XHTML Mobile parsing ⪡ -PASS XHTML Mobile parsing ≲ -PASS XHTML Mobile parsing ⩽ -PASS XHTML Mobile parsing ≲ -PASS XHTML Mobile parsing ⥼ -PASS XHTML Mobile parsing ⌊ -PASS XHTML Mobile parsing 𝔏 -PASS XHTML Mobile parsing 𝔩 -PASS XHTML Mobile parsing ≶ -PASS XHTML Mobile parsing ⪑ -PASS XHTML Mobile parsing ⥢ -PASS XHTML Mobile parsing ↽ -PASS XHTML Mobile parsing ↼ -PASS XHTML Mobile parsing ⥪ -PASS XHTML Mobile parsing ▄ -PASS XHTML Mobile parsing Љ -PASS XHTML Mobile parsing љ -PASS XHTML Mobile parsing ⇇ -PASS XHTML Mobile parsing ≪ -PASS XHTML Mobile parsing ⋘ -PASS XHTML Mobile parsing ⌞ -PASS XHTML Mobile parsing ⇚ -PASS XHTML Mobile parsing ⥫ -PASS XHTML Mobile parsing ◺ -PASS XHTML Mobile parsing Ŀ -PASS XHTML Mobile parsing ŀ -PASS XHTML Mobile parsing ⎰ -PASS XHTML Mobile parsing ⎰ -PASS XHTML Mobile parsing ⪉ -PASS XHTML Mobile parsing ⪉ -PASS XHTML Mobile parsing ⪇ -PASS XHTML Mobile parsing ≨ -PASS XHTML Mobile parsing ⪇ -PASS XHTML Mobile parsing ≨ -PASS XHTML Mobile parsing ⋦ -PASS XHTML Mobile parsing ⟬ -PASS XHTML Mobile parsing ⇽ -PASS XHTML Mobile parsing ⟦ -PASS XHTML Mobile parsing ⟵ -PASS XHTML Mobile parsing ⟵ -PASS XHTML Mobile parsing ⟸ -PASS XHTML Mobile parsing ⟷ -PASS XHTML Mobile parsing ⟷ -PASS XHTML Mobile parsing ⟺ -PASS XHTML Mobile parsing ⟼ -PASS XHTML Mobile parsing ⟶ -PASS XHTML Mobile parsing ⟶ -PASS XHTML Mobile parsing ⟹ -PASS XHTML Mobile parsing ↫ -PASS XHTML Mobile parsing ↬ -PASS XHTML Mobile parsing ⦅ -PASS XHTML Mobile parsing 𝕃 -PASS XHTML Mobile parsing 𝕝 -PASS XHTML Mobile parsing ⨭ -PASS XHTML Mobile parsing ⨴ -PASS XHTML Mobile parsing ∗ -PASS XHTML Mobile parsing _ -PASS XHTML Mobile parsing ↙ -PASS XHTML Mobile parsing ↘ -PASS XHTML Mobile parsing ◊ -PASS XHTML Mobile parsing ◊ -PASS XHTML Mobile parsing ⧫ -PASS XHTML Mobile parsing ( -PASS XHTML Mobile parsing ⦓ -PASS XHTML Mobile parsing ⇆ -PASS XHTML Mobile parsing ⌟ -PASS XHTML Mobile parsing ⇋ -PASS XHTML Mobile parsing ⥭ -PASS XHTML Mobile parsing ‎ -PASS XHTML Mobile parsing ⊿ -PASS XHTML Mobile parsing ‹ -PASS XHTML Mobile parsing 𝓁 -PASS XHTML Mobile parsing ℒ -PASS XHTML Mobile parsing ↰ -PASS XHTML Mobile parsing ↰ -PASS XHTML Mobile parsing ≲ -PASS XHTML Mobile parsing ⪍ -PASS XHTML Mobile parsing ⪏ -PASS XHTML Mobile parsing [ -PASS XHTML Mobile parsing ‘ -PASS XHTML Mobile parsing ‚ -PASS XHTML Mobile parsing Ł -PASS XHTML Mobile parsing ł -PASS XHTML Mobile parsing ⪦ -PASS XHTML Mobile parsing ⩹ -PASS XHTML Mobile parsing < -FAIL XHTML Mobile parsing < assert_true: expected true got false -PASS XHTML Mobile parsing ≪ -PASS XHTML Mobile parsing ⋖ -PASS XHTML Mobile parsing ⋋ -PASS XHTML Mobile parsing ⋉ -PASS XHTML Mobile parsing ⥶ -PASS XHTML Mobile parsing ⩻ -PASS XHTML Mobile parsing ◃ -PASS XHTML Mobile parsing ⊴ -PASS XHTML Mobile parsing ◂ -PASS XHTML Mobile parsing ⦖ -PASS XHTML Mobile parsing ⥊ -PASS XHTML Mobile parsing ⥦ -PASS XHTML Mobile parsing ≨︀ -PASS XHTML Mobile parsing ≨︀ -PASS XHTML Mobile parsing ¯ -PASS XHTML Mobile parsing ♂ -PASS XHTML Mobile parsing ✠ -PASS XHTML Mobile parsing ✠ -PASS XHTML Mobile parsing ⤅ -PASS XHTML Mobile parsing ↦ -PASS XHTML Mobile parsing ↦ -PASS XHTML Mobile parsing ↧ -PASS XHTML Mobile parsing ↤ -PASS XHTML Mobile parsing ↥ -PASS XHTML Mobile parsing ▮ -PASS XHTML Mobile parsing ⨩ -PASS XHTML Mobile parsing М -PASS XHTML Mobile parsing м -PASS XHTML Mobile parsing — -PASS XHTML Mobile parsing ∺ -PASS XHTML Mobile parsing ∡ -PASS XHTML Mobile parsing   -PASS XHTML Mobile parsing ℳ -PASS XHTML Mobile parsing 𝔐 -PASS XHTML Mobile parsing 𝔪 -PASS XHTML Mobile parsing ℧ -PASS XHTML Mobile parsing µ -PASS XHTML Mobile parsing * -PASS XHTML Mobile parsing ⫰ -PASS XHTML Mobile parsing ∣ -PASS XHTML Mobile parsing · -PASS XHTML Mobile parsing ⊟ -PASS XHTML Mobile parsing − -PASS XHTML Mobile parsing ∸ -PASS XHTML Mobile parsing ⨪ -PASS XHTML Mobile parsing ∓ -PASS XHTML Mobile parsing ⫛ -PASS XHTML Mobile parsing … -PASS XHTML Mobile parsing ∓ -PASS XHTML Mobile parsing ⊧ -PASS XHTML Mobile parsing 𝕄 -PASS XHTML Mobile parsing 𝕞 -PASS XHTML Mobile parsing ∓ -PASS XHTML Mobile parsing 𝓂 -PASS XHTML Mobile parsing ℳ -PASS XHTML Mobile parsing ∾ -PASS XHTML Mobile parsing Μ -PASS XHTML Mobile parsing μ -PASS XHTML Mobile parsing ⊸ -PASS XHTML Mobile parsing ⊸ -PASS XHTML Mobile parsing ∇ -PASS XHTML Mobile parsing Ń -PASS XHTML Mobile parsing ń -PASS XHTML Mobile parsing ∠⃒ -PASS XHTML Mobile parsing ≉ -PASS XHTML Mobile parsing ⩰̸ -PASS XHTML Mobile parsing ≋̸ -PASS XHTML Mobile parsing ʼn -PASS XHTML Mobile parsing ≉ -PASS XHTML Mobile parsing ♮ -PASS XHTML Mobile parsing ℕ -PASS XHTML Mobile parsing ♮ -PASS XHTML Mobile parsing -PASS XHTML Mobile parsing ≎̸ -PASS XHTML Mobile parsing ≏̸ -PASS XHTML Mobile parsing ⩃ -PASS XHTML Mobile parsing Ň -PASS XHTML Mobile parsing ň -PASS XHTML Mobile parsing Ņ -PASS XHTML Mobile parsing ņ -PASS XHTML Mobile parsing ≇ -PASS XHTML Mobile parsing ⩭̸ -PASS XHTML Mobile parsing ⩂ -PASS XHTML Mobile parsing Н -PASS XHTML Mobile parsing н -PASS XHTML Mobile parsing – -PASS XHTML Mobile parsing ⤤ -PASS XHTML Mobile parsing ↗ -PASS XHTML Mobile parsing ⇗ -PASS XHTML Mobile parsing ↗ -PASS XHTML Mobile parsing ≠ -PASS XHTML Mobile parsing ≐̸ -PASS XHTML Mobile parsing ​ -PASS XHTML Mobile parsing ​ -PASS XHTML Mobile parsing ​ -PASS XHTML Mobile parsing ​ -PASS XHTML Mobile parsing ≢ -PASS XHTML Mobile parsing ⤨ -PASS XHTML Mobile parsing ≂̸ -PASS XHTML Mobile parsing ≫ -PASS XHTML Mobile parsing ≪ -PASS XHTML Mobile parsing 
 -PASS XHTML Mobile parsing ∄ -PASS XHTML Mobile parsing ∄ -PASS XHTML Mobile parsing 𝔑 -PASS XHTML Mobile parsing 𝔫 -PASS XHTML Mobile parsing ≧̸ -PASS XHTML Mobile parsing ≱ -PASS XHTML Mobile parsing ≱ -PASS XHTML Mobile parsing ≧̸ -PASS XHTML Mobile parsing ⩾̸ -PASS XHTML Mobile parsing ⩾̸ -PASS XHTML Mobile parsing ⋙̸ -PASS XHTML Mobile parsing ≵ -PASS XHTML Mobile parsing ≫⃒ -PASS XHTML Mobile parsing ≯ -PASS XHTML Mobile parsing ≯ -PASS XHTML Mobile parsing ≫̸ -PASS XHTML Mobile parsing ↮ -PASS XHTML Mobile parsing ⇎ -PASS XHTML Mobile parsing ⫲ -PASS XHTML Mobile parsing ∋ -PASS XHTML Mobile parsing ⋼ -PASS XHTML Mobile parsing ⋺ -PASS XHTML Mobile parsing ∋ -PASS XHTML Mobile parsing Њ -PASS XHTML Mobile parsing њ -PASS XHTML Mobile parsing ↚ -PASS XHTML Mobile parsing ⇍ -PASS XHTML Mobile parsing ‥ -PASS XHTML Mobile parsing ≦̸ -PASS XHTML Mobile parsing ≰ -PASS XHTML Mobile parsing ↚ -PASS XHTML Mobile parsing ⇍ -PASS XHTML Mobile parsing ↮ -PASS XHTML Mobile parsing ⇎ -PASS XHTML Mobile parsing ≰ -PASS XHTML Mobile parsing ≦̸ -PASS XHTML Mobile parsing ⩽̸ -PASS XHTML Mobile parsing ⩽̸ -PASS XHTML Mobile parsing ≮ -PASS XHTML Mobile parsing ⋘̸ -PASS XHTML Mobile parsing ≴ -PASS XHTML Mobile parsing ≪⃒ -PASS XHTML Mobile parsing ≮ -PASS XHTML Mobile parsing ⋪ -PASS XHTML Mobile parsing ⋬ -PASS XHTML Mobile parsing ≪̸ -PASS XHTML Mobile parsing ∤ -PASS XHTML Mobile parsing ⁠ -PASS XHTML Mobile parsing   -PASS XHTML Mobile parsing 𝕟 -PASS XHTML Mobile parsing ℕ -PASS XHTML Mobile parsing ⫬ -PASS XHTML Mobile parsing ¬ -PASS XHTML Mobile parsing ≢ -PASS XHTML Mobile parsing ≭ -PASS XHTML Mobile parsing ∦ -PASS XHTML Mobile parsing ∉ -PASS XHTML Mobile parsing ≠ -PASS XHTML Mobile parsing ≂̸ -PASS XHTML Mobile parsing ∄ -PASS XHTML Mobile parsing ≯ -PASS XHTML Mobile parsing ≱ -PASS XHTML Mobile parsing ≧̸ -PASS XHTML Mobile parsing ≫̸ -PASS XHTML Mobile parsing ≹ -PASS XHTML Mobile parsing ⩾̸ -PASS XHTML Mobile parsing ≵ -PASS XHTML Mobile parsing ≎̸ -PASS XHTML Mobile parsing ≏̸ -PASS XHTML Mobile parsing ∉ -PASS XHTML Mobile parsing ⋵̸ -PASS XHTML Mobile parsing ⋹̸ -PASS XHTML Mobile parsing ∉ -PASS XHTML Mobile parsing ⋷ -PASS XHTML Mobile parsing ⋶ -PASS XHTML Mobile parsing ⧏̸ -PASS XHTML Mobile parsing ⋪ -PASS XHTML Mobile parsing ⋬ -PASS XHTML Mobile parsing ≮ -PASS XHTML Mobile parsing ≰ -PASS XHTML Mobile parsing ≸ -PASS XHTML Mobile parsing ≪̸ -PASS XHTML Mobile parsing ⩽̸ -PASS XHTML Mobile parsing ≴ -PASS XHTML Mobile parsing ⪢̸ -PASS XHTML Mobile parsing ⪡̸ -PASS XHTML Mobile parsing ∌ -PASS XHTML Mobile parsing ∌ -PASS XHTML Mobile parsing ⋾ -PASS XHTML Mobile parsing ⋽ -PASS XHTML Mobile parsing ⊀ -PASS XHTML Mobile parsing ⪯̸ -PASS XHTML Mobile parsing ⋠ -PASS XHTML Mobile parsing ∌ -PASS XHTML Mobile parsing ⧐̸ -PASS XHTML Mobile parsing ⋫ -PASS XHTML Mobile parsing ⋭ -PASS XHTML Mobile parsing ⊏̸ -PASS XHTML Mobile parsing ⋢ -PASS XHTML Mobile parsing ⊐̸ -PASS XHTML Mobile parsing ⋣ -PASS XHTML Mobile parsing ⊂⃒ -PASS XHTML Mobile parsing ⊈ -PASS XHTML Mobile parsing ⊁ -PASS XHTML Mobile parsing ⪰̸ -PASS XHTML Mobile parsing ⋡ -PASS XHTML Mobile parsing ≿̸ -PASS XHTML Mobile parsing ⊃⃒ -PASS XHTML Mobile parsing ⊉ -PASS XHTML Mobile parsing ≁ -PASS XHTML Mobile parsing ≄ -PASS XHTML Mobile parsing ≇ -PASS XHTML Mobile parsing ≉ -PASS XHTML Mobile parsing ∤ -PASS XHTML Mobile parsing ∦ -PASS XHTML Mobile parsing ∦ -PASS XHTML Mobile parsing ⫽⃥ -PASS XHTML Mobile parsing ∂̸ -PASS XHTML Mobile parsing ⨔ -PASS XHTML Mobile parsing ⊀ -PASS XHTML Mobile parsing ⋠ -PASS XHTML Mobile parsing ⊀ -PASS XHTML Mobile parsing ⪯̸ -PASS XHTML Mobile parsing ⪯̸ -PASS XHTML Mobile parsing ⤳̸ -PASS XHTML Mobile parsing ↛ -PASS XHTML Mobile parsing ⇏ -PASS XHTML Mobile parsing ↝̸ -PASS XHTML Mobile parsing ↛ -PASS XHTML Mobile parsing ⇏ -PASS XHTML Mobile parsing ⋫ -PASS XHTML Mobile parsing ⋭ -PASS XHTML Mobile parsing ⊁ -PASS XHTML Mobile parsing ⋡ -PASS XHTML Mobile parsing ⪰̸ -PASS XHTML Mobile parsing 𝒩 -PASS XHTML Mobile parsing 𝓃 -PASS XHTML Mobile parsing ∤ -PASS XHTML Mobile parsing ∦ -PASS XHTML Mobile parsing ≁ -PASS XHTML Mobile parsing ≄ -PASS XHTML Mobile parsing ≄ -PASS XHTML Mobile parsing ∤ -PASS XHTML Mobile parsing ∦ -PASS XHTML Mobile parsing ⋢ -PASS XHTML Mobile parsing ⋣ -PASS XHTML Mobile parsing ⊄ -PASS XHTML Mobile parsing ⫅̸ -PASS XHTML Mobile parsing ⊈ -PASS XHTML Mobile parsing ⊂⃒ -PASS XHTML Mobile parsing ⊈ -PASS XHTML Mobile parsing ⫅̸ -PASS XHTML Mobile parsing ⊁ -PASS XHTML Mobile parsing ⪰̸ -PASS XHTML Mobile parsing ⊅ -PASS XHTML Mobile parsing ⫆̸ -PASS XHTML Mobile parsing ⊉ -PASS XHTML Mobile parsing ⊃⃒ -PASS XHTML Mobile parsing ⊉ -PASS XHTML Mobile parsing ⫆̸ -PASS XHTML Mobile parsing ≹ -PASS XHTML Mobile parsing Ñ -PASS XHTML Mobile parsing ñ -PASS XHTML Mobile parsing ≸ -PASS XHTML Mobile parsing ⋪ -PASS XHTML Mobile parsing ⋬ -PASS XHTML Mobile parsing ⋫ -PASS XHTML Mobile parsing ⋭ -PASS XHTML Mobile parsing Ν -PASS XHTML Mobile parsing ν -PASS XHTML Mobile parsing # -PASS XHTML Mobile parsing № -PASS XHTML Mobile parsing   -PASS XHTML Mobile parsing ≍⃒ -PASS XHTML Mobile parsing ⊬ -PASS XHTML Mobile parsing ⊭ -PASS XHTML Mobile parsing ⊮ -PASS XHTML Mobile parsing ⊯ -PASS XHTML Mobile parsing ≥⃒ -PASS XHTML Mobile parsing >⃒ -PASS XHTML Mobile parsing ⤄ -PASS XHTML Mobile parsing ⧞ -PASS XHTML Mobile parsing ⤂ -PASS XHTML Mobile parsing ≤⃒ -FAIL XHTML Mobile parsing <⃒ assert_equals: XHTML Mobile parsing the entity reference caused a parse error; expected 3 but got 1 -PASS XHTML Mobile parsing ⊴⃒ -PASS XHTML Mobile parsing ⤃ -PASS XHTML Mobile parsing ⊵⃒ -PASS XHTML Mobile parsing ∼⃒ -PASS XHTML Mobile parsing ⤣ -PASS XHTML Mobile parsing ↖ -PASS XHTML Mobile parsing ⇖ -PASS XHTML Mobile parsing ↖ -PASS XHTML Mobile parsing ⤧ -PASS XHTML Mobile parsing Ó -PASS XHTML Mobile parsing ó -PASS XHTML Mobile parsing ⊛ -PASS XHTML Mobile parsing Ô -PASS XHTML Mobile parsing ô -PASS XHTML Mobile parsing ⊚ -PASS XHTML Mobile parsing О -PASS XHTML Mobile parsing о -PASS XHTML Mobile parsing ⊝ -PASS XHTML Mobile parsing Ő -PASS XHTML Mobile parsing ő -PASS XHTML Mobile parsing ⨸ -PASS XHTML Mobile parsing ⊙ -PASS XHTML Mobile parsing ⦼ -PASS XHTML Mobile parsing Œ -PASS XHTML Mobile parsing œ -PASS XHTML Mobile parsing ⦿ -PASS XHTML Mobile parsing 𝔒 -PASS XHTML Mobile parsing 𝔬 -PASS XHTML Mobile parsing ˛ -PASS XHTML Mobile parsing Ò -PASS XHTML Mobile parsing ò -PASS XHTML Mobile parsing ⧁ -PASS XHTML Mobile parsing ⦵ -PASS XHTML Mobile parsing Ω -PASS XHTML Mobile parsing ∮ -PASS XHTML Mobile parsing ↺ -PASS XHTML Mobile parsing ⦾ -PASS XHTML Mobile parsing ⦻ -PASS XHTML Mobile parsing ‾ -PASS XHTML Mobile parsing ⧀ -PASS XHTML Mobile parsing Ō -PASS XHTML Mobile parsing ō -PASS XHTML Mobile parsing Ω -PASS XHTML Mobile parsing ω -PASS XHTML Mobile parsing Ο -PASS XHTML Mobile parsing ο -PASS XHTML Mobile parsing ⦶ -PASS XHTML Mobile parsing ⊖ -PASS XHTML Mobile parsing 𝕆 -PASS XHTML Mobile parsing 𝕠 -PASS XHTML Mobile parsing ⦷ -PASS XHTML Mobile parsing “ -PASS XHTML Mobile parsing ‘ -PASS XHTML Mobile parsing ⦹ -PASS XHTML Mobile parsing ⊕ -PASS XHTML Mobile parsing ↻ -PASS XHTML Mobile parsing ⩔ -PASS XHTML Mobile parsing ∨ -PASS XHTML Mobile parsing ⩝ -PASS XHTML Mobile parsing ℴ -PASS XHTML Mobile parsing ℴ -PASS XHTML Mobile parsing ª -PASS XHTML Mobile parsing º -PASS XHTML Mobile parsing ⊶ -PASS XHTML Mobile parsing ⩖ -PASS XHTML Mobile parsing ⩗ -PASS XHTML Mobile parsing ⩛ -PASS XHTML Mobile parsing Ⓢ -PASS XHTML Mobile parsing 𝒪 -PASS XHTML Mobile parsing ℴ -PASS XHTML Mobile parsing Ø -PASS XHTML Mobile parsing ø -PASS XHTML Mobile parsing ⊘ -PASS XHTML Mobile parsing Õ -PASS XHTML Mobile parsing õ -PASS XHTML Mobile parsing ⨶ -PASS XHTML Mobile parsing ⨷ -PASS XHTML Mobile parsing ⊗ -PASS XHTML Mobile parsing Ö -PASS XHTML Mobile parsing ö -PASS XHTML Mobile parsing ⌽ -PASS XHTML Mobile parsing ‾ -PASS XHTML Mobile parsing ⏞ -PASS XHTML Mobile parsing ⎴ -PASS XHTML Mobile parsing ⏜ -PASS XHTML Mobile parsing ¶ -PASS XHTML Mobile parsing ∥ -PASS XHTML Mobile parsing ∥ -PASS XHTML Mobile parsing ⫳ -PASS XHTML Mobile parsing ⫽ -PASS XHTML Mobile parsing ∂ -PASS XHTML Mobile parsing ∂ -PASS XHTML Mobile parsing П -PASS XHTML Mobile parsing п -PASS XHTML Mobile parsing % -PASS XHTML Mobile parsing . -PASS XHTML Mobile parsing ‰ -PASS XHTML Mobile parsing ⊥ -PASS XHTML Mobile parsing ‱ -PASS XHTML Mobile parsing 𝔓 -PASS XHTML Mobile parsing 𝔭 -PASS XHTML Mobile parsing Φ -PASS XHTML Mobile parsing φ -PASS XHTML Mobile parsing ϕ -PASS XHTML Mobile parsing ℳ -PASS XHTML Mobile parsing ☎ -PASS XHTML Mobile parsing Π -PASS XHTML Mobile parsing π -PASS XHTML Mobile parsing ⋔ -PASS XHTML Mobile parsing ϖ -PASS XHTML Mobile parsing ℏ -PASS XHTML Mobile parsing ℎ -PASS XHTML Mobile parsing ℏ -PASS XHTML Mobile parsing ⨣ -PASS XHTML Mobile parsing ⊞ -PASS XHTML Mobile parsing ⨢ -PASS XHTML Mobile parsing + -PASS XHTML Mobile parsing ∔ -PASS XHTML Mobile parsing ⨥ -PASS XHTML Mobile parsing ⩲ -PASS XHTML Mobile parsing ± -PASS XHTML Mobile parsing ± -PASS XHTML Mobile parsing ⨦ -PASS XHTML Mobile parsing ⨧ -PASS XHTML Mobile parsing ± -PASS XHTML Mobile parsing ℌ -PASS XHTML Mobile parsing ⨕ -PASS XHTML Mobile parsing 𝕡 -PASS XHTML Mobile parsing ℙ -PASS XHTML Mobile parsing £ -PASS XHTML Mobile parsing ⪷ -PASS XHTML Mobile parsing ⪻ -PASS XHTML Mobile parsing ≺ -PASS XHTML Mobile parsing ≼ -PASS XHTML Mobile parsing ⪷ -PASS XHTML Mobile parsing ≺ -PASS XHTML Mobile parsing ≼ -PASS XHTML Mobile parsing ≺ -PASS XHTML Mobile parsing ⪯ -PASS XHTML Mobile parsing ≼ -PASS XHTML Mobile parsing ≾ -PASS XHTML Mobile parsing ⪯ -PASS XHTML Mobile parsing ⪹ -PASS XHTML Mobile parsing ⪵ -PASS XHTML Mobile parsing ⋨ -PASS XHTML Mobile parsing ⪯ -PASS XHTML Mobile parsing ⪳ -PASS XHTML Mobile parsing ≾ -PASS XHTML Mobile parsing ′ -PASS XHTML Mobile parsing ″ -PASS XHTML Mobile parsing ℙ -PASS XHTML Mobile parsing ⪹ -PASS XHTML Mobile parsing ⪵ -PASS XHTML Mobile parsing ⋨ -PASS XHTML Mobile parsing ∏ -PASS XHTML Mobile parsing ∏ -PASS XHTML Mobile parsing ⌮ -PASS XHTML Mobile parsing ⌒ -PASS XHTML Mobile parsing ⌓ -PASS XHTML Mobile parsing ∝ -PASS XHTML Mobile parsing ∝ -PASS XHTML Mobile parsing ∷ -PASS XHTML Mobile parsing ∝ -PASS XHTML Mobile parsing ≾ -PASS XHTML Mobile parsing ⊰ -PASS XHTML Mobile parsing 𝒫 -PASS XHTML Mobile parsing 𝓅 -PASS XHTML Mobile parsing Ψ -PASS XHTML Mobile parsing ψ -PASS XHTML Mobile parsing   -PASS XHTML Mobile parsing 𝔔 -PASS XHTML Mobile parsing 𝔮 -PASS XHTML Mobile parsing ⨌ -PASS XHTML Mobile parsing 𝕢 -PASS XHTML Mobile parsing ℚ -PASS XHTML Mobile parsing ⁗ -PASS XHTML Mobile parsing 𝒬 -PASS XHTML Mobile parsing 𝓆 -PASS XHTML Mobile parsing ℍ -PASS XHTML Mobile parsing ⨖ -PASS XHTML Mobile parsing ? -PASS XHTML Mobile parsing ≟ -PASS XHTML Mobile parsing " -PASS XHTML Mobile parsing " -PASS XHTML Mobile parsing ⇛ -PASS XHTML Mobile parsing ∽̱ -PASS XHTML Mobile parsing Ŕ -PASS XHTML Mobile parsing ŕ -PASS XHTML Mobile parsing √ -PASS XHTML Mobile parsing ⦳ -PASS XHTML Mobile parsing ⟩ -PASS XHTML Mobile parsing ⟫ -PASS XHTML Mobile parsing ⦒ -PASS XHTML Mobile parsing ⦥ -PASS XHTML Mobile parsing ⟩ -PASS XHTML Mobile parsing » -PASS XHTML Mobile parsing ⥵ -PASS XHTML Mobile parsing ⇥ -PASS XHTML Mobile parsing ⤠ -PASS XHTML Mobile parsing ⤳ -PASS XHTML Mobile parsing → -PASS XHTML Mobile parsing ↠ -PASS XHTML Mobile parsing ⇒ -PASS XHTML Mobile parsing ⤞ -PASS XHTML Mobile parsing ↪ -PASS XHTML Mobile parsing ↬ -PASS XHTML Mobile parsing ⥅ -PASS XHTML Mobile parsing ⥴ -PASS XHTML Mobile parsing ⤖ -PASS XHTML Mobile parsing ↣ -PASS XHTML Mobile parsing ↝ -PASS XHTML Mobile parsing ⤚ -PASS XHTML Mobile parsing ⤜ -PASS XHTML Mobile parsing ∶ -PASS XHTML Mobile parsing ℚ -PASS XHTML Mobile parsing ⤍ -PASS XHTML Mobile parsing ⤏ -PASS XHTML Mobile parsing ⤐ -PASS XHTML Mobile parsing ❳ -PASS XHTML Mobile parsing } -PASS XHTML Mobile parsing ] -PASS XHTML Mobile parsing ⦌ -PASS XHTML Mobile parsing ⦎ -PASS XHTML Mobile parsing ⦐ -PASS XHTML Mobile parsing Ř -PASS XHTML Mobile parsing ř -PASS XHTML Mobile parsing Ŗ -PASS XHTML Mobile parsing ŗ -PASS XHTML Mobile parsing ⌉ -PASS XHTML Mobile parsing } -PASS XHTML Mobile parsing Р -PASS XHTML Mobile parsing р -PASS XHTML Mobile parsing ⤷ -PASS XHTML Mobile parsing ⥩ -PASS XHTML Mobile parsing ” -PASS XHTML Mobile parsing ” -PASS XHTML Mobile parsing ↳ -PASS XHTML Mobile parsing ℜ -PASS XHTML Mobile parsing ℛ -PASS XHTML Mobile parsing ℜ -PASS XHTML Mobile parsing ℝ -PASS XHTML Mobile parsing ℜ -PASS XHTML Mobile parsing ▭ -PASS XHTML Mobile parsing ® -PASS XHTML Mobile parsing ® -PASS XHTML Mobile parsing ∋ -PASS XHTML Mobile parsing ⇋ -PASS XHTML Mobile parsing ⥯ -PASS XHTML Mobile parsing ⥽ -PASS XHTML Mobile parsing ⌋ -PASS XHTML Mobile parsing 𝔯 -PASS XHTML Mobile parsing ℜ -PASS XHTML Mobile parsing ⥤ -PASS XHTML Mobile parsing ⇁ -PASS XHTML Mobile parsing ⇀ -PASS XHTML Mobile parsing ⥬ -PASS XHTML Mobile parsing Ρ -PASS XHTML Mobile parsing ρ -PASS XHTML Mobile parsing ϱ -PASS XHTML Mobile parsing ⟩ -PASS XHTML Mobile parsing ⇥ -PASS XHTML Mobile parsing → -PASS XHTML Mobile parsing → -PASS XHTML Mobile parsing ⇒ -PASS XHTML Mobile parsing ⇄ -PASS XHTML Mobile parsing ↣ -PASS XHTML Mobile parsing ⌉ -PASS XHTML Mobile parsing ⟧ -PASS XHTML Mobile parsing ⥝ -PASS XHTML Mobile parsing ⥕ -PASS XHTML Mobile parsing ⇂ -PASS XHTML Mobile parsing ⌋ -PASS XHTML Mobile parsing ⇁ -PASS XHTML Mobile parsing ⇀ -PASS XHTML Mobile parsing ⇄ -PASS XHTML Mobile parsing ⇌ -PASS XHTML Mobile parsing ⇉ -PASS XHTML Mobile parsing ↝ -PASS XHTML Mobile parsing ↦ -PASS XHTML Mobile parsing ⊢ -PASS XHTML Mobile parsing ⥛ -PASS XHTML Mobile parsing ⋌ -PASS XHTML Mobile parsing ⧐ -PASS XHTML Mobile parsing ⊳ -PASS XHTML Mobile parsing ⊵ -PASS XHTML Mobile parsing ⥏ -PASS XHTML Mobile parsing ⥜ -PASS XHTML Mobile parsing ⥔ -PASS XHTML Mobile parsing ↾ -PASS XHTML Mobile parsing ⥓ -PASS XHTML Mobile parsing ⇀ -PASS XHTML Mobile parsing ˚ -PASS XHTML Mobile parsing ≓ -PASS XHTML Mobile parsing ⇄ -PASS XHTML Mobile parsing ⇌ -PASS XHTML Mobile parsing ‏ -PASS XHTML Mobile parsing ⎱ -PASS XHTML Mobile parsing ⎱ -PASS XHTML Mobile parsing ⫮ -PASS XHTML Mobile parsing ⟭ -PASS XHTML Mobile parsing ⇾ -PASS XHTML Mobile parsing ⟧ -PASS XHTML Mobile parsing ⦆ -PASS XHTML Mobile parsing 𝕣 -PASS XHTML Mobile parsing ℝ -PASS XHTML Mobile parsing ⨮ -PASS XHTML Mobile parsing ⨵ -PASS XHTML Mobile parsing ⥰ -PASS XHTML Mobile parsing ) -PASS XHTML Mobile parsing ⦔ -PASS XHTML Mobile parsing ⨒ -PASS XHTML Mobile parsing ⇉ -PASS XHTML Mobile parsing ⇛ -PASS XHTML Mobile parsing › -PASS XHTML Mobile parsing 𝓇 -PASS XHTML Mobile parsing ℛ -PASS XHTML Mobile parsing ↱ -PASS XHTML Mobile parsing ↱ -PASS XHTML Mobile parsing ] -PASS XHTML Mobile parsing ’ -PASS XHTML Mobile parsing ’ -PASS XHTML Mobile parsing ⋌ -PASS XHTML Mobile parsing ⋊ -PASS XHTML Mobile parsing ▹ -PASS XHTML Mobile parsing ⊵ -PASS XHTML Mobile parsing ▸ -PASS XHTML Mobile parsing ⧎ -PASS XHTML Mobile parsing ⧴ -PASS XHTML Mobile parsing ⥨ -PASS XHTML Mobile parsing ℞ -PASS XHTML Mobile parsing Ś -PASS XHTML Mobile parsing ś -PASS XHTML Mobile parsing ‚ -PASS XHTML Mobile parsing ⪸ -PASS XHTML Mobile parsing Š -PASS XHTML Mobile parsing š -PASS XHTML Mobile parsing ⪼ -PASS XHTML Mobile parsing ≻ -PASS XHTML Mobile parsing ≽ -PASS XHTML Mobile parsing ⪰ -PASS XHTML Mobile parsing ⪴ -PASS XHTML Mobile parsing Ş -PASS XHTML Mobile parsing ş -PASS XHTML Mobile parsing Ŝ -PASS XHTML Mobile parsing ŝ -PASS XHTML Mobile parsing ⪺ -PASS XHTML Mobile parsing ⪶ -PASS XHTML Mobile parsing ⋩ -PASS XHTML Mobile parsing ⨓ -PASS XHTML Mobile parsing ≿ -PASS XHTML Mobile parsing С -PASS XHTML Mobile parsing с -PASS XHTML Mobile parsing ⊡ -PASS XHTML Mobile parsing ⋅ -PASS XHTML Mobile parsing ⩦ -PASS XHTML Mobile parsing ⤥ -PASS XHTML Mobile parsing ↘ -PASS XHTML Mobile parsing ⇘ -PASS XHTML Mobile parsing ↘ -PASS XHTML Mobile parsing § -PASS XHTML Mobile parsing ; -PASS XHTML Mobile parsing ⤩ -PASS XHTML Mobile parsing ∖ -PASS XHTML Mobile parsing ∖ -PASS XHTML Mobile parsing ✶ -PASS XHTML Mobile parsing 𝔖 -PASS XHTML Mobile parsing 𝔰 -PASS XHTML Mobile parsing ⌢ -PASS XHTML Mobile parsing ♯ -PASS XHTML Mobile parsing Щ -PASS XHTML Mobile parsing щ -PASS XHTML Mobile parsing Ш -PASS XHTML Mobile parsing ш -PASS XHTML Mobile parsing ↓ -PASS XHTML Mobile parsing ← -PASS XHTML Mobile parsing ∣ -PASS XHTML Mobile parsing ∥ -PASS XHTML Mobile parsing → -PASS XHTML Mobile parsing ↑ -PASS XHTML Mobile parsing ­ -PASS XHTML Mobile parsing Σ -PASS XHTML Mobile parsing σ -PASS XHTML Mobile parsing ς -PASS XHTML Mobile parsing ς -PASS XHTML Mobile parsing ∼ -PASS XHTML Mobile parsing ⩪ -PASS XHTML Mobile parsing ≃ -PASS XHTML Mobile parsing ≃ -PASS XHTML Mobile parsing ⪞ -PASS XHTML Mobile parsing ⪠ -PASS XHTML Mobile parsing ⪝ -PASS XHTML Mobile parsing ⪟ -PASS XHTML Mobile parsing ≆ -PASS XHTML Mobile parsing ⨤ -PASS XHTML Mobile parsing ⥲ -PASS XHTML Mobile parsing ← -PASS XHTML Mobile parsing ∘ -PASS XHTML Mobile parsing ∖ -PASS XHTML Mobile parsing ⨳ -PASS XHTML Mobile parsing ⧤ -PASS XHTML Mobile parsing ∣ -PASS XHTML Mobile parsing ⌣ -PASS XHTML Mobile parsing ⪪ -PASS XHTML Mobile parsing ⪬ -PASS XHTML Mobile parsing ⪬︀ -PASS XHTML Mobile parsing Ь -PASS XHTML Mobile parsing ь -PASS XHTML Mobile parsing ⌿ -PASS XHTML Mobile parsing ⧄ -PASS XHTML Mobile parsing / -PASS XHTML Mobile parsing 𝕊 -PASS XHTML Mobile parsing 𝕤 -PASS XHTML Mobile parsing ♠ -PASS XHTML Mobile parsing ♠ -PASS XHTML Mobile parsing ∥ -PASS XHTML Mobile parsing ⊓ -PASS XHTML Mobile parsing ⊓︀ -PASS XHTML Mobile parsing ⊔ -PASS XHTML Mobile parsing ⊔︀ -PASS XHTML Mobile parsing √ -PASS XHTML Mobile parsing ⊏ -PASS XHTML Mobile parsing ⊑ -PASS XHTML Mobile parsing ⊏ -PASS XHTML Mobile parsing ⊑ -PASS XHTML Mobile parsing ⊐ -PASS XHTML Mobile parsing ⊒ -PASS XHTML Mobile parsing ⊐ -PASS XHTML Mobile parsing ⊒ -PASS XHTML Mobile parsing □ -PASS XHTML Mobile parsing □ -PASS XHTML Mobile parsing ⊓ -PASS XHTML Mobile parsing ⊏ -PASS XHTML Mobile parsing ⊑ -PASS XHTML Mobile parsing ⊐ -PASS XHTML Mobile parsing ⊒ -PASS XHTML Mobile parsing ⊔ -PASS XHTML Mobile parsing ▪ -PASS XHTML Mobile parsing □ -PASS XHTML Mobile parsing ▪ -PASS XHTML Mobile parsing → -PASS XHTML Mobile parsing 𝒮 -PASS XHTML Mobile parsing 𝓈 -PASS XHTML Mobile parsing ∖ -PASS XHTML Mobile parsing ⌣ -PASS XHTML Mobile parsing ⋆ -PASS XHTML Mobile parsing ⋆ -PASS XHTML Mobile parsing ☆ -PASS XHTML Mobile parsing ★ -PASS XHTML Mobile parsing ϵ -PASS XHTML Mobile parsing ϕ -PASS XHTML Mobile parsing ¯ -PASS XHTML Mobile parsing ⊂ -PASS XHTML Mobile parsing ⋐ -PASS XHTML Mobile parsing ⪽ -PASS XHTML Mobile parsing ⫅ -PASS XHTML Mobile parsing ⊆ -PASS XHTML Mobile parsing ⫃ -PASS XHTML Mobile parsing ⫁ -PASS XHTML Mobile parsing ⫋ -PASS XHTML Mobile parsing ⊊ -PASS XHTML Mobile parsing ⪿ -PASS XHTML Mobile parsing ⥹ -PASS XHTML Mobile parsing ⊂ -PASS XHTML Mobile parsing ⋐ -PASS XHTML Mobile parsing ⊆ -PASS XHTML Mobile parsing ⫅ -PASS XHTML Mobile parsing ⊆ -PASS XHTML Mobile parsing ⊊ -PASS XHTML Mobile parsing ⫋ -PASS XHTML Mobile parsing ⫇ -PASS XHTML Mobile parsing ⫕ -PASS XHTML Mobile parsing ⫓ -PASS XHTML Mobile parsing ⪸ -PASS XHTML Mobile parsing ≻ -PASS XHTML Mobile parsing ≽ -PASS XHTML Mobile parsing ≻ -PASS XHTML Mobile parsing ⪰ -PASS XHTML Mobile parsing ≽ -PASS XHTML Mobile parsing ≿ -PASS XHTML Mobile parsing ⪰ -PASS XHTML Mobile parsing ⪺ -PASS XHTML Mobile parsing ⪶ -PASS XHTML Mobile parsing ⋩ -PASS XHTML Mobile parsing ≿ -PASS XHTML Mobile parsing ∋ -PASS XHTML Mobile parsing ∑ -PASS XHTML Mobile parsing ∑ -PASS XHTML Mobile parsing ♪ -PASS XHTML Mobile parsing ¹ -PASS XHTML Mobile parsing ² -PASS XHTML Mobile parsing ³ -PASS XHTML Mobile parsing ⊃ -PASS XHTML Mobile parsing ⋑ -PASS XHTML Mobile parsing ⪾ -PASS XHTML Mobile parsing ⫘ -PASS XHTML Mobile parsing ⫆ -PASS XHTML Mobile parsing ⊇ -PASS XHTML Mobile parsing ⫄ -PASS XHTML Mobile parsing ⊃ -PASS XHTML Mobile parsing ⊇ -PASS XHTML Mobile parsing ⟉ -PASS XHTML Mobile parsing ⫗ -PASS XHTML Mobile parsing ⥻ -PASS XHTML Mobile parsing ⫂ -PASS XHTML Mobile parsing ⫌ -PASS XHTML Mobile parsing ⊋ -PASS XHTML Mobile parsing ⫀ -PASS XHTML Mobile parsing ⊃ -PASS XHTML Mobile parsing ⋑ -PASS XHTML Mobile parsing ⊇ -PASS XHTML Mobile parsing ⫆ -PASS XHTML Mobile parsing ⊋ -PASS XHTML Mobile parsing ⫌ -PASS XHTML Mobile parsing ⫈ -PASS XHTML Mobile parsing ⫔ -PASS XHTML Mobile parsing ⫖ -PASS XHTML Mobile parsing ⤦ -PASS XHTML Mobile parsing ↙ -PASS XHTML Mobile parsing ⇙ -PASS XHTML Mobile parsing ↙ -PASS XHTML Mobile parsing ⤪ -PASS XHTML Mobile parsing ß -PASS XHTML Mobile parsing 	 -PASS XHTML Mobile parsing ⌖ -PASS XHTML Mobile parsing Τ -PASS XHTML Mobile parsing τ -PASS XHTML Mobile parsing ⎴ -PASS XHTML Mobile parsing Ť -PASS XHTML Mobile parsing ť -PASS XHTML Mobile parsing Ţ -PASS XHTML Mobile parsing ţ -PASS XHTML Mobile parsing Т -PASS XHTML Mobile parsing т -PASS XHTML Mobile parsing ⃛ -PASS XHTML Mobile parsing ⌕ -PASS XHTML Mobile parsing 𝔗 -PASS XHTML Mobile parsing 𝔱 -PASS XHTML Mobile parsing ∴ -PASS XHTML Mobile parsing ∴ -PASS XHTML Mobile parsing ∴ -PASS XHTML Mobile parsing Θ -PASS XHTML Mobile parsing θ -PASS XHTML Mobile parsing ϑ -PASS XHTML Mobile parsing ϑ -PASS XHTML Mobile parsing ≈ -PASS XHTML Mobile parsing ∼ -PASS XHTML Mobile parsing    -PASS XHTML Mobile parsing   -PASS XHTML Mobile parsing   -PASS XHTML Mobile parsing ≈ -PASS XHTML Mobile parsing ∼ -PASS XHTML Mobile parsing Þ -PASS XHTML Mobile parsing þ -PASS XHTML Mobile parsing ˜ -PASS XHTML Mobile parsing ∼ -PASS XHTML Mobile parsing ≃ -PASS XHTML Mobile parsing ≅ -PASS XHTML Mobile parsing ≈ -PASS XHTML Mobile parsing ⨱ -PASS XHTML Mobile parsing ⊠ -PASS XHTML Mobile parsing × -PASS XHTML Mobile parsing ⨰ -PASS XHTML Mobile parsing ∭ -PASS XHTML Mobile parsing ⤨ -PASS XHTML Mobile parsing ⌶ -PASS XHTML Mobile parsing ⫱ -PASS XHTML Mobile parsing ⊤ -PASS XHTML Mobile parsing 𝕋 -PASS XHTML Mobile parsing 𝕥 -PASS XHTML Mobile parsing ⫚ -PASS XHTML Mobile parsing ⤩ -PASS XHTML Mobile parsing ‴ -PASS XHTML Mobile parsing ™ -PASS XHTML Mobile parsing ™ -PASS XHTML Mobile parsing ▵ -PASS XHTML Mobile parsing ▿ -PASS XHTML Mobile parsing ◃ -PASS XHTML Mobile parsing ⊴ -PASS XHTML Mobile parsing ≜ -PASS XHTML Mobile parsing ▹ -PASS XHTML Mobile parsing ⊵ -PASS XHTML Mobile parsing ◬ -PASS XHTML Mobile parsing ≜ -PASS XHTML Mobile parsing ⨺ -PASS XHTML Mobile parsing ⃛ -PASS XHTML Mobile parsing ⨹ -PASS XHTML Mobile parsing ⧍ -PASS XHTML Mobile parsing ⨻ -PASS XHTML Mobile parsing ⏢ -PASS XHTML Mobile parsing 𝒯 -PASS XHTML Mobile parsing 𝓉 -PASS XHTML Mobile parsing Ц -PASS XHTML Mobile parsing ц -PASS XHTML Mobile parsing Ћ -PASS XHTML Mobile parsing ћ -PASS XHTML Mobile parsing Ŧ -PASS XHTML Mobile parsing ŧ -PASS XHTML Mobile parsing ≬ -PASS XHTML Mobile parsing ↞ -PASS XHTML Mobile parsing ↠ -PASS XHTML Mobile parsing Ú -PASS XHTML Mobile parsing ú -PASS XHTML Mobile parsing ↑ -PASS XHTML Mobile parsing ↟ -PASS XHTML Mobile parsing ⇑ -PASS XHTML Mobile parsing ⥉ -PASS XHTML Mobile parsing Ў -PASS XHTML Mobile parsing ў -PASS XHTML Mobile parsing Ŭ -PASS XHTML Mobile parsing ŭ -PASS XHTML Mobile parsing Û -PASS XHTML Mobile parsing û -PASS XHTML Mobile parsing У -PASS XHTML Mobile parsing у -PASS XHTML Mobile parsing ⇅ -PASS XHTML Mobile parsing Ű -PASS XHTML Mobile parsing ű -PASS XHTML Mobile parsing ⥮ -PASS XHTML Mobile parsing ⥾ -PASS XHTML Mobile parsing 𝔘 -PASS XHTML Mobile parsing 𝔲 -PASS XHTML Mobile parsing Ù -PASS XHTML Mobile parsing ù -PASS XHTML Mobile parsing ⥣ -PASS XHTML Mobile parsing ↿ -PASS XHTML Mobile parsing ↾ -PASS XHTML Mobile parsing ▀ -PASS XHTML Mobile parsing ⌜ -PASS XHTML Mobile parsing ⌜ -PASS XHTML Mobile parsing ⌏ -PASS XHTML Mobile parsing ◸ -PASS XHTML Mobile parsing Ū -PASS XHTML Mobile parsing ū -PASS XHTML Mobile parsing ¨ -PASS XHTML Mobile parsing _ -PASS XHTML Mobile parsing ⏟ -PASS XHTML Mobile parsing ⎵ -PASS XHTML Mobile parsing ⏝ -PASS XHTML Mobile parsing ⋃ -PASS XHTML Mobile parsing ⊎ -PASS XHTML Mobile parsing Ų -PASS XHTML Mobile parsing ų -PASS XHTML Mobile parsing 𝕌 -PASS XHTML Mobile parsing 𝕦 -PASS XHTML Mobile parsing ⤒ -PASS XHTML Mobile parsing ↑ -PASS XHTML Mobile parsing ↑ -PASS XHTML Mobile parsing ⇑ -PASS XHTML Mobile parsing ⇅ -PASS XHTML Mobile parsing ↕ -PASS XHTML Mobile parsing ↕ -PASS XHTML Mobile parsing ⇕ -PASS XHTML Mobile parsing ⥮ -PASS XHTML Mobile parsing ↿ -PASS XHTML Mobile parsing ↾ -PASS XHTML Mobile parsing ⊎ -PASS XHTML Mobile parsing ↖ -PASS XHTML Mobile parsing ↗ -PASS XHTML Mobile parsing υ -PASS XHTML Mobile parsing ϒ -PASS XHTML Mobile parsing ϒ -PASS XHTML Mobile parsing Υ -PASS XHTML Mobile parsing υ -PASS XHTML Mobile parsing ↥ -PASS XHTML Mobile parsing ⊥ -PASS XHTML Mobile parsing ⇈ -PASS XHTML Mobile parsing ⌝ -PASS XHTML Mobile parsing ⌝ -PASS XHTML Mobile parsing ⌎ -PASS XHTML Mobile parsing Ů -PASS XHTML Mobile parsing ů -PASS XHTML Mobile parsing ◹ -PASS XHTML Mobile parsing 𝒰 -PASS XHTML Mobile parsing 𝓊 -PASS XHTML Mobile parsing ⋰ -PASS XHTML Mobile parsing Ũ -PASS XHTML Mobile parsing ũ -PASS XHTML Mobile parsing ▵ -PASS XHTML Mobile parsing ▴ -PASS XHTML Mobile parsing ⇈ -PASS XHTML Mobile parsing Ü -PASS XHTML Mobile parsing ü -PASS XHTML Mobile parsing ⦧ -PASS XHTML Mobile parsing ⦜ -PASS XHTML Mobile parsing ϵ -PASS XHTML Mobile parsing ϰ -PASS XHTML Mobile parsing ∅ -PASS XHTML Mobile parsing ϕ -PASS XHTML Mobile parsing ϖ -PASS XHTML Mobile parsing ∝ -PASS XHTML Mobile parsing ↕ -PASS XHTML Mobile parsing ⇕ -PASS XHTML Mobile parsing ϱ -PASS XHTML Mobile parsing ς -PASS XHTML Mobile parsing ⊊︀ -PASS XHTML Mobile parsing ⫋︀ -PASS XHTML Mobile parsing ⊋︀ -PASS XHTML Mobile parsing ⫌︀ -PASS XHTML Mobile parsing ϑ -PASS XHTML Mobile parsing ⊲ -PASS XHTML Mobile parsing ⊳ -PASS XHTML Mobile parsing ⫨ -PASS XHTML Mobile parsing ⫫ -PASS XHTML Mobile parsing ⫩ -PASS XHTML Mobile parsing В -PASS XHTML Mobile parsing в -PASS XHTML Mobile parsing ⊢ -PASS XHTML Mobile parsing ⊨ -PASS XHTML Mobile parsing ⊩ -PASS XHTML Mobile parsing ⊫ -PASS XHTML Mobile parsing ⫦ -PASS XHTML Mobile parsing ⊻ -PASS XHTML Mobile parsing ∨ -PASS XHTML Mobile parsing ⋁ -PASS XHTML Mobile parsing ≚ -PASS XHTML Mobile parsing ⋮ -PASS XHTML Mobile parsing | -PASS XHTML Mobile parsing ‖ -PASS XHTML Mobile parsing | -PASS XHTML Mobile parsing ‖ -PASS XHTML Mobile parsing ∣ -PASS XHTML Mobile parsing | -PASS XHTML Mobile parsing ❘ -PASS XHTML Mobile parsing ≀ -PASS XHTML Mobile parsing   -PASS XHTML Mobile parsing 𝔙 -PASS XHTML Mobile parsing 𝔳 -PASS XHTML Mobile parsing ⊲ -PASS XHTML Mobile parsing ⊂⃒ -PASS XHTML Mobile parsing ⊃⃒ -PASS XHTML Mobile parsing 𝕍 -PASS XHTML Mobile parsing 𝕧 -PASS XHTML Mobile parsing ∝ -PASS XHTML Mobile parsing ⊳ -PASS XHTML Mobile parsing 𝒱 -PASS XHTML Mobile parsing 𝓋 -PASS XHTML Mobile parsing ⫋︀ -PASS XHTML Mobile parsing ⊊︀ -PASS XHTML Mobile parsing ⫌︀ -PASS XHTML Mobile parsing ⊋︀ -PASS XHTML Mobile parsing ⊪ -PASS XHTML Mobile parsing ⦚ -PASS XHTML Mobile parsing Ŵ -PASS XHTML Mobile parsing ŵ -PASS XHTML Mobile parsing ⩟ -PASS XHTML Mobile parsing ∧ -PASS XHTML Mobile parsing ⋀ -PASS XHTML Mobile parsing ≙ -PASS XHTML Mobile parsing ℘ -PASS XHTML Mobile parsing 𝔚 -PASS XHTML Mobile parsing 𝔴 -PASS XHTML Mobile parsing 𝕎 -PASS XHTML Mobile parsing 𝕨 -PASS XHTML Mobile parsing ℘ -PASS XHTML Mobile parsing ≀ -PASS XHTML Mobile parsing ≀ -PASS XHTML Mobile parsing 𝒲 -PASS XHTML Mobile parsing 𝓌 -PASS XHTML Mobile parsing ⋂ -PASS XHTML Mobile parsing ◯ -PASS XHTML Mobile parsing ⋃ -PASS XHTML Mobile parsing ▽ -PASS XHTML Mobile parsing 𝔛 -PASS XHTML Mobile parsing 𝔵 -PASS XHTML Mobile parsing ⟷ -PASS XHTML Mobile parsing ⟺ -PASS XHTML Mobile parsing Ξ -PASS XHTML Mobile parsing ξ -PASS XHTML Mobile parsing ⟵ -PASS XHTML Mobile parsing ⟸ -PASS XHTML Mobile parsing ⟼ -PASS XHTML Mobile parsing ⋻ -PASS XHTML Mobile parsing ⨀ -PASS XHTML Mobile parsing 𝕏 -PASS XHTML Mobile parsing 𝕩 -PASS XHTML Mobile parsing ⨁ -PASS XHTML Mobile parsing ⨂ -PASS XHTML Mobile parsing ⟶ -PASS XHTML Mobile parsing ⟹ -PASS XHTML Mobile parsing 𝒳 -PASS XHTML Mobile parsing 𝓍 -PASS XHTML Mobile parsing ⨆ -PASS XHTML Mobile parsing ⨄ -PASS XHTML Mobile parsing △ -PASS XHTML Mobile parsing ⋁ -PASS XHTML Mobile parsing ⋀ -PASS XHTML Mobile parsing Ý -PASS XHTML Mobile parsing ý -PASS XHTML Mobile parsing Я -PASS XHTML Mobile parsing я -PASS XHTML Mobile parsing Ŷ -PASS XHTML Mobile parsing ŷ -PASS XHTML Mobile parsing Ы -PASS XHTML Mobile parsing ы -PASS XHTML Mobile parsing ¥ -PASS XHTML Mobile parsing 𝔜 -PASS XHTML Mobile parsing 𝔶 -PASS XHTML Mobile parsing Ї -PASS XHTML Mobile parsing ї -PASS XHTML Mobile parsing 𝕐 -PASS XHTML Mobile parsing 𝕪 -PASS XHTML Mobile parsing 𝒴 -PASS XHTML Mobile parsing 𝓎 -PASS XHTML Mobile parsing Ю -PASS XHTML Mobile parsing ю -PASS XHTML Mobile parsing ÿ -PASS XHTML Mobile parsing Ÿ -PASS XHTML Mobile parsing Ź -PASS XHTML Mobile parsing ź -PASS XHTML Mobile parsing Ž -PASS XHTML Mobile parsing ž -PASS XHTML Mobile parsing З -PASS XHTML Mobile parsing з -PASS XHTML Mobile parsing Ż -PASS XHTML Mobile parsing ż -PASS XHTML Mobile parsing ℨ -PASS XHTML Mobile parsing ​ -PASS XHTML Mobile parsing Ζ -PASS XHTML Mobile parsing ζ -PASS XHTML Mobile parsing 𝔷 -PASS XHTML Mobile parsing ℨ -PASS XHTML Mobile parsing Ж -PASS XHTML Mobile parsing ж -PASS XHTML Mobile parsing ⇝ -PASS XHTML Mobile parsing 𝕫 -PASS XHTML Mobile parsing ℤ -PASS XHTML Mobile parsing 𝒵 -PASS XHTML Mobile parsing 𝓏 -PASS XHTML Mobile parsing ‍ -PASS XHTML Mobile parsing ‌ -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/dom.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/dom.idl index 90419f08..e97f803 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/dom.idl +++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/dom.idl
@@ -266,8 +266,8 @@ HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName); HTMLCollection getElementsByClassName(DOMString classNames); - [NewObject] Element createElement(DOMString localName, optional ElementCreationOptions options); - [NewObject] Element createElementNS(DOMString? namespace, DOMString qualifiedName, optional ElementCreationOptions options); + [NewObject] Element createElement(DOMString localName, optional (DOMString or ElementCreationOptions) options); + [NewObject] Element createElementNS(DOMString? namespace, DOMString qualifiedName, optional (DOMString or ElementCreationOptions) options); [NewObject] DocumentFragment createDocumentFragment(); [NewObject] Text createTextNode(DOMString data); [NewObject] CDATASection createCDATASection(DOMString data);
diff --git a/third_party/WebKit/LayoutTests/fast/css/CSSStyleSheet-constructable.html b/third_party/WebKit/LayoutTests/fast/css/CSSStyleSheet-constructable.html index cc558ba..5e4a0728 100644 --- a/third_party/WebKit/LayoutTests/fast/css/CSSStyleSheet-constructable.html +++ b/third_party/WebKit/LayoutTests/fast/css/CSSStyleSheet-constructable.html
@@ -2,60 +2,180 @@ <!-- TODO(rakina): move to WPT once spec is finalized --> <script src = '../../resources/testharness.js'></script> <script src = '../../resources/testharnessreport.js'></script> + +<section id="firstSection"> + <div> + <span class="green"></span> + <span class="red"></span> + <span class="blue"></span> + <span class="white"></span> + <span class="yellow"></span> + </div> +</section> +<section id="secondSection"></section> + <script> 'use strict'; -const redStyleTexts = [".red { color: red; }", ".red + span + span { color: red; }"]; -const yellowStyleText = ".yellow { color: yellow; }"; const greenStyleText = ".green { color: green; }"; +const redStyleTexts = [".red { color: red; }", ".red + span + span { color: red; }"]; const blueStyleTexts = [".blue { color: blue; }", ".blue + span + span { color: blue; }"]; - +const whiteStyleText = "* { color: white; }"; +const yellowStyleText = ".yellow { color: yellow; }"; test(() => { // Style sheets can be created - const redStyleSheet = new CSSStyleSheet(redStyleTexts[0] + redStyleTexts[1], {media: "screen, print"}); - const yellowStyleSheet = new CSSStyleSheet(yellowStyleText, {title: "Yellow", disabled: false}); const greenStyleSheet = new CSSStyleSheet(greenStyleText); + const redStyleSheet = new CSSStyleSheet(redStyleTexts[0] + redStyleTexts[1], {media: "screen, print"}); const blueStyleSheet = new CSSStyleSheet(blueStyleTexts[0] + blueStyleTexts[1], {title: "Blue", disabled: true}); + const whiteStyleSheet = new CSSStyleSheet(whiteStyleText, {title: "White", alternate: true}); + const yellowStyleSheet = new CSSStyleSheet(yellowStyleText, {disabled: false}); - assert_equals(redStyleSheet.title, ""); - assert_equals(yellowStyleSheet.title, "Yellow"); assert_equals(greenStyleSheet.title, ""); + assert_equals(redStyleSheet.title, ""); assert_equals(blueStyleSheet.title, "Blue"); + assert_equals(whiteStyleSheet.title, "White"); + assert_equals(yellowStyleSheet.title, ""); - assert_equals(redStyleSheet.ownerNode, null); - assert_equals(yellowStyleSheet.ownerNode, null); assert_equals(greenStyleSheet.ownerNode, null); + assert_equals(redStyleSheet.ownerNode, null); assert_equals(blueStyleSheet.ownerNode, null); + assert_equals(whiteStyleSheet.ownerNode, null); + assert_equals(yellowStyleSheet.ownerNode, null); - assert_equals(redStyleSheet.ownerRule, null); - assert_equals(yellowStyleSheet.ownerRule, null); assert_equals(greenStyleSheet.ownerRule, null); + assert_equals(redStyleSheet.ownerRule, null); assert_equals(blueStyleSheet.ownerRule, null); + assert_equals(whiteStyleSheet.ownerRule, null); + assert_equals(yellowStyleSheet.ownerRule, null); + assert_equals(greenStyleSheet.media.length, 0); assert_equals(redStyleSheet.media.length, 2); assert_equals(redStyleSheet.media.item(0), "screen"); assert_equals(redStyleSheet.media.item(1), "print"); - assert_equals(yellowStyleSheet.media.length, 0); - assert_equals(greenStyleSheet.media.length, 0); assert_equals(blueStyleSheet.media.length, 0); + assert_equals(whiteStyleSheet.media.length, 0); + assert_equals(yellowStyleSheet.media.length, 0); - assert_false(redStyleSheet.disabled); - assert_false(yellowStyleSheet.disabled); assert_false(greenStyleSheet.disabled); + assert_false(redStyleSheet.disabled); assert_true(blueStyleSheet.disabled); + assert_false(whiteStyleSheet.disabled); + assert_false(yellowStyleSheet.disabled); - assert_equals(redStyleSheet.cssRules.length, 2); - assert_equals(yellowStyleSheet.cssRules.length, 1); assert_equals(greenStyleSheet.cssRules.length, 1); + assert_equals(redStyleSheet.cssRules.length, 2); assert_equals(blueStyleSheet.cssRules.length, 2); + assert_equals(whiteStyleSheet.cssRules.length, 1); + assert_equals(yellowStyleSheet.cssRules.length, 1); + assert_equals(greenStyleSheet.cssRules[0].cssText, greenStyleText); assert_equals(redStyleSheet.cssRules[0].cssText, redStyleTexts[0]); assert_equals(redStyleSheet.cssRules[1].cssText, redStyleTexts[1]); - assert_equals(yellowStyleSheet.cssRules[0].cssText, yellowStyleText); - assert_equals(greenStyleSheet.cssRules[0].cssText, greenStyleText); assert_equals(blueStyleSheet.cssRules[0].cssText, blueStyleTexts[0]); assert_equals(blueStyleSheet.cssRules[1].cssText, blueStyleTexts[1]); + assert_equals(whiteStyleSheet.cssRules[0].cssText, whiteStyleText); + assert_equals(yellowStyleSheet.cssRules[0].cssText, yellowStyleText); - // TODO(rakina): add test for alternate flag once constructed style can be applied to node }, 'Style sheets can be constructed using script'); + +test(() => { + const greenStyleSheet = new CSSStyleSheet(greenStyleText); + const redStyleSheet = new CSSStyleSheet(redStyleTexts[0] + redStyleTexts[1], {media: "screen, print"}); + const blueStyleSheet = new CSSStyleSheet(blueStyleTexts[0] + blueStyleTexts[1], {title: "Blue", disabled: true}); + const whiteStyleSheet = new CSSStyleSheet(whiteStyleText, {title: "White", alternate: true}); + const yellowStyleSheet = new CSSStyleSheet(yellowStyleText, {disabled: false}); + const firstDiv = document.querySelector('#firstSection > div'); + + const greenSpan = firstDiv.children[0]; + const redSpan = firstDiv.children[1]; + const blueSpan = firstDiv.children[2]; + const whiteSpan = firstDiv.children[3]; + const yellowSpan = firstDiv.children[4]; + + // Lists of style sheets can be created, assigned and read. + const whiteList = new StyleSheetList([whiteStyleSheet]); + document.moreStyleSheets = whiteList; + // alternate stylesheets aren't applied when title != current preferable name + assert_equals(getComputedStyle(greenSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(redSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(blueSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(whiteSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(yellowSpan).color, "rgb(0, 0, 0)"); + + document.moreStyleSheets = new StyleSheetList([greenStyleSheet, blueStyleSheet]); + // disabled stylesheets aren't applied + assert_equals(getComputedStyle(greenSpan).color, "rgb(0, 128, 0)"); + assert_equals(getComputedStyle(redSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(blueSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(whiteSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(yellowSpan).color, "rgb(0, 0, 0)"); + + const orangeList = new StyleSheetList([redStyleSheet, yellowStyleSheet]); + document.moreStyleSheets = orangeList; + + assert_equals(getComputedStyle(greenSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(redSpan).color, "rgb(255, 0, 0)"); + assert_equals(getComputedStyle(blueSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(whiteSpan).color, "rgb(255, 0, 0)"); + assert_equals(getComputedStyle(yellowSpan).color, "rgb(255, 255, 0)"); + + document.moreStyleSheets = new StyleSheetList([redStyleSheet, yellowStyleSheet, greenStyleSheet, blueStyleSheet]); + assert_equals(getComputedStyle(greenSpan).color, "rgb(0, 128, 0)"); + assert_equals(getComputedStyle(redSpan).color, "rgb(255, 0, 0)"); + assert_equals(getComputedStyle(blueSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(whiteSpan).color, "rgb(255, 0, 0)"); + assert_equals(getComputedStyle(yellowSpan).color, "rgb(255, 255, 0)"); + +}, 'Constructed style sheets can be applied on document'); + +test(() => { + const greenStyleSheet = new CSSStyleSheet(greenStyleText); + const redStyleSheet = new CSSStyleSheet(redStyleTexts[0] + redStyleTexts[1], {media: "screen, print"}); + const blueStyleSheet = new CSSStyleSheet(blueStyleTexts[0] + blueStyleTexts[1], {title: "Blue", disabled: true}); + const whiteStyleSheet = new CSSStyleSheet(whiteStyleText, {title: "White", alternate: true}); + const yellowStyleSheet = new CSSStyleSheet(yellowStyleText, {disabled: false}); + + const firstDiv = document.querySelector('#firstSection > div'); + const secondDiv = firstDiv.cloneNode(true); + const shadowRoot = document.querySelector('#secondSection').attachShadow({mode: 'open'}); + shadowRoot.appendChild(secondDiv); + + const greenShadowSpan = secondDiv.children[0]; + const redShadowSpan = secondDiv.children[1]; + const blueShadowSpan = secondDiv.children[2]; + const whiteShadowSpan = secondDiv.children[3]; + const yellowShadowSpan = secondDiv.children[4]; + + shadowRoot.moreStyleSheets = new StyleSheetList([whiteStyleSheet]); + assert_equals(getComputedStyle(greenShadowSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(redShadowSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(blueShadowSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(whiteShadowSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(yellowShadowSpan).color, "rgb(0, 0, 0)"); + + shadowRoot.moreStyleSheets = new StyleSheetList([greenStyleSheet, blueStyleSheet]); + assert_equals(getComputedStyle(greenShadowSpan).color, "rgb(0, 128, 0)"); + assert_equals(getComputedStyle(redShadowSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(blueShadowSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(whiteShadowSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(yellowShadowSpan).color, "rgb(0, 0, 0)"); + + const orangeList = new StyleSheetList([redStyleSheet, yellowStyleSheet]); + shadowRoot.moreStyleSheets = orangeList; + assert_equals(getComputedStyle(greenShadowSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(redShadowSpan).color, "rgb(255, 0, 0)"); + assert_equals(getComputedStyle(blueShadowSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(whiteShadowSpan).color, "rgb(255, 0, 0)"); + assert_equals(getComputedStyle(yellowShadowSpan).color, "rgb(255, 255, 0)"); + + shadowRoot.moreStyleSheets = new StyleSheetList([redStyleSheet, yellowStyleSheet, greenStyleSheet, blueStyleSheet]); + assert_equals(getComputedStyle(greenShadowSpan).color, "rgb(0, 128, 0)"); + assert_equals(getComputedStyle(redShadowSpan).color, "rgb(255, 0, 0)"); + assert_equals(getComputedStyle(blueShadowSpan).color, "rgb(0, 0, 0)"); + assert_equals(getComputedStyle(whiteShadowSpan).color, "rgb(255, 0, 0)"); + assert_equals(getComputedStyle(yellowShadowSpan).color, "rgb(255, 255, 0)"); +}, 'Constructed style sheets can be applied on shadow root'); + +// TODO(rakina): Add tests with modifying the stylesheets through CSSOM, after that is supported for constructed CSSStyleSheet. + </script>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/shadow/selection-in-nested-shadow.html b/third_party/WebKit/LayoutTests/fast/dom/shadow/selection-in-nested-shadow.html index 36ff3019..0d20150 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/shadow/selection-in-nested-shadow.html +++ b/third_party/WebKit/LayoutTests/fast/dom/shadow/selection-in-nested-shadow.html
@@ -36,8 +36,8 @@ host.remove(); }, [ - '|<div>', - ' ', + '<div>', + ' |', '</div>', ].join('\n'), {dumpAs: 'flattree'}); @@ -67,8 +67,8 @@ host.remove(); }, [ - '|<div>', - ' ', + '<div>', + ' |', '</div>', ].join('\n'), {dumpAs: 'flattree'});
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_color_inline-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_color_inline-expected.txt index 6383304..8b5943836 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_color_inline-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_color_inline-expected.txt
@@ -17,18 +17,18 @@ LayoutNGBlockFlow {P} at (0,115) size 784x80 [bgcolor=#C0C0C0] LayoutText {#text} at (0,0) size 677x19 text run at (0,0) width 677: "This is an unstyled element, save for the background color, and containing inline elements with a classes of " - LayoutInline {SPAN} at (0,0) size 734x28 [border: (3px solid #800080)] + LayoutInline {SPAN} at (0,0) size 64x25 [border: (3px solid #800080)] LayoutText {#text} at (679,0) size 58x19 text run at (679,0) width 58: "class one" LayoutText {#text} at (739,0) size 9x19 text run at (739,0) width 9: ", " - LayoutInline {SPAN} at (0,0) size 1528x48 [border: (3px solid #800080)] + LayoutInline {SPAN} at (0,0) size 781x45 [border: (3px solid #800080)] LayoutText {#text} at (750,0) size 781x39 text run at (750,0) width 31: "class" text run at (0,20) width 24: "two" LayoutText {#text} at (27,20) size 35x19 text run at (27,20) width 35: ", and " - LayoutInline {SPAN} at (0,0) size 127x28 [border: (3px solid #800080) (3px solid #008000) (3px solid #0000FF) (3px solid #FFFF00)] + LayoutInline {SPAN} at (0,0) size 71x25 [border: (3px solid #800080) (3px solid #008000) (3px solid #0000FF) (3px solid #FFFF00)] LayoutText {#text} at (65,20) size 65x19 text run at (65,20) width 65: "class three" LayoutText {#text} at (133,20) size 764x59 @@ -50,17 +50,17 @@ LayoutNGBlockFlow {P} at (4,4) size 762x80 [bgcolor=#C0C0C0] LayoutText {#text} at (0,0) size 677x19 text run at (0,0) width 677: "This is an unstyled element, save for the background color, and containing inline elements with a classes of " - LayoutInline {SPAN} at (0,0) size 734x28 [border: (3px solid #800080)] + LayoutInline {SPAN} at (0,0) size 64x25 [border: (3px solid #800080)] LayoutText {#text} at (679,0) size 58x19 text run at (679,0) width 58: "class one" LayoutText {#text} at (739,0) size 5x19 text run at (739,0) width 5: "," - LayoutInline {SPAN} at (0,0) size 64x28 [border: (3px solid #800080)] + LayoutInline {SPAN} at (0,0) size 64x25 [border: (3px solid #800080)] LayoutText {#text} at (3,20) size 58x19 text run at (3,20) width 58: "class two" LayoutText {#text} at (64,20) size 35x19 text run at (64,20) width 35: ", and " - LayoutInline {SPAN} at (0,0) size 164x28 [border: (3px solid #800080) (3px solid #008000) (3px solid #0000FF) (3px solid #FFFF00)] + LayoutInline {SPAN} at (0,0) size 71x25 [border: (3px solid #800080) (3px solid #008000) (3px solid #0000FF) (3px solid #FFFF00)] LayoutText {#text} at (102,20) size 65x19 text run at (102,20) width 65: "class three" LayoutText {#text} at (170,20) size 756x59
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_style_inline-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_style_inline-expected.txt index 9b92e74..198cdaad 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_style_inline-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/box_properties/border_style_inline-expected.txt
@@ -17,13 +17,13 @@ LayoutNGBlockFlow {P} at (0,115) size 784x60 [bgcolor=#C0C0C0] LayoutText {#text} at (0,0) size 664x19 text run at (0,0) width 664: "This is an unstyled element, save for the background color, and it contains inline elements with classes of " - LayoutInline {SPAN} at (0,0) size 721x34 [border: (5px dashed #000000)] + LayoutInline {SPAN} at (0,0) size 68x29 [border: (5px dashed #000000)] LayoutText {#text} at (668,0) size 58x19 text run at (668,0) width 58: "class one" LayoutText {#text} at (730,0) size 778x39 text run at (730,0) width 48: ", which" text run at (0,20) width 263: "will result in a dashed thick black border; " - LayoutInline {SPAN} at (0,0) size 321x34 [border: (5px groove #FF0000)] + LayoutInline {SPAN} at (0,0) size 68x29 [border: (5px groove #FF0000)] LayoutText {#text} at (268,20) size 58x19 text run at (268,20) width 58: "class two" LayoutText {#text} at (331,20) size 373x19 @@ -49,13 +49,13 @@ LayoutNGBlockFlow {P} at (4,4) size 762x60 [bgcolor=#C0C0C0] LayoutText {#text} at (0,0) size 664x19 text run at (0,0) width 664: "This is an unstyled element, save for the background color, and it contains inline elements with classes of " - LayoutInline {SPAN} at (0,0) size 721x34 [border: (5px dashed #000000)] + LayoutInline {SPAN} at (0,0) size 68x29 [border: (5px dashed #000000)] LayoutText {#text} at (668,0) size 58x19 text run at (668,0) width 58: "class one" LayoutText {#text} at (730,0) size 735x39 text run at (730,0) width 5: "," text run at (0,20) width 306: "which will result in a dashed thick black border; " - LayoutInline {SPAN} at (0,0) size 364x34 [border: (5px groove #FF0000)] + LayoutInline {SPAN} at (0,0) size 68x29 [border: (5px groove #FF0000)] LayoutText {#text} at (311,20) size 58x19 text run at (311,20) width 58: "class two" LayoutText {#text} at (374,20) size 369x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/display-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/display-expected.txt index 75b43008..878fae30 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/display-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/display-expected.txt
@@ -25,7 +25,7 @@ LayoutInline {P} at (0,0) size 448x19 LayoutText {#text} at (0,0) size 448x19 text run at (0,0) width 448: "This sentence should be part of an inline element, as are the next three. " - LayoutInline {P} at (0,0) size 1170x62 + LayoutInline {P} at (0,0) size 766x59 LayoutText {#text} at (447,0) size 766x59 text run at (447,0) width 275: "This sentence and the next two are part of a" text run at (0,20) width 766: "second inline element. They should therefore appear, along with the sentence above, to be all one paragraph which is four" @@ -84,7 +84,7 @@ LayoutInline {P} at (0,0) size 448x19 LayoutText {#text} at (0,0) size 448x19 text run at (0,0) width 448: "This sentence should be part of an inline element, as are the next three. " - LayoutInline {P} at (0,0) size 1170x62 + LayoutInline {P} at (0,0) size 736x59 LayoutText {#text} at (447,0) size 736x59 text run at (447,0) width 275: "This sentence and the next two are part of a" text run at (0,20) width 736: "second inline element. They should therefore appear, along with the sentence above, to be all one paragraph which is"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_position-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_position-expected.txt index 5cd65af1..674961e6 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_position-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_position-expected.txt
@@ -23,7 +23,7 @@ text run at (0,20) width 154: "space beneath the bullet." LayoutNGBlockFlow {UL} at (0,171) size 784x40 LayoutNGListItem {LI} at (40,0) size 744x40 - LayoutInline (anonymous) at (0,0) size 11x19 + LayoutInline (anonymous) at (0,0) size 10x19 LayoutText (anonymous) at (-1,0) size 10x19 text run at (-1,0) width 10: "\x{2022} " LayoutText {#text} at (24,0) size 713x39 @@ -51,7 +51,7 @@ text run at (0,20) width 193: "blank space beneath the bullet." LayoutNGBlockFlow {UL} at (4,60) size 762x40 LayoutNGListItem {LI} at (40,0) size 722x40 - LayoutInline (anonymous) at (0,0) size 11x19 + LayoutInline (anonymous) at (0,0) size 10x19 LayoutText (anonymous) at (-1,0) size 10x19 text run at (-1,0) width 10: "\x{2022} " LayoutText {#text} at (24,0) size 713x39
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/inline_elements-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/inline_elements-expected.txt index 441fbb62..90945cdb 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/inline_elements-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/formatting_model/inline_elements-expected.txt
@@ -24,7 +24,7 @@ LayoutNGBlockFlow {P} at (0,179) size 769x192 LayoutText {#text} at (0,6) size 187x19 text run at (0,6) width 187: "This is a paragraph that has a " - LayoutInline {SPAN} at (0,0) size 989x180 [border: (10px solid #FF0000)] + LayoutInline {SPAN} at (0,0) size 762x173 [border: (10px solid #FF0000)] LayoutText {#text} at (239,6) size 762x147 text run at (239,6) width 523: "very long span in it, and the span has a 10px red border separated from the span by" text run at (0,38) width 727: "2pt, and a margin of 30pt. The padding and border should be present on all sides of the span (although vertical lines" @@ -37,7 +37,7 @@ LayoutNGBlockFlow {P} at (0,387) size 769x64 LayoutText {#text} at (0,0) size 159x15 text run at (0,0) width 159: "This is a paragraph that has a " - LayoutInline {SPAN} at (0,0) size 885x108 [border: (12px solid #FF0000)] + LayoutInline {SPAN} at (0,0) size 764x93 [border: (12px solid #FF0000)] LayoutText {#text} at (173,0) size 764x63 text run at (173,0) width 553: "very long span in it, and the span has a 12px red border separated from the span by 2pt of padding (the" text run at (0,16) width 764: "difference between the line-height and the font-size), which should overlap with the lines of text above and below the span, since the padding" @@ -60,7 +60,7 @@ LayoutNGBlockFlow {P} at (4,4) size 747x192 LayoutText {#text} at (0,6) size 187x19 text run at (0,6) width 187: "This is a paragraph that has a " - LayoutInline {SPAN} at (0,0) size 969x180 [border: (10px solid #FF0000)] + LayoutInline {SPAN} at (0,0) size 747x173 [border: (10px solid #FF0000)] LayoutText {#text} at (239,6) size 747x147 text run at (239,6) width 503: "very long span in it, and the span has a 10px red border separated from the span" text run at (0,38) width 747: "by 2pt, and a margin of 30pt. The padding and border should be present on all sides of the span (although vertical lines" @@ -73,7 +73,7 @@ LayoutNGBlockFlow {P} at (4,212) size 747x64 LayoutText {#text} at (0,0) size 159x15 text run at (0,0) width 159: "This is a paragraph that has a " - LayoutInline {SPAN} at (0,0) size 885x108 [border: (12px solid #FF0000)] + LayoutInline {SPAN} at (0,0) size 726x93 [border: (12px solid #FF0000)] LayoutText {#text} at (173,0) size 726x63 text run at (173,0) width 553: "very long span in it, and the span has a 12px red border separated from the span by 2pt of padding (the" text run at (0,16) width 716: "difference between the line-height and the font-size), which should overlap with the lines of text above and below the span, since the"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/units/length_units-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/units/length_units-expected.txt index 21e72609..c77f182 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/units/length_units-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/units/length_units-expected.txt
@@ -159,7 +159,7 @@ text run at (114,54) width 264: "border-left" LayoutText {#text} at (378,49) size 53x46 text run at (378,49) width 53: " of " - LayoutInline {CODE} at (0,0) size 1042x90 + LayoutInline {CODE} at (0,0) size 629x90 LayoutText {#text} at (431,54) size 629x90 text run at (431,54) width 216: "1ex solid" text run at (18,102) width 144: "purple"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0805-c5516-ibrdr-c-00-a-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0805-c5516-ibrdr-c-00-a-expected.txt index b8b3519..48baa5d 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0805-c5516-ibrdr-c-00-a-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0805-c5516-ibrdr-c-00-a-expected.txt
@@ -4,17 +4,17 @@ LayoutNGBlockFlow {HTML} at (0,0) size 800x252 LayoutNGBlockFlow {BODY} at (8,48) size 784x156 LayoutNGBlockFlow {P} at (48,0) size 688x20 - LayoutInline {SPAN} at (0,0) size 241x28 [border: (3px solid #008000)] + LayoutInline {SPAN} at (0,0) size 241x25 [border: (3px solid #008000)] LayoutText {#text} at (3,0) size 235x19 text run at (3,0) width 235: "This box should have a green border." LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow {P} at (48,68) size 688x20 - LayoutInline {SPAN} at (0,0) size 241x28 [border: (3px solid #008000)] + LayoutInline {SPAN} at (0,0) size 241x25 [border: (3px solid #008000)] LayoutText {#text} at (3,0) size 235x19 text run at (3,0) width 235: "This box should have a green border." LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow {P} at (48,136) size 688x20 - LayoutInline {SPAN} at (0,0) size 594x115 [border: (32px solid #800080) (32px solid #008000) (32px solid #0000FF) (32px solid #FFFF00)] + LayoutInline {SPAN} at (0,0) size 594x83 [border: (32px solid #800080) (32px solid #008000) (32px solid #0000FF) (32px solid #FFFF00)] LayoutText {#text} at (32,0) size 530x19 text run at (32,0) width 530: "Clockwise from top, the borders should be: PURPLE, GREEN, BLUE, YELLOW." LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0805-c5517-ibrdr-s-00-a-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0805-c5517-ibrdr-s-00-a-expected.txt index 2fef152..c994ed88 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0805-c5517-ibrdr-s-00-a-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0805-c5517-ibrdr-s-00-a-expected.txt
@@ -7,12 +7,12 @@ LayoutText {#text} at (0,0) size 269x19 text run at (0,0) width 269: "The borders below should be as described:" LayoutNGBlockFlow {P} at (0,36) size 784x20 - LayoutInline {SPAN} at (0,0) size 126x34 [border: (5px dashed #000000)] + LayoutInline {SPAN} at (0,0) size 126x29 [border: (5px dashed #000000)] LayoutText {#text} at (5,0) size 116x19 text run at (5,0) width 116: "Black and dashed." LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow {P} at (0,72) size 784x20 - LayoutInline {SPAN} at (0,0) size 144x34 [border: (5px groove #FFA500)] + LayoutInline {SPAN} at (0,0) size 144x29 [border: (5px groove #FFA500)] LayoutText {#text} at (5,0) size 134x19 text run at (5,0) width 134: "Orange and grooved." LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-ln-00-d-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-ln-00-d-expected.txt index 9e020311..7606f3a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-ln-00-d-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-ln-00-d-expected.txt
@@ -11,7 +11,7 @@ LayoutNGBlockFlow {DIV} at (16,76) size 752x382 [color=#C0C0C0] [border: (5px solid #800080)] LayoutText {#text} at (171,21) size 474x19 text run at (171,21) width 474: "dummy text dummy text dummy text dummy text dummy text dummy text " - LayoutInline {SPAN} at (0,0) size 486x28 [color=#FFFFFF] [bgcolor=#008080] [border: (3px solid #00FFFF)] + LayoutInline {SPAN} at (0,0) size 18x25 [color=#FFFFFF] [bgcolor=#008080] [border: (3px solid #00FFFF)] LayoutText {#text} at (647,21) size 12x19 text run at (647,21) width 12: "A" LayoutText {#text} at (661,21) size 5x19 @@ -22,7 +22,7 @@ LayoutText {#text} at (665,21) size 543x39 text run at (665,21) width 49: "dummy" text run at (171,41) width 422: "text dummy text dummy text dummy text dummy text dummy text " - LayoutInline {SPAN} at (0,0) size 433x28 [color=#FFFFFF] [bgcolor=#800080] [border: (3px solid #FF00FF)] + LayoutInline {SPAN} at (0,0) size 17x25 [color=#FFFFFF] [bgcolor=#800080] [border: (3px solid #FF00FF)] LayoutText {#text} at (596,41) size 11x19 text run at (596,41) width 11: "B" LayoutText {#text} at (610,41) size 4x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-ln-02-d-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-ln-02-d-expected.txt index 6412c08..8ae58c94 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-ln-02-d-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-ln-02-d-expected.txt
@@ -11,7 +11,7 @@ LayoutNGBlockFlow {DIV} at (16,76) size 752x442 [color=#C0C0C0] [border: (5px solid #800080)] LayoutText {#text} at (21,21) size 553x19 text run at (21,21) width 553: "dummy text dummy text dummy text dummy text dummy text dummy text dummy text " - LayoutInline {SPAN} at (0,0) size 565x28 [color=#FFFFFF] [bgcolor=#008080] [border: (3px solid #00FFFF)] + LayoutInline {SPAN} at (0,0) size 18x25 [color=#FFFFFF] [bgcolor=#008080] [border: (3px solid #00FFFF)] LayoutText {#text} at (576,21) size 12x19 text run at (576,21) width 12: "A" LayoutText {#text} at (590,21) size 5x19 @@ -22,7 +22,7 @@ LayoutText {#text} at (594,21) size 551x39 text run at (594,21) width 128: "dummy text dummy" text run at (171,41) width 343: "text dummy text dummy text dummy text dummy text " - LayoutInline {SPAN} at (0,0) size 354x28 [color=#FFFFFF] [bgcolor=#800080] [border: (3px solid #FF00FF)] + LayoutInline {SPAN} at (0,0) size 17x25 [color=#FFFFFF] [bgcolor=#800080] [border: (3px solid #FF00FF)] LayoutText {#text} at (517,41) size 11x19 text run at (517,41) width 11: "B" LayoutText {#text} at (531,41) size 4x19 @@ -32,7 +32,7 @@ text run at (19,19) width 44: "BBBB" LayoutText {#text} at (321,61) size 237x19 text run at (321,61) width 237: "dummy text dummy text dummy text " - LayoutInline {SPAN} at (0,0) size 248x28 [color=#FFFFFF] [bgcolor=#FFA500] [border: (3px solid #FFFF00)] + LayoutInline {SPAN} at (0,0) size 17x25 [color=#FFFFFF] [bgcolor=#FFA500] [border: (3px solid #FFFF00)] LayoutText {#text} at (561,61) size 11x19 text run at (561,61) width 11: "C" LayoutText {#text} at (575,61) size 4x19 @@ -43,7 +43,7 @@ LayoutText {#text} at (321,81) size 387x39 text run at (321,81) width 233: "dummy text dummy text dummy text" text run at (471,101) width 237: "dummy text dummy text dummy text " - LayoutInline {SPAN} at (0,0) size 249x28 [color=#FFFFFF] [bgcolor=#008000] [border: (3px solid #00FF00)] + LayoutInline {SPAN} at (0,0) size 18x25 [color=#FFFFFF] [bgcolor=#008000] [border: (3px solid #00FF00)] LayoutText {#text} at (711,101) size 12x19 text run at (711,101) width 12: "D" LayoutText {#text} at (726,101) size 4x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-ln-03-d-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-ln-03-d-expected.txt index fae6d64b..d7fa2bb 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-ln-03-d-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-ln-03-d-expected.txt
@@ -11,7 +11,7 @@ LayoutNGBlockFlow {DIV} at (16,76) size 752x362 [color=#C0C0C0] [border: (5px solid #800080)] LayoutText {#text} at (171,21) size 316x19 text run at (171,21) width 316: "dummy text dummy text dummy text dummy text " - LayoutInline {SPAN} at (0,0) size 328x28 [color=#FFFFFF] [bgcolor=#008080] [border: (3px solid #00FFFF)] + LayoutInline {SPAN} at (0,0) size 18x25 [color=#FFFFFF] [bgcolor=#008080] [border: (3px solid #00FFFF)] LayoutText {#text} at (489,21) size 12x19 text run at (489,21) width 12: "A" LayoutText {#text} at (503,21) size 5x19 @@ -19,7 +19,7 @@ LayoutNGBlockFlow (floating) {P} at (21,21) size 150x58 [color=#FFFFFF] [bgcolor=#008080] [border: (3px solid #00FFFF)] LayoutText {#text} at (19,19) size 48x19 text run at (19,19) width 48: "AAAA" - LayoutInline {SPAN} at (0,0) size 348x28 [color=#FFFFFF] [bgcolor=#800080] [border: (3px solid #FF00FF)] + LayoutInline {SPAN} at (0,0) size 18x25 [color=#FFFFFF] [bgcolor=#800080] [border: (3px solid #FF00FF)] LayoutText {#text} at (510,21) size 12x19 text run at (510,21) width 12: "B" LayoutText {#text} at (524,21) size 5x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counter-08-b-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counter-08-b-expected.txt index 5c5213ec..b0ae33f0 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counter-08-b-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counter-08-b-expected.txt
@@ -31,8 +31,8 @@ text run at (42,0) width 17: "IV" LayoutText {#text} at (58,0) size 5x19 text run at (58,0) width 5: " " - LayoutInline {SPAN} at (0,0) size 12x19 - LayoutInline {<pseudo:before>} at (0,0) size 12x19 + LayoutInline {SPAN} at (0,0) size 13x19 + LayoutInline {<pseudo:before>} at (0,0) size 13x19 LayoutCounter (anonymous) at (62,0) size 13x19 text run at (62,0) width 13: "V" LayoutText {#text} at (74,0) size 5x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counters-13-b-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counters-13-b-expected.txt index d6fd909a..6556c4f 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counters-13-b-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counters-13-b-expected.txt
@@ -13,8 +13,8 @@ text run at (0,0) width 28: "A.A" LayoutText {#text} at (27,0) size 4x19 text run at (27,0) width 4: " " - LayoutInline {SPAN} at (0,0) size 27x19 - LayoutInline {<pseudo:before>} at (0,0) size 27x19 + LayoutInline {SPAN} at (0,0) size 28x19 + LayoutInline {<pseudo:before>} at (0,0) size 28x19 LayoutCounter (anonymous) at (30,0) size 28x19 text run at (30,0) width 28: "A.B" LayoutText {#text} at (57,0) size 4x19 @@ -43,26 +43,26 @@ text run at (151,0) width 25: "A.F" LayoutText {#text} at (175,0) size 5x19 text run at (175,0) width 5: " " - LayoutInline {SPAN} at (0,0) size 29x19 - LayoutInline {<pseudo:before>} at (0,0) size 29x19 + LayoutInline {SPAN} at (0,0) size 28x19 + LayoutInline {<pseudo:before>} at (0,0) size 28x19 LayoutCounter (anonymous) at (179,0) size 28x19 text run at (179,0) width 28: "A.G" LayoutText {#text} at (206,0) size 5x19 text run at (206,0) width 5: " " - LayoutInline {SPAN} at (0,0) size 29x19 - LayoutInline {<pseudo:before>} at (0,0) size 29x19 + LayoutInline {SPAN} at (0,0) size 28x19 + LayoutInline {<pseudo:before>} at (0,0) size 28x19 LayoutCounter (anonymous) at (210,0) size 28x19 text run at (210,0) width 28: "A.H" LayoutText {#text} at (238,0) size 4x19 text run at (238,0) width 4: " " - LayoutInline {SPAN} at (0,0) size 21x19 - LayoutInline {<pseudo:before>} at (0,0) size 21x19 + LayoutInline {SPAN} at (0,0) size 22x19 + LayoutInline {<pseudo:before>} at (0,0) size 22x19 LayoutCounter (anonymous) at (241,0) size 22x19 text run at (241,0) width 22: "A.I" LayoutText {#text} at (262,0) size 4x19 text run at (262,0) width 4: " " - LayoutInline {SPAN} at (0,0) size 22x19 - LayoutInline {<pseudo:before>} at (0,0) size 22x19 + LayoutInline {SPAN} at (0,0) size 23x19 + LayoutInline {<pseudo:before>} at (0,0) size 23x19 LayoutCounter (anonymous) at (265,0) size 23x19 text run at (265,0) width 23: "A.J" LayoutText {#text} at (287,0) size 4x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counters-14-b-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counters-14-b-expected.txt index d6fd909a..6556c4f 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counters-14-b-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counters-14-b-expected.txt
@@ -13,8 +13,8 @@ text run at (0,0) width 28: "A.A" LayoutText {#text} at (27,0) size 4x19 text run at (27,0) width 4: " " - LayoutInline {SPAN} at (0,0) size 27x19 - LayoutInline {<pseudo:before>} at (0,0) size 27x19 + LayoutInline {SPAN} at (0,0) size 28x19 + LayoutInline {<pseudo:before>} at (0,0) size 28x19 LayoutCounter (anonymous) at (30,0) size 28x19 text run at (30,0) width 28: "A.B" LayoutText {#text} at (57,0) size 4x19 @@ -43,26 +43,26 @@ text run at (151,0) width 25: "A.F" LayoutText {#text} at (175,0) size 5x19 text run at (175,0) width 5: " " - LayoutInline {SPAN} at (0,0) size 29x19 - LayoutInline {<pseudo:before>} at (0,0) size 29x19 + LayoutInline {SPAN} at (0,0) size 28x19 + LayoutInline {<pseudo:before>} at (0,0) size 28x19 LayoutCounter (anonymous) at (179,0) size 28x19 text run at (179,0) width 28: "A.G" LayoutText {#text} at (206,0) size 5x19 text run at (206,0) width 5: " " - LayoutInline {SPAN} at (0,0) size 29x19 - LayoutInline {<pseudo:before>} at (0,0) size 29x19 + LayoutInline {SPAN} at (0,0) size 28x19 + LayoutInline {<pseudo:before>} at (0,0) size 28x19 LayoutCounter (anonymous) at (210,0) size 28x19 text run at (210,0) width 28: "A.H" LayoutText {#text} at (238,0) size 4x19 text run at (238,0) width 4: " " - LayoutInline {SPAN} at (0,0) size 21x19 - LayoutInline {<pseudo:before>} at (0,0) size 21x19 + LayoutInline {SPAN} at (0,0) size 22x19 + LayoutInline {<pseudo:before>} at (0,0) size 22x19 LayoutCounter (anonymous) at (241,0) size 22x19 text run at (241,0) width 22: "A.I" LayoutText {#text} at (262,0) size 4x19 text run at (262,0) width 4: " " - LayoutInline {SPAN} at (0,0) size 22x19 - LayoutInline {<pseudo:before>} at (0,0) size 22x19 + LayoutInline {SPAN} at (0,0) size 23x19 + LayoutInline {<pseudo:before>} at (0,0) size 23x19 LayoutCounter (anonymous) at (265,0) size 23x19 text run at (265,0) width 23: "A.J" LayoutText {#text} at (287,0) size 4x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t120401-scope-00-b-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t120401-scope-00-b-expected.txt index 686fcbab..410966e 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t120401-scope-00-b-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t120401-scope-00-b-expected.txt
@@ -7,11 +7,11 @@ LayoutText {#text} at (0,0) size 227x19 text run at (0,0) width 227: "The next 2 lines should be identical:" LayoutNGBlockFlow {DIV} at (0,36) size 784x20 - LayoutInline {SPAN} at (0,0) size 71x19 + LayoutInline {SPAN} at (0,0) size 40x19 LayoutInline {<pseudo:before>} at (0,0) size 8x19 LayoutCounter (anonymous) at (0,0) size 8x19 text run at (0,0) width 8: "1" - LayoutInline {SPAN} at (0,0) size 24x19 + LayoutInline {SPAN} at (0,0) size 16x19 LayoutInline {<pseudo:before>} at (0,0) size 8x19 LayoutCounter (anonymous) at (8,0) size 8x19 text run at (8,0) width 8: "2" @@ -23,7 +23,7 @@ LayoutInline {<pseudo:before>} at (0,0) size 8x19 LayoutCounter (anonymous) at (24,0) size 8x19 text run at (24,0) width 8: "1" - LayoutInline {<pseudo:after>} at (0,0) size 8x19 + LayoutInline {<pseudo:after>} at (0,0) size 9x19 LayoutCounter (anonymous) at (31,0) size 9x19 text run at (31,0) width 9: "1" LayoutInline {SPAN} at (0,0) size 8x19 @@ -32,11 +32,11 @@ text run at (39,0) width 8: "1" LayoutText {#text} at (46,0) size 5x19 text run at (46,0) width 5: " " - LayoutInline {SPAN} at (0,0) size 73x19 + LayoutInline {SPAN} at (0,0) size 41x19 LayoutInline {<pseudo:before>} at (0,0) size 9x19 LayoutCounter (anonymous) at (50,0) size 9x19 text run at (50,0) width 9: "1" - LayoutInline {SPAN} at (0,0) size 25x19 + LayoutInline {SPAN} at (0,0) size 17x19 LayoutInline {<pseudo:before>} at (0,0) size 9x19 LayoutCounter (anonymous) at (58,0) size 9x19 text run at (58,0) width 9: "3"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1602-c546-txt-align-00-b-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1602-c546-txt-align-00-b-expected.txt index d92c2e52..8f7beca 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1602-c546-txt-align-00-b-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1602-c546-txt-align-00-b-expected.txt
@@ -15,7 +15,7 @@ LayoutNGBlockFlow {P} at (0,108) size 784x280 [color=#000080] LayoutText {#text} at (0,0) size 497x19 text run at (0,0) width 497: "This paragraph should be justified (the right and left margins should line up). " - LayoutInline {SPAN} at (0,0) size 1281x279 [color=#C0C0C0] + LayoutInline {SPAN} at (0,0) size 784x279 [color=#C0C0C0] LayoutText {#text} at (496,0) size 784x279 text run at (496,0) width 288: "This is just lovely dummy text. Dummy text." text run at (0,20) width 784: "Dummy text. This is just lovely dummy text. This is just lovely dummy text. Dummy text. This is just lovely dummy text."
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-18a-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-18a-expected.txt index b0167e78..1c95f00 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-18a-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-18a-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x20 [color=#000080] LayoutText {#text} at (0,0) size 161x19 text run at (0,0) width 161: "The background color of " - LayoutInline {A} at (0,0) size 221x19 [color=#0000EE] + LayoutInline {A} at (0,0) size 113x19 [color=#0000EE] LayoutText {#text} at (161,0) size 78x19 text run at (161,0) width 78: "this anchor (" LayoutInline {STRONG} at (0,0) size 30x19 @@ -19,7 +19,7 @@ LayoutNGBlockFlow {P} at (0,36) size 784x20 [color=#000080] LayoutText {#text} at (0,0) size 161x19 text run at (0,0) width 161: "The background color of " - LayoutInline {A} at (0,0) size 274x19 [color=#FFFFFF] [bgcolor=#008000] + LayoutInline {A} at (0,0) size 113x19 [color=#FFFFFF] [bgcolor=#008000] LayoutText {#text} at (161,0) size 78x19 text run at (161,0) width 78: "this anchor (" LayoutInline {STRONG} at (0,0) size 30x19 @@ -37,7 +37,7 @@ LayoutNGBlockFlow {P} at (0,72) size 784x40 [color=#000080] LayoutText {#text} at (0,0) size 161x19 text run at (0,0) width 161: "The background color of " - LayoutInline {A} at (0,0) size 274x19 [color=#FFFFFF] [bgcolor=#008000] + LayoutInline {A} at (0,0) size 113x19 [color=#FFFFFF] [bgcolor=#008000] LayoutText {#text} at (161,0) size 78x19 text run at (161,0) width 78: "this anchor (" LayoutInline {STRONG} at (0,0) size 30x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-21-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-21-expected.txt index de5fb5bb..dd6fdbf 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-21-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-21-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 755x19 text run at (0,0) width 755: "This paragraph should be unstyled. The background of the following paragraph should become green when you follow " - LayoutInline {A} at (0,0) size 1532x39 [color=#0000EE] + LayoutInline {A} at (0,0) size 777x39 [color=#0000EE] LayoutText {#text} at (754,0) size 777x39 text run at (754,0) width 23: "this" text run at (0,20) width 24: "link" @@ -15,7 +15,7 @@ LayoutNGBlockFlow {P} at (0,56) size 784x40 LayoutText {#text} at (0,0) size 739x19 text run at (0,0) width 739: "This paragraph should initially be unstyled. It should become green when you select the link above. When you select " - LayoutInline {A} at (0,0) size 1500x39 [color=#0000EE] + LayoutInline {A} at (0,0) size 761x39 [color=#0000EE] LayoutText {#text} at (738,0) size 761x39 text run at (738,0) width 23: "this" text run at (0,20) width 24: "link" @@ -24,7 +24,7 @@ LayoutNGBlockFlow {P} at (0,112) size 784x40 LayoutText {#text} at (0,0) size 745x19 text run at (0,0) width 745: "This paragraph should initially be unstyled. It should become green when you select the link above. When you follow " - LayoutInline {A} at (0,0) size 1512x39 [color=#0000EE] + LayoutInline {A} at (0,0) size 767x39 [color=#0000EE] LayoutText {#text} at (744,0) size 767x39 text run at (744,0) width 23: "this" text run at (0,20) width 24: "link"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-42-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-42-expected.txt index a8bb0b2..3ec6a08 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-42-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-42-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 620x19 text run at (0,0) width 620: "You should see after this paragraph the words GENERATED CONTENT over green background" - LayoutInline {<pseudo:after>} at (0,0) size 1336x39 [bgcolor=#00FF00] + LayoutInline {<pseudo:after>} at (0,0) size 717x39 [bgcolor=#00FF00] LayoutTextFragment (anonymous) at (619,0) size 717x39 text run at (619,0) width 98: "GENERATED" text run at (0,20) width 77: "CONTENT"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-42a-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-42a-expected.txt index a8bb0b2..3ec6a08 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-42a-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-42a-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 620x19 text run at (0,0) width 620: "You should see after this paragraph the words GENERATED CONTENT over green background" - LayoutInline {<pseudo:after>} at (0,0) size 1336x39 [bgcolor=#00FF00] + LayoutInline {<pseudo:after>} at (0,0) size 717x39 [bgcolor=#00FF00] LayoutTextFragment (anonymous) at (619,0) size 717x39 text run at (619,0) width 98: "GENERATED" text run at (0,20) width 77: "CONTENT"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-66-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-66-expected.txt index 9b88772..a4df6498 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-66-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-66-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 [bgcolor=#FFFFFF] LayoutText {#text} at (0,0) size 747x19 text run at (0,0) width 747: "This paragraph should be unstyled. The background of the following paragraph should become blue when you follow " - LayoutInline {A} at (0,0) size 1516x39 [color=#0000EE] + LayoutInline {A} at (0,0) size 769x39 [color=#0000EE] LayoutText {#text} at (746,0) size 769x39 text run at (746,0) width 23: "this" text run at (0,20) width 24: "link" @@ -15,7 +15,7 @@ LayoutNGBlockFlow {P} at (0,56) size 784x40 [bgcolor=#FFFFFF] LayoutText {#text} at (0,0) size 731x19 text run at (0,0) width 731: "This paragraph should initially be unstyled. It should become blue when you select the link above. When you select " - LayoutInline {A} at (0,0) size 1484x39 [color=#0000EE] + LayoutInline {A} at (0,0) size 753x39 [color=#0000EE] LayoutText {#text} at (730,0) size 753x39 text run at (730,0) width 23: "this" text run at (0,20) width 24: "link" @@ -24,7 +24,7 @@ LayoutNGBlockFlow {P} at (0,112) size 784x40 [bgcolor=#FFFFFF] LayoutText {#text} at (0,0) size 737x19 text run at (0,0) width 737: "This paragraph should initially be unstyled. It should become blue when you select the link above. When you follow " - LayoutInline {A} at (0,0) size 1496x39 [color=#0000EE] + LayoutInline {A} at (0,0) size 759x39 [color=#0000EE] LayoutText {#text} at (736,0) size 759x39 text run at (736,0) width 23: "this" text run at (0,20) width 24: "link"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-18a-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-18a-expected.txt index 15ac086..a4aebcbb1 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-18a-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-18a-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {p} at (0,0) size 784x20 [color=#000080] LayoutText {#text} at (0,0) size 161x19 text run at (0,0) width 161: "The background color of " - LayoutInline {a} at (0,0) size 221x19 [color=#0000EE] + LayoutInline {a} at (0,0) size 113x19 [color=#0000EE] LayoutText {#text} at (161,0) size 78x19 text run at (161,0) width 78: "this anchor (" LayoutInline {strong} at (0,0) size 30x19 @@ -19,7 +19,7 @@ LayoutNGBlockFlow {p} at (0,36) size 784x20 [color=#000080] LayoutText {#text} at (0,0) size 161x19 text run at (0,0) width 161: "The background color of " - LayoutInline {a} at (0,0) size 274x19 [color=#FFFFFF] [bgcolor=#008000] + LayoutInline {a} at (0,0) size 113x19 [color=#FFFFFF] [bgcolor=#008000] LayoutText {#text} at (161,0) size 78x19 text run at (161,0) width 78: "this anchor (" LayoutInline {strong} at (0,0) size 30x19 @@ -37,7 +37,7 @@ LayoutNGBlockFlow {p} at (0,72) size 784x40 [color=#000080] LayoutText {#text} at (0,0) size 161x19 text run at (0,0) width 161: "The background color of " - LayoutInline {a} at (0,0) size 274x19 [color=#FFFFFF] [bgcolor=#008000] + LayoutInline {a} at (0,0) size 113x19 [color=#FFFFFF] [bgcolor=#008000] LayoutText {#text} at (161,0) size 78x19 text run at (161,0) width 78: "this anchor (" LayoutInline {strong} at (0,0) size 30x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-21-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-21-expected.txt index a1d518f..76b369d5 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-21-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-21-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {p} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 755x19 text run at (0,0) width 755: "This paragraph should be unstyled. The background of the following paragraph should become green when you follow " - LayoutInline {a} at (0,0) size 1532x39 [color=#0000EE] + LayoutInline {a} at (0,0) size 777x39 [color=#0000EE] LayoutText {#text} at (754,0) size 777x39 text run at (754,0) width 23: "this" text run at (0,20) width 24: "link" @@ -15,7 +15,7 @@ LayoutNGBlockFlow {p} at (0,56) size 784x40 LayoutText {#text} at (0,0) size 739x19 text run at (0,0) width 739: "This paragraph should initially be unstyled. It should become green when you select the link above. When you select " - LayoutInline {a} at (0,0) size 1500x39 [color=#0000EE] + LayoutInline {a} at (0,0) size 761x39 [color=#0000EE] LayoutText {#text} at (738,0) size 761x39 text run at (738,0) width 23: "this" text run at (0,20) width 24: "link" @@ -24,7 +24,7 @@ LayoutNGBlockFlow {p} at (0,112) size 784x40 LayoutText {#text} at (0,0) size 745x19 text run at (0,0) width 745: "This paragraph should initially be unstyled. It should become green when you select the link above. When you follow " - LayoutInline {a} at (0,0) size 1512x39 [color=#0000EE] + LayoutInline {a} at (0,0) size 767x39 [color=#0000EE] LayoutText {#text} at (744,0) size 767x39 text run at (744,0) width 23: "this" text run at (0,20) width 24: "link"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-42-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-42-expected.txt index b29fccc9..69992d4a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-42-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-42-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {p} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 620x19 text run at (0,0) width 620: "You should see after this paragraph the words GENERATED CONTENT over green background" - LayoutInline {<pseudo:after>} at (0,0) size 1336x39 [bgcolor=#00FF00] + LayoutInline {<pseudo:after>} at (0,0) size 717x39 [bgcolor=#00FF00] LayoutTextFragment (anonymous) at (619,0) size 717x39 text run at (619,0) width 98: "GENERATED" text run at (0,20) width 77: "CONTENT"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-42a-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-42a-expected.txt index b29fccc9..69992d4a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-42a-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-42a-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {p} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 620x19 text run at (0,0) width 620: "You should see after this paragraph the words GENERATED CONTENT over green background" - LayoutInline {<pseudo:after>} at (0,0) size 1336x39 [bgcolor=#00FF00] + LayoutInline {<pseudo:after>} at (0,0) size 717x39 [bgcolor=#00FF00] LayoutTextFragment (anonymous) at (619,0) size 717x39 text run at (619,0) width 98: "GENERATED" text run at (0,20) width 77: "CONTENT"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-66-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-66-expected.txt index a7a2ad36..460c833 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-66-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-66-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {p} at (0,0) size 784x40 [bgcolor=#FFFFFF] LayoutText {#text} at (0,0) size 747x19 text run at (0,0) width 747: "This paragraph should be unstyled. The background of the following paragraph should become blue when you follow " - LayoutInline {a} at (0,0) size 1516x39 [color=#0000EE] + LayoutInline {a} at (0,0) size 769x39 [color=#0000EE] LayoutText {#text} at (746,0) size 769x39 text run at (746,0) width 23: "this" text run at (0,20) width 24: "link" @@ -15,7 +15,7 @@ LayoutNGBlockFlow {p} at (0,56) size 784x40 [bgcolor=#FFFFFF] LayoutText {#text} at (0,0) size 731x19 text run at (0,0) width 731: "This paragraph should initially be unstyled. It should become blue when you select the link above. When you select " - LayoutInline {a} at (0,0) size 1484x39 [color=#0000EE] + LayoutInline {a} at (0,0) size 753x39 [color=#0000EE] LayoutText {#text} at (730,0) size 753x39 text run at (730,0) width 23: "this" text run at (0,20) width 24: "link" @@ -24,7 +24,7 @@ LayoutNGBlockFlow {p} at (0,112) size 784x40 [bgcolor=#FFFFFF] LayoutText {#text} at (0,0) size 737x19 text run at (0,0) width 737: "This paragraph should initially be unstyled. It should become blue when you select the link above. When you follow " - LayoutInline {a} at (0,0) size 1496x39 [color=#0000EE] + LayoutInline {a} at (0,0) size 759x39 [color=#0000EE] LayoutText {#text} at (736,0) size 759x39 text run at (736,0) width 23: "this" text run at (0,20) width 24: "link"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-18a-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-18a-expected.txt index e342f72..32b2b89 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-18a-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-18a-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {p} at (0,16) size 800x20 [color=#000080] LayoutText {#text} at (0,0) size 161x19 text run at (0,0) width 161: "The background color of " - LayoutInline {a} at (0,0) size 221x19 [color=#0000EE] + LayoutInline {a} at (0,0) size 113x19 [color=#0000EE] LayoutText {#text} at (161,0) size 78x19 text run at (161,0) width 78: "this anchor (" LayoutInline {strong} at (0,0) size 30x19 @@ -18,7 +18,7 @@ LayoutNGBlockFlow {p} at (0,52) size 800x20 [color=#000080] LayoutText {#text} at (0,0) size 161x19 text run at (0,0) width 161: "The background color of " - LayoutInline {a} at (0,0) size 274x19 [color=#FFFFFF] [bgcolor=#008000] + LayoutInline {a} at (0,0) size 113x19 [color=#FFFFFF] [bgcolor=#008000] LayoutText {#text} at (161,0) size 78x19 text run at (161,0) width 78: "this anchor (" LayoutInline {strong} at (0,0) size 30x19 @@ -36,7 +36,7 @@ LayoutNGBlockFlow {p} at (0,88) size 800x40 [color=#000080] LayoutText {#text} at (0,0) size 161x19 text run at (0,0) width 161: "The background color of " - LayoutInline {a} at (0,0) size 274x19 [color=#FFFFFF] [bgcolor=#008000] + LayoutInline {a} at (0,0) size 113x19 [color=#FFFFFF] [bgcolor=#008000] LayoutText {#text} at (161,0) size 78x19 text run at (161,0) width 78: "this anchor (" LayoutInline {strong} at (0,0) size 30x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-21-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-21-expected.txt index e940754d..2853d352 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-21-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-21-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {p} at (0,16) size 800x40 LayoutText {#text} at (0,0) size 755x19 text run at (0,0) width 755: "This paragraph should be unstyled. The background of the following paragraph should become green when you follow " - LayoutInline {a} at (0,0) size 1532x39 [color=#0000EE] + LayoutInline {a} at (0,0) size 777x39 [color=#0000EE] LayoutText {#text} at (754,0) size 777x39 text run at (754,0) width 23: "this" text run at (0,20) width 24: "link"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-42-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-42-expected.txt index 96267078a..57b74964 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-42-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-42-expected.txt
@@ -5,6 +5,6 @@ LayoutNGBlockFlow {p} at (0,16) size 800x20 LayoutText {#text} at (0,0) size 620x19 text run at (0,0) width 620: "You should see after this paragraph the words GENERATED CONTENT over green background" - LayoutInline {<pseudo:after>} at (0,0) size 798x19 [bgcolor=#00FF00] + LayoutInline {<pseudo:after>} at (0,0) size 179x19 [bgcolor=#00FF00] LayoutTextFragment (anonymous) at (619,0) size 179x19 text run at (619,0) width 179: "GENERATED CONTENT"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-42a-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-42a-expected.txt index 96267078a..57b74964 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-42a-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-42a-expected.txt
@@ -5,6 +5,6 @@ LayoutNGBlockFlow {p} at (0,16) size 800x20 LayoutText {#text} at (0,0) size 620x19 text run at (0,0) width 620: "You should see after this paragraph the words GENERATED CONTENT over green background" - LayoutInline {<pseudo:after>} at (0,0) size 798x19 [bgcolor=#00FF00] + LayoutInline {<pseudo:after>} at (0,0) size 179x19 [bgcolor=#00FF00] LayoutTextFragment (anonymous) at (619,0) size 179x19 text run at (619,0) width 179: "GENERATED CONTENT"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-66-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-66-expected.txt index c619886..75588da 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-66-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-66-expected.txt
@@ -5,7 +5,7 @@ LayoutNGBlockFlow {p} at (0,16) size 800x40 [bgcolor=#FFFFFF] LayoutText {#text} at (0,0) size 747x19 text run at (0,0) width 747: "This paragraph should be unstyled. The background of the following paragraph should become blue when you follow " - LayoutInline {a} at (0,0) size 1516x39 [color=#0000EE] + LayoutInline {a} at (0,0) size 769x39 [color=#0000EE] LayoutText {#text} at (746,0) size 769x39 text run at (746,0) width 23: "this" text run at (0,20) width 24: "link"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/click-start-of-line-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/click-start-of-line-expected.txt index b37608e..86717f3 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/click-start-of-line-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/click-start-of-line-expected.txt
@@ -7,7 +7,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 104x19 text run at (0,0) width 104: "This is a test for " - LayoutInline {I} at (0,0) size 1227x39 + LayoutInline {I} at (0,0) size 776x39 LayoutInline {A} at (0,0) size 348x19 [color=#0000EE] LayoutText {#text} at (104,0) size 348x19 text run at (104,0) width 348: "http://bugzilla.opendarwin.org/show_bug.cgi?id=9978"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/contains-boundaries-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/contains-boundaries-expected.txt index ac31c34..2587624c 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/contains-boundaries-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/contains-boundaries-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 52x19 text run at (0,0) width 52: "Test for " - LayoutInline {I} at (0,0) size 1095x39 + LayoutInline {I} at (0,0) size 743x39 LayoutInline {A} at (0,0) size 302x19 [color=#0000EE] LayoutText {#text} at (51,0) size 302x19 text run at (51,0) width 302: "http://bugs.webkit.org/show_bug.cgi?id=14347"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/bidi-override-in-anonymous-block-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/bidi-override-in-anonymous-block-expected.txt index 01b8e03..791014d4 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/bidi-override-in-anonymous-block-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/bidi-override-in-anonymous-block-expected.txt
@@ -54,7 +54,7 @@ LayoutText {#text} at (0,0) size 73x19 text run at (0,0) width 73: "Single span" LayoutNGBlockFlow (anonymous) at (0,485.91) size 769x20 - LayoutInline {SPAN} at (0,0) size 26x24 [border: (1.39px solid #000000)] + LayoutInline {SPAN} at (0,0) size 26x23 [border: (1.39px solid #000000)] LayoutText {#text} at (2,0) size 23x19 text run at (2,0) width 23: "abc" LayoutText {#text} at (0,0) size 0x0 @@ -62,10 +62,10 @@ LayoutText {#text} at (0,0) size 417x19 text run at (0,0) width 417: "The following 2 textes should be identical, ignorning whitespaces:" LayoutNGBlockFlow (anonymous) at (0,557.91) size 769x20 - LayoutInline {SPAN} at (0,0) size 73x24 [border: (1.39px solid #000000)] + LayoutInline {SPAN} at (0,0) size 52x23 [border: (1.39px solid #000000)] LayoutText {#text} at (24,0) size 27x19 text run at (24,0) width 27: "abc " - LayoutInline {SPAN} at (0,0) size 23x20 + LayoutInline {SPAN} at (0,0) size 23x19 LayoutText {#text} at (2,0) size 23x19 text run at (2,0) width 23: "abc" LayoutText {#text} at (0,0) size 0x0 @@ -73,8 +73,8 @@ LayoutText {#text} at (0,0) size 417x19 text run at (0,0) width 417: "The following 2 textes should be identical, ignorning whitespaces:" LayoutNGBlockFlow (anonymous) at (0,629.91) size 769x20 - LayoutInline {SPAN} at (0,0) size 73x24 [border: (1.39px solid #000000)] - LayoutInline {SPAN} at (0,0) size 27x20 + LayoutInline {SPAN} at (0,0) size 52x23 [border: (1.39px solid #000000)] + LayoutInline {SPAN} at (0,0) size 27x19 LayoutText {#text} at (24,0) size 27x19 text run at (24,0) width 27: "abc " LayoutText {#text} at (2,0) size 23x19 @@ -84,7 +84,7 @@ LayoutText {#text} at (0,0) size 417x19 text run at (0,0) width 417: "The following 2 textes should be identical, ignorning whitespaces:" LayoutNGBlockFlow (anonymous) at (0,701.91) size 769x20 - LayoutInline {SPAN} at (0,0) size 24x24 [border: (1.39px solid #000000)] + LayoutInline {SPAN} at (0,0) size 24x23 [border: (1.39px solid #000000)] LayoutText {#text} at (0,0) size 22x19 text run at (0,0) width 22: "abc" LayoutNGBlockFlow (anonymous) at (0,721.91) size 769x20 @@ -92,19 +92,19 @@ LayoutText {#text} at (747,0) size 22x19 text run at (747,0) width 22: "cba" LayoutNGBlockFlow (anonymous) at (0,741.91) size 769x20 - LayoutInline {SPAN} at (0,0) size 3x22 [border: (1.39px solid #000000)] + LayoutInline {SPAN} at (0,0) size 2x23 [border: (1.39px solid #000000)] LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow {P} at (0,777.91) size 769x20 LayoutText {#text} at (0,0) size 417x19 text run at (0,0) width 417: "The following 2 textes should be identical, ignorning whitespaces:" LayoutNGBlockFlow (anonymous) at (0,813.91) size 769x20 - LayoutInline {SPAN} at (0,0) size 2x22 [border: (1.39px solid #000000)] + LayoutInline {SPAN} at (0,0) size 2x23 [border: (1.39px solid #000000)] LayoutNGBlockFlow (anonymous) at (0,833.91) size 769x20 LayoutNGBlockFlow {DIV} at (0,0) size 769x20 LayoutText {#text} at (747,0) size 22x19 text run at (747,0) width 22: "cba" LayoutNGBlockFlow (anonymous) at (0,853.91) size 769x20 - LayoutInline {SPAN} at (0,0) size 25x24 [border: (1.39px solid #000000)] + LayoutInline {SPAN} at (0,0) size 24x23 [border: (1.39px solid #000000)] LayoutText {#text} at (2,0) size 23x19 text run at (2,0) width 23: "abc" LayoutText {#text} at (0,0) size 0x0 @@ -112,7 +112,7 @@ LayoutText {#text} at (0,0) size 29x19 text run at (0,0) width 29: "ruby" LayoutNGBlockFlow {DIV} at (0,925.91) size 769x22.78 [border: (1.39px solid #000000)] - LayoutRuby (inline) {RUBY} at (0,0) size 187x21 + LayoutRuby (inline) {RUBY} at (0,0) size 23x21 LayoutRubyRun (anonymous) at (165.47,1.39) size 22x20 LayoutRubyText {RT} at (0,-12) size 22x12 LayoutText {#text} at (5,0) size 12x12 @@ -122,7 +122,7 @@ text run at (0,0) width 22 RTL override: "abc" LayoutText {#text} at (160,1) size 5x20 text run at (160,1) width 5: " " - LayoutRuby (inline) {RUBY} at (0,0) size 158x21 + LayoutRuby (inline) {RUBY} at (0,0) size 23x21 LayoutRubyRun (anonymous) at (136.69,1.39) size 22x20 LayoutRubyText {RT} at (0,-12) size 22x12 LayoutText {#text} at (5,0) size 12x12 @@ -132,7 +132,7 @@ text run at (0,0) width 22 RTL override: "abc" LayoutText {#text} at (131,1) size 5x20 text run at (131,1) width 5: " " - LayoutRuby (inline) {RUBY} at (0,0) size 130x21 + LayoutRuby (inline) {RUBY} at (0,0) size 23x21 LayoutRubyRun (anonymous) at (107.91,1.39) size 22x20 LayoutRubyBase (anonymous) at (0,0) size 22x20 LayoutText {#text} at (0,0) size 22x19 @@ -146,7 +146,7 @@ text run at (0,0) width 12: "def" LayoutText {#text} at (83,1) size 5x20 text run at (83,1) width 5: " " - LayoutRuby (inline) {RUBY} at (0,0) size 82x21 + LayoutRuby (inline) {RUBY} at (0,0) size 23x21 LayoutRubyRun (anonymous) at (60.34,1.39) size 22x20 LayoutRubyBase (anonymous) at (0,0) size 22x20 LayoutInline {RB} at (0,0) size 22x19 @@ -154,7 +154,7 @@ text run at (0,0) width 22 RTL override: "abc" LayoutText {#text} at (54,1) size 5x20 text run at (54,1) width 5: " " - LayoutRuby (inline) {RUBY} at (0,0) size 53x21 + LayoutRuby (inline) {RUBY} at (0,0) size 23x21 LayoutRubyRun (anonymous) at (31.56,1.39) size 22x20 LayoutRubyText {RT} at (0,-12) size 22x12 LayoutText {#text} at (5,0) size 12x12 @@ -165,7 +165,7 @@ text run at (0,0) width 22 RTL override: "abc" LayoutText {#text} at (26,1) size 5x20 text run at (26,1) width 5: " " - LayoutRuby (inline) {RUBY} at (0,0) size 25x21 + LayoutRuby (inline) {RUBY} at (0,0) size 23x21 LayoutRubyRun (anonymous) at (2.78,1.39) size 22x20 LayoutRubyText {RT} at (0,-12) size 22x12 LayoutText {#text} at (5,0) size 12x12
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/Element/class-attribute-whitespace-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/Element/class-attribute-whitespace-expected.txt index 64c27ffa..15bbf72 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/Element/class-attribute-whitespace-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/Element/class-attribute-whitespace-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 52x19 text run at (0,0) width 52: "Test for " - LayoutInline {I} at (0,0) size 1001x19 + LayoutInline {I} at (0,0) size 654x19 LayoutInline {A} at (0,0) size 349x19 [color=#0000EE] LayoutText {#text} at (51,0) size 349x19 text run at (51,0) width 349: "http://bugzilla.opendarwin.org/show_bug.cgi?id=7761"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/anonymous-block-orphaned-lines-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/anonymous-block-orphaned-lines-expected.txt index d507774..30c5db93f8 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/anonymous-block-orphaned-lines-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/anonymous-block-orphaned-lines-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 52x19 text run at (0,0) width 52: "Test for " - LayoutInline {I} at (0,0) size 866x19 + LayoutInline {I} at (0,0) size 566x19 LayoutInline {A} at (0,0) size 302x19 [color=#0000EE] LayoutText {#text} at (51,0) size 302x19 text run at (51,0) width 302: "http://bugs.webkit.org/show_bug.cgi?id=12782"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/create-renderer-for-whitespace-only-text-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/create-renderer-for-whitespace-only-text-expected.txt index d91346a2..3b90481f 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/create-renderer-for-whitespace-only-text-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/create-renderer-for-whitespace-only-text-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 52x19 text run at (0,0) width 52: "Test for " - LayoutInline {I} at (0,0) size 1134x39 + LayoutInline {I} at (0,0) size 782x39 LayoutInline {A} at (0,0) size 302x19 [color=#0000EE] LayoutText {#text} at (51,0) size 302x19 text run at (51,0) width 302: "http://bugs.webkit.org/show_bug.cgi?id=14134"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/float-in-trailing-whitespace-after-last-line-break-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/float-in-trailing-whitespace-after-last-line-break-expected.txt index ecaeced..bbff08d 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/float-in-trailing-whitespace-after-last-line-break-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dynamic/float-in-trailing-whitespace-after-last-line-break-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 52x19 text run at (0,0) width 52: "Test for " - LayoutInline {I} at (0,0) size 1098x39 + LayoutInline {I} at (0,0) size 739x39 LayoutInline {A} at (0,0) size 308x19 [color=#0000EE] LayoutText {#text} at (51,0) size 308x19 text run at (51,0) width 308: "https://bugs.webkit.org/show_bug.cgi?id=19278"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/button-text-transform-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/button-text-transform-expected.txt index 21af3cf..f3640d8 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/button-text-transform-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/button-text-transform-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 52x19 text run at (0,0) width 52: "Test for " - LayoutInline {I} at (0,0) size 1096x39 + LayoutInline {I} at (0,0) size 744x39 LayoutInline {A} at (0,0) size 302x19 [color=#0000EE] LayoutText {#text} at (51,0) size 302x19 text run at (51,0) width 302: "http://bugs.webkit.org/show_bug.cgi?id=15181"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/form-element-geometry-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/form-element-geometry-expected.txt index e446122..a14ca2a 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/form-element-geometry-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/form-element-geometry-expected.txt
@@ -104,7 +104,7 @@ LayoutText {#text} at (0,0) size 199x26 text run at (0,0) width 199: "Baseline Alignment" LayoutNGBlockFlow {DIV} at (0,388.06) size 784x28 - LayoutInline {FONT} at (0,0) size 397x32 + LayoutInline {FONT} at (0,0) size 205x27 LayoutText {#text} at (0,0) size 43x27 text run at (0,0) width 43: "text " LayoutButton {INPUT} at (43,5) size 52x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] @@ -145,7 +145,7 @@ LayoutBlockFlow {INPUT} at (170,3) size 13x13 LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow {DIV} at (0,438.06) size 784x22 - LayoutInline {FONT} at (0,0) size 329x24 + LayoutInline {FONT} at (0,0) size 171x22 LayoutText {#text} at (0,6) size 18x12 text run at (0,6) width 18: "text " LayoutButton {INPUT} at (18,0) size 52x22 [bgcolor=#C0C0C0] [border: (2px outset #C0C0C0)] @@ -183,7 +183,7 @@ LayoutText {#text} at (0,0) size 197x26 text run at (0,0) width 197: "Pop-up Menu Sizes" LayoutNGBlockFlow {DIV} at (0,568.88) size 784x28 - LayoutInline {FONT} at (0,0) size 196x32 + LayoutInline {FONT} at (0,0) size 137x27 LayoutText {#text} at (0,0) size 0x0 LayoutMenuList {SELECT} at (0,6) size 22x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] LayoutNGBlockFlow (anonymous) at (1,1) size 20x18 @@ -221,7 +221,7 @@ text run at (4,1) width 56: "xxxxxxxx" LayoutText {#text} at (0,0) size 0x0 LayoutNGBlockFlow {DIV} at (0,616.88) size 784x20 - LayoutInline {FONT} at (0,0) size 184x22 + LayoutInline {FONT} at (0,0) size 131x20 LayoutText {#text} at (0,0) size 0x0 LayoutMenuList {SELECT} at (0,0) size 22x20 [bgcolor=#C0C0C0] [border: (1px solid #A9A9A9)] LayoutNGBlockFlow (anonymous) at (1,1) size 20x18
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/plaintext-mode-2-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/plaintext-mode-2-expected.txt index cde1d07b..51e13e79 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/plaintext-mode-2-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/plaintext-mode-2-expected.txt
@@ -10,7 +10,7 @@ LayoutNGBlockFlow {DIV} at (0,22) size 784x20 LayoutText {#text} at (0,0) size 32x19 text run at (0,0) width 32: "This " - LayoutInline {B} at (0,0) size 109x19 + LayoutInline {B} at (0,0) size 66x19 LayoutText {#text} at (32,0) size 43x19 text run at (32,0) width 43: "styled " LayoutInline {I} at (0,0) size 23x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/range/slider-thumb-shared-style-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/range/slider-thumb-shared-style-expected.txt index e3c2339..eed1a22 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/range/slider-thumb-shared-style-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/range/slider-thumb-shared-style-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 52x19 text run at (0,0) width 52: "Test for " - LayoutInline {I} at (0,0) size 1009x19 + LayoutInline {I} at (0,0) size 709x19 LayoutInline {A} at (0,0) size 302x19 [color=#0000EE] LayoutText {#text} at (51,0) size 302x19 text run at (51,0) width 302: "http://bugs.webkit.org/show_bug.cgi?id=13800"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/listbox-scrollbar-incremental-load-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/listbox-scrollbar-incremental-load-expected.txt index 7b0ec61..09c2dca 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/listbox-scrollbar-incremental-load-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/listbox-scrollbar-incremental-load-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 52x19 text run at (0,0) width 52: "Test for " - LayoutInline {I} at (0,0) size 1116x39 + LayoutInline {I} at (0,0) size 764x39 LayoutInline {A} at (0,0) size 302x19 [color=#0000EE] LayoutText {#text} at (51,0) size 302x19 text run at (51,0) width 302: "http://bugs.webkit.org/show_bug.cgi?id=13500"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-appearance-none-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-appearance-none-expected.txt index bc49473..0f98b00 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-appearance-none-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-appearance-none-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 117x19 text run at (0,0) width 117: "Rendering test for " - LayoutInline {I} at (0,0) size 1303x39 + LayoutInline {I} at (0,0) size 780x39 LayoutInline {A} at (0,0) size 407x19 [color=#0000EE] LayoutText {#text} at (117,0) size 407x19 text run at (117,0) width 407: "https://bugs.chromium.org/p/chromium/issues/detail?id=626278"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-option-wrap-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-option-wrap-expected.txt index c66e1b58..f73f7ee 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-option-wrap-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/menulist-option-wrap-expected.txt
@@ -6,8 +6,8 @@ LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 52x19 text run at (0,0) width 52: "Test for " - LayoutInline {I} at (0,0) size 873x19 - LayoutInline {A} at (0,0) size 300x19 [color=#0000EE] + LayoutInline {I} at (0,0) size 574x19 + LayoutInline {A} at (0,0) size 301x19 [color=#0000EE] LayoutText {#text} at (51,0) size 301x19 text run at (51,0) width 301: "http://bugs.webkit.org/show_bug.cgi?id=11362" LayoutText {#text} at (351,0) size 274x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-change-listbox-size-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-change-listbox-size-expected.txt index db89af1d..e734718 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-change-listbox-size-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-change-listbox-size-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 52x19 text run at (0,0) width 52: "Test for " - LayoutInline {I} at (0,0) size 1136x39 + LayoutInline {I} at (0,0) size 784x39 LayoutInline {A} at (0,0) size 302x19 [color=#0000EE] LayoutText {#text} at (51,0) size 302x19 text run at (51,0) width 302: "http://bugs.webkit.org/show_bug.cgi?id=12986"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-disabled-appearance-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-disabled-appearance-expected.txt index 0191b53c..9793cd4 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-disabled-appearance-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-disabled-appearance-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 52x19 text run at (0,0) width 52: "Test for " - LayoutInline {I} at (0,0) size 953x19 + LayoutInline {I} at (0,0) size 653x19 LayoutInline {A} at (0,0) size 302x19 [color=#0000EE] LayoutText {#text} at (51,0) size 302x19 text run at (51,0) width 302: "http://bugs.webkit.org/show_bug.cgi?id=12345"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-display-none-style-resolve-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-display-none-style-resolve-expected.txt index 3b5e9b2d3..c856f33 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-display-none-style-resolve-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-display-none-style-resolve-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 52x19 text run at (0,0) width 52: "Test for " - LayoutInline {I} at (0,0) size 1122x39 + LayoutInline {I} at (0,0) size 770x39 LayoutInline {A} at (0,0) size 302x19 [color=#0000EE] LayoutText {#text} at (51,0) size 302x19 text run at (51,0) width 302: "http://bugs.webkit.org/show_bug.cgi?id=13896"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-item-background-clip-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-item-background-clip-expected.txt index 39419d5..dfc0149 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-item-background-clip-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-item-background-clip-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 52x19 text run at (0,0) width 52: "Test for " - LayoutInline {I} at (0,0) size 1123x39 + LayoutInline {I} at (0,0) size 771x39 LayoutInline {A} at (0,0) size 302x19 [color=#0000EE] LayoutText {#text} at (51,0) size 302x19 text run at (51,0) width 302: "http://bugs.webkit.org/show_bug.cgi?id=12364"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-writing-direction-natural-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-writing-direction-natural-expected.txt index fbe3af7b..dc2c3580 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-writing-direction-natural-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/forms/select/select-writing-direction-natural-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 52x19 text run at (0,0) width 52: "Test for " - LayoutInline {I} at (0,0) size 1061x39 + LayoutInline {I} at (0,0) size 709x39 LayoutInline {A} at (0,0) size 302x19 [color=#0000EE] LayoutText {#text} at (51,0) size 302x19 text run at (51,0) width 302: "http://bugs.webkit.org/show_bug.cgi?id=13775"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/inline-dirty-z-order-lists-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/inline-dirty-z-order-lists-expected.txt index 7658773..266a9ae 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/inline-dirty-z-order-lists-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/layers/inline-dirty-z-order-lists-expected.txt
@@ -6,7 +6,7 @@ LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 52x19 text run at (0,0) width 52: "Test for " - LayoutInline {I} at (0,0) size 1128x39 + LayoutInline {I} at (0,0) size 770x39 LayoutInline {A} at (0,0) size 308x19 [color=#0000EE] LayoutText {#text} at (51,0) size 308x19 text run at (51,0) width 308: "https://bugs.webkit.org/show_bug.cgi?id=23848"
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-merged-nodes-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-merged-nodes-expected.txt new file mode 100644 index 0000000..f506e097 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-merged-nodes-expected.txt
@@ -0,0 +1,6 @@ +Test that DOM node and its JS wrapper appear as a single node. +Took heap snapshot +Parsed snapshot +SUCCESS: found leaking +SUCCESS: retaining path = [EventListener, InternalNode, HTMLDivElement, Window / file://, ] +
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-merged-nodes.js b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-merged-nodes.js new file mode 100644 index 0000000..f804ff20 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-merged-nodes.js
@@ -0,0 +1,38 @@ +(async function(testRunner) { + var {page, session, dp} = await testRunner.startBlank( + `Test that DOM node and its JS wrapper appear as a single node.`); + + await session.evaluate(` + var retainer = null; + function run() { + function leaking() { + console.log('leaking'); + } + var div = document.createElement('div'); + div.addEventListener('click', leaking, true); + retainer = div; + } + run(); + `); + + var Helper = await testRunner.loadScript('resources/heap-snapshot-common.js'); + var helper = await Helper(testRunner, session); + + var snapshot = await helper.takeHeapSnapshot(); + var node; + for (var it = snapshot._allNodes(); it.hasNext(); it.next()) { + if (it.node.type() === 'closure' && it.node.name() === 'leaking') { + node = it.node; + break; + } + } + if (node) + testRunner.log('SUCCESS: found ' + node.name()); + else + return testRunner.fail('cannot find leaking node'); + + var retainers = helper.firstRetainingPath(node).map(node => node.name()); + var actual = retainers.join(', '); + testRunner.log(`SUCCESS: retaining path = [${actual}]`); + testRunner.completeTest(); +})
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-event-listener-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-event-listener-expected.txt index a67ac3b..6fa89ac 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-event-listener-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-event-listener-expected.txt
@@ -2,5 +2,5 @@ Took heap snapshot Parsed snapshot SUCCESS: found myEventListener -SUCCESS: retaining path = [EventListener, InternalNode, HTMLBodyElement, HTMLHtmlElement, HTMLDocument] +SUCCESS: retaining path = [EventListener, InternalNode, HTMLBodyElement, HTMLHtmlElement, HTMLDocument, Window / file://, ]
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-event-listener.js b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-event-listener.js index 68c6f12..1fa20236b 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-event-listener.js +++ b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-event-listener.js
@@ -29,9 +29,6 @@ return testRunner.fail('cannot find myEventListener node'); var retainers = helper.firstRetainingPath(node).map(node => node.name()); - // Limit to the retainers until the Window object to keep the test robust - // against root node name changes. - retainers = retainers.slice(0, retainers.indexOf('Window')); var actual = retainers.join(', '); testRunner.log(`SUCCESS: retaining path = [${actual}]`); testRunner.completeTest();
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-multiple-retainers-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-multiple-retainers-expected.txt index 1022d56..fecccaa 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-multiple-retainers-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-multiple-retainers-expected.txt
@@ -4,6 +4,6 @@ SUCCESS: found leaking SUCCESS: immediate retainer is EventListener. SUCCESS: found multiple retaining paths. -SUCCESS: path1 = [HTMLBodyElement, HTMLHtmlElement, HTMLDocument] -SUCCESS: path2 = [HTMLDivElement, HTMLBodyElement, HTMLHtmlElement, HTMLDocument] +SUCCESS: path1 = [HTMLBodyElement, HTMLHtmlElement, HTMLDocument, Window / file://, ] +SUCCESS: path2 = [HTMLDivElement, HTMLBodyElement, HTMLHtmlElement, HTMLDocument, Window / file://, ]
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-multiple-retainers.js b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-multiple-retainers.js index 04f648b..a2d852e 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-multiple-retainers.js +++ b/third_party/WebKit/LayoutTests/inspector-protocol/heap-profiler/heap-snapshot-with-multiple-retainers.js
@@ -43,9 +43,6 @@ for (var iter = eventListener.retainers(); iter.hasNext(); iter.next()) { var path = helper.firstRetainingPath(iter.retainer.node()); path = path.map(node => node.name()); - // Limit the path until the Window object to keep the test robust - // against root node name changes. - path = path.slice(0, path.indexOf('Window')); retainingPaths.push(path.join(', ')); }
diff --git a/third_party/WebKit/LayoutTests/media/picture-in-picture-enabled.html b/third_party/WebKit/LayoutTests/media/picture-in-picture-enabled.html new file mode 100644 index 0000000..e8fa3a0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/media/picture-in-picture-enabled.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<title>Test Picture-in-Picture disabled by system</title> +<script src="../resources/testharness.js"></script> +<script src="../resources/testharnessreport.js"></script> +<script src="../resources/testdriver.js"></script> +<script src="../resources/testdriver-vendor.js"></script> +<script src="../external/wpt/picture-in-picture/resources/picture-in-picture-helpers.js"></script> +<body></body> +<script> +promise_test(t => { + assert_true(document.pictureInPictureEnabled); + + window.internals.settings.setPictureInPictureEnabled(false); + assert_false(document.pictureInPictureEnabled); + + return promise_rejects(t, 'NotSupportedError', + requestPictureInPictureWithTrustedClick(document.createElement('video'))); +}); +</script>
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-inner-bleed-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-inner-bleed-expected.png index bb0868ec..bded2bb 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-inner-bleed-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-inner-bleed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/css/cssom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/css/cssom/interfaces-expected.txt index 0a4a709..6c6c499 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/css/cssom/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/css/cssom/interfaces-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 470 tests; 386 PASS, 84 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 470 tests; 385 PASS, 85 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Test driver PASS HTMLElement interface: attribute style PASS Unscopable handled correctly for style property on HTMLElement @@ -105,7 +105,7 @@ PASS StyleSheet interface: style_element.sheet must inherit property "media" with the proper type PASS StyleSheet interface: style_element.sheet must inherit property "disabled" with the proper type PASS StyleSheetList interface: existence and properties of interface object -PASS StyleSheetList interface object length +FAIL StyleSheetList interface object length assert_equals: wrong value for StyleSheetList.length expected 0 but got 1 PASS StyleSheetList interface object name FAIL StyleSheetList interface: existence and properties of interface prototype object assert_equals: prototype of StyleSheetList.prototype is not Array.prototype expected [] but got object "[object Object]" PASS StyleSheetList interface: existence and properties of interface prototype object's "constructor" property
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/dom/interfaces-expected.txt index a4060f7f..e4324a7d 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/dom/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/dom/interfaces-expected.txt
@@ -381,10 +381,10 @@ PASS Unscopable handled correctly for getElementsByTagNameNS(DOMString, DOMString) on Document PASS Document interface: operation getElementsByClassName(DOMString) PASS Unscopable handled correctly for getElementsByClassName(DOMString) on Document -PASS Document interface: operation createElement(DOMString, ElementCreationOptions) -PASS Unscopable handled correctly for createElement(DOMString, ElementCreationOptions) on Document -PASS Document interface: operation createElementNS(DOMString, DOMString, ElementCreationOptions) -PASS Unscopable handled correctly for createElementNS(DOMString, DOMString, ElementCreationOptions) on Document +PASS Document interface: operation createElement(DOMString, [object Object],[object Object]) +PASS Unscopable handled correctly for createElement(DOMString, [object Object],[object Object]) on Document +PASS Document interface: operation createElementNS(DOMString, DOMString, [object Object],[object Object]) +PASS Unscopable handled correctly for createElementNS(DOMString, DOMString, [object Object],[object Object]) on Document PASS Document interface: operation createDocumentFragment() PASS Unscopable handled correctly for createDocumentFragment() on Document PASS Document interface: operation createTextNode(DOMString) @@ -448,10 +448,10 @@ PASS Document interface: calling getElementsByTagNameNS(DOMString, DOMString) on new Document() with too few arguments must throw TypeError PASS Document interface: new Document() must inherit property "getElementsByClassName(DOMString)" with the proper type PASS Document interface: calling getElementsByClassName(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "createElement(DOMString, ElementCreationOptions)" with the proper type -PASS Document interface: calling createElement(DOMString, ElementCreationOptions) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "createElementNS(DOMString, DOMString, ElementCreationOptions)" with the proper type -PASS Document interface: calling createElementNS(DOMString, DOMString, ElementCreationOptions) on new Document() with too few arguments must throw TypeError +PASS Document interface: new Document() must inherit property "createElement(DOMString, [object Object],[object Object])" with the proper type +PASS Document interface: calling createElement(DOMString, [object Object],[object Object]) on new Document() with too few arguments must throw TypeError +PASS Document interface: new Document() must inherit property "createElementNS(DOMString, DOMString, [object Object],[object Object])" with the proper type +PASS Document interface: calling createElementNS(DOMString, DOMString, [object Object],[object Object]) on new Document() with too few arguments must throw TypeError PASS Document interface: new Document() must inherit property "createDocumentFragment()" with the proper type PASS Document interface: new Document() must inherit property "createTextNode(DOMString)" with the proper type PASS Document interface: calling createTextNode(DOMString) on new Document() with too few arguments must throw TypeError @@ -581,10 +581,10 @@ PASS Document interface: calling getElementsByTagNameNS(DOMString, DOMString) on xmlDoc with too few arguments must throw TypeError PASS Document interface: xmlDoc must inherit property "getElementsByClassName(DOMString)" with the proper type PASS Document interface: calling getElementsByClassName(DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "createElement(DOMString, ElementCreationOptions)" with the proper type -PASS Document interface: calling createElement(DOMString, ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "createElementNS(DOMString, DOMString, ElementCreationOptions)" with the proper type -PASS Document interface: calling createElementNS(DOMString, DOMString, ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError +PASS Document interface: xmlDoc must inherit property "createElement(DOMString, [object Object],[object Object])" with the proper type +PASS Document interface: calling createElement(DOMString, [object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError +PASS Document interface: xmlDoc must inherit property "createElementNS(DOMString, DOMString, [object Object],[object Object])" with the proper type +PASS Document interface: calling createElementNS(DOMString, DOMString, [object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError PASS Document interface: xmlDoc must inherit property "createDocumentFragment()" with the proper type PASS Document interface: xmlDoc must inherit property "createTextNode(DOMString)" with the proper type PASS Document interface: calling createTextNode(DOMString) on xmlDoc with too few arguments must throw TypeError
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/fast/borders/border-inner-bleed-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/fast/borders/border-inner-bleed-expected.png index eb6297d..07b692d 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/fast/borders/border-inner-bleed-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/fast/borders/border-inner-bleed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/css/cssom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/css/cssom/interfaces-expected.txt index 0a4a709..6c6c499 100644 --- a/third_party/WebKit/LayoutTests/platform/win/external/wpt/css/cssom/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/css/cssom/interfaces-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 470 tests; 386 PASS, 84 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 470 tests; 385 PASS, 85 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Test driver PASS HTMLElement interface: attribute style PASS Unscopable handled correctly for style property on HTMLElement @@ -105,7 +105,7 @@ PASS StyleSheet interface: style_element.sheet must inherit property "media" with the proper type PASS StyleSheet interface: style_element.sheet must inherit property "disabled" with the proper type PASS StyleSheetList interface: existence and properties of interface object -PASS StyleSheetList interface object length +FAIL StyleSheetList interface object length assert_equals: wrong value for StyleSheetList.length expected 0 but got 1 PASS StyleSheetList interface object name FAIL StyleSheetList interface: existence and properties of interface prototype object assert_equals: prototype of StyleSheetList.prototype is not Array.prototype expected [] but got object "[object Object]" PASS StyleSheetList interface: existence and properties of interface prototype object's "constructor" property
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/dom/interfaces-expected.txt index a4060f7f..e4324a7d 100644 --- a/third_party/WebKit/LayoutTests/platform/win/external/wpt/dom/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/dom/interfaces-expected.txt
@@ -381,10 +381,10 @@ PASS Unscopable handled correctly for getElementsByTagNameNS(DOMString, DOMString) on Document PASS Document interface: operation getElementsByClassName(DOMString) PASS Unscopable handled correctly for getElementsByClassName(DOMString) on Document -PASS Document interface: operation createElement(DOMString, ElementCreationOptions) -PASS Unscopable handled correctly for createElement(DOMString, ElementCreationOptions) on Document -PASS Document interface: operation createElementNS(DOMString, DOMString, ElementCreationOptions) -PASS Unscopable handled correctly for createElementNS(DOMString, DOMString, ElementCreationOptions) on Document +PASS Document interface: operation createElement(DOMString, [object Object],[object Object]) +PASS Unscopable handled correctly for createElement(DOMString, [object Object],[object Object]) on Document +PASS Document interface: operation createElementNS(DOMString, DOMString, [object Object],[object Object]) +PASS Unscopable handled correctly for createElementNS(DOMString, DOMString, [object Object],[object Object]) on Document PASS Document interface: operation createDocumentFragment() PASS Unscopable handled correctly for createDocumentFragment() on Document PASS Document interface: operation createTextNode(DOMString) @@ -448,10 +448,10 @@ PASS Document interface: calling getElementsByTagNameNS(DOMString, DOMString) on new Document() with too few arguments must throw TypeError PASS Document interface: new Document() must inherit property "getElementsByClassName(DOMString)" with the proper type PASS Document interface: calling getElementsByClassName(DOMString) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "createElement(DOMString, ElementCreationOptions)" with the proper type -PASS Document interface: calling createElement(DOMString, ElementCreationOptions) on new Document() with too few arguments must throw TypeError -PASS Document interface: new Document() must inherit property "createElementNS(DOMString, DOMString, ElementCreationOptions)" with the proper type -PASS Document interface: calling createElementNS(DOMString, DOMString, ElementCreationOptions) on new Document() with too few arguments must throw TypeError +PASS Document interface: new Document() must inherit property "createElement(DOMString, [object Object],[object Object])" with the proper type +PASS Document interface: calling createElement(DOMString, [object Object],[object Object]) on new Document() with too few arguments must throw TypeError +PASS Document interface: new Document() must inherit property "createElementNS(DOMString, DOMString, [object Object],[object Object])" with the proper type +PASS Document interface: calling createElementNS(DOMString, DOMString, [object Object],[object Object]) on new Document() with too few arguments must throw TypeError PASS Document interface: new Document() must inherit property "createDocumentFragment()" with the proper type PASS Document interface: new Document() must inherit property "createTextNode(DOMString)" with the proper type PASS Document interface: calling createTextNode(DOMString) on new Document() with too few arguments must throw TypeError @@ -581,10 +581,10 @@ PASS Document interface: calling getElementsByTagNameNS(DOMString, DOMString) on xmlDoc with too few arguments must throw TypeError PASS Document interface: xmlDoc must inherit property "getElementsByClassName(DOMString)" with the proper type PASS Document interface: calling getElementsByClassName(DOMString) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "createElement(DOMString, ElementCreationOptions)" with the proper type -PASS Document interface: calling createElement(DOMString, ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError -PASS Document interface: xmlDoc must inherit property "createElementNS(DOMString, DOMString, ElementCreationOptions)" with the proper type -PASS Document interface: calling createElementNS(DOMString, DOMString, ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError +PASS Document interface: xmlDoc must inherit property "createElement(DOMString, [object Object],[object Object])" with the proper type +PASS Document interface: calling createElement(DOMString, [object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError +PASS Document interface: xmlDoc must inherit property "createElementNS(DOMString, DOMString, [object Object],[object Object])" with the proper type +PASS Document interface: calling createElementNS(DOMString, DOMString, [object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError PASS Document interface: xmlDoc must inherit property "createDocumentFragment()" with the proper type PASS Document interface: xmlDoc must inherit property "createTextNode(DOMString)" with the proper type PASS Document interface: calling createTextNode(DOMString) on xmlDoc with too few arguments must throw TypeError
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-inner-bleed-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-inner-bleed-expected.png index 35d2401..eb0daff1 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-inner-bleed-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-inner-bleed-expected.png Binary files differ
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 d77959c8..f10009fb 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -1525,6 +1525,7 @@ getter lastModified getter linkColor getter links + getter moreStyleSheets getter onabort getter onauxclick getter onbeforecopy @@ -1709,6 +1710,7 @@ setter domain setter fgColor setter linkColor + setter moreStyleSheets setter onabort setter onauxclick setter onbeforecopy @@ -6757,6 +6759,7 @@ getter host getter innerHTML getter mode + getter moreStyleSheets getter pictureInPictureElement getter pointerLockElement getter styleSheets @@ -6765,6 +6768,7 @@ method elementsFromPoint method getSelection setter innerHTML + setter moreStyleSheets interface SharedWorker : EventTarget attribute @@toStringTag getter onerror
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8EmbedderGraphBuilder.cpp b/third_party/WebKit/Source/bindings/core/v8/V8EmbedderGraphBuilder.cpp index ecf0a5a..47405997 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8EmbedderGraphBuilder.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8EmbedderGraphBuilder.cpp
@@ -40,10 +40,9 @@ isolate_, v8::Persistent<v8::Object>::Cast(*value)); ScriptWrappable* traceable = ToScriptWrappable(v8_value); if (traceable) { - // Add v8_value => traceable edge. + Graph::Node* wrapper = GraphNode(v8_value); Graph::Node* graph_node = - GraphNode(traceable, traceable->NameInHeapSnapshot()); - graph_->AddEdge(GraphNode(v8_value), graph_node); + GraphNode(traceable, traceable->NameInHeapSnapshot(), wrapper); // Visit traceable members. This will also add traceable => v8_value edge. ParentScope parent(this, graph_node); traceable->TraceWrappers(this); @@ -65,8 +64,8 @@ // Add an edge from the current parent to this object. // Also push the object to the worklist in order to process its members. const void* traceable = wrapper_descriptor.traceable; - Graph::Node* graph_node = - GraphNode(traceable, wrapper_descriptor.name_callback(traceable)); + Graph::Node* graph_node = GraphNode( + traceable, wrapper_descriptor.name_callback(traceable), nullptr); graph_->AddEdge(current_parent_, graph_node); if (!visited_.Contains(traceable)) { visited_.insert(traceable); @@ -90,14 +89,15 @@ v8::EmbedderGraph::Node* V8EmbedderGraphBuilder::GraphNode( Traceable traceable, - const char* name) const { + const char* name, + v8::EmbedderGraph::Node* wrapper) const { auto iter = graph_node_.find(traceable); if (iter != graph_node_.end()) return iter->value; // Ownership of the new node is transferred to the graph_. // graph_node_.at(tracable) is valid for all BuildEmbedderGraph execution. - auto node = - graph_->AddNode(std::unique_ptr<Graph::Node>(new EmbedderNode(name))); + auto node = graph_->AddNode( + std::unique_ptr<Graph::Node>(new EmbedderNode(name, wrapper))); graph_node_.insert(traceable, node); return node; }
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8EmbedderGraphBuilder.h b/third_party/WebKit/Source/bindings/core/v8/V8EmbedderGraphBuilder.h index 9ab8f89..1d0b7e5 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8EmbedderGraphBuilder.h +++ b/third_party/WebKit/Source/bindings/core/v8/V8EmbedderGraphBuilder.h
@@ -36,19 +36,22 @@ private: class EmbedderNode : public Graph::Node { public: - explicit EmbedderNode(const char* name) : name_(name) {} + EmbedderNode(const char* name, Graph::Node* wrapper) + : name_(name), wrapper_(wrapper) {} // Graph::Node overrides. const char* Name() override { return name_; } size_t SizeInBytes() override { return 0; } + Graph::Node* WrapperNode() override { return wrapper_; } private: const char* name_; + Graph::Node* wrapper_; }; class EmbedderRootNode : public EmbedderNode { public: - explicit EmbedderRootNode(const char* name) : EmbedderNode(name) {} + explicit EmbedderRootNode(const char* name) : EmbedderNode(name, nullptr) {} // Graph::Node override. bool IsRootNode() { return true; } }; @@ -77,7 +80,9 @@ WorklistItem ToWorklistItem(Graph::Node*, const WrapperDescriptor&) const; Graph::Node* GraphNode(const v8::Local<v8::Value>&) const; - Graph::Node* GraphNode(Traceable, const char* name) const; + Graph::Node* GraphNode(Traceable, + const char* name, + Graph::Node* wrapper) const; void VisitPendingActivities(); void VisitTransitiveClosure();
diff --git a/third_party/WebKit/Source/bindings/tests/idls/core/TestInterface.idl b/third_party/WebKit/Source/bindings/tests/idls/core/TestInterface.idl index aa6e3573..97bb5ba 100644 --- a/third_party/WebKit/Source/bindings/tests/idls/core/TestInterface.idl +++ b/third_party/WebKit/Source/bindings/tests/idls/core/TestInterface.idl
@@ -124,17 +124,17 @@ [LegacyInterfaceTypeChecking] void legacyInterfaceTypeCheckingMethod(TestInterfaceEmpty testInterfaceEmptyArg); [SecureContext] void secureContextMethod(); - [SecureContext] attribute bool secureContextAttribute; + [SecureContext] attribute boolean secureContextAttribute; [SecureContext,RuntimeEnabled=SecureFeature] void secureContextRuntimeEnabledMethod(); - [SecureContext,RuntimeEnabled=SecureFeature] attribute bool secureContextRuntimeEnabledAttribute; + [SecureContext,RuntimeEnabled=SecureFeature] attribute boolean secureContextRuntimeEnabledAttribute; [SecureContext,Exposed=Window] void secureContextWindowExposedMethod(); - [SecureContext,Exposed=Window] attribute bool secureContextWindowExposedAttribute; + [SecureContext,Exposed=Window] attribute boolean secureContextWindowExposedAttribute; [SecureContext,Exposed=Worker] void secureContextWorkerExposedMethod(); - [SecureContext,Exposed=Worker] attribute bool secureContextWorkerExposedAttribute; + [SecureContext,Exposed=Worker] attribute boolean secureContextWorkerExposedAttribute; [SecureContext,Exposed=Window,RuntimeEnabled=SecureFeature] void secureContextWindowExposedRuntimeEnabledMethod(); - [SecureContext,Exposed=Window,RuntimeEnabled=SecureFeature] attribute bool secureContextWindowExposedRuntimeEnabledAttribute; + [SecureContext,Exposed=Window,RuntimeEnabled=SecureFeature] attribute boolean secureContextWindowExposedRuntimeEnabledAttribute; [SecureContext,Exposed=Worker,RuntimeEnabled=SecureFeature] void secureContextWorkerExposedRuntimeEnabledMethod(); - [SecureContext,Exposed=Worker,RuntimeEnabled=SecureFeature] attribute bool secureContextWorkerExposedRuntimeEnabledAttribute; + [SecureContext,Exposed=Worker,RuntimeEnabled=SecureFeature] attribute boolean secureContextWorkerExposedRuntimeEnabledAttribute; // Arguments that are sequences or records of nullable types. void methodWithNullableSequences(sequence<double?> numbers, sequence<DOMString?> strings, sequence<Element?> elements, sequence<(double or DOMString)?> unions);
diff --git a/third_party/WebKit/Source/bindings/tests/idls/core/TestInterfacePartial2.idl b/third_party/WebKit/Source/bindings/tests/idls/core/TestInterfacePartial2.idl index 59993ef..51b63db 100644 --- a/third_party/WebKit/Source/bindings/tests/idls/core/TestInterfacePartial2.idl +++ b/third_party/WebKit/Source/bindings/tests/idls/core/TestInterfacePartial2.idl
@@ -40,5 +40,5 @@ static void partial2StaticVoidMethod(); [SecureContext] void partial2SecureContextMethod(); - [SecureContext] attribute bool partial2SecureContextAttribute; + [SecureContext] attribute boolean partial2SecureContextAttribute; };
diff --git a/third_party/WebKit/Source/bindings/tests/idls/core/TestInterfacePartialSecureContext.idl b/third_party/WebKit/Source/bindings/tests/idls/core/TestInterfacePartialSecureContext.idl index 8b22d79..e23496a 100644 --- a/third_party/WebKit/Source/bindings/tests/idls/core/TestInterfacePartialSecureContext.idl +++ b/third_party/WebKit/Source/bindings/tests/idls/core/TestInterfacePartialSecureContext.idl
@@ -8,15 +8,15 @@ ImplementedAs=TestInterfacePartialSecureContext // Conflicts with default partial interface class name ] partial interface TestInterface { void partialSecureContextMethod(); - attribute bool partialSecureContextAttribute; + attribute boolean partialSecureContextAttribute; [RuntimeEnabled=SecureFeature] void partialSecureContextRuntimeEnabledMethod(); - [RuntimeEnabled=SecureFeature] attribute bool partialSecureContextRuntimeEnabledAttribute; + [RuntimeEnabled=SecureFeature] attribute boolean partialSecureContextRuntimeEnabledAttribute; [Exposed=Window] void partialSecureContextWindowExposedMethod(); - [Exposed=Window] attribute bool partialSecureContextWindowExposedAttribute; + [Exposed=Window] attribute boolean partialSecureContextWindowExposedAttribute; [Exposed=Worker] void partialSecureContextWorkerExposedMethod(); - [Exposed=Worker] attribute bool partialSecureContextWorkerExposedAttribute; + [Exposed=Worker] attribute boolean partialSecureContextWorkerExposedAttribute; [Exposed=Window,RuntimeEnabled=SecureFeature] void partialSecureContextWindowExposedRuntimeEnabledMethod(); - [Exposed=Window,RuntimeEnabled=SecureFeature] attribute bool partialSecureContextWindowExposedRuntimeEnabledAttribute; + [Exposed=Window,RuntimeEnabled=SecureFeature] attribute boolean partialSecureContextWindowExposedRuntimeEnabledAttribute; [Exposed=Worker,RuntimeEnabled=SecureFeature] void partialSecureContextWorkerExposedRuntimeEnabledMethod(); - [Exposed=Worker,RuntimeEnabled=SecureFeature] attribute bool partialSecureContextWorkerExposedRuntimeEnabledAttribute; + [Exposed=Worker,RuntimeEnabled=SecureFeature] attribute boolean partialSecureContextWorkerExposedRuntimeEnabledAttribute; };
diff --git a/third_party/WebKit/Source/bindings/tests/idls/core/TestInterfaceSecureContext.idl b/third_party/WebKit/Source/bindings/tests/idls/core/TestInterfaceSecureContext.idl index e43c2b2..0f503bc 100644 --- a/third_party/WebKit/Source/bindings/tests/idls/core/TestInterfaceSecureContext.idl +++ b/third_party/WebKit/Source/bindings/tests/idls/core/TestInterfaceSecureContext.idl
@@ -7,15 +7,15 @@ Exposed=(Window,Worker) ] interface TestInterfaceSecureContext { void secureContextMethod(); - attribute bool secureContextAttribute; + attribute boolean secureContextAttribute; [RuntimeEnabled=SecureFeature] void secureContextRuntimeEnabledMethod(); - [RuntimeEnabled=SecureFeature] attribute bool secureContextRuntimeEnabledAttribute; + [RuntimeEnabled=SecureFeature] attribute boolean secureContextRuntimeEnabledAttribute; [Exposed=Window] void secureContextWindowExposedMethod(); - [Exposed=Window] attribute bool secureContextWindowExposedAttribute; + [Exposed=Window] attribute boolean secureContextWindowExposedAttribute; [Exposed=Worker] void secureContextWorkerExposedMethod(); - [Exposed=Worker] attribute bool secureContextWorkerExposedAttribute; + [Exposed=Worker] attribute boolean secureContextWorkerExposedAttribute; [Exposed=Window,RuntimeEnabled=SecureFeature] void secureContextWindowExposedRuntimeEnabledMethod(); - [Exposed=Window,RuntimeEnabled=SecureFeature] attribute bool secureContextWindowExposedRuntimeEnabledAttribute; + [Exposed=Window,RuntimeEnabled=SecureFeature] attribute boolean secureContextWindowExposedRuntimeEnabledAttribute; [Exposed=Worker,RuntimeEnabled=SecureFeature] void secureContextWorkerExposedRuntimeEnabledMethod(); - [Exposed=Worker,RuntimeEnabled=SecureFeature] attribute bool secureContextWorkerExposedRuntimeEnabledAttribute; + [Exposed=Worker,RuntimeEnabled=SecureFeature] attribute boolean secureContextWorkerExposedRuntimeEnabledAttribute; };
diff --git a/third_party/WebKit/Source/core/BUILD.gn b/third_party/WebKit/Source/core/BUILD.gn index c862fb4..ac658a19 100644 --- a/third_party/WebKit/Source/core/BUILD.gn +++ b/third_party/WebKit/Source/core/BUILD.gn
@@ -294,6 +294,8 @@ "testing/RecordTest.h", "testing/SequenceTest.cpp", "testing/SequenceTest.h", + "testing/StaticSelection.cpp", + "testing/StaticSelection.h", "testing/TypeConversions.h", "testing/UnionTypesTest.cpp", "testing/UnionTypesTest.h", @@ -1695,6 +1697,7 @@ "css/StyleElementTest.cpp", "css/StyleEngineTest.cpp", "css/StyleSheetContentsTest.cpp", + "css/StyleSheetListTest.cpp", "css/cssom/CSSMathInvertTest.cpp", "css/cssom/CSSMathNegateTest.cpp", "css/cssom/CSSNumericValueTypeTest.cpp", @@ -2048,6 +2051,7 @@ "paint/ViewPainterTest.cpp", "paint/compositing/CompositedLayerMappingTest.cpp", "paint/compositing/CompositingInputsUpdaterTest.cpp", + "paint/compositing/CompositingLayerAssignerTest.cpp", "paint/compositing/CompositingReasonFinderTest.cpp", "paint/compositing/PaintLayerCompositorTest.cpp", "paint/ng/ng_paint_fragment_test.cc",
diff --git a/third_party/WebKit/Source/core/core_idl_files.gni b/third_party/WebKit/Source/core/core_idl_files.gni index f1c8845..5100913 100644 --- a/third_party/WebKit/Source/core/core_idl_files.gni +++ b/third_party/WebKit/Source/core/core_idl_files.gni
@@ -666,6 +666,7 @@ "testing/OriginTrialsTest.idl", "testing/RecordTest.idl", "testing/SequenceTest.idl", + "testing/StaticSelection.idl", "testing/TypeConversions.idl", "testing/UnionTypesTest.idl", "testing/WorkerInternals.idl",
diff --git a/third_party/WebKit/Source/core/css/CSSProperties.json5 b/third_party/WebKit/Source/core/css/CSSProperties.json5 index 3bd08bd..f9edc30 100644 --- a/third_party/WebKit/Source/core/css/CSSProperties.json5 +++ b/third_party/WebKit/Source/core/css/CSSProperties.json5
@@ -562,6 +562,8 @@ name_for_methods: "Weight", converter: "ConvertFontWeight", priority: "High", + keywords: ["normal", "bold", "bolder", "lighter"], + typedom_types: ["Number"] }, { name: "font-feature-settings", @@ -2429,6 +2431,7 @@ type_name: "ShapeValue", computed_style_custom_functions: ["getter"], converter: "ConvertShapeValue", + keywords: ["none"] }, { name: "shape-rendering",
diff --git a/third_party/WebKit/Source/core/css/CSSStyleSheet.cpp b/third_party/WebKit/Source/core/css/CSSStyleSheet.cpp index 9d96670..2dc3e825 100644 --- a/third_party/WebKit/Source/core/css/CSSStyleSheet.cpp +++ b/third_party/WebKit/Source/core/css/CSSStyleSheet.cpp
@@ -36,7 +36,9 @@ #include "core/dom/ExceptionCode.h" #include "core/dom/Node.h" #include "core/frame/Deprecation.h" +#include "core/html/HTMLLinkElement.h" #include "core/html/HTMLStyleElement.h" +#include "core/html_names.h" #include "core/probe/CoreProbes.h" #include "core/svg/SVGStyleElement.h" #include "platform/bindings/V8PerIsolateData.h" @@ -45,6 +47,8 @@ namespace blink { +using namespace HTMLNames; + class StyleSheetCSSRuleList final : public CSSRuleList { public: static StyleSheetCSSRuleList* Create(CSSStyleSheet* sheet) { @@ -120,7 +124,7 @@ sheet->SetMedia(options.media().GetAsMediaList()); } if (options.alternate()) - sheet->SetAlternate(true); + sheet->SetAlternateFromConstructor(true); if (options.disabled()) sheet->setDisabled(true); sheet->SetText(text); @@ -498,8 +502,44 @@ contents_->ParseString(text); } -void CSSStyleSheet::SetAlternate(bool alternate) { - alternate_ = alternate; +void CSSStyleSheet::SetAlternateFromConstructor( + bool alternate_from_constructor) { + alternate_from_constructor_ = alternate_from_constructor; +} + +bool CSSStyleSheet::IsAlternate() const { + if (owner_node_) { + return owner_node_->IsElementNode() && + ToElement(owner_node_)->getAttribute(relAttr).Contains("alternate"); + } + return alternate_from_constructor_; +} + +bool CSSStyleSheet::CanBeActivated( + const String& current_preferrable_name) const { + if (disabled()) + return false; + + if (owner_node_ && owner_node_->IsInShadowTree()) { + if (IsHTMLStyleElement(owner_node_) || IsSVGStyleElement(owner_node_)) + return true; + if (IsHTMLLinkElement(owner_node_) && + ToHTMLLinkElement(owner_node_)->IsImport()) + return !IsAlternate(); + } + + if (!owner_node_ || + owner_node_->getNodeType() == Node::kProcessingInstructionNode || + !IsHTMLLinkElement(owner_node_) || + !ToHTMLLinkElement(owner_node_)->IsEnabledViaScript()) { + if (!title_.IsEmpty() && title_ != current_preferrable_name) + return false; + } + + if (IsAlternate() && title_.IsEmpty()) + return false; + + return true; } void CSSStyleSheet::Trace(blink::Visitor* visitor) {
diff --git a/third_party/WebKit/Source/core/css/CSSStyleSheet.h b/third_party/WebKit/Source/core/css/CSSStyleSheet.h index d3f2e9e..990b95b4 100644 --- a/third_party/WebKit/Source/core/css/CSSStyleSheet.h +++ b/third_party/WebKit/Source/core/css/CSSStyleSheet.h
@@ -153,8 +153,9 @@ void StartLoadingDynamicSheet(); void SetText(const String&); void SetMedia(MediaList*); - void SetAlternate(bool); - bool Alternate() const { return alternate_; } + void SetAlternateFromConstructor(bool); + bool IsAlternate() const; + bool CanBeActivated(const String& current_preferrable_name) const; virtual void Trace(blink::Visitor*); @@ -174,13 +175,21 @@ void SetLoadCompleted(bool); + FRIEND_TEST_ALL_PREFIXES( + CSSStyleSheetTest, + CSSStyleSheetConstructionWithEmptyCSSStyleSheetInitAndText); + FRIEND_TEST_ALL_PREFIXES( + CSSStyleSheetTest, + CSSStyleSheetConstructionWithoutEmptyCSSStyleSheetInitAndText); + bool AlternateFromConstructor() const { return alternate_from_constructor_; } + Member<StyleSheetContents> contents_; bool is_inline_stylesheet_ = false; bool is_disabled_ = false; bool load_completed_ = false; // This alternate variable is only used for constructed CSSStyleSheet. // For other CSSStyleSheet, consult the alternate attribute. - bool alternate_ = false; + bool alternate_from_constructor_ = false; String title_; scoped_refptr<MediaQuerySet> media_queries_; MediaQueryResultList viewport_dependent_media_query_results_;
diff --git a/third_party/WebKit/Source/core/css/CSSStyleSheetTest.cpp b/third_party/WebKit/Source/core/css/CSSStyleSheetTest.cpp index 18d25554..a317b31 100644 --- a/third_party/WebKit/Source/core/css/CSSStyleSheetTest.cpp +++ b/third_party/WebKit/Source/core/css/CSSStyleSheetTest.cpp
@@ -41,7 +41,7 @@ EXPECT_EQ(sheet->ownerRule(), nullptr); EXPECT_EQ(sheet->media()->length(), 0U); EXPECT_EQ(sheet->title(), StringImpl::empty_); - EXPECT_FALSE(sheet->Alternate()); + EXPECT_FALSE(sheet->AlternateFromConstructor()); EXPECT_FALSE(sheet->disabled()); EXPECT_EQ(sheet->cssRules(exception_state)->length(), 0U); ASSERT_FALSE(exception_state.HadException()); @@ -67,7 +67,7 @@ EXPECT_EQ(sheet->media()->length(), 2U); EXPECT_EQ(sheet->media()->mediaText(), init.media().GetAsString()); EXPECT_EQ(sheet->title(), init.title()); - EXPECT_TRUE(sheet->Alternate()); + EXPECT_TRUE(sheet->AlternateFromConstructor()); EXPECT_TRUE(sheet->disabled()); EXPECT_EQ(sheet->cssRules(exception_state)->length(), 2U); EXPECT_EQ(sheet->cssRules(exception_state)->item(0)->cssText(), styleText[0]);
diff --git a/third_party/WebKit/Source/core/css/DocumentStyleSheetCollection.cpp b/third_party/WebKit/Source/core/css/DocumentStyleSheetCollection.cpp index 39c1ba3d..a5f80ea 100644 --- a/third_party/WebKit/Source/core/css/DocumentStyleSheetCollection.cpp +++ b/third_party/WebKit/Source/core/css/DocumentStyleSheetCollection.cpp
@@ -32,6 +32,7 @@ #include "core/css/StyleChangeReason.h" #include "core/css/StyleEngine.h" #include "core/css/StyleSheetCandidate.h" +#include "core/css/StyleSheetList.h" #include "core/css/resolver/StyleResolver.h" #include "core/css/resolver/ViewportStyleResolver.h" #include "core/dom/Document.h" @@ -86,6 +87,25 @@ collector.AppendActiveStyleSheet( std::make_pair(css_sheet, master_engine.RuleSetForSheet(*css_sheet))); } + + if (!GetTreeScope().HasMoreStyleSheets()) + return; + + StyleSheetList& more_style_sheets = GetTreeScope().MoreStyleSheets(); + unsigned length = more_style_sheets.length(); + for (unsigned index = 0; index < length; ++index) { + StyleSheet* sheet = more_style_sheets.item(index); + if (!sheet) + continue; + CSSStyleSheet* css_sheet = ToCSSStyleSheet(sheet); + if (!css_sheet || + !css_sheet->CanBeActivated( + GetDocument().GetStyleEngine().PreferredStylesheetSetName())) + continue; + collector.AppendSheetForList(sheet); + collector.AppendActiveStyleSheet( + std::make_pair(css_sheet, master_engine.RuleSetForSheet(*css_sheet))); + } } void DocumentStyleSheetCollection::CollectStyleSheets(
diff --git a/third_party/WebKit/Source/core/css/ShadowTreeStyleSheetCollection.cpp b/third_party/WebKit/Source/core/css/ShadowTreeStyleSheetCollection.cpp index 5490fba..ed6e598 100644 --- a/third_party/WebKit/Source/core/css/ShadowTreeStyleSheetCollection.cpp +++ b/third_party/WebKit/Source/core/css/ShadowTreeStyleSheetCollection.cpp
@@ -64,6 +64,22 @@ std::make_pair(css_sheet, master_engine.RuleSetForSheet(*css_sheet))); } } + + if (!GetTreeScope().HasMoreStyleSheets()) + return; + + StyleSheetList& more_style_sheets = GetTreeScope().MoreStyleSheets(); + unsigned length = more_style_sheets.length(); + for (unsigned index = 0; index < length; ++index) { + StyleSheet* sheet = more_style_sheets.item(index); + if (!sheet) + continue; + CSSStyleSheet* css_sheet = ToCSSStyleSheet(sheet); + if (!css_sheet || !css_sheet->CanBeActivated(g_null_atom)) + continue; + collection.AppendActiveStyleSheet( + std::make_pair(css_sheet, master_engine.RuleSetForSheet(*css_sheet))); + } } void ShadowTreeStyleSheetCollection::UpdateActiveStyleSheets(
diff --git a/third_party/WebKit/Source/core/css/StyleEngine.cpp b/third_party/WebKit/Source/core/css/StyleEngine.cpp index 27f469a4..0dba8c2 100644 --- a/third_party/WebKit/Source/core/css/StyleEngine.cpp +++ b/third_party/WebKit/Source/core/css/StyleEngine.cpp
@@ -277,6 +277,17 @@ SetNeedsActiveStyleUpdate(node.GetTreeScope()); } +void StyleEngine::MoreStyleSheetsChangedInScope(TreeScope& tree_scope) { + if (GetDocument().IsDetached()) + return; + if (tree_scope.MoreStyleSheets().length() > 0) { + EnsureStyleSheetCollectionFor(tree_scope); + if (tree_scope != document_) + active_tree_scopes_.insert(&tree_scope); + } + SetNeedsActiveStyleUpdate(tree_scope); +} + void StyleEngine::MediaQueriesChangedInScope(TreeScope& tree_scope) { if (ScopedStyleResolver* resolver = tree_scope.GetScopedStyleResolver()) resolver->SetNeedsAppendAllSheets(); @@ -352,7 +363,8 @@ ToShadowTreeStyleSheetCollection(StyleSheetCollectionFor(*tree_scope)); DCHECK(collection); collection->UpdateActiveStyleSheets(*this); - if (!collection->HasStyleSheetCandidateNodes()) { + if (!collection->HasStyleSheetCandidateNodes() && + !tree_scope->HasMoreStyleSheets()) { tree_scopes_removed.insert(tree_scope); // When removing TreeScope from ActiveTreeScopes, // its resolver should be destroyed by invoking resetAuthorStyle.
diff --git a/third_party/WebKit/Source/core/css/StyleEngine.h b/third_party/WebKit/Source/core/css/StyleEngine.h index 0afa2f0..8bdf6df 100644 --- a/third_party/WebKit/Source/core/css/StyleEngine.h +++ b/third_party/WebKit/Source/core/css/StyleEngine.h
@@ -114,6 +114,7 @@ void AddStyleSheetCandidateNode(Node&); void RemoveStyleSheetCandidateNode(Node&, ContainerNode& insertion_point); void ModifiedStyleSheetCandidateNode(Node&); + void MoreStyleSheetsChangedInScope(TreeScope&); void MediaQueriesChangedInScope(TreeScope&); void WatchedSelectorsChanged(); void InitialViewportChanged();
diff --git a/third_party/WebKit/Source/core/css/StyleSheetCandidate.cpp b/third_party/WebKit/Source/core/css/StyleSheetCandidate.cpp index 7dd3e51..ced5d203 100644 --- a/third_party/WebKit/Source/core/css/StyleSheetCandidate.cpp +++ b/third_party/WebKit/Source/core/css/StyleSheetCandidate.cpp
@@ -62,16 +62,6 @@ return ToHTMLLinkElement(GetNode()).import(); } -bool StyleSheetCandidate::IsAlternate() const { - if (node_) { - return IsElement() && - ToElement(GetNode()).getAttribute(relAttr).Contains("alternate"); - } - if (!Sheet()->IsCSSStyleSheet()) - return false; - return ToCSSStyleSheet(Sheet())->Alternate(); -} - bool StyleSheetCandidate::IsEnabledViaScript() const { return IsHTMLLink() && ToHTMLLinkElement(GetNode()).IsEnabledViaScript(); } @@ -86,22 +76,7 @@ StyleSheet* sheet = this->Sheet(); if (!sheet || sheet->disabled() || !sheet->IsCSSStyleSheet()) return false; - - if (sheet->ownerNode() && sheet->ownerNode()->IsInShadowTree()) { - if (IsCSSStyle()) - return true; - if (IsHTMLLink() && !IsImport()) - return !IsAlternate(); - } - - const AtomicString& title = this->Title(); - if (!IsEnabledViaScript() && !title.IsEmpty() && - title != current_preferrable_name) - return false; - if (IsAlternate() && title.IsEmpty()) - return false; - - return true; + return ToCSSStyleSheet(Sheet())->CanBeActivated(current_preferrable_name); } StyleSheetCandidate::Type StyleSheetCandidate::TypeOf(Node& node) {
diff --git a/third_party/WebKit/Source/core/css/StyleSheetList.cpp b/third_party/WebKit/Source/core/css/StyleSheetList.cpp index 8a19919b..92bff30 100644 --- a/third_party/WebKit/Source/core/css/StyleSheetList.cpp +++ b/third_party/WebKit/Source/core/css/StyleSheetList.cpp
@@ -31,8 +31,25 @@ using namespace HTMLNames; +StyleSheetList* StyleSheetList::Create( + const HeapVector<Member<CSSStyleSheet>>& style_sheet_vector, + ExceptionState& exception_state) { + if (!RuntimeEnabledFeatures::ConstructableStylesheetsEnabled()) { + exception_state.ThrowTypeError("Illegal constructor"); + return nullptr; + } + + return new StyleSheetList(style_sheet_vector); +} + +StyleSheetList::StyleSheetList( + const HeapVector<Member<CSSStyleSheet>>& style_sheet_vector) + : style_sheet_vector_(style_sheet_vector) {} + StyleSheetList::StyleSheetList(TreeScope* tree_scope) - : tree_scope_(tree_scope) {} + : tree_scope_(tree_scope) { + CHECK(tree_scope); +} inline const HeapVector<TraceWrapperMember<StyleSheet>>& StyleSheetList::StyleSheets() const { @@ -41,10 +58,16 @@ } unsigned StyleSheetList::length() { + if (!tree_scope_) + return style_sheet_vector_.size(); return StyleSheets().size(); } StyleSheet* StyleSheetList::item(unsigned index) { + if (!tree_scope_) { + return index < style_sheet_vector_.size() ? style_sheet_vector_[index].Get() + : nullptr; + } const HeapVector<TraceWrapperMember<StyleSheet>>& sheets = StyleSheets(); return index < sheets.size() ? sheets[index].Get() : nullptr; } @@ -78,6 +101,7 @@ void StyleSheetList::Trace(blink::Visitor* visitor) { visitor->Trace(tree_scope_); + visitor->Trace(style_sheet_vector_); ScriptWrappable::Trace(visitor); }
diff --git a/third_party/WebKit/Source/core/css/StyleSheetList.h b/third_party/WebKit/Source/core/css/StyleSheetList.h index 27e6abed..3a70e158 100644 --- a/third_party/WebKit/Source/core/css/StyleSheetList.h +++ b/third_party/WebKit/Source/core/css/StyleSheetList.h
@@ -37,6 +37,9 @@ DEFINE_WRAPPERTYPEINFO(); public: + static StyleSheetList* Create(const HeapVector<Member<CSSStyleSheet>>&, + ExceptionState&); + static StyleSheetList* Create(TreeScope* tree_scope) { return new StyleSheetList(tree_scope); } @@ -55,10 +58,12 @@ void Trace(blink::Visitor*); private: + explicit StyleSheetList(const HeapVector<Member<CSSStyleSheet>>&); explicit StyleSheetList(TreeScope*); const HeapVector<TraceWrapperMember<StyleSheet>>& StyleSheets() const; Member<TreeScope> tree_scope_; + HeapVector<Member<CSSStyleSheet>> style_sheet_vector_; }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/StyleSheetList.idl b/third_party/WebKit/Source/core/css/StyleSheetList.idl index 79e97b9..a3572d3 100644 --- a/third_party/WebKit/Source/core/css/StyleSheetList.idl +++ b/third_party/WebKit/Source/core/css/StyleSheetList.idl
@@ -22,6 +22,8 @@ // TODO(foolip): StyleSheetList should be an [ArrayClass]. [ + RaisesException=Constructor, + Constructor(sequence<CSSStyleSheet> sheets), Exposed=Window ] interface StyleSheetList { [Measure] getter StyleSheet? item(unsigned long index);
diff --git a/third_party/WebKit/Source/core/css/StyleSheetListTest.cpp b/third_party/WebKit/Source/core/css/StyleSheetListTest.cpp new file mode 100644 index 0000000..9ddfcc7 --- /dev/null +++ b/third_party/WebKit/Source/core/css/StyleSheetListTest.cpp
@@ -0,0 +1,61 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/css/CSSRuleList.h" +#include "core/css/CSSStyleSheet.h" +#include "core/css/CSSStyleSheetInit.h" +#include "core/css/StyleSheetList.h" +#include "core/testing/PageTestBase.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { + +class StyleSheetListTest : public PageTestBase { + protected: + virtual void SetUp() { + PageTestBase::SetUp(); + RuntimeEnabledFeatures::SetConstructableStylesheetsEnabled(true); + } +}; + +TEST_F(StyleSheetListTest, ConstructorWithoutRuntimeFlagThrowsException) { + DummyExceptionStateForTesting exception_state; + RuntimeEnabledFeatures::SetConstructableStylesheetsEnabled(false); + HeapVector<Member<CSSStyleSheet>> style_sheet_vector; + EXPECT_EQ(StyleSheetList::Create(style_sheet_vector, exception_state), + nullptr); + ASSERT_TRUE(exception_state.HadException()); +} + +TEST_F(StyleSheetListTest, StyleSheetListConstructionWithEmptyList) { + DummyExceptionStateForTesting exception_state; + HeapVector<Member<CSSStyleSheet>> style_sheet_vector; + StyleSheetList* sheet_list = + StyleSheetList::Create(style_sheet_vector, exception_state); + ASSERT_FALSE(exception_state.HadException()); + EXPECT_EQ(sheet_list->length(), 0U); +} + +TEST_F(StyleSheetListTest, StyleSheetListConstructionWithNonEmptyList) { + DummyExceptionStateForTesting exception_state; + HeapVector<Member<CSSStyleSheet>> style_sheet_vector; + CSSStyleSheetInit init; + init.setTitle("Red Sheet"); + CSSStyleSheet* red_style_sheet = CSSStyleSheet::Create( + GetDocument(), ".red { color: red; }", init, exception_state); + init.setTitle("Blue Sheet"); + CSSStyleSheet* blue_style_sheet = CSSStyleSheet::Create( + GetDocument(), ".blue { color: blue; }", init, exception_state); + style_sheet_vector.push_back(red_style_sheet); + style_sheet_vector.push_back(blue_style_sheet); + + StyleSheetList* sheet_list = + StyleSheetList::Create(style_sheet_vector, exception_state); + ASSERT_FALSE(exception_state.HadException()); + EXPECT_EQ(sheet_list->length(), 2U); + EXPECT_EQ(sheet_list->item(0), red_style_sheet); + EXPECT_EQ(sheet_list->item(1), blue_style_sheet); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp b/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp index bf2284a..e0e40aa 100644 --- a/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp +++ b/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp
@@ -34,6 +34,23 @@ return canonical_unit; } +bool IsValueOutOfRangeForProperty(CSSPropertyID property_id, double value) { + // FIXME: Avoid this CSSProperty::Get call as it can be costly. + // The caller often has a CSSProperty already, so we can just pass it here. + if (LengthPropertyFunctions::GetValueRange(CSSProperty::Get(property_id)) == + kValueRangeNonNegative && + value < 0) + return true; + + // For non-length properties and special cases. + switch (property_id) { + case CSSPropertyFontWeight: + return value < 0 || value > 1000; + default: + return false; + } +} + } // namespace CSSUnitValue* CSSUnitValue::Create(double value, @@ -121,11 +138,7 @@ const CSSPrimitiveValue* CSSUnitValue::ToCSSValueWithProperty( CSSPropertyID property_id) const { - // FIXME: Avoid this CSSProperty::Get call as it can be costly. - // The caller often has a CSSProperty already, so we can just pass it here. - if (LengthPropertyFunctions::GetValueRange(CSSProperty::Get(property_id)) == - kValueRangeNonNegative && - value_ < 0) { + if (IsValueOutOfRangeForProperty(property_id, value_)) { // Wrap out of range values with a calc. CSSCalcExpressionNode* node = ToCalcExpressionNode(); node->SetIsNestedCalc();
diff --git a/third_party/WebKit/Source/core/css/cssom/ComputedStylePropertyMap.cpp b/third_party/WebKit/Source/core/css/cssom/ComputedStylePropertyMap.cpp index 19ecf23..186a9a5 100644 --- a/third_party/WebKit/Source/core/css/cssom/ComputedStylePropertyMap.cpp +++ b/third_party/WebKit/Source/core/css/cssom/ComputedStylePropertyMap.cpp
@@ -13,7 +13,7 @@ namespace blink { -int ComputedStylePropertyMap::size() { +unsigned int ComputedStylePropertyMap::size() { const ComputedStyle* style = UpdateStyle(); if (!style) return 0;
diff --git a/third_party/WebKit/Source/core/css/cssom/ComputedStylePropertyMap.h b/third_party/WebKit/Source/core/css/cssom/ComputedStylePropertyMap.h index fe16e21..105fed3 100644 --- a/third_party/WebKit/Source/core/css/cssom/ComputedStylePropertyMap.h +++ b/third_party/WebKit/Source/core/css/cssom/ComputedStylePropertyMap.h
@@ -32,7 +32,7 @@ StylePropertyMapReadOnly::Trace(visitor); } - int size() override; + unsigned int size() override; protected: ComputedStylePropertyMap(Node* node, const String& pseudo_element = String())
diff --git a/third_party/WebKit/Source/core/css/cssom/DeclaredStylePropertyMap.cpp b/third_party/WebKit/Source/core/css/cssom/DeclaredStylePropertyMap.cpp index 078057c..cf20923 100644 --- a/third_party/WebKit/Source/core/css/cssom/DeclaredStylePropertyMap.cpp +++ b/third_party/WebKit/Source/core/css/cssom/DeclaredStylePropertyMap.cpp
@@ -16,7 +16,7 @@ DeclaredStylePropertyMap::DeclaredStylePropertyMap(CSSStyleRule* owner_rule) : StylePropertyMap(), owner_rule_(owner_rule) {} -int DeclaredStylePropertyMap::size() { +unsigned int DeclaredStylePropertyMap::size() { if (!GetStyleRule()) return 0; return GetStyleRule()->Properties().PropertyCount();
diff --git a/third_party/WebKit/Source/core/css/cssom/DeclaredStylePropertyMap.h b/third_party/WebKit/Source/core/css/cssom/DeclaredStylePropertyMap.h index d451e9d..bf30036 100644 --- a/third_party/WebKit/Source/core/css/cssom/DeclaredStylePropertyMap.h +++ b/third_party/WebKit/Source/core/css/cssom/DeclaredStylePropertyMap.h
@@ -31,7 +31,7 @@ StylePropertyMap::Trace(visitor); } - int size() final; + unsigned int size() final; protected: const CSSValue* GetProperty(CSSPropertyID) override;
diff --git a/third_party/WebKit/Source/core/css/cssom/FilteredComputedStylePropertyMap.cpp b/third_party/WebKit/Source/core/css/cssom/FilteredComputedStylePropertyMap.cpp index 253d72d..efa8ba9 100644 --- a/third_party/WebKit/Source/core/css/cssom/FilteredComputedStylePropertyMap.cpp +++ b/third_party/WebKit/Source/core/css/cssom/FilteredComputedStylePropertyMap.cpp
@@ -28,7 +28,7 @@ } } -int FilteredComputedStylePropertyMap::size() { +unsigned int FilteredComputedStylePropertyMap::size() { return native_properties_.size() + custom_properties_.size(); }
diff --git a/third_party/WebKit/Source/core/css/cssom/FilteredComputedStylePropertyMap.h b/third_party/WebKit/Source/core/css/cssom/FilteredComputedStylePropertyMap.h index 92519e3..5699120 100644 --- a/third_party/WebKit/Source/core/css/cssom/FilteredComputedStylePropertyMap.h +++ b/third_party/WebKit/Source/core/css/cssom/FilteredComputedStylePropertyMap.h
@@ -23,7 +23,7 @@ custom_properties); } - int size() final; + unsigned int size() final; private: FilteredComputedStylePropertyMap(
diff --git a/third_party/WebKit/Source/core/css/cssom/InlineStylePropertyMap.cpp b/third_party/WebKit/Source/core/css/cssom/InlineStylePropertyMap.cpp index 68a41ab2..4c0fc308 100644 --- a/third_party/WebKit/Source/core/css/cssom/InlineStylePropertyMap.cpp +++ b/third_party/WebKit/Source/core/css/cssom/InlineStylePropertyMap.cpp
@@ -10,7 +10,7 @@ namespace blink { -int InlineStylePropertyMap::size() { +unsigned int InlineStylePropertyMap::size() { const CSSPropertyValueSet* inline_style = owner_element_->InlineStyle(); return inline_style ? inline_style->PropertyCount() : 0; }
diff --git a/third_party/WebKit/Source/core/css/cssom/InlineStylePropertyMap.h b/third_party/WebKit/Source/core/css/cssom/InlineStylePropertyMap.h index 4c76368..78d2a1f3 100644 --- a/third_party/WebKit/Source/core/css/cssom/InlineStylePropertyMap.h +++ b/third_party/WebKit/Source/core/css/cssom/InlineStylePropertyMap.h
@@ -21,7 +21,7 @@ StylePropertyMap::Trace(visitor); } - int size() final; + unsigned int size() final; protected: const CSSValue* GetProperty(CSSPropertyID) override;
diff --git a/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.h b/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.h index 8467f50..be098b5 100644 --- a/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.h +++ b/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.h
@@ -28,7 +28,7 @@ CSSStyleValueVector getAll(const String& property_name, ExceptionState&); bool has(const String& property_name, ExceptionState&); - virtual int size() = 0; + virtual unsigned int size() = 0; protected: StylePropertyMapReadOnly() = default;
diff --git a/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.idl b/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.idl index 4503c900..c97035f 100644 --- a/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.idl +++ b/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.idl
@@ -13,5 +13,5 @@ [RaisesException] CSSStyleValue? get(DOMString property); [RaisesException] sequence<CSSStyleValue> getAll(DOMString property); [RaisesException] boolean has(DOMString property); - readonly attribute long size; + readonly attribute unsigned long size; };
diff --git a/third_party/WebKit/Source/core/css/resolver/ScopedStyleResolver.cpp b/third_party/WebKit/Source/core/css/resolver/ScopedStyleResolver.cpp index 8fa878d0..8df7231 100644 --- a/third_party/WebKit/Source/core/css/resolver/ScopedStyleResolver.cpp +++ b/third_party/WebKit/Source/core/css/resolver/ScopedStyleResolver.cpp
@@ -114,7 +114,8 @@ device_dependent_media_query_results_); for (auto sheet : author_style_sheets_) { - DCHECK(sheet->ownerNode()); + if (!RuntimeEnabledFeatures::ConstructableStylesheetsEnabled()) + DCHECK(sheet->ownerNode()); StyleSheetContents* contents = sheet->Contents(); if (contents->HasOneClient() || visited_shared_style_sheet_contents.insert(contents).is_new_entry) @@ -218,7 +219,8 @@ CascadeOrder cascade_order) { size_t sheet_index = 0; for (auto sheet : author_style_sheets_) { - DCHECK(sheet->ownerNode()); + if (!RuntimeEnabledFeatures::ConstructableStylesheetsEnabled()) + DCHECK(sheet->ownerNode()); MatchRequest match_request(&sheet->Contents()->GetRuleSet(), &scope_->RootNode(), sheet, sheet_index++); collector.CollectMatchingRules(match_request, cascade_order); @@ -230,7 +232,8 @@ CascadeOrder cascade_order) { size_t sheet_index = 0; for (auto sheet : author_style_sheets_) { - DCHECK(sheet->ownerNode()); + if (!RuntimeEnabledFeatures::ConstructableStylesheetsEnabled()) + DCHECK(sheet->ownerNode()); MatchRequest match_request(&sheet->Contents()->GetRuleSet(), &scope_->RootNode(), sheet, sheet_index++); collector.CollectMatchingShadowHostRules(match_request, cascade_order);
diff --git a/third_party/WebKit/Source/core/dom/Document.idl b/third_party/WebKit/Source/core/dom/Document.idl index 42fd437..e5cf52e 100644 --- a/third_party/WebKit/Source/core/dom/Document.idl +++ b/third_party/WebKit/Source/core/dom/Document.idl
@@ -43,7 +43,7 @@ [ImplementedAs=urlForBinding] readonly attribute USVString URL; // FIXME: documentURI should not be nullable. [ImplementedAs=urlForBinding] readonly attribute USVString? documentURI; - [MeasureAs=DocumentOrigin] readonly attribute DOMString origin; + [MeasureAs=DocumentOrigin] readonly attribute USVString origin; readonly attribute DOMString compatMode; readonly attribute DOMString characterSet;
diff --git a/third_party/WebKit/Source/core/dom/DocumentOrShadowRoot.h b/third_party/WebKit/Source/core/dom/DocumentOrShadowRoot.h index 4a1cf3b..57f57b2 100644 --- a/third_party/WebKit/Source/core/dom/DocumentOrShadowRoot.h +++ b/third_party/WebKit/Source/core/dom/DocumentOrShadowRoot.h
@@ -30,6 +30,17 @@ return &shadow_root.StyleSheets(); } + static StyleSheetList* moreStyleSheets(TreeScope& tree_scope) { + CHECK(RuntimeEnabledFeatures::ConstructableStylesheetsEnabled()); + return &tree_scope.MoreStyleSheets(); + } + + static void setMoreStyleSheets(TreeScope& tree_scope, + StyleSheetList* more_style_sheets) { + CHECK(RuntimeEnabledFeatures::ConstructableStylesheetsEnabled()); + tree_scope.SetMoreStyleSheets(more_style_sheets); + } + static DOMSelection* getSelection(TreeScope& tree_scope) { return tree_scope.GetSelection(); }
diff --git a/third_party/WebKit/Source/core/dom/DocumentOrShadowRoot.idl b/third_party/WebKit/Source/core/dom/DocumentOrShadowRoot.idl index cb12de6..09f8104d 100644 --- a/third_party/WebKit/Source/core/dom/DocumentOrShadowRoot.idl +++ b/third_party/WebKit/Source/core/dom/DocumentOrShadowRoot.idl
@@ -23,4 +23,5 @@ // Fullscreen API // https://fullscreen.spec.whatwg.org/ [RuntimeEnabled=FullscreenUnprefixed] readonly attribute Element? fullscreenElement; + [RuntimeEnabled=ConstructableStylesheets] attribute StyleSheetList moreStyleSheets; };
diff --git a/third_party/WebKit/Source/core/dom/TreeScope.cpp b/third_party/WebKit/Source/core/dom/TreeScope.cpp index 2df2c23..2a969a7 100644 --- a/third_party/WebKit/Source/core/dom/TreeScope.cpp +++ b/third_party/WebKit/Source/core/dom/TreeScope.cpp
@@ -321,6 +321,22 @@ return *svg_tree_scoped_resources_; } +bool TreeScope::HasMoreStyleSheets() const { + return more_style_sheets_ && more_style_sheets_->length() > 0; +} + +StyleSheetList& TreeScope::MoreStyleSheets() { + if (!more_style_sheets_) + SetMoreStyleSheets(StyleSheetList::Create(this)); + return *more_style_sheets_; +} + +void TreeScope::SetMoreStyleSheets(StyleSheetList* more_style_sheets) { + more_style_sheets_ = more_style_sheets; + // TODO(rakina): handle changes to moreStyleSheets contents through CSSOM + GetDocument().GetStyleEngine().MoreStyleSheetsChangedInScope(*this); +} + DOMSelection* TreeScope::GetSelection() const { if (!RootNode().GetDocument().GetFrame()) return nullptr; @@ -576,6 +592,7 @@ visitor->Trace(scoped_style_resolver_); visitor->Trace(radio_button_group_scope_); visitor->Trace(svg_tree_scoped_resources_); + visitor->Trace(more_style_sheets_); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/TreeScope.h b/third_party/WebKit/Source/core/dom/TreeScope.h index 26b6726..f4fbde4 100644 --- a/third_party/WebKit/Source/core/dom/TreeScope.h +++ b/third_party/WebKit/Source/core/dom/TreeScope.h
@@ -43,9 +43,10 @@ class HTMLMapElement; class HitTestResult; class IdTargetObserverRegistry; +class Node; class SVGTreeScopeResources; class ScopedStyleResolver; -class Node; +class StyleSheetList; // A class which inherits both Node and TreeScope must call clearRareData() in // its destructor so that the Node destructor no longer does problematic @@ -136,6 +137,10 @@ SVGTreeScopeResources& EnsureSVGTreeScopedResources(); + bool HasMoreStyleSheets() const; + StyleSheetList& MoreStyleSheets(); + void SetMoreStyleSheets(StyleSheetList*); + protected: TreeScope(ContainerNode&, Document&); TreeScope(Document&); @@ -165,6 +170,8 @@ RadioButtonGroupScope radio_button_group_scope_; Member<SVGTreeScopeResources> svg_tree_scoped_resources_; + + Member<StyleSheetList> more_style_sheets_; }; inline bool TreeScope::HasElementWithId(const AtomicString& id) const {
diff --git a/third_party/WebKit/Source/core/editing/EditingUtilities.cpp b/third_party/WebKit/Source/core/editing/EditingUtilities.cpp index 75c8ed2c..fba1b3d9 100644 --- a/third_party/WebKit/Source/core/editing/EditingUtilities.cpp +++ b/third_party/WebKit/Source/core/editing/EditingUtilities.cpp
@@ -1799,4 +1799,14 @@ pasteboard->WriteImage(image.get(), url_string, title); } +Element* FindEventTargetFrom(LocalFrame& frame, + const VisibleSelection& selection) { + Element* const target = AssociatedElementOf(selection.Start()); + if (!target) + return frame.GetDocument()->body(); + if (target->IsInUserAgentShadowRoot()) + return target->OwnerShadowHost(); + return target; +} + } // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/EditingUtilities.h b/third_party/WebKit/Source/core/editing/EditingUtilities.h index d9b670bb..3b2a9f5 100644 --- a/third_party/WebKit/Source/core/editing/EditingUtilities.h +++ b/third_party/WebKit/Source/core/editing/EditingUtilities.h
@@ -323,6 +323,8 @@ HTMLSpanElement* CreateTabSpanElement(Document&); HTMLSpanElement* CreateTabSpanElement(Document&, const String& tab_text); +Element* FindEventTargetFrom(LocalFrame&, const VisibleSelection&); + // Boolean functions on Element CORE_EXPORT bool ElementCannotHaveEndTag(const Node&);
diff --git a/third_party/WebKit/Source/core/editing/Editor.cpp b/third_party/WebKit/Source/core/editing/Editor.cpp index 96c353d..920b1f59 100644 --- a/third_party/WebKit/Source/core/editing/Editor.cpp +++ b/third_party/WebKit/Source/core/editing/Editor.cpp
@@ -319,65 +319,6 @@ return false; } -bool Editor::DeleteWithDirection(DeleteDirection direction, - TextGranularity granularity, - bool kill_ring, - bool is_typing_action) { - if (!CanEdit()) - return false; - - EditingState editing_state; - if (GetFrame() - .Selection() - .ComputeVisibleSelectionInDOMTreeDeprecated() - .IsRange()) { - if (is_typing_action) { - DCHECK(GetFrame().GetDocument()); - TypingCommand::DeleteKeyPressed( - *GetFrame().GetDocument(), - CanSmartCopyOrDelete() ? TypingCommand::kSmartDelete : 0, - granularity); - RevealSelectionAfterEditingOperation(); - } else { - if (kill_ring) - AddToKillRing(SelectedRange()); - DeleteSelectionWithSmartDelete( - CanSmartCopyOrDelete() ? DeleteMode::kSmart : DeleteMode::kSimple, - DeletionInputTypeFromTextGranularity(direction, granularity)); - // Implicitly calls revealSelectionAfterEditingOperation(). - } - } else { - TypingCommand::Options options = 0; - if (CanSmartCopyOrDelete()) - options |= TypingCommand::kSmartDelete; - if (kill_ring) - options |= TypingCommand::kKillRing; - switch (direction) { - case DeleteDirection::kForward: - DCHECK(GetFrame().GetDocument()); - TypingCommand::ForwardDeleteKeyPressed( - *GetFrame().GetDocument(), &editing_state, options, granularity); - if (editing_state.IsAborted()) - return false; - break; - case DeleteDirection::kBackward: - DCHECK(GetFrame().GetDocument()); - TypingCommand::DeleteKeyPressed(*GetFrame().GetDocument(), options, - granularity); - break; - } - RevealSelectionAfterEditingOperation(); - } - - // FIXME: We should to move this down into deleteKeyPressed. - // clear the "start new kill ring sequence" setting, because it was set to - // true when the selection was updated by deleting the range - if (kill_ring) - SetStartNewKillRingSequence(false); - - return true; -} - void Editor::DeleteSelectionWithSmartDelete( DeleteMode delete_mode, InputEvent::InputType input_type, @@ -401,27 +342,6 @@ ->Apply(); } -void Editor::PasteAsPlainText(const String& pasting_text, - bool smart_replace, - EditorCommandSource source) { - Element* target = FindEventTargetForClipboardEvent(source); - if (!target) - return; - target->DispatchEvent(TextEvent::CreateForPlainTextPaste( - GetFrame().DomWindow(), pasting_text, smart_replace)); -} - -void Editor::PasteAsFragment(DocumentFragment* pasting_fragment, - bool smart_replace, - bool match_style, - EditorCommandSource source) { - Element* target = FindEventTargetForClipboardEvent(source); - if (!target) - return; - target->DispatchEvent(TextEvent::CreateForFragmentPaste( - GetFrame().DomWindow(), pasting_fragment, smart_replace, match_style)); -} - bool Editor::DispatchCopyEvent(EditorCommandSource source) { // TODO(editing-dev): The use of UpdateStyleAndLayoutIgnorePendingStylesheets // needs to be audited. See http://crbug.com/590369 for more details. @@ -629,15 +549,6 @@ last_edit_command_ = command_group_wrapper; } -Element* Editor::FindEventTargetFrom(const VisibleSelection& selection) const { - Element* const target = AssociatedElementOf(selection.Start()); - if (!target) - return GetFrame().GetDocument()->body(); - if (target->IsInUserAgentShadowRoot()) - return target->OwnerShadowHost(); - return target; -} - Element* Editor::FindEventTargetForClipboardEvent( EditorCommandSource source) const { // https://www.w3.org/TR/clipboard-apis/#fire-a-clipboard-event says: @@ -648,7 +559,7 @@ return GetFrameSelection().GetDocument().body(); return FindEventTargetFrom( - GetFrameSelection().ComputeVisibleSelectionInDOMTree()); + GetFrame(), GetFrameSelection().ComputeVisibleSelectionInDOMTree()); } void Editor::ApplyParagraphStyle(CSSPropertyValueSet* style,
diff --git a/third_party/WebKit/Source/core/editing/Editor.h b/third_party/WebKit/Source/core/editing/Editor.h index 1a9c3f3..1d114a3 100644 --- a/third_party/WebKit/Source/core/editing/Editor.h +++ b/third_party/WebKit/Source/core/editing/Editor.h
@@ -98,10 +98,6 @@ void RegisterCommandGroup(CompositeEditCommand* command_group_wrapper); - bool DeleteWithDirection(DeleteDirection, - TextGranularity, - bool kill_ring, - bool is_typing_action); void DeleteSelectionWithSmartDelete( DeleteMode, InputEvent::InputType, @@ -210,13 +206,6 @@ void AddToKillRing(const EphemeralRange&); - void PasteAsFragment(DocumentFragment*, - bool smart_replace, - bool match_style, - EditorCommandSource); - void PasteAsPlainText(const String&, bool smart_replace, EditorCommandSource); - - Element* FindEventTargetFrom(const VisibleSelection&) const; Element* FindEventTargetForClipboardEvent(EditorCommandSource) const; bool FindString(const String&, FindOptions); @@ -280,8 +269,6 @@ default_paragraph_separator_ = separator; } - static void TidyUpHTMLStructure(Document&); - EditingStyle* TypingStyle() const; void SetTypingStyle(EditingStyle*); void ClearTypingStyle(); @@ -293,6 +280,8 @@ DataTransferAccessPolicy, EditorCommandSource, PasteMode = kAllMimeTypes); + void RevealSelectionAfterEditingOperation( + const ScrollAlignment& = ScrollAlignment::kAlignCenterIfNeeded); private: Member<LocalFrame> frame_; @@ -324,8 +313,6 @@ void WriteSelectionToPasteboard(); - void RevealSelectionAfterEditingOperation( - const ScrollAlignment& = ScrollAlignment::kAlignCenterIfNeeded); void ChangeSelectionAfterCommand(const SelectionInDOMTree&, const SetSelectionOptions&);
diff --git a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp index 12f4f55..081d29b8 100644 --- a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp +++ b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
@@ -60,6 +60,7 @@ #include "core/editing/iterators/TextIterator.h" #include "core/editing/serializers/Serialization.h" #include "core/editing/spellcheck/SpellChecker.h" +#include "core/events/TextEvent.h" #include "core/frame/ContentSettingsClient.h" #include "core/frame/LocalFrame.h" #include "core/frame/LocalFrameView.h" @@ -850,12 +851,73 @@ return false; } +static bool DeleteWithDirection(LocalFrame& frame, + DeleteDirection direction, + TextGranularity granularity, + bool kill_ring, + bool is_typing_action) { + Editor& editor = frame.GetEditor(); + if (!editor.CanEdit()) + return false; + + EditingState editing_state; + if (frame.Selection() + .ComputeVisibleSelectionInDOMTreeDeprecated() + .IsRange()) { + if (is_typing_action) { + DCHECK(frame.GetDocument()); + TypingCommand::DeleteKeyPressed( + *frame.GetDocument(), + editor.CanSmartCopyOrDelete() ? TypingCommand::kSmartDelete : 0, + granularity); + editor.RevealSelectionAfterEditingOperation(); + } else { + if (kill_ring) + editor.AddToKillRing(editor.SelectedRange()); + editor.DeleteSelectionWithSmartDelete( + editor.CanSmartCopyOrDelete() ? DeleteMode::kSmart + : DeleteMode::kSimple, + DeletionInputTypeFromTextGranularity(direction, granularity)); + // Implicitly calls revealSelectionAfterEditingOperation(). + } + } else { + TypingCommand::Options options = 0; + if (editor.CanSmartCopyOrDelete()) + options |= TypingCommand::kSmartDelete; + if (kill_ring) + options |= TypingCommand::kKillRing; + switch (direction) { + case DeleteDirection::kForward: + DCHECK(frame.GetDocument()); + TypingCommand::ForwardDeleteKeyPressed( + *frame.GetDocument(), &editing_state, options, granularity); + if (editing_state.IsAborted()) + return false; + break; + case DeleteDirection::kBackward: + DCHECK(frame.GetDocument()); + TypingCommand::DeleteKeyPressed(*frame.GetDocument(), options, + granularity); + break; + } + editor.RevealSelectionAfterEditingOperation(); + } + + // FIXME: We should to move this down into deleteKeyPressed. + // clear the "start new kill ring sequence" setting, because it was set to + // true when the selection was updated by deleting the range + if (kill_ring) + editor.SetStartNewKillRingSequence(false); + + return true; +} + static bool ExecuteDeleteBackward(LocalFrame& frame, Event*, EditorCommandSource, const String&) { - frame.GetEditor().DeleteWithDirection( - DeleteDirection::kBackward, TextGranularity::kCharacter, false, true); + DeleteWithDirection(frame, DeleteDirection::kBackward, + TextGranularity::kCharacter, false, true); return true; } @@ -866,8 +928,8 @@ const String&) { DLOG(ERROR) << "DeleteBackwardByDecomposingPreviousCharacter is not " "implemented, doing DeleteBackward instead"; - frame.GetEditor().DeleteWithDirection( - DeleteDirection::kBackward, TextGranularity::kCharacter, false, true); + DeleteWithDirection(frame, DeleteDirection::kBackward, + TextGranularity::kCharacter, false, true); return true; } @@ -875,8 +937,8 @@ Event*, EditorCommandSource, const String&) { - frame.GetEditor().DeleteWithDirection( - DeleteDirection::kForward, TextGranularity::kCharacter, false, true); + DeleteWithDirection(frame, DeleteDirection::kForward, + TextGranularity::kCharacter, false, true); return true; } @@ -884,8 +946,8 @@ Event*, EditorCommandSource, const String&) { - frame.GetEditor().DeleteWithDirection( - DeleteDirection::kBackward, TextGranularity::kLineBoundary, true, false); + DeleteWithDirection(frame, DeleteDirection::kBackward, + TextGranularity::kLineBoundary, true, false); return true; } @@ -893,9 +955,8 @@ Event*, EditorCommandSource, const String&) { - frame.GetEditor().DeleteWithDirection(DeleteDirection::kBackward, - TextGranularity::kParagraphBoundary, - true, false); + DeleteWithDirection(frame, DeleteDirection::kBackward, + TextGranularity::kParagraphBoundary, true, false); return true; } @@ -906,8 +967,8 @@ // Despite its name, this command should delete the newline at the end of a // paragraph if you are at the end of a paragraph (like // DeleteToEndOfParagraph). - frame.GetEditor().DeleteWithDirection( - DeleteDirection::kForward, TextGranularity::kLineBoundary, true, false); + DeleteWithDirection(frame, DeleteDirection::kForward, + TextGranularity::kLineBoundary, true, false); return true; } @@ -917,9 +978,8 @@ const String&) { // Despite its name, this command should delete the newline at the end of // a paragraph if you are at the end of a paragraph. - frame.GetEditor().DeleteWithDirection(DeleteDirection::kForward, - TextGranularity::kParagraphBoundary, - true, false); + DeleteWithDirection(frame, DeleteDirection::kForward, + TextGranularity::kParagraphBoundary, true, false); return true; } @@ -950,8 +1010,8 @@ Event*, EditorCommandSource, const String&) { - frame.GetEditor().DeleteWithDirection(DeleteDirection::kBackward, - TextGranularity::kWord, true, false); + DeleteWithDirection(frame, DeleteDirection::kBackward, TextGranularity::kWord, + true, false); return true; } @@ -959,8 +1019,8 @@ Event*, EditorCommandSource, const String&) { - frame.GetEditor().DeleteWithDirection(DeleteDirection::kForward, - TextGranularity::kWord, true, false); + DeleteWithDirection(frame, DeleteDirection::kForward, TextGranularity::kWord, + true, false); return true; } @@ -1034,8 +1094,8 @@ EditingState editing_state; switch (source) { case kCommandFromMenuOrKeyBinding: - frame.GetEditor().DeleteWithDirection( - DeleteDirection::kForward, TextGranularity::kCharacter, false, true); + DeleteWithDirection(frame, DeleteDirection::kForward, + TextGranularity::kCharacter, false, true); return true; case kCommandFromDOM: // Doesn't scroll to make the selection visible, or modify the kill ring. @@ -1828,9 +1888,13 @@ static void PasteAsPlainTextWithPasteboard(LocalFrame& frame, Pasteboard* pasteboard, EditorCommandSource source) { - const String text = pasteboard->PlainText(); - frame.GetEditor().PasteAsPlainText( - text, CanSmartReplaceWithPasteboard(frame, pasteboard), source); + Element* const target = + frame.GetEditor().FindEventTargetForClipboardEvent(source); + if (!target) + return; + target->DispatchEvent(TextEvent::CreateForPlainTextPaste( + frame.DomWindow(), pasteboard->PlainText(), + CanSmartReplaceWithPasteboard(frame, pasteboard))); } static bool DispatchPasteEvent(LocalFrame& frame, @@ -1840,6 +1904,19 @@ EventTypeNames::paste, kDataTransferReadable, source, paste_mode); } +static void PasteAsFragment(LocalFrame& frame, + DocumentFragment* pasting_fragment, + bool smart_replace, + bool match_style, + EditorCommandSource source) { + Element* const target = + frame.GetEditor().FindEventTargetForClipboardEvent(source); + if (!target) + return; + target->DispatchEvent(TextEvent::CreateForFragmentPaste( + frame.DomWindow(), pasting_fragment, smart_replace, match_style)); +} + static void PasteWithPasteboard(LocalFrame& frame, Pasteboard* pasteboard, EditorCommandSource source) { @@ -1879,9 +1956,9 @@ if (!fragment) return; - frame.GetEditor().PasteAsFragment( - fragment, CanSmartReplaceWithPasteboard(frame, pasteboard), - chose_plain_text, source); + PasteAsFragment(frame, fragment, + CanSmartReplaceWithPasteboard(frame, pasteboard), + chose_plain_text, source); } static void Paste(LocalFrame& frame, EditorCommandSource source) { @@ -3264,10 +3341,10 @@ // support. DCHECK(GetFrame().GetDocument()->IsActive()); if (command_name == "DeleteToEndOfParagraph") { - if (!DeleteWithDirection(DeleteDirection::kForward, + if (!DeleteWithDirection(GetFrame(), DeleteDirection::kForward, TextGranularity::kParagraphBoundary, true, false)) { - DeleteWithDirection(DeleteDirection::kForward, + DeleteWithDirection(GetFrame(), DeleteDirection::kForward, TextGranularity::kCharacter, true, false); } return true;
diff --git a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp index 0623a44b..9c9c691 100644 --- a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp +++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp
@@ -501,8 +501,8 @@ current_document.UpdateStyleAndLayoutIgnorePendingStylesheets(); // Dispatch 'beforeinput'. - Element* const target = GetFrame().GetEditor().FindEventTargetFrom( - GetFrame().Selection().ComputeVisibleSelectionInDOMTree()); + Element* const target = FindEventTargetFrom( + GetFrame(), GetFrame().Selection().ComputeVisibleSelectionInDOMTree()); DataTransfer* const data_transfer = DataTransfer::Create( DataTransfer::DataTransferType::kInsertReplacementText,
diff --git a/third_party/WebKit/Source/core/editing/suggestion/TextSuggestionController.cpp b/third_party/WebKit/Source/core/editing/suggestion/TextSuggestionController.cpp index 1eab1ba2..edf0a43c 100644 --- a/third_party/WebKit/Source/core/editing/suggestion/TextSuggestionController.cpp +++ b/third_party/WebKit/Source/core/editing/suggestion/TextSuggestionController.cpp
@@ -602,8 +602,8 @@ GetFrame().GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets(); // Dispatch 'beforeinput'. - Element* const target = GetFrame().GetEditor().FindEventTargetFrom( - GetFrame().Selection().ComputeVisibleSelectionInDOMTree()); + Element* const target = FindEventTargetFrom( + GetFrame(), GetFrame().Selection().ComputeVisibleSelectionInDOMTree()); DataTransfer* const data_transfer = DataTransfer::Create( DataTransfer::DataTransferType::kInsertReplacementText,
diff --git a/third_party/WebKit/Source/core/exported/WebFormElementObserverImpl.cpp b/third_party/WebKit/Source/core/exported/WebFormElementObserverImpl.cpp index 98272d7..af5d1aa6 100644 --- a/third_party/WebKit/Source/core/exported/WebFormElementObserverImpl.cpp +++ b/third_party/WebKit/Source/core/exported/WebFormElementObserverImpl.cpp
@@ -47,7 +47,7 @@ { MutationObserverInit init; init.setAttributes(true); - init.setAttributeFilter({"action", "class", "style"}); + init.setAttributeFilter({"class", "style"}); mutation_observer_->observe(element_, init, ASSERT_NO_EXCEPTION); } for (Node* node = element_; node->parentElement(); @@ -83,16 +83,8 @@ return; } } else { + // Either "style" or "class" was modified. Check the computed style. HTMLElement& element = *ToHTMLElement(record->target()); - if (record->attributeName() == "action") { - // If the action was modified, we just assume that the form as - // submitted. - callback_->ElementWasHiddenOrRemoved(); - Disconnect(); - return; - } - // Otherwise, either "style" or "class" was modified. Check the - // computed style. CSSComputedStyleDeclaration* style = CSSComputedStyleDeclaration::Create(&element); if (style->GetPropertyValue(CSSPropertyDisplay) == "none") {
diff --git a/third_party/WebKit/Source/core/exported/WebSettingsImpl.cpp b/third_party/WebKit/Source/core/exported/WebSettingsImpl.cpp index cfca9024..5868c9d 100644 --- a/third_party/WebKit/Source/core/exported/WebSettingsImpl.cpp +++ b/third_party/WebKit/Source/core/exported/WebSettingsImpl.cpp
@@ -617,6 +617,10 @@ settings_->SetShouldRespectImageOrientation(enabled); } +void WebSettingsImpl::SetPictureInPictureEnabled(bool enabled) { + settings_->SetPictureInPictureEnabled(enabled); +} + void WebSettingsImpl::SetMediaPlaybackGestureWhitelistScope( const WebString& scope) { settings_->SetMediaPlaybackGestureWhitelistScope(scope);
diff --git a/third_party/WebKit/Source/core/exported/WebSettingsImpl.h b/third_party/WebKit/Source/core/exported/WebSettingsImpl.h index daf3b23..489edf46 100644 --- a/third_party/WebKit/Source/core/exported/WebSettingsImpl.h +++ b/third_party/WebKit/Source/core/exported/WebSettingsImpl.h
@@ -116,6 +116,7 @@ void SetMainFrameClipsContent(bool) override; void SetMainFrameResizesAreOrientationChanges(bool) override; void SetMaxTouchPoints(int) override; + void SetPictureInPictureEnabled(bool) override; void SetMediaPlaybackGestureWhitelistScope(const WebString&) override; void SetPresentationRequiresUserGesture(bool) override; void SetEmbeddedMediaExperienceEnabled(bool) override;
diff --git a/third_party/WebKit/Source/core/frame/Settings.json5 b/third_party/WebKit/Source/core/frame/Settings.json5 index cbb1ba8..8cdf163 100644 --- a/third_party/WebKit/Source/core/frame/Settings.json5 +++ b/third_party/WebKit/Source/core/frame/Settings.json5
@@ -216,6 +216,11 @@ }, { + name: "pictureInPictureEnabled", + initial: true, + }, + + { name: "mediaPlaybackGestureWhitelistScope", type: "String", },
diff --git a/third_party/WebKit/Source/core/html/media/HTMLAudioElement.h b/third_party/WebKit/Source/core/html/media/HTMLAudioElement.h index 03f8b60..21daf73f 100644 --- a/third_party/WebKit/Source/core/html/media/HTMLAudioElement.h +++ b/third_party/WebKit/Source/core/html/media/HTMLAudioElement.h
@@ -50,6 +50,7 @@ const WebString& remote_device_friendly_name) override {} void PictureInPictureStarted() override {} void PictureInPictureStopped() override {} + bool IsInPictureInPictureMode() override { return false; } void MediaRemotingStopped(WebLocalizedString::Name error_msg) override {} private:
diff --git a/third_party/WebKit/Source/core/html/media/HTMLMediaElement.cpp b/third_party/WebKit/Source/core/html/media/HTMLMediaElement.cpp index 7f76581..710aebe 100644 --- a/third_party/WebKit/Source/core/html/media/HTMLMediaElement.cpp +++ b/third_party/WebKit/Source/core/html/media/HTMLMediaElement.cpp
@@ -2582,6 +2582,11 @@ autoplay_policy_->StopAutoplayMutedWhenVisible(); } +void HTMLMediaElement::enterPictureInPicture() { + if (GetWebMediaPlayer()) + GetWebMediaPlayer()->EnterPictureInPicture(); +} + double HTMLMediaElement::EffectiveMediaVolume() const { if (muted_) return 0; @@ -2589,11 +2594,6 @@ return volume_; } -void HTMLMediaElement::pictureInPicture() { - if (GetWebMediaPlayer()) - GetWebMediaPlayer()->PictureInPicture(); -} - // The spec says to fire periodic timeupdate events (those sent while playing) // every "15 to 250ms", we choose the slowest frequency static const TimeDelta kMaxTimeupdateEventFrequency =
diff --git a/third_party/WebKit/Source/core/html/media/HTMLMediaElement.h b/third_party/WebKit/Source/core/html/media/HTMLMediaElement.h index ea36861..9a21c21b 100644 --- a/third_party/WebKit/Source/core/html/media/HTMLMediaElement.h +++ b/third_party/WebKit/Source/core/html/media/HTMLMediaElement.h
@@ -210,6 +210,7 @@ void setVolume(double, ExceptionState& = ASSERT_NO_EXCEPTION); bool muted() const; void setMuted(bool); + void enterPictureInPicture(); void TogglePlayState(); @@ -310,8 +311,6 @@ // Returns the "effective media volume" value as specified in the HTML5 spec. double EffectiveMediaVolume() const; - void pictureInPicture(); - // Predicates also used when dispatching wrapper creation (cf. // [SpecialWrapFor] IDL attribute usage.) virtual bool IsHTMLAudioElement() const { return false; }
diff --git a/third_party/WebKit/Source/core/html/media/HTMLMediaElementEventListenersTest.cpp b/third_party/WebKit/Source/core/html/media/HTMLMediaElementEventListenersTest.cpp index 2c7f140..24b521e 100644 --- a/third_party/WebKit/Source/core/html/media/HTMLMediaElementEventListenersTest.cpp +++ b/third_party/WebKit/Source/core/html/media/HTMLMediaElementEventListenersTest.cpp
@@ -16,6 +16,7 @@ #include "platform/testing/UnitTestHelpers.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/WebKit/public/platform/WebFullscreenVideoStatus.h" namespace blink { @@ -23,7 +24,8 @@ class MockWebMediaPlayer final : public EmptyWebMediaPlayer { public: - MOCK_METHOD1(SetIsEffectivelyFullscreen, void(bool)); + MOCK_METHOD1(SetIsEffectivelyFullscreen, + void(blink::WebFullscreenVideoStatus)); }; class MediaStubLocalFrameClient : public EmptyLocalFrameClient { @@ -159,12 +161,13 @@ Persistent<MediaCustomControlsFullscreenDetector> detector = FullscreenDetector(); - std::vector<bool> observed_results; + std::vector<blink::WebFullscreenVideoStatus> observed_results; ON_CALL(*WebMediaPlayer(), SetIsEffectivelyFullscreen(_)) - .WillByDefault(Invoke([&](bool is_fullscreen) { - observed_results.push_back(is_fullscreen); - })); + .WillByDefault( + Invoke([&](blink::WebFullscreenVideoStatus fullscreen_video_status) { + observed_results.push_back(fullscreen_video_status); + })); DestroyDocument(); @@ -174,9 +177,11 @@ EXPECT_FALSE(persistent_document->HasEventListeners()); // The timer should be cancelled when the ExecutionContext is destroyed. EXPECT_FALSE(IsCheckViewportIntersectionTimerActive(detector)); - // Should only notify the false value when ExecutionContext is destroyed. + // Should only notify the kNotEffectivelyFullscreen value when + // ExecutionContext is destroyed. EXPECT_EQ(1u, observed_results.size()); - EXPECT_FALSE(observed_results[0]); + EXPECT_EQ(blink::WebFullscreenVideoStatus::kNotEffectivelyFullscreen, + observed_results[0]); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/html/media/HTMLVideoElement.cpp b/third_party/WebKit/Source/core/html/media/HTMLVideoElement.cpp index 97cebe9..eb06420 100644 --- a/third_party/WebKit/Source/core/html/media/HTMLVideoElement.cpp +++ b/third_party/WebKit/Source/core/html/media/HTMLVideoElement.cpp
@@ -550,6 +550,11 @@ picture_in_picture_interstitial_->Hide(); } +bool HTMLVideoElement::IsInPictureInPictureMode() { + return picture_in_picture_interstitial_ && + picture_in_picture_interstitial_->IsVisible(); +} + WebMediaPlayer::DisplayType HTMLVideoElement::DisplayType() const { if (is_picture_in_picture_) return WebMediaPlayer::DisplayType::kPictureInPicture;
diff --git a/third_party/WebKit/Source/core/html/media/HTMLVideoElement.h b/third_party/WebKit/Source/core/html/media/HTMLVideoElement.h index 0e1dac1..635cbc3 100644 --- a/third_party/WebKit/Source/core/html/media/HTMLVideoElement.h +++ b/third_party/WebKit/Source/core/html/media/HTMLVideoElement.h
@@ -149,6 +149,7 @@ void MediaRemotingStarted(const WebString& remote_device_friendly_name) final; void PictureInPictureStarted() final; void PictureInPictureStopped() final; + bool IsInPictureInPictureMode() final; void MediaRemotingStopped(WebLocalizedString::Name error_msg) final; WebMediaPlayer::DisplayType DisplayType() const final;
diff --git a/third_party/WebKit/Source/core/html/media/MediaCustomControlsFullscreenDetector.cpp b/third_party/WebKit/Source/core/html/media/MediaCustomControlsFullscreenDetector.cpp index 7b78463..f4f89424 100644 --- a/third_party/WebKit/Source/core/html/media/MediaCustomControlsFullscreenDetector.cpp +++ b/third_party/WebKit/Source/core/html/media/MediaCustomControlsFullscreenDetector.cpp
@@ -8,7 +8,9 @@ #include "core/fullscreen/Fullscreen.h" #include "core/html/media/HTMLVideoElement.h" #include "core/layout/IntersectionGeometry.h" +#include "platform/runtime_enabled_features.h" #include "public/platform/TaskType.h" +#include "third_party/WebKit/public/platform/WebFullscreenVideoStatus.h" namespace blink { @@ -55,8 +57,10 @@ EventTypeNames::fullscreenchange, this, true); check_viewport_intersection_timer_.Stop(); - if (VideoElement().GetWebMediaPlayer()) - VideoElement().GetWebMediaPlayer()->SetIsEffectivelyFullscreen(false); + if (VideoElement().GetWebMediaPlayer()) { + VideoElement().GetWebMediaPlayer()->SetIsEffectivelyFullscreen( + blink::WebFullscreenVideoStatus::kNotEffectivelyFullscreen); + } } bool MediaCustomControlsFullscreenDetector::ComputeIsDominantVideoForTests( @@ -109,8 +113,10 @@ if (!VideoElement().isConnected() || !IsVideoOrParentFullscreen()) { check_viewport_intersection_timer_.Stop(); - if (VideoElement().GetWebMediaPlayer()) - VideoElement().GetWebMediaPlayer()->SetIsEffectivelyFullscreen(false); + if (VideoElement().GetWebMediaPlayer()) { + VideoElement().GetWebMediaPlayer()->SetIsEffectivelyFullscreen( + blink::WebFullscreenVideoStatus::kNotEffectivelyFullscreen); + } return; } @@ -122,8 +128,8 @@ void MediaCustomControlsFullscreenDetector::ContextDestroyed() { // This method is called by HTMLVideoElement when it observes context destroy. // The reason is that when HTMLMediaElement observes context destroy, it will - // destroy webMediaPlayer() thus the final setIsEffectivelyFullscreen(false) - // is not called. + // destroy webMediaPlayer() thus the final + // setIsEffectivelyFullscreen(kNotEffectivelyFullscreen) is not called. Detach(); } @@ -138,8 +144,27 @@ geometry.TargetIntRect(), geometry.RootIntRect(), geometry.IntersectionIntRect()); - if (VideoElement().GetWebMediaPlayer()) - VideoElement().GetWebMediaPlayer()->SetIsEffectivelyFullscreen(is_dominant); + if (!VideoElement().GetWebMediaPlayer()) + return; + + if (!is_dominant) { + VideoElement().GetWebMediaPlayer()->SetIsEffectivelyFullscreen( + blink::WebFullscreenVideoStatus::kNotEffectivelyFullscreen); + return; + } + + // Picture-in-Picture can be disabled by the website when the API is enabled. + bool picture_in_picture_allowed = + !RuntimeEnabledFeatures::PictureInPictureEnabled() && + !VideoElement().FastHasAttribute(HTMLNames::disablepictureinpictureAttr); + if (picture_in_picture_allowed) { + VideoElement().GetWebMediaPlayer()->SetIsEffectivelyFullscreen( + blink::WebFullscreenVideoStatus::kFullscreenAndPictureInPictureEnabled); + } else { + VideoElement().GetWebMediaPlayer()->SetIsEffectivelyFullscreen( + blink::WebFullscreenVideoStatus:: + kFullscreenAndPictureInPictureDisabled); + } } bool MediaCustomControlsFullscreenDetector::IsVideoOrParentFullscreen() {
diff --git a/third_party/WebKit/Source/core/intersection_observer/IntersectionObserver.cpp b/third_party/WebKit/Source/core/intersection_observer/IntersectionObserver.cpp index 170be78..56e2975 100644 --- a/third_party/WebKit/Source/core/intersection_observer/IntersectionObserver.cpp +++ b/third_party/WebKit/Source/core/intersection_observer/IntersectionObserver.cpp
@@ -273,10 +273,19 @@ if (!target || !target->IntersectionObserverData()) return; - if (IntersectionObservation* observation = - target->IntersectionObserverData()->GetObservationFor(*this)) { - observation->Disconnect(); - observations_.erase(observation); + IntersectionObservation* observation = + target->IntersectionObserverData()->GetObservationFor(*this); + if (!observation) + return; + + observation->Disconnect(); + observations_.erase(observation); + + for (size_t i = 0; i < entries_.size(); ++i) { + if (entries_[i]->target() == target) { + entries_.EraseAt(i); + --i; + } } }
diff --git a/third_party/WebKit/Source/core/layout/LayoutInline.cpp b/third_party/WebKit/Source/core/layout/LayoutInline.cpp index 33d149e..c184cb8 100644 --- a/third_party/WebKit/Source/core/layout/LayoutInline.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutInline.cpp
@@ -1004,12 +1004,8 @@ LayoutRect result; auto children = NGInlineFragmentTraversal::SelfFragmentsOf(*box_fragment, this); - for (const auto& child : children) { - NGPhysicalOffset left_top = - child.fragment->Offset() + child.offset_to_container_box; - result.Unite(LayoutRect(LayoutPoint(left_top.left, left_top.top), - child.fragment->Size().ToLayoutSize())); - } + for (const auto& child : children) + result.Unite(child.RectInContainerBox().ToLayoutRect()); return result; }
diff --git a/third_party/WebKit/Source/core/layout/LayoutInlineTest.cpp b/third_party/WebKit/Source/core/layout/LayoutInlineTest.cpp index e1a0942f..27f71a9 100644 --- a/third_party/WebKit/Source/core/layout/LayoutInlineTest.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutInlineTest.cpp
@@ -51,10 +51,8 @@ EXPECT_EQ( LayoutRect(LayoutPoint(745, 0), LayoutSize(39, 26)), ToLayoutInline(GetLayoutObjectByElementId("rtl1"))->LinesBoundingBox()); - // TODO(layout-dev): |kRtl2Width| should be 143 even if |LayoutNGEnabled()|. - const int kRtl2Width = LayoutNGEnabled() ? 260 : 143; EXPECT_EQ( - LayoutRect(LayoutPoint(641, 0), LayoutSize(kRtl2Width, 13)), + LayoutRect(LayoutPoint(641, 0), LayoutSize(143, 13)), ToLayoutInline(GetLayoutObjectByElementId("rtl2"))->LinesBoundingBox()); EXPECT_EQ(LayoutRect(LayoutPoint(0, 0), LayoutSize(26, 39)), ToLayoutInline(GetLayoutObjectByElementId("vertical"))
diff --git a/third_party/WebKit/Source/core/loader/EmptyClients.cpp b/third_party/WebKit/Source/core/loader/EmptyClients.cpp index 99eaaef..32b83ddb 100644 --- a/third_party/WebKit/Source/core/loader/EmptyClients.cpp +++ b/third_party/WebKit/Source/core/loader/EmptyClients.cpp
@@ -36,6 +36,7 @@ #include "core/html/forms/FileChooser.h" #include "core/html/forms/HTMLFormElement.h" #include "core/loader/DocumentLoader.h" +#include "platform/scheduler/child/worker_scheduler_proxy.h" #include "platform/wtf/PtrUtil.h" #include "public/platform/Platform.h" #include "public/platform/WebApplicationCacheHost.h"
diff --git a/third_party/WebKit/Source/core/page/DragController.cpp b/third_party/WebKit/Source/core/page/DragController.cpp index a699e80..9295f65 100644 --- a/third_party/WebKit/Source/core/page/DragController.cpp +++ b/third_party/WebKit/Source/core/page/DragController.cpp
@@ -527,8 +527,9 @@ const PositionWithAffinity& caret_position = page_->GetDragCaret().CaretPosition(); DCHECK(caret_position.IsConnected()) << caret_position; - Element* target = - inner_frame->GetEditor().FindEventTargetFrom(CreateVisibleSelection( + Element* target = FindEventTargetFrom( + *inner_frame, + CreateVisibleSelection( SelectionInDOMTree::Builder().Collapse(caret_position).Build())); return target->DispatchEvent( TextEvent::CreateForDrop(inner_frame->DomWindow(), text)); @@ -647,7 +648,8 @@ : InsertMode::kSimple; if (!inner_frame->GetEditor().DeleteSelectionAfterDraggingWithEvents( - inner_frame->GetEditor().FindEventTargetFrom( + FindEventTargetFrom( + *inner_frame, inner_frame->Selection() .ComputeVisibleSelectionInDOMTreeDeprecated()), delete_mode, drag_caret.Base()))
diff --git a/third_party/WebKit/Source/core/paint/BoxClipperBase.cpp b/third_party/WebKit/Source/core/paint/BoxClipperBase.cpp index a85a8e01..e777bcd 100644 --- a/third_party/WebKit/Source/core/paint/BoxClipperBase.cpp +++ b/third_party/WebKit/Source/core/paint/BoxClipperBase.cpp
@@ -24,11 +24,12 @@ if (!fragment) return; const auto* properties = fragment->PaintProperties(); - if (!properties || !properties->OverflowClip()) + if (!properties || !properties->OverflowOrInnerBorderRadiusClip()) return; scoped_clip_property_.emplace(paint_info.context.GetPaintController(), - properties->OverflowClip(), client, + properties->OverflowOrInnerBorderRadiusClip(), + client, paint_info.DisplayItemTypeForClipping()); }
diff --git a/third_party/WebKit/Source/core/paint/FindPropertiesNeedingUpdate.h b/third_party/WebKit/Source/core/paint/FindPropertiesNeedingUpdate.h index 73e6c2c..fa0a5ef 100644 --- a/third_party/WebKit/Source/core/paint/FindPropertiesNeedingUpdate.h +++ b/third_party/WebKit/Source/core/paint/FindPropertiesNeedingUpdate.h
@@ -186,8 +186,8 @@ DCHECK_OBJECT_PROPERTY_EQ(object_, original_properties_->InnerBorderRadiusClip(), object_properties->InnerBorderRadiusClip()); - DCHECK_OBJECT_PROPERTY_EQ(object_, original_properties_->OverflowClip(), - object_properties->OverflowClip()); + DCHECK_OBJECT_PROPERTY_EQ(object_, OverflowClip(*original_properties_), + OverflowClip(*object_properties)); DCHECK_OBJECT_PROPERTY_EQ(object_, original_properties_->Perspective(), object_properties->Perspective()); DCHECK_OBJECT_PROPERTY_EQ(
diff --git a/third_party/WebKit/Source/core/paint/FragmentData.cpp b/third_party/WebKit/Source/core/paint/FragmentData.cpp index 8829ee646..6e48144 100644 --- a/third_party/WebKit/Source/core/paint/FragmentData.cpp +++ b/third_party/WebKit/Source/core/paint/FragmentData.cpp
@@ -71,10 +71,8 @@ const ClipPaintPropertyNode* FragmentData::PostOverflowClip() const { if (const auto* properties = PaintProperties()) { - if (properties->OverflowClip()) - return properties->OverflowClip(); - if (properties->InnerBorderRadiusClip()) - return properties->InnerBorderRadiusClip(); + if (const auto* clip = properties->OverflowOrInnerBorderRadiusClip()) + return clip; } return LocalBorderBoxProperties().Clip(); }
diff --git a/third_party/WebKit/Source/core/paint/ObjectPaintProperties.h b/third_party/WebKit/Source/core/paint/ObjectPaintProperties.h index 1b0015b..ee603d5 100644 --- a/third_party/WebKit/Source/core/paint/ObjectPaintProperties.h +++ b/third_party/WebKit/Source/core/paint/ObjectPaintProperties.h
@@ -140,8 +140,9 @@ const ClipPaintPropertyNode* InnerBorderRadiusClip() const { return inner_border_radius_clip_.get(); } - const ClipPaintPropertyNode* OverflowClip() const { - return overflow_clip_.get(); + const ClipPaintPropertyNode* OverflowOrInnerBorderRadiusClip() const { + return overflow_clip_ ? overflow_clip_.get() + : inner_border_radius_clip_.get(); } // The following clear* functions return true if the property tree structure @@ -310,6 +311,9 @@ #endif private: + friend const ClipPaintPropertyNode* OverflowClip( + const ObjectPaintProperties&); + ObjectPaintProperties() = default; // Return true if the property tree structure changes (an existing node was @@ -363,6 +367,15 @@ DISALLOW_COPY_AND_ASSIGN(ObjectPaintProperties); }; +// ObjectPaintProperties doesn't provide public OverflowClip() method to avoid +// misuse because in most cases we want OverflowOrInnerBorderRadiusClip(). +// This function returns the actual OverflowClip for actual requirements of +// mere OverflowClip, e.g. PaintPropertyTreePrinter, tests etc. +inline const ClipPaintPropertyNode* OverflowClip( + const ObjectPaintProperties& properties) { + return properties.overflow_clip_.get(); +} + } // namespace blink #endif // ObjectPaintProperties_h
diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.cpp b/third_party/WebKit/Source/core/paint/PaintLayer.cpp index ae76f9f..4cd43ee 100644 --- a/third_party/WebKit/Source/core/paint/PaintLayer.cpp +++ b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
@@ -161,7 +161,6 @@ previous_paint_phase_descendant_block_backgrounds_was_empty_(false), has_descendant_with_clip_path_(false), has_non_isolated_descendant_with_blend_mode_(false), - has_ancestor_with_clip_path_(false), self_painting_status_changed_(false), filter_on_effect_node_dirty_(false), layout_object_(layout_object), @@ -1086,11 +1085,9 @@ } void PaintLayer::UpdateAncestorDependentCompositingInputs( - const AncestorDependentCompositingInputs& compositing_inputs, - bool has_ancestor_with_clip_path) { + const AncestorDependentCompositingInputs& compositing_inputs) { ancestor_dependent_compositing_inputs_ = std::make_unique<AncestorDependentCompositingInputs>(compositing_inputs); - has_ancestor_with_clip_path_ = has_ancestor_with_clip_path; needs_ancestor_dependent_compositing_inputs_update_ = false; }
diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.h b/third_party/WebKit/Source/core/paint/PaintLayer.h index 73b09a07..760aaa23 100644 --- a/third_party/WebKit/Source/core/paint/PaintLayer.h +++ b/third_party/WebKit/Source/core/paint/PaintLayer.h
@@ -702,6 +702,8 @@ : opacity_ancestor(nullptr), transform_ancestor(nullptr), filter_ancestor(nullptr), + clip_path_ancestor(nullptr), + mask_ancestor(nullptr), ancestor_scrolling_layer(nullptr), nearest_fixed_position_layer(nullptr), scroll_parent(nullptr), @@ -711,6 +713,8 @@ const PaintLayer* opacity_ancestor; const PaintLayer* transform_ancestor; const PaintLayer* filter_ancestor; + const PaintLayer* clip_path_ancestor; + const PaintLayer* mask_ancestor; // The fist ancestor which can scroll. This is a subset of the // ancestorOverflowLayer chain where the scrolling layer is visible and @@ -750,8 +754,7 @@ ancestor_overflow_layer_ = ancestor_overflow_layer; } void UpdateAncestorDependentCompositingInputs( - const AncestorDependentCompositingInputs&, - bool has_ancestor_with_clip_path); + const AncestorDependentCompositingInputs&); void DidUpdateCompositingInputs(); const IntRect& ClippedAbsoluteBoundingBox() const { @@ -815,9 +818,17 @@ ? ancestor_dependent_compositing_inputs_->clip_parent : nullptr; } - bool HasAncestorWithClipPath() const { + const PaintLayer* ClipPathAncestor() const { DCHECK(!needs_ancestor_dependent_compositing_inputs_update_); - return has_ancestor_with_clip_path_; + return ancestor_dependent_compositing_inputs_ + ? ancestor_dependent_compositing_inputs_->clip_path_ancestor + : nullptr; + } + const PaintLayer* MaskAncestor() const { + DCHECK(!needs_ancestor_dependent_compositing_inputs_update_); + return ancestor_dependent_compositing_inputs_ + ? ancestor_dependent_compositing_inputs_->mask_ancestor + : nullptr; } bool HasDescendantWithClipPath() const { DCHECK(!needs_descendant_dependent_flags_update_); @@ -1245,7 +1256,6 @@ // inputs. unsigned has_descendant_with_clip_path_ : 1; unsigned has_non_isolated_descendant_with_blend_mode_ : 1; - unsigned has_ancestor_with_clip_path_ : 1; unsigned self_painting_status_changed_ : 1;
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerClipper.cpp b/third_party/WebKit/Source/core/paint/PaintLayerClipper.cpp index 17cd30a..0f84af6 100644 --- a/third_party/WebKit/Source/core/paint/PaintLayerClipper.cpp +++ b/third_party/WebKit/Source/core/paint/PaintLayerClipper.cpp
@@ -567,20 +567,10 @@ ancestor_css_clip); destination_property_tree_state.SetClip(ancestor_css_clip->Parent()); } - } else { - const auto* ancestor_overflow_clip = ancestor_properties->OverflowClip(); - if (ancestor_overflow_clip) { - if (const auto* ancestor_rounded_clip = - ancestor_properties->InnerBorderRadiusClip()) { - DCHECK_EQ(destination_property_tree_state.Clip(), - ancestor_rounded_clip->Parent()); - DCHECK_EQ(ancestor_rounded_clip, ancestor_overflow_clip->Parent()); - } else { - DCHECK_EQ(destination_property_tree_state.Clip(), - ancestor_overflow_clip->Parent()); - } - destination_property_tree_state.SetClip(ancestor_overflow_clip); - } + } else if (const auto* clip = + ancestor_properties->OverflowOrInnerBorderRadiusClip()) { + DCHECK_EQ(destination_property_tree_state.Clip(), clip->Parent()); + destination_property_tree_state.SetClip(clip); } }
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp index cd8e82e..f91c7f6 100644 --- a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp +++ b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
@@ -2208,7 +2208,7 @@ } if (layer->GetLayoutObject().HasClip() || - layer->HasDescendantWithClipPath() || layer->HasAncestorWithClipPath()) { + layer->HasDescendantWithClipPath() || !!layer->ClipPathAncestor()) { non_composited_main_thread_scrolling_reasons_ |= MainThreadScrollingReason::kHasClipRelatedProperty; needs_composited_scrolling = false;
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp index ccc0b80c..1f6da5ea 100644 --- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp +++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
@@ -1150,15 +1150,25 @@ clip_rect_excluding_overlay_scrollbars = clip_rect; } - OnUpdateClip(properties_->UpdateOverflowClip( - context_.current.clip, context_.current.transform, clip_rect, - &clip_rect_excluding_overlay_scrollbars)); + bool should_create_overflow_clip = true; + if (auto* border_radius_clip = properties_->InnerBorderRadiusClip()) { + if (border_radius_clip->ClipRect().Rect() == clip_rect.Rect() && + clip_rect == clip_rect_excluding_overlay_scrollbars) + should_create_overflow_clip = false; + } + if (should_create_overflow_clip) { + OnUpdateClip(properties_->UpdateOverflowClip( + context_.current.clip, context_.current.transform, clip_rect, + &clip_rect_excluding_overlay_scrollbars)); + } else { + OnClearClip(properties_->ClearOverflowClip()); + } } else { OnClearClip(properties_->ClearOverflowClip()); } } - if (auto* overflow_clip = properties_->OverflowClip()) + if (auto* overflow_clip = OverflowClip(*properties_)) context_.current.clip = overflow_clip; }
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp index e27d3d3f..2443012 100644 --- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp +++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp
@@ -53,10 +53,8 @@ if (!frame_view) frame_view = GetDocument().View(); if (RuntimeEnabledFeatures::RootLayerScrollingEnabled()) { - return frame_view->GetLayoutView() - ->FirstFragment() - .PaintProperties() - ->OverflowClip(); + return OverflowClip( + *frame_view->GetLayoutView()->FirstFragment().PaintProperties()); } return frame_view->ContentClip(); } @@ -153,10 +151,10 @@ const ObjectPaintProperties* target1_properties = target1->GetLayoutObject()->FirstFragment().PaintProperties(); EXPECT_EQ(FloatRoundedRect(200, 150, 100, 100), - target1_properties->OverflowClip()->ClipRect()); + OverflowClip(*target1_properties)->ClipRect()); // Likewise, it inherits clip from the viewport, skipping overflow clip of the // scroller. - EXPECT_EQ(FrameContentClip(), target1_properties->OverflowClip()->Parent()); + EXPECT_EQ(FrameContentClip(), OverflowClip(*target1_properties)->Parent()); // target1 should not have its own scroll node and instead should inherit // positionedScroll's. const ObjectPaintProperties* positioned_scroll_properties = @@ -181,9 +179,9 @@ const ObjectPaintProperties* scroller_properties = scroller->GetLayoutObject()->FirstFragment().PaintProperties(); EXPECT_EQ(FloatRoundedRect(200, 150, 100, 100), - target2_properties->OverflowClip()->ClipRect()); - EXPECT_EQ(scroller_properties->OverflowClip(), - target2_properties->OverflowClip()->Parent()); + OverflowClip(*target2_properties)->ClipRect()); + EXPECT_EQ(OverflowClip(*scroller_properties), + OverflowClip(*target2_properties)->Parent()); // target2 should not have it's own scroll node and instead should inherit // transformedScroll's. const ObjectPaintProperties* transformed_scroll_properties = @@ -218,7 +216,7 @@ EXPECT_EQ(FrameScrollTranslation(), scroller_properties->PaintOffsetTranslation()->Parent()); EXPECT_EQ(scroller_properties->PaintOffsetTranslation(), - scroller_properties->OverflowClip()->LocalTransformSpace()); + OverflowClip(*scroller_properties)->LocalTransformSpace()); const auto* scroll = scroller_properties->ScrollTranslation()->ScrollNode(); EXPECT_EQ(FrameScroll(), scroll->Parent()); EXPECT_EQ(IntRect(0, 0, 413, 317), scroll->ContainerRect()); @@ -229,8 +227,8 @@ ->Matrix() .To2DTranslation()); EXPECT_EQ(FloatRoundedRect(0, 0, 413, 317), - scroller_properties->OverflowClip()->ClipRect()); - EXPECT_EQ(FrameContentClip(), scroller_properties->OverflowClip()->Parent()); + OverflowClip(*scroller_properties)->ClipRect()); + EXPECT_EQ(FrameContentClip(), OverflowClip(*scroller_properties)->Parent()); CHECK_EXACT_VISUAL_RECT(LayoutRect(120, 340, 413, 317), scroller->GetLayoutObject(), frame_view->GetLayoutView()); @@ -245,11 +243,11 @@ EXPECT_EQ(scroller_properties->ScrollTranslation(), rel_pos_properties->PaintOffsetTranslation()->Parent()); EXPECT_EQ(rel_pos_properties->Transform(), - rel_pos_properties->OverflowClip()->LocalTransformSpace()); + OverflowClip(*rel_pos_properties)->LocalTransformSpace()); EXPECT_EQ(FloatRoundedRect(0, 0, 100, 200), - rel_pos_properties->OverflowClip()->ClipRect()); - EXPECT_EQ(scroller_properties->OverflowClip(), - rel_pos_properties->OverflowClip()->Parent()); + OverflowClip(*rel_pos_properties)->ClipRect()); + EXPECT_EQ(OverflowClip(*scroller_properties), + OverflowClip(*rel_pos_properties)->Parent()); CHECK_EXACT_VISUAL_RECT(LayoutRect(), rel_pos->GetLayoutObject(), frame_view->GetLayoutView()); @@ -263,10 +261,10 @@ EXPECT_EQ(FrameScrollTranslation(), abs_pos_properties->PaintOffsetTranslation()->Parent()); EXPECT_EQ(abs_pos_properties->Transform(), - abs_pos_properties->OverflowClip()->LocalTransformSpace()); + OverflowClip(*abs_pos_properties)->LocalTransformSpace()); EXPECT_EQ(FloatRoundedRect(0, 0, 300, 400), - abs_pos_properties->OverflowClip()->ClipRect()); - EXPECT_EQ(FrameContentClip(), abs_pos_properties->OverflowClip()->Parent()); + OverflowClip(*abs_pos_properties)->ClipRect()); + EXPECT_EQ(FrameContentClip(), OverflowClip(*abs_pos_properties)->Parent()); CHECK_EXACT_VISUAL_RECT(LayoutRect(123, 456, 300, 400), abs_pos->GetLayoutObject(), frame_view->GetLayoutView()); @@ -283,7 +281,7 @@ CHECK(GetDocument().GetPage()->GetScrollbarTheme().UsesOverlayScrollbars()); const auto* properties = PaintPropertiesForElement("scroller"); - const auto* overflow_clip = properties->OverflowClip(); + const auto* overflow_clip = OverflowClip(*properties); EXPECT_EQ(FrameContentClip(), overflow_clip->Parent()); EXPECT_EQ(properties->PaintOffsetTranslation(), @@ -311,7 +309,7 @@ CHECK(GetDocument().GetPage()->GetScrollbarTheme().UsesOverlayScrollbars()); const auto* properties = PaintPropertiesForElement("scroller"); - const auto* overflow_clip = properties->OverflowClip(); + const auto* overflow_clip = OverflowClip(*properties); EXPECT_EQ(FrameContentClip(), overflow_clip->Parent()); EXPECT_EQ(properties->PaintOffsetTranslation(), @@ -336,6 +334,46 @@ } } +TEST_P(PaintPropertyTreeBuilderTest, + OverflowScrollExcludeScrollbarsWithBorderRadius) { + SetBodyInnerHTML(R"HTML( + <div id='scroller' + style='width: 100px; height: 100px; overflow: scroll; + border: 10px solid blue; border-radius: 20px'> + <div style='width: 400px; height: 400px'></div> + </div> + )HTML"); + CHECK(GetDocument().GetPage()->GetScrollbarTheme().UsesOverlayScrollbars()); + + const auto* properties = PaintPropertiesForElement("scroller"); + // We create both InnerBorderRadiusClip and OverflowClip if there are overlay + // scrollbars. + const auto* inner_border_radius_clip = properties->InnerBorderRadiusClip(); + ASSERT_NE(nullptr, inner_border_radius_clip); + const auto* overflow_clip = OverflowClip(*properties); + ASSERT_NE(nullptr, overflow_clip); + + EXPECT_EQ(FrameContentClip(), inner_border_radius_clip->Parent()); + EXPECT_EQ( + FloatRoundedRect(FloatRect(10, 10, 100, 100), FloatSize(10, 10), + FloatSize(10, 10), FloatSize(10, 10), FloatSize(10, 10)), + inner_border_radius_clip->ClipRect()); + + EXPECT_EQ(inner_border_radius_clip, overflow_clip->Parent()); + EXPECT_EQ(properties->PaintOffsetTranslation(), + overflow_clip->LocalTransformSpace()); + EXPECT_EQ(FloatRoundedRect(10, 10, 100, 100), overflow_clip->ClipRect()); + + PaintLayer* paint_layer = + ToLayoutBoxModelObject(GetLayoutObjectByElementId("scroller"))->Layer(); + EXPECT_TRUE(paint_layer->GetScrollableArea() + ->VerticalScrollbar() + ->IsOverlayScrollbar()); + + EXPECT_EQ(FloatRoundedRect(10, 10, 93, 93), + overflow_clip->ClipRectExcludingOverlayScrollbars()); +} + TEST_P(PaintPropertyTreeBuilderTest, OverflowScrollVerticalRL) { SetBodyInnerHTML(R"HTML( <style>::-webkit-scrollbar {width: 15px; height: 15px}</style> @@ -347,7 +385,7 @@ )HTML"); const auto* properties = PaintPropertiesForElement("scroller"); - const auto* overflow_clip = properties->OverflowClip(); + const auto* overflow_clip = OverflowClip(*properties); const auto* scroll_translation = properties->ScrollTranslation(); const auto* scroll = properties->Scroll(); @@ -378,7 +416,7 @@ )HTML"); const auto* properties = PaintPropertiesForElement("scroller"); - const auto* overflow_clip = properties->OverflowClip(); + const auto* overflow_clip = OverflowClip(*properties); const auto* scroll_translation = properties->ScrollTranslation(); const auto* scroll = properties->Scroll(); @@ -878,7 +916,7 @@ </svg> )HTML"); - const auto* svg_clip = PaintPropertiesForElement("svgRoot")->OverflowClip(); + const auto* svg_clip = OverflowClip(*PaintPropertiesForElement("svgRoot")); const auto* group_with_opacity_properties = PaintPropertiesForElement("groupWithOpacity"); @@ -944,7 +982,7 @@ const auto* rect_with_opacity_properties = PaintPropertiesForElement("rectWithOpacity"); EXPECT_EQ(0.4f, rect_with_opacity_properties->Effect()->Opacity()); - EXPECT_EQ(svg_root_with_opacity_properties->OverflowClip(), + EXPECT_EQ(OverflowClip(*svg_root_with_opacity_properties), rect_with_opacity_properties->Effect()->OutputClip()); EXPECT_EQ(svg_root_with_opacity_properties->Effect(), rect_with_opacity_properties->Effect()->Parent()); @@ -974,7 +1012,7 @@ const auto* foreign_object_with_opacity_properties = PaintPropertiesForElement("foreignObjectWithOpacity"); EXPECT_EQ(0.4f, foreign_object_with_opacity_properties->Effect()->Opacity()); - EXPECT_EQ(svg_root_with_opacity_properties->OverflowClip(), + EXPECT_EQ(OverflowClip(*svg_root_with_opacity_properties), foreign_object_with_opacity_properties->Effect()->OutputClip()); EXPECT_EQ(svg_root_with_opacity_properties->Effect(), foreign_object_with_opacity_properties->Effect()->Parent()); @@ -1280,12 +1318,12 @@ const auto* svg_properties = PaintPropertiesForElement("svg"); ASSERT_NE(nullptr, svg_properties); const auto* parent_transform = svg_properties->PaintOffsetTranslation(); - const auto* parent_clip = svg_properties->OverflowClip(); + const auto* parent_clip = svg_properties->InnerBorderRadiusClip(); // overflow: hidden and zero offset: OverflowClip only. const auto* properties1 = PaintPropertiesForElement("container1"); ASSERT_NE(nullptr, properties1); - const auto* clip = properties1->OverflowClip(); + const auto* clip = OverflowClip(*properties1); const auto* transform = properties1->Transform(); ASSERT_NE(nullptr, clip); EXPECT_EQ(nullptr, transform); @@ -1297,7 +1335,7 @@ // both Transform and OverflowClip. const auto* properties2 = PaintPropertiesForElement("container2"); ASSERT_NE(nullptr, properties2); - clip = properties2->OverflowClip(); + clip = OverflowClip(*properties2); transform = properties2->Transform(); ASSERT_NE(nullptr, clip); ASSERT_NE(nullptr, transform); @@ -1315,7 +1353,7 @@ // overflow: visible and non-zero offset: Transform only. const auto* properties4 = PaintPropertiesForElement("container4"); ASSERT_NE(nullptr, properties4); - clip = properties4->OverflowClip(); + clip = OverflowClip(*properties4); transform = properties4->Transform(); EXPECT_EQ(nullptr, clip); ASSERT_NE(nullptr, transform); @@ -1341,11 +1379,11 @@ const auto* svg_properties = PaintPropertiesForElement("svg"); ASSERT_NE(nullptr, svg_properties); const auto* parent_transform = svg_properties->PaintOffsetTranslation(); - const auto* parent_clip = svg_properties->OverflowClip(); + const auto* parent_clip = OverflowClip(*svg_properties); const auto* properties1 = PaintPropertiesForElement("object1"); ASSERT_NE(nullptr, properties1); - const auto* clip = properties1->OverflowClip(); + const auto* clip = OverflowClip(*properties1); ASSERT_NE(nullptr, clip); EXPECT_EQ(parent_clip, clip->Parent()); EXPECT_EQ(FloatRect(10, 20, 30, 40), clip->ClipRect().Rect()); @@ -1442,10 +1480,10 @@ // content). EXPECT_TRUE(!FrameScrollTranslation()); EXPECT_EQ(FramePreTranslation(), - button_properties->OverflowClip()->LocalTransformSpace()); + OverflowClip(*button_properties)->LocalTransformSpace()); EXPECT_EQ(FloatRoundedRect(5, 5, 335, 113), - button_properties->OverflowClip()->ClipRect()); - EXPECT_EQ(FrameContentClip(), button_properties->OverflowClip()->Parent()); + OverflowClip(*button_properties)->ClipRect()); + EXPECT_EQ(FrameContentClip(), OverflowClip(*button_properties)->Parent()); CHECK_EXACT_VISUAL_RECT(LayoutRect(0, 0, 345, 123), &button, GetDocument().View()->GetLayoutView()); } @@ -1472,7 +1510,7 @@ // content). EXPECT_TRUE(!FrameScrollTranslation()); EXPECT_EQ(FloatRoundedRect(2, 2, 341, 119), - button_properties->OverflowClip()->ClipRect()); + OverflowClip(*button_properties)->ClipRect()); CHECK_EXACT_VISUAL_RECT(LayoutRect(8, 8, 345, 123), &button, GetDocument().View()->GetLayoutView()); } @@ -1491,7 +1529,7 @@ border-left: 60px solid; width: 500px; height: 400px; - overflow: scroll; + overflow: hidden; } </style> <div id='div'></div> @@ -1503,15 +1541,7 @@ // No scroll translation because the document does not scroll (not enough // content). EXPECT_TRUE(!FrameScrollTranslation()); - EXPECT_EQ(FramePreTranslation(), - div_properties->OverflowClip()->LocalTransformSpace()); - // The overflow clip rect includes only the padding box. - // padding box = border box(500+60+50, 400+45+55) - border outset(60+50, - // 45+55) - scrollbars(15, 15) - EXPECT_EQ(FloatRoundedRect(60, 45, 500, 400), - div_properties->OverflowClip()->ClipRect()); - const ClipPaintPropertyNode* border_radius_clip = - div_properties->OverflowClip()->Parent(); + const auto* border_radius_clip = div_properties->InnerBorderRadiusClip(); EXPECT_EQ(FramePreTranslation(), border_radius_clip->LocalTransformSpace()); // The border radius clip is the area enclosed by inner border edge, including // the scrollbars. As the border-radius is specified in outer radius, the @@ -1533,6 +1563,8 @@ EXPECT_EQ(FrameContentClip(), border_radius_clip->Parent()); CHECK_EXACT_VISUAL_RECT(LayoutRect(0, 0, 610, 500), &div, GetDocument().View()->GetLayoutView()); + // No OverflowClip because InnerBorderRadiusClip already serves the purpose. + EXPECT_EQ(nullptr, OverflowClip(*div_properties)); } TEST_P(PaintPropertyTreeBuilderTest, TransformNodesAcrossSubframes) { @@ -1705,7 +1737,7 @@ scroller->FirstFragment().PaintProperties(); LayoutObject* child = GetLayoutObjectByElementId("child"); - EXPECT_EQ(scroller_properties->OverflowClip(), + EXPECT_EQ(OverflowClip(*scroller_properties), child->FirstFragment().LocalBorderBoxProperties().Clip()); EXPECT_EQ(scroller_properties->ScrollTranslation(), child->FirstFragment().LocalBorderBoxProperties().Transform()); @@ -2002,7 +2034,7 @@ LayoutObject& overflow = *GetLayoutObjectByElementId("overflow"); const ObjectPaintProperties* overflow_properties = overflow.FirstFragment().PaintProperties(); - EXPECT_EQ(FrameContentClip(), overflow_properties->OverflowClip()->Parent()); + EXPECT_EQ(FrameContentClip(), OverflowClip(*overflow_properties)->Parent()); // No scroll translation because the document does not scroll (not enough // content). EXPECT_TRUE(!FrameScrollTranslation()); @@ -2014,7 +2046,7 @@ LayoutObject* clip = GetLayoutObjectByElementId("clip"); const ObjectPaintProperties* clip_properties = clip->FirstFragment().PaintProperties(); - EXPECT_EQ(overflow_properties->OverflowClip(), + EXPECT_EQ(OverflowClip(*overflow_properties), clip_properties->CssClip()->Parent()); EXPECT_EQ(overflow_properties->ScrollTranslation(), clip_properties->CssClip()->LocalTransformSpace()); @@ -2957,11 +2989,11 @@ auto contents_properties = clipper->FirstFragment().ContentsProperties(); EXPECT_EQ(LayoutPoint(30, 20), clipper->FirstFragment().PaintOffset()); EXPECT_EQ(FramePreTranslation(), contents_properties.Transform()); - EXPECT_EQ(clip_properties->OverflowClip(), contents_properties.Clip()); + EXPECT_EQ(OverflowClip(*clip_properties), contents_properties.Clip()); EXPECT_EQ(FramePreTranslation(), child->FirstFragment().LocalBorderBoxProperties().Transform()); - EXPECT_EQ(clip_properties->OverflowClip(), + EXPECT_EQ(OverflowClip(*clip_properties), child->FirstFragment().LocalBorderBoxProperties().Clip()); EXPECT_NE(nullptr, @@ -2996,11 +3028,11 @@ auto contents_properties = clipper->FirstFragment().ContentsProperties(); EXPECT_EQ(LayoutPoint(30, 20), clipper->FirstFragment().PaintOffset()); EXPECT_EQ(FramePreTranslation(), contents_properties.Transform()); - EXPECT_EQ(clip_properties->OverflowClip(), contents_properties.Clip()); + EXPECT_EQ(OverflowClip(*clip_properties), contents_properties.Clip()); EXPECT_EQ(FramePreTranslation(), child->FirstFragment().LocalBorderBoxProperties().Transform()); - EXPECT_EQ(clip_properties->OverflowClip(), + EXPECT_EQ(OverflowClip(*clip_properties), child->FirstFragment().LocalBorderBoxProperties().Clip()); EXPECT_NE(nullptr, @@ -3047,16 +3079,51 @@ EXPECT_EQ(LayoutPoint(0, 0), clipper->FirstFragment().PaintOffset()); EXPECT_EQ(clip_properties->ScrollTranslation(), contents_properties.Transform()); - EXPECT_EQ(clip_properties->OverflowClip(), contents_properties.Clip()); + EXPECT_EQ(OverflowClip(*clip_properties), contents_properties.Clip()); EXPECT_EQ(clip_properties->ScrollTranslation(), child->FirstFragment().LocalBorderBoxProperties().Transform()); - EXPECT_EQ(clip_properties->OverflowClip(), + EXPECT_EQ(OverflowClip(*clip_properties), child->FirstFragment().LocalBorderBoxProperties().Clip()); CHECK_EXACT_VISUAL_RECT(LayoutRect(0, 0, 500, 600), child, clipper); } +TEST_P(PaintPropertyTreeBuilderTest, OverflowHiddenWithRoundedRect) { + SetBodyInnerHTML(R"HTML( + <style> + * { margin: 0; } + #roundedBox { + width: 200px; + height: 200px; + border-radius: 100px; + background-color: red; + border: 50px solid green; + overflow: hidden; + } + #roundedBoxChild { + width: 200px; + height: 200px; + background-color: orange; + } + </style> + <div id='roundedBox'> + <div id='roundedBoxChild'></div> + </div> + )HTML"); + + const auto* rounded_box_properties = PaintPropertiesForElement("roundedBox"); + EXPECT_EQ( + FloatRoundedRect(FloatRect(50, 50, 200, 200), FloatSize(50, 50), + FloatSize(50, 50), FloatSize(50, 50), FloatSize(50, 50)), + rounded_box_properties->InnerBorderRadiusClip()->ClipRect()); + + EXPECT_EQ(FrameContentClip(), + rounded_box_properties->InnerBorderRadiusClip()->Parent()); + // No OverflowClip because InnerBorderRadiusClip already serves the purpose. + EXPECT_EQ(nullptr, OverflowClip(*rounded_box_properties)); +} + TEST_P(PaintPropertyTreeBuilderTest, OverflowScrollWithRoundedRect) { SetBodyInnerHTML(R"HTML( <style> @@ -3095,11 +3162,11 @@ // Unlike the inner border radius clip, the overflow clip is inset by the // scrollbars (13px). EXPECT_EQ(FloatRoundedRect(50, 50, 187, 187), - rounded_box_properties->OverflowClip()->ClipRect()); + OverflowClip(*rounded_box_properties)->ClipRect()); EXPECT_EQ(FrameContentClip(), rounded_box_properties->InnerBorderRadiusClip()->Parent()); EXPECT_EQ(rounded_box_properties->InnerBorderRadiusClip(), - rounded_box_properties->OverflowClip()->Parent()); + OverflowClip(*rounded_box_properties)->Parent()); } TEST_P(PaintPropertyTreeBuilderTest, CssClipContentsTreeState) { @@ -3494,10 +3561,8 @@ </svg> )HTML"); - const ClipPaintPropertyNode* clip = GetLayoutObjectByElementId("svg") - ->FirstFragment() - .PaintProperties() - ->OverflowClip(); + const ClipPaintPropertyNode* clip = OverflowClip( + *GetLayoutObjectByElementId("svg")->FirstFragment().PaintProperties()); EXPECT_EQ(FrameContentClip(), clip->Parent()); EXPECT_EQ(FloatSize(8, 8), GetLayoutObjectByElementId("svg") ->FirstFragment() @@ -3516,10 +3581,8 @@ </svg> )HTML"); - EXPECT_FALSE(GetLayoutObjectByElementId("svg") - ->FirstFragment() - .PaintProperties() - ->OverflowClip()); + EXPECT_FALSE(OverflowClip( + *GetLayoutObjectByElementId("svg")->FirstFragment().PaintProperties())); } TEST_P(PaintPropertyTreeBuilderTest, MainThreadScrollReasonsWithoutScrolling) { @@ -4178,7 +4241,7 @@ const ObjectPaintProperties* filter_properties = GetLayoutObjectByElementId("filter")->FirstFragment().PaintProperties(); EXPECT_TRUE(filter_properties->Filter()->Parent()->IsRoot()); - EXPECT_EQ(clip_properties->OverflowClip(), + EXPECT_EQ(OverflowClip(*clip_properties), filter_properties->Filter()->OutputClip()); if (RuntimeEnabledFeatures::SlimmingPaintV2Enabled()) { EXPECT_EQ(FrameScrollTranslation(), @@ -4297,13 +4360,13 @@ LayoutObject* ancestor = GetLayoutObjectByElementId("ancestor"); LayoutObject* descendant = GetLayoutObjectByElementId("descendant"); - EXPECT_EQ(ancestor->FirstFragment().PaintProperties()->OverflowClip(), + EXPECT_EQ(OverflowClip(*ancestor->FirstFragment().PaintProperties()), descendant->FirstFragment().LocalBorderBoxProperties().Clip()); ToElement(ancestor->GetNode()) ->setAttribute(HTMLNames::styleAttr, "position: static"); GetDocument().View()->UpdateAllLifecyclePhases(); - EXPECT_NE(ancestor->FirstFragment().PaintProperties()->OverflowClip(), + EXPECT_NE(OverflowClip(*ancestor->FirstFragment().PaintProperties()), descendant->FirstFragment().LocalBorderBoxProperties().Clip()); } @@ -4414,10 +4477,10 @@ if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled()) { // Result is pixel-snapped. EXPECT_EQ(FloatRect(32, 20, 400, 300), - clip_properties->OverflowClip()->ClipRect().Rect()); + OverflowClip(*clip_properties)->ClipRect().Rect()); } else { EXPECT_EQ(FloatRect(31.5, 20, 400, 300), - clip_properties->OverflowClip()->ClipRect().Rect()); + OverflowClip(*clip_properties)->ClipRect().Rect()); } } @@ -4511,7 +4574,7 @@ target_properties->MaskClip()->Parent(); const ClipPaintPropertyNode* mask_clip = target_properties->MaskClip(); const ClipPaintPropertyNode* overflow_clip2 = - target_properties->OverflowClip(); + OverflowClip(*target_properties); const auto* target = GetLayoutObjectByElementId("target"); const TransformPaintPropertyNode* scroll_translation = target->FirstFragment().LocalBorderBoxProperties().Transform(); @@ -4914,7 +4977,7 @@ border_radius_clip->ClipRect()); EXPECT_EQ(FrameContentClip(), border_radius_clip->Parent()); EXPECT_EQ(FramePreTranslation(), border_radius_clip->LocalTransformSpace()); - EXPECT_EQ(nullptr, properties->OverflowClip()); + EXPECT_EQ(nullptr, OverflowClip(*properties)); } TEST_P(PaintPropertyTreeBuilderTest, NoPropertyForSVGTextWithReflection) { @@ -4941,7 +5004,7 @@ border_radius_clip->ClipRect()); EXPECT_EQ(FrameContentClip(), border_radius_clip->Parent()); EXPECT_EQ(FramePreTranslation(), border_radius_clip->LocalTransformSpace()); - EXPECT_EQ(nullptr, properties->OverflowClip()); + EXPECT_EQ(nullptr, OverflowClip(*properties)); } TEST_P(PaintPropertyTreeBuilderTest, FrameClipWhenPrinting) {
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreePrinter.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreePrinter.cpp index 2497c7f..84d0a3c 100644 --- a/third_party/WebKit/Source/core/paint/PaintPropertyTreePrinter.cpp +++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreePrinter.cpp
@@ -101,7 +101,7 @@ printer.AddNode(properties.CssClipFixedPosition()); printer.AddNode(properties.OverflowControlsClip()); printer.AddNode(properties.InnerBorderRadiusClip()); - printer.AddNode(properties.OverflowClip()); + printer.AddNode(OverflowClip(properties)); } }; @@ -182,7 +182,7 @@ object); SetDebugName(properties.InnerBorderRadiusClip(), "InnerBorderRadiusClip", object); - SetDebugName(properties.OverflowClip(), "OverflowClip", object); + SetDebugName(OverflowClip(properties), "OverflowClip", object); SetDebugName(properties.Effect(), "Effect", object); SetDebugName(properties.Filter(), "Filter", object); SetDebugName(properties.Mask(), "Mask", object);
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeUpdateTests.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeUpdateTests.cpp index ac9361fa..1c3bdc5 100644 --- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeUpdateTests.cpp +++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeUpdateTests.cpp
@@ -465,14 +465,14 @@ div->setAttribute(HTMLNames::styleAttr, "display:inline-block; width:7px;"); GetDocument().View()->UpdateAllLifecyclePhases(); auto* clip_properties = - div->GetLayoutObject()->FirstFragment().PaintProperties()->OverflowClip(); + OverflowClip(*div->GetLayoutObject()->FirstFragment().PaintProperties()); EXPECT_EQ(FloatRect(0, 0, 7, 0), clip_properties->ClipRect().Rect()); // Width changes should update the overflow clip. div->setAttribute(HTMLNames::styleAttr, "display:inline-block; width:7px;"); GetDocument().View()->UpdateAllLifecyclePhases(); clip_properties = - div->GetLayoutObject()->FirstFragment().PaintProperties()->OverflowClip(); + OverflowClip(*div->GetLayoutObject()->FirstFragment().PaintProperties()); EXPECT_EQ(FloatRect(0, 0, 7, 0), clip_properties->ClipRect().Rect()); div->setAttribute(HTMLNames::styleAttr, "display:inline-block; width:9px;"); GetDocument().View()->UpdateAllLifecyclePhases(); @@ -484,7 +484,7 @@ "display:inline-block; width:7px; padding-right:3px;"); GetDocument().View()->UpdateAllLifecyclePhases(); clip_properties = - div->GetLayoutObject()->FirstFragment().PaintProperties()->OverflowClip(); + OverflowClip(*div->GetLayoutObject()->FirstFragment().PaintProperties()); EXPECT_EQ(FloatRect(0, 0, 10, 0), clip_properties->ClipRect().Rect()); div->setAttribute(HTMLNames::styleAttr, "display:inline-block; width:8px; padding-right:2px;"); @@ -500,7 +500,7 @@ div->setAttribute(HTMLNames::styleAttr, "border-right:3px solid red;"); GetDocument().View()->UpdateAllLifecyclePhases(); clip_properties = - div->GetLayoutObject()->FirstFragment().PaintProperties()->OverflowClip(); + OverflowClip(*div->GetLayoutObject()->FirstFragment().PaintProperties()); EXPECT_EQ(FloatRect(0, 0, 797, 0), clip_properties->ClipRect().Rect()); div->setAttribute(HTMLNames::styleAttr, "border-right:5px solid red;"); GetDocument().View()->UpdateAllLifecyclePhases(); @@ -510,15 +510,13 @@ div->setAttribute(HTMLNames::styleAttr, "overflow:hidden;"); GetDocument().View()->UpdateAllLifecyclePhases(); clip_properties = - div->GetLayoutObject()->FirstFragment().PaintProperties()->OverflowClip(); + OverflowClip(*div->GetLayoutObject()->FirstFragment().PaintProperties()); EXPECT_EQ(FloatRect(0, 0, 800, 0), clip_properties->ClipRect().Rect()); div->setAttribute(HTMLNames::styleAttr, "overflow:visible;"); GetDocument().View()->UpdateAllLifecyclePhases(); EXPECT_TRUE(!div->GetLayoutObject()->FirstFragment().PaintProperties() || - !div->GetLayoutObject() - ->FirstFragment() - .PaintProperties() - ->OverflowClip()); + !OverflowClip( + *div->GetLayoutObject()->FirstFragment().PaintProperties())); } TEST_P(PaintPropertyTreeUpdateTest, ContainPaintChangesUpdateOverflowClip) { @@ -532,16 +530,14 @@ GetDocument().View()->UpdateAllLifecyclePhases(); auto* div = GetDocument().getElementById("div"); auto* properties = - div->GetLayoutObject()->FirstFragment().PaintProperties()->OverflowClip(); + OverflowClip(*div->GetLayoutObject()->FirstFragment().PaintProperties()); EXPECT_EQ(FloatRect(0, 0, 7, 6), properties->ClipRect().Rect()); div->setAttribute(HTMLNames::styleAttr, ""); GetDocument().View()->UpdateAllLifecyclePhases(); EXPECT_TRUE(!div->GetLayoutObject()->FirstFragment().PaintProperties() || - !div->GetLayoutObject() - ->FirstFragment() - .PaintProperties() - ->OverflowClip()); + !OverflowClip( + *div->GetLayoutObject()->FirstFragment().PaintProperties())); } // A basic sanity check for over-invalidation of paint properties. @@ -787,7 +783,7 @@ auto* container = GetLayoutObjectByElementId("container"); auto* overflow_clip = - container->FirstFragment().PaintProperties()->OverflowClip(); + OverflowClip(*container->FirstFragment().PaintProperties()); EXPECT_EQ(FloatSize(80, 80), overflow_clip->ClipRect().Rect().Size()); auto* new_style = GetDocument().CreateRawElement(HTMLNames::styleTag); @@ -796,7 +792,7 @@ GetDocument().View()->UpdateAllLifecyclePhases(); EXPECT_EQ(overflow_clip, - container->FirstFragment().PaintProperties()->OverflowClip()); + OverflowClip(*container->FirstFragment().PaintProperties())); EXPECT_EQ(FloatSize(60, 60), overflow_clip->ClipRect().Rect().Size()); } @@ -827,12 +823,12 @@ )HTML"); auto* select = GetLayoutObjectByElementId("select"); - EXPECT_NE(nullptr, select->FirstFragment().PaintProperties()->OverflowClip()); + EXPECT_NE(nullptr, OverflowClip(*select->FirstFragment().PaintProperties())); // Should not assert in FindPropertiesNeedingUpdate. ToHTMLSelectElement(select->GetNode())->setSelectedIndex(1); GetDocument().View()->UpdateAllLifecyclePhases(); - EXPECT_NE(nullptr, select->FirstFragment().PaintProperties()->OverflowClip()); + EXPECT_NE(nullptr, OverflowClip(*select->FirstFragment().PaintProperties())); } TEST_P(PaintPropertyTreeUpdateTest, BoxAddRemoveMask) { @@ -1078,7 +1074,7 @@ const auto* properties = PaintPropertiesForElement("target"); ASSERT_NE(nullptr, properties); EXPECT_EQ(FloatRect(0, 0, 30, 40), - properties->OverflowClip()->ClipRect().Rect()); + OverflowClip(*properties)->ClipRect().Rect()); GetDocument().getElementById("target")->setAttribute("overflow", "visible"); GetDocument().View()->UpdateAllLifecyclePhases(); @@ -1089,7 +1085,7 @@ properties = PaintPropertiesForElement("target"); ASSERT_NE(nullptr, properties); EXPECT_EQ(FloatRect(0, 0, 30, 40), - properties->OverflowClip()->ClipRect().Rect()); + OverflowClip(*properties)->ClipRect().Rect()); } TEST_P(PaintPropertyTreeUpdateTest, SVGForeignObjectOverflowChange) { @@ -1104,7 +1100,7 @@ const auto* properties = PaintPropertiesForElement("target"); ASSERT_NE(nullptr, properties); EXPECT_EQ(FloatRect(10, 20, 30, 40), - properties->OverflowClip()->ClipRect().Rect()); + OverflowClip(*properties)->ClipRect().Rect()); GetDocument().getElementById("target")->setAttribute("overflow", "visible"); GetDocument().View()->UpdateAllLifecyclePhases(); @@ -1115,7 +1111,7 @@ properties = PaintPropertiesForElement("target"); ASSERT_NE(nullptr, properties); EXPECT_EQ(FloatRect(10, 20, 30, 40), - properties->OverflowClip()->ClipRect().Rect()); + OverflowClip(*properties)->ClipRect().Rect()); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/paint/SVGContainerPainter.cpp b/third_party/WebKit/Source/core/paint/SVGContainerPainter.cpp index 3affc19..18b7f39 100644 --- a/third_party/WebKit/Source/core/paint/SVGContainerPainter.cpp +++ b/third_party/WebKit/Source/core/paint/SVGContainerPainter.cpp
@@ -57,11 +57,11 @@ // TODO(crbug.com/814815): The condition should be a DCHECK, but for now // we may paint the object for filters during PrePaint before the // properties are ready. - if (properties && properties->OverflowClip()) { + if (properties && properties->OverflowOrInnerBorderRadiusClip()) { scoped_paint_chunk_properties.emplace( paint_info.context.GetPaintController(), - properties->OverflowClip(), layout_svg_container_, - paint_info.DisplayItemTypeForClipping()); + properties->OverflowOrInnerBorderRadiusClip(), + layout_svg_container_, paint_info.DisplayItemTypeForClipping()); } } else { FloatRect viewport =
diff --git a/third_party/WebKit/Source/core/paint/SVGForeignObjectPainter.cpp b/third_party/WebKit/Source/core/paint/SVGForeignObjectPainter.cpp index 19098ea..a402f37 100644 --- a/third_party/WebKit/Source/core/paint/SVGForeignObjectPainter.cpp +++ b/third_party/WebKit/Source/core/paint/SVGForeignObjectPainter.cpp
@@ -60,9 +60,10 @@ // TODO(crbug.com/814815): The condition should be a DCHECK, but for now // we may paint the object for filters during PrePaint before the // properties are ready. - if (properties && properties->OverflowClip()) { + if (properties && properties->OverflowOrInnerBorderRadiusClip()) { scoped_paint_chunk_properties.emplace( - paint_info.context.GetPaintController(), properties->OverflowClip(), + paint_info.context.GetPaintController(), + properties->OverflowOrInnerBorderRadiusClip(), layout_svg_foreign_object_, paint_info.DisplayItemTypeForClipping()); }
diff --git a/third_party/WebKit/Source/core/paint/ViewPainterTest.cpp b/third_party/WebKit/Source/core/paint/ViewPainterTest.cpp index 85c8fcb9..5821854b 100644 --- a/third_party/WebKit/Source/core/paint/ViewPainterTest.cpp +++ b/third_party/WebKit/Source/core/paint/ViewPainterTest.cpp
@@ -130,7 +130,7 @@ const auto* properties = GetLayoutView().FirstFragment().PaintProperties(); if (RuntimeEnabledFeatures::RootLayerScrollingEnabled()) { EXPECT_EQ(properties->ScrollTranslation(), tree_state.Transform()); - EXPECT_EQ(properties->OverflowClip(), tree_state.Clip()); + EXPECT_EQ(OverflowClip(*properties), tree_state.Clip()); } else { EXPECT_EQ(nullptr, properties); const auto* frame_view = GetDocument().View();
diff --git a/third_party/WebKit/Source/core/paint/compositing/CompositingInputsUpdater.cpp b/third_party/WebKit/Source/core/paint/compositing/CompositingInputsUpdater.cpp index 63f3ade..694eae4 100644 --- a/third_party/WebKit/Source/core/paint/compositing/CompositingInputsUpdater.cpp +++ b/third_party/WebKit/Source/core/paint/compositing/CompositingInputsUpdater.cpp
@@ -183,6 +183,12 @@ properties.filter_ancestor = parent->HasFilterInducingProperty() ? parent : parent->FilterAncestor(); + properties.clip_path_ancestor = parent->GetLayoutObject().HasClipPath() + ? parent + : parent->ClipPathAncestor(); + properties.mask_ancestor = + parent->GetLayoutObject().HasMask() ? parent : parent->MaskAncestor(); + bool layer_is_fixed_position = layer->GetLayoutObject().Style()->GetPosition() == EPosition::kFixed; @@ -248,8 +254,7 @@ } } - layer->UpdateAncestorDependentCompositingInputs( - properties, info.has_ancestor_with_clip_path); + layer->UpdateAncestorDependentCompositingInputs(properties); } if (layer->StackingNode()->IsStackingContext()) @@ -264,9 +269,6 @@ if (layer->GetLayoutObject().HasClipRelatedProperty()) info.has_ancestor_with_clip_related_property = true; - if (layer->GetLayoutObject().HasClipPath()) - info.has_ancestor_with_clip_path = true; - for (PaintLayer* child = layer->FirstChild(); child; child = child->NextSibling()) UpdateRecursive(child, update_type, info);
diff --git a/third_party/WebKit/Source/core/paint/compositing/CompositingInputsUpdater.h b/third_party/WebKit/Source/core/paint/compositing/CompositingInputsUpdater.h index 1362d6d..34674a63 100644 --- a/third_party/WebKit/Source/core/paint/compositing/CompositingInputsUpdater.h +++ b/third_party/WebKit/Source/core/paint/compositing/CompositingInputsUpdater.h
@@ -37,8 +37,7 @@ enclosing_composited_layer(nullptr), last_overflow_clip_layer(nullptr), last_scrolling_ancestor(nullptr), - has_ancestor_with_clip_related_property(false), - has_ancestor_with_clip_path(false) {} + has_ancestor_with_clip_related_property(false) {} PaintLayer* ancestor_stacking_context; PaintLayer* enclosing_composited_layer;
diff --git a/third_party/WebKit/Source/core/paint/compositing/CompositingInputsUpdaterTest.cpp b/third_party/WebKit/Source/core/paint/compositing/CompositingInputsUpdaterTest.cpp index bb47f7a..88783e1b 100644 --- a/third_party/WebKit/Source/core/paint/compositing/CompositingInputsUpdaterTest.cpp +++ b/third_party/WebKit/Source/core/paint/compositing/CompositingInputsUpdaterTest.cpp
@@ -127,4 +127,46 @@ } } +TEST_P(CompositingInputsUpdaterTest, ClipPathAncestor) { + SetBodyInnerHTML(R"HTML( + <div id="parent" style="clip-path: circle(100%)"> + <div id="child" style="width: 20px; height: 20px; will-change: transform"> + <div id="grandchild" style="position: relative"; + </div> + </div> + )HTML"); + + PaintLayer* parent = + ToLayoutBoxModelObject(GetLayoutObjectByElementId("parent"))->Layer(); + PaintLayer* child = + ToLayoutBoxModelObject(GetLayoutObjectByElementId("child"))->Layer(); + PaintLayer* grandchild = + ToLayoutBoxModelObject(GetLayoutObjectByElementId("grandchild"))->Layer(); + + EXPECT_EQ(nullptr, parent->ClipPathAncestor()); + EXPECT_EQ(parent, child->ClipPathAncestor()); + EXPECT_EQ(parent, grandchild->ClipPathAncestor()); +} + +TEST_P(CompositingInputsUpdaterTest, MaskAncestor) { + SetBodyInnerHTML(R"HTML( + <div id="parent" style="-webkit-mask-image: linear-gradient(black, white);"> + <div id="child" style="width: 20px; height: 20px; will-change: transform"> + <div id="grandchild" style="position: relative"; + </div> + </div> + )HTML"); + + PaintLayer* parent = + ToLayoutBoxModelObject(GetLayoutObjectByElementId("parent"))->Layer(); + PaintLayer* child = + ToLayoutBoxModelObject(GetLayoutObjectByElementId("child"))->Layer(); + PaintLayer* grandchild = + ToLayoutBoxModelObject(GetLayoutObjectByElementId("grandchild"))->Layer(); + + EXPECT_EQ(nullptr, parent->MaskAncestor()); + EXPECT_EQ(parent, child->MaskAncestor()); + EXPECT_EQ(parent, grandchild->MaskAncestor()); +} + } // namespace blink
diff --git a/third_party/WebKit/Source/core/paint/compositing/CompositingLayerAssigner.cpp b/third_party/WebKit/Source/core/paint/compositing/CompositingLayerAssigner.cpp index 407e3151..218244cd 100644 --- a/third_party/WebKit/Source/core/paint/compositing/CompositingLayerAssigner.cpp +++ b/third_party/WebKit/Source/core/paint/compositing/CompositingLayerAssigner.cpp
@@ -208,6 +208,14 @@ if (layer->EnclosingPaginationLayer()) return SquashingDisallowedReason::kFragmentedContent; + if (layer->GetLayoutObject().HasClipPath() || + layer->ClipPathAncestor() != squashing_layer.ClipPathAncestor()) + return SquashingDisallowedReason::kClipPathMismatch; + + if (layer->GetLayoutObject().HasMask() || + layer->MaskAncestor() != squashing_layer.MaskAncestor()) + return SquashingDisallowedReason::kMaskMismatch; + return SquashingDisallowedReason::kNone; }
diff --git a/third_party/WebKit/Source/core/paint/compositing/CompositingLayerAssignerTest.cpp b/third_party/WebKit/Source/core/paint/compositing/CompositingLayerAssignerTest.cpp new file mode 100644 index 0000000..58e058c6 --- /dev/null +++ b/third_party/WebKit/Source/core/paint/compositing/CompositingLayerAssignerTest.cpp
@@ -0,0 +1,65 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/layout/LayoutTestHelper.h" +#include "core/paint/PaintLayer.h" +#include "core/paint/compositing/CompositedLayerMapping.h" +#include "platform/graphics/GraphicsLayer.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { + +class CompositedLayerAssignerTest : public RenderingTest { + private: + void SetUp() override { + RenderingTest::SetUp(); + EnableCompositing(); + } +}; + +TEST_F(CompositedLayerAssignerTest, SquashingSimple) { + SetBodyInnerHTML(R"HTML( + <div> + <div style="width: 20px; height: 20px; will-change: transform"></div> + </div> + <div id="squashed" style="position: absolute; top: 0; width: 100px; + height: 100px; background: green"></div> + )HTML"); + + PaintLayer* squashed = + ToLayoutBoxModelObject(GetLayoutObjectByElementId("squashed"))->Layer(); + EXPECT_EQ(kPaintsIntoGroupedBacking, squashed->GetCompositingState()); +} + +TEST_F(CompositedLayerAssignerTest, SquashingAcrossClipPathDisallowed) { + SetBodyInnerHTML(R"HTML( + <div style="clip-path: circle(100%)"> + <div style="width: 20px; height: 20px; will-change: transform"></div> + </div> + <div id="squashed" style="position: absolute; top: 0; width: 100px; + height: 100px; background: green"></div> + )HTML"); + // #squashed should not be squashed after all, because of the clip path above + // #squashing. + PaintLayer* squashed = + ToLayoutBoxModelObject(GetLayoutObjectByElementId("squashed"))->Layer(); + EXPECT_EQ(kPaintsIntoOwnBacking, squashed->GetCompositingState()); +} + +TEST_F(CompositedLayerAssignerTest, SquashingAcrossMaskDisallowed) { + SetBodyInnerHTML(R"HTML( + <div style="-webkit-mask-image: linear-gradient(black, white);"> + <div style="width: 20px; height: 20px; will-change: transform"></div> + </div> + <div id="squashed" style="position: absolute; top: 0; width: 100px; + height: 100px; background: green"></div> + )HTML"); + // #squashed should not be squashed after all, because of the mask above + // #squashing. + PaintLayer* squashed = + ToLayoutBoxModelObject(GetLayoutObjectByElementId("squashed"))->Layer(); + EXPECT_EQ(kPaintsIntoOwnBacking, squashed->GetCompositingState()); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/testing/Internals.cpp b/third_party/WebKit/Source/core/testing/Internals.cpp index 5f3d1c59..002fc5f87 100644 --- a/third_party/WebKit/Source/core/testing/Internals.cpp +++ b/third_party/WebKit/Source/core/testing/Internals.cpp
@@ -132,6 +132,7 @@ #include "core/testing/OriginTrialsTest.h" #include "core/testing/RecordTest.h" #include "core/testing/SequenceTest.h" +#include "core/testing/StaticSelection.h" #include "core/testing/TypeConversions.h" #include "core/testing/UnionTypesTest.h" #include "core/typed_arrays/DOMArrayBuffer.h" @@ -2879,6 +2880,19 @@ ClientRedirectPolicy::kNotClientRedirect); } +StaticSelection* Internals::getSelectionInFlatTree( + DOMWindow* window, + ExceptionState& exception_state) { + Frame* const frame = window->GetFrame(); + if (!frame || !frame->IsLocalFrame()) { + exception_state.ThrowDOMException(kInvalidAccessError, + "Must supply local window"); + return nullptr; + } + return StaticSelection::FromSelectionInFlatTree(ConvertToSelectionInFlatTree( + ToLocalFrame(frame)->Selection().GetSelectionInDOMTree())); +} + Node* Internals::visibleSelectionAnchorNode() { if (!GetFrame()) return nullptr;
diff --git a/third_party/WebKit/Source/core/testing/Internals.h b/third_party/WebKit/Source/core/testing/Internals.h index 5ee66b48..b88f662 100644 --- a/third_party/WebKit/Source/core/testing/Internals.h +++ b/third_party/WebKit/Source/core/testing/Internals.h
@@ -75,6 +75,7 @@ class SequenceTest; class SerializedScriptValue; class ShadowRoot; +class StaticSelection; class TypeConversions; class UnionTypesTest; class ScrollState; @@ -452,6 +453,7 @@ int selectPopupItemStyleFontHeight(Node*, int); void resetTypeAheadSession(HTMLSelectElement*); + StaticSelection* getSelectionInFlatTree(DOMWindow*, ExceptionState&); Node* visibleSelectionAnchorNode(); unsigned visibleSelectionAnchorOffset(); Node* visibleSelectionFocusNode();
diff --git a/third_party/WebKit/Source/core/testing/Internals.idl b/third_party/WebKit/Source/core/testing/Internals.idl index 8535d8d8..4f5eee0 100644 --- a/third_party/WebKit/Source/core/testing/Internals.idl +++ b/third_party/WebKit/Source/core/testing/Internals.idl
@@ -76,7 +76,7 @@ // Animation testing. [RaisesException] void pauseAnimations(double pauseTime); - bool isCompositedAnimation(Animation animation); + boolean isCompositedAnimation(Animation animation); void disableCompositedAnimation(Animation animation); void disableCSSAdditiveAnimations(); @@ -182,7 +182,7 @@ [RaisesException] boolean hasGrammarMarker(Document document, long from, long length); [RaisesException] void replaceMisspelled(Document document, DOMString replacement); - bool canHyphenate(DOMString locale); + boolean canHyphenate(DOMString locale); void setMockHyphenation(DOMString locale); boolean isOverwriteModeEnabled(Document document); @@ -242,7 +242,7 @@ void setMediaElementNetworkState(HTMLMediaElement element, long state); void setPersistent(HTMLVideoElement video, boolean persistent); void forceStaleStateForMediaElement(HTMLMediaElement mediaElement); - bool isMediaElementSuspended(HTMLMediaElement mediaElement); + boolean isMediaElementSuspended(HTMLMediaElement mediaElement); void registerURLSchemeAsBypassingContentSecurityPolicy(DOMString scheme); void registerURLSchemeAsBypassingContentSecurityPolicy(DOMString scheme, sequence<DOMString> policyAreas); @@ -294,6 +294,9 @@ long selectPopupItemStyleFontHeight(Node select, long itemIndex); void resetTypeAheadSession(HTMLSelectElement select); + [RaisesException] StaticSelection getSelectionInFlatTree(Window window); + // TODO(editing-dev): We should change |visibleSelection*| to + // |StaticSelection|. readonly attribute Node? visibleSelectionAnchorNode; readonly attribute unsigned long visibleSelectionAnchorOffset; readonly attribute Node? visibleSelectionFocusNode; @@ -349,12 +352,12 @@ DOMString selectedTextForClipboard(); void setVisualViewportOffset(long x, long y); - int visualViewportHeight(); - int visualViewportWidth(); + long visualViewportHeight(); + long visualViewportWidth(); double visualViewportScrollX(); double visualViewportScrollY(); - bool magnifyScaleAroundAnchor(float offset, float x, float y); + boolean magnifyScaleAroundAnchor(float offset, float x, float y); boolean isUseCounted(Document document, unsigned long feature); boolean isCSSPropertyUseCounted(Document document, DOMString propertyName); @@ -382,7 +385,7 @@ // Returns whether the scrollbar was able to be shown or hidden; not all platforms // support overlay scrollbars. - bool setScrollbarVisibilityInScrollableArea(Node node, boolean visible); + boolean setScrollbarVisibilityInScrollableArea(Node node, boolean visible); [RaisesException] double monotonicTimeToZeroBasedDocumentTime(double platformTime);
diff --git a/third_party/WebKit/Source/core/testing/SequenceTest.idl b/third_party/WebKit/Source/core/testing/SequenceTest.idl index c0d5e5d..b1cca0ee 100644 --- a/third_party/WebKit/Source/core/testing/SequenceTest.idl +++ b/third_party/WebKit/Source/core/testing/SequenceTest.idl
@@ -20,5 +20,5 @@ sequence<Element> getElementSequence(); void setElementSequence(sequence<Element> arg); - bool unionReceivedSequence((double or sequence<double>) arg); + boolean unionReceivedSequence((double or sequence<double>) arg); };
diff --git a/third_party/WebKit/Source/core/testing/StaticSelection.cpp b/third_party/WebKit/Source/core/testing/StaticSelection.cpp new file mode 100644 index 0000000..f78a07b --- /dev/null +++ b/third_party/WebKit/Source/core/testing/StaticSelection.cpp
@@ -0,0 +1,29 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/testing/StaticSelection.h" + +#include "core/editing/SelectionTemplate.h" + +namespace blink { + +// static +StaticSelection* StaticSelection::FromSelectionInFlatTree( + const SelectionInFlatTree& seleciton) { + return new StaticSelection(seleciton); +} + +StaticSelection::StaticSelection(const SelectionInFlatTree& seleciton) + : anchor_node_(seleciton.Base().ComputeContainerNode()), + anchor_offset_(seleciton.Base().ComputeOffsetInContainerNode()), + focus_node_(seleciton.Extent().ComputeContainerNode()), + focus_offset_(seleciton.Extent().ComputeOffsetInContainerNode()) {} + +void StaticSelection::Trace(blink::Visitor* visitor) { + visitor->Trace(anchor_node_); + visitor->Trace(focus_node_); + ScriptWrappable::Trace(visitor); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/testing/StaticSelection.h b/third_party/WebKit/Source/core/testing/StaticSelection.h new file mode 100644 index 0000000..30b6098 --- /dev/null +++ b/third_party/WebKit/Source/core/testing/StaticSelection.h
@@ -0,0 +1,42 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef StaticSelection_h +#define StaticSelection_h + +#include "core/editing/Forward.h" +#include "platform/bindings/ScriptWrappable.h" +#include "platform/heap/Handle.h" + +namespace blink { + +class Node; + +class StaticSelection final : public ScriptWrappable { + DEFINE_WRAPPERTYPEINFO(); + + public: + static StaticSelection* FromSelectionInFlatTree(const SelectionInFlatTree&); + + Node* anchorNode() const { return anchor_node_; } + unsigned anchorOffset() const { return anchor_offset_; } + Node* focusNode() const { return focus_node_; } + unsigned focusOffset() const { return focus_offset_; } + + void Trace(blink::Visitor*); + + private: + explicit StaticSelection(const SelectionInFlatTree&); + + const Member<Node> anchor_node_; + const unsigned anchor_offset_; + const Member<Node> focus_node_; + const unsigned focus_offset_; + + DISALLOW_COPY_AND_ASSIGN(StaticSelection); +}; + +} // namespace blink + +#endif // StaticSelection_h
diff --git a/third_party/WebKit/Source/core/testing/StaticSelection.idl b/third_party/WebKit/Source/core/testing/StaticSelection.idl new file mode 100644 index 0000000..9fb9dcb --- /dev/null +++ b/third_party/WebKit/Source/core/testing/StaticSelection.idl
@@ -0,0 +1,10 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +interface StaticSelection { + readonly attribute Node? anchorNode; + readonly attribute unsigned long anchorOffset; + readonly attribute Node? focusNode; + readonly attribute unsigned long focusOffset; +};
diff --git a/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp b/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp index cbe0761..2f8f4f2e 100644 --- a/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp +++ b/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp
@@ -1356,13 +1356,46 @@ if (!number_of_code_units) return nullptr; - DCHECK_LE(number_of_code_units, 4u); - size_t entity_length_in_utf8 = ConvertUTF16EntityToUTF8( - utf16_decoded_entity, number_of_code_units, - reinterpret_cast<char*>(g_shared_xhtml_entity_result), - WTF_ARRAY_LENGTH(g_shared_xhtml_entity_result)); - if (!entity_length_in_utf8) - return nullptr; + constexpr size_t kSharedXhtmlEntityResultLength = + arraysize(g_shared_xhtml_entity_result); + size_t entity_length_in_utf8; + // Unlike HTML parser, XML parser parses the content of named + // entities. So we need to escape '&' and '<'. + if (number_of_code_units == 1 && utf16_decoded_entity[0] == '&') { + g_shared_xhtml_entity_result[0] = '&'; + g_shared_xhtml_entity_result[1] = '#'; + g_shared_xhtml_entity_result[2] = '3'; + g_shared_xhtml_entity_result[3] = '8'; + g_shared_xhtml_entity_result[4] = ';'; + entity_length_in_utf8 = 5; + } else if (number_of_code_units == 1 && utf16_decoded_entity[0] == '<') { + g_shared_xhtml_entity_result[0] = '&'; + g_shared_xhtml_entity_result[1] = '#'; + g_shared_xhtml_entity_result[2] = '6'; + g_shared_xhtml_entity_result[3] = '0'; + g_shared_xhtml_entity_result[4] = ';'; + entity_length_in_utf8 = 5; + } else if (number_of_code_units == 2 && utf16_decoded_entity[0] == '<' && + utf16_decoded_entity[1] == 0x20D2) { + g_shared_xhtml_entity_result[0] = '&'; + g_shared_xhtml_entity_result[1] = '#'; + g_shared_xhtml_entity_result[2] = '6'; + g_shared_xhtml_entity_result[3] = '0'; + g_shared_xhtml_entity_result[4] = ';'; + g_shared_xhtml_entity_result[5] = 0xE2; + g_shared_xhtml_entity_result[6] = 0x83; + g_shared_xhtml_entity_result[7] = 0x92; + entity_length_in_utf8 = 8; + } else { + DCHECK_LE(number_of_code_units, 4u); + entity_length_in_utf8 = ConvertUTF16EntityToUTF8( + utf16_decoded_entity, number_of_code_units, + reinterpret_cast<char*>(g_shared_xhtml_entity_result), + kSharedXhtmlEntityResultLength); + if (entity_length_in_utf8 == 0) + return nullptr; + } + DCHECK_LE(entity_length_in_utf8, kSharedXhtmlEntityResultLength); xmlEntityPtr entity = SharedXHTMLEntity(); entity->length = entity_length_in_utf8; @@ -1415,6 +1448,7 @@ const xmlChar*, const xmlChar* external_id, const xmlChar*) { + // https://html.spec.whatwg.org/multipage/xhtml.html#parsing-xhtml-documents:named-character-references String ext_id = ToString(external_id); if (ext_id == "-//W3C//DTD XHTML 1.0 Transitional//EN" || ext_id == "-//W3C//DTD XHTML 1.1//EN" || @@ -1423,6 +1457,7 @@ ext_id == "-//W3C//DTD XHTML Basic 1.0//EN" || ext_id == "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" || ext_id == "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" || + ext_id == "-//W3C//DTD MathML 2.0//EN" || ext_id == "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" || ext_id == "-//WAPFORUM//DTD XHTML Mobile 1.1//EN" || ext_id == "-//WAPFORUM//DTD XHTML Mobile 1.2//EN") {
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js b/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js index 98b1a88..6fc86703 100644 --- a/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js +++ b/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
@@ -138,7 +138,11 @@ (UI.DragHandler._documentForMouseOut || targetDocument) === targetDocument, 'Dragging on multiple documents.'); UI.DragHandler._documentForMouseOut = targetDocument; this._dragEventsTargetDocument = targetDocument; - this._dragEventsTargetDocumentTop = targetDocument.defaultView.top.document; + try { + this._dragEventsTargetDocumentTop = targetDocument.defaultView.top.document; + } catch (e) { + this._dragEventsTargetDocumentTop = this._dragEventsTargetDocument; + } targetDocument.addEventListener('mousemove', this._elementDragMove, true); targetDocument.addEventListener('mouseup', this._elementDragEnd, true);
diff --git a/third_party/WebKit/Source/modules/BUILD.gn b/third_party/WebKit/Source/modules/BUILD.gn index 790b937..54f2972 100644 --- a/third_party/WebKit/Source/modules/BUILD.gn +++ b/third_party/WebKit/Source/modules/BUILD.gn
@@ -289,7 +289,6 @@ "payments/PaymentsValidatorsTest.cpp", "peerconnection/RTCDataChannelTest.cpp", "peerconnection/RTCPeerConnectionTest.cpp", - "picture_in_picture/PictureInPictureTest.cpp", "presentation/MockPresentationService.h", "presentation/MockWebPresentationClient.h", "presentation/PresentationAvailabilityStateTest.cpp",
diff --git a/third_party/WebKit/Source/modules/background_fetch/BackgroundFetchRegistration.idl b/third_party/WebKit/Source/modules/background_fetch/BackgroundFetchRegistration.idl index ea2acbb..e7d73a6 100644 --- a/third_party/WebKit/Source/modules/background_fetch/BackgroundFetchRegistration.idl +++ b/third_party/WebKit/Source/modules/background_fetch/BackgroundFetchRegistration.idl
@@ -17,5 +17,5 @@ attribute EventHandler onprogress; - [CallWith=ScriptState] Promise<bool> abort(); + [CallWith=ScriptState] Promise<boolean> abort(); };
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPictureInPictureButtonElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPictureInPictureButtonElement.cpp index 59d9b38..0092fa0 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPictureInPictureButtonElement.cpp +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPictureInPictureButtonElement.cpp
@@ -45,7 +45,7 @@ void MediaControlPictureInPictureButtonElement::DefaultEventHandler( Event* event) { if (event->type() == EventTypeNames::click) - MediaElement().pictureInPicture(); + MediaElement().enterPictureInPicture(); MediaControlInputElement::DefaultEventHandler(event); }
diff --git a/third_party/WebKit/Source/modules/picture_in_picture/DEPS b/third_party/WebKit/Source/modules/picture_in_picture/DEPS index b86598f..fc1c671 100644 --- a/third_party/WebKit/Source/modules/picture_in_picture/DEPS +++ b/third_party/WebKit/Source/modules/picture_in_picture/DEPS
@@ -1,6 +1,5 @@ include_rules = [ "-modules", "+modules/EventTargetModules.h", - "+modules/ModulesExport.h", "+modules/picture_in_picture", ] \ No newline at end of file
diff --git a/third_party/WebKit/Source/modules/picture_in_picture/HTMLVideoElementPictureInPicture.h b/third_party/WebKit/Source/modules/picture_in_picture/HTMLVideoElementPictureInPicture.h index d2cbcf7..e2ae4b8 100644 --- a/third_party/WebKit/Source/modules/picture_in_picture/HTMLVideoElementPictureInPicture.h +++ b/third_party/WebKit/Source/modules/picture_in_picture/HTMLVideoElementPictureInPicture.h
@@ -7,7 +7,6 @@ #include "core/dom/QualifiedName.h" #include "modules/EventTargetModules.h" -#include "modules/ModulesExport.h" #include "platform/heap/Handle.h" namespace blink { @@ -16,7 +15,7 @@ class ScriptPromise; class ScriptState; -class MODULES_EXPORT HTMLVideoElementPictureInPicture { +class HTMLVideoElementPictureInPicture { STATIC_ONLY(HTMLVideoElementPictureInPicture); public:
diff --git a/third_party/WebKit/Source/modules/picture_in_picture/PictureInPictureController.cpp b/third_party/WebKit/Source/modules/picture_in_picture/PictureInPictureController.cpp index 5b66526..f8980e68 100644 --- a/third_party/WebKit/Source/modules/picture_in_picture/PictureInPictureController.cpp +++ b/third_party/WebKit/Source/modules/picture_in_picture/PictureInPictureController.cpp
@@ -5,6 +5,7 @@ #include "modules/picture_in_picture/PictureInPictureController.h" #include "core/dom/Document.h" +#include "core/frame/Settings.h" #include "core/html/media/HTMLVideoElement.h" #include "modules/picture_in_picture/PictureInPictureWindow.h" #include "platform/feature_policy/FeaturePolicy.h" @@ -45,9 +46,10 @@ if (!frame) return Status::kFrameDetached; - // `picture_in_picture_enabled_` is set to false by the embedder when it - // or the system forbids the page from using Picture-in-Picture. - if (!picture_in_picture_enabled_) + // `GetPictureInPictureEnabled()` returns false when the embedder or the + // system forbids the page from using Picture-in-Picture. + DCHECK(GetSupplementable()->GetSettings()); + if (!GetSupplementable()->GetSettings()->GetPictureInPictureEnabled()) return Status::kDisabledBySystem; // If document is not allowed to use the policy-controlled feature named @@ -74,11 +76,6 @@ return Status::kEnabled; } -void PictureInPictureController::SetPictureInPictureEnabledForTesting( - bool value) { - picture_in_picture_enabled_ = value; -} - void PictureInPictureController::SetPictureInPictureElement( HTMLVideoElement& element) { picture_in_picture_element_ = &element;
diff --git a/third_party/WebKit/Source/modules/picture_in_picture/PictureInPictureController.h b/third_party/WebKit/Source/modules/picture_in_picture/PictureInPictureController.h index 1a7cea1..d8e3d10 100644 --- a/third_party/WebKit/Source/modules/picture_in_picture/PictureInPictureController.h +++ b/third_party/WebKit/Source/modules/picture_in_picture/PictureInPictureController.h
@@ -6,7 +6,6 @@ #define PictureInPictureController_h #include "core/frame/LocalFrame.h" -#include "modules/ModulesExport.h" namespace blink { @@ -20,7 +19,7 @@ // PictureInPictureController instance is associated to a Document. It is // supplement and therefore can be lazy-initiated. Callers should consider // whether they want to instantiate an object when they make a call. -class MODULES_EXPORT PictureInPictureController +class PictureInPictureController : public GarbageCollectedFinalized<PictureInPictureController>, public Supplement<Document> { USING_GARBAGE_COLLECTED_MIXIN(PictureInPictureController); @@ -37,8 +36,6 @@ // the associated document. bool PictureInPictureEnabled() const; - void SetPictureInPictureEnabledForTesting(bool); - // List of Picture-in-Picture support statuses. If status is kEnabled, // Picture-in-Picture is enabled for a document or element, otherwise it is // not supported. @@ -82,10 +79,6 @@ private: explicit PictureInPictureController(Document&); - // Whether system allows Picture-in-Picture feature for the associated - // document. - bool picture_in_picture_enabled_ = true; - // The Picture-in-Picture element for the associated document. Member<HTMLVideoElement> picture_in_picture_element_;
diff --git a/third_party/WebKit/Source/modules/picture_in_picture/PictureInPictureTest.cpp b/third_party/WebKit/Source/modules/picture_in_picture/PictureInPictureTest.cpp deleted file mode 100644 index d325abd..0000000 --- a/third_party/WebKit/Source/modules/picture_in_picture/PictureInPictureTest.cpp +++ /dev/null
@@ -1,113 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "bindings/core/v8/V8BindingForCore.h" -#include "core/html/media/HTMLVideoElement.h" -#include "core/testing/PageTestBase.h" -#include "modules/picture_in_picture/HTMLVideoElementPictureInPicture.h" -#include "modules/picture_in_picture/PictureInPictureController.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace blink { - -const char kNotSupportedString[] = - "NotSupportedError: Picture-in-Picture is not available."; - -class PictureInPictureTest : public PageTestBase { - protected: - void SetUp() final { PageTestBase::SetUp(); } - - ScriptState* GetScriptState() { - return ToScriptStateForMainWorld(GetDocument().GetFrame()); - } - v8::Isolate* GetIsolate() { return GetScriptState()->GetIsolate(); } - v8::Local<v8::Context> GetContext() { return GetScriptState()->GetContext(); } - - // Convenience methods for testing the returned promises. - ScriptValue GetRejectValue(ScriptPromise& promise) { - ScriptValue on_reject; - promise.Then(UnreachableFunction::Create(GetScriptState()), - TestFunction::Create(GetScriptState(), &on_reject)); - v8::MicrotasksScope::PerformCheckpoint(GetIsolate()); - return on_reject; - } - - std::string GetRejectString(ScriptPromise& promise) { - ScriptValue on_reject = GetRejectValue(promise); - return ToCoreString( - on_reject.V8Value()->ToString(GetContext()).ToLocalChecked()) - .Ascii() - .data(); - } - - private: - // A ScriptFunction that creates a test failure if it is ever called. - class UnreachableFunction : public ScriptFunction { - public: - static v8::Local<v8::Function> Create(ScriptState* script_state) { - UnreachableFunction* self = new UnreachableFunction(script_state); - return self->BindToV8Function(); - } - - ScriptValue Call(ScriptValue value) override { - ADD_FAILURE() << "Unexpected call to a null ScriptFunction."; - return value; - } - - private: - UnreachableFunction(ScriptState* script_state) - : ScriptFunction(script_state) {} - }; - - // A ScriptFunction that saves its parameter; used by tests to assert on - // correct values being passed. - class TestFunction : public ScriptFunction { - public: - static v8::Local<v8::Function> Create(ScriptState* script_state, - ScriptValue* out_value) { - TestFunction* self = new TestFunction(script_state, out_value); - return self->BindToV8Function(); - } - - ScriptValue Call(ScriptValue value) override { - DCHECK(!value.IsEmpty()); - *value_ = value; - return value; - } - - private: - TestFunction(ScriptState* script_state, ScriptValue* out_value) - : ScriptFunction(script_state), value_(out_value) {} - - ScriptValue* value_; - }; -}; - -TEST_F(PictureInPictureTest, - RequestPictureInPictureRejectsWhenPictureInPictureEnabledIsFalse) { - Persistent<PictureInPictureController> controller = - PictureInPictureController::Ensure(GetDocument()); - ScriptState::Scope scope(GetScriptState()); - HTMLVideoElement& video = - static_cast<HTMLVideoElement&>(*HTMLVideoElement::Create(GetDocument())); - - controller->SetPictureInPictureEnabledForTesting(false); - ScriptPromise promise = - HTMLVideoElementPictureInPicture::requestPictureInPicture( - GetScriptState(), video); - - EXPECT_EQ(kNotSupportedString, GetRejectString(promise)); -} - -TEST_F(PictureInPictureTest, - PictureInPictureEnabledReturnsFalseWhenPictureInPictureEnabledIsFalse) { - Persistent<PictureInPictureController> controller = - PictureInPictureController::Ensure(GetDocument()); - - controller->SetPictureInPictureEnabledForTesting(false); - - EXPECT_FALSE(controller->PictureInPictureEnabled()); -} - -} // namespace blink
diff --git a/third_party/WebKit/Source/modules/webmidi/MIDIOptions.idl b/third_party/WebKit/Source/modules/webmidi/MIDIOptions.idl index 3136fc6..29b2f2e 100644 --- a/third_party/WebKit/Source/modules/webmidi/MIDIOptions.idl +++ b/third_party/WebKit/Source/modules/webmidi/MIDIOptions.idl
@@ -6,5 +6,5 @@ dictionary MIDIOptions { boolean sysex; - // TODO(crbug.com/502127): Add bool software to follow the latest spec. + // TODO(crbug.com/502127): Add boolean software to follow the latest spec. };
diff --git a/third_party/WebKit/Source/platform/WebFrameScheduler.h b/third_party/WebKit/Source/platform/WebFrameScheduler.h index 2e10b13..50a11ab 100644 --- a/third_party/WebKit/Source/platform/WebFrameScheduler.h +++ b/third_party/WebKit/Source/platform/WebFrameScheduler.h
@@ -21,7 +21,7 @@ virtual ~WebFrameScheduler() = default; // Observer type that regulates conditions to invoke callbacks. - enum class ObserverType { kLoader }; + enum class ObserverType { kLoader, kWorkerScheduler }; // Represents throttling state. enum class ThrottlingState { @@ -48,6 +48,8 @@ // Observer interface to receive scheduling policy change events. class Observer { public: + virtual ~Observer() = default; + // Notified when throttling state is changed. virtual void OnThrottlingStateChanged(ThrottlingState) = 0; };
diff --git a/third_party/WebKit/Source/platform/graphics/LoggingCanvas.cpp b/third_party/WebKit/Source/platform/graphics/LoggingCanvas.cpp index 671a209..1b0f571 100644 --- a/third_party/WebKit/Source/platform/graphics/LoggingCanvas.cpp +++ b/third_party/WebKit/Source/platform/graphics/LoggingCanvas.cpp
@@ -917,7 +917,6 @@ return JSONArray::From(log_->Clone()); } -#ifndef NDEBUG std::unique_ptr<JSONArray> RecordAsJSON(const PaintRecord& record) { LoggingCanvas canvas; record.Playback(&canvas); @@ -931,6 +930,19 @@ void ShowPaintRecord(const PaintRecord& record) { DLOG(INFO) << RecordAsDebugString(record).Utf8().data(); } -#endif + +std::unique_ptr<JSONArray> SkPictureAsJSON(const SkPicture& picture) { + LoggingCanvas canvas; + picture.playback(&canvas); + return canvas.Log(); +} + +String SkPictureAsDebugString(const SkPicture& picture) { + return SkPictureAsJSON(picture)->ToPrettyJSONString(); +} + +void ShowSkPicture(const SkPicture& picture) { + DLOG(INFO) << SkPictureAsDebugString(picture).Utf8().data(); +} } // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/LoggingCanvas.h b/third_party/WebKit/Source/platform/graphics/LoggingCanvas.h index fc71ef5..d2036a3c 100644 --- a/third_party/WebKit/Source/platform/graphics/LoggingCanvas.h +++ b/third_party/WebKit/Source/platform/graphics/LoggingCanvas.h
@@ -119,11 +119,12 @@ std::unique_ptr<JSONArray> log_; }; -#ifndef NDEBUG PLATFORM_EXPORT std::unique_ptr<JSONArray> RecordAsJSON(const PaintRecord&); PLATFORM_EXPORT String RecordAsDebugString(const PaintRecord&); PLATFORM_EXPORT void ShowPaintRecord(const PaintRecord&); -#endif +PLATFORM_EXPORT std::unique_ptr<JSONArray> SkPictureAsJSON(const SkPicture&); +PLATFORM_EXPORT String SkPictureAsDebugString(const SkPicture&); +PLATFORM_EXPORT void ShowSkPicture(const SkPicture&); } // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/SquashingDisallowedReasons.cpp b/third_party/WebKit/Source/platform/graphics/SquashingDisallowedReasons.cpp index bb51a45..ec3e6d4d 100644 --- a/third_party/WebKit/Source/platform/graphics/SquashingDisallowedReasons.cpp +++ b/third_party/WebKit/Source/platform/graphics/SquashingDisallowedReasons.cpp
@@ -73,6 +73,12 @@ {SquashingDisallowedReason::kFragmentedContent, "SquashingDisallowedReasonFragmentedContent", "Cannot squash layers that are inside fragmentation contexts."}, + {SquashingDisallowedReason::kClipPathMismatch, + "SquashingDisallowedReasonClipPathMismatch", + "Cannot squash layers across clip-path boundaries."}, + {SquashingDisallowedReason::kMaskMismatch, + "SquashingDisallowedReasonMaskMismatch", + "Cannot squash layers across mask boundaries."}, }; } // anonymous namespace
diff --git a/third_party/WebKit/Source/platform/graphics/SquashingDisallowedReasons.h b/third_party/WebKit/Source/platform/graphics/SquashingDisallowedReasons.h index 735d67e7..dd5c1c1 100644 --- a/third_party/WebKit/Source/platform/graphics/SquashingDisallowedReasons.h +++ b/third_party/WebKit/Source/platform/graphics/SquashingDisallowedReasons.h
@@ -28,7 +28,9 @@ V(ScrollChildWithCompositedDescendants) \ V(SquashingLayerIsAnimating) \ V(RenderingContextMismatch) \ - V(FragmentedContent) + V(FragmentedContent) \ + V(ClipPathMismatch) \ + V(MaskMismatch) class PLATFORM_EXPORT SquashingDisallowedReason { private:
diff --git a/third_party/WebKit/Source/platform/graphics/SurfaceLayerBridge.cpp b/third_party/WebKit/Source/platform/graphics/SurfaceLayerBridge.cpp index 65807a6..56ad576 100644 --- a/third_party/WebKit/Source/platform/graphics/SurfaceLayerBridge.cpp +++ b/third_party/WebKit/Source/platform/graphics/SurfaceLayerBridge.cpp
@@ -60,7 +60,7 @@ void SurfaceLayerBridge::OnFirstSurfaceActivation( const viz::SurfaceInfo& surface_info) { if (!current_surface_id_.is_valid() && surface_info.is_valid()) { - // First time a SurfaceId is received + // First time a SurfaceId is received. current_surface_id_ = surface_info.id(); if (web_layer_) { if (observer_) @@ -83,7 +83,7 @@ observer_->RegisterContentsLayer(web_layer_.get()); } else if (current_surface_id_ != surface_info.id()) { // A different SurfaceId is received, prompting change to existing - // SurfaceLayer + // SurfaceLayer. current_surface_id_ = surface_info.id(); cc::SurfaceLayer* surface_layer = static_cast<cc::SurfaceLayer*>(cc_layer_.get()); @@ -92,8 +92,11 @@ surface_layer->SetFallbackSurfaceId(surface_info.id()); } - if (observer_) + if (observer_) { observer_->OnWebLayerUpdated(); + observer_->OnSurfaceIdUpdated(surface_info.id()); + } + cc_layer_->SetBounds(surface_info.size_in_pixels()); }
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayer.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayer.cpp index 1d9ad96..6e331e92 100644 --- a/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayer.cpp +++ b/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayer.cpp
@@ -19,13 +19,6 @@ namespace { -void AppendRestore(cc::DisplayItemList& list, size_t n) { - list.StartPaint(); - while (n--) - list.push<cc::RestoreOp>(); - list.EndPaintOfPairedEnd(); -} - class ConversionContext { public: ConversionContext(const PropertyTreeState& layer_state, @@ -115,6 +108,25 @@ // The current effect will change to the target effect. void SwitchToEffect(const EffectPaintPropertyNode*); + // Applies combined transform from current_transform_ to the target + // transform. + void ApplyTransform(const TransformPaintPropertyNode* target_transform) { + if (target_transform == current_transform_) + return; + + cc_list_.push<cc::ConcatOp>( + static_cast<SkMatrix>(TransformationMatrix::ToSkMatrix44( + GeometryMapper::SourceToDestinationProjection( + target_transform, current_transform_)))); + } + + void AppendRestore(size_t n) { + cc_list_.StartPaint(); + while (n--) + cc_list_.push<cc::RestoreOp>(); + cc_list_.EndPaintOfPairedEnd(); + } + const PropertyTreeState& layer_state_; gfx::Vector2dF layer_offset_; @@ -129,8 +141,8 @@ // applying the last paired begin. struct StateEntry { // Remembers the type of paired begin that caused a state to be saved. - // This is useful for emitting corresponding paired end. - enum class PairedType { kClip, kEffect } type; + // This is for checking integrity of the algorithm. + enum PairedType { kClip, kEffect } type; int saved_count; const TransformPaintPropertyNode* transform; @@ -144,7 +156,7 @@ ConversionContext::~ConversionContext() { for (auto& entry : state_stack_) - AppendRestore(cc_list_, entry.saved_count); + AppendRestore(entry.saved_count); } void ConversionContext::SwitchToClip(const ClipPaintPropertyNode* target_clip) { @@ -156,24 +168,32 @@ &LowestCommonAncestor(*target_clip, *current_clip_); while (current_clip_ != lca_clip) { #if DCHECK_IS_ON() - DCHECK(state_stack_.size() && - state_stack_.back().type == StateEntry::PairedType::kClip) + DCHECK(state_stack_.size() && state_stack_.back().type == StateEntry::kClip) << "Error: Chunk has a clip that escaped its layer's or effect's clip." << "\ntarget_clip:\n" << target_clip->ToTreeString().Utf8().data() << "current_clip_:\n" << current_clip_->ToTreeString().Utf8().data(); #endif - if (!state_stack_.size() || - state_stack_.back().type != StateEntry::PairedType::kClip) + if (!state_stack_.size() || state_stack_.back().type != StateEntry::kClip) break; + current_clip_ = current_clip_->Parent(); StateEntry& previous_state = state_stack_.back(); - AppendRestore(cc_list_, previous_state.saved_count); - current_transform_ = previous_state.transform; - current_clip_ = previous_state.clip; - DCHECK_EQ(previous_state.effect, current_effect_); - state_stack_.pop_back(); + if (current_clip_ == lca_clip) { + // |lca_clip| is an intermediate clip in a series of combined clips. + // Jump to the first of the combined clips. + current_clip_ = lca_clip = previous_state.clip; + } + if (current_clip_ == previous_state.clip) { + AppendRestore(previous_state.saved_count); + current_transform_ = previous_state.transform; + DCHECK_EQ(previous_state.effect, current_effect_); + state_stack_.pop_back(); + } } + if (target_clip == current_clip_) + return; + // Step 2: Collect all clips between the target clip and the current clip. // At this point the current clip must be an ancestor of the target. Vector<const ClipPaintPropertyNode*, 1u> pending_clips; @@ -186,21 +206,54 @@ } // Step 3: Now apply the list of clips in top-down order. - for (size_t i = pending_clips.size(); i--;) { - const ClipPaintPropertyNode* sub_clip = pending_clips[i]; - DCHECK_EQ(current_clip_, sub_clip->Parent()); - - // Step 3a: Switch CTM to the clip's local space then apply clip. + Optional<FloatRect> pending_combined_clip_rect; + const ClipPaintPropertyNode* last_pending_combined_clip; + auto apply_pending_combined_clip_rect = [this, &pending_combined_clip_rect, + &last_pending_combined_clip]() { + if (!pending_combined_clip_rect) + return; + DCHECK(last_pending_combined_clip); cc_list_.StartPaint(); cc_list_.push<cc::SaveOp>(); - const TransformPaintPropertyNode* target_transform = - sub_clip->LocalTransformSpace(); - if (current_transform_ != target_transform) { - cc_list_.push<cc::ConcatOp>( - static_cast<SkMatrix>(TransformationMatrix::ToSkMatrix44( - GeometryMapper::SourceToDestinationProjection( - target_transform, current_transform_)))); + ApplyTransform(last_pending_combined_clip->LocalTransformSpace()); + cc_list_.push<cc::ClipRectOp>( + static_cast<SkRect>(*pending_combined_clip_rect), SkClipOp::kIntersect, + false); + + cc_list_.EndPaintOfPairedBegin(); + state_stack_.emplace_back(StateEntry{StateEntry::kClip, 1, + current_transform_, current_clip_, + current_effect_}); + current_clip_ = last_pending_combined_clip; + current_transform_ = last_pending_combined_clip->LocalTransformSpace(); + last_pending_combined_clip = nullptr; + pending_combined_clip_rect.reset(); + }; + + for (size_t i = pending_clips.size(); i--;) { + const auto* sub_clip = pending_clips[i]; + bool has_rounded_clip_or_clip_path = + sub_clip->ClipRect().IsRounded() || sub_clip->ClipPath(); + if (!has_rounded_clip_or_clip_path && pending_combined_clip_rect && + sub_clip->Parent()->LocalTransformSpace() == + sub_clip->LocalTransformSpace()) { + // Continue to combine rectangular clips in the same transform space. + pending_combined_clip_rect->Intersect(sub_clip->ClipRect().Rect()); + last_pending_combined_clip = sub_clip; + continue; } + + apply_pending_combined_clip_rect(); + + if (!has_rounded_clip_or_clip_path) { + pending_combined_clip_rect = sub_clip->ClipRect().Rect(); + last_pending_combined_clip = sub_clip; + continue; + } + + cc_list_.StartPaint(); + cc_list_.push<cc::SaveOp>(); + ApplyTransform(sub_clip->LocalTransformSpace()); cc_list_.push<cc::ClipRectOp>( static_cast<SkRect>(sub_clip->ClipRect().Rect()), SkClipOp::kIntersect, false); @@ -213,14 +266,15 @@ SkClipOp::kIntersect, true); } cc_list_.EndPaintOfPairedBegin(); - - // Step 3b: Adjust state and push previous state onto clip stack. - state_stack_.emplace_back(StateEntry{StateEntry::PairedType::kClip, 1, + state_stack_.emplace_back(StateEntry{StateEntry::kClip, 1, current_transform_, current_clip_, current_effect_}); - current_transform_ = target_transform; current_clip_ = sub_clip; + current_transform_ = sub_clip->LocalTransformSpace(); } + + apply_pending_combined_clip_rect(); + DCHECK_EQ(current_clip_, target_clip); } void ConversionContext::SwitchToEffect( @@ -243,7 +297,7 @@ break; StateEntry& previous_state = state_stack_.back(); - AppendRestore(cc_list_, previous_state.saved_count); + AppendRestore(previous_state.saved_count); current_transform_ = previous_state.transform; current_clip_ = previous_state.clip; current_effect_ = previous_state.effect; @@ -272,13 +326,13 @@ SwitchToClip(sub_effect->OutputClip()); } else { while (state_stack_.size() && - state_stack_.back().type == StateEntry::PairedType::kClip) { + state_stack_.back().type == StateEntry::kClip) { StateEntry& previous_state = state_stack_.back(); + AppendRestore(previous_state.saved_count); current_transform_ = previous_state.transform; current_clip_ = previous_state.clip; DCHECK_EQ(previous_state.effect, current_effect_); state_stack_.pop_back(); - AppendRestore(cc_list_, 1); } } @@ -313,10 +367,7 @@ sub_effect->LocalTransformSpace(); if (current_transform_ != target_transform) { save_layer_once(); - cc_list_.push<cc::ConcatOp>( - static_cast<SkMatrix>(TransformationMatrix::ToSkMatrix44( - GeometryMapper::SourceToDestinationProjection( - target_transform, current_transform_)))); + ApplyTransform(target_transform); } if (sub_effect->Filter().IsEmpty()) { @@ -391,10 +442,7 @@ transformed = true; cc_list_.StartPaint(); cc_list_.push<cc::SaveOp>(); - cc_list_.push<cc::ConcatOp>( - static_cast<SkMatrix>(TransformationMatrix::ToSkMatrix44( - GeometryMapper::SourceToDestinationProjection( - chunk_state.Transform(), current_transform_)))); + ApplyTransform(chunk_state.Transform()); cc_list_.EndPaintOfPairedBegin(); } properties_adjusted = true; @@ -423,10 +471,10 @@ FloatRect(item.VisualRect()), chunk, layer_state_, layer_offset_)); } if (transformed) - AppendRestore(cc_list_, 1); + AppendRestore(1); } if (translated) - AppendRestore(cc_list_, 1); + AppendRestore(1); } } // unnamed namespace
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayerTest.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayerTest.cpp index caf5255..7d3941c 100644 --- a/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayerTest.cpp +++ b/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayerTest.cpp
@@ -8,6 +8,7 @@ #include "cc/paint/display_item_list.h" #include "cc/paint/paint_op_buffer.h" +#include "platform/graphics/LoggingCanvas.h" #include "platform/graphics/paint/ClipPaintPropertyNode.h" #include "platform/graphics/paint/DisplayItemList.h" #include "platform/graphics/paint/DrawingDisplayItem.h" @@ -20,6 +21,13 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +namespace cc { +std::ostream& operator<<(std::ostream& os, const PaintRecord& record) { + return os << "PaintRecord(" + << blink::RecordAsDebugString(record).Utf8().data() << ")"; +} +} // namespace cc + namespace blink { namespace { @@ -54,6 +62,7 @@ switch (op) { case cc::PaintOpType::ClipPath: case cc::PaintOpType::ClipRect: + case cc::PaintOpType::ClipRRect: case cc::PaintOpType::Concat: case cc::PaintOpType::DrawRecord: case cc::PaintOpType::Save: @@ -173,12 +182,11 @@ gfx::Vector2dF(), chunks.items, cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) ->ReleaseAsRecord(); - EXPECT_THAT( - output, - Pointee(PaintRecordMatcher::Make({cc::PaintOpType::SaveLayer, // <e1> - cc::PaintOpType::DrawRecord, // <p0/> - cc::PaintOpType::DrawRecord, // <p1/> - cc::PaintOpType::Restore}))); // </e1> + EXPECT_THAT(*output, + PaintRecordMatcher::Make({cc::PaintOpType::SaveLayer, // <e1> + cc::PaintOpType::DrawRecord, // <p0/> + cc::PaintOpType::DrawRecord, // <p1/> + cc::PaintOpType::Restore})); // </e1> } TEST_F(PaintChunksToCcLayerTest, EffectGroupingNested) { @@ -199,16 +207,15 @@ gfx::Vector2dF(), chunks.items, cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) ->ReleaseAsRecord(); - EXPECT_THAT( - output, - Pointee(PaintRecordMatcher::Make({cc::PaintOpType::SaveLayer, // <e1> - cc::PaintOpType::SaveLayer, // <e2> - cc::PaintOpType::DrawRecord, // <p0/> - cc::PaintOpType::Restore, // </e2> - cc::PaintOpType::SaveLayer, // <e3> - cc::PaintOpType::DrawRecord, // <p1/> - cc::PaintOpType::Restore, // </e3> - cc::PaintOpType::Restore}))); // </e1> + EXPECT_THAT(*output, + PaintRecordMatcher::Make({cc::PaintOpType::SaveLayer, // <e1> + cc::PaintOpType::SaveLayer, // <e2> + cc::PaintOpType::DrawRecord, // <p0/> + cc::PaintOpType::Restore, // </e2> + cc::PaintOpType::SaveLayer, // <e3> + cc::PaintOpType::DrawRecord, // <p1/> + cc::PaintOpType::Restore, // </e3> + cc::PaintOpType::Restore})); // </e1> } TEST_F(PaintChunksToCcLayerTest, InterleavedClipEffect) { @@ -232,6 +239,7 @@ e1.get(), t0(), c4.get(), ColorFilter(), CompositorFilterOperations(), 0.5f, SkBlendMode::kSrcOver); TestChunks chunks; + chunks.AddChunk(t0(), c2.get(), e0()); chunks.AddChunk(t0(), c3.get(), e0()); chunks.AddChunk(t0(), c4.get(), e2.get()); chunks.AddChunk(t0(), c3.get(), e1.get()); @@ -244,30 +252,27 @@ cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) ->ReleaseAsRecord(); EXPECT_THAT( - output, - Pointee(PaintRecordMatcher::Make( - {cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c1> - cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c2> - cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c3> + *output, + PaintRecordMatcher::Make( + {cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c1+c2> cc::PaintOpType::DrawRecord, // <p0/> + cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c3> + cc::PaintOpType::DrawRecord, // <p1/> cc::PaintOpType::Restore, // </c3> cc::PaintOpType::SaveLayer, // <e1> - cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c3> - cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c4> + cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c3+c4> cc::PaintOpType::SaveLayer, // <e2> - cc::PaintOpType::DrawRecord, // <p1/> - cc::PaintOpType::Restore, // </e2> - cc::PaintOpType::Restore, // </c4> cc::PaintOpType::DrawRecord, // <p2/> + cc::PaintOpType::Restore, // </e2> + cc::PaintOpType::Restore, // </c3+c4> + cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c3> + cc::PaintOpType::DrawRecord, // <p3/> cc::PaintOpType::Restore, // </c3> cc::PaintOpType::Restore, // </e1> - cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c3> - cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c4> - cc::PaintOpType::DrawRecord, // <p3/> - cc::PaintOpType::Restore, // </c4> - cc::PaintOpType::Restore, // </c3> - cc::PaintOpType::Restore, // </c2> - cc::PaintOpType::Restore}))); // </c1> + cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c3+c4> + cc::PaintOpType::DrawRecord, // <p4/> + cc::PaintOpType::Restore, // </c3+c4> + cc::PaintOpType::Restore})); // </c1+c2> } TEST_F(PaintChunksToCcLayerTest, ClipSpaceInversion) { @@ -290,14 +295,14 @@ gfx::Vector2dF(), chunks.items, cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) ->ReleaseAsRecord(); - EXPECT_THAT(output, - Pointee(PaintRecordMatcher::Make( + EXPECT_THAT(*output, + PaintRecordMatcher::Make( {cc::PaintOpType::Save, cc::PaintOpType::Concat, // <t1 cc::PaintOpType::ClipRect, // c1> cc::PaintOpType::Save, cc::PaintOpType::Concat, // <t1^-1> cc::PaintOpType::DrawRecord, // <p0/> cc::PaintOpType::Restore, // </t1^-1> - cc::PaintOpType::Restore}))); // </c1 t1> + cc::PaintOpType::Restore})); // </c1 t1> } TEST_F(PaintChunksToCcLayerTest, EffectSpaceInversion) { @@ -325,13 +330,13 @@ cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) ->ReleaseAsRecord(); EXPECT_THAT( - output, - Pointee(PaintRecordMatcher::Make( + *output, + PaintRecordMatcher::Make( {cc::PaintOpType::SaveLayer, cc::PaintOpType::Concat, // <t1 e1> cc::PaintOpType::Save, cc::PaintOpType::Concat, // <t1^-1> cc::PaintOpType::DrawRecord, // <p0/> cc::PaintOpType::Restore, // </t1^-1> - cc::PaintOpType::Restore}))); // </e1 t1> + cc::PaintOpType::Restore})); // </e1 t1> } TEST_F(PaintChunksToCcLayerTest, NonRootLayerSimple) { @@ -353,8 +358,7 @@ PropertyTreeState(t1.get(), c1.get(), e1.get()), gfx::Vector2dF(), chunks.items, cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) ->ReleaseAsRecord(); - EXPECT_THAT(output, - Pointee(PaintRecordMatcher::Make({cc::PaintOpType::DrawRecord}))); + EXPECT_THAT(*output, PaintRecordMatcher::Make({cc::PaintOpType::DrawRecord})); } TEST_F(PaintChunksToCcLayerTest, NonRootLayerTransformEscape) { @@ -376,11 +380,11 @@ PropertyTreeState(t1.get(), c1.get(), e1.get()), gfx::Vector2dF(), chunks.items, cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) ->ReleaseAsRecord(); - EXPECT_THAT(output, - Pointee(PaintRecordMatcher::Make( + EXPECT_THAT(*output, + PaintRecordMatcher::Make( {cc::PaintOpType::Save, cc::PaintOpType::Concat, // <t1^-1> cc::PaintOpType::DrawRecord, // <p0/> - cc::PaintOpType::Restore}))); // </t1^-1> + cc::PaintOpType::Restore})); // </t1^-1> } TEST_F(PaintChunksToCcLayerTest, EffectWithNoOutputClip) { @@ -402,13 +406,13 @@ gfx::Vector2dF(), chunks.items, cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) ->ReleaseAsRecord(); - EXPECT_THAT(output, - Pointee(PaintRecordMatcher::Make( - {cc::PaintOpType::SaveLayer, // <e1> - cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c2> - cc::PaintOpType::DrawRecord, // <p0/> - cc::PaintOpType::Restore, // </c2> - cc::PaintOpType::Restore}))); // </e1> + EXPECT_THAT(*output, + PaintRecordMatcher::Make({cc::PaintOpType::SaveLayer, // <e1> + cc::PaintOpType::Save, + cc::PaintOpType::ClipRect, // <c2> + cc::PaintOpType::DrawRecord, // <p0/> + cc::PaintOpType::Restore, // </c2> + cc::PaintOpType::Restore})); // </e1> } TEST_F(PaintChunksToCcLayerTest, @@ -431,15 +435,15 @@ gfx::Vector2dF(), chunks.items, cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) ->ReleaseAsRecord(); - EXPECT_THAT(output, - Pointee(PaintRecordMatcher::Make( - {cc::PaintOpType::SaveLayer, // <e1> - cc::PaintOpType::SaveLayer, // <e2> - cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c1> - cc::PaintOpType::DrawRecord, // <p0/> - cc::PaintOpType::Restore, // </c1> - cc::PaintOpType::Restore, // </e2> - cc::PaintOpType::Restore}))); // </e1> + EXPECT_THAT(*output, + PaintRecordMatcher::Make({cc::PaintOpType::SaveLayer, // <e1> + cc::PaintOpType::SaveLayer, // <e2> + cc::PaintOpType::Save, + cc::PaintOpType::ClipRect, // <c1> + cc::PaintOpType::DrawRecord, // <p0/> + cc::PaintOpType::Restore, // </c1> + cc::PaintOpType::Restore, // </e2> + cc::PaintOpType::Restore})); // </e1> } TEST_F(PaintChunksToCcLayerTest, @@ -462,13 +466,13 @@ gfx::Vector2dF(), chunks.items, cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) ->ReleaseAsRecord(); - EXPECT_THAT(output, - Pointee(PaintRecordMatcher::Make( - {cc::PaintOpType::SaveLayer, // <e2> - cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c1> - cc::PaintOpType::DrawRecord, // <p0/> - cc::PaintOpType::Restore, // </c1> - cc::PaintOpType::Restore}))); // </e2> + EXPECT_THAT(*output, + PaintRecordMatcher::Make({cc::PaintOpType::SaveLayer, // <e2> + cc::PaintOpType::Save, + cc::PaintOpType::ClipRect, // <c1> + cc::PaintOpType::DrawRecord, // <p0/> + cc::PaintOpType::Restore, // </c1> + cc::PaintOpType::Restore})); // </e2> } TEST_F(PaintChunksToCcLayerTest, @@ -491,11 +495,10 @@ gfx::Vector2dF(), chunks.items, cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) ->ReleaseAsRecord(); - EXPECT_THAT( - output, - Pointee(PaintRecordMatcher::Make({cc::PaintOpType::SaveLayer, // <e2> - cc::PaintOpType::DrawRecord, // <p0/> - cc::PaintOpType::Restore}))); // </e2> + EXPECT_THAT(*output, + PaintRecordMatcher::Make({cc::PaintOpType::SaveLayer, // <e2> + cc::PaintOpType::DrawRecord, // <p0/> + cc::PaintOpType::Restore})); // </e2> } TEST_F(PaintChunksToCcLayerTest, VisualRect) { @@ -516,15 +519,15 @@ gfx::Vector2dF(100, 200), chunks.items, *cc_list); EXPECT_EQ(gfx::Rect(-50, -100, 100, 100), cc_list->VisualRectForTesting(4)); - EXPECT_THAT(cc_list->ReleaseAsRecord(), - Pointee(PaintRecordMatcher::Make( - {cc::PaintOpType::Save, // - cc::PaintOpType::Translate, // <layer_offset> - cc::PaintOpType::Save, // - cc::PaintOpType::Concat, // <layer_transform> - cc::PaintOpType::DrawRecord, // <p0/> - cc::PaintOpType::Restore, // </layer_transform> - cc::PaintOpType::Restore}))); // </layer_offset> + EXPECT_THAT( + *cc_list->ReleaseAsRecord(), + PaintRecordMatcher::Make({cc::PaintOpType::Save, // + cc::PaintOpType::Translate, // <layer_offset> + cc::PaintOpType::Save, // + cc::PaintOpType::Concat, // <layer_transform> + cc::PaintOpType::DrawRecord, // <p0/> + cc::PaintOpType::Restore, // </layer_transform> + cc::PaintOpType::Restore})); // </layer_offset> } TEST_F(PaintChunksToCcLayerTest, NoncompositedClipPath) { @@ -542,13 +545,13 @@ PropertyTreeState(t0(), c0(), e0()), gfx::Vector2dF(), chunks.items, *cc_list); - EXPECT_THAT(cc_list->ReleaseAsRecord(), - Pointee(PaintRecordMatcher::Make( - {cc::PaintOpType::Save, // - cc::PaintOpType::ClipRect, // - cc::PaintOpType::ClipPath, // <clip_path> - cc::PaintOpType::DrawRecord, // <p0/> - cc::PaintOpType::Restore}))); // </clip_path> + EXPECT_THAT( + *cc_list->ReleaseAsRecord(), + PaintRecordMatcher::Make({cc::PaintOpType::Save, // + cc::PaintOpType::ClipRect, // + cc::PaintOpType::ClipPath, // <clip_path> + cc::PaintOpType::DrawRecord, // <p0/> + cc::PaintOpType::Restore})); // </clip_path> } TEST_F(PaintChunksToCcLayerTest, EmptyClipsAreElided) { @@ -576,12 +579,12 @@ ->ReleaseAsRecord(); // Note that c1 and c1c2 are elided. - EXPECT_THAT(output, Pointee(PaintRecordMatcher::Make({ - cc::PaintOpType::Save, // - cc::PaintOpType::ClipRect, // <c2> - cc::PaintOpType::DrawRecord, // D1 - cc::PaintOpType::Restore, // </c2> - }))); + EXPECT_THAT(*output, PaintRecordMatcher::Make({ + cc::PaintOpType::Save, // + cc::PaintOpType::ClipRect, // <c2> + cc::PaintOpType::DrawRecord, // D1 + cc::PaintOpType::Restore, // </c2> + })); } TEST_F(PaintChunksToCcLayerTest, NonEmptyClipsAreStored) { @@ -609,19 +612,15 @@ cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) ->ReleaseAsRecord(); - EXPECT_THAT(output, Pointee(PaintRecordMatcher::Make({ - cc::PaintOpType::Save, // - cc::PaintOpType::ClipRect, // <c1> - cc::PaintOpType::Save, // - cc::PaintOpType::ClipRect, // <c2> - cc::PaintOpType::DrawRecord, // D1 - cc::PaintOpType::Restore, // </c2> - cc::PaintOpType::Restore, // </c1> - cc::PaintOpType::Save, // - cc::PaintOpType::ClipRect, // <c2> - cc::PaintOpType::DrawRecord, // D2 - cc::PaintOpType::Restore, // </c2> - }))); + EXPECT_THAT(*output, + PaintRecordMatcher::Make({ + cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c1+c2> + cc::PaintOpType::DrawRecord, // D1 + cc::PaintOpType::Restore, // </c1+c2> + cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c2> + cc::PaintOpType::DrawRecord, // D2 + cc::PaintOpType::Restore, // </c2> + })); } TEST_F(PaintChunksToCcLayerTest, EmptyEffectsAreStored) { @@ -640,10 +639,56 @@ cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) ->ReleaseAsRecord(); - EXPECT_THAT(output, Pointee(PaintRecordMatcher::Make({ - cc::PaintOpType::SaveLayer, // <e1> - cc::PaintOpType::Restore, // </e1> - }))); + EXPECT_THAT(*output, PaintRecordMatcher::Make({ + cc::PaintOpType::SaveLayer, // <e1> + cc::PaintOpType::Restore, // </e1> + })); +} + +TEST_F(PaintChunksToCcLayerTest, CombineClips) { + FloatRoundedRect clip_rect(0, 0, 100, 100); + FloatSize corner(5, 5); + FloatRoundedRect rounded_clip_rect(clip_rect.Rect(), corner, corner, corner, + corner); + auto t1 = TransformPaintPropertyNode::Create( + t0(), TransformationMatrix().Scale(2.f), FloatPoint3D()); + auto c1 = ClipPaintPropertyNode::Create(c0(), t0(), clip_rect); + auto c2 = ClipPaintPropertyNode::Create(c1.get(), t0(), clip_rect); + auto c3 = ClipPaintPropertyNode::Create(c2.get(), t1.get(), clip_rect); + auto c4 = ClipPaintPropertyNode::Create(c3.get(), t1.get(), clip_rect); + auto c5 = + ClipPaintPropertyNode::Create(c4.get(), t1.get(), rounded_clip_rect); + auto c6 = ClipPaintPropertyNode::Create(c5.get(), t1.get(), clip_rect); + + TestChunks chunks; + chunks.AddChunk(t1.get(), c6.get(), e0()); + chunks.AddChunk(t1.get(), c3.get(), e0()); + + sk_sp<PaintRecord> output = + PaintChunksToCcLayer::Convert( + chunks.GetChunkList(), PropertyTreeState(t0(), c0(), e0()), + gfx::Vector2dF(), chunks.items, + cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) + ->ReleaseAsRecord(); + + EXPECT_THAT( + *output, + PaintRecordMatcher::Make( + {cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c1+c2> + cc::PaintOpType::Save, cc::PaintOpType::Concat, // <t1 + cc::PaintOpType::ClipRect, // c3+c4> + cc::PaintOpType::Save, cc::PaintOpType::ClipRect, + cc::PaintOpType::ClipRRect, // <c5> + cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c6> + cc::PaintOpType::DrawRecord, // <p0/> + cc::PaintOpType::Restore, // </c6> + cc::PaintOpType::Restore, // </c5> + cc::PaintOpType::Restore, // </c3+c4 t1> + cc::PaintOpType::Save, cc::PaintOpType::Concat, // <t1 + cc::PaintOpType::ClipRect, // c3> + cc::PaintOpType::DrawRecord, // <p1/> + cc::PaintOpType::Restore, // </c3 t1> + cc::PaintOpType::Restore})); // </c1+c2> } } // namespace
diff --git a/third_party/WebKit/Source/platform/scheduler/BUILD.gn b/third_party/WebKit/Source/platform/scheduler/BUILD.gn index 371cc52..6d32867b3 100644 --- a/third_party/WebKit/Source/platform/scheduler/BUILD.gn +++ b/third_party/WebKit/Source/platform/scheduler/BUILD.gn
@@ -45,6 +45,7 @@ "child/compositor_metrics_helper.h", "child/compositor_worker_scheduler.cc", "child/compositor_worker_scheduler.h", + "child/default_params.h", "child/features.h", "child/idle_canceled_delayed_task_sweeper.cc", "child/idle_canceled_delayed_task_sweeper.h", @@ -77,6 +78,8 @@ "child/worker_scheduler_helper.h", "child/worker_scheduler_impl.cc", "child/worker_scheduler_impl.h", + "child/worker_scheduler_proxy.cc", + "child/worker_scheduler_proxy.h", "child/worker_task_queue.cc", "child/worker_task_queue.h", "renderer/auto_advancing_virtual_time_domain.cc", @@ -194,6 +197,7 @@ "child/webthread_impl_for_worker_scheduler_unittest.cc", "child/worker_global_scope_scheduler_unittest.cc", "child/worker_scheduler_impl_unittest.cc", + "child/worker_scheduler_proxy_unittest.cc", "renderer/auto_advancing_virtual_time_domain_unittest.cc", "renderer/budget_pool_unittest.cc", "renderer/deadline_task_runner_unittest.cc",
diff --git a/third_party/WebKit/Source/platform/scheduler/child/default_params.h b/third_party/WebKit/Source/platform/scheduler/child/default_params.h new file mode 100644 index 0000000..6b958fc --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/child/default_params.h
@@ -0,0 +1,19 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_DEFAULT_PARAMS_H_ +#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_DEFAULT_PARAMS_H_ + +#include "platform/scheduler/child/page_visibility_state.h" + +namespace blink { +namespace scheduler { + +constexpr PageVisibilityState kDefaultPageVisibility = + PageVisibilityState::kVisible; + +} // namespace scheduler +} // namespace blink + +#endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_DEFAULT_PARAMS_H_
diff --git a/third_party/WebKit/Source/platform/scheduler/child/page_visibility_state.h b/third_party/WebKit/Source/platform/scheduler/child/page_visibility_state.h new file mode 100644 index 0000000..71fcee3 --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/child/page_visibility_state.h
@@ -0,0 +1,16 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_PAGE_VISIBILITY_STATE_H_ +#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_PAGE_VISIBILITY_STATE_H_ + +namespace blink { +namespace scheduler { + +enum class PageVisibilityState { kVisible, kHidden }; + +} // namespace scheduler +} // namespace blink + +#endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_PAGE_VISIBILITY_STATE_H_
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_global_scope_scheduler_unittest.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_global_scope_scheduler_unittest.cc index 25caa00..2b67ed1 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/worker_global_scope_scheduler_unittest.cc +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_global_scope_scheduler_unittest.cc
@@ -32,9 +32,8 @@ WorkerGlobalScopeSchedulerTest() : mock_task_runner_(new base::TestSimpleTaskRunner()), scheduler_(new WorkerSchedulerImpl( - CreateTaskQueueManagerForTest(nullptr, - mock_task_runner_, - &clock_))) { + CreateTaskQueueManagerForTest(nullptr, mock_task_runner_, &clock_), + nullptr /* proxy */)) { clock_.Advance(base::TimeDelta::FromMicroseconds(5000)); }
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.cc index 2178caf9..cd7755dc 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.cc +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.cc
@@ -20,8 +20,9 @@ // static std::unique_ptr<WorkerScheduler> WorkerScheduler::Create() { - return base::WrapUnique( - new WorkerSchedulerImpl(TaskQueueManager::TakeOverCurrentThread())); + // TODO(altimin): Plumb WorkerSchedulerProxy to the constructor. + return base::WrapUnique(new WorkerSchedulerImpl( + TaskQueueManager::TakeOverCurrentThread(), nullptr /* proxy */)); } scoped_refptr<WorkerTaskQueue> WorkerScheduler::CreateTaskRunner() {
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc index 3ddbefb5..3aa6896 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc
@@ -14,7 +14,9 @@ #include "platform/Histogram.h" #include "platform/scheduler/base/task_queue.h" #include "platform/scheduler/base/task_queue_manager.h" +#include "platform/scheduler/child/default_params.h" #include "platform/scheduler/child/worker_scheduler_helper.h" +#include "platform/scheduler/child/worker_scheduler_proxy.h" namespace blink { namespace scheduler { @@ -44,7 +46,8 @@ } // namespace WorkerSchedulerImpl::WorkerSchedulerImpl( - std::unique_ptr<TaskQueueManager> task_queue_manager) + std::unique_ptr<TaskQueueManager> task_queue_manager, + WorkerSchedulerProxy* proxy) : WorkerScheduler( std::make_unique<WorkerSchedulerHelper>(std::move(task_queue_manager), this)), @@ -57,11 +60,18 @@ idle_helper_.IdleTaskRunner()), load_tracker_(helper_->NowTicks(), base::Bind(&ReportWorkerTaskLoad), - kUnspecifiedWorkerThreadLoadTrackerReportingInterval) { - initialized_ = false; + kUnspecifiedWorkerThreadLoadTrackerReportingInterval), + throttling_state_( + proxy ? proxy->throttling_state() + : WebFrameScheduler::ThrottlingState::kNotThrottled), + weak_factory_(this) { thread_start_time_ = helper_->NowTicks(); load_tracker_.Resume(thread_start_time_); helper_->AddTaskTimeObserver(this); + + if (proxy) + proxy->OnWorkerSchedulerCreated(this); + TRACE_EVENT_OBJECT_CREATED_WITH_ID( TRACE_DISABLED_BY_DEFAULT("worker.scheduler"), "WorkerScheduler", this); } @@ -69,6 +79,7 @@ WorkerSchedulerImpl::~WorkerSchedulerImpl() { TRACE_EVENT_OBJECT_DELETED_WITH_ID( TRACE_DISABLED_BY_DEFAULT("worker.scheduler"), "WorkerScheduler", this); + helper_->RemoveTaskTimeObserver(this); } @@ -174,5 +185,18 @@ worker_metrics_helper_.SetThreadType(thread_type); } +void WorkerSchedulerImpl::OnThrottlingStateChanged( + WebFrameScheduler::ThrottlingState throttling_state) { + throttling_state_ = throttling_state; +} + +scoped_refptr<WorkerTaskQueue> WorkerSchedulerImpl::ControlTaskQueue() { + return helper_->ControlWorkerTaskQueue(); +} + +base::WeakPtr<WorkerSchedulerImpl> WorkerSchedulerImpl::GetWeakPtr() { + return weak_factory_.GetWeakPtr(); +} + } // namespace scheduler } // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.h b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.h index 23b486c..03ad2a9 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.h +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.h
@@ -6,8 +6,10 @@ #define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_WORKER_SCHEDULER_IMPL_H_ #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop.h" #include "base/single_thread_task_runner.h" +#include "platform/WebFrameScheduler.h" #include "platform/scheduler/base/task_time_observer.h" #include "platform/scheduler/child/idle_canceled_delayed_task_sweeper.h" #include "platform/scheduler/child/idle_helper.h" @@ -21,13 +23,14 @@ namespace scheduler { class TaskQueueManager; +class WorkerSchedulerProxy; class PLATFORM_EXPORT WorkerSchedulerImpl : public WorkerScheduler, public IdleHelper::Delegate, public TaskTimeObserver { public: - explicit WorkerSchedulerImpl( - std::unique_ptr<TaskQueueManager> task_queue_manager); + WorkerSchedulerImpl(std::unique_ptr<TaskQueueManager> task_queue_manager, + WorkerSchedulerProxy* proxy); ~WorkerSchedulerImpl() override; // ChildScheduler implementation: @@ -59,6 +62,17 @@ void SetThreadType(WebThreadType thread_type) override; + // Virtual for test. + virtual void OnThrottlingStateChanged( + WebFrameScheduler::ThrottlingState throttling_state); + + // Returns the control task queue. Tasks posted to this queue are executed + // with the highest priority. Care must be taken to avoid starvation of other + // task queues. + scoped_refptr<WorkerTaskQueue> ControlTaskQueue(); + + base::WeakPtr<WorkerSchedulerImpl> GetWeakPtr(); + protected: // IdleHelper::Delegate implementation: bool CanEnterLongIdlePeriod( @@ -69,6 +83,10 @@ void OnIdlePeriodEnded() override {} void OnPendingTasksChanged(bool new_state) override {} + WebFrameScheduler::ThrottlingState throttling_state() const { + return throttling_state_; + } + private: void MaybeStartLongIdlePeriod(); @@ -77,9 +95,13 @@ ThreadLoadTracker load_tracker_; bool initialized_; base::TimeTicks thread_start_time_; + scoped_refptr<WorkerTaskQueue> control_task_queue_; + WebFrameScheduler::ThrottlingState throttling_state_; WorkerMetricsHelper worker_metrics_helper_; + base::WeakPtrFactory<WorkerSchedulerImpl> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(WorkerSchedulerImpl); };
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl_unittest.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl_unittest.cc index c33be5a..8fd2bb0 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl_unittest.cc +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl_unittest.cc
@@ -55,7 +55,7 @@ public: WorkerSchedulerImplForTest(std::unique_ptr<TaskQueueManager> manager, base::SimpleTestTickClock* clock_) - : WorkerSchedulerImpl(std::move(manager)), + : WorkerSchedulerImpl(std::move(manager), nullptr), clock_(clock_), timeline_(nullptr) {}
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_proxy.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_proxy.cc new file mode 100644 index 0000000..e19f637 --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_proxy.cc
@@ -0,0 +1,58 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "platform/scheduler/child/worker_scheduler_proxy.h" + +#include "platform/scheduler/child/worker_scheduler_impl.h" +#include "platform/scheduler/renderer/web_frame_scheduler_impl.h" + +namespace blink { +namespace scheduler { + +WorkerSchedulerProxy::WorkerSchedulerProxy(WebFrameScheduler* frame_scheduler) + : main_thread_ref_(base::PlatformThread::CurrentRef()) { + throttling_observer_ = frame_scheduler->AddThrottlingObserver( + WebFrameScheduler::ObserverType::kWorkerScheduler, this); +} + +WorkerSchedulerProxy::~WorkerSchedulerProxy() { + DCHECK(IsMainThread()); +} + +void WorkerSchedulerProxy::OnWorkerSchedulerCreated( + WorkerSchedulerImpl* worker_scheduler) { + DCHECK(!IsMainThread()) + << "OnWorkerSchedulerCreated should be called from the worker thread"; + DCHECK(!worker_scheduler_) << "OnWorkerSchedulerCreated is called twice"; + worker_scheduler_ = worker_scheduler->GetWeakPtr(); + worker_thread_task_runner_ = worker_scheduler->ControlTaskQueue(); + worker_thread_ref_ = base::PlatformThread::CurrentRef(); + initialized_ = true; +} + +void WorkerSchedulerProxy::OnThrottlingStateChanged( + WebFrameScheduler::ThrottlingState throttling_state) { + DCHECK(IsMainThread()); + if (throttling_state_ == throttling_state) + return; + throttling_state_ = throttling_state; + + if (!initialized_) + return; + + worker_thread_task_runner_->PostTask( + FROM_HERE, base::BindOnce(&WorkerSchedulerImpl::OnThrottlingStateChanged, + worker_scheduler_, throttling_state)); +} + +bool WorkerSchedulerProxy::IsMainThread() const { + return main_thread_ref_ == base::PlatformThread::CurrentRef(); +} + +bool WorkerSchedulerProxy::IsWorkerThread() const { + return worker_thread_ref_ == base::PlatformThread::CurrentRef(); +} + +} // namespace scheduler +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_proxy.h b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_proxy.h new file mode 100644 index 0000000..0c04679a --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_proxy.h
@@ -0,0 +1,72 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_WORKER_SCHEDULER_PROXY_H_ +#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_WORKER_SCHEDULER_PROXY_H_ + +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" +#include "base/single_thread_task_runner.h" +#include "platform/PlatformExport.h" +#include "platform/WebFrameScheduler.h" +#include "platform/scheduler/child/page_visibility_state.h" +#include "platform/wtf/ThreadSafeRefCounted.h" + +namespace blink { +namespace scheduler { +class WorkerSchedulerImpl; + +// Helper class for communication between frame scheduler (main thread) and +// worker scheduler (worker thread). +// +// It's owned by DedicatedWorkerThread and is created and destroyed +// on the main thread. It's passed to WorkerScheduler during its construction. +// Given that DedicatedWorkerThread object outlives worker thread, this class +// outlives worker thread too. +class PLATFORM_EXPORT WorkerSchedulerProxy + : public WebFrameScheduler::Observer { + public: + explicit WorkerSchedulerProxy(WebFrameScheduler* scheduler); + ~WorkerSchedulerProxy() override; + + void OnWorkerSchedulerCreated(WorkerSchedulerImpl* worker_scheduler); + + void OnThrottlingStateChanged( + WebFrameScheduler::ThrottlingState throttling_state) override; + + // Should be accessed only from the main thread or during init. + WebFrameScheduler::ThrottlingState throttling_state() const { + DCHECK(IsMainThread() || !initialized_); + return throttling_state_; + } + + private: + bool IsMainThread() const; + bool IsWorkerThread() const; + + base::PlatformThreadRef main_thread_ref_; + base::PlatformThreadRef worker_thread_ref_; + + // Can be accessed only from the worker thread. + base::WeakPtr<WorkerSchedulerImpl> worker_scheduler_; + + // Const after init on the worker thread. + scoped_refptr<base::SingleThreadTaskRunner> worker_thread_task_runner_; + + WebFrameScheduler::ThrottlingState throttling_state_ = + WebFrameScheduler::ThrottlingState::kNotThrottled; + + std::unique_ptr<WebFrameScheduler::ThrottlingObserverHandle> + throttling_observer_; + + bool initialized_ = false; + + DISALLOW_COPY_AND_ASSIGN(WorkerSchedulerProxy); +}; + +} // namespace scheduler +} // namespace blink + +#endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_WORKER_SCHEDULER_PROXY_H_
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_proxy_unittest.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_proxy_unittest.cc new file mode 100644 index 0000000..3516f5e --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_proxy_unittest.cc
@@ -0,0 +1,197 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "platform/scheduler/child/worker_scheduler_proxy.h" +#include "base/test/simple_test_tick_clock.h" +#include "components/viz/test/ordered_simple_task_runner.h" +#include "platform/WaitableEvent.h" +#include "platform/scheduler/child/webthread_impl_for_worker_scheduler.h" +#include "platform/scheduler/child/worker_scheduler_impl.h" +#include "platform/scheduler/renderer/renderer_scheduler_impl.h" +#include "platform/scheduler/renderer/web_frame_scheduler_impl.h" +#include "platform/scheduler/renderer/web_view_scheduler_impl.h" +#include "platform/scheduler/test/create_task_queue_manager_for_test.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { +namespace scheduler { + +namespace { + +class WorkerSchedulerImplForTest : public WorkerSchedulerImpl { + public: + WorkerSchedulerImplForTest(std::unique_ptr<TaskQueueManager> manager, + WorkerSchedulerProxy* proxy, + WaitableEvent* throtting_state_changed) + : WorkerSchedulerImpl(std::move(manager), proxy), + throtting_state_changed_(throtting_state_changed) {} + + void OnThrottlingStateChanged( + WebFrameScheduler::ThrottlingState throttling_state) override { + WorkerSchedulerImpl::OnThrottlingStateChanged(throttling_state); + + throtting_state_changed_->Signal(); + } + + using WorkerSchedulerImpl::throttling_state; + + private: + WaitableEvent* throtting_state_changed_; +}; + +class WebThreadImplForWorkerSchedulerForTest + : public WebThreadImplForWorkerScheduler { + public: + explicit WebThreadImplForWorkerSchedulerForTest( + WorkerSchedulerProxy* proxy, + WaitableEvent* throtting_state_changed) + : WebThreadImplForWorkerScheduler("Test Worker", base::Thread::Options()), + proxy_(proxy), + throtting_state_changed_(throtting_state_changed) {} + + std::unique_ptr<WorkerScheduler> CreateWorkerScheduler() override { + auto scheduler = std::make_unique<WorkerSchedulerImplForTest>( + TaskQueueManager::TakeOverCurrentThread(), proxy_, + throtting_state_changed_); + scheduler_ = scheduler.get(); + return scheduler; + } + + WorkerSchedulerImplForTest* GetWorkerScheduler() { return scheduler_; } + + private: + WorkerSchedulerProxy* proxy_; // NOW OWNED + WaitableEvent* throtting_state_changed_; // NOT OWNED + WorkerSchedulerImplForTest* scheduler_ = nullptr; // NOT OWNED +}; + +std::unique_ptr<WebThreadImplForWorkerSchedulerForTest> CreateWorkerThread( + WorkerSchedulerProxy* proxy, + WaitableEvent* throtting_state_changed) { + std::unique_ptr<WebThreadImplForWorkerSchedulerForTest> thread = + std::make_unique<WebThreadImplForWorkerSchedulerForTest>( + proxy, throtting_state_changed); + thread->Init(); + return thread; +} + +} // namespace + +class WorkerSchedulerProxyTest : public ::testing::Test { + public: + WorkerSchedulerProxyTest() + : mock_main_thread_task_runner_( + new cc::OrderedSimpleTaskRunner(&clock_, true)), + renderer_scheduler_(std::make_unique<RendererSchedulerImpl>( + CreateTaskQueueManagerForTest(nullptr, + mock_main_thread_task_runner_, + &clock_), + base::nullopt)), + web_view_scheduler_( + std::make_unique<WebViewSchedulerImpl>(nullptr, + nullptr, + renderer_scheduler_.get(), + false)), + frame_scheduler_(web_view_scheduler_->CreateWebFrameSchedulerImpl( + nullptr, + WebFrameScheduler::FrameType::kMainFrame)) {} + + ~WorkerSchedulerProxyTest() { + frame_scheduler_.reset(); + web_view_scheduler_.reset(); + renderer_scheduler_->Shutdown(); + } + + protected: + base::SimpleTestTickClock clock_; + scoped_refptr<cc::OrderedSimpleTaskRunner> mock_main_thread_task_runner_; + + std::unique_ptr<RendererSchedulerImpl> renderer_scheduler_; + std::unique_ptr<WebViewSchedulerImpl> web_view_scheduler_; + std::unique_ptr<WebFrameSchedulerImpl> frame_scheduler_; +}; + +TEST_F(WorkerSchedulerProxyTest, VisibilitySignalReceived) { + WaitableEvent throtting_state_changed; + + std::unique_ptr<WorkerSchedulerProxy> proxy = + std::make_unique<WorkerSchedulerProxy>(frame_scheduler_.get()); + + auto worker_thread = + CreateWorkerThread(proxy.get(), &throtting_state_changed); + + DCHECK(worker_thread->GetWorkerScheduler()->throttling_state() == + WebFrameScheduler::ThrottlingState::kNotThrottled); + + frame_scheduler_->SetPageVisible(false); + throtting_state_changed.Wait(); + DCHECK(worker_thread->GetWorkerScheduler()->throttling_state() == + WebFrameScheduler::ThrottlingState::kThrottled); + + frame_scheduler_->SetPageVisible(true); + throtting_state_changed.Wait(); + DCHECK(worker_thread->GetWorkerScheduler()->throttling_state() == + WebFrameScheduler::ThrottlingState::kNotThrottled); + + mock_main_thread_task_runner_->RunUntilIdle(); +} + +// Tests below check that no crashes occur during different shutdown sequences. + +TEST_F(WorkerSchedulerProxyTest, FrameSchedulerDestroyed) { + WaitableEvent throtting_state_changed; + + std::unique_ptr<WorkerSchedulerProxy> proxy = + std::make_unique<WorkerSchedulerProxy>(frame_scheduler_.get()); + + auto worker_thread = + CreateWorkerThread(proxy.get(), &throtting_state_changed); + + DCHECK(worker_thread->GetWorkerScheduler()->throttling_state() == + WebFrameScheduler::ThrottlingState::kNotThrottled); + + frame_scheduler_->SetPageVisible(false); + throtting_state_changed.Wait(); + DCHECK(worker_thread->GetWorkerScheduler()->throttling_state() == + WebFrameScheduler::ThrottlingState::kThrottled); + + frame_scheduler_.reset(); + mock_main_thread_task_runner_->RunUntilIdle(); + + worker_thread.reset(); + proxy.reset(); + mock_main_thread_task_runner_->RunUntilIdle(); +} + +TEST_F(WorkerSchedulerProxyTest, ThreadDestroyed) { + WaitableEvent throtting_state_changed; + + std::unique_ptr<WorkerSchedulerProxy> proxy = + std::make_unique<WorkerSchedulerProxy>(frame_scheduler_.get()); + + auto worker_thread = + CreateWorkerThread(proxy.get(), &throtting_state_changed); + + DCHECK(worker_thread->GetWorkerScheduler()->throttling_state() == + WebFrameScheduler::ThrottlingState::kNotThrottled); + + frame_scheduler_->SetPageVisible(false); + throtting_state_changed.Wait(); + DCHECK(worker_thread->GetWorkerScheduler()->throttling_state() == + WebFrameScheduler::ThrottlingState::kThrottled); + + worker_thread.reset(); + proxy.reset(); + mock_main_thread_task_runner_->RunUntilIdle(); + + frame_scheduler_->SetPageVisible(true); + mock_main_thread_task_runner_->RunUntilIdle(); + + frame_scheduler_.reset(); + mock_main_thread_task_runner_->RunUntilIdle(); +} + +} // namespace scheduler +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc index 2ad8b36..2547b6c 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc +++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc
@@ -10,7 +10,9 @@ #include "platform/runtime_enabled_features.h" #include "platform/scheduler/base/real_time_domain.h" #include "platform/scheduler/base/virtual_time_domain.h" +#include "platform/scheduler/child/default_params.h" #include "platform/scheduler/child/task_runner_impl.h" +#include "platform/scheduler/child/worker_scheduler_proxy.h" #include "platform/scheduler/renderer/auto_advancing_virtual_time_domain.h" #include "platform/scheduler/renderer/budget_pool.h" #include "platform/scheduler/renderer/renderer_scheduler_impl.h" @@ -32,6 +34,17 @@ } } +const char* PageVisibilityStateToString(PageVisibilityState visibility) { + switch (visibility) { + case PageVisibilityState::kVisible: + return "visible"; + case PageVisibilityState::kHidden: + return "hidden"; + } + // Keep MSVC happy. + return nullptr; +} + const char* PausedStateToString(bool is_paused) { if (is_paused) { return "paused"; @@ -64,7 +77,7 @@ WebFrameSchedulerImpl::ActiveConnectionHandleImpl::ActiveConnectionHandleImpl( WebFrameSchedulerImpl* frame_scheduler) - : frame_scheduler_(frame_scheduler->AsWeakPtr()) { + : frame_scheduler_(frame_scheduler->GetWeakPtr()) { frame_scheduler->DidOpenActiveConnection(); } @@ -77,7 +90,7 @@ WebFrameSchedulerImpl::ThrottlingObserverHandleImpl:: ThrottlingObserverHandleImpl(WebFrameSchedulerImpl* frame_scheduler, Observer* observer) - : frame_scheduler_(frame_scheduler->AsWeakPtr()), observer_(observer) {} + : frame_scheduler_(frame_scheduler->GetWeakPtr()), observer_(observer) {} WebFrameSchedulerImpl::ThrottlingObserverHandleImpl:: ~ThrottlingObserverHandleImpl() { @@ -99,11 +112,11 @@ this, &tracing_controller_, VisibilityStateToString), - page_visible_(true, - "WebFrameScheduler.PageVisible", - this, - &tracing_controller_, - VisibilityStateToString), + page_visibility_(kDefaultPageVisibility, + "WebFrameScheduler.PageVisible", + this, + &tracing_controller_, + PageVisibilityStateToString), page_frozen_(false, "WebFrameScheduler.PageFrozen", this, @@ -185,7 +198,6 @@ std::unique_ptr<WebFrameScheduler::ThrottlingObserverHandle> WebFrameSchedulerImpl::AddThrottlingObserver(ObserverType type, Observer* observer) { - DCHECK_EQ(ObserverType::kLoader, type); DCHECK(observer); observer->OnThrottlingStateChanged(CalculateThrottlingState()); loader_observers_.insert(observer); @@ -396,6 +408,11 @@ return unpausable_task_queue_; } +scoped_refptr<TaskQueue> WebFrameSchedulerImpl::ControlTaskQueue() { + DCHECK(parent_web_view_scheduler_); + return renderer_scheduler_->ControlTaskQueue(); +} + blink::WebViewScheduler* WebFrameSchedulerImpl::GetWebViewScheduler() const { return parent_web_view_scheduler_; } @@ -434,7 +451,8 @@ void WebFrameSchedulerImpl::AsValueInto( base::trace_event::TracedValue* state) const { state->SetBoolean("frame_visible", frame_visible_); - state->SetBoolean("page_visible", page_visible_); + state->SetBoolean("page_visible", + page_visibility_ == PageVisibilityState::kVisible); state->SetBoolean("cross_origin", cross_origin_); state->SetString("frame_type", frame_type_ == WebFrameScheduler::FrameType::kMainFrame @@ -475,18 +493,21 @@ void WebFrameSchedulerImpl::SetPageVisible(bool page_visible) { DCHECK(parent_web_view_scheduler_); - if (page_visible_ == page_visible) + PageVisibilityState page_visibility = page_visible + ? PageVisibilityState::kVisible + : PageVisibilityState::kHidden; + if (page_visibility_ == page_visibility) return; bool was_throttled = ShouldThrottleTimers(); - page_visible_ = page_visible; - if (page_visible_) + page_visibility_ = page_visibility; + if (page_visibility_ == PageVisibilityState::kVisible) page_frozen_ = false; // visible page must not be frozen. UpdateThrottling(was_throttled); UpdateThrottlingState(); } bool WebFrameSchedulerImpl::IsPageVisible() const { - return page_visible_; + return page_visibility_ == PageVisibilityState::kVisible; } void WebFrameSchedulerImpl::SetPaused(bool frame_paused) { @@ -510,7 +531,7 @@ void WebFrameSchedulerImpl::SetPageFrozen(bool frozen) { if (frozen == page_frozen_) return; - DCHECK(!page_visible_); + DCHECK(page_visibility_ == PageVisibilityState::kHidden); page_frozen_ = frozen; UpdateThrottlingState(); } @@ -529,10 +550,10 @@ WebFrameSchedulerImpl::CalculateThrottlingState() const { if (RuntimeEnabledFeatures::StopLoadingInBackgroundEnabled() && page_frozen_) { - DCHECK(!page_visible_); + DCHECK(page_visibility_ == PageVisibilityState::kHidden); return WebFrameScheduler::ThrottlingState::kStopped; } - if (!page_visible_) + if (page_visibility_ == PageVisibilityState::kHidden) return WebFrameScheduler::ThrottlingState::kThrottled; return WebFrameScheduler::ThrottlingState::kNotThrottled; } @@ -548,7 +569,7 @@ } bool WebFrameSchedulerImpl::ShouldThrottleTimers() const { - if (!page_visible_) + if (page_visibility_ == PageVisibilityState::kHidden) return true; return RuntimeEnabledFeatures::TimerThrottlingForHiddenFramesEnabled() && !frame_visible_ && cross_origin_; @@ -567,7 +588,7 @@ } } -base::WeakPtr<WebFrameSchedulerImpl> WebFrameSchedulerImpl::AsWeakPtr() { +base::WeakPtr<WebFrameSchedulerImpl> WebFrameSchedulerImpl::GetWeakPtr() { return weak_factory_.GetWeakPtr(); }
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.h b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.h index 0f37248..e8354c2 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.h +++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.h
@@ -6,7 +6,6 @@ #define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_WEB_FRAME_SCHEDULER_IMPL_H_ #include <memory> -#include <set> #include "base/macros.h" #include "base/memory/scoped_refptr.h" @@ -15,7 +14,10 @@ #include "platform/PlatformExport.h" #include "platform/WebFrameScheduler.h" #include "platform/scheduler/base/task_queue.h" +#include "platform/scheduler/child/page_visibility_state.h" +#include "platform/scheduler/child/worker_scheduler_proxy.h" #include "platform/scheduler/util/tracing_helper.h" +#include "platform/wtf/HashSet.h" namespace base { namespace trace_event { @@ -80,12 +82,16 @@ void AsValueInto(base::trace_event::TracedValue* state) const; bool IsExemptFromBudgetBasedThrottling() const override; + scoped_refptr<TaskQueue> ControlTaskQueue(); + bool has_active_connection() const { return active_connection_count_; } void OnTraceLogEnabled() { tracing_controller_.OnTraceLogEnabled(); } + base::WeakPtr<WebFrameSchedulerImpl> GetWeakPtr(); + private: friend class WebViewSchedulerImpl; friend class renderer_scheduler_impl_unittest::RendererSchedulerImplTest; @@ -135,8 +141,6 @@ scoped_refptr<TaskQueue> PausableTaskQueue(); scoped_refptr<TaskQueue> UnpausableTaskQueue(); - base::WeakPtr<WebFrameSchedulerImpl> AsWeakPtr(); - TraceableVariableController tracing_controller_; scoped_refptr<MainThreadTaskQueue> loading_task_queue_; scoped_refptr<MainThreadTaskQueue> loading_control_task_queue_; @@ -157,7 +161,8 @@ std::set<Observer*> loader_observers_; // NOT OWNED WebFrameScheduler::ThrottlingState throttling_state_; TraceableState<bool, kTracingCategoryNameInfo> frame_visible_; - TraceableState<bool, kTracingCategoryNameInfo> page_visible_; + TraceableState<PageVisibilityState, kTracingCategoryNameInfo> + page_visibility_; TraceableState<bool, kTracingCategoryNameInfo> page_frozen_; TraceableState<bool, kTracingCategoryNameInfo> frame_paused_; TraceableState<bool, kTracingCategoryNameInfo> cross_origin_;
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.cc index 9f72bda8..a66d041e 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.cc +++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.cc
@@ -99,7 +99,7 @@ bool disable_background_timer_throttling) : intervention_reporter_(intervention_reporter), renderer_scheduler_(renderer_scheduler), - page_visible_(true), + page_visible_(kDefaultPageVisibility), disable_background_timer_throttling_(disable_background_timer_throttling), is_audio_playing_(false), reported_background_throttling_since_navigation_(false),
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.h b/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.h index 11e9528..33e11021 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.h +++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.h
@@ -43,6 +43,8 @@ ~WebViewSchedulerImpl() override; + static constexpr bool kDefaultPageVisibility = true; + // WebViewScheduler implementation: void SetPageVisible(bool page_visible) override; void SetPageFrozen(bool) override;
diff --git a/third_party/WebKit/Source/platform/scheduler/test/fake_web_frame_scheduler.h b/third_party/WebKit/Source/platform/scheduler/test/fake_web_frame_scheduler.h index 5ab18047..86f3563 100644 --- a/third_party/WebKit/Source/platform/scheduler/test/fake_web_frame_scheduler.h +++ b/third_party/WebKit/Source/platform/scheduler/test/fake_web_frame_scheduler.h
@@ -8,6 +8,7 @@ #include <deque> #include "platform/WebFrameScheduler.h" +#include "platform/scheduler/child/worker_scheduler_proxy.h" #include "platform/scheduler/renderer/main_thread_task_queue.h" namespace blink { @@ -137,6 +138,9 @@ bool IsExemptFromBudgetBasedThrottling() const override { return is_exempt_from_throttling_; } + std::unique_ptr<WorkerSchedulerProxy> CreateWorkerSchedulerProxy() { + return nullptr; + } private: WebViewScheduler* web_view_scheduler_; // NOT OWNED
diff --git a/third_party/WebKit/Source/platform/testing/EmptyWebMediaPlayer.h b/third_party/WebKit/Source/platform/testing/EmptyWebMediaPlayer.h index a7b1050..b7386fb 100644 --- a/third_party/WebKit/Source/platform/testing/EmptyWebMediaPlayer.h +++ b/third_party/WebKit/Source/platform/testing/EmptyWebMediaPlayer.h
@@ -22,7 +22,7 @@ void Seek(double seconds) override {} void SetRate(double) override {} void SetVolume(double) override {} - void PictureInPicture() override {} + void EnterPictureInPicture() override {} WebTimeRanges Buffered() const override; WebTimeRanges Seekable() const override; void SetSinkId(const WebString& sink_id,
diff --git a/third_party/WebKit/public/platform/WebFullscreenVideoStatus.h b/third_party/WebKit/public/platform/WebFullscreenVideoStatus.h new file mode 100644 index 0000000..a7696a099 --- /dev/null +++ b/third_party/WebKit/public/platform/WebFullscreenVideoStatus.h
@@ -0,0 +1,23 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef WebFullscreenVideoStatus_h +#define WebFullscreenVideoStatus_h + +namespace blink { + +enum class WebFullscreenVideoStatus { + // Video is not effectively fullscreen. + kNotEffectivelyFullscreen = 0, + // Video is fullscreen and allowed to enter Picture-in-Picture. + kFullscreenAndPictureInPictureEnabled, + // Video is fullscreen and is not allowed to enter Picture-in-Picture. + kFullscreenAndPictureInPictureDisabled, + // The maximum number of fullscreen status. + kMax = kFullscreenAndPictureInPictureDisabled, +}; + +} // namespace blink + +#endif // WebFullscreenVideoStatus_h
diff --git a/third_party/WebKit/public/platform/WebMediaPlayer.h b/third_party/WebKit/public/platform/WebMediaPlayer.h index 5ed99e8..336d411 100644 --- a/third_party/WebKit/public/platform/WebMediaPlayer.h +++ b/third_party/WebKit/public/platform/WebMediaPlayer.h
@@ -54,6 +54,7 @@ class WebSecurityOrigin; class WebString; class WebURL; +enum class WebFullscreenVideoStatus; struct WebRect; struct WebSize; @@ -126,7 +127,7 @@ virtual void Seek(double seconds) = 0; virtual void SetRate(double) = 0; virtual void SetVolume(double) = 0; - virtual void PictureInPicture() = 0; + virtual void EnterPictureInPicture() = 0; virtual void RequestRemotePlayback() {} virtual void RequestRemotePlaybackControl() {} @@ -302,7 +303,7 @@ // // TODO(zqzhang): merge with BecameDominantVisibleContent(). See // https://crbug.com/696211 - virtual void SetIsEffectivelyFullscreen(bool) {} + virtual void SetIsEffectivelyFullscreen(WebFullscreenVideoStatus) {} virtual void EnabledAudioTracksChanged( const WebVector<TrackId>& enabled_track_ids) {}
diff --git a/third_party/WebKit/public/platform/WebMediaPlayerClient.h b/third_party/WebKit/public/platform/WebMediaPlayerClient.h index 2bfbcce..c23b16c9b 100644 --- a/third_party/WebKit/public/platform/WebMediaPlayerClient.h +++ b/third_party/WebKit/public/platform/WebMediaPlayerClient.h
@@ -129,9 +129,15 @@ // to a localized string that explains the reason as user-readable text. virtual void MediaRemotingStopped(WebLocalizedString::Name error_msg) = 0; + // Informs that Picture-in-Picture mode has started for the media element. virtual void PictureInPictureStarted() = 0; + + // Informs that Picture-in-Picture mode has stopped for the media element. virtual void PictureInPictureStopped() = 0; + // Returns whether the media element is in Picture-in-Picture mode. + virtual bool IsInPictureInPictureMode() = 0; + // Returns whether the media element has native controls. It does not mean // that the controls are currently visible. virtual bool HasNativeControls() = 0;
diff --git a/third_party/WebKit/public/platform/WebSurfaceLayerBridge.h b/third_party/WebKit/public/platform/WebSurfaceLayerBridge.h index 6e695eb..51cd1d76 100644 --- a/third_party/WebKit/public/platform/WebSurfaceLayerBridge.h +++ b/third_party/WebKit/public/platform/WebSurfaceLayerBridge.h
@@ -8,10 +8,7 @@ #include "WebCommon.h" #include "WebLayer.h" #include "WebLayerTreeView.h" - -namespace viz { -class FrameSinkId; -} +#include "components/viz/common/surfaces/surface_id.h" namespace blink { @@ -24,6 +21,9 @@ // Called when new a SurfaceLayer is created. virtual void RegisterContentsLayer(WebLayer*) = 0; virtual void UnregisterContentsLayer(WebLayer*) = 0; + + // Called when a SurfaceLayer is activated. + virtual void OnSurfaceIdUpdated(viz::SurfaceId surface_id){}; }; // Maintains and exposes the SurfaceLayer.
diff --git a/third_party/WebKit/public/web/WebSettings.h b/third_party/WebKit/public/web/WebSettings.h index 61ca81b..86241c2 100644 --- a/third_party/WebKit/public/web/WebSettings.h +++ b/third_party/WebKit/public/web/WebSettings.h
@@ -199,6 +199,7 @@ virtual void SetMainFrameClipsContent(bool) = 0; virtual void SetMainFrameResizesAreOrientationChanges(bool) = 0; virtual void SetMaxTouchPoints(int) = 0; + virtual void SetPictureInPictureEnabled(bool) = 0; virtual void SetMediaPlaybackGestureWhitelistScope(const WebString&) = 0; virtual void SetPresentationRequiresUserGesture(bool) = 0; virtual void SetEmbeddedMediaExperienceEnabled(bool) = 0;
diff --git a/third_party/WebKit/public/web/modules/autofill/WebFormElementObserverCallback.h b/third_party/WebKit/public/web/modules/autofill/WebFormElementObserverCallback.h index c40bd47..31bd122c 100644 --- a/third_party/WebKit/public/web/modules/autofill/WebFormElementObserverCallback.h +++ b/third_party/WebKit/public/web/modules/autofill/WebFormElementObserverCallback.h
@@ -11,8 +11,8 @@ public: virtual ~WebFormElementObserverCallback() = default; - // Invoked when the observed element was either removed from the DOM, it's - // action attribute changed, or it's computed style changed to display: none. + // Invoked when the observed element was either removed from the DOM or it's + // computed style changed to display: none. virtual void ElementWasHiddenOrRemoved() = 0; };
diff --git a/third_party/tcmalloc/chromium/src/base/linux_syscall_support.h b/third_party/tcmalloc/chromium/src/base/linux_syscall_support.h index b29ec2d..5b417d5 100644 --- a/third_party/tcmalloc/chromium/src/base/linux_syscall_support.h +++ b/third_party/tcmalloc/chromium/src/base/linux_syscall_support.h
@@ -1512,6 +1512,7 @@ type5 arg5) { \ LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ LSS_REG(7, arg4); \ + unsigned long _arg5 = (unsigned long)arg5; \ register unsigned long __v0 __asm__("$2"); \ __asm__ __volatile__ (".set noreorder\n" \ "lw $2, %6\n" \ @@ -1523,7 +1524,7 @@ ".set reorder\n" \ : "=&r"(__v0), "+r" (__r7) \ : "i" (__NR_##name), "r"(__r4), "r"(__r5), \ - "r"(__r6), "m" ((unsigned long)arg5) \ + "r"(__r6), "m" (_arg5) \ : MIPS_SYSCALL_CLOBBERS); \ LSS_RETURN(type, __v0, __r7); \ }
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 8d7ac9a..ffa29e6 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -2943,6 +2943,8 @@ <int value="195" label="AUTH_INVALID_EFFECTIVE_DOMAIN"/> <int value="196" label="AUTH_INVALID_RELYING_PARTY"/> <int value="197" label="RWH_COPY_REQUEST_ATTEMPT"/> + <int value="198" label="SYNC_COMPOSITOR_NO_FUTURE_FRAME"/> + <int value="199" label="SYNC_COMPOSITOR_NO_BEGIN_FRAME"/> </enum> <enum name="BadMessageReasonExtensions"> @@ -3262,7 +3264,8 @@ <int value="15" label="From tab to same context: Same scope navigation"/> <int value="16" label="In app or tab, cancel prerender link navigation"/> <int value="17" - label="From app or tab to new app context, close previous context"/> + label="From app or tab to new app context; moved newly created context + to app window"/> <int value="18" label="From app or tab to new app context"/> <int value="19" label="From app to new tab: Out of scope navigation"/> <int value="20" label="From app or tab to new or existing singleton tab."/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index bc5dcb16..19916378 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -92629,6 +92629,17 @@ <owner>pthammaiah@google.com</owner> </histogram> +<histogram name="TouchScreen.MissedTOUCHEVENTF_UP" enum="BooleanHit"> + <owner>input-dev@chromium.org</owner> + <summary> + The touch device driver failed to send a TOUCHEVENTF_UP, and chromium + generated a simulated event to maintain consistency/correctness. + + This workaround will be removed once usage drops off. See + https://crbug.com/811273 for details. + </summary> +</histogram> + <histogram name="Touchscreen.TapDisambiguation" enum="TapDisambiguation"> <owner>aelias@chromium.org</owner> <summary> @@ -101423,15 +101434,6 @@ </summary> </histogram> -<histogram name="WebRTC.Video.Screenshare.DroppedFrames.Receiver" - units="frames"> - <owner>ilnik@chromium.org</owner> - <summary> - Total number of frames dropped by a WebRTC on the receive side because they - are incomplete or undecodable. - </summary> -</histogram> - <histogram name="WebRTC.Video.Screenshare.EncodeTimeInMs" units="ms"> <owner>sprang@chromium.org</owner> <summary> @@ -113940,7 +113942,6 @@ <suffix name="S1"/> <suffix name="S2"/> <affected-histogram name="WebRTC.Video.Decoded.Vp8.Qp"/> - <affected-histogram name="WebRTC.Video.DroppedFrames.Receiver"/> <affected-histogram name="WebRTC.Video.EndToEndDelayInMs"/> <affected-histogram name="WebRTC.Video.EndToEndDelayMaxInMs"/> <affected-histogram name="WebRTC.Video.InterframeDelay95PercentileInMs"/> @@ -113951,7 +113952,6 @@ <affected-histogram name="WebRTC.Video.ReceivedHeightInPixels"/> <affected-histogram name="WebRTC.Video.ReceivedWidthInPixels"/> <affected-histogram name="WebRTC.Video.Screenshare.Decoded.Vp8.Qp"/> - <affected-histogram name="WebRTC.Video.Screenshare.DroppedFrames.Receiver"/> <affected-histogram name="WebRTC.Video.Screenshare.EndToEndDelayInMs"/> <affected-histogram name="WebRTC.Video.Screenshare.EndToEndDelayMaxInMs"/> <affected-histogram
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config index a86b60d..6080fc4 100644 --- a/tools/perf/expectations.config +++ b/tools/perf/expectations.config
@@ -345,7 +345,7 @@ crbug.com/708300 [ Mobile ] v8.browsing_mobile-future/browse:shopping:flipkart [ Skip ] crbug.com/788797 [ Cherry_Mobile_Android_One ] v8.browsing_mobile-future/browse:social:facebook_infinite_scroll [ Skip ] crbug.com/788797 [ Cherry_Mobile_Android_One ] v8.browsing_mobile-future/browse:social:pinterest_infinite_scroll [ Skip ] -crbug.com/803870 [ Cherry_Mobile_Android_One ] v8.browsing_mobile/browse:social:tumblr_infinite_scroll [ Skip ] +crbug.com/816486 [ Cherry_Mobile_Android_One ] v8.browsing_mobile-future/browse:social:tumblr_infinite_scroll [ Skip ] crbug.com/767970 [ Cherry_Mobile_Android_One ] v8.browsing_mobile-future/browse:tech:discourse_infinite_scroll [ Skip ] crbug.com/768472 [ Cherry_Mobile_Android_One ] v8.browsing_mobile-future/browse:shopping:lazada [ Skip ] crbug.com/767970 [ Cherry_Mobile_Android_One ] v8.browsing_mobile-future/browse:shopping:avito [ Skip ]
diff --git a/ui/gfx/sequential_id_generator_unittest.cc b/ui/gfx/sequential_id_generator_unittest.cc index 049ed7a..c4f98b79 100644 --- a/ui/gfx/sequential_id_generator_unittest.cc +++ b/ui/gfx/sequential_id_generator_unittest.cc
@@ -44,4 +44,5 @@ EXPECT_FALSE(generator.HasGeneratedIDFor(42)); generator.ReleaseNumber(42); } + } // namespace ui
diff --git a/ui/message_center/views/notification_view_md.cc b/ui/message_center/views/notification_view_md.cc index a8c663a..3e59b37b 100644 --- a/ui/message_center/views/notification_view_md.cc +++ b/ui/message_center/views/notification_view_md.cc
@@ -88,6 +88,12 @@ // Background of inline settings area. const SkColor kSettingsRowBackgroundColor = SkColorSetRGB(0xee, 0xee, 0xee); +// Text color and icon color of inline reply area when the textfield is empty. +constexpr SkColor kTextfieldPlaceholderTextColorMD = + SkColorSetA(SK_ColorWHITE, 0x8A); +constexpr SkColor kTextfieldPlaceholderIconColorMD = + SkColorSetA(SK_ColorWHITE, 0x60); + // The icon size of inline reply input field. constexpr int kInputReplyButtonSize = 20; @@ -379,9 +385,9 @@ views::TextfieldController* controller) : index_(0) { set_controller(controller); - SetTextColor(SK_ColorBLACK); + SetTextColor(SK_ColorWHITE); SetBackgroundColor(SK_ColorTRANSPARENT); - set_placeholder_text_color(SkColorSetA(SK_ColorBLACK, 0x8A)); + set_placeholder_text_color(kTextfieldPlaceholderTextColorMD); SetBorder(views::CreateEmptyBorder(kInputTextfieldPadding)); } @@ -412,14 +418,14 @@ void NotificationInputReplyButtonMD::SetNormalImage() { SetImage(STATE_NORMAL, gfx::CreateVectorIcon(kNotificationInlineReplyIcon, - kInputReplyButtonSize, SK_ColorBLACK)); + kInputReplyButtonSize, SK_ColorWHITE)); } void NotificationInputReplyButtonMD::SetPlaceholderImage() { SetImage( STATE_NORMAL, gfx::CreateVectorIcon(kNotificationInlineReplyIcon, kInputReplyButtonSize, - SkColorSetA(SK_ColorBLACK, 0x60))); + kTextfieldPlaceholderIconColorMD)); } // NotificationInputContainerMD ////////////////////////////////////////////////
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc index 41c4990..81a43f79 100644 --- a/ui/views/win/hwnd_message_handler.cc +++ b/ui/views/win/hwnd_message_handler.cc
@@ -2315,7 +2315,10 @@ // so use base::TimeTicks::Now(). const base::TimeTicks event_time = base::TimeTicks::Now(); TouchEvents touch_events; + TouchIDs stale_touches(touch_ids_); + for (int i = 0; i < num_points; ++i) { + stale_touches.erase(input[i].dwID); POINT point; point.x = TOUCH_COORD_TO_PIXEL(input[i].x); point.y = TOUCH_COORD_TO_PIXEL(input[i].y); @@ -2336,7 +2339,7 @@ last_touch_or_pen_message_time_ = ::GetMessageTime(); gfx::Point touch_point(point.x, point.y); - unsigned int touch_id = id_generator_.GetGeneratedID(input[i].dwID); + size_t touch_id = id_generator_.GetGeneratedID(input[i].dwID); if (input[i].dwFlags & TOUCHEVENTF_DOWN) { touch_ids_.insert(input[i].dwID); @@ -2361,6 +2364,19 @@ } } } + // If a touch has been dropped from the list (without a TOUCH_EVENTF_UP) + // we generate a simulated TOUCHEVENTF_UP event. + for (auto touch_number : stale_touches) { + // Log that we've hit this code. When usage drops off, we can remove + // this "workaround". See https://crbug.com/811273 + UMA_HISTOGRAM_BOOLEAN("TouchScreen.MissedTOUCHEVENTF_UP", true); + size_t touch_id = id_generator_.GetGeneratedID(touch_number); + touch_ids_.erase(touch_number); + GenerateTouchEvent(ui::ET_TOUCH_RELEASED, gfx::Point(0, 0), touch_id, + event_time, &touch_events); + id_generator_.ReleaseNumber(touch_number); + } + // Handle the touch events asynchronously. We need this because touch // events on windows don't fire if we enter a modal loop in the context of // a touch event. @@ -2735,7 +2751,7 @@ return 0; } - unsigned int mapped_pointer_id = id_generator_.GetGeneratedID(pointer_id); + size_t mapped_pointer_id = id_generator_.GetGeneratedID(pointer_id); POINTER_INFO pointer_info = pointer_touch_info.pointerInfo; POINT client_point = pointer_info.ptPixelLocationRaw; ScreenToClient(hwnd(), &client_point); @@ -2891,7 +2907,7 @@ void HWNDMessageHandler::GenerateTouchEvent(ui::EventType event_type, const gfx::Point& point, - unsigned int id, + size_t id, base::TimeTicks time_stamp, TouchEvents* touch_events) { ui::TouchEvent event(
diff --git a/ui/views/win/hwnd_message_handler.h b/ui/views/win/hwnd_message_handler.h index 2000635..5d5765c 100644 --- a/ui/views/win/hwnd_message_handler.h +++ b/ui/views/win/hwnd_message_handler.h
@@ -550,12 +550,6 @@ const POINTER_INFO& pointer_info, const gfx::Point& point, const ui::PointerDetails& pointer_details); - LRESULT GenerateTouchEventFromPointerEvent( - UINT message, - UINT32 pointer_id, - const POINTER_INFO& pointer_info, - const gfx::Point& point, - const ui::PointerDetails& pointer_details); // Returns true if the mouse message passed in is an OS synthesized mouse // message. @@ -575,7 +569,7 @@ // |time_stamp| is the time stamp associated with the message. void GenerateTouchEvent(ui::EventType event_type, const gfx::Point& point, - unsigned int id, + size_t id, base::TimeTicks time_stamp, TouchEvents* touch_events);